diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 400ffd6..0000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "recommendations": ["biomejs.biome", "NomicFoundation.hardhat-solidity"] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 323b180..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "editor.formatOnSave": true, - "files.associations": { - "*.css": "tailwindcss" - }, - "[json][css][typescript][typescriptreact]": { - "editor.defaultFormatter": "biomejs.biome" - }, - "[solidity]": { - "editor.defaultFormatter": "NomicFoundation.hardhat-solidity" - } -} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..49b8453 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,40 @@ +# Repository Guidelines + +## Project Structure & Module Organization +This repo is a pnpm-managed monorepo with two workspaces under `packages/`. +- `packages/contract/`: Hardhat-based smart contracts, Solidity sources in `packages/contract/contracts/` and tests alongside as `*.t.sol`. +- `packages/frontend/`: React Router v7 app (Vite + Tailwind) with server/client build output in `packages/frontend/build/`. +- Root config: `pnpm-workspace.yaml`, `biome.json`, and shared toolchain settings. + +## Build, Test, and Development Commands +Run these from the repo root unless noted. +- `pnpm install`: install workspace dependencies. +- `pnpm build`: build all packages (as defined in each workspace). +- `pnpm dev`: run dev servers for all packages that define it. +- `pnpm --filter contract build`: compile contracts. +- `pnpm --filter contract test`: run Hardhat tests (Solidity + node:test). +- `pnpm --filter frontend dev`: start the React Router dev server. +- `pnpm --filter frontend build`: produce production build artifacts. +- `pnpm --filter frontend typegen`: generate React Router types. + +## Coding Style & Naming Conventions +- Formatting/linting: Biome is the standard (`biome.json`), 2-space indentation. +- TypeScript: prefer explicit types over `any`. +- Solidity: keep tests colocated with contracts and use `*.t.sol` naming (Foundry-compatible). +- File names: use descriptive, domain-aligned names (e.g., `RouterFactory.sol`). + +## Testing Guidelines +- Smart contract tests run via Hardhat: `pnpm --filter contract test`. +- Solidity tests live in `packages/contract/contracts/*.t.sol`. +- Node.js integration tests (if present) also run through `hardhat test`. +- For frontend, run `pnpm --filter frontend typegen` as part of change verification. + +## Commit & Pull Request Guidelines +- Use Conventional Commit-style messages seen in history: `feat:`, `chore:`, `fix:`, etc. +- PRs should reference a related Issue (`#123`) and include a clear summary of changes. +- Create Issues before PRs; single, standalone PRs are not accepted. +- Consider Draft PRs for work-in-progress and include screenshots for UI changes. + +## Communication & Conduct +- Coordination happens in the Hackdays Discord; prefer Issue comments for questions tied to work. +- Follow the Code for Japan code of conduct linked in `CONTRIBUTING.md`. diff --git a/README.md b/README.md index 12678e1..98a7736 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,8 @@ FORトークンを送金するたびに、自動的に以下へ分配されま FoR/ ├── packages/ │ ├── contract/ # スマートコントラクト (Hardhat) -│ └── frontend/ # Webアプリケーション (React Router) +│ ├── frontend/ # Webアプリケーション (React Router) +│ └── indexer/ # Goldsky サブグラフ/インデクサー └── pnpm-workspace.yaml ``` @@ -60,6 +61,12 @@ FoR/ - **Vite**: ビルドツール - **TypeScript**: 型安全な開発 +### インデクサー + +- **Goldsky**: Subgraphホスティング +- **Graph Protocol (AssemblyScript)**: イベントマッピング +- **GraphQL**: インデックス済みデータ取得 + ## 🚀 セットアップ ### 環境要件 @@ -73,11 +80,11 @@ FoR/ # 依存関係のインストール pnpm install -# 全パッケージのビルド -pnpm build +# コントラクトのビルド +pnpm --filter contract build -# 開発サーバー起動 -pnpm dev +# フロントエンドの開発サーバー起動 +pnpm --filter frontend dev ``` ### パッケージ別コマンド @@ -112,6 +119,25 @@ pnpm build pnpm typecheck ``` +#### インデクサー (packages/indexer/) + +```bash +cd packages/indexer + +# codegen +pnpm codegen + +# サブグラフのビルド +pnpm build + +# Sepoliaへのデプロイ +pnpm deploy:sepolia +``` + +### Indexer Endpoint + +- Sepolia GraphQL endpoint: `` + ## 📚 ドキュメント - [開発ガイド](./CLAUDE.md) - 開発の詳細な情報 diff --git a/packages/contract/README.md b/packages/contract/README.md index 4743e82..1c3866a 100644 --- a/packages/contract/README.md +++ b/packages/contract/README.md @@ -1,57 +1,63 @@ -# Sample Hardhat 3 Beta Project (`node:test` and `viem`) +# FoR Contract -This project showcases a Hardhat 3 Beta project using the native Node.js test runner (`node:test`) and the `viem` library for Ethereum interactions. +FoR のスマートコントラクトパッケージです(Hardhat v3 / Ignition)。 -To learn more about the Hardhat 3 Beta, please visit the [Getting Started guide](https://hardhat.org/docs/getting-started#getting-started-with-hardhat-3). To share your feedback, join our [Hardhat 3 Beta](https://hardhat.org/hardhat3-beta-telegram-group) Telegram group or [open an issue](https://github.com/NomicFoundation/hardhat/issues/new) in our GitHub issue tracker. +## 必要な環境変数 -## Project Overview +Sepolia へデプロイする場合のみ、実行時に以下を設定します。 -This example project includes: +- `SEPOLIA_RPC_URL` +- `SEPOLIA_PRIVATE_KEY`(`0x` + 64桁hex) -- A simple Hardhat configuration file. -- Foundry-compatible Solidity unit tests. -- TypeScript integration tests using [`node:test`](nodejs.org/api/test.html), the new Node.js native test runner, and [`viem`](https://viem.sh/). -- Examples demonstrating how to connect to different types of networks, including locally simulating OP mainnet. +## 開発コマンド -## Usage - -### Running Tests - -To run all the tests in the project, execute the following command: - -```shell -npx hardhat test +```bash +pnpm --filter @for/contract build +pnpm --filter @for/contract test +pnpm --filter @for/contract dev ``` -You can also selectively run the Solidity or `node:test` tests: +## デプロイコマンド -```shell -npx hardhat test solidity -npx hardhat test nodejs +```bash +pnpm --filter @for/contract deploy:local:FoRToken +pnpm --filter @for/contract deploy:local:RouterFactory +pnpm --filter @for/contract deploy:local:Router +pnpm --filter @for/contract deploy:sepolia:FoRToken +pnpm --filter @for/contract deploy:sepolia:RouterFactory +pnpm --filter @for/contract deploy:sepolia:Router ``` -### Make a deployment to Sepolia +## Sepolia への推奨手順 -This project includes an example Ignition module to deploy the contract. You can deploy this module to a locally simulated chain or to Sepolia. +`Router` モジュール実行で依存する `FoRToken` / `RouterFactory` も一緒に処理されます。 -To run the deployment to a local chain: +```bash +export SEPOLIA_RPC_URL="..." +export SEPOLIA_PRIVATE_KEY="0x..." +pnpm --filter @for/contract deploy:sepolia:Router +``` -```shell -npx hardhat ignition deploy ignition/modules/Counter.ts +過去の Ignition state と不整合がある場合は `--reset` を使います。 + +```bash +pnpm --filter @for/contract exec hardhat ignition deploy \ + ignition/modules/Router.ts \ + --network sepolia \ + --parameters ignition/parameters.sepolia.json \ + --reset ``` -To run the deployment to Sepolia, you need an account with funds to send the transaction. The provided Hardhat configuration includes a Configuration Variable called `SEPOLIA_PRIVATE_KEY`, which you can use to set the private key of the account you want to use. +## デプロイ結果の確認 -You can set the `SEPOLIA_PRIVATE_KEY` variable using the `hardhat-keystore` plugin or by setting it as an environment variable. +成果物: -To set the `SEPOLIA_PRIVATE_KEY` config variable using `hardhat-keystore`: +- `packages/contract/ignition/deployments/chain-11155111/deployed_addresses.json` +- `packages/contract/ignition/deployments/chain-11155111/journal.jsonl` -```shell -npx hardhat keystore set SEPOLIA_PRIVATE_KEY -``` +参照方法: -After setting the variable, you can run the deployment with the Sepolia network: +- `deployed_addresses.json`: `FoRToken` / `RouterFactory` のアドレス +- `journal.jsonl`: `RouterModule#RouterFactoryModule~RouterFactory.deploy` の `TRANSACTION_CONFIRM` から `Router` の実アドレスと `blockNumber`(=`startBlock`) -```shell -npx hardhat ignition deploy --network sepolia ignition/modules/Counter.ts -``` +`Router address` と `startBlock` は `packages/indexer/config/sepolia.json` に反映して、indexer 側デプロイで利用します。 diff --git a/packages/contract/contracts/FORToken.sol b/packages/contract/contracts/FoRToken.sol similarity index 100% rename from packages/contract/contracts/FORToken.sol rename to packages/contract/contracts/FoRToken.sol diff --git a/packages/contract/contracts/FORToken.t.sol b/packages/contract/contracts/FoRToken.t.sol similarity index 99% rename from packages/contract/contracts/FORToken.t.sol rename to packages/contract/contracts/FoRToken.t.sol index 4db729b..b5c5838 100644 --- a/packages/contract/contracts/FORToken.t.sol +++ b/packages/contract/contracts/FoRToken.t.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.28; import {Test} from "forge-std/Test.sol"; -import {FoRToken} from "./FORToken.sol"; +import {FoRToken} from "./FoRToken.sol"; import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; contract FoRTokenTest is Test { diff --git a/packages/contract/contracts/Router.sol b/packages/contract/contracts/Router.sol index 4455c8b..abd08c9 100644 --- a/packages/contract/contracts/Router.sol +++ b/packages/contract/contracts/Router.sol @@ -60,6 +60,20 @@ contract Router is AccessControl, Pausable, ReentrancyGuard { uint256 recipientAmount ); + /** + * @notice 分配比率が更新された際に発行されるイベント + * @param changedBy 比率を更新したアドレス + * @param fundRatio 更新後の基金への分配比率 + * @param burnRatio 更新後のBurnへの分配比率 + * @param recipientRatio 更新後の受取人への分配比率 + */ + event DistributionRatioUpdated( + address indexed changedBy, + uint256 fundRatio, + uint256 burnRatio, + uint256 recipientRatio + ); + /** * @dev コンストラクタ * @param _initialAdmin 初期管理者アドレス(全ロールを付与) @@ -97,6 +111,12 @@ contract Router is AccessControl, Pausable, ReentrancyGuard { ) external onlyRole(RATIO_MANAGER_ROLE) whenNotPaused { require(_fundRatio + burnRatio <= 10000, "Total ratio exceeds 100%"); fundRatio = _fundRatio; + emit DistributionRatioUpdated( + msg.sender, + fundRatio, + burnRatio, + 10000 - fundRatio - burnRatio + ); } /** @@ -108,6 +128,12 @@ contract Router is AccessControl, Pausable, ReentrancyGuard { ) external onlyRole(RATIO_MANAGER_ROLE) whenNotPaused { require(fundRatio + _burnRatio <= 10000, "Total ratio exceeds 100%"); burnRatio = _burnRatio; + emit DistributionRatioUpdated( + msg.sender, + fundRatio, + burnRatio, + 10000 - fundRatio - burnRatio + ); } /** diff --git a/packages/contract/ignition/deployments/chain-11155111/artifacts/FoRTokenModule#FoRToken.json b/packages/contract/ignition/deployments/chain-11155111/artifacts/FoRTokenModule#FoRToken.json index 2c3b323..d73a26f 100644 --- a/packages/contract/ignition/deployments/chain-11155111/artifacts/FoRTokenModule#FoRToken.json +++ b/packages/contract/ignition/deployments/chain-11155111/artifacts/FoRTokenModule#FoRToken.json @@ -24,6 +24,32 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyAllowListed", + "type": "error" + }, { "inputs": [], "name": "ECDSAInvalidSignature", @@ -185,6 +211,27 @@ "name": "InvalidShortString", "type": "error" }, + { + "inputs": [], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "NotAllowListed", + "type": "error" + }, + { + "inputs": [], + "name": "SignatureExpired", + "type": "error" + }, { "inputs": [ { @@ -196,6 +243,32 @@ "name": "StringTooLong", "type": "error" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "AllowListAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "AllowListRemoved", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -227,6 +300,81 @@ "name": "EIP712DomainChanged", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -252,6 +400,45 @@ "name": "Transfer", "type": "event" }, + { + "inputs": [], + "name": "ADD_TO_ALLOWLIST_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "DOMAIN_SEPARATOR", @@ -265,6 +452,42 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "addToAllowList", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "addToAllowListWithSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -388,6 +611,86 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isAllowListed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "name", @@ -463,6 +766,74 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "removeFromAllowList", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "callerConfirmation", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "symbol", @@ -498,7 +869,7 @@ }, { "internalType": "uint256", - "name": "value", + "name": "amount", "type": "uint256" } ], @@ -527,7 +898,7 @@ }, { "internalType": "uint256", - "name": "value", + "name": "amount", "type": "uint256" } ], @@ -543,54 +914,54 @@ "type": "function" } ], - "bytecode": "0x610160604052348015610010575f5ffd5b506040516114ab3803806114ab83398101604081905261002f9161039c565b6040805180820190915260018152603160f81b60208201528290819081846003610059838261048e565b506004610066828261048e565b506100769150839050600561012d565b6101205261008581600661012d565b61014052815160208084019190912060e052815190820120610100524660a05261011160e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c05250610125338461015f565b5050506105bf565b5f602083511015610148576101418361019c565b9050610159565b81610153848261048e565b5060ff90505b92915050565b6001600160a01b03821661018d5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6101985f83836101d9565b5050565b5f5f829050601f815111156101c6578260405163305a27a960e01b81526004016101849190610548565b80516101d18261057d565b179392505050565b6001600160a01b038316610203578060025f8282546101f891906105a0565b909155506102739050565b6001600160a01b0383165f90815260208190526040902054818110156102555760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610184565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661028f576002805482900390556102ad565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516102f291815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610322575f5ffd5b81516001600160401b0381111561033b5761033b6102ff565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610369576103696102ff565b604052818152838201602001851015610380575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f606084860312156103ae575f5ffd5b835160208501519093506001600160401b038111156103cb575f5ffd5b6103d786828701610313565b604086015190935090506001600160401b038111156103f4575f5ffd5b61040086828701610313565b9150509250925092565b600181811c9082168061041e57607f821691505b60208210810361043c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561048957805f5260205f20601f840160051c810160208510156104675750805b601f840160051c820191505b81811015610486575f8155600101610473565b50505b505050565b81516001600160401b038111156104a7576104a76102ff565b6104bb816104b5845461040a565b84610442565b6020601f8211600181146104ed575f83156104d65750848201515b5f19600385901b1c1916600184901b178455610486565b5f84815260208120601f198516915b8281101561051c57878501518255602094850194600190920191016104fc565b508482101561053957868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561043c575f1960209190910360031b1b16919050565b8082018082111561015957634e487b7160e01b5f52601160045260245ffd5b60805160a05160c05160e051610100516101205161014051610e9b6106105f395f6106e201525f6106b501525f61065e01525f61063601525f61059101525f6105bb01525f6105e50152610e9b5ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c806370a082311161008857806395d89b411161006357806395d89b41146101a2578063a9059cbb146101aa578063d505accf146101bd578063dd62ed3e146101d2575f5ffd5b806370a082311461014c5780637ecebe001461017457806384b0196e14610187575f5ffd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce567146101355780633644e51514610144575b5f5ffd5b6100d761020a565b6040516100e49190610c17565b60405180910390f35b6101006100fb366004610c4b565b61029a565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b610100610130366004610c73565b6102b3565b604051601281526020016100e4565b6101146102d6565b61011461015a366004610cad565b6001600160a01b03165f9081526020819052604090205490565b610114610182366004610cad565b6102e4565b61018f610301565b6040516100e49796959493929190610cc6565b6100d7610343565b6101006101b8366004610c4b565b610352565b6101d06101cb366004610d5c565b61035f565b005b6101146101e0366004610dc9565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021990610dfa565b80601f016020809104026020016040519081016040528092919081815260200182805461024590610dfa565b80156102905780601f1061026757610100808354040283529160200191610290565b820191905f5260205f20905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b5f336102a781858561049a565b60019150505b92915050565b5f336102c08582856104ac565b6102cb858585610528565b506001949350505050565b5f6102df610585565b905090565b6001600160a01b0381165f908152600760205260408120546102ad565b5f6060805f5f5f60606103126106ae565b61031a6106db565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60606004805461021990610dfa565b5f336102a7818585610528565b834211156103885760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886103d38c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61042d82610708565b90505f61043c82878787610734565b9050896001600160a01b0316816001600160a01b031614610483576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161037f565b61048e8a8a8a61049a565b50505050505050505050565b6104a78383836001610760565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811015610522578181101561051457604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161037f565b61052284848484035f610760565b50505050565b6001600160a01b03831661055157604051634b637e8f60e11b81525f600482015260240161037f565b6001600160a01b03821661057a5760405163ec442f0560e01b81525f600482015260240161037f565b6104a7838383610832565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156105dd57507f000000000000000000000000000000000000000000000000000000000000000046145b1561060757507f000000000000000000000000000000000000000000000000000000000000000090565b6102df604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60606102df7f00000000000000000000000000000000000000000000000000000000000000006005610958565b60606102df7f00000000000000000000000000000000000000000000000000000000000000006006610958565b5f6102ad610714610585565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f61074488888888610a01565b9250925092506107548282610ac9565b50909695505050505050565b6001600160a01b0384166107895760405163e602df0560e01b81525f600482015260240161037f565b6001600160a01b0383166107b257604051634a1406b160e11b81525f600482015260240161037f565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561052257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161082491815260200190565b60405180910390a350505050565b6001600160a01b03831661085c578060025f8282546108519190610e32565b909155506108cc9050565b6001600160a01b0383165f90815260208190526040902054818110156108ae5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161037f565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166108e857600280548290039055610906565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161094b91815260200190565b60405180910390a3505050565b606060ff83146109725761096b83610b85565b90506102ad565b81805461097e90610dfa565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa90610dfa565b80156109f55780601f106109cc576101008083540402835291602001916109f5565b820191905f5260205f20905b8154815290600101906020018083116109d857829003601f168201915b505050505090506102ad565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610a3a57505f91506003905082610abf565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610a8b573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610ab657505f925060019150829050610abf565b92505f91508190505b9450945094915050565b5f826003811115610adc57610adc610e51565b03610ae5575050565b6001826003811115610af957610af9610e51565b03610b175760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610b2b57610b2b610e51565b03610b4c5760405163fce698f760e01b81526004810182905260240161037f565b6003826003811115610b6057610b60610e51565b03610b81576040516335e2f38360e21b81526004810182905260240161037f565b5050565b60605f610b9183610bc2565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156102ad57604051632cd44ac360e21b815260040160405180910390fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c296020830184610be9565b9392505050565b80356001600160a01b0381168114610c46575f5ffd5b919050565b5f5f60408385031215610c5c575f5ffd5b610c6583610c30565b946020939093013593505050565b5f5f5f60608486031215610c85575f5ffd5b610c8e84610c30565b9250610c9c60208501610c30565b929592945050506040919091013590565b5f60208284031215610cbd575f5ffd5b610c2982610c30565b60ff60f81b8816815260e060208201525f610ce460e0830189610be9565b8281036040840152610cf68189610be9565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015610d4b578351835260209384019390920191600101610d2d565b50909b9a5050505050505050505050565b5f5f5f5f5f5f5f60e0888a031215610d72575f5ffd5b610d7b88610c30565b9650610d8960208901610c30565b95506040880135945060608801359350608088013560ff81168114610dac575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610dda575f5ffd5b610de383610c30565b9150610df160208401610c30565b90509250929050565b600181811c90821680610e0e57607f821691505b602082108103610e2c57634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102ad57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220959b3b2b2a1a1fda4804796a9c642499d98ab4c6794ec7a8593445a1903c44a964736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c806370a082311161008857806395d89b411161006357806395d89b41146101a2578063a9059cbb146101aa578063d505accf146101bd578063dd62ed3e146101d2575f5ffd5b806370a082311461014c5780637ecebe001461017457806384b0196e14610187575f5ffd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce567146101355780633644e51514610144575b5f5ffd5b6100d761020a565b6040516100e49190610c17565b60405180910390f35b6101006100fb366004610c4b565b61029a565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b610100610130366004610c73565b6102b3565b604051601281526020016100e4565b6101146102d6565b61011461015a366004610cad565b6001600160a01b03165f9081526020819052604090205490565b610114610182366004610cad565b6102e4565b61018f610301565b6040516100e49796959493929190610cc6565b6100d7610343565b6101006101b8366004610c4b565b610352565b6101d06101cb366004610d5c565b61035f565b005b6101146101e0366004610dc9565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021990610dfa565b80601f016020809104026020016040519081016040528092919081815260200182805461024590610dfa565b80156102905780601f1061026757610100808354040283529160200191610290565b820191905f5260205f20905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b5f336102a781858561049a565b60019150505b92915050565b5f336102c08582856104ac565b6102cb858585610528565b506001949350505050565b5f6102df610585565b905090565b6001600160a01b0381165f908152600760205260408120546102ad565b5f6060805f5f5f60606103126106ae565b61031a6106db565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60606004805461021990610dfa565b5f336102a7818585610528565b834211156103885760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886103d38c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61042d82610708565b90505f61043c82878787610734565b9050896001600160a01b0316816001600160a01b031614610483576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161037f565b61048e8a8a8a61049a565b50505050505050505050565b6104a78383836001610760565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811015610522578181101561051457604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161037f565b61052284848484035f610760565b50505050565b6001600160a01b03831661055157604051634b637e8f60e11b81525f600482015260240161037f565b6001600160a01b03821661057a5760405163ec442f0560e01b81525f600482015260240161037f565b6104a7838383610832565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156105dd57507f000000000000000000000000000000000000000000000000000000000000000046145b1561060757507f000000000000000000000000000000000000000000000000000000000000000090565b6102df604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60606102df7f00000000000000000000000000000000000000000000000000000000000000006005610958565b60606102df7f00000000000000000000000000000000000000000000000000000000000000006006610958565b5f6102ad610714610585565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f61074488888888610a01565b9250925092506107548282610ac9565b50909695505050505050565b6001600160a01b0384166107895760405163e602df0560e01b81525f600482015260240161037f565b6001600160a01b0383166107b257604051634a1406b160e11b81525f600482015260240161037f565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561052257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161082491815260200190565b60405180910390a350505050565b6001600160a01b03831661085c578060025f8282546108519190610e32565b909155506108cc9050565b6001600160a01b0383165f90815260208190526040902054818110156108ae5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161037f565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166108e857600280548290039055610906565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161094b91815260200190565b60405180910390a3505050565b606060ff83146109725761096b83610b85565b90506102ad565b81805461097e90610dfa565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa90610dfa565b80156109f55780601f106109cc576101008083540402835291602001916109f5565b820191905f5260205f20905b8154815290600101906020018083116109d857829003601f168201915b505050505090506102ad565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610a3a57505f91506003905082610abf565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610a8b573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610ab657505f925060019150829050610abf565b92505f91508190505b9450945094915050565b5f826003811115610adc57610adc610e51565b03610ae5575050565b6001826003811115610af957610af9610e51565b03610b175760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610b2b57610b2b610e51565b03610b4c5760405163fce698f760e01b81526004810182905260240161037f565b6003826003811115610b6057610b60610e51565b03610b81576040516335e2f38360e21b81526004810182905260240161037f565b5050565b60605f610b9183610bc2565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156102ad57604051632cd44ac360e21b815260040160405180910390fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c296020830184610be9565b9392505050565b80356001600160a01b0381168114610c46575f5ffd5b919050565b5f5f60408385031215610c5c575f5ffd5b610c6583610c30565b946020939093013593505050565b5f5f5f60608486031215610c85575f5ffd5b610c8e84610c30565b9250610c9c60208501610c30565b929592945050506040919091013590565b5f60208284031215610cbd575f5ffd5b610c2982610c30565b60ff60f81b8816815260e060208201525f610ce460e0830189610be9565b8281036040840152610cf68189610be9565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015610d4b578351835260209384019390920191600101610d2d565b50909b9a5050505050505050505050565b5f5f5f5f5f5f5f60e0888a031215610d72575f5ffd5b610d7b88610c30565b9650610d8960208901610c30565b95506040880135945060608801359350608088013560ff81168114610dac575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610dda575f5ffd5b610de383610c30565b9150610df160208401610c30565b90509250929050565b600181811c90821680610e0e57607f821691505b602082108103610e2c57634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102ad57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220959b3b2b2a1a1fda4804796a9c642499d98ab4c6794ec7a8593445a1903c44a964736f6c634300081c0033", + "bytecode": "0x610160604052348015610010575f5ffd5b50604051611ecd380380611ecd83398101604081905261002f916104bb565b6040805180820190915260018152603160f81b6020820152829081908184600361005983826105ad565b50600461006682826105ad565b50610076915083905060056101a1565b610120526100858160066101a1565b61014052815160208084019190912060e052815190820120610100524660a05261011160e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0525061012533846101d3565b61012f5f33610210565b5061015a7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610210565b50335f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a25050506106de565b5f6020835110156101bc576101b5836102bb565b90506101cd565b816101c784826105ad565b5060ff90505b92915050565b6001600160a01b0382166102015760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b61020c5f83836102f8565b5050565b5f8281526008602090815260408083206001600160a01b038516845290915281205460ff166102b4575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff1916600117905561026c3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101cd565b505f6101cd565b5f5f829050601f815111156102e5578260405163305a27a960e01b81526004016101f89190610667565b80516102f08261069c565b179392505050565b6001600160a01b038316610322578060025f82825461031791906106bf565b909155506103929050565b6001600160a01b0383165f90815260208190526040902054818110156103745760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016101f8565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166103ae576002805482900390556103cc565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161041191815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610441575f5ffd5b81516001600160401b0381111561045a5761045a61041e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156104885761048861041e565b60405281815283820160200185101561049f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f606084860312156104cd575f5ffd5b835160208501519093506001600160401b038111156104ea575f5ffd5b6104f686828701610432565b604086015190935090506001600160401b03811115610513575f5ffd5b61051f86828701610432565b9150509250925092565b600181811c9082168061053d57607f821691505b60208210810361055b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156105a857805f5260205f20601f840160051c810160208510156105865750805b601f840160051c820191505b818110156105a5575f8155600101610592565b50505b505050565b81516001600160401b038111156105c6576105c661041e565b6105da816105d48454610529565b84610561565b6020601f82116001811461060c575f83156105f55750848201515b5f19600385901b1c1916600184901b1784556105a5565b5f84815260208120601f198516915b8281101561063b578785015182556020948501946001909201910161061b565b508482101561065857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561055b575f1960209190910360031b1b16919050565b808201808211156101cd57634e487b7160e01b5f52601160045260245ffd5b60805160a05160c05160e05161010051610120516101405161179e61072f5f395f610d6401525f610d3701525f610c7501525f610c4d01525f610ba801525f610bd201525f610bfc015261179e5ff3fe608060405234801561000f575f5ffd5b5060043610610187575f3560e01c806370dd8d2e116100d957806395d89b4111610093578063d505accf1161006e578063d505accf1461037c578063d547741f1461038f578063dd62ed3e146103a2578063eba8dabc146103da575f5ffd5b806395d89b411461035a578063a217fddf14610362578063a9059cbb14610369575f5ffd5b806370dd8d2e146102c757806375b238fc146102f25780637ecebe001461030657806384b0196e146103195780638d33420a1461033457806391d1485414610347575f5ffd5b8063248a9ca31161014457806331f591021161011f57806331f59102146102715780633644e5151461028457806336568abe1461028c57806370a082311461029f575f5ffd5b8063248a9ca31461022b5780632f2ff15d1461024d578063313ce56714610262575f5ffd5b806301ffc9a71461018b57806306fdde03146101b3578063095ea7b3146101c8578063180cbefc146101db57806318160ddd1461021057806323b872dd14610218575b5f5ffd5b61019e6101993660046113f1565b6103ed565b60405190151581526020015b60405180910390f35b6101bb6103fd565b6040516101aa9190611446565b61019e6101d6366004611473565b61048d565b6102027f27635d090072063300e62545cc2f6a7dc583162c8abe1f7a7e48e152b6be1d2281565b6040519081526020016101aa565b600254610202565b61019e61022636600461149b565b6104a4565b6102026102393660046114d5565b5f9081526008602052604090206001015490565b61026061025b3660046114ec565b6104c2565b005b604051601281526020016101aa565b61026061027f366004611516565b6104ec565b610202610587565b61026061029a3660046114ec565b610595565b6102026102ad366004611516565b6001600160a01b03165f9081526020819052604090205490565b61019e6102d5366004611516565b6001600160a01b03165f9081526009602052604090205460ff1690565b6102025f5160206117495f395f51905f5281565b610202610314366004611516565b6105cd565b6103216105ea565b6040516101aa979695949392919061152f565b6102606103423660046115c5565b61062c565b61019e6103553660046114ec565b6107b9565b6101bb6107e3565b6102025f81565b61019e610377366004611473565b6107f2565b61026061038a366004611648565b61080e565b61026061039d3660046114ec565b610949565b6102026103b03660046116b5565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6102606103e8366004611516565b61096d565b5f6103f782610a10565b92915050565b60606003805461040c906116dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610438906116dd565b80156104835780601f1061045a57610100808354040283529160200191610483565b820191905f5260205f20905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b5f3361049a818585610a44565b5060019392505050565b5f6104af8484610a51565b6104ba848484610adb565b949350505050565b5f828152600860205260409020600101546104dc81610afe565b6104e68383610b0b565b50505050565b5f5160206117495f395f51905f5261050381610afe565b6001600160a01b0382165f9081526009602052604090205460ff161561053c57604051632a240d9f60e11b815260040160405180910390fd5b6001600160a01b0382165f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a25050565b5f610590610b9c565b905090565b6001600160a01b03811633146105be5760405163334bd91960e11b815260040160405180910390fd5b6105c88282610cc5565b505050565b6001600160a01b0381165f908152600760205260408120546103f7565b5f6060805f5f5f60606105fb610d30565b610603610d5d565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b8242111561064d57604051630819bdcd60e01b815260040160405180910390fd5b6001600160a01b0384165f9081526009602052604090205460ff161561068657604051632a240d9f60e11b815260040160405180910390fd5b604080517f27635d090072063300e62545cc2f6a7dc583162c8abe1f7a7e48e152b6be1d2260208201526001600160a01b03861691810191909152606081018490525f906080016040516020818303038152906040528051906020012090505f6106ef82610d8a565b90505f61073385858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508693925050610db69050565b905061074c5f5160206117495f395f51905f52826107b9565b61076957604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0387165f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a250505050505050565b5f9182526008602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461040c906116dd565b5f6107fd3384610a51565b6108078383610dde565b9392505050565b834211156108375760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108828c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108dc82610d8a565b90505f6108eb82878787610deb565b9050896001600160a01b0316816001600160a01b031614610932576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161082e565b61093d8a8a8a610a44565b50505050505050505050565b5f8281526008602052604090206001015461096381610afe565b6104e68383610cc5565b5f5160206117495f395f51905f5261098481610afe565b6001600160a01b0382165f9081526009602052604090205460ff166109c757604051635bb897bf60e11b81526001600160a01b038316600482015260240161082e565b6001600160a01b0382165f81815260096020526040808220805460ff19169055517fe7fc45e1e6a61a6d67e182d4847f8c2dcde282d7008410c1bc3a7e8fa299eb909190a25050565b5f6001600160e01b03198216637965db0b60e01b14806103f757506301ffc9a760e01b6001600160e01b03198316146103f7565b6105c88383836001610e17565b6001600160a01b0382165f9081526009602052604090205460ff16610a9457604051635bb897bf60e11b81526001600160a01b038316600482015260240161082e565b6001600160a01b0381165f9081526009602052604090205460ff16610ad757604051635bb897bf60e11b81526001600160a01b038216600482015260240161082e565b5050565b5f33610ae8858285610ee9565b610af3858585610f5f565b506001949350505050565b610b088133610fbc565b50565b5f610b1683836107b9565b610b95575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff19166001179055610b4d3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016103f7565b505f6103f7565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610bf457507f000000000000000000000000000000000000000000000000000000000000000046145b15610c1e57507f000000000000000000000000000000000000000000000000000000000000000090565b610590604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f610cd083836107b9565b15610b95575f8381526008602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016103f7565b60606105907f00000000000000000000000000000000000000000000000000000000000000006005610ff5565b60606105907f00000000000000000000000000000000000000000000000000000000000000006006610ff5565b5f6103f7610d96610b9c565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f610dc4868661109e565b925092509250610dd482826110e7565b5090949350505050565b5f3361049a818585610f5f565b5f5f5f5f610dfb8888888861119f565b925092509250610e0b82826110e7565b50909695505050505050565b6001600160a01b038416610e405760405163e602df0560e01b81525f600482015260240161082e565b6001600160a01b038316610e6957604051634a1406b160e11b81525f600482015260240161082e565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156104e657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610edb91815260200190565b60405180910390a350505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156104e65781811015610f5157604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161082e565b6104e684848484035f610e17565b6001600160a01b038316610f8857604051634b637e8f60e11b81525f600482015260240161082e565b6001600160a01b038216610fb15760405163ec442f0560e01b81525f600482015260240161082e565b6105c8838383611267565b610fc682826107b9565b610ad75760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161082e565b606060ff831461100f576110088361138d565b90506103f7565b81805461101b906116dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611047906116dd565b80156110925780601f1061106957610100808354040283529160200191611092565b820191905f5260205f20905b81548152906001019060200180831161107557829003601f168201915b505050505090506103f7565b5f5f5f83516041036110d5576020840151604085015160608601515f1a6110c78882858561119f565b9550955095505050506110e0565b505081515f91506002905b9250925092565b5f8260038111156110fa576110fa611715565b03611103575050565b600182600381111561111757611117611715565b036111355760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561114957611149611715565b0361116a5760405163fce698f760e01b81526004810182905260240161082e565b600382600381111561117e5761117e611715565b03610ad7576040516335e2f38360e21b81526004810182905260240161082e565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156111d857505f9150600390508261125d565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611229573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661125457505f92506001915082905061125d565b92505f91508190505b9450945094915050565b6001600160a01b038316611291578060025f8282546112869190611729565b909155506113019050565b6001600160a01b0383165f90815260208190526040902054818110156112e35760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161082e565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661131d5760028054829003905561133b565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161138091815260200190565b60405180910390a3505050565b60605f611399836113ca565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156103f757604051632cd44ac360e21b815260040160405180910390fd5b5f60208284031215611401575f5ffd5b81356001600160e01b031981168114610807575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6108076020830184611418565b80356001600160a01b038116811461146e575f5ffd5b919050565b5f5f60408385031215611484575f5ffd5b61148d83611458565b946020939093013593505050565b5f5f5f606084860312156114ad575f5ffd5b6114b684611458565b92506114c460208501611458565b929592945050506040919091013590565b5f602082840312156114e5575f5ffd5b5035919050565b5f5f604083850312156114fd575f5ffd5b8235915061150d60208401611458565b90509250929050565b5f60208284031215611526575f5ffd5b61080782611458565b60ff60f81b8816815260e060208201525f61154d60e0830189611418565b828103604084015261155f8189611418565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156115b4578351835260209384019390920191600101611596565b50909b9a5050505050505050505050565b5f5f5f5f606085870312156115d8575f5ffd5b6115e185611458565b935060208501359250604085013567ffffffffffffffff811115611603575f5ffd5b8501601f81018713611613575f5ffd5b803567ffffffffffffffff811115611629575f5ffd5b87602082840101111561163a575f5ffd5b949793965060200194505050565b5f5f5f5f5f5f5f60e0888a03121561165e575f5ffd5b61166788611458565b965061167560208901611458565b95506040880135945060608801359350608088013560ff81168114611698575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156116c6575f5ffd5b6116cf83611458565b915061150d60208401611458565b600181811c908216806116f157607f821691505b60208210810361170f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b808201808211156103f757634e487b7160e01b5f52601160045260245ffdfea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a264697066735822122091b918cf2c46e7a2c094b0fd8a986f7c26d797d6865d166d3266cd617bdce16964736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610187575f3560e01c806370dd8d2e116100d957806395d89b4111610093578063d505accf1161006e578063d505accf1461037c578063d547741f1461038f578063dd62ed3e146103a2578063eba8dabc146103da575f5ffd5b806395d89b411461035a578063a217fddf14610362578063a9059cbb14610369575f5ffd5b806370dd8d2e146102c757806375b238fc146102f25780637ecebe001461030657806384b0196e146103195780638d33420a1461033457806391d1485414610347575f5ffd5b8063248a9ca31161014457806331f591021161011f57806331f59102146102715780633644e5151461028457806336568abe1461028c57806370a082311461029f575f5ffd5b8063248a9ca31461022b5780632f2ff15d1461024d578063313ce56714610262575f5ffd5b806301ffc9a71461018b57806306fdde03146101b3578063095ea7b3146101c8578063180cbefc146101db57806318160ddd1461021057806323b872dd14610218575b5f5ffd5b61019e6101993660046113f1565b6103ed565b60405190151581526020015b60405180910390f35b6101bb6103fd565b6040516101aa9190611446565b61019e6101d6366004611473565b61048d565b6102027f27635d090072063300e62545cc2f6a7dc583162c8abe1f7a7e48e152b6be1d2281565b6040519081526020016101aa565b600254610202565b61019e61022636600461149b565b6104a4565b6102026102393660046114d5565b5f9081526008602052604090206001015490565b61026061025b3660046114ec565b6104c2565b005b604051601281526020016101aa565b61026061027f366004611516565b6104ec565b610202610587565b61026061029a3660046114ec565b610595565b6102026102ad366004611516565b6001600160a01b03165f9081526020819052604090205490565b61019e6102d5366004611516565b6001600160a01b03165f9081526009602052604090205460ff1690565b6102025f5160206117495f395f51905f5281565b610202610314366004611516565b6105cd565b6103216105ea565b6040516101aa979695949392919061152f565b6102606103423660046115c5565b61062c565b61019e6103553660046114ec565b6107b9565b6101bb6107e3565b6102025f81565b61019e610377366004611473565b6107f2565b61026061038a366004611648565b61080e565b61026061039d3660046114ec565b610949565b6102026103b03660046116b5565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6102606103e8366004611516565b61096d565b5f6103f782610a10565b92915050565b60606003805461040c906116dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610438906116dd565b80156104835780601f1061045a57610100808354040283529160200191610483565b820191905f5260205f20905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b5f3361049a818585610a44565b5060019392505050565b5f6104af8484610a51565b6104ba848484610adb565b949350505050565b5f828152600860205260409020600101546104dc81610afe565b6104e68383610b0b565b50505050565b5f5160206117495f395f51905f5261050381610afe565b6001600160a01b0382165f9081526009602052604090205460ff161561053c57604051632a240d9f60e11b815260040160405180910390fd5b6001600160a01b0382165f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a25050565b5f610590610b9c565b905090565b6001600160a01b03811633146105be5760405163334bd91960e11b815260040160405180910390fd5b6105c88282610cc5565b505050565b6001600160a01b0381165f908152600760205260408120546103f7565b5f6060805f5f5f60606105fb610d30565b610603610d5d565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b8242111561064d57604051630819bdcd60e01b815260040160405180910390fd5b6001600160a01b0384165f9081526009602052604090205460ff161561068657604051632a240d9f60e11b815260040160405180910390fd5b604080517f27635d090072063300e62545cc2f6a7dc583162c8abe1f7a7e48e152b6be1d2260208201526001600160a01b03861691810191909152606081018490525f906080016040516020818303038152906040528051906020012090505f6106ef82610d8a565b90505f61073385858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508693925050610db69050565b905061074c5f5160206117495f395f51905f52826107b9565b61076957604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0387165f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a250505050505050565b5f9182526008602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461040c906116dd565b5f6107fd3384610a51565b6108078383610dde565b9392505050565b834211156108375760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108828c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108dc82610d8a565b90505f6108eb82878787610deb565b9050896001600160a01b0316816001600160a01b031614610932576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161082e565b61093d8a8a8a610a44565b50505050505050505050565b5f8281526008602052604090206001015461096381610afe565b6104e68383610cc5565b5f5160206117495f395f51905f5261098481610afe565b6001600160a01b0382165f9081526009602052604090205460ff166109c757604051635bb897bf60e11b81526001600160a01b038316600482015260240161082e565b6001600160a01b0382165f81815260096020526040808220805460ff19169055517fe7fc45e1e6a61a6d67e182d4847f8c2dcde282d7008410c1bc3a7e8fa299eb909190a25050565b5f6001600160e01b03198216637965db0b60e01b14806103f757506301ffc9a760e01b6001600160e01b03198316146103f7565b6105c88383836001610e17565b6001600160a01b0382165f9081526009602052604090205460ff16610a9457604051635bb897bf60e11b81526001600160a01b038316600482015260240161082e565b6001600160a01b0381165f9081526009602052604090205460ff16610ad757604051635bb897bf60e11b81526001600160a01b038216600482015260240161082e565b5050565b5f33610ae8858285610ee9565b610af3858585610f5f565b506001949350505050565b610b088133610fbc565b50565b5f610b1683836107b9565b610b95575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff19166001179055610b4d3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016103f7565b505f6103f7565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610bf457507f000000000000000000000000000000000000000000000000000000000000000046145b15610c1e57507f000000000000000000000000000000000000000000000000000000000000000090565b610590604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f610cd083836107b9565b15610b95575f8381526008602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016103f7565b60606105907f00000000000000000000000000000000000000000000000000000000000000006005610ff5565b60606105907f00000000000000000000000000000000000000000000000000000000000000006006610ff5565b5f6103f7610d96610b9c565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f610dc4868661109e565b925092509250610dd482826110e7565b5090949350505050565b5f3361049a818585610f5f565b5f5f5f5f610dfb8888888861119f565b925092509250610e0b82826110e7565b50909695505050505050565b6001600160a01b038416610e405760405163e602df0560e01b81525f600482015260240161082e565b6001600160a01b038316610e6957604051634a1406b160e11b81525f600482015260240161082e565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156104e657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610edb91815260200190565b60405180910390a350505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156104e65781811015610f5157604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161082e565b6104e684848484035f610e17565b6001600160a01b038316610f8857604051634b637e8f60e11b81525f600482015260240161082e565b6001600160a01b038216610fb15760405163ec442f0560e01b81525f600482015260240161082e565b6105c8838383611267565b610fc682826107b9565b610ad75760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161082e565b606060ff831461100f576110088361138d565b90506103f7565b81805461101b906116dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611047906116dd565b80156110925780601f1061106957610100808354040283529160200191611092565b820191905f5260205f20905b81548152906001019060200180831161107557829003601f168201915b505050505090506103f7565b5f5f5f83516041036110d5576020840151604085015160608601515f1a6110c78882858561119f565b9550955095505050506110e0565b505081515f91506002905b9250925092565b5f8260038111156110fa576110fa611715565b03611103575050565b600182600381111561111757611117611715565b036111355760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561114957611149611715565b0361116a5760405163fce698f760e01b81526004810182905260240161082e565b600382600381111561117e5761117e611715565b03610ad7576040516335e2f38360e21b81526004810182905260240161082e565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156111d857505f9150600390508261125d565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611229573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661125457505f92506001915082905061125d565b92505f91508190505b9450945094915050565b6001600160a01b038316611291578060025f8282546112869190611729565b909155506113019050565b6001600160a01b0383165f90815260208190526040902054818110156112e35760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161082e565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661131d5760028054829003905561133b565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161138091815260200190565b60405180910390a3505050565b60605f611399836113ca565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156103f757604051632cd44ac360e21b815260040160405180910390fd5b5f60208284031215611401575f5ffd5b81356001600160e01b031981168114610807575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6108076020830184611418565b80356001600160a01b038116811461146e575f5ffd5b919050565b5f5f60408385031215611484575f5ffd5b61148d83611458565b946020939093013593505050565b5f5f5f606084860312156114ad575f5ffd5b6114b684611458565b92506114c460208501611458565b929592945050506040919091013590565b5f602082840312156114e5575f5ffd5b5035919050565b5f5f604083850312156114fd575f5ffd5b8235915061150d60208401611458565b90509250929050565b5f60208284031215611526575f5ffd5b61080782611458565b60ff60f81b8816815260e060208201525f61154d60e0830189611418565b828103604084015261155f8189611418565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156115b4578351835260209384019390920191600101611596565b50909b9a5050505050505050505050565b5f5f5f5f606085870312156115d8575f5ffd5b6115e185611458565b935060208501359250604085013567ffffffffffffffff811115611603575f5ffd5b8501601f81018713611613575f5ffd5b803567ffffffffffffffff811115611629575f5ffd5b87602082840101111561163a575f5ffd5b949793965060200194505050565b5f5f5f5f5f5f5f60e0888a03121561165e575f5ffd5b61166788611458565b965061167560208901611458565b95506040880135945060608801359350608088013560ff81168114611698575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156116c6575f5ffd5b6116cf83611458565b915061150d60208401611458565b600181811c908216806116f157607f821691505b60208210810361170f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b808201808211156103f757634e487b7160e01b5f52601160045260245ffdfea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a264697066735822122091b918cf2c46e7a2c094b0fd8a986f7c26d797d6865d166d3266cd617bdce16964736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {}, "immutableReferences": { - "3232": [ + "3612": [ { "length": 32, - "start": 1509 + "start": 3068 } ], - "3234": [ + "3614": [ { "length": 32, - "start": 1467 + "start": 3026 } ], - "3236": [ + "3616": [ { "length": 32, - "start": 1425 + "start": 2984 } ], - "3238": [ + "3618": [ { "length": 32, - "start": 1590 + "start": 3149 } ], - "3240": [ + "3620": [ { "length": 32, - "start": 1630 + "start": 3189 } ], - "3243": [ + "3623": [ { "length": 32, - "start": 1717 + "start": 3383 } ], - "3246": [ + "3626": [ { "length": 32, - "start": 1762 + "start": 3428 } ] }, "inputSourceName": "project/contracts/FoRToken.sol", - "buildInfoId": "solc-0_8_28-40227ca68470cf204db0488311108091c535c8e2" + "buildInfoId": "solc-0_8_28-5aa01ff243ad5b208267044bfe0ef66e032fad37" } \ No newline at end of file diff --git a/packages/contract/ignition/deployments/chain-11155111/artifacts/RouterFactoryModule#RouterFactory.json b/packages/contract/ignition/deployments/chain-11155111/artifacts/RouterFactoryModule#RouterFactory.json index fb3a30a..3e9eaa1 100644 --- a/packages/contract/ignition/deployments/chain-11155111/artifacts/RouterFactoryModule#RouterFactory.json +++ b/packages/contract/ignition/deployments/chain-11155111/artifacts/RouterFactoryModule#RouterFactory.json @@ -36,6 +36,16 @@ "name": "_salt", "type": "bytes32" }, + { + "internalType": "address", + "name": "_initialAdmin", + "type": "address" + }, + { + "internalType": "address", + "name": "_forToken", + "type": "address" + }, { "internalType": "address", "name": "_fundWallet", @@ -70,6 +80,16 @@ "name": "_salt", "type": "bytes32" }, + { + "internalType": "address", + "name": "_initialAdmin", + "type": "address" + }, + { + "internalType": "address", + "name": "_forToken", + "type": "address" + }, { "internalType": "address", "name": "_fundWallet", @@ -98,11 +118,11 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600e575f5ffd5b50610c288061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c806398f3e1ed14610038578063b852a47a14610067575b5f5ffd5b61004b610046366004610272565b61007a565b6040516001600160a01b03909116815260200160405180910390f35b61004b610075366004610272565b610109565b5f5f6040518060200161008c90610265565b601f1982820381018352601f9091011660408181526001600160a01b038816602083015281018690526060810185905260800160408051601f19818403018152908290526100dd92916020016102ce565b60405160208183030381529060405290506100ff868280519060200120610188565b9695505050505050565b5f5f6040518060200161011b90610265565b601f1982820381018352601f9091011660408181526001600160a01b038816602083015281018690526060810185905260800160408051601f198184030181529082905261016c92916020016102ce565b60405160208183030381529060405290506100ff5f878361019b565b5f610194838330610233565b9392505050565b5f834710156101ca5760405163cf47918160e01b81524760048201526024810185905260440160405180910390fd5b81515f036101eb57604051631328927760e21b815260040160405180910390fd5b8282516020840186f590503d15198115161561020c576040513d5f823e3d81fd5b6001600160a01b0381166101945760405163b06ebf3d60e01b815260040160405180910390fd5b5f604051836040820152846020820152828152600b8101905060ff8153605590206001600160a01b0316949350505050565b610908806102eb83390190565b5f5f5f5f60808587031215610285575f5ffd5b8435935060208501356001600160a01b03811681146102a2575f5ffd5b93969395505050506040820135916060013590565b5f81518060208401855e5f93019283525090919050565b5f6102e26102dc83866102b7565b846102b7565b94935050505056fe608060405234801561000f575f5ffd5b5060405161090838038061090883398101604081905261002e9161016b565b600380546001600160a01b0319166001600160a01b038516179055600182905560028190556100635f61005e3390565b6100c2565b5061008e7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f336100c2565b506100b97f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e0336100c2565b505050506101aa565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16610162575f838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561011a3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610165565b505f5b92915050565b5f5f5f6060848603121561017d575f5ffd5b83516001600160a01b0381168114610193575f5ffd5b602085015160409095015190969495509392505050565b610751806101b75f395ff3fe608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c806355ce3b9a116100935780639370131f116100635780639370131f14610243578063a217fddf14610256578063d547741f1461025d578063fccc281314610270575f5ffd5b806355ce3b9a146101e9578063664a1ad6146101fc5780638ed648501461022757806391d1485414610230575f5ffd5b80632f83a6bc116100ce5780632f83a6bc1461019357806336568abe146101ba5780634dbfe416146101cd5780635192c82c146101e0575f5ffd5b806301ffc9a7146100ff578063248a9ca314610127578063253123d7146101575780632f2ff15d1461017e575b5f5ffd5b61011261010d366004610659565b610277565b60405190151581526020015b60405180910390f35b610149610135366004610687565b5f9081526020819052604090206001015490565b60405190815260200161011e565b6101497f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e081565b61019161018c3660046106b9565b6102ad565b005b6101497f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f81565b6101916101c83660046106b9565b6102d7565b6101916101db366004610687565b61030f565b61014960025481565b6101916101f73660046106e3565b61039e565b60035461020f906001600160a01b031681565b6040516001600160a01b03909116815260200161011e565b61014960015481565b61011261023e3660046106b9565b610441565b610191610251366004610687565b610469565b6101495f81565b61019161026b3660046106b9565b6104f3565b61020f5f81565b5f6001600160e01b03198216637965db0b60e01b14806102a757506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f828152602081905260409020600101546102c781610517565b6102d18383610524565b50505050565b6001600160a01b03811633146103005760405163334bd91960e11b815260040160405180910390fd5b61030a82826105b3565b505050565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e061033981610517565b6127106002548361034a91906106fc565b11156103985760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b60448201526064015b60405180910390fd5b50600155565b7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f6103c881610517565b6001600160a01b03821661041e5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642066756e642077616c6c657420616464726573730000000000604482015260640161038f565b50600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e061049381610517565b612710826001546104a491906106fc565b11156104ed5760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b604482015260640161038f565b50600255565b5f8281526020819052604090206001015461050d81610517565b6102d183836105b3565b610521813361061c565b50565b5f61052f8383610441565b6105ac575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556105643390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016102a7565b505f6102a7565b5f6105be8383610441565b156105ac575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016102a7565b6106268282610441565b6106555760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161038f565b5050565b5f60208284031215610669575f5ffd5b81356001600160e01b031981168114610680575f5ffd5b9392505050565b5f60208284031215610697575f5ffd5b5035919050565b80356001600160a01b03811681146106b4575f5ffd5b919050565b5f5f604083850312156106ca575f5ffd5b823591506106da6020840161069e565b90509250929050565b5f602082840312156106f3575f5ffd5b6106808261069e565b808201808211156102a757634e487b7160e01b5f52601160045260245ffdfea26469706673582212207316a0c7eb5db9a7f1205aa3a81311025a6532996bd6a20c27a34b3c7de2467f64736f6c634300081c0033a2646970667358221220a7d7ac2ee7e70dc06c622d65a15d5b4ccd1e631c04cf12e377862cdf1b8c1aa164736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610034575f3560e01c806398f3e1ed14610038578063b852a47a14610067575b5f5ffd5b61004b610046366004610272565b61007a565b6040516001600160a01b03909116815260200160405180910390f35b61004b610075366004610272565b610109565b5f5f6040518060200161008c90610265565b601f1982820381018352601f9091011660408181526001600160a01b038816602083015281018690526060810185905260800160408051601f19818403018152908290526100dd92916020016102ce565b60405160208183030381529060405290506100ff868280519060200120610188565b9695505050505050565b5f5f6040518060200161011b90610265565b601f1982820381018352601f9091011660408181526001600160a01b038816602083015281018690526060810185905260800160408051601f198184030181529082905261016c92916020016102ce565b60405160208183030381529060405290506100ff5f878361019b565b5f610194838330610233565b9392505050565b5f834710156101ca5760405163cf47918160e01b81524760048201526024810185905260440160405180910390fd5b81515f036101eb57604051631328927760e21b815260040160405180910390fd5b8282516020840186f590503d15198115161561020c576040513d5f823e3d81fd5b6001600160a01b0381166101945760405163b06ebf3d60e01b815260040160405180910390fd5b5f604051836040820152846020820152828152600b8101905060ff8153605590206001600160a01b0316949350505050565b610908806102eb83390190565b5f5f5f5f60808587031215610285575f5ffd5b8435935060208501356001600160a01b03811681146102a2575f5ffd5b93969395505050506040820135916060013590565b5f81518060208401855e5f93019283525090919050565b5f6102e26102dc83866102b7565b846102b7565b94935050505056fe608060405234801561000f575f5ffd5b5060405161090838038061090883398101604081905261002e9161016b565b600380546001600160a01b0319166001600160a01b038516179055600182905560028190556100635f61005e3390565b6100c2565b5061008e7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f336100c2565b506100b97f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e0336100c2565b505050506101aa565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16610162575f838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561011a3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610165565b505f5b92915050565b5f5f5f6060848603121561017d575f5ffd5b83516001600160a01b0381168114610193575f5ffd5b602085015160409095015190969495509392505050565b610751806101b75f395ff3fe608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c806355ce3b9a116100935780639370131f116100635780639370131f14610243578063a217fddf14610256578063d547741f1461025d578063fccc281314610270575f5ffd5b806355ce3b9a146101e9578063664a1ad6146101fc5780638ed648501461022757806391d1485414610230575f5ffd5b80632f83a6bc116100ce5780632f83a6bc1461019357806336568abe146101ba5780634dbfe416146101cd5780635192c82c146101e0575f5ffd5b806301ffc9a7146100ff578063248a9ca314610127578063253123d7146101575780632f2ff15d1461017e575b5f5ffd5b61011261010d366004610659565b610277565b60405190151581526020015b60405180910390f35b610149610135366004610687565b5f9081526020819052604090206001015490565b60405190815260200161011e565b6101497f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e081565b61019161018c3660046106b9565b6102ad565b005b6101497f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f81565b6101916101c83660046106b9565b6102d7565b6101916101db366004610687565b61030f565b61014960025481565b6101916101f73660046106e3565b61039e565b60035461020f906001600160a01b031681565b6040516001600160a01b03909116815260200161011e565b61014960015481565b61011261023e3660046106b9565b610441565b610191610251366004610687565b610469565b6101495f81565b61019161026b3660046106b9565b6104f3565b61020f5f81565b5f6001600160e01b03198216637965db0b60e01b14806102a757506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f828152602081905260409020600101546102c781610517565b6102d18383610524565b50505050565b6001600160a01b03811633146103005760405163334bd91960e11b815260040160405180910390fd5b61030a82826105b3565b505050565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e061033981610517565b6127106002548361034a91906106fc565b11156103985760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b60448201526064015b60405180910390fd5b50600155565b7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f6103c881610517565b6001600160a01b03821661041e5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642066756e642077616c6c657420616464726573730000000000604482015260640161038f565b50600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e061049381610517565b612710826001546104a491906106fc565b11156104ed5760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b604482015260640161038f565b50600255565b5f8281526020819052604090206001015461050d81610517565b6102d183836105b3565b610521813361061c565b50565b5f61052f8383610441565b6105ac575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556105643390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016102a7565b505f6102a7565b5f6105be8383610441565b156105ac575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016102a7565b6106268282610441565b6106555760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161038f565b5050565b5f60208284031215610669575f5ffd5b81356001600160e01b031981168114610680575f5ffd5b9392505050565b5f60208284031215610697575f5ffd5b5035919050565b80356001600160a01b03811681146106b4575f5ffd5b919050565b5f5f604083850312156106ca575f5ffd5b823591506106da6020840161069e565b90509250929050565b5f602082840312156106f3575f5ffd5b6106808261069e565b808201808211156102a757634e487b7160e01b5f52601160045260245ffdfea26469706673582212207316a0c7eb5db9a7f1205aa3a81311025a6532996bd6a20c27a34b3c7de2467f64736f6c634300081c0033a2646970667358221220a7d7ac2ee7e70dc06c622d65a15d5b4ccd1e631c04cf12e377862cdf1b8c1aa164736f6c634300081c0033", + "bytecode": "0x6080604052348015600e575f5ffd5b506114df8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80635342fa6d14610038578063accc0de914610067575b5f5ffd5b61004b6100463660046102a8565b61007a565b6040516001600160a01b03909116815260200160405180910390f35b61004b6100753660046102a8565b610114565b5f5f6040518060200161008c90610280565b601f1982820381018352601f9091011660408181526001600160a01b038a8116602084015289811682840152881660608301526080820187905260a08083018790528151808403909101815260c083019091526100ec929160e00161031a565b60405160208183030381529060405290506101085f89836101a8565b98975050505050505050565b5f5f6040518060200161012690610280565b601f1982820381018352601f9091011660408181526001600160a01b038a8116602084015289811682840152881660608301526080820187905260a08083018790528151808403909101815260c08301909152610186929160e00161031a565b6040516020818303038152906040529050610108888280519060200120610247565b5f834710156101d75760405163cf47918160e01b81524760048201526024810185905260440160405180910390fd5b81515f036101f857604051631328927760e21b815260040160405180910390fd5b8282516020840186f590503d151981151615610219576040513d5f823e3d81fd5b6001600160a01b0381166102405760405163b06ebf3d60e01b815260040160405180910390fd5b9392505050565b5f6102408383305f604051836040820152846020820152828152600b8101905060ff8153605590206001600160a01b0316949350505050565b6111738061033783390190565b80356001600160a01b03811681146102a3575f5ffd5b919050565b5f5f5f5f5f5f60c087890312156102bd575f5ffd5b863595506102cd6020880161028d565b94506102db6040880161028d565b93506102e96060880161028d565b9598949750929560808101359460a0909101359350915050565b5f81518060208401855e5f93019283525090919050565b5f61032e6103288386610303565b84610303565b94935050505056fe60a060405234801561000f575f5ffd5b5060405161117338038061117383398101604081905261002e91610242565b60016002556001600160a01b03851661008e5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e697469616c2061646d696e206164647265737300000060448201526064015b60405180910390fd5b6001600160a01b0384166100e45760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420746f6b656e206164647265737300000000000000000000006044820152606401610085565b6001600160a01b03848116608052600580546001600160a01b0319169185169190911790556003829055600481905561011d5f8661017e565b506101487f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f8661017e565b506101737f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e08661017e565b505050505050610294565b5f828152602081815260408083206001600160a01b038516845290915281205460ff1661021e575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101d63390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610221565b505f5b92915050565b80516001600160a01b038116811461023d575f5ffd5b919050565b5f5f5f5f5f60a08688031215610256575f5ffd5b61025f86610227565b945061026d60208701610227565b935061027b60408701610227565b6060870151608090970151959894975095949392505050565b608051610eb96102ba5f395f81816102c7015281816105f601526106a30152610eb95ff3fe608060405234801561000f575f5ffd5b5060043610610132575f3560e01c80635c975abb116100b457806391d148541161007957806391d14854146102955780639370131f146102a8578063a217fddf146102bb578063d32482c3146102c2578063d547741f146102e9578063fccc2813146102fc575f5ffd5b80635c975abb1461023b578063605629d614610246578063664a1ad6146102595780638456cb59146102845780638ed648501461028c575f5ffd5b806336568abe116100fa57806336568abe146101f15780633f4ba83a146102045780634dbfe4161461020c5780635192c82c1461021f57806355ce3b9a14610228575f5ffd5b806301ffc9a714610136578063248a9ca31461015e578063253123d71461018e5780632f2ff15d146101b55780632f83a6bc146101ca575b5f5ffd5b610149610144366004610ce4565b610305565b60405190151581526020015b60405180910390f35b61018061016c366004610d12565b5f9081526020819052604090206001015490565b604051908152602001610155565b6101807f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e081565b6101c86101c3366004610d44565b61033b565b005b6101807f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f81565b6101c86101ff366004610d44565b610365565b6101c861039d565b6101c861021a366004610d12565b6103b2565b61018060045481565b6101c8610236366004610d6e565b6104aa565b60015460ff16610149565b6101c8610254366004610d87565b610555565b60055461026c906001600160a01b031681565b6040516001600160a01b039091168152602001610155565b6101c8610983565b61018060035481565b6101496102a3366004610d44565b610995565b6101c86102b6366004610d12565b6109bd565b6101805f81565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6101c86102f7366004610d44565b610a83565b61026c61dead81565b5f6001600160e01b03198216637965db0b60e01b148061033557506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f8281526020819052604090206001015461035581610aa7565b61035f8383610ab1565b50505050565b6001600160a01b038116331461038e5760405163334bd91960e11b815260040160405180910390fd5b6103988282610b40565b505050565b5f6103a781610aa7565b6103af610ba9565b50565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e06103dc81610aa7565b6103e4610bfb565b612710600454836103f59190610e08565b11156104435760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b60448201526064015b60405180910390fd5b600382905560045433907fb55f79fe5ce919308890d69197336bfe5e7ec459de785951879b018086e8ce999084908061047e83612710610e1b565b6104889190610e1b565b6040805193845260208401929092529082015260600160405180910390a25050565b7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f6104d481610aa7565b6104dc610bfb565b6001600160a01b0382166105325760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642066756e642077616c6c657420616464726573730000000000604482015260640161043a565b50600580546001600160a01b0319166001600160a01b0392909216919091179055565b61055d610bfb565b610565610c21565b845f036105855760405163162908e360e11b815260040160405180910390fd5b6001600160a01b0386166105ac57604051634e46966960e11b815260040160405180910390fd5b60405163d505accf60e01b81526001600160a01b038881166004830152306024830152604482018790526064820186905260ff8516608483015260a4820184905260c482018390527f0000000000000000000000000000000000000000000000000000000000000000169063d505accf9060e4015f604051808303815f87803b158015610637575f5ffd5b505af1158015610649573d5f5f3e3d5ffd5b505050505f6127106003548761065f9190610e2e565b6106699190610e45565b90505f6127106004548861067d9190610e2e565b6106879190610e45565b90505f81610695848a610e1b565b61069f9190610e1b565b90507f00000000000000000000000000000000000000000000000000000000000000008315610787576005546040516323b872dd60e01b81526001600160a01b038d81166004830152918216602482015260448101869052908216906323b872dd906064016020604051808303815f875af1158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107449190610e64565b6107875760405162461bcd60e51b8152602060048201526014602482015273119d5b99081d1c985b9cd9995c8819985a5b195960621b604482015260640161043a565b8215610848576040516323b872dd60e01b81526001600160a01b038c8116600483015261dead6024830152604482018590528216906323b872dd906064016020604051808303815f875af11580156107e1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108059190610e64565b6108485760405162461bcd60e51b8152602060048201526014602482015273109d5c9b881d1c985b9cd9995c8819985a5b195960621b604482015260640161043a565b8115610912576040516323b872dd60e01b81526001600160a01b038c811660048301528b81166024830152604482018490528216906323b872dd906064016020604051808303815f875af11580156108a2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c69190610e64565b6109125760405162461bcd60e51b815260206004820152601960248201527f526563697069656e74207472616e73666572206661696c656400000000000000604482015260640161043a565b604080518a815260208101869052908101849052606081018390526001600160a01b03808c1691908d169033907f52f83311e33f533cde58953dc7f433120e12462be7e4b5f2a32c97291fa09a029060800160405180910390a45050505061097a6001600255565b50505050505050565b5f61098d81610aa7565b6103af610c49565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e06109e781610aa7565b6109ef610bfb565b61271082600354610a009190610e08565b1115610a495760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b604482015260640161043a565b600482905560035433907fb55f79fe5ce919308890d69197336bfe5e7ec459de785951879b018086e8ce9990848061047e83612710610e1b565b5f82815260208190526040902060010154610a9d81610aa7565b61035f8383610b40565b6103af8133610c84565b5f610abc8383610995565b610b39575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610af13390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610335565b505f610335565b5f610b4b8383610995565b15610b39575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610335565b610bb1610cc1565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60015460ff1615610c1f5760405163d93c066560e01b815260040160405180910390fd5b565b6002805403610c4357604051633ee5aeb560e01b815260040160405180910390fd5b60028055565b610c51610bfb565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610bde565b610c8e8282610995565b610cbd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161043a565b5050565b60015460ff16610c1f57604051638dfc202b60e01b815260040160405180910390fd5b5f60208284031215610cf4575f5ffd5b81356001600160e01b031981168114610d0b575f5ffd5b9392505050565b5f60208284031215610d22575f5ffd5b5035919050565b80356001600160a01b0381168114610d3f575f5ffd5b919050565b5f5f60408385031215610d55575f5ffd5b82359150610d6560208401610d29565b90509250929050565b5f60208284031215610d7e575f5ffd5b610d0b82610d29565b5f5f5f5f5f5f5f60e0888a031215610d9d575f5ffd5b610da688610d29565b9650610db460208901610d29565b95506040880135945060608801359350608088013560ff81168114610dd7575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561033557610335610df4565b8181038181111561033557610335610df4565b808202811582820484141761033557610335610df4565b5f82610e5f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215610e74575f5ffd5b81518015158114610d0b575f5ffdfea2646970667358221220c1a3aa255a24522bf769c5a901f4208f5b481bf1e34da744c9127d4931fbfa0064736f6c634300081c0033a26469706673582212208cc41a9f27e6ba70a82853079221217d781cf51ddc55d6f3b240df1ef94b5b7564736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80635342fa6d14610038578063accc0de914610067575b5f5ffd5b61004b6100463660046102a8565b61007a565b6040516001600160a01b03909116815260200160405180910390f35b61004b6100753660046102a8565b610114565b5f5f6040518060200161008c90610280565b601f1982820381018352601f9091011660408181526001600160a01b038a8116602084015289811682840152881660608301526080820187905260a08083018790528151808403909101815260c083019091526100ec929160e00161031a565b60405160208183030381529060405290506101085f89836101a8565b98975050505050505050565b5f5f6040518060200161012690610280565b601f1982820381018352601f9091011660408181526001600160a01b038a8116602084015289811682840152881660608301526080820187905260a08083018790528151808403909101815260c08301909152610186929160e00161031a565b6040516020818303038152906040529050610108888280519060200120610247565b5f834710156101d75760405163cf47918160e01b81524760048201526024810185905260440160405180910390fd5b81515f036101f857604051631328927760e21b815260040160405180910390fd5b8282516020840186f590503d151981151615610219576040513d5f823e3d81fd5b6001600160a01b0381166102405760405163b06ebf3d60e01b815260040160405180910390fd5b9392505050565b5f6102408383305f604051836040820152846020820152828152600b8101905060ff8153605590206001600160a01b0316949350505050565b6111738061033783390190565b80356001600160a01b03811681146102a3575f5ffd5b919050565b5f5f5f5f5f5f60c087890312156102bd575f5ffd5b863595506102cd6020880161028d565b94506102db6040880161028d565b93506102e96060880161028d565b9598949750929560808101359460a0909101359350915050565b5f81518060208401855e5f93019283525090919050565b5f61032e6103288386610303565b84610303565b94935050505056fe60a060405234801561000f575f5ffd5b5060405161117338038061117383398101604081905261002e91610242565b60016002556001600160a01b03851661008e5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e697469616c2061646d696e206164647265737300000060448201526064015b60405180910390fd5b6001600160a01b0384166100e45760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420746f6b656e206164647265737300000000000000000000006044820152606401610085565b6001600160a01b03848116608052600580546001600160a01b0319169185169190911790556003829055600481905561011d5f8661017e565b506101487f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f8661017e565b506101737f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e08661017e565b505050505050610294565b5f828152602081815260408083206001600160a01b038516845290915281205460ff1661021e575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101d63390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610221565b505f5b92915050565b80516001600160a01b038116811461023d575f5ffd5b919050565b5f5f5f5f5f60a08688031215610256575f5ffd5b61025f86610227565b945061026d60208701610227565b935061027b60408701610227565b6060870151608090970151959894975095949392505050565b608051610eb96102ba5f395f81816102c7015281816105f601526106a30152610eb95ff3fe608060405234801561000f575f5ffd5b5060043610610132575f3560e01c80635c975abb116100b457806391d148541161007957806391d14854146102955780639370131f146102a8578063a217fddf146102bb578063d32482c3146102c2578063d547741f146102e9578063fccc2813146102fc575f5ffd5b80635c975abb1461023b578063605629d614610246578063664a1ad6146102595780638456cb59146102845780638ed648501461028c575f5ffd5b806336568abe116100fa57806336568abe146101f15780633f4ba83a146102045780634dbfe4161461020c5780635192c82c1461021f57806355ce3b9a14610228575f5ffd5b806301ffc9a714610136578063248a9ca31461015e578063253123d71461018e5780632f2ff15d146101b55780632f83a6bc146101ca575b5f5ffd5b610149610144366004610ce4565b610305565b60405190151581526020015b60405180910390f35b61018061016c366004610d12565b5f9081526020819052604090206001015490565b604051908152602001610155565b6101807f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e081565b6101c86101c3366004610d44565b61033b565b005b6101807f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f81565b6101c86101ff366004610d44565b610365565b6101c861039d565b6101c861021a366004610d12565b6103b2565b61018060045481565b6101c8610236366004610d6e565b6104aa565b60015460ff16610149565b6101c8610254366004610d87565b610555565b60055461026c906001600160a01b031681565b6040516001600160a01b039091168152602001610155565b6101c8610983565b61018060035481565b6101496102a3366004610d44565b610995565b6101c86102b6366004610d12565b6109bd565b6101805f81565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6101c86102f7366004610d44565b610a83565b61026c61dead81565b5f6001600160e01b03198216637965db0b60e01b148061033557506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f8281526020819052604090206001015461035581610aa7565b61035f8383610ab1565b50505050565b6001600160a01b038116331461038e5760405163334bd91960e11b815260040160405180910390fd5b6103988282610b40565b505050565b5f6103a781610aa7565b6103af610ba9565b50565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e06103dc81610aa7565b6103e4610bfb565b612710600454836103f59190610e08565b11156104435760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b60448201526064015b60405180910390fd5b600382905560045433907fb55f79fe5ce919308890d69197336bfe5e7ec459de785951879b018086e8ce999084908061047e83612710610e1b565b6104889190610e1b565b6040805193845260208401929092529082015260600160405180910390a25050565b7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f6104d481610aa7565b6104dc610bfb565b6001600160a01b0382166105325760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642066756e642077616c6c657420616464726573730000000000604482015260640161043a565b50600580546001600160a01b0319166001600160a01b0392909216919091179055565b61055d610bfb565b610565610c21565b845f036105855760405163162908e360e11b815260040160405180910390fd5b6001600160a01b0386166105ac57604051634e46966960e11b815260040160405180910390fd5b60405163d505accf60e01b81526001600160a01b038881166004830152306024830152604482018790526064820186905260ff8516608483015260a4820184905260c482018390527f0000000000000000000000000000000000000000000000000000000000000000169063d505accf9060e4015f604051808303815f87803b158015610637575f5ffd5b505af1158015610649573d5f5f3e3d5ffd5b505050505f6127106003548761065f9190610e2e565b6106699190610e45565b90505f6127106004548861067d9190610e2e565b6106879190610e45565b90505f81610695848a610e1b565b61069f9190610e1b565b90507f00000000000000000000000000000000000000000000000000000000000000008315610787576005546040516323b872dd60e01b81526001600160a01b038d81166004830152918216602482015260448101869052908216906323b872dd906064016020604051808303815f875af1158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107449190610e64565b6107875760405162461bcd60e51b8152602060048201526014602482015273119d5b99081d1c985b9cd9995c8819985a5b195960621b604482015260640161043a565b8215610848576040516323b872dd60e01b81526001600160a01b038c8116600483015261dead6024830152604482018590528216906323b872dd906064016020604051808303815f875af11580156107e1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108059190610e64565b6108485760405162461bcd60e51b8152602060048201526014602482015273109d5c9b881d1c985b9cd9995c8819985a5b195960621b604482015260640161043a565b8115610912576040516323b872dd60e01b81526001600160a01b038c811660048301528b81166024830152604482018490528216906323b872dd906064016020604051808303815f875af11580156108a2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c69190610e64565b6109125760405162461bcd60e51b815260206004820152601960248201527f526563697069656e74207472616e73666572206661696c656400000000000000604482015260640161043a565b604080518a815260208101869052908101849052606081018390526001600160a01b03808c1691908d169033907f52f83311e33f533cde58953dc7f433120e12462be7e4b5f2a32c97291fa09a029060800160405180910390a45050505061097a6001600255565b50505050505050565b5f61098d81610aa7565b6103af610c49565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e06109e781610aa7565b6109ef610bfb565b61271082600354610a009190610e08565b1115610a495760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b604482015260640161043a565b600482905560035433907fb55f79fe5ce919308890d69197336bfe5e7ec459de785951879b018086e8ce9990848061047e83612710610e1b565b5f82815260208190526040902060010154610a9d81610aa7565b61035f8383610b40565b6103af8133610c84565b5f610abc8383610995565b610b39575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610af13390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610335565b505f610335565b5f610b4b8383610995565b15610b39575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610335565b610bb1610cc1565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60015460ff1615610c1f5760405163d93c066560e01b815260040160405180910390fd5b565b6002805403610c4357604051633ee5aeb560e01b815260040160405180910390fd5b60028055565b610c51610bfb565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610bde565b610c8e8282610995565b610cbd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161043a565b5050565b60015460ff16610c1f57604051638dfc202b60e01b815260040160405180910390fd5b5f60208284031215610cf4575f5ffd5b81356001600160e01b031981168114610d0b575f5ffd5b9392505050565b5f60208284031215610d22575f5ffd5b5035919050565b80356001600160a01b0381168114610d3f575f5ffd5b919050565b5f5f60408385031215610d55575f5ffd5b82359150610d6560208401610d29565b90509250929050565b5f60208284031215610d7e575f5ffd5b610d0b82610d29565b5f5f5f5f5f5f5f60e0888a031215610d9d575f5ffd5b610da688610d29565b9650610db460208901610d29565b95506040880135945060608801359350608088013560ff81168114610dd7575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561033557610335610df4565b8181038181111561033557610335610df4565b808202811582820484141761033557610335610df4565b5f82610e5f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215610e74575f5ffd5b81518015158114610d0b575f5ffdfea2646970667358221220c1a3aa255a24522bf769c5a901f4208f5b481bf1e34da744c9127d4931fbfa0064736f6c634300081c0033a26469706673582212208cc41a9f27e6ba70a82853079221217d781cf51ddc55d6f3b240df1ef94b5b7564736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/RouterFactory.sol", - "buildInfoId": "solc-0_8_28-d9ff8f47c1281e39c5910faa5e18f642426c9cb9" + "buildInfoId": "solc-0_8_28-5c8fdc318c3f0104ec4be3938796fca8ed4a8b34" } \ No newline at end of file diff --git a/packages/contract/ignition/deployments/chain-31337/build-info/solc-0_8_28-40227ca68470cf204db0488311108091c535c8e2.json b/packages/contract/ignition/deployments/chain-11155111/build-info/solc-0_8_28-5aa01ff243ad5b208267044bfe0ef66e032fad37.json similarity index 89% rename from packages/contract/ignition/deployments/chain-31337/build-info/solc-0_8_28-40227ca68470cf204db0488311108091c535c8e2.json rename to packages/contract/ignition/deployments/chain-11155111/build-info/solc-0_8_28-5aa01ff243ad5b208267044bfe0ef66e032fad37.json index 34919f9..b1b7d3b 100644 --- a/packages/contract/ignition/deployments/chain-31337/build-info/solc-0_8_28-40227ca68470cf204db0488311108091c535c8e2.json +++ b/packages/contract/ignition/deployments/chain-11155111/build-info/solc-0_8_28-5aa01ff243ad5b208267044bfe0ef66e032fad37.json @@ -1,6 +1,6 @@ { "_format": "hh3-sol-build-info-1", - "id": "solc-0_8_28-40227ca68470cf204db0488311108091c535c8e2", + "id": "solc-0_8_28-5aa01ff243ad5b208267044bfe0ef66e032fad37", "solcVersion": "0.8.28", "solcLongVersion": "0.8.28+commit.7893614a", "userSourceNameMap": { @@ -29,11 +29,19 @@ } }, "remappings": [ + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/" ] }, "sources": { + "npm/@openzeppelin/contracts@5.4.0/access/AccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {IERC165, ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address account => bool) hasRole;\n bytes32 adminRole;\n }\n\n mapping(bytes32 role => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with an {AccessControlUnauthorizedAccount} error including the required role.\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n return _roles[role].hasRole[account];\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n * is missing `role`.\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert AccessControlUnauthorizedAccount(account, role);\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n if (callerConfirmation != _msgSender()) {\n revert AccessControlBadConfirmation();\n }\n\n _revokeRole(role, callerConfirmation);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n if (!hasRole(role, account)) {\n _roles[role].hasRole[account] = true;\n emit RoleGranted(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n if (hasRole(role, account)) {\n _roles[role].hasRole[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/access/IAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev External interface of AccessControl declared to support ERC-165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev The `account` is missing a role.\n */\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n /**\n * @dev The caller of a function is not the expected one.\n *\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n */\n error AccessControlBadConfirmation();\n\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted to signal this.\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).\n * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n */\n function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n" + }, "npm/@openzeppelin/contracts@5.4.0/interfaces/draft-IERC6093.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)\npragma solidity >=0.8.4;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n" }, @@ -67,6 +75,12 @@ "npm/@openzeppelin/contracts@5.4.0/utils/cryptography/MessageHashUtils.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n */\n function toDataWithIntendedValidatorHash(\n address validator,\n bytes32 messageHash\n ) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, hex\"19_00\")\n mstore(0x02, shl(96, validator))\n mstore(0x16, messageHash)\n digest := keccak256(0x00, 0x36)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n" }, + "npm/@openzeppelin/contracts@5.4.0/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\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[ERC 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" + }, "npm/@openzeppelin/contracts@5.4.0/utils/math/Math.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Return the 512-bit addition of two uint256.\n *\n * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n */\n function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n assembly (\"memory-safe\") {\n low := add(a, b)\n high := lt(low, a)\n }\n }\n\n /**\n * @dev Return the 512-bit multiplication of two uint256.\n *\n * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n */\n function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = high * 2²⁵⁶ + low.\n assembly (\"memory-safe\") {\n let mm := mulmod(a, b, not(0))\n low := mul(a, b)\n high := sub(sub(mm, low), lt(mm, low))\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a + b;\n success = c >= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a - b;\n success = c <= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a * b;\n assembly (\"memory-safe\") {\n // Only true when the multiplication doesn't overflow\n // (c / a == b) || (a == 0)\n success := or(eq(div(c, a), b), iszero(a))\n }\n // equivalent to: success ? c : 0\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `DIV` opcode returns zero when the denominator is 0.\n result := div(a, b)\n }\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `MOD` opcode returns zero when the denominator is 0.\n result := mod(a, b)\n }\n }\n }\n\n /**\n * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryAdd(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n */\n function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n (, uint256 result) = trySub(a, b);\n return result;\n }\n\n /**\n * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryMul(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * SafeCast.toUint(condition));\n }\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 ternary(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 ternary(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 towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n\n // The following calculation ensures accurate ceiling division without overflow.\n // Since a is non-zero, (a - 1) / b will not overflow.\n // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n // but the largest value we can obtain is type(uint256).max - 1, which happens\n // when a = type(uint256).max and b = 1.\n unchecked {\n return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n }\n }\n\n /**\n * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n *\n * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n\n // Handle non-overflow cases, 256 by 256 division.\n if (high == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return low / denominator;\n }\n\n // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n if (denominator <= high) {\n Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [high low].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n high := sub(high, gt(remainder, low))\n low := sub(low, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly (\"memory-safe\") {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [high low] by twos.\n low := div(low, twos)\n\n // Flip twos such that it is 2²⁵⁶ / 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 high into low.\n low |= high * twos;\n\n // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\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\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n inverse *= 2 - denominator * inverse; // inverse mod 2³²\n inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\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²⁵⁶. Since the preconditions guarantee that the outcome is\n // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n // is no longer required.\n result = low * inverse;\n return result;\n }\n }\n\n /**\n * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n }\n\n /**\n * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n */\n function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n if (high >= 1 << n) {\n Panic.panic(Panic.UNDER_OVERFLOW);\n }\n return (high << (256 - n)) | (low >> n);\n }\n }\n\n /**\n * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n */\n function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n }\n\n /**\n * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n *\n * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n *\n * If the input value is not inversible, 0 is returned.\n *\n * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n */\n function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n unchecked {\n if (n == 0) return 0;\n\n // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n // ax + ny = 1\n // ax = 1 + (-y)n\n // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n // If the remainder is 0 the gcd is n right away.\n uint256 remainder = a % n;\n uint256 gcd = n;\n\n // Therefore the initial coefficients are:\n // ax + ny = gcd(a, n) = n\n // 0a + 1n = n\n int256 x = 0;\n int256 y = 1;\n\n while (remainder != 0) {\n uint256 quotient = gcd / remainder;\n\n (gcd, remainder) = (\n // The old remainder is the next gcd to try.\n remainder,\n // Compute the next remainder.\n // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n // where gcd is at most n (capped to type(uint256).max)\n gcd - remainder * quotient\n );\n\n (x, y) = (\n // Increment the coefficient of a.\n y,\n // Decrement the coefficient of n.\n // Can overflow, but the result is casted to uint256 so that the\n // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n x - y * int256(quotient)\n );\n }\n\n if (gcd != 1) return 0; // No inverse exists.\n return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n }\n }\n\n /**\n * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n *\n * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n *\n * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n */\n function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n unchecked {\n return Math.modExp(a, p - 2, p);\n }\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n *\n * Requirements:\n * - modulus can't be zero\n * - underlying staticcall to precompile must succeed\n *\n * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n * interpreted as 0.\n */\n function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n (bool success, uint256 result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n * to operate modulo 0 or if the underlying precompile reverted.\n *\n * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n * of a revert, but the result may be incorrectly interpreted as 0.\n */\n function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n if (m == 0) return (false, 0);\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n // | Offset | Content | Content (Hex) |\n // |-----------|------------|--------------------------------------------------------------------|\n // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n mstore(ptr, 0x20)\n mstore(add(ptr, 0x20), 0x20)\n mstore(add(ptr, 0x40), 0x20)\n mstore(add(ptr, 0x60), b)\n mstore(add(ptr, 0x80), e)\n mstore(add(ptr, 0xa0), m)\n\n // Given the result < m, it's guaranteed to fit in 32 bytes,\n // so we can use the memory scratch space located at offset 0.\n success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n result := mload(0x00)\n }\n }\n\n /**\n * @dev Variant of {modExp} that supports inputs of arbitrary length.\n */\n function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n (bool success, bytes memory result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n */\n function tryModExp(\n bytes memory b,\n bytes memory e,\n bytes memory m\n ) internal view returns (bool success, bytes memory result) {\n if (_zeroBytes(m)) return (false, new bytes(0));\n\n uint256 mLen = m.length;\n\n // Encode call args in result and move the free memory pointer\n result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n assembly (\"memory-safe\") {\n let dataPtr := add(result, 0x20)\n // Write result on top of args to avoid allocating extra memory.\n success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n // Overwrite the length.\n // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n mstore(result, mLen)\n // Set the memory pointer after the returned data.\n mstore(0x40, add(dataPtr, mLen))\n }\n }\n\n /**\n * @dev Returns whether the provided byte array is zero.\n */\n function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n for (uint256 i = 0; i < byteArray.length; ++i) {\n if (byteArray[i] != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n * using integer operations.\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n unchecked {\n // Take care of easy edge cases when a == 0 or a == 1\n if (a <= 1) {\n return a;\n }\n\n // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n // the current value as `ε_n = | x_n - sqrt(a) |`.\n //\n // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n // bigger than any uint256.\n //\n // By noticing that\n // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n // to the msb function.\n uint256 aa = a;\n uint256 xn = 1;\n\n if (aa >= (1 << 128)) {\n aa >>= 128;\n xn <<= 64;\n }\n if (aa >= (1 << 64)) {\n aa >>= 64;\n xn <<= 32;\n }\n if (aa >= (1 << 32)) {\n aa >>= 32;\n xn <<= 16;\n }\n if (aa >= (1 << 16)) {\n aa >>= 16;\n xn <<= 8;\n }\n if (aa >= (1 << 8)) {\n aa >>= 8;\n xn <<= 4;\n }\n if (aa >= (1 << 4)) {\n aa >>= 4;\n xn <<= 2;\n }\n if (aa >= (1 << 2)) {\n xn <<= 1;\n }\n\n // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n //\n // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n // This is going to be our x_0 (and ε_0)\n xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n // From here, Newton's method give us:\n // x_{n+1} = (x_n + a / x_n) / 2\n //\n // One should note that:\n // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n // = ((x_n² + a) / (2 * x_n))² - a\n // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n // = (x_n² - a)² / (2 * x_n)²\n // = ((x_n² - a) / (2 * x_n))²\n // ≥ 0\n // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n //\n // This gives us the proof of quadratic convergence of the sequence:\n // ε_{n+1} = | x_{n+1} - sqrt(a) |\n // = | (x_n + a / x_n) / 2 - sqrt(a) |\n // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n // = | (x_n - sqrt(a))² / (2 * x_n) |\n // = | ε_n² / (2 * x_n) |\n // = ε_n² / | (2 * x_n) |\n //\n // For the first iteration, we have a special case where x_0 is known:\n // ε_1 = ε_0² / | (2 * x_0) |\n // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n // ≤ 2**(2*e-4) / (3 * 2**(e-1))\n // ≤ 2**(e-3) / 3\n // ≤ 2**(e-3-log2(3))\n // ≤ 2**(e-4.5)\n //\n // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n // ε_{n+1} = ε_n² / | (2 * x_n) |\n // ≤ (2**(e-k))² / (2 * 2**(e-1))\n // ≤ 2**(2*e-2*k) / 2**e\n // ≤ 2**(e-2*k)\n xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above\n xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5\n xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9\n xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18\n xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36\n xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72\n\n // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n // sqrt(a) or sqrt(a) + 1.\n return xn - SafeCast.toUint(xn > a / xn);\n }\n }\n\n /**\n * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // If upper 8 bits of 16-bit half set, add 8 to result\n r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n // If upper 4 bits of 8-bit half set, add 4 to result\n r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n // Shifts value right by the current result and use it as an index into this lookup table:\n //\n // | x (4 bits) | index | table[index] = MSB position |\n // |------------|---------|-----------------------------|\n // | 0000 | 0 | table[0] = 0 |\n // | 0001 | 1 | table[1] = 0 |\n // | 0010 | 2 | table[2] = 1 |\n // | 0011 | 3 | table[3] = 1 |\n // | 0100 | 4 | table[4] = 2 |\n // | 0101 | 5 | table[5] = 2 |\n // | 0110 | 6 | table[6] = 2 |\n // | 0111 | 7 | table[7] = 2 |\n // | 1000 | 8 | table[8] = 3 |\n // | 1001 | 9 | table[9] = 3 |\n // | 1010 | 10 | table[10] = 3 |\n // | 1011 | 11 | table[11] = 3 |\n // | 1100 | 12 | table[12] = 3 |\n // | 1101 | 13 | table[13] = 3 |\n // | 1110 | 14 | table[14] = 3 |\n // | 1111 | 15 | table[15] = 3 |\n //\n // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n assembly (\"memory-safe\") {\n r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n }\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\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 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n }\n\n /**\n * @dev Return the log in base 256, 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n" }, @@ -92,7 +106,7 @@ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n using SafeCast for *;\n\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n uint256 private constant SPECIAL_CHARS_LOOKUP =\n (1 << 0x08) | // backspace\n (1 << 0x09) | // tab\n (1 << 0x0a) | // newline\n (1 << 0x0c) | // form feed\n (1 << 0x0d) | // carriage return\n (1 << 0x22) | // double quote\n (1 << 0x5c); // backslash\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev The string being parsed contains characters that are not in scope of the given base.\n */\n error StringsInvalidChar();\n\n /**\n * @dev The string being parsed is not a properly formatted address.\n */\n error StringsInvalidAddressFormat();\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 assembly (\"memory-safe\") {\n ptr := add(add(buffer, 0x20), length)\n }\n while (true) {\n ptr--;\n assembly (\"memory-safe\") {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\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 uint256 localValue = value;\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] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\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\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n * representation, according to EIP-55.\n */\n function toChecksumHexString(address addr) internal pure returns (string memory) {\n bytes memory buffer = bytes(toHexString(addr));\n\n // hash the hex part of buffer (skip length + 2 bytes, length 40)\n uint256 hashValue;\n assembly (\"memory-safe\") {\n hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n }\n\n for (uint256 i = 41; i > 1; --i) {\n // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n // case shift by xoring with 0x20\n buffer[i] ^= 0x20;\n }\n hashValue >>= 4;\n }\n return string(buffer);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input) internal pure returns (uint256) {\n return parseUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n uint256 result = 0;\n for (uint256 i = begin; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 9) return (false, 0);\n result *= 10;\n result += chr;\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `int256`.\n *\n * Requirements:\n * - The string must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input) internal pure returns (int256) {\n return parseInt(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n (bool success, int256 value) = tryParseInt(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n * the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n }\n\n uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n /**\n * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character or if the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, int256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseIntUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseIntUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, int256 value) {\n bytes memory buffer = bytes(input);\n\n // Check presence of a negative sign.\n bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n bool positiveSign = sign == bytes1(\"+\");\n bool negativeSign = sign == bytes1(\"-\");\n uint256 offset = (positiveSign || negativeSign).toUint();\n\n (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n if (absSuccess && absValue < ABS_MIN_INT256) {\n return (true, negativeSign ? -int256(absValue) : int256(absValue));\n } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n return (true, type(int256).min);\n } else return (false, 0);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input) internal pure returns (uint256) {\n return parseHexUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n * invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseHexUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseHexUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n // skip 0x prefix if present\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 offset = hasPrefix.toUint() * 2;\n\n uint256 result = 0;\n for (uint256 i = begin + offset; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 15) return (false, 0);\n result *= 16;\n unchecked {\n // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n result += chr;\n }\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input) internal pure returns (address) {\n return parseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n (bool success, address value) = tryParseAddress(input, begin, end);\n if (!success) revert StringsInvalidAddressFormat();\n return value;\n }\n\n /**\n * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n * formatted address. See {parseAddress-string} requirements.\n */\n function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n return tryParseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n */\n function tryParseAddress(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, address value) {\n if (end > bytes(input).length || begin > end) return (false, address(0));\n\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n // check that input is the correct length\n if (end - begin == expectedLength) {\n // length guarantees that this does not overflow, and value is at most type(uint160).max\n (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n return (s, address(uint160(v)));\n } else {\n return (false, address(0));\n }\n }\n\n function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n uint8 value = uint8(chr);\n\n // Try to parse `chr`:\n // - Case 1: [0-9]\n // - Case 2: [a-f]\n // - Case 3: [A-F]\n // - otherwise not supported\n unchecked {\n if (value > 47 && value < 58) value -= 48;\n else if (value > 96 && value < 103) value -= 87;\n else if (value > 64 && value < 71) value -= 55;\n else return type(uint8).max;\n }\n\n return value;\n }\n\n /**\n * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n *\n * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n *\n * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n * characters that are not in this range, but other tooling may provide different results.\n */\n function escapeJSON(string memory input) internal pure returns (string memory) {\n bytes memory buffer = bytes(input);\n bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n uint256 outputLength = 0;\n\n for (uint256 i; i < buffer.length; ++i) {\n bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n output[outputLength++] = \"\\\\\";\n if (char == 0x08) output[outputLength++] = \"b\";\n else if (char == 0x09) output[outputLength++] = \"t\";\n else if (char == 0x0a) output[outputLength++] = \"n\";\n else if (char == 0x0c) output[outputLength++] = \"f\";\n else if (char == 0x0d) output[outputLength++] = \"r\";\n else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n else if (char == 0x22) {\n // solhint-disable-next-line quotes\n output[outputLength++] = '\"';\n }\n } else {\n output[outputLength++] = char;\n }\n }\n // write the actual length and deallocate unused memory\n assembly (\"memory-safe\") {\n mstore(output, outputLength)\n mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n }\n\n return string(output);\n }\n\n /**\n * @dev Reads a bytes32 from a bytes array without bounds checking.\n *\n * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n * assembly block as such would prevent some optimizations.\n */\n function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n // This is not memory safe in the general case, but all calls to this private function are within bounds.\n assembly (\"memory-safe\") {\n value := mload(add(add(buffer, 0x20), offset))\n }\n }\n}\n" }, "project/contracts/FoRToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol\";\n\ncontract FoRToken is ERC20, ERC20Permit {\n constructor(\n uint256 initialSupply,\n string memory name,\n string memory symbol\n ) ERC20(name, symbol) ERC20Permit(name) {\n _mint(msg.sender, initialSupply);\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol\";\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\n\ncontract FoRToken is ERC20, ERC20Permit, AccessControl {\n using ECDSA for bytes32;\n\n // ============ Constants ============\n /// @notice Admin role for managing allow list\n bytes32 public constant ADMIN_ROLE = keccak256(\"ADMIN_ROLE\");\n /// @notice EIP712 typehash for AddToAllowList\n bytes32 public constant ADD_TO_ALLOWLIST_TYPEHASH =\n keccak256(\"AddToAllowList(address account,uint256 deadline)\");\n\n // ============ State Variables ============\n mapping(address => bool) private _allowList;\n\n // ============ Events ============\n event AllowListAdded(address indexed account);\n event AllowListRemoved(address indexed account);\n\n // ============ Errors ============\n error NotAllowListed(address account);\n error InvalidSignature();\n error SignatureExpired();\n error AlreadyAllowListed();\n\n // ============ Constructor ============\n constructor(\n uint256 initialSupply,\n string memory name,\n string memory symbol\n ) ERC20(name, symbol) ERC20Permit(name) {\n _mint(_msgSender(), initialSupply);\n \n // Grant roles to deployer\n _grantRole(DEFAULT_ADMIN_ROLE, _msgSender());\n _grantRole(ADMIN_ROLE, _msgSender());\n \n // Add deployer to allow list\n _allowList[_msgSender()] = true;\n emit AllowListAdded(_msgSender());\n }\n\n // ============ AllowList Management ============\n\n /// @notice Add an address to the allow list (ADMIN_ROLE only)\n /// @param account Address to add\n function addToAllowList(address account) external onlyRole(ADMIN_ROLE) {\n if (_allowList[account]) revert AlreadyAllowListed();\n _allowList[account] = true;\n emit AllowListAdded(account);\n }\n\n /// @notice Remove an address from the allow list (ADMIN_ROLE only)\n /// @param account Address to remove\n function removeFromAllowList(address account) external onlyRole(ADMIN_ROLE) {\n if (!_allowList[account]) revert NotAllowListed(account);\n _allowList[account] = false;\n emit AllowListRemoved(account);\n }\n\n /// @notice Add an address to the allow list using EIP712 signature from an admin\n /// @param account Address to add\n /// @param deadline Signature expiration timestamp\n /// @param signature Admin's EIP712 signature\n function addToAllowListWithSignature(\n address account,\n uint256 deadline,\n bytes calldata signature\n ) external {\n if (block.timestamp > deadline) revert SignatureExpired();\n if (_allowList[account]) revert AlreadyAllowListed();\n\n bytes32 structHash = keccak256(\n abi.encode(ADD_TO_ALLOWLIST_TYPEHASH, account, deadline)\n );\n bytes32 hash = _hashTypedDataV4(structHash);\n address signer = hash.recover(signature);\n\n if (!hasRole(ADMIN_ROLE, signer)) revert InvalidSignature();\n\n _allowList[account] = true;\n emit AllowListAdded(account);\n }\n\n /// @notice Check if an address is on the allow list\n /// @param account Address to check\n /// @return bool True if the address is on the allow list\n function isAllowListed(address account) public view returns (bool) {\n return _allowList[account];\n }\n\n // ============ Transfer Restrictions ============\n\n /// @notice Override transfer to enforce allow list\n function transfer(\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n _requireBothAllowListed(_msgSender(), to);\n return super.transfer(to, amount);\n }\n\n /// @notice Override transferFrom to enforce allow list\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n _requireBothAllowListed(from, to);\n return super.transferFrom(from, to, amount);\n }\n\n // ============ Internal Functions ============\n\n /// @notice Require both addresses to be on the allow list\n /// @param from Sender address\n /// @param to Recipient address\n function _requireBothAllowListed(address from, address to) internal view {\n if (!_allowList[from]) revert NotAllowListed(from);\n if (!_allowList[to]) revert NotAllowListed(to);\n }\n\n // ============ ERC165 Interface Support ============\n\n /// @notice Override supportsInterface to support AccessControl\n /// @param interfaceId Interface identifier to check\n /// @return bool True if the interface is supported\n function supportsInterface(\n bytes4 interfaceId\n ) public view override(AccessControl) returns (bool) {\n return super.supportsInterface(interfaceId);\n }\n}\n" } } } diff --git a/packages/contract/ignition/deployments/chain-11155111/build-info/solc-0_8_28-5c8fdc318c3f0104ec4be3938796fca8ed4a8b34.json b/packages/contract/ignition/deployments/chain-11155111/build-info/solc-0_8_28-5c8fdc318c3f0104ec4be3938796fca8ed4a8b34.json new file mode 100644 index 0000000..e097d8c --- /dev/null +++ b/packages/contract/ignition/deployments/chain-11155111/build-info/solc-0_8_28-5c8fdc318c3f0104ec4be3938796fca8ed4a8b34.json @@ -0,0 +1,82 @@ +{ + "_format": "hh3-sol-build-info-1", + "id": "solc-0_8_28-5c8fdc318c3f0104ec4be3938796fca8ed4a8b34", + "solcVersion": "0.8.28", + "solcLongVersion": "0.8.28+commit.7893614a", + "userSourceNameMap": { + "contracts/RouterFactory.sol": "project/contracts/RouterFactory.sol" + }, + "input": { + "language": "Solidity", + "settings": { + "evmVersion": "cancun", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata" + ] + } + }, + "remappings": [ + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/" + ] + }, + "sources": { + "npm/@openzeppelin/contracts@5.4.0/access/AccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {IERC165, ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address account => bool) hasRole;\n bytes32 adminRole;\n }\n\n mapping(bytes32 role => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with an {AccessControlUnauthorizedAccount} error including the required role.\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n return _roles[role].hasRole[account];\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n * is missing `role`.\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert AccessControlUnauthorizedAccount(account, role);\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n if (callerConfirmation != _msgSender()) {\n revert AccessControlBadConfirmation();\n }\n\n _revokeRole(role, callerConfirmation);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n if (!hasRole(role, account)) {\n _roles[role].hasRole[account] = true;\n emit RoleGranted(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n if (hasRole(role, account)) {\n _roles[role].hasRole[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/access/IAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev External interface of AccessControl declared to support ERC-165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev The `account` is missing a role.\n */\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n /**\n * @dev The caller of a function is not the expected one.\n *\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n */\n error AccessControlBadConfirmation();\n\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted to signal this.\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).\n * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n */\n function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/token/ERC20/extensions/IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[ERC-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC-20 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 *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n * doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n * token.safeTransferFrom(msg.sender, address(this), value);\n * ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\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 * CAUTION: See Security Considerations above.\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" + }, + "npm/@openzeppelin/contracts@5.4.0/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\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 value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens as the allowance of `spender` over the\n * 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 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` 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(address from, address to, uint256 value) external returns (bool);\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\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 function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/Create2.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Create2.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\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 There's no code to deploy.\n */\n error Create2EmptyBytecode();\n\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(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n if (bytecode.length == 0) {\n revert Create2EmptyBytecode();\n }\n assembly (\"memory-safe\") {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n // if no address was created, and returndata is not empty, bubble revert\n if and(iszero(addr), not(iszero(returndatasize()))) {\n let p := mload(0x40)\n returndatacopy(p, 0, returndatasize())\n revert(p, returndatasize())\n }\n }\n if (addr == address(0)) {\n revert Errors.FailedDeployment();\n }\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(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {\n assembly (\"memory-safe\") {\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 := and(keccak256(start, 85), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/Errors.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\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[ERC 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" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/Pausable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract Pausable is Context {\n bool private _paused;\n\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n /**\n * @dev The operation failed because the contract is paused.\n */\n error EnforcedPause();\n\n /**\n * @dev The operation failed because the contract is not paused.\n */\n error ExpectedPause();\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n _requireNotPaused();\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n _requirePaused();\n _;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Throws if the contract is paused.\n */\n function _requireNotPaused() internal view virtual {\n if (paused()) {\n revert EnforcedPause();\n }\n }\n\n /**\n * @dev Throws if the contract is not paused.\n */\n function _requirePaused() internal view virtual {\n if (!paused()) {\n revert ExpectedPause();\n }\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/ReentrancyGuard.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\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 EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\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 /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\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 if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\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 /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n" + }, + "project/contracts/Router.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {AccessControl} from \"@openzeppelin/contracts/access/AccessControl.sol\";\nimport {Pausable} from \"@openzeppelin/contracts/utils/Pausable.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {IERC20Permit} from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\";\nimport {ReentrancyGuard} from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/**\n * @title Router\n * @dev 寄付金の分配を管理するRouterコントラクト\n * 寄付金を基金、Burn、受取人の3つに分配します\n */\ncontract Router is AccessControl, Pausable, ReentrancyGuard {\n /// @notice カスタムエラー\n error InvalidAmount();\n error InvalidRecipient();\n error InvalidToken();\n\n /// @notice 基金管理者ロール\n bytes32 public constant FUND_MANAGER_ROLE = keccak256(\"FUND_MANAGER_ROLE\");\n\n /// @notice 分配比率管理者ロール\n bytes32 public constant RATIO_MANAGER_ROLE =\n keccak256(\"RATIO_MANAGER_ROLE\");\n\n /// @notice Burnアドレス(0xdEaD...)\n address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;\n\n /// @notice FORTokenコントラクトアドレス\n address public immutable forToken;\n\n /// @notice 基金への分配比率(基準: 10000 = 100%)\n uint256 public fundRatio;\n\n /// @notice Burnの分配比率(基準: 10000 = 100%)\n uint256 public burnRatio;\n\n /// @notice 基金ウォレットアドレス\n address public fundWallet;\n\n /**\n * @notice トークンが自動分配付きで送金された際に発行されるイベント\n * @param sender 送金を実行したアドレス (msg.sender)\n * @param from トークンの所有者アドレス\n * @param recipient 最終的にトークンを受け取るアドレス\n * @param totalAmount 分配前の総送金額\n * @param fundAmount 基金ウォレットへ送金された額\n * @param burnAmount Burnアドレスへ送金された額\n * @param recipientAmount 受取人が受け取った額\n */\n event TransferWithDistribution(\n address indexed sender,\n address indexed from,\n address indexed recipient,\n uint256 totalAmount,\n uint256 fundAmount,\n uint256 burnAmount,\n uint256 recipientAmount\n );\n\n /**\n * @notice 分配比率が更新された際に発行されるイベント\n * @param changedBy 比率を更新したアドレス\n * @param fundRatio 更新後の基金への分配比率\n * @param burnRatio 更新後のBurnへの分配比率\n * @param recipientRatio 更新後の受取人への分配比率\n */\n event DistributionRatioUpdated(\n address indexed changedBy,\n uint256 fundRatio,\n uint256 burnRatio,\n uint256 recipientRatio\n );\n\n /**\n * @dev コンストラクタ\n * @param _initialAdmin 初期管理者アドレス(全ロールを付与)\n * @param _forToken FORTokenコントラクトアドレス\n * @param _fundWallet 基金ウォレットアドレス\n * @param _fundRatio 基金への分配比率(基準: 10000 = 100%)\n * @param _burnRatio Burnの分配比率(基準: 10000 = 100%)\n */\n constructor(\n address _initialAdmin,\n address _forToken,\n address _fundWallet,\n uint256 _fundRatio,\n uint256 _burnRatio\n ) {\n require(_initialAdmin != address(0), \"Invalid initial admin address\");\n require(_forToken != address(0), \"Invalid token address\");\n forToken = _forToken;\n fundWallet = _fundWallet;\n fundRatio = _fundRatio;\n burnRatio = _burnRatio;\n\n // デフォルト管理者ロールの設定\n _grantRole(DEFAULT_ADMIN_ROLE, _initialAdmin);\n _grantRole(FUND_MANAGER_ROLE, _initialAdmin);\n _grantRole(RATIO_MANAGER_ROLE, _initialAdmin);\n }\n\n /**\n * @dev 基金の分配比率を更新する\n * @param _fundRatio 新しい基金への分配比率(基準: 10000 = 100%)\n */\n function setFundRatio(\n uint256 _fundRatio\n ) external onlyRole(RATIO_MANAGER_ROLE) whenNotPaused {\n require(_fundRatio + burnRatio <= 10000, \"Total ratio exceeds 100%\");\n fundRatio = _fundRatio;\n emit DistributionRatioUpdated(\n msg.sender,\n fundRatio,\n burnRatio,\n 10000 - fundRatio - burnRatio\n );\n }\n\n /**\n * @dev Burnの分配比率を更新する\n * @param _burnRatio 新しいBurnの分配比率(基準: 10000 = 100%)\n */\n function setBurnRatio(\n uint256 _burnRatio\n ) external onlyRole(RATIO_MANAGER_ROLE) whenNotPaused {\n require(fundRatio + _burnRatio <= 10000, \"Total ratio exceeds 100%\");\n burnRatio = _burnRatio;\n emit DistributionRatioUpdated(\n msg.sender,\n fundRatio,\n burnRatio,\n 10000 - fundRatio - burnRatio\n );\n }\n\n /**\n * @dev 基金ウォレットアドレスを更新する\n * @param _fundWallet 新しい基金ウォレットアドレス\n */\n function setFundWallet(\n address _fundWallet\n ) external onlyRole(FUND_MANAGER_ROLE) whenNotPaused {\n require(_fundWallet != address(0), \"Invalid fund wallet address\");\n fundWallet = _fundWallet;\n }\n\n /**\n * @dev コントラクトを一時停止する\n * @notice DEFAULT_ADMIN_ROLEのみが実行可能\n */\n function pause() external onlyRole(DEFAULT_ADMIN_ROLE) {\n _pause();\n }\n\n /**\n * @dev コントラクトの一時停止を解除する\n * @notice DEFAULT_ADMIN_ROLEのみが実行可能\n */\n function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) {\n _unpause();\n }\n\n /**\n * @notice permit署名を使用してトークンを送金し、自動分配を実行\n * @dev permitを実行した後、基金・Burn・受取人へトークンを分配\n * @param from トークン所有者アドレス(permit署名と一致する必要あり)\n * @param recipient 分配後の残りトークンを受け取るアドレス\n * @param amount 送金総額(分配前)\n * @param deadline permit署名の有効期限\n * @param v 署名コンポーネント v\n * @param r 署名コンポーネント r\n * @param s 署名コンポーネント s\n */\n function transferWithPermit(\n address from,\n address recipient,\n uint256 amount,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external whenNotPaused nonReentrant {\n // 入力値の検証\n if (amount == 0) revert InvalidAmount();\n if (recipient == address(0)) revert InvalidRecipient();\n\n // permitを実行してこのコントラクトを承認\n IERC20Permit(forToken).permit(\n from,\n address(this),\n amount,\n deadline,\n v,\n r,\n s\n );\n\n // 分配額を計算\n uint256 fundAmount = (amount * fundRatio) / 10000;\n uint256 burnAmount = (amount * burnRatio) / 10000;\n uint256 recipientAmount = amount - fundAmount - burnAmount;\n\n // 送金を実行\n IERC20 token = IERC20(forToken);\n\n if (fundAmount > 0) {\n require(\n token.transferFrom(from, fundWallet, fundAmount),\n \"Fund transfer failed\"\n );\n }\n\n if (burnAmount > 0) {\n require(\n token.transferFrom(from, BURN_ADDRESS, burnAmount),\n \"Burn transfer failed\"\n );\n }\n\n if (recipientAmount > 0) {\n require(\n token.transferFrom(from, recipient, recipientAmount),\n \"Recipient transfer failed\"\n );\n }\n\n // イベントを発行\n emit TransferWithDistribution(\n msg.sender,\n from,\n recipient,\n amount,\n fundAmount,\n burnAmount,\n recipientAmount\n );\n }\n}\n" + }, + "project/contracts/RouterFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {Create2} from \"@openzeppelin/contracts/utils/Create2.sol\";\nimport {Router} from \"./Router.sol\";\n\ncontract RouterFactory {\n function deploy(\n bytes32 _salt,\n address _initialAdmin,\n address _forToken,\n address _fundWallet,\n uint256 _fundRatio,\n uint256 _burnRatio\n ) external returns (address addr) {\n bytes memory bytecode = abi.encodePacked(\n type(Router).creationCode,\n abi.encode(_initialAdmin, _forToken, _fundWallet, _fundRatio, _burnRatio)\n );\n addr = Create2.deploy(0, _salt, bytecode);\n }\n\n function computeAddress(\n bytes32 _salt,\n address _initialAdmin,\n address _forToken,\n address _fundWallet,\n uint256 _fundRatio,\n uint256 _burnRatio\n ) external view returns (address addr) {\n bytes memory bytecode = abi.encodePacked(\n type(Router).creationCode,\n abi.encode(_initialAdmin, _forToken, _fundWallet, _fundRatio, _burnRatio)\n );\n addr = Create2.computeAddress(_salt, keccak256(bytecode));\n }\n}\n" + } + } + } +} \ No newline at end of file diff --git a/packages/contract/ignition/deployments/chain-11155111/build-info/solc-0_8_28-d9ff8f47c1281e39c5910faa5e18f642426c9cb9.json b/packages/contract/ignition/deployments/chain-11155111/build-info/solc-0_8_28-d9ff8f47c1281e39c5910faa5e18f642426c9cb9.json deleted file mode 100644 index a6c0571..0000000 --- a/packages/contract/ignition/deployments/chain-11155111/build-info/solc-0_8_28-d9ff8f47c1281e39c5910faa5e18f642426c9cb9.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_format": "hh3-sol-build-info-1", - "id": "solc-0_8_28-d9ff8f47c1281e39c5910faa5e18f642426c9cb9", - "solcVersion": "0.8.28", - "solcLongVersion": "0.8.28+commit.7893614a", - "userSourceNameMap": { - "contracts/RouterFactory.sol": "project/contracts/RouterFactory.sol" - }, - "input": { - "language": "Solidity", - "settings": { - "evmVersion": "cancun", - "optimizer": { - "enabled": true, - "runs": 200 - }, - "outputSelection": { - "*": { - "": [ - "ast" - ], - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata" - ] - } - }, - "remappings": [ - "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", - "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/" - ] - }, - "sources": { - "npm/@openzeppelin/contracts@5.4.0/access/AccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {IERC165, ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address account => bool) hasRole;\n bytes32 adminRole;\n }\n\n mapping(bytes32 role => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with an {AccessControlUnauthorizedAccount} error including the required role.\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n return _roles[role].hasRole[account];\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n * is missing `role`.\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert AccessControlUnauthorizedAccount(account, role);\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n if (callerConfirmation != _msgSender()) {\n revert AccessControlBadConfirmation();\n }\n\n _revokeRole(role, callerConfirmation);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n if (!hasRole(role, account)) {\n _roles[role].hasRole[account] = true;\n emit RoleGranted(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n if (hasRole(role, account)) {\n _roles[role].hasRole[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n}\n" - }, - "npm/@openzeppelin/contracts@5.4.0/access/IAccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev External interface of AccessControl declared to support ERC-165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev The `account` is missing a role.\n */\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n /**\n * @dev The caller of a function is not the expected one.\n *\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n */\n error AccessControlBadConfirmation();\n\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted to signal this.\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).\n * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n */\n function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n" - }, - "npm/@openzeppelin/contracts@5.4.0/utils/Context.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\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 function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" - }, - "npm/@openzeppelin/contracts@5.4.0/utils/Create2.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Create2.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\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 There's no code to deploy.\n */\n error Create2EmptyBytecode();\n\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(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n if (bytecode.length == 0) {\n revert Create2EmptyBytecode();\n }\n assembly (\"memory-safe\") {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n // if no address was created, and returndata is not empty, bubble revert\n if and(iszero(addr), not(iszero(returndatasize()))) {\n let p := mload(0x40)\n returndatacopy(p, 0, returndatasize())\n revert(p, returndatasize())\n }\n }\n if (addr == address(0)) {\n revert Errors.FailedDeployment();\n }\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(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {\n assembly (\"memory-safe\") {\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 := and(keccak256(start, 85), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n }\n}\n" - }, - "npm/@openzeppelin/contracts@5.4.0/utils/Errors.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n" - }, - "npm/@openzeppelin/contracts@5.4.0/utils/introspection/ERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" - }, - "npm/@openzeppelin/contracts@5.4.0/utils/introspection/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\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[ERC 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" - }, - "project/contracts/Router.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {AccessControl} from \"@openzeppelin/contracts/access/AccessControl.sol\";\n\n/**\n * @title Router\n * @dev 寄付金の分配を管理するRouterコントラクト\n * 寄付金を基金、Burn、受取人の3つに分配します\n */\ncontract Router is AccessControl {\n /// @notice 基金管理者ロール\n bytes32 public constant FUND_MANAGER_ROLE = keccak256(\"FUND_MANAGER_ROLE\");\n\n /// @notice 分配比率管理者ロール\n bytes32 public constant RATIO_MANAGER_ROLE =\n keccak256(\"RATIO_MANAGER_ROLE\");\n\n /// @notice Burnアドレス(0x0)\n address public constant BURN_ADDRESS = address(0);\n\n /// @notice 基金への分配比率(基準: 10000 = 100%)\n uint256 public fundRatio;\n\n /// @notice Burnの分配比率(基準: 10000 = 100%)\n uint256 public burnRatio;\n\n /// @notice 基金ウォレットアドレス\n address public fundWallet;\n\n /**\n * @dev コンストラクタ\n * @param _fundWallet 基金ウォレットアドレス\n * @param _fundRatio 基金への分配比率(基準: 10000 = 100%)\n * @param _burnRatio Burnの分配比率(基準: 10000 = 100%)\n */\n constructor(address _fundWallet, uint256 _fundRatio, uint256 _burnRatio) {\n fundWallet = _fundWallet;\n fundRatio = _fundRatio;\n burnRatio = _burnRatio;\n\n // デフォルト管理者ロールの設定\n _grantRole(DEFAULT_ADMIN_ROLE, _msgSender());\n _grantRole(FUND_MANAGER_ROLE, _msgSender());\n _grantRole(RATIO_MANAGER_ROLE, _msgSender());\n }\n\n /**\n * @dev 基金の分配比率を更新する\n * @param _fundRatio 新しい基金への分配比率(基準: 10000 = 100%)\n */\n function setFundRatio(\n uint256 _fundRatio\n ) external onlyRole(RATIO_MANAGER_ROLE) {\n require(_fundRatio + burnRatio <= 10000, \"Total ratio exceeds 100%\");\n fundRatio = _fundRatio;\n }\n\n /**\n * @dev Burnの分配比率を更新する\n * @param _burnRatio 新しいBurnの分配比率(基準: 10000 = 100%)\n */\n function setBurnRatio(\n uint256 _burnRatio\n ) external onlyRole(RATIO_MANAGER_ROLE) {\n require(fundRatio + _burnRatio <= 10000, \"Total ratio exceeds 100%\");\n burnRatio = _burnRatio;\n }\n\n /**\n * @dev 基金ウォレットアドレスを更新する\n * @param _fundWallet 新しい基金ウォレットアドレス\n */\n function setFundWallet(\n address _fundWallet\n ) external onlyRole(FUND_MANAGER_ROLE) {\n require(_fundWallet != address(0), \"Invalid fund wallet address\");\n fundWallet = _fundWallet;\n }\n}\n" - }, - "project/contracts/RouterFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {Create2} from \"@openzeppelin/contracts/utils/Create2.sol\";\nimport {Router} from \"./Router.sol\";\n\ncontract RouterFactory {\n function deploy(\n bytes32 _salt,\n address _fundWallet,\n uint256 _fundRatio,\n uint256 _burnRatio\n ) external returns (address addr) {\n bytes memory bytecode = abi.encodePacked(\n type(Router).creationCode,\n abi.encode(_fundWallet, _fundRatio, _burnRatio)\n );\n addr = Create2.deploy(0, _salt, bytecode);\n }\n\n function computeAddress(\n bytes32 _salt,\n address _fundWallet,\n uint256 _fundRatio,\n uint256 _burnRatio\n ) external view returns (address addr) {\n bytes memory bytecode = abi.encodePacked(\n type(Router).creationCode,\n abi.encode(_fundWallet, _fundRatio, _burnRatio)\n );\n addr = Create2.computeAddress(_salt, keccak256(bytecode));\n }\n}\n" - } - } - } -} \ No newline at end of file diff --git a/packages/contract/ignition/deployments/chain-11155111/deployed_addresses.json b/packages/contract/ignition/deployments/chain-11155111/deployed_addresses.json index f043bcd..7b82db8 100644 --- a/packages/contract/ignition/deployments/chain-11155111/deployed_addresses.json +++ b/packages/contract/ignition/deployments/chain-11155111/deployed_addresses.json @@ -1,4 +1,4 @@ { - "RouterFactoryModule#RouterFactory": "0xE4d289e9dA2164A959441dF278a32B3BEeFE8896", - "FoRTokenModule#FoRToken": "0x778E86191808AD3446BD8E1d139C5D1e4e01976C" + "FoRTokenModule#FoRToken": "0x473beaaDFaA7c7DB856cb1D368a27a238819179A", + "RouterFactoryModule#RouterFactory": "0xa3b909dAd23d16a2f3B71417847D2cC8698Ce0A4" } \ No newline at end of file diff --git a/packages/contract/ignition/deployments/chain-11155111/journal.jsonl b/packages/contract/ignition/deployments/chain-11155111/journal.jsonl index a7ec11f..0002b10 100644 --- a/packages/contract/ignition/deployments/chain-11155111/journal.jsonl +++ b/packages/contract/ignition/deployments/chain-11155111/journal.jsonl @@ -1,14 +1,20 @@ {"chainId":11155111,"type":"DEPLOYMENT_INITIALIZE"} -{"artifactId":"RouterFactoryModule#RouterFactory","constructorArgs":[],"contractName":"RouterFactory","dependencies":[],"from":"0x8c713bb047edcc200427f7605e66e0329258dac9","futureId":"RouterFactoryModule#RouterFactory","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"create2","strategyConfig":{"salt":"0x0000000000000000000000000000000000000000000000000000000000000000"},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} -{"futureId":"RouterFactoryModule#RouterFactory","networkInteraction":{"data":"0x26307668000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000c446080604052348015600e575f5ffd5b50610c288061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c806398f3e1ed14610038578063b852a47a14610067575b5f5ffd5b61004b610046366004610272565b61007a565b6040516001600160a01b03909116815260200160405180910390f35b61004b610075366004610272565b610109565b5f5f6040518060200161008c90610265565b601f1982820381018352601f9091011660408181526001600160a01b038816602083015281018690526060810185905260800160408051601f19818403018152908290526100dd92916020016102ce565b60405160208183030381529060405290506100ff868280519060200120610188565b9695505050505050565b5f5f6040518060200161011b90610265565b601f1982820381018352601f9091011660408181526001600160a01b038816602083015281018690526060810185905260800160408051601f198184030181529082905261016c92916020016102ce565b60405160208183030381529060405290506100ff5f878361019b565b5f610194838330610233565b9392505050565b5f834710156101ca5760405163cf47918160e01b81524760048201526024810185905260440160405180910390fd5b81515f036101eb57604051631328927760e21b815260040160405180910390fd5b8282516020840186f590503d15198115161561020c576040513d5f823e3d81fd5b6001600160a01b0381166101945760405163b06ebf3d60e01b815260040160405180910390fd5b5f604051836040820152846020820152828152600b8101905060ff8153605590206001600160a01b0316949350505050565b610908806102eb83390190565b5f5f5f5f60808587031215610285575f5ffd5b8435935060208501356001600160a01b03811681146102a2575f5ffd5b93969395505050506040820135916060013590565b5f81518060208401855e5f93019283525090919050565b5f6102e26102dc83866102b7565b846102b7565b94935050505056fe608060405234801561000f575f5ffd5b5060405161090838038061090883398101604081905261002e9161016b565b600380546001600160a01b0319166001600160a01b038516179055600182905560028190556100635f61005e3390565b6100c2565b5061008e7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f336100c2565b506100b97f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e0336100c2565b505050506101aa565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16610162575f838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561011a3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610165565b505f5b92915050565b5f5f5f6060848603121561017d575f5ffd5b83516001600160a01b0381168114610193575f5ffd5b602085015160409095015190969495509392505050565b610751806101b75f395ff3fe608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c806355ce3b9a116100935780639370131f116100635780639370131f14610243578063a217fddf14610256578063d547741f1461025d578063fccc281314610270575f5ffd5b806355ce3b9a146101e9578063664a1ad6146101fc5780638ed648501461022757806391d1485414610230575f5ffd5b80632f83a6bc116100ce5780632f83a6bc1461019357806336568abe146101ba5780634dbfe416146101cd5780635192c82c146101e0575f5ffd5b806301ffc9a7146100ff578063248a9ca314610127578063253123d7146101575780632f2ff15d1461017e575b5f5ffd5b61011261010d366004610659565b610277565b60405190151581526020015b60405180910390f35b610149610135366004610687565b5f9081526020819052604090206001015490565b60405190815260200161011e565b6101497f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e081565b61019161018c3660046106b9565b6102ad565b005b6101497f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f81565b6101916101c83660046106b9565b6102d7565b6101916101db366004610687565b61030f565b61014960025481565b6101916101f73660046106e3565b61039e565b60035461020f906001600160a01b031681565b6040516001600160a01b03909116815260200161011e565b61014960015481565b61011261023e3660046106b9565b610441565b610191610251366004610687565b610469565b6101495f81565b61019161026b3660046106b9565b6104f3565b61020f5f81565b5f6001600160e01b03198216637965db0b60e01b14806102a757506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f828152602081905260409020600101546102c781610517565b6102d18383610524565b50505050565b6001600160a01b03811633146103005760405163334bd91960e11b815260040160405180910390fd5b61030a82826105b3565b505050565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e061033981610517565b6127106002548361034a91906106fc565b11156103985760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b60448201526064015b60405180910390fd5b50600155565b7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f6103c881610517565b6001600160a01b03821661041e5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642066756e642077616c6c657420616464726573730000000000604482015260640161038f565b50600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e061049381610517565b612710826001546104a491906106fc565b11156104ed5760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b604482015260640161038f565b50600255565b5f8281526020819052604090206001015461050d81610517565b6102d183836105b3565b610521813361061c565b50565b5f61052f8383610441565b6105ac575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556105643390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016102a7565b505f6102a7565b5f6105be8383610441565b156105ac575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016102a7565b6106268282610441565b6106555760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161038f565b5050565b5f60208284031215610669575f5ffd5b81356001600160e01b031981168114610680575f5ffd5b9392505050565b5f60208284031215610697575f5ffd5b5035919050565b80356001600160a01b03811681146106b4575f5ffd5b919050565b5f5f604083850312156106ca575f5ffd5b823591506106da6020840161069e565b90509250929050565b5f602082840312156106f3575f5ffd5b6106808261069e565b808201808211156102a757634e487b7160e01b5f52601160045260245ffdfea26469706673582212207316a0c7eb5db9a7f1205aa3a81311025a6532996bd6a20c27a34b3c7de2467f64736f6c634300081c0033a2646970667358221220a7d7ac2ee7e70dc06c622d65a15d5b4ccd1e631c04cf12e377862cdf1b8c1aa164736f6c634300081c003300000000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} -{"futureId":"RouterFactoryModule#RouterFactory","networkInteractionId":1,"nonce":95,"type":"TRANSACTION_PREPARE_SEND"} -{"futureId":"RouterFactoryModule#RouterFactory","networkInteractionId":1,"nonce":95,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1071754"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x3b9bd7ef67dda803fdd35d37c0612264309199bff4bc3e7dec98dbfe113ec3ef"},"type":"TRANSACTION_SEND"} -{"futureId":"RouterFactoryModule#RouterFactory","hash":"0x3b9bd7ef67dda803fdd35d37c0612264309199bff4bc3e7dec98dbfe113ec3ef","networkInteractionId":1,"receipt":{"blockHash":"0x0ce35e968056ebf5d3a4338d88814ab07f1e783cddf2aec6defa0d783be8c1fb","blockNumber":9803635,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":812,"topics":["0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7","0x000000000000000000000000e4d289e9da2164a959441df278a32b3beefe8896","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} -{"futureId":"RouterFactoryModule#RouterFactory","result":{"address":"0xE4d289e9dA2164A959441dF278a32B3BEeFE8896","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} {"artifactId":"FoRTokenModule#FoRToken","constructorArgs":["1000000000000000000000000","FoR Token","FOR"],"contractName":"FoRToken","dependencies":[],"from":"0x8c713bb047edcc200427f7605e66e0329258dac9","futureId":"FoRTokenModule#FoRToken","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} -{"futureId":"FoRTokenModule#FoRToken","networkInteraction":{"data":"0x610160604052348015610010575f5ffd5b506040516114ab3803806114ab83398101604081905261002f9161039c565b6040805180820190915260018152603160f81b60208201528290819081846003610059838261048e565b506004610066828261048e565b506100769150839050600561012d565b6101205261008581600661012d565b61014052815160208084019190912060e052815190820120610100524660a05261011160e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c05250610125338461015f565b5050506105bf565b5f602083511015610148576101418361019c565b9050610159565b81610153848261048e565b5060ff90505b92915050565b6001600160a01b03821661018d5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6101985f83836101d9565b5050565b5f5f829050601f815111156101c6578260405163305a27a960e01b81526004016101849190610548565b80516101d18261057d565b179392505050565b6001600160a01b038316610203578060025f8282546101f891906105a0565b909155506102739050565b6001600160a01b0383165f90815260208190526040902054818110156102555760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610184565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661028f576002805482900390556102ad565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516102f291815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610322575f5ffd5b81516001600160401b0381111561033b5761033b6102ff565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610369576103696102ff565b604052818152838201602001851015610380575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f606084860312156103ae575f5ffd5b835160208501519093506001600160401b038111156103cb575f5ffd5b6103d786828701610313565b604086015190935090506001600160401b038111156103f4575f5ffd5b61040086828701610313565b9150509250925092565b600181811c9082168061041e57607f821691505b60208210810361043c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561048957805f5260205f20601f840160051c810160208510156104675750805b601f840160051c820191505b81811015610486575f8155600101610473565b50505b505050565b81516001600160401b038111156104a7576104a76102ff565b6104bb816104b5845461040a565b84610442565b6020601f8211600181146104ed575f83156104d65750848201515b5f19600385901b1c1916600184901b178455610486565b5f84815260208120601f198516915b8281101561051c57878501518255602094850194600190920191016104fc565b508482101561053957868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561043c575f1960209190910360031b1b16919050565b8082018082111561015957634e487b7160e01b5f52601160045260245ffd5b60805160a05160c05160e051610100516101205161014051610e9b6106105f395f6106e201525f6106b501525f61065e01525f61063601525f61059101525f6105bb01525f6105e50152610e9b5ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c806370a082311161008857806395d89b411161006357806395d89b41146101a2578063a9059cbb146101aa578063d505accf146101bd578063dd62ed3e146101d2575f5ffd5b806370a082311461014c5780637ecebe001461017457806384b0196e14610187575f5ffd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce567146101355780633644e51514610144575b5f5ffd5b6100d761020a565b6040516100e49190610c17565b60405180910390f35b6101006100fb366004610c4b565b61029a565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b610100610130366004610c73565b6102b3565b604051601281526020016100e4565b6101146102d6565b61011461015a366004610cad565b6001600160a01b03165f9081526020819052604090205490565b610114610182366004610cad565b6102e4565b61018f610301565b6040516100e49796959493929190610cc6565b6100d7610343565b6101006101b8366004610c4b565b610352565b6101d06101cb366004610d5c565b61035f565b005b6101146101e0366004610dc9565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021990610dfa565b80601f016020809104026020016040519081016040528092919081815260200182805461024590610dfa565b80156102905780601f1061026757610100808354040283529160200191610290565b820191905f5260205f20905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b5f336102a781858561049a565b60019150505b92915050565b5f336102c08582856104ac565b6102cb858585610528565b506001949350505050565b5f6102df610585565b905090565b6001600160a01b0381165f908152600760205260408120546102ad565b5f6060805f5f5f60606103126106ae565b61031a6106db565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60606004805461021990610dfa565b5f336102a7818585610528565b834211156103885760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886103d38c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61042d82610708565b90505f61043c82878787610734565b9050896001600160a01b0316816001600160a01b031614610483576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161037f565b61048e8a8a8a61049a565b50505050505050505050565b6104a78383836001610760565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811015610522578181101561051457604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161037f565b61052284848484035f610760565b50505050565b6001600160a01b03831661055157604051634b637e8f60e11b81525f600482015260240161037f565b6001600160a01b03821661057a5760405163ec442f0560e01b81525f600482015260240161037f565b6104a7838383610832565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156105dd57507f000000000000000000000000000000000000000000000000000000000000000046145b1561060757507f000000000000000000000000000000000000000000000000000000000000000090565b6102df604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60606102df7f00000000000000000000000000000000000000000000000000000000000000006005610958565b60606102df7f00000000000000000000000000000000000000000000000000000000000000006006610958565b5f6102ad610714610585565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f61074488888888610a01565b9250925092506107548282610ac9565b50909695505050505050565b6001600160a01b0384166107895760405163e602df0560e01b81525f600482015260240161037f565b6001600160a01b0383166107b257604051634a1406b160e11b81525f600482015260240161037f565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561052257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161082491815260200190565b60405180910390a350505050565b6001600160a01b03831661085c578060025f8282546108519190610e32565b909155506108cc9050565b6001600160a01b0383165f90815260208190526040902054818110156108ae5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161037f565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166108e857600280548290039055610906565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161094b91815260200190565b60405180910390a3505050565b606060ff83146109725761096b83610b85565b90506102ad565b81805461097e90610dfa565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa90610dfa565b80156109f55780601f106109cc576101008083540402835291602001916109f5565b820191905f5260205f20905b8154815290600101906020018083116109d857829003601f168201915b505050505090506102ad565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610a3a57505f91506003905082610abf565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610a8b573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610ab657505f925060019150829050610abf565b92505f91508190505b9450945094915050565b5f826003811115610adc57610adc610e51565b03610ae5575050565b6001826003811115610af957610af9610e51565b03610b175760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610b2b57610b2b610e51565b03610b4c5760405163fce698f760e01b81526004810182905260240161037f565b6003826003811115610b6057610b60610e51565b03610b81576040516335e2f38360e21b81526004810182905260240161037f565b5050565b60605f610b9183610bc2565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156102ad57604051632cd44ac360e21b815260040160405180910390fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c296020830184610be9565b9392505050565b80356001600160a01b0381168114610c46575f5ffd5b919050565b5f5f60408385031215610c5c575f5ffd5b610c6583610c30565b946020939093013593505050565b5f5f5f60608486031215610c85575f5ffd5b610c8e84610c30565b9250610c9c60208501610c30565b929592945050506040919091013590565b5f60208284031215610cbd575f5ffd5b610c2982610c30565b60ff60f81b8816815260e060208201525f610ce460e0830189610be9565b8281036040840152610cf68189610be9565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015610d4b578351835260209384019390920191600101610d2d565b50909b9a5050505050505050505050565b5f5f5f5f5f5f5f60e0888a031215610d72575f5ffd5b610d7b88610c30565b9650610d8960208901610c30565b95506040880135945060608801359350608088013560ff81168114610dac575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610dda575f5ffd5b610de383610c30565b9150610df160208401610c30565b90509250929050565b600181811c90821680610e0e57607f821691505b602082108103610e2c57634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102ad57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220959b3b2b2a1a1fda4804796a9c642499d98ab4c6794ec7a8593445a1903c44a964736f6c634300081c003300000000000000000000000000000000000000000000d3c21bcecceda1000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000009466f5220546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003464f520000000000000000000000000000000000000000000000000000000000","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} -{"futureId":"FoRTokenModule#FoRToken","networkInteractionId":1,"nonce":96,"type":"TRANSACTION_PREPARE_SEND"} -{"futureId":"FoRTokenModule#FoRToken","networkInteractionId":1,"nonce":96,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1069166"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0xb94aa508e6d5a85828a223f355380fc322a2f9e241ddec2f39a50109efedd00a"},"type":"TRANSACTION_SEND"} -{"futureId":"FoRTokenModule#FoRToken","hash":"0xb94aa508e6d5a85828a223f355380fc322a2f9e241ddec2f39a50109efedd00a","networkInteractionId":1,"receipt":{"blockHash":"0xc64886fb9c360aa1b251a1a46420c3609124219a8759443bb53b935ef0a80923","blockNumber":9803655,"contractAddress":"0x778E86191808AD3446BD8E1d139C5D1e4e01976C","logs":[{"address":"0x778E86191808AD3446BD8E1d139C5D1e4e01976C","data":"0x00000000000000000000000000000000000000000000d3c21bcecceda1000000","logIndex":196,"topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} -{"futureId":"FoRTokenModule#FoRToken","result":{"address":"0x778E86191808AD3446BD8E1d139C5D1e4e01976C","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file +{"futureId":"FoRTokenModule#FoRToken","networkInteraction":{"data":"0x610160604052348015610010575f5ffd5b50604051611ecd380380611ecd83398101604081905261002f916104bb565b6040805180820190915260018152603160f81b6020820152829081908184600361005983826105ad565b50600461006682826105ad565b50610076915083905060056101a1565b610120526100858160066101a1565b61014052815160208084019190912060e052815190820120610100524660a05261011160e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0525061012533846101d3565b61012f5f33610210565b5061015a7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610210565b50335f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a25050506106de565b5f6020835110156101bc576101b5836102bb565b90506101cd565b816101c784826105ad565b5060ff90505b92915050565b6001600160a01b0382166102015760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b61020c5f83836102f8565b5050565b5f8281526008602090815260408083206001600160a01b038516845290915281205460ff166102b4575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff1916600117905561026c3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101cd565b505f6101cd565b5f5f829050601f815111156102e5578260405163305a27a960e01b81526004016101f89190610667565b80516102f08261069c565b179392505050565b6001600160a01b038316610322578060025f82825461031791906106bf565b909155506103929050565b6001600160a01b0383165f90815260208190526040902054818110156103745760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016101f8565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166103ae576002805482900390556103cc565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161041191815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610441575f5ffd5b81516001600160401b0381111561045a5761045a61041e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156104885761048861041e565b60405281815283820160200185101561049f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f606084860312156104cd575f5ffd5b835160208501519093506001600160401b038111156104ea575f5ffd5b6104f686828701610432565b604086015190935090506001600160401b03811115610513575f5ffd5b61051f86828701610432565b9150509250925092565b600181811c9082168061053d57607f821691505b60208210810361055b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156105a857805f5260205f20601f840160051c810160208510156105865750805b601f840160051c820191505b818110156105a5575f8155600101610592565b50505b505050565b81516001600160401b038111156105c6576105c661041e565b6105da816105d48454610529565b84610561565b6020601f82116001811461060c575f83156105f55750848201515b5f19600385901b1c1916600184901b1784556105a5565b5f84815260208120601f198516915b8281101561063b578785015182556020948501946001909201910161061b565b508482101561065857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561055b575f1960209190910360031b1b16919050565b808201808211156101cd57634e487b7160e01b5f52601160045260245ffd5b60805160a05160c05160e05161010051610120516101405161179e61072f5f395f610d6401525f610d3701525f610c7501525f610c4d01525f610ba801525f610bd201525f610bfc015261179e5ff3fe608060405234801561000f575f5ffd5b5060043610610187575f3560e01c806370dd8d2e116100d957806395d89b4111610093578063d505accf1161006e578063d505accf1461037c578063d547741f1461038f578063dd62ed3e146103a2578063eba8dabc146103da575f5ffd5b806395d89b411461035a578063a217fddf14610362578063a9059cbb14610369575f5ffd5b806370dd8d2e146102c757806375b238fc146102f25780637ecebe001461030657806384b0196e146103195780638d33420a1461033457806391d1485414610347575f5ffd5b8063248a9ca31161014457806331f591021161011f57806331f59102146102715780633644e5151461028457806336568abe1461028c57806370a082311461029f575f5ffd5b8063248a9ca31461022b5780632f2ff15d1461024d578063313ce56714610262575f5ffd5b806301ffc9a71461018b57806306fdde03146101b3578063095ea7b3146101c8578063180cbefc146101db57806318160ddd1461021057806323b872dd14610218575b5f5ffd5b61019e6101993660046113f1565b6103ed565b60405190151581526020015b60405180910390f35b6101bb6103fd565b6040516101aa9190611446565b61019e6101d6366004611473565b61048d565b6102027f27635d090072063300e62545cc2f6a7dc583162c8abe1f7a7e48e152b6be1d2281565b6040519081526020016101aa565b600254610202565b61019e61022636600461149b565b6104a4565b6102026102393660046114d5565b5f9081526008602052604090206001015490565b61026061025b3660046114ec565b6104c2565b005b604051601281526020016101aa565b61026061027f366004611516565b6104ec565b610202610587565b61026061029a3660046114ec565b610595565b6102026102ad366004611516565b6001600160a01b03165f9081526020819052604090205490565b61019e6102d5366004611516565b6001600160a01b03165f9081526009602052604090205460ff1690565b6102025f5160206117495f395f51905f5281565b610202610314366004611516565b6105cd565b6103216105ea565b6040516101aa979695949392919061152f565b6102606103423660046115c5565b61062c565b61019e6103553660046114ec565b6107b9565b6101bb6107e3565b6102025f81565b61019e610377366004611473565b6107f2565b61026061038a366004611648565b61080e565b61026061039d3660046114ec565b610949565b6102026103b03660046116b5565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6102606103e8366004611516565b61096d565b5f6103f782610a10565b92915050565b60606003805461040c906116dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610438906116dd565b80156104835780601f1061045a57610100808354040283529160200191610483565b820191905f5260205f20905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b5f3361049a818585610a44565b5060019392505050565b5f6104af8484610a51565b6104ba848484610adb565b949350505050565b5f828152600860205260409020600101546104dc81610afe565b6104e68383610b0b565b50505050565b5f5160206117495f395f51905f5261050381610afe565b6001600160a01b0382165f9081526009602052604090205460ff161561053c57604051632a240d9f60e11b815260040160405180910390fd5b6001600160a01b0382165f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a25050565b5f610590610b9c565b905090565b6001600160a01b03811633146105be5760405163334bd91960e11b815260040160405180910390fd5b6105c88282610cc5565b505050565b6001600160a01b0381165f908152600760205260408120546103f7565b5f6060805f5f5f60606105fb610d30565b610603610d5d565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b8242111561064d57604051630819bdcd60e01b815260040160405180910390fd5b6001600160a01b0384165f9081526009602052604090205460ff161561068657604051632a240d9f60e11b815260040160405180910390fd5b604080517f27635d090072063300e62545cc2f6a7dc583162c8abe1f7a7e48e152b6be1d2260208201526001600160a01b03861691810191909152606081018490525f906080016040516020818303038152906040528051906020012090505f6106ef82610d8a565b90505f61073385858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508693925050610db69050565b905061074c5f5160206117495f395f51905f52826107b9565b61076957604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0387165f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a250505050505050565b5f9182526008602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461040c906116dd565b5f6107fd3384610a51565b6108078383610dde565b9392505050565b834211156108375760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108828c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108dc82610d8a565b90505f6108eb82878787610deb565b9050896001600160a01b0316816001600160a01b031614610932576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161082e565b61093d8a8a8a610a44565b50505050505050505050565b5f8281526008602052604090206001015461096381610afe565b6104e68383610cc5565b5f5160206117495f395f51905f5261098481610afe565b6001600160a01b0382165f9081526009602052604090205460ff166109c757604051635bb897bf60e11b81526001600160a01b038316600482015260240161082e565b6001600160a01b0382165f81815260096020526040808220805460ff19169055517fe7fc45e1e6a61a6d67e182d4847f8c2dcde282d7008410c1bc3a7e8fa299eb909190a25050565b5f6001600160e01b03198216637965db0b60e01b14806103f757506301ffc9a760e01b6001600160e01b03198316146103f7565b6105c88383836001610e17565b6001600160a01b0382165f9081526009602052604090205460ff16610a9457604051635bb897bf60e11b81526001600160a01b038316600482015260240161082e565b6001600160a01b0381165f9081526009602052604090205460ff16610ad757604051635bb897bf60e11b81526001600160a01b038216600482015260240161082e565b5050565b5f33610ae8858285610ee9565b610af3858585610f5f565b506001949350505050565b610b088133610fbc565b50565b5f610b1683836107b9565b610b95575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff19166001179055610b4d3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016103f7565b505f6103f7565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610bf457507f000000000000000000000000000000000000000000000000000000000000000046145b15610c1e57507f000000000000000000000000000000000000000000000000000000000000000090565b610590604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f610cd083836107b9565b15610b95575f8381526008602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016103f7565b60606105907f00000000000000000000000000000000000000000000000000000000000000006005610ff5565b60606105907f00000000000000000000000000000000000000000000000000000000000000006006610ff5565b5f6103f7610d96610b9c565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f610dc4868661109e565b925092509250610dd482826110e7565b5090949350505050565b5f3361049a818585610f5f565b5f5f5f5f610dfb8888888861119f565b925092509250610e0b82826110e7565b50909695505050505050565b6001600160a01b038416610e405760405163e602df0560e01b81525f600482015260240161082e565b6001600160a01b038316610e6957604051634a1406b160e11b81525f600482015260240161082e565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156104e657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610edb91815260200190565b60405180910390a350505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156104e65781811015610f5157604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161082e565b6104e684848484035f610e17565b6001600160a01b038316610f8857604051634b637e8f60e11b81525f600482015260240161082e565b6001600160a01b038216610fb15760405163ec442f0560e01b81525f600482015260240161082e565b6105c8838383611267565b610fc682826107b9565b610ad75760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161082e565b606060ff831461100f576110088361138d565b90506103f7565b81805461101b906116dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611047906116dd565b80156110925780601f1061106957610100808354040283529160200191611092565b820191905f5260205f20905b81548152906001019060200180831161107557829003601f168201915b505050505090506103f7565b5f5f5f83516041036110d5576020840151604085015160608601515f1a6110c78882858561119f565b9550955095505050506110e0565b505081515f91506002905b9250925092565b5f8260038111156110fa576110fa611715565b03611103575050565b600182600381111561111757611117611715565b036111355760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561114957611149611715565b0361116a5760405163fce698f760e01b81526004810182905260240161082e565b600382600381111561117e5761117e611715565b03610ad7576040516335e2f38360e21b81526004810182905260240161082e565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156111d857505f9150600390508261125d565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611229573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661125457505f92506001915082905061125d565b92505f91508190505b9450945094915050565b6001600160a01b038316611291578060025f8282546112869190611729565b909155506113019050565b6001600160a01b0383165f90815260208190526040902054818110156112e35760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161082e565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661131d5760028054829003905561133b565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161138091815260200190565b60405180910390a3505050565b60605f611399836113ca565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156103f757604051632cd44ac360e21b815260040160405180910390fd5b5f60208284031215611401575f5ffd5b81356001600160e01b031981168114610807575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6108076020830184611418565b80356001600160a01b038116811461146e575f5ffd5b919050565b5f5f60408385031215611484575f5ffd5b61148d83611458565b946020939093013593505050565b5f5f5f606084860312156114ad575f5ffd5b6114b684611458565b92506114c460208501611458565b929592945050506040919091013590565b5f602082840312156114e5575f5ffd5b5035919050565b5f5f604083850312156114fd575f5ffd5b8235915061150d60208401611458565b90509250929050565b5f60208284031215611526575f5ffd5b61080782611458565b60ff60f81b8816815260e060208201525f61154d60e0830189611418565b828103604084015261155f8189611418565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156115b4578351835260209384019390920191600101611596565b50909b9a5050505050505050505050565b5f5f5f5f606085870312156115d8575f5ffd5b6115e185611458565b935060208501359250604085013567ffffffffffffffff811115611603575f5ffd5b8501601f81018713611613575f5ffd5b803567ffffffffffffffff811115611629575f5ffd5b87602082840101111561163a575f5ffd5b949793965060200194505050565b5f5f5f5f5f5f5f60e0888a03121561165e575f5ffd5b61166788611458565b965061167560208901611458565b95506040880135945060608801359350608088013560ff81168114611698575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156116c6575f5ffd5b6116cf83611458565b915061150d60208401611458565b600181811c908216806116f157607f821691505b60208210810361170f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b808201808211156103f757634e487b7160e01b5f52601160045260245ffdfea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a264697066735822122091b918cf2c46e7a2c094b0fd8a986f7c26d797d6865d166d3266cd617bdce16964736f6c634300081c003300000000000000000000000000000000000000000000d3c21bcecceda1000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000009466f5220546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003464f520000000000000000000000000000000000000000000000000000000000","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"FoRTokenModule#FoRToken","networkInteractionId":1,"nonce":97,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"FoRTokenModule#FoRToken","networkInteractionId":1,"nonce":97,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1004692"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x8d442ef32cc6556a0c31b63371f2c4d5b5eed35f4c0e25dbf39e268b04693198"},"type":"TRANSACTION_SEND"} +{"artifactId":"RouterFactoryModule#RouterFactory","constructorArgs":[],"contractName":"RouterFactory","dependencies":[],"from":"0x8c713bb047edcc200427f7605e66e0329258dac9","futureId":"RouterFactoryModule#RouterFactory","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"RouterFactoryModule#RouterFactory","networkInteraction":{"data":"0x6080604052348015600e575f5ffd5b506114df8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80635342fa6d14610038578063accc0de914610067575b5f5ffd5b61004b6100463660046102a8565b61007a565b6040516001600160a01b03909116815260200160405180910390f35b61004b6100753660046102a8565b610114565b5f5f6040518060200161008c90610280565b601f1982820381018352601f9091011660408181526001600160a01b038a8116602084015289811682840152881660608301526080820187905260a08083018790528151808403909101815260c083019091526100ec929160e00161031a565b60405160208183030381529060405290506101085f89836101a8565b98975050505050505050565b5f5f6040518060200161012690610280565b601f1982820381018352601f9091011660408181526001600160a01b038a8116602084015289811682840152881660608301526080820187905260a08083018790528151808403909101815260c08301909152610186929160e00161031a565b6040516020818303038152906040529050610108888280519060200120610247565b5f834710156101d75760405163cf47918160e01b81524760048201526024810185905260440160405180910390fd5b81515f036101f857604051631328927760e21b815260040160405180910390fd5b8282516020840186f590503d151981151615610219576040513d5f823e3d81fd5b6001600160a01b0381166102405760405163b06ebf3d60e01b815260040160405180910390fd5b9392505050565b5f6102408383305f604051836040820152846020820152828152600b8101905060ff8153605590206001600160a01b0316949350505050565b6111738061033783390190565b80356001600160a01b03811681146102a3575f5ffd5b919050565b5f5f5f5f5f5f60c087890312156102bd575f5ffd5b863595506102cd6020880161028d565b94506102db6040880161028d565b93506102e96060880161028d565b9598949750929560808101359460a0909101359350915050565b5f81518060208401855e5f93019283525090919050565b5f61032e6103288386610303565b84610303565b94935050505056fe60a060405234801561000f575f5ffd5b5060405161117338038061117383398101604081905261002e91610242565b60016002556001600160a01b03851661008e5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e697469616c2061646d696e206164647265737300000060448201526064015b60405180910390fd5b6001600160a01b0384166100e45760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420746f6b656e206164647265737300000000000000000000006044820152606401610085565b6001600160a01b03848116608052600580546001600160a01b0319169185169190911790556003829055600481905561011d5f8661017e565b506101487f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f8661017e565b506101737f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e08661017e565b505050505050610294565b5f828152602081815260408083206001600160a01b038516845290915281205460ff1661021e575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101d63390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610221565b505f5b92915050565b80516001600160a01b038116811461023d575f5ffd5b919050565b5f5f5f5f5f60a08688031215610256575f5ffd5b61025f86610227565b945061026d60208701610227565b935061027b60408701610227565b6060870151608090970151959894975095949392505050565b608051610eb96102ba5f395f81816102c7015281816105f601526106a30152610eb95ff3fe608060405234801561000f575f5ffd5b5060043610610132575f3560e01c80635c975abb116100b457806391d148541161007957806391d14854146102955780639370131f146102a8578063a217fddf146102bb578063d32482c3146102c2578063d547741f146102e9578063fccc2813146102fc575f5ffd5b80635c975abb1461023b578063605629d614610246578063664a1ad6146102595780638456cb59146102845780638ed648501461028c575f5ffd5b806336568abe116100fa57806336568abe146101f15780633f4ba83a146102045780634dbfe4161461020c5780635192c82c1461021f57806355ce3b9a14610228575f5ffd5b806301ffc9a714610136578063248a9ca31461015e578063253123d71461018e5780632f2ff15d146101b55780632f83a6bc146101ca575b5f5ffd5b610149610144366004610ce4565b610305565b60405190151581526020015b60405180910390f35b61018061016c366004610d12565b5f9081526020819052604090206001015490565b604051908152602001610155565b6101807f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e081565b6101c86101c3366004610d44565b61033b565b005b6101807f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f81565b6101c86101ff366004610d44565b610365565b6101c861039d565b6101c861021a366004610d12565b6103b2565b61018060045481565b6101c8610236366004610d6e565b6104aa565b60015460ff16610149565b6101c8610254366004610d87565b610555565b60055461026c906001600160a01b031681565b6040516001600160a01b039091168152602001610155565b6101c8610983565b61018060035481565b6101496102a3366004610d44565b610995565b6101c86102b6366004610d12565b6109bd565b6101805f81565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6101c86102f7366004610d44565b610a83565b61026c61dead81565b5f6001600160e01b03198216637965db0b60e01b148061033557506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f8281526020819052604090206001015461035581610aa7565b61035f8383610ab1565b50505050565b6001600160a01b038116331461038e5760405163334bd91960e11b815260040160405180910390fd5b6103988282610b40565b505050565b5f6103a781610aa7565b6103af610ba9565b50565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e06103dc81610aa7565b6103e4610bfb565b612710600454836103f59190610e08565b11156104435760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b60448201526064015b60405180910390fd5b600382905560045433907fb55f79fe5ce919308890d69197336bfe5e7ec459de785951879b018086e8ce999084908061047e83612710610e1b565b6104889190610e1b565b6040805193845260208401929092529082015260600160405180910390a25050565b7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f6104d481610aa7565b6104dc610bfb565b6001600160a01b0382166105325760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642066756e642077616c6c657420616464726573730000000000604482015260640161043a565b50600580546001600160a01b0319166001600160a01b0392909216919091179055565b61055d610bfb565b610565610c21565b845f036105855760405163162908e360e11b815260040160405180910390fd5b6001600160a01b0386166105ac57604051634e46966960e11b815260040160405180910390fd5b60405163d505accf60e01b81526001600160a01b038881166004830152306024830152604482018790526064820186905260ff8516608483015260a4820184905260c482018390527f0000000000000000000000000000000000000000000000000000000000000000169063d505accf9060e4015f604051808303815f87803b158015610637575f5ffd5b505af1158015610649573d5f5f3e3d5ffd5b505050505f6127106003548761065f9190610e2e565b6106699190610e45565b90505f6127106004548861067d9190610e2e565b6106879190610e45565b90505f81610695848a610e1b565b61069f9190610e1b565b90507f00000000000000000000000000000000000000000000000000000000000000008315610787576005546040516323b872dd60e01b81526001600160a01b038d81166004830152918216602482015260448101869052908216906323b872dd906064016020604051808303815f875af1158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107449190610e64565b6107875760405162461bcd60e51b8152602060048201526014602482015273119d5b99081d1c985b9cd9995c8819985a5b195960621b604482015260640161043a565b8215610848576040516323b872dd60e01b81526001600160a01b038c8116600483015261dead6024830152604482018590528216906323b872dd906064016020604051808303815f875af11580156107e1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108059190610e64565b6108485760405162461bcd60e51b8152602060048201526014602482015273109d5c9b881d1c985b9cd9995c8819985a5b195960621b604482015260640161043a565b8115610912576040516323b872dd60e01b81526001600160a01b038c811660048301528b81166024830152604482018490528216906323b872dd906064016020604051808303815f875af11580156108a2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c69190610e64565b6109125760405162461bcd60e51b815260206004820152601960248201527f526563697069656e74207472616e73666572206661696c656400000000000000604482015260640161043a565b604080518a815260208101869052908101849052606081018390526001600160a01b03808c1691908d169033907f52f83311e33f533cde58953dc7f433120e12462be7e4b5f2a32c97291fa09a029060800160405180910390a45050505061097a6001600255565b50505050505050565b5f61098d81610aa7565b6103af610c49565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e06109e781610aa7565b6109ef610bfb565b61271082600354610a009190610e08565b1115610a495760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b604482015260640161043a565b600482905560035433907fb55f79fe5ce919308890d69197336bfe5e7ec459de785951879b018086e8ce9990848061047e83612710610e1b565b5f82815260208190526040902060010154610a9d81610aa7565b61035f8383610b40565b6103af8133610c84565b5f610abc8383610995565b610b39575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610af13390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610335565b505f610335565b5f610b4b8383610995565b15610b39575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610335565b610bb1610cc1565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60015460ff1615610c1f5760405163d93c066560e01b815260040160405180910390fd5b565b6002805403610c4357604051633ee5aeb560e01b815260040160405180910390fd5b60028055565b610c51610bfb565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610bde565b610c8e8282610995565b610cbd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161043a565b5050565b60015460ff16610c1f57604051638dfc202b60e01b815260040160405180910390fd5b5f60208284031215610cf4575f5ffd5b81356001600160e01b031981168114610d0b575f5ffd5b9392505050565b5f60208284031215610d22575f5ffd5b5035919050565b80356001600160a01b0381168114610d3f575f5ffd5b919050565b5f5f60408385031215610d55575f5ffd5b82359150610d6560208401610d29565b90509250929050565b5f60208284031215610d7e575f5ffd5b610d0b82610d29565b5f5f5f5f5f5f5f60e0888a031215610d9d575f5ffd5b610da688610d29565b9650610db460208901610d29565b95506040880135945060608801359350608088013560ff81168114610dd7575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561033557610335610df4565b8181038181111561033557610335610df4565b808202811582820484141761033557610335610df4565b5f82610e5f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215610e74575f5ffd5b81518015158114610d0b575f5ffdfea2646970667358221220c1a3aa255a24522bf769c5a901f4208f5b481bf1e34da744c9127d4931fbfa0064736f6c634300081c0033a26469706673582212208cc41a9f27e6ba70a82853079221217d781cf51ddc55d6f3b240df1ef94b5b7564736f6c634300081c0033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"RouterFactoryModule#RouterFactory","networkInteractionId":1,"nonce":98,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"RouterFactoryModule#RouterFactory","networkInteractionId":1,"nonce":98,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1004692"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0xeb719a1c3b68c60d7ea74e756cf3d7d847b7d4d32002c2ef2ee74e14f06fd3a3"},"type":"TRANSACTION_SEND"} +{"futureId":"FoRTokenModule#FoRToken","hash":"0x8d442ef32cc6556a0c31b63371f2c4d5b5eed35f4c0e25dbf39e268b04693198","networkInteractionId":1,"receipt":{"blockHash":"0x6f4e0c09e24ba8ae406aa0206c26ce38ea0ea9165ecf3577dd005151e5ca5acc","blockNumber":10333421,"contractAddress":"0x473beaaDFaA7c7DB856cb1D368a27a238819179A","logs":[{"address":"0x473beaaDFaA7c7DB856cb1D368a27a238819179A","data":"0x00000000000000000000000000000000000000000000d3c21bcecceda1000000","logIndex":360,"topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9"]},{"address":"0x473beaaDFaA7c7DB856cb1D368a27a238819179A","data":"0x","logIndex":361,"topics":["0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9","0x0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9"]},{"address":"0x473beaaDFaA7c7DB856cb1D368a27a238819179A","data":"0x","logIndex":362,"topics":["0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d","0xa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775","0x0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9","0x0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9"]},{"address":"0x473beaaDFaA7c7DB856cb1D368a27a238819179A","data":"0x","logIndex":363,"topics":["0x00e56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d","0x0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"FoRTokenModule#FoRToken","result":{"address":"0x473beaaDFaA7c7DB856cb1D368a27a238819179A","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"RouterFactoryModule#RouterFactory","hash":"0xeb719a1c3b68c60d7ea74e756cf3d7d847b7d4d32002c2ef2ee74e14f06fd3a3","networkInteractionId":1,"receipt":{"blockHash":"0x6f4e0c09e24ba8ae406aa0206c26ce38ea0ea9165ecf3577dd005151e5ca5acc","blockNumber":10333421,"contractAddress":"0xa3b909dAd23d16a2f3B71417847D2cC8698Ce0A4","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"RouterFactoryModule#RouterFactory","result":{"address":"0xa3b909dAd23d16a2f3B71417847D2cC8698Ce0A4","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"args":["0x0000000000000000000000000000000000000000000000000000000000000000","0x8c713bb047edcc200427f7605e66e0329258dac9","0x473beaaDFaA7c7DB856cb1D368a27a238819179A","0x8c713bb047edcc200427f7605e66e0329258dac9",1500,500],"artifactId":"RouterFactoryModule#RouterFactory","contractAddress":"0xa3b909dAd23d16a2f3B71417847D2cC8698Ce0A4","dependencies":["RouterFactoryModule#RouterFactory","FoRTokenModule#FoRToken"],"from":"0x8c713bb047edcc200427f7605e66e0329258dac9","functionName":"deploy","futureId":"RouterModule#RouterFactoryModule~RouterFactory.deploy","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"RouterModule#RouterFactoryModule~RouterFactory.deploy","networkInteraction":{"data":"0x5342fa6d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9000000000000000000000000473beaadfaa7c7db856cb1d368a27a238819179a0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac900000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000001f4","id":1,"to":"0xa3b909dAd23d16a2f3B71417847D2cC8698Ce0A4","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"RouterModule#RouterFactoryModule~RouterFactory.deploy","networkInteractionId":1,"nonce":99,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"RouterModule#RouterFactoryModule~RouterFactory.deploy","networkInteractionId":1,"nonce":99,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1004308"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0xc437b9f8cd21c5b99f934fcae1225f5c570c54e9e6c85566486c816b0388c466"},"type":"TRANSACTION_SEND"} +{"futureId":"RouterModule#RouterFactoryModule~RouterFactory.deploy","hash":"0xc437b9f8cd21c5b99f934fcae1225f5c570c54e9e6c85566486c816b0388c466","networkInteractionId":1,"receipt":{"blockHash":"0xa74fec587a870bd45deb8037aa6bf5ea67a4467d520f41a35d186c4cd5b6f7ac","blockNumber":10333426,"logs":[{"address":"0x53ad3cD165Aff7aBEb6eE14Bd74c5C652eF06a77","data":"0x","logIndex":237,"topics":["0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9","0x000000000000000000000000a3b909dad23d16a2f3b71417847d2cc8698ce0a4"]},{"address":"0x53ad3cD165Aff7aBEb6eE14Bd74c5C652eF06a77","data":"0x","logIndex":238,"topics":["0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d","0x0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f","0x0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9","0x000000000000000000000000a3b909dad23d16a2f3b71417847d2cc8698ce0a4"]},{"address":"0x53ad3cD165Aff7aBEb6eE14Bd74c5C652eF06a77","data":"0x","logIndex":239,"topics":["0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d","0x6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e0","0x0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9","0x000000000000000000000000a3b909dad23d16a2f3b71417847d2cc8698ce0a4"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"RouterModule#RouterFactoryModule~RouterFactory.deploy","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/contract/ignition/deployments/chain-31337/artifacts/FoRTokenModule#FoRToken.json b/packages/contract/ignition/deployments/chain-31337/artifacts/FoRTokenModule#FoRToken.json index 2c3b323..d73a26f 100644 --- a/packages/contract/ignition/deployments/chain-31337/artifacts/FoRTokenModule#FoRToken.json +++ b/packages/contract/ignition/deployments/chain-31337/artifacts/FoRTokenModule#FoRToken.json @@ -24,6 +24,32 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyAllowListed", + "type": "error" + }, { "inputs": [], "name": "ECDSAInvalidSignature", @@ -185,6 +211,27 @@ "name": "InvalidShortString", "type": "error" }, + { + "inputs": [], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "NotAllowListed", + "type": "error" + }, + { + "inputs": [], + "name": "SignatureExpired", + "type": "error" + }, { "inputs": [ { @@ -196,6 +243,32 @@ "name": "StringTooLong", "type": "error" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "AllowListAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "AllowListRemoved", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -227,6 +300,81 @@ "name": "EIP712DomainChanged", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -252,6 +400,45 @@ "name": "Transfer", "type": "event" }, + { + "inputs": [], + "name": "ADD_TO_ALLOWLIST_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "DOMAIN_SEPARATOR", @@ -265,6 +452,42 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "addToAllowList", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "addToAllowListWithSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -388,6 +611,86 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isAllowListed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "name", @@ -463,6 +766,74 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "removeFromAllowList", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "callerConfirmation", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "symbol", @@ -498,7 +869,7 @@ }, { "internalType": "uint256", - "name": "value", + "name": "amount", "type": "uint256" } ], @@ -527,7 +898,7 @@ }, { "internalType": "uint256", - "name": "value", + "name": "amount", "type": "uint256" } ], @@ -543,54 +914,54 @@ "type": "function" } ], - "bytecode": "0x610160604052348015610010575f5ffd5b506040516114ab3803806114ab83398101604081905261002f9161039c565b6040805180820190915260018152603160f81b60208201528290819081846003610059838261048e565b506004610066828261048e565b506100769150839050600561012d565b6101205261008581600661012d565b61014052815160208084019190912060e052815190820120610100524660a05261011160e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c05250610125338461015f565b5050506105bf565b5f602083511015610148576101418361019c565b9050610159565b81610153848261048e565b5060ff90505b92915050565b6001600160a01b03821661018d5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6101985f83836101d9565b5050565b5f5f829050601f815111156101c6578260405163305a27a960e01b81526004016101849190610548565b80516101d18261057d565b179392505050565b6001600160a01b038316610203578060025f8282546101f891906105a0565b909155506102739050565b6001600160a01b0383165f90815260208190526040902054818110156102555760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610184565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661028f576002805482900390556102ad565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516102f291815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610322575f5ffd5b81516001600160401b0381111561033b5761033b6102ff565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610369576103696102ff565b604052818152838201602001851015610380575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f606084860312156103ae575f5ffd5b835160208501519093506001600160401b038111156103cb575f5ffd5b6103d786828701610313565b604086015190935090506001600160401b038111156103f4575f5ffd5b61040086828701610313565b9150509250925092565b600181811c9082168061041e57607f821691505b60208210810361043c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561048957805f5260205f20601f840160051c810160208510156104675750805b601f840160051c820191505b81811015610486575f8155600101610473565b50505b505050565b81516001600160401b038111156104a7576104a76102ff565b6104bb816104b5845461040a565b84610442565b6020601f8211600181146104ed575f83156104d65750848201515b5f19600385901b1c1916600184901b178455610486565b5f84815260208120601f198516915b8281101561051c57878501518255602094850194600190920191016104fc565b508482101561053957868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561043c575f1960209190910360031b1b16919050565b8082018082111561015957634e487b7160e01b5f52601160045260245ffd5b60805160a05160c05160e051610100516101205161014051610e9b6106105f395f6106e201525f6106b501525f61065e01525f61063601525f61059101525f6105bb01525f6105e50152610e9b5ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c806370a082311161008857806395d89b411161006357806395d89b41146101a2578063a9059cbb146101aa578063d505accf146101bd578063dd62ed3e146101d2575f5ffd5b806370a082311461014c5780637ecebe001461017457806384b0196e14610187575f5ffd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce567146101355780633644e51514610144575b5f5ffd5b6100d761020a565b6040516100e49190610c17565b60405180910390f35b6101006100fb366004610c4b565b61029a565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b610100610130366004610c73565b6102b3565b604051601281526020016100e4565b6101146102d6565b61011461015a366004610cad565b6001600160a01b03165f9081526020819052604090205490565b610114610182366004610cad565b6102e4565b61018f610301565b6040516100e49796959493929190610cc6565b6100d7610343565b6101006101b8366004610c4b565b610352565b6101d06101cb366004610d5c565b61035f565b005b6101146101e0366004610dc9565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021990610dfa565b80601f016020809104026020016040519081016040528092919081815260200182805461024590610dfa565b80156102905780601f1061026757610100808354040283529160200191610290565b820191905f5260205f20905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b5f336102a781858561049a565b60019150505b92915050565b5f336102c08582856104ac565b6102cb858585610528565b506001949350505050565b5f6102df610585565b905090565b6001600160a01b0381165f908152600760205260408120546102ad565b5f6060805f5f5f60606103126106ae565b61031a6106db565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60606004805461021990610dfa565b5f336102a7818585610528565b834211156103885760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886103d38c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61042d82610708565b90505f61043c82878787610734565b9050896001600160a01b0316816001600160a01b031614610483576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161037f565b61048e8a8a8a61049a565b50505050505050505050565b6104a78383836001610760565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811015610522578181101561051457604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161037f565b61052284848484035f610760565b50505050565b6001600160a01b03831661055157604051634b637e8f60e11b81525f600482015260240161037f565b6001600160a01b03821661057a5760405163ec442f0560e01b81525f600482015260240161037f565b6104a7838383610832565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156105dd57507f000000000000000000000000000000000000000000000000000000000000000046145b1561060757507f000000000000000000000000000000000000000000000000000000000000000090565b6102df604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60606102df7f00000000000000000000000000000000000000000000000000000000000000006005610958565b60606102df7f00000000000000000000000000000000000000000000000000000000000000006006610958565b5f6102ad610714610585565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f61074488888888610a01565b9250925092506107548282610ac9565b50909695505050505050565b6001600160a01b0384166107895760405163e602df0560e01b81525f600482015260240161037f565b6001600160a01b0383166107b257604051634a1406b160e11b81525f600482015260240161037f565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561052257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161082491815260200190565b60405180910390a350505050565b6001600160a01b03831661085c578060025f8282546108519190610e32565b909155506108cc9050565b6001600160a01b0383165f90815260208190526040902054818110156108ae5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161037f565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166108e857600280548290039055610906565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161094b91815260200190565b60405180910390a3505050565b606060ff83146109725761096b83610b85565b90506102ad565b81805461097e90610dfa565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa90610dfa565b80156109f55780601f106109cc576101008083540402835291602001916109f5565b820191905f5260205f20905b8154815290600101906020018083116109d857829003601f168201915b505050505090506102ad565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610a3a57505f91506003905082610abf565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610a8b573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610ab657505f925060019150829050610abf565b92505f91508190505b9450945094915050565b5f826003811115610adc57610adc610e51565b03610ae5575050565b6001826003811115610af957610af9610e51565b03610b175760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610b2b57610b2b610e51565b03610b4c5760405163fce698f760e01b81526004810182905260240161037f565b6003826003811115610b6057610b60610e51565b03610b81576040516335e2f38360e21b81526004810182905260240161037f565b5050565b60605f610b9183610bc2565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156102ad57604051632cd44ac360e21b815260040160405180910390fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c296020830184610be9565b9392505050565b80356001600160a01b0381168114610c46575f5ffd5b919050565b5f5f60408385031215610c5c575f5ffd5b610c6583610c30565b946020939093013593505050565b5f5f5f60608486031215610c85575f5ffd5b610c8e84610c30565b9250610c9c60208501610c30565b929592945050506040919091013590565b5f60208284031215610cbd575f5ffd5b610c2982610c30565b60ff60f81b8816815260e060208201525f610ce460e0830189610be9565b8281036040840152610cf68189610be9565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015610d4b578351835260209384019390920191600101610d2d565b50909b9a5050505050505050505050565b5f5f5f5f5f5f5f60e0888a031215610d72575f5ffd5b610d7b88610c30565b9650610d8960208901610c30565b95506040880135945060608801359350608088013560ff81168114610dac575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610dda575f5ffd5b610de383610c30565b9150610df160208401610c30565b90509250929050565b600181811c90821680610e0e57607f821691505b602082108103610e2c57634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102ad57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220959b3b2b2a1a1fda4804796a9c642499d98ab4c6794ec7a8593445a1903c44a964736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c806370a082311161008857806395d89b411161006357806395d89b41146101a2578063a9059cbb146101aa578063d505accf146101bd578063dd62ed3e146101d2575f5ffd5b806370a082311461014c5780637ecebe001461017457806384b0196e14610187575f5ffd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce567146101355780633644e51514610144575b5f5ffd5b6100d761020a565b6040516100e49190610c17565b60405180910390f35b6101006100fb366004610c4b565b61029a565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b610100610130366004610c73565b6102b3565b604051601281526020016100e4565b6101146102d6565b61011461015a366004610cad565b6001600160a01b03165f9081526020819052604090205490565b610114610182366004610cad565b6102e4565b61018f610301565b6040516100e49796959493929190610cc6565b6100d7610343565b6101006101b8366004610c4b565b610352565b6101d06101cb366004610d5c565b61035f565b005b6101146101e0366004610dc9565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021990610dfa565b80601f016020809104026020016040519081016040528092919081815260200182805461024590610dfa565b80156102905780601f1061026757610100808354040283529160200191610290565b820191905f5260205f20905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b5f336102a781858561049a565b60019150505b92915050565b5f336102c08582856104ac565b6102cb858585610528565b506001949350505050565b5f6102df610585565b905090565b6001600160a01b0381165f908152600760205260408120546102ad565b5f6060805f5f5f60606103126106ae565b61031a6106db565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60606004805461021990610dfa565b5f336102a7818585610528565b834211156103885760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886103d38c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61042d82610708565b90505f61043c82878787610734565b9050896001600160a01b0316816001600160a01b031614610483576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161037f565b61048e8a8a8a61049a565b50505050505050505050565b6104a78383836001610760565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811015610522578181101561051457604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161037f565b61052284848484035f610760565b50505050565b6001600160a01b03831661055157604051634b637e8f60e11b81525f600482015260240161037f565b6001600160a01b03821661057a5760405163ec442f0560e01b81525f600482015260240161037f565b6104a7838383610832565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156105dd57507f000000000000000000000000000000000000000000000000000000000000000046145b1561060757507f000000000000000000000000000000000000000000000000000000000000000090565b6102df604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60606102df7f00000000000000000000000000000000000000000000000000000000000000006005610958565b60606102df7f00000000000000000000000000000000000000000000000000000000000000006006610958565b5f6102ad610714610585565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f61074488888888610a01565b9250925092506107548282610ac9565b50909695505050505050565b6001600160a01b0384166107895760405163e602df0560e01b81525f600482015260240161037f565b6001600160a01b0383166107b257604051634a1406b160e11b81525f600482015260240161037f565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561052257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161082491815260200190565b60405180910390a350505050565b6001600160a01b03831661085c578060025f8282546108519190610e32565b909155506108cc9050565b6001600160a01b0383165f90815260208190526040902054818110156108ae5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161037f565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166108e857600280548290039055610906565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161094b91815260200190565b60405180910390a3505050565b606060ff83146109725761096b83610b85565b90506102ad565b81805461097e90610dfa565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa90610dfa565b80156109f55780601f106109cc576101008083540402835291602001916109f5565b820191905f5260205f20905b8154815290600101906020018083116109d857829003601f168201915b505050505090506102ad565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610a3a57505f91506003905082610abf565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610a8b573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610ab657505f925060019150829050610abf565b92505f91508190505b9450945094915050565b5f826003811115610adc57610adc610e51565b03610ae5575050565b6001826003811115610af957610af9610e51565b03610b175760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610b2b57610b2b610e51565b03610b4c5760405163fce698f760e01b81526004810182905260240161037f565b6003826003811115610b6057610b60610e51565b03610b81576040516335e2f38360e21b81526004810182905260240161037f565b5050565b60605f610b9183610bc2565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156102ad57604051632cd44ac360e21b815260040160405180910390fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c296020830184610be9565b9392505050565b80356001600160a01b0381168114610c46575f5ffd5b919050565b5f5f60408385031215610c5c575f5ffd5b610c6583610c30565b946020939093013593505050565b5f5f5f60608486031215610c85575f5ffd5b610c8e84610c30565b9250610c9c60208501610c30565b929592945050506040919091013590565b5f60208284031215610cbd575f5ffd5b610c2982610c30565b60ff60f81b8816815260e060208201525f610ce460e0830189610be9565b8281036040840152610cf68189610be9565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015610d4b578351835260209384019390920191600101610d2d565b50909b9a5050505050505050505050565b5f5f5f5f5f5f5f60e0888a031215610d72575f5ffd5b610d7b88610c30565b9650610d8960208901610c30565b95506040880135945060608801359350608088013560ff81168114610dac575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610dda575f5ffd5b610de383610c30565b9150610df160208401610c30565b90509250929050565b600181811c90821680610e0e57607f821691505b602082108103610e2c57634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102ad57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220959b3b2b2a1a1fda4804796a9c642499d98ab4c6794ec7a8593445a1903c44a964736f6c634300081c0033", + "bytecode": "0x610160604052348015610010575f5ffd5b50604051611ecd380380611ecd83398101604081905261002f916104bb565b6040805180820190915260018152603160f81b6020820152829081908184600361005983826105ad565b50600461006682826105ad565b50610076915083905060056101a1565b610120526100858160066101a1565b61014052815160208084019190912060e052815190820120610100524660a05261011160e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0525061012533846101d3565b61012f5f33610210565b5061015a7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610210565b50335f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a25050506106de565b5f6020835110156101bc576101b5836102bb565b90506101cd565b816101c784826105ad565b5060ff90505b92915050565b6001600160a01b0382166102015760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b61020c5f83836102f8565b5050565b5f8281526008602090815260408083206001600160a01b038516845290915281205460ff166102b4575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff1916600117905561026c3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101cd565b505f6101cd565b5f5f829050601f815111156102e5578260405163305a27a960e01b81526004016101f89190610667565b80516102f08261069c565b179392505050565b6001600160a01b038316610322578060025f82825461031791906106bf565b909155506103929050565b6001600160a01b0383165f90815260208190526040902054818110156103745760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016101f8565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166103ae576002805482900390556103cc565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161041191815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610441575f5ffd5b81516001600160401b0381111561045a5761045a61041e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156104885761048861041e565b60405281815283820160200185101561049f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f606084860312156104cd575f5ffd5b835160208501519093506001600160401b038111156104ea575f5ffd5b6104f686828701610432565b604086015190935090506001600160401b03811115610513575f5ffd5b61051f86828701610432565b9150509250925092565b600181811c9082168061053d57607f821691505b60208210810361055b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156105a857805f5260205f20601f840160051c810160208510156105865750805b601f840160051c820191505b818110156105a5575f8155600101610592565b50505b505050565b81516001600160401b038111156105c6576105c661041e565b6105da816105d48454610529565b84610561565b6020601f82116001811461060c575f83156105f55750848201515b5f19600385901b1c1916600184901b1784556105a5565b5f84815260208120601f198516915b8281101561063b578785015182556020948501946001909201910161061b565b508482101561065857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561055b575f1960209190910360031b1b16919050565b808201808211156101cd57634e487b7160e01b5f52601160045260245ffd5b60805160a05160c05160e05161010051610120516101405161179e61072f5f395f610d6401525f610d3701525f610c7501525f610c4d01525f610ba801525f610bd201525f610bfc015261179e5ff3fe608060405234801561000f575f5ffd5b5060043610610187575f3560e01c806370dd8d2e116100d957806395d89b4111610093578063d505accf1161006e578063d505accf1461037c578063d547741f1461038f578063dd62ed3e146103a2578063eba8dabc146103da575f5ffd5b806395d89b411461035a578063a217fddf14610362578063a9059cbb14610369575f5ffd5b806370dd8d2e146102c757806375b238fc146102f25780637ecebe001461030657806384b0196e146103195780638d33420a1461033457806391d1485414610347575f5ffd5b8063248a9ca31161014457806331f591021161011f57806331f59102146102715780633644e5151461028457806336568abe1461028c57806370a082311461029f575f5ffd5b8063248a9ca31461022b5780632f2ff15d1461024d578063313ce56714610262575f5ffd5b806301ffc9a71461018b57806306fdde03146101b3578063095ea7b3146101c8578063180cbefc146101db57806318160ddd1461021057806323b872dd14610218575b5f5ffd5b61019e6101993660046113f1565b6103ed565b60405190151581526020015b60405180910390f35b6101bb6103fd565b6040516101aa9190611446565b61019e6101d6366004611473565b61048d565b6102027f27635d090072063300e62545cc2f6a7dc583162c8abe1f7a7e48e152b6be1d2281565b6040519081526020016101aa565b600254610202565b61019e61022636600461149b565b6104a4565b6102026102393660046114d5565b5f9081526008602052604090206001015490565b61026061025b3660046114ec565b6104c2565b005b604051601281526020016101aa565b61026061027f366004611516565b6104ec565b610202610587565b61026061029a3660046114ec565b610595565b6102026102ad366004611516565b6001600160a01b03165f9081526020819052604090205490565b61019e6102d5366004611516565b6001600160a01b03165f9081526009602052604090205460ff1690565b6102025f5160206117495f395f51905f5281565b610202610314366004611516565b6105cd565b6103216105ea565b6040516101aa979695949392919061152f565b6102606103423660046115c5565b61062c565b61019e6103553660046114ec565b6107b9565b6101bb6107e3565b6102025f81565b61019e610377366004611473565b6107f2565b61026061038a366004611648565b61080e565b61026061039d3660046114ec565b610949565b6102026103b03660046116b5565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6102606103e8366004611516565b61096d565b5f6103f782610a10565b92915050565b60606003805461040c906116dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610438906116dd565b80156104835780601f1061045a57610100808354040283529160200191610483565b820191905f5260205f20905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b5f3361049a818585610a44565b5060019392505050565b5f6104af8484610a51565b6104ba848484610adb565b949350505050565b5f828152600860205260409020600101546104dc81610afe565b6104e68383610b0b565b50505050565b5f5160206117495f395f51905f5261050381610afe565b6001600160a01b0382165f9081526009602052604090205460ff161561053c57604051632a240d9f60e11b815260040160405180910390fd5b6001600160a01b0382165f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a25050565b5f610590610b9c565b905090565b6001600160a01b03811633146105be5760405163334bd91960e11b815260040160405180910390fd5b6105c88282610cc5565b505050565b6001600160a01b0381165f908152600760205260408120546103f7565b5f6060805f5f5f60606105fb610d30565b610603610d5d565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b8242111561064d57604051630819bdcd60e01b815260040160405180910390fd5b6001600160a01b0384165f9081526009602052604090205460ff161561068657604051632a240d9f60e11b815260040160405180910390fd5b604080517f27635d090072063300e62545cc2f6a7dc583162c8abe1f7a7e48e152b6be1d2260208201526001600160a01b03861691810191909152606081018490525f906080016040516020818303038152906040528051906020012090505f6106ef82610d8a565b90505f61073385858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508693925050610db69050565b905061074c5f5160206117495f395f51905f52826107b9565b61076957604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0387165f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a250505050505050565b5f9182526008602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461040c906116dd565b5f6107fd3384610a51565b6108078383610dde565b9392505050565b834211156108375760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108828c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108dc82610d8a565b90505f6108eb82878787610deb565b9050896001600160a01b0316816001600160a01b031614610932576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161082e565b61093d8a8a8a610a44565b50505050505050505050565b5f8281526008602052604090206001015461096381610afe565b6104e68383610cc5565b5f5160206117495f395f51905f5261098481610afe565b6001600160a01b0382165f9081526009602052604090205460ff166109c757604051635bb897bf60e11b81526001600160a01b038316600482015260240161082e565b6001600160a01b0382165f81815260096020526040808220805460ff19169055517fe7fc45e1e6a61a6d67e182d4847f8c2dcde282d7008410c1bc3a7e8fa299eb909190a25050565b5f6001600160e01b03198216637965db0b60e01b14806103f757506301ffc9a760e01b6001600160e01b03198316146103f7565b6105c88383836001610e17565b6001600160a01b0382165f9081526009602052604090205460ff16610a9457604051635bb897bf60e11b81526001600160a01b038316600482015260240161082e565b6001600160a01b0381165f9081526009602052604090205460ff16610ad757604051635bb897bf60e11b81526001600160a01b038216600482015260240161082e565b5050565b5f33610ae8858285610ee9565b610af3858585610f5f565b506001949350505050565b610b088133610fbc565b50565b5f610b1683836107b9565b610b95575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff19166001179055610b4d3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016103f7565b505f6103f7565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610bf457507f000000000000000000000000000000000000000000000000000000000000000046145b15610c1e57507f000000000000000000000000000000000000000000000000000000000000000090565b610590604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f610cd083836107b9565b15610b95575f8381526008602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016103f7565b60606105907f00000000000000000000000000000000000000000000000000000000000000006005610ff5565b60606105907f00000000000000000000000000000000000000000000000000000000000000006006610ff5565b5f6103f7610d96610b9c565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f610dc4868661109e565b925092509250610dd482826110e7565b5090949350505050565b5f3361049a818585610f5f565b5f5f5f5f610dfb8888888861119f565b925092509250610e0b82826110e7565b50909695505050505050565b6001600160a01b038416610e405760405163e602df0560e01b81525f600482015260240161082e565b6001600160a01b038316610e6957604051634a1406b160e11b81525f600482015260240161082e565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156104e657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610edb91815260200190565b60405180910390a350505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156104e65781811015610f5157604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161082e565b6104e684848484035f610e17565b6001600160a01b038316610f8857604051634b637e8f60e11b81525f600482015260240161082e565b6001600160a01b038216610fb15760405163ec442f0560e01b81525f600482015260240161082e565b6105c8838383611267565b610fc682826107b9565b610ad75760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161082e565b606060ff831461100f576110088361138d565b90506103f7565b81805461101b906116dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611047906116dd565b80156110925780601f1061106957610100808354040283529160200191611092565b820191905f5260205f20905b81548152906001019060200180831161107557829003601f168201915b505050505090506103f7565b5f5f5f83516041036110d5576020840151604085015160608601515f1a6110c78882858561119f565b9550955095505050506110e0565b505081515f91506002905b9250925092565b5f8260038111156110fa576110fa611715565b03611103575050565b600182600381111561111757611117611715565b036111355760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561114957611149611715565b0361116a5760405163fce698f760e01b81526004810182905260240161082e565b600382600381111561117e5761117e611715565b03610ad7576040516335e2f38360e21b81526004810182905260240161082e565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156111d857505f9150600390508261125d565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611229573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661125457505f92506001915082905061125d565b92505f91508190505b9450945094915050565b6001600160a01b038316611291578060025f8282546112869190611729565b909155506113019050565b6001600160a01b0383165f90815260208190526040902054818110156112e35760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161082e565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661131d5760028054829003905561133b565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161138091815260200190565b60405180910390a3505050565b60605f611399836113ca565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156103f757604051632cd44ac360e21b815260040160405180910390fd5b5f60208284031215611401575f5ffd5b81356001600160e01b031981168114610807575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6108076020830184611418565b80356001600160a01b038116811461146e575f5ffd5b919050565b5f5f60408385031215611484575f5ffd5b61148d83611458565b946020939093013593505050565b5f5f5f606084860312156114ad575f5ffd5b6114b684611458565b92506114c460208501611458565b929592945050506040919091013590565b5f602082840312156114e5575f5ffd5b5035919050565b5f5f604083850312156114fd575f5ffd5b8235915061150d60208401611458565b90509250929050565b5f60208284031215611526575f5ffd5b61080782611458565b60ff60f81b8816815260e060208201525f61154d60e0830189611418565b828103604084015261155f8189611418565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156115b4578351835260209384019390920191600101611596565b50909b9a5050505050505050505050565b5f5f5f5f606085870312156115d8575f5ffd5b6115e185611458565b935060208501359250604085013567ffffffffffffffff811115611603575f5ffd5b8501601f81018713611613575f5ffd5b803567ffffffffffffffff811115611629575f5ffd5b87602082840101111561163a575f5ffd5b949793965060200194505050565b5f5f5f5f5f5f5f60e0888a03121561165e575f5ffd5b61166788611458565b965061167560208901611458565b95506040880135945060608801359350608088013560ff81168114611698575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156116c6575f5ffd5b6116cf83611458565b915061150d60208401611458565b600181811c908216806116f157607f821691505b60208210810361170f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b808201808211156103f757634e487b7160e01b5f52601160045260245ffdfea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a264697066735822122091b918cf2c46e7a2c094b0fd8a986f7c26d797d6865d166d3266cd617bdce16964736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610187575f3560e01c806370dd8d2e116100d957806395d89b4111610093578063d505accf1161006e578063d505accf1461037c578063d547741f1461038f578063dd62ed3e146103a2578063eba8dabc146103da575f5ffd5b806395d89b411461035a578063a217fddf14610362578063a9059cbb14610369575f5ffd5b806370dd8d2e146102c757806375b238fc146102f25780637ecebe001461030657806384b0196e146103195780638d33420a1461033457806391d1485414610347575f5ffd5b8063248a9ca31161014457806331f591021161011f57806331f59102146102715780633644e5151461028457806336568abe1461028c57806370a082311461029f575f5ffd5b8063248a9ca31461022b5780632f2ff15d1461024d578063313ce56714610262575f5ffd5b806301ffc9a71461018b57806306fdde03146101b3578063095ea7b3146101c8578063180cbefc146101db57806318160ddd1461021057806323b872dd14610218575b5f5ffd5b61019e6101993660046113f1565b6103ed565b60405190151581526020015b60405180910390f35b6101bb6103fd565b6040516101aa9190611446565b61019e6101d6366004611473565b61048d565b6102027f27635d090072063300e62545cc2f6a7dc583162c8abe1f7a7e48e152b6be1d2281565b6040519081526020016101aa565b600254610202565b61019e61022636600461149b565b6104a4565b6102026102393660046114d5565b5f9081526008602052604090206001015490565b61026061025b3660046114ec565b6104c2565b005b604051601281526020016101aa565b61026061027f366004611516565b6104ec565b610202610587565b61026061029a3660046114ec565b610595565b6102026102ad366004611516565b6001600160a01b03165f9081526020819052604090205490565b61019e6102d5366004611516565b6001600160a01b03165f9081526009602052604090205460ff1690565b6102025f5160206117495f395f51905f5281565b610202610314366004611516565b6105cd565b6103216105ea565b6040516101aa979695949392919061152f565b6102606103423660046115c5565b61062c565b61019e6103553660046114ec565b6107b9565b6101bb6107e3565b6102025f81565b61019e610377366004611473565b6107f2565b61026061038a366004611648565b61080e565b61026061039d3660046114ec565b610949565b6102026103b03660046116b5565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6102606103e8366004611516565b61096d565b5f6103f782610a10565b92915050565b60606003805461040c906116dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610438906116dd565b80156104835780601f1061045a57610100808354040283529160200191610483565b820191905f5260205f20905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b5f3361049a818585610a44565b5060019392505050565b5f6104af8484610a51565b6104ba848484610adb565b949350505050565b5f828152600860205260409020600101546104dc81610afe565b6104e68383610b0b565b50505050565b5f5160206117495f395f51905f5261050381610afe565b6001600160a01b0382165f9081526009602052604090205460ff161561053c57604051632a240d9f60e11b815260040160405180910390fd5b6001600160a01b0382165f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a25050565b5f610590610b9c565b905090565b6001600160a01b03811633146105be5760405163334bd91960e11b815260040160405180910390fd5b6105c88282610cc5565b505050565b6001600160a01b0381165f908152600760205260408120546103f7565b5f6060805f5f5f60606105fb610d30565b610603610d5d565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b8242111561064d57604051630819bdcd60e01b815260040160405180910390fd5b6001600160a01b0384165f9081526009602052604090205460ff161561068657604051632a240d9f60e11b815260040160405180910390fd5b604080517f27635d090072063300e62545cc2f6a7dc583162c8abe1f7a7e48e152b6be1d2260208201526001600160a01b03861691810191909152606081018490525f906080016040516020818303038152906040528051906020012090505f6106ef82610d8a565b90505f61073385858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508693925050610db69050565b905061074c5f5160206117495f395f51905f52826107b9565b61076957604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0387165f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a250505050505050565b5f9182526008602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461040c906116dd565b5f6107fd3384610a51565b6108078383610dde565b9392505050565b834211156108375760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108828c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108dc82610d8a565b90505f6108eb82878787610deb565b9050896001600160a01b0316816001600160a01b031614610932576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161082e565b61093d8a8a8a610a44565b50505050505050505050565b5f8281526008602052604090206001015461096381610afe565b6104e68383610cc5565b5f5160206117495f395f51905f5261098481610afe565b6001600160a01b0382165f9081526009602052604090205460ff166109c757604051635bb897bf60e11b81526001600160a01b038316600482015260240161082e565b6001600160a01b0382165f81815260096020526040808220805460ff19169055517fe7fc45e1e6a61a6d67e182d4847f8c2dcde282d7008410c1bc3a7e8fa299eb909190a25050565b5f6001600160e01b03198216637965db0b60e01b14806103f757506301ffc9a760e01b6001600160e01b03198316146103f7565b6105c88383836001610e17565b6001600160a01b0382165f9081526009602052604090205460ff16610a9457604051635bb897bf60e11b81526001600160a01b038316600482015260240161082e565b6001600160a01b0381165f9081526009602052604090205460ff16610ad757604051635bb897bf60e11b81526001600160a01b038216600482015260240161082e565b5050565b5f33610ae8858285610ee9565b610af3858585610f5f565b506001949350505050565b610b088133610fbc565b50565b5f610b1683836107b9565b610b95575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff19166001179055610b4d3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016103f7565b505f6103f7565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610bf457507f000000000000000000000000000000000000000000000000000000000000000046145b15610c1e57507f000000000000000000000000000000000000000000000000000000000000000090565b610590604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f610cd083836107b9565b15610b95575f8381526008602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016103f7565b60606105907f00000000000000000000000000000000000000000000000000000000000000006005610ff5565b60606105907f00000000000000000000000000000000000000000000000000000000000000006006610ff5565b5f6103f7610d96610b9c565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f610dc4868661109e565b925092509250610dd482826110e7565b5090949350505050565b5f3361049a818585610f5f565b5f5f5f5f610dfb8888888861119f565b925092509250610e0b82826110e7565b50909695505050505050565b6001600160a01b038416610e405760405163e602df0560e01b81525f600482015260240161082e565b6001600160a01b038316610e6957604051634a1406b160e11b81525f600482015260240161082e565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156104e657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610edb91815260200190565b60405180910390a350505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156104e65781811015610f5157604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161082e565b6104e684848484035f610e17565b6001600160a01b038316610f8857604051634b637e8f60e11b81525f600482015260240161082e565b6001600160a01b038216610fb15760405163ec442f0560e01b81525f600482015260240161082e565b6105c8838383611267565b610fc682826107b9565b610ad75760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161082e565b606060ff831461100f576110088361138d565b90506103f7565b81805461101b906116dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611047906116dd565b80156110925780601f1061106957610100808354040283529160200191611092565b820191905f5260205f20905b81548152906001019060200180831161107557829003601f168201915b505050505090506103f7565b5f5f5f83516041036110d5576020840151604085015160608601515f1a6110c78882858561119f565b9550955095505050506110e0565b505081515f91506002905b9250925092565b5f8260038111156110fa576110fa611715565b03611103575050565b600182600381111561111757611117611715565b036111355760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561114957611149611715565b0361116a5760405163fce698f760e01b81526004810182905260240161082e565b600382600381111561117e5761117e611715565b03610ad7576040516335e2f38360e21b81526004810182905260240161082e565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156111d857505f9150600390508261125d565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611229573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661125457505f92506001915082905061125d565b92505f91508190505b9450945094915050565b6001600160a01b038316611291578060025f8282546112869190611729565b909155506113019050565b6001600160a01b0383165f90815260208190526040902054818110156112e35760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161082e565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661131d5760028054829003905561133b565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161138091815260200190565b60405180910390a3505050565b60605f611399836113ca565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156103f757604051632cd44ac360e21b815260040160405180910390fd5b5f60208284031215611401575f5ffd5b81356001600160e01b031981168114610807575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6108076020830184611418565b80356001600160a01b038116811461146e575f5ffd5b919050565b5f5f60408385031215611484575f5ffd5b61148d83611458565b946020939093013593505050565b5f5f5f606084860312156114ad575f5ffd5b6114b684611458565b92506114c460208501611458565b929592945050506040919091013590565b5f602082840312156114e5575f5ffd5b5035919050565b5f5f604083850312156114fd575f5ffd5b8235915061150d60208401611458565b90509250929050565b5f60208284031215611526575f5ffd5b61080782611458565b60ff60f81b8816815260e060208201525f61154d60e0830189611418565b828103604084015261155f8189611418565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156115b4578351835260209384019390920191600101611596565b50909b9a5050505050505050505050565b5f5f5f5f606085870312156115d8575f5ffd5b6115e185611458565b935060208501359250604085013567ffffffffffffffff811115611603575f5ffd5b8501601f81018713611613575f5ffd5b803567ffffffffffffffff811115611629575f5ffd5b87602082840101111561163a575f5ffd5b949793965060200194505050565b5f5f5f5f5f5f5f60e0888a03121561165e575f5ffd5b61166788611458565b965061167560208901611458565b95506040880135945060608801359350608088013560ff81168114611698575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156116c6575f5ffd5b6116cf83611458565b915061150d60208401611458565b600181811c908216806116f157607f821691505b60208210810361170f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b808201808211156103f757634e487b7160e01b5f52601160045260245ffdfea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a264697066735822122091b918cf2c46e7a2c094b0fd8a986f7c26d797d6865d166d3266cd617bdce16964736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {}, "immutableReferences": { - "3232": [ + "3612": [ { "length": 32, - "start": 1509 + "start": 3068 } ], - "3234": [ + "3614": [ { "length": 32, - "start": 1467 + "start": 3026 } ], - "3236": [ + "3616": [ { "length": 32, - "start": 1425 + "start": 2984 } ], - "3238": [ + "3618": [ { "length": 32, - "start": 1590 + "start": 3149 } ], - "3240": [ + "3620": [ { "length": 32, - "start": 1630 + "start": 3189 } ], - "3243": [ + "3623": [ { "length": 32, - "start": 1717 + "start": 3383 } ], - "3246": [ + "3626": [ { "length": 32, - "start": 1762 + "start": 3428 } ] }, "inputSourceName": "project/contracts/FoRToken.sol", - "buildInfoId": "solc-0_8_28-40227ca68470cf204db0488311108091c535c8e2" + "buildInfoId": "solc-0_8_28-5aa01ff243ad5b208267044bfe0ef66e032fad37" } \ No newline at end of file diff --git a/packages/contract/ignition/deployments/chain-31337/artifacts/RouterFactoryModule#RouterFactory.json b/packages/contract/ignition/deployments/chain-31337/artifacts/RouterFactoryModule#RouterFactory.json index fb3a30a..3e9eaa1 100644 --- a/packages/contract/ignition/deployments/chain-31337/artifacts/RouterFactoryModule#RouterFactory.json +++ b/packages/contract/ignition/deployments/chain-31337/artifacts/RouterFactoryModule#RouterFactory.json @@ -36,6 +36,16 @@ "name": "_salt", "type": "bytes32" }, + { + "internalType": "address", + "name": "_initialAdmin", + "type": "address" + }, + { + "internalType": "address", + "name": "_forToken", + "type": "address" + }, { "internalType": "address", "name": "_fundWallet", @@ -70,6 +80,16 @@ "name": "_salt", "type": "bytes32" }, + { + "internalType": "address", + "name": "_initialAdmin", + "type": "address" + }, + { + "internalType": "address", + "name": "_forToken", + "type": "address" + }, { "internalType": "address", "name": "_fundWallet", @@ -98,11 +118,11 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600e575f5ffd5b50610c288061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c806398f3e1ed14610038578063b852a47a14610067575b5f5ffd5b61004b610046366004610272565b61007a565b6040516001600160a01b03909116815260200160405180910390f35b61004b610075366004610272565b610109565b5f5f6040518060200161008c90610265565b601f1982820381018352601f9091011660408181526001600160a01b038816602083015281018690526060810185905260800160408051601f19818403018152908290526100dd92916020016102ce565b60405160208183030381529060405290506100ff868280519060200120610188565b9695505050505050565b5f5f6040518060200161011b90610265565b601f1982820381018352601f9091011660408181526001600160a01b038816602083015281018690526060810185905260800160408051601f198184030181529082905261016c92916020016102ce565b60405160208183030381529060405290506100ff5f878361019b565b5f610194838330610233565b9392505050565b5f834710156101ca5760405163cf47918160e01b81524760048201526024810185905260440160405180910390fd5b81515f036101eb57604051631328927760e21b815260040160405180910390fd5b8282516020840186f590503d15198115161561020c576040513d5f823e3d81fd5b6001600160a01b0381166101945760405163b06ebf3d60e01b815260040160405180910390fd5b5f604051836040820152846020820152828152600b8101905060ff8153605590206001600160a01b0316949350505050565b610908806102eb83390190565b5f5f5f5f60808587031215610285575f5ffd5b8435935060208501356001600160a01b03811681146102a2575f5ffd5b93969395505050506040820135916060013590565b5f81518060208401855e5f93019283525090919050565b5f6102e26102dc83866102b7565b846102b7565b94935050505056fe608060405234801561000f575f5ffd5b5060405161090838038061090883398101604081905261002e9161016b565b600380546001600160a01b0319166001600160a01b038516179055600182905560028190556100635f61005e3390565b6100c2565b5061008e7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f336100c2565b506100b97f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e0336100c2565b505050506101aa565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16610162575f838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561011a3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610165565b505f5b92915050565b5f5f5f6060848603121561017d575f5ffd5b83516001600160a01b0381168114610193575f5ffd5b602085015160409095015190969495509392505050565b610751806101b75f395ff3fe608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c806355ce3b9a116100935780639370131f116100635780639370131f14610243578063a217fddf14610256578063d547741f1461025d578063fccc281314610270575f5ffd5b806355ce3b9a146101e9578063664a1ad6146101fc5780638ed648501461022757806391d1485414610230575f5ffd5b80632f83a6bc116100ce5780632f83a6bc1461019357806336568abe146101ba5780634dbfe416146101cd5780635192c82c146101e0575f5ffd5b806301ffc9a7146100ff578063248a9ca314610127578063253123d7146101575780632f2ff15d1461017e575b5f5ffd5b61011261010d366004610659565b610277565b60405190151581526020015b60405180910390f35b610149610135366004610687565b5f9081526020819052604090206001015490565b60405190815260200161011e565b6101497f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e081565b61019161018c3660046106b9565b6102ad565b005b6101497f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f81565b6101916101c83660046106b9565b6102d7565b6101916101db366004610687565b61030f565b61014960025481565b6101916101f73660046106e3565b61039e565b60035461020f906001600160a01b031681565b6040516001600160a01b03909116815260200161011e565b61014960015481565b61011261023e3660046106b9565b610441565b610191610251366004610687565b610469565b6101495f81565b61019161026b3660046106b9565b6104f3565b61020f5f81565b5f6001600160e01b03198216637965db0b60e01b14806102a757506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f828152602081905260409020600101546102c781610517565b6102d18383610524565b50505050565b6001600160a01b03811633146103005760405163334bd91960e11b815260040160405180910390fd5b61030a82826105b3565b505050565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e061033981610517565b6127106002548361034a91906106fc565b11156103985760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b60448201526064015b60405180910390fd5b50600155565b7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f6103c881610517565b6001600160a01b03821661041e5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642066756e642077616c6c657420616464726573730000000000604482015260640161038f565b50600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e061049381610517565b612710826001546104a491906106fc565b11156104ed5760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b604482015260640161038f565b50600255565b5f8281526020819052604090206001015461050d81610517565b6102d183836105b3565b610521813361061c565b50565b5f61052f8383610441565b6105ac575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556105643390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016102a7565b505f6102a7565b5f6105be8383610441565b156105ac575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016102a7565b6106268282610441565b6106555760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161038f565b5050565b5f60208284031215610669575f5ffd5b81356001600160e01b031981168114610680575f5ffd5b9392505050565b5f60208284031215610697575f5ffd5b5035919050565b80356001600160a01b03811681146106b4575f5ffd5b919050565b5f5f604083850312156106ca575f5ffd5b823591506106da6020840161069e565b90509250929050565b5f602082840312156106f3575f5ffd5b6106808261069e565b808201808211156102a757634e487b7160e01b5f52601160045260245ffdfea26469706673582212207316a0c7eb5db9a7f1205aa3a81311025a6532996bd6a20c27a34b3c7de2467f64736f6c634300081c0033a2646970667358221220a7d7ac2ee7e70dc06c622d65a15d5b4ccd1e631c04cf12e377862cdf1b8c1aa164736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610034575f3560e01c806398f3e1ed14610038578063b852a47a14610067575b5f5ffd5b61004b610046366004610272565b61007a565b6040516001600160a01b03909116815260200160405180910390f35b61004b610075366004610272565b610109565b5f5f6040518060200161008c90610265565b601f1982820381018352601f9091011660408181526001600160a01b038816602083015281018690526060810185905260800160408051601f19818403018152908290526100dd92916020016102ce565b60405160208183030381529060405290506100ff868280519060200120610188565b9695505050505050565b5f5f6040518060200161011b90610265565b601f1982820381018352601f9091011660408181526001600160a01b038816602083015281018690526060810185905260800160408051601f198184030181529082905261016c92916020016102ce565b60405160208183030381529060405290506100ff5f878361019b565b5f610194838330610233565b9392505050565b5f834710156101ca5760405163cf47918160e01b81524760048201526024810185905260440160405180910390fd5b81515f036101eb57604051631328927760e21b815260040160405180910390fd5b8282516020840186f590503d15198115161561020c576040513d5f823e3d81fd5b6001600160a01b0381166101945760405163b06ebf3d60e01b815260040160405180910390fd5b5f604051836040820152846020820152828152600b8101905060ff8153605590206001600160a01b0316949350505050565b610908806102eb83390190565b5f5f5f5f60808587031215610285575f5ffd5b8435935060208501356001600160a01b03811681146102a2575f5ffd5b93969395505050506040820135916060013590565b5f81518060208401855e5f93019283525090919050565b5f6102e26102dc83866102b7565b846102b7565b94935050505056fe608060405234801561000f575f5ffd5b5060405161090838038061090883398101604081905261002e9161016b565b600380546001600160a01b0319166001600160a01b038516179055600182905560028190556100635f61005e3390565b6100c2565b5061008e7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f336100c2565b506100b97f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e0336100c2565b505050506101aa565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16610162575f838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561011a3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610165565b505f5b92915050565b5f5f5f6060848603121561017d575f5ffd5b83516001600160a01b0381168114610193575f5ffd5b602085015160409095015190969495509392505050565b610751806101b75f395ff3fe608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c806355ce3b9a116100935780639370131f116100635780639370131f14610243578063a217fddf14610256578063d547741f1461025d578063fccc281314610270575f5ffd5b806355ce3b9a146101e9578063664a1ad6146101fc5780638ed648501461022757806391d1485414610230575f5ffd5b80632f83a6bc116100ce5780632f83a6bc1461019357806336568abe146101ba5780634dbfe416146101cd5780635192c82c146101e0575f5ffd5b806301ffc9a7146100ff578063248a9ca314610127578063253123d7146101575780632f2ff15d1461017e575b5f5ffd5b61011261010d366004610659565b610277565b60405190151581526020015b60405180910390f35b610149610135366004610687565b5f9081526020819052604090206001015490565b60405190815260200161011e565b6101497f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e081565b61019161018c3660046106b9565b6102ad565b005b6101497f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f81565b6101916101c83660046106b9565b6102d7565b6101916101db366004610687565b61030f565b61014960025481565b6101916101f73660046106e3565b61039e565b60035461020f906001600160a01b031681565b6040516001600160a01b03909116815260200161011e565b61014960015481565b61011261023e3660046106b9565b610441565b610191610251366004610687565b610469565b6101495f81565b61019161026b3660046106b9565b6104f3565b61020f5f81565b5f6001600160e01b03198216637965db0b60e01b14806102a757506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f828152602081905260409020600101546102c781610517565b6102d18383610524565b50505050565b6001600160a01b03811633146103005760405163334bd91960e11b815260040160405180910390fd5b61030a82826105b3565b505050565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e061033981610517565b6127106002548361034a91906106fc565b11156103985760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b60448201526064015b60405180910390fd5b50600155565b7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f6103c881610517565b6001600160a01b03821661041e5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642066756e642077616c6c657420616464726573730000000000604482015260640161038f565b50600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e061049381610517565b612710826001546104a491906106fc565b11156104ed5760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b604482015260640161038f565b50600255565b5f8281526020819052604090206001015461050d81610517565b6102d183836105b3565b610521813361061c565b50565b5f61052f8383610441565b6105ac575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556105643390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016102a7565b505f6102a7565b5f6105be8383610441565b156105ac575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016102a7565b6106268282610441565b6106555760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161038f565b5050565b5f60208284031215610669575f5ffd5b81356001600160e01b031981168114610680575f5ffd5b9392505050565b5f60208284031215610697575f5ffd5b5035919050565b80356001600160a01b03811681146106b4575f5ffd5b919050565b5f5f604083850312156106ca575f5ffd5b823591506106da6020840161069e565b90509250929050565b5f602082840312156106f3575f5ffd5b6106808261069e565b808201808211156102a757634e487b7160e01b5f52601160045260245ffdfea26469706673582212207316a0c7eb5db9a7f1205aa3a81311025a6532996bd6a20c27a34b3c7de2467f64736f6c634300081c0033a2646970667358221220a7d7ac2ee7e70dc06c622d65a15d5b4ccd1e631c04cf12e377862cdf1b8c1aa164736f6c634300081c0033", + "bytecode": "0x6080604052348015600e575f5ffd5b506114df8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80635342fa6d14610038578063accc0de914610067575b5f5ffd5b61004b6100463660046102a8565b61007a565b6040516001600160a01b03909116815260200160405180910390f35b61004b6100753660046102a8565b610114565b5f5f6040518060200161008c90610280565b601f1982820381018352601f9091011660408181526001600160a01b038a8116602084015289811682840152881660608301526080820187905260a08083018790528151808403909101815260c083019091526100ec929160e00161031a565b60405160208183030381529060405290506101085f89836101a8565b98975050505050505050565b5f5f6040518060200161012690610280565b601f1982820381018352601f9091011660408181526001600160a01b038a8116602084015289811682840152881660608301526080820187905260a08083018790528151808403909101815260c08301909152610186929160e00161031a565b6040516020818303038152906040529050610108888280519060200120610247565b5f834710156101d75760405163cf47918160e01b81524760048201526024810185905260440160405180910390fd5b81515f036101f857604051631328927760e21b815260040160405180910390fd5b8282516020840186f590503d151981151615610219576040513d5f823e3d81fd5b6001600160a01b0381166102405760405163b06ebf3d60e01b815260040160405180910390fd5b9392505050565b5f6102408383305f604051836040820152846020820152828152600b8101905060ff8153605590206001600160a01b0316949350505050565b6111738061033783390190565b80356001600160a01b03811681146102a3575f5ffd5b919050565b5f5f5f5f5f5f60c087890312156102bd575f5ffd5b863595506102cd6020880161028d565b94506102db6040880161028d565b93506102e96060880161028d565b9598949750929560808101359460a0909101359350915050565b5f81518060208401855e5f93019283525090919050565b5f61032e6103288386610303565b84610303565b94935050505056fe60a060405234801561000f575f5ffd5b5060405161117338038061117383398101604081905261002e91610242565b60016002556001600160a01b03851661008e5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e697469616c2061646d696e206164647265737300000060448201526064015b60405180910390fd5b6001600160a01b0384166100e45760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420746f6b656e206164647265737300000000000000000000006044820152606401610085565b6001600160a01b03848116608052600580546001600160a01b0319169185169190911790556003829055600481905561011d5f8661017e565b506101487f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f8661017e565b506101737f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e08661017e565b505050505050610294565b5f828152602081815260408083206001600160a01b038516845290915281205460ff1661021e575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101d63390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610221565b505f5b92915050565b80516001600160a01b038116811461023d575f5ffd5b919050565b5f5f5f5f5f60a08688031215610256575f5ffd5b61025f86610227565b945061026d60208701610227565b935061027b60408701610227565b6060870151608090970151959894975095949392505050565b608051610eb96102ba5f395f81816102c7015281816105f601526106a30152610eb95ff3fe608060405234801561000f575f5ffd5b5060043610610132575f3560e01c80635c975abb116100b457806391d148541161007957806391d14854146102955780639370131f146102a8578063a217fddf146102bb578063d32482c3146102c2578063d547741f146102e9578063fccc2813146102fc575f5ffd5b80635c975abb1461023b578063605629d614610246578063664a1ad6146102595780638456cb59146102845780638ed648501461028c575f5ffd5b806336568abe116100fa57806336568abe146101f15780633f4ba83a146102045780634dbfe4161461020c5780635192c82c1461021f57806355ce3b9a14610228575f5ffd5b806301ffc9a714610136578063248a9ca31461015e578063253123d71461018e5780632f2ff15d146101b55780632f83a6bc146101ca575b5f5ffd5b610149610144366004610ce4565b610305565b60405190151581526020015b60405180910390f35b61018061016c366004610d12565b5f9081526020819052604090206001015490565b604051908152602001610155565b6101807f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e081565b6101c86101c3366004610d44565b61033b565b005b6101807f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f81565b6101c86101ff366004610d44565b610365565b6101c861039d565b6101c861021a366004610d12565b6103b2565b61018060045481565b6101c8610236366004610d6e565b6104aa565b60015460ff16610149565b6101c8610254366004610d87565b610555565b60055461026c906001600160a01b031681565b6040516001600160a01b039091168152602001610155565b6101c8610983565b61018060035481565b6101496102a3366004610d44565b610995565b6101c86102b6366004610d12565b6109bd565b6101805f81565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6101c86102f7366004610d44565b610a83565b61026c61dead81565b5f6001600160e01b03198216637965db0b60e01b148061033557506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f8281526020819052604090206001015461035581610aa7565b61035f8383610ab1565b50505050565b6001600160a01b038116331461038e5760405163334bd91960e11b815260040160405180910390fd5b6103988282610b40565b505050565b5f6103a781610aa7565b6103af610ba9565b50565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e06103dc81610aa7565b6103e4610bfb565b612710600454836103f59190610e08565b11156104435760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b60448201526064015b60405180910390fd5b600382905560045433907fb55f79fe5ce919308890d69197336bfe5e7ec459de785951879b018086e8ce999084908061047e83612710610e1b565b6104889190610e1b565b6040805193845260208401929092529082015260600160405180910390a25050565b7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f6104d481610aa7565b6104dc610bfb565b6001600160a01b0382166105325760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642066756e642077616c6c657420616464726573730000000000604482015260640161043a565b50600580546001600160a01b0319166001600160a01b0392909216919091179055565b61055d610bfb565b610565610c21565b845f036105855760405163162908e360e11b815260040160405180910390fd5b6001600160a01b0386166105ac57604051634e46966960e11b815260040160405180910390fd5b60405163d505accf60e01b81526001600160a01b038881166004830152306024830152604482018790526064820186905260ff8516608483015260a4820184905260c482018390527f0000000000000000000000000000000000000000000000000000000000000000169063d505accf9060e4015f604051808303815f87803b158015610637575f5ffd5b505af1158015610649573d5f5f3e3d5ffd5b505050505f6127106003548761065f9190610e2e565b6106699190610e45565b90505f6127106004548861067d9190610e2e565b6106879190610e45565b90505f81610695848a610e1b565b61069f9190610e1b565b90507f00000000000000000000000000000000000000000000000000000000000000008315610787576005546040516323b872dd60e01b81526001600160a01b038d81166004830152918216602482015260448101869052908216906323b872dd906064016020604051808303815f875af1158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107449190610e64565b6107875760405162461bcd60e51b8152602060048201526014602482015273119d5b99081d1c985b9cd9995c8819985a5b195960621b604482015260640161043a565b8215610848576040516323b872dd60e01b81526001600160a01b038c8116600483015261dead6024830152604482018590528216906323b872dd906064016020604051808303815f875af11580156107e1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108059190610e64565b6108485760405162461bcd60e51b8152602060048201526014602482015273109d5c9b881d1c985b9cd9995c8819985a5b195960621b604482015260640161043a565b8115610912576040516323b872dd60e01b81526001600160a01b038c811660048301528b81166024830152604482018490528216906323b872dd906064016020604051808303815f875af11580156108a2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c69190610e64565b6109125760405162461bcd60e51b815260206004820152601960248201527f526563697069656e74207472616e73666572206661696c656400000000000000604482015260640161043a565b604080518a815260208101869052908101849052606081018390526001600160a01b03808c1691908d169033907f52f83311e33f533cde58953dc7f433120e12462be7e4b5f2a32c97291fa09a029060800160405180910390a45050505061097a6001600255565b50505050505050565b5f61098d81610aa7565b6103af610c49565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e06109e781610aa7565b6109ef610bfb565b61271082600354610a009190610e08565b1115610a495760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b604482015260640161043a565b600482905560035433907fb55f79fe5ce919308890d69197336bfe5e7ec459de785951879b018086e8ce9990848061047e83612710610e1b565b5f82815260208190526040902060010154610a9d81610aa7565b61035f8383610b40565b6103af8133610c84565b5f610abc8383610995565b610b39575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610af13390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610335565b505f610335565b5f610b4b8383610995565b15610b39575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610335565b610bb1610cc1565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60015460ff1615610c1f5760405163d93c066560e01b815260040160405180910390fd5b565b6002805403610c4357604051633ee5aeb560e01b815260040160405180910390fd5b60028055565b610c51610bfb565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610bde565b610c8e8282610995565b610cbd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161043a565b5050565b60015460ff16610c1f57604051638dfc202b60e01b815260040160405180910390fd5b5f60208284031215610cf4575f5ffd5b81356001600160e01b031981168114610d0b575f5ffd5b9392505050565b5f60208284031215610d22575f5ffd5b5035919050565b80356001600160a01b0381168114610d3f575f5ffd5b919050565b5f5f60408385031215610d55575f5ffd5b82359150610d6560208401610d29565b90509250929050565b5f60208284031215610d7e575f5ffd5b610d0b82610d29565b5f5f5f5f5f5f5f60e0888a031215610d9d575f5ffd5b610da688610d29565b9650610db460208901610d29565b95506040880135945060608801359350608088013560ff81168114610dd7575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561033557610335610df4565b8181038181111561033557610335610df4565b808202811582820484141761033557610335610df4565b5f82610e5f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215610e74575f5ffd5b81518015158114610d0b575f5ffdfea2646970667358221220c1a3aa255a24522bf769c5a901f4208f5b481bf1e34da744c9127d4931fbfa0064736f6c634300081c0033a26469706673582212208cc41a9f27e6ba70a82853079221217d781cf51ddc55d6f3b240df1ef94b5b7564736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80635342fa6d14610038578063accc0de914610067575b5f5ffd5b61004b6100463660046102a8565b61007a565b6040516001600160a01b03909116815260200160405180910390f35b61004b6100753660046102a8565b610114565b5f5f6040518060200161008c90610280565b601f1982820381018352601f9091011660408181526001600160a01b038a8116602084015289811682840152881660608301526080820187905260a08083018790528151808403909101815260c083019091526100ec929160e00161031a565b60405160208183030381529060405290506101085f89836101a8565b98975050505050505050565b5f5f6040518060200161012690610280565b601f1982820381018352601f9091011660408181526001600160a01b038a8116602084015289811682840152881660608301526080820187905260a08083018790528151808403909101815260c08301909152610186929160e00161031a565b6040516020818303038152906040529050610108888280519060200120610247565b5f834710156101d75760405163cf47918160e01b81524760048201526024810185905260440160405180910390fd5b81515f036101f857604051631328927760e21b815260040160405180910390fd5b8282516020840186f590503d151981151615610219576040513d5f823e3d81fd5b6001600160a01b0381166102405760405163b06ebf3d60e01b815260040160405180910390fd5b9392505050565b5f6102408383305f604051836040820152846020820152828152600b8101905060ff8153605590206001600160a01b0316949350505050565b6111738061033783390190565b80356001600160a01b03811681146102a3575f5ffd5b919050565b5f5f5f5f5f5f60c087890312156102bd575f5ffd5b863595506102cd6020880161028d565b94506102db6040880161028d565b93506102e96060880161028d565b9598949750929560808101359460a0909101359350915050565b5f81518060208401855e5f93019283525090919050565b5f61032e6103288386610303565b84610303565b94935050505056fe60a060405234801561000f575f5ffd5b5060405161117338038061117383398101604081905261002e91610242565b60016002556001600160a01b03851661008e5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e697469616c2061646d696e206164647265737300000060448201526064015b60405180910390fd5b6001600160a01b0384166100e45760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420746f6b656e206164647265737300000000000000000000006044820152606401610085565b6001600160a01b03848116608052600580546001600160a01b0319169185169190911790556003829055600481905561011d5f8661017e565b506101487f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f8661017e565b506101737f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e08661017e565b505050505050610294565b5f828152602081815260408083206001600160a01b038516845290915281205460ff1661021e575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101d63390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610221565b505f5b92915050565b80516001600160a01b038116811461023d575f5ffd5b919050565b5f5f5f5f5f60a08688031215610256575f5ffd5b61025f86610227565b945061026d60208701610227565b935061027b60408701610227565b6060870151608090970151959894975095949392505050565b608051610eb96102ba5f395f81816102c7015281816105f601526106a30152610eb95ff3fe608060405234801561000f575f5ffd5b5060043610610132575f3560e01c80635c975abb116100b457806391d148541161007957806391d14854146102955780639370131f146102a8578063a217fddf146102bb578063d32482c3146102c2578063d547741f146102e9578063fccc2813146102fc575f5ffd5b80635c975abb1461023b578063605629d614610246578063664a1ad6146102595780638456cb59146102845780638ed648501461028c575f5ffd5b806336568abe116100fa57806336568abe146101f15780633f4ba83a146102045780634dbfe4161461020c5780635192c82c1461021f57806355ce3b9a14610228575f5ffd5b806301ffc9a714610136578063248a9ca31461015e578063253123d71461018e5780632f2ff15d146101b55780632f83a6bc146101ca575b5f5ffd5b610149610144366004610ce4565b610305565b60405190151581526020015b60405180910390f35b61018061016c366004610d12565b5f9081526020819052604090206001015490565b604051908152602001610155565b6101807f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e081565b6101c86101c3366004610d44565b61033b565b005b6101807f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f81565b6101c86101ff366004610d44565b610365565b6101c861039d565b6101c861021a366004610d12565b6103b2565b61018060045481565b6101c8610236366004610d6e565b6104aa565b60015460ff16610149565b6101c8610254366004610d87565b610555565b60055461026c906001600160a01b031681565b6040516001600160a01b039091168152602001610155565b6101c8610983565b61018060035481565b6101496102a3366004610d44565b610995565b6101c86102b6366004610d12565b6109bd565b6101805f81565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6101c86102f7366004610d44565b610a83565b61026c61dead81565b5f6001600160e01b03198216637965db0b60e01b148061033557506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f8281526020819052604090206001015461035581610aa7565b61035f8383610ab1565b50505050565b6001600160a01b038116331461038e5760405163334bd91960e11b815260040160405180910390fd5b6103988282610b40565b505050565b5f6103a781610aa7565b6103af610ba9565b50565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e06103dc81610aa7565b6103e4610bfb565b612710600454836103f59190610e08565b11156104435760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b60448201526064015b60405180910390fd5b600382905560045433907fb55f79fe5ce919308890d69197336bfe5e7ec459de785951879b018086e8ce999084908061047e83612710610e1b565b6104889190610e1b565b6040805193845260208401929092529082015260600160405180910390a25050565b7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f6104d481610aa7565b6104dc610bfb565b6001600160a01b0382166105325760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642066756e642077616c6c657420616464726573730000000000604482015260640161043a565b50600580546001600160a01b0319166001600160a01b0392909216919091179055565b61055d610bfb565b610565610c21565b845f036105855760405163162908e360e11b815260040160405180910390fd5b6001600160a01b0386166105ac57604051634e46966960e11b815260040160405180910390fd5b60405163d505accf60e01b81526001600160a01b038881166004830152306024830152604482018790526064820186905260ff8516608483015260a4820184905260c482018390527f0000000000000000000000000000000000000000000000000000000000000000169063d505accf9060e4015f604051808303815f87803b158015610637575f5ffd5b505af1158015610649573d5f5f3e3d5ffd5b505050505f6127106003548761065f9190610e2e565b6106699190610e45565b90505f6127106004548861067d9190610e2e565b6106879190610e45565b90505f81610695848a610e1b565b61069f9190610e1b565b90507f00000000000000000000000000000000000000000000000000000000000000008315610787576005546040516323b872dd60e01b81526001600160a01b038d81166004830152918216602482015260448101869052908216906323b872dd906064016020604051808303815f875af1158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107449190610e64565b6107875760405162461bcd60e51b8152602060048201526014602482015273119d5b99081d1c985b9cd9995c8819985a5b195960621b604482015260640161043a565b8215610848576040516323b872dd60e01b81526001600160a01b038c8116600483015261dead6024830152604482018590528216906323b872dd906064016020604051808303815f875af11580156107e1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108059190610e64565b6108485760405162461bcd60e51b8152602060048201526014602482015273109d5c9b881d1c985b9cd9995c8819985a5b195960621b604482015260640161043a565b8115610912576040516323b872dd60e01b81526001600160a01b038c811660048301528b81166024830152604482018490528216906323b872dd906064016020604051808303815f875af11580156108a2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c69190610e64565b6109125760405162461bcd60e51b815260206004820152601960248201527f526563697069656e74207472616e73666572206661696c656400000000000000604482015260640161043a565b604080518a815260208101869052908101849052606081018390526001600160a01b03808c1691908d169033907f52f83311e33f533cde58953dc7f433120e12462be7e4b5f2a32c97291fa09a029060800160405180910390a45050505061097a6001600255565b50505050505050565b5f61098d81610aa7565b6103af610c49565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e06109e781610aa7565b6109ef610bfb565b61271082600354610a009190610e08565b1115610a495760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b604482015260640161043a565b600482905560035433907fb55f79fe5ce919308890d69197336bfe5e7ec459de785951879b018086e8ce9990848061047e83612710610e1b565b5f82815260208190526040902060010154610a9d81610aa7565b61035f8383610b40565b6103af8133610c84565b5f610abc8383610995565b610b39575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610af13390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610335565b505f610335565b5f610b4b8383610995565b15610b39575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610335565b610bb1610cc1565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60015460ff1615610c1f5760405163d93c066560e01b815260040160405180910390fd5b565b6002805403610c4357604051633ee5aeb560e01b815260040160405180910390fd5b60028055565b610c51610bfb565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610bde565b610c8e8282610995565b610cbd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161043a565b5050565b60015460ff16610c1f57604051638dfc202b60e01b815260040160405180910390fd5b5f60208284031215610cf4575f5ffd5b81356001600160e01b031981168114610d0b575f5ffd5b9392505050565b5f60208284031215610d22575f5ffd5b5035919050565b80356001600160a01b0381168114610d3f575f5ffd5b919050565b5f5f60408385031215610d55575f5ffd5b82359150610d6560208401610d29565b90509250929050565b5f60208284031215610d7e575f5ffd5b610d0b82610d29565b5f5f5f5f5f5f5f60e0888a031215610d9d575f5ffd5b610da688610d29565b9650610db460208901610d29565b95506040880135945060608801359350608088013560ff81168114610dd7575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561033557610335610df4565b8181038181111561033557610335610df4565b808202811582820484141761033557610335610df4565b5f82610e5f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215610e74575f5ffd5b81518015158114610d0b575f5ffdfea2646970667358221220c1a3aa255a24522bf769c5a901f4208f5b481bf1e34da744c9127d4931fbfa0064736f6c634300081c0033a26469706673582212208cc41a9f27e6ba70a82853079221217d781cf51ddc55d6f3b240df1ef94b5b7564736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/RouterFactory.sol", - "buildInfoId": "solc-0_8_28-d9ff8f47c1281e39c5910faa5e18f642426c9cb9" + "buildInfoId": "solc-0_8_28-5c8fdc318c3f0104ec4be3938796fca8ed4a8b34" } \ No newline at end of file diff --git a/packages/contract/ignition/deployments/chain-11155111/build-info/solc-0_8_28-40227ca68470cf204db0488311108091c535c8e2.json b/packages/contract/ignition/deployments/chain-31337/build-info/solc-0_8_28-5aa01ff243ad5b208267044bfe0ef66e032fad37.json similarity index 89% rename from packages/contract/ignition/deployments/chain-11155111/build-info/solc-0_8_28-40227ca68470cf204db0488311108091c535c8e2.json rename to packages/contract/ignition/deployments/chain-31337/build-info/solc-0_8_28-5aa01ff243ad5b208267044bfe0ef66e032fad37.json index 34919f9..b1b7d3b 100644 --- a/packages/contract/ignition/deployments/chain-11155111/build-info/solc-0_8_28-40227ca68470cf204db0488311108091c535c8e2.json +++ b/packages/contract/ignition/deployments/chain-31337/build-info/solc-0_8_28-5aa01ff243ad5b208267044bfe0ef66e032fad37.json @@ -1,6 +1,6 @@ { "_format": "hh3-sol-build-info-1", - "id": "solc-0_8_28-40227ca68470cf204db0488311108091c535c8e2", + "id": "solc-0_8_28-5aa01ff243ad5b208267044bfe0ef66e032fad37", "solcVersion": "0.8.28", "solcLongVersion": "0.8.28+commit.7893614a", "userSourceNameMap": { @@ -29,11 +29,19 @@ } }, "remappings": [ + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/" ] }, "sources": { + "npm/@openzeppelin/contracts@5.4.0/access/AccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {IERC165, ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address account => bool) hasRole;\n bytes32 adminRole;\n }\n\n mapping(bytes32 role => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with an {AccessControlUnauthorizedAccount} error including the required role.\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n return _roles[role].hasRole[account];\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n * is missing `role`.\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert AccessControlUnauthorizedAccount(account, role);\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n if (callerConfirmation != _msgSender()) {\n revert AccessControlBadConfirmation();\n }\n\n _revokeRole(role, callerConfirmation);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n if (!hasRole(role, account)) {\n _roles[role].hasRole[account] = true;\n emit RoleGranted(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n if (hasRole(role, account)) {\n _roles[role].hasRole[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/access/IAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev External interface of AccessControl declared to support ERC-165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev The `account` is missing a role.\n */\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n /**\n * @dev The caller of a function is not the expected one.\n *\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n */\n error AccessControlBadConfirmation();\n\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted to signal this.\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).\n * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n */\n function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n" + }, "npm/@openzeppelin/contracts@5.4.0/interfaces/draft-IERC6093.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)\npragma solidity >=0.8.4;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n" }, @@ -67,6 +75,12 @@ "npm/@openzeppelin/contracts@5.4.0/utils/cryptography/MessageHashUtils.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n */\n function toDataWithIntendedValidatorHash(\n address validator,\n bytes32 messageHash\n ) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, hex\"19_00\")\n mstore(0x02, shl(96, validator))\n mstore(0x16, messageHash)\n digest := keccak256(0x00, 0x36)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n" }, + "npm/@openzeppelin/contracts@5.4.0/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\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[ERC 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" + }, "npm/@openzeppelin/contracts@5.4.0/utils/math/Math.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Return the 512-bit addition of two uint256.\n *\n * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n */\n function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n assembly (\"memory-safe\") {\n low := add(a, b)\n high := lt(low, a)\n }\n }\n\n /**\n * @dev Return the 512-bit multiplication of two uint256.\n *\n * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n */\n function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = high * 2²⁵⁶ + low.\n assembly (\"memory-safe\") {\n let mm := mulmod(a, b, not(0))\n low := mul(a, b)\n high := sub(sub(mm, low), lt(mm, low))\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a + b;\n success = c >= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a - b;\n success = c <= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a * b;\n assembly (\"memory-safe\") {\n // Only true when the multiplication doesn't overflow\n // (c / a == b) || (a == 0)\n success := or(eq(div(c, a), b), iszero(a))\n }\n // equivalent to: success ? c : 0\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `DIV` opcode returns zero when the denominator is 0.\n result := div(a, b)\n }\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `MOD` opcode returns zero when the denominator is 0.\n result := mod(a, b)\n }\n }\n }\n\n /**\n * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryAdd(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n */\n function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n (, uint256 result) = trySub(a, b);\n return result;\n }\n\n /**\n * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryMul(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * SafeCast.toUint(condition));\n }\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 ternary(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 ternary(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 towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n\n // The following calculation ensures accurate ceiling division without overflow.\n // Since a is non-zero, (a - 1) / b will not overflow.\n // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n // but the largest value we can obtain is type(uint256).max - 1, which happens\n // when a = type(uint256).max and b = 1.\n unchecked {\n return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n }\n }\n\n /**\n * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n *\n * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n\n // Handle non-overflow cases, 256 by 256 division.\n if (high == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return low / denominator;\n }\n\n // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n if (denominator <= high) {\n Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [high low].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n high := sub(high, gt(remainder, low))\n low := sub(low, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly (\"memory-safe\") {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [high low] by twos.\n low := div(low, twos)\n\n // Flip twos such that it is 2²⁵⁶ / 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 high into low.\n low |= high * twos;\n\n // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\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\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n inverse *= 2 - denominator * inverse; // inverse mod 2³²\n inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\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²⁵⁶. Since the preconditions guarantee that the outcome is\n // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n // is no longer required.\n result = low * inverse;\n return result;\n }\n }\n\n /**\n * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n }\n\n /**\n * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n */\n function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n if (high >= 1 << n) {\n Panic.panic(Panic.UNDER_OVERFLOW);\n }\n return (high << (256 - n)) | (low >> n);\n }\n }\n\n /**\n * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n */\n function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n }\n\n /**\n * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n *\n * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n *\n * If the input value is not inversible, 0 is returned.\n *\n * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n */\n function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n unchecked {\n if (n == 0) return 0;\n\n // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n // ax + ny = 1\n // ax = 1 + (-y)n\n // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n // If the remainder is 0 the gcd is n right away.\n uint256 remainder = a % n;\n uint256 gcd = n;\n\n // Therefore the initial coefficients are:\n // ax + ny = gcd(a, n) = n\n // 0a + 1n = n\n int256 x = 0;\n int256 y = 1;\n\n while (remainder != 0) {\n uint256 quotient = gcd / remainder;\n\n (gcd, remainder) = (\n // The old remainder is the next gcd to try.\n remainder,\n // Compute the next remainder.\n // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n // where gcd is at most n (capped to type(uint256).max)\n gcd - remainder * quotient\n );\n\n (x, y) = (\n // Increment the coefficient of a.\n y,\n // Decrement the coefficient of n.\n // Can overflow, but the result is casted to uint256 so that the\n // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n x - y * int256(quotient)\n );\n }\n\n if (gcd != 1) return 0; // No inverse exists.\n return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n }\n }\n\n /**\n * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n *\n * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n *\n * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n */\n function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n unchecked {\n return Math.modExp(a, p - 2, p);\n }\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n *\n * Requirements:\n * - modulus can't be zero\n * - underlying staticcall to precompile must succeed\n *\n * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n * interpreted as 0.\n */\n function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n (bool success, uint256 result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n * to operate modulo 0 or if the underlying precompile reverted.\n *\n * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n * of a revert, but the result may be incorrectly interpreted as 0.\n */\n function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n if (m == 0) return (false, 0);\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n // | Offset | Content | Content (Hex) |\n // |-----------|------------|--------------------------------------------------------------------|\n // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n mstore(ptr, 0x20)\n mstore(add(ptr, 0x20), 0x20)\n mstore(add(ptr, 0x40), 0x20)\n mstore(add(ptr, 0x60), b)\n mstore(add(ptr, 0x80), e)\n mstore(add(ptr, 0xa0), m)\n\n // Given the result < m, it's guaranteed to fit in 32 bytes,\n // so we can use the memory scratch space located at offset 0.\n success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n result := mload(0x00)\n }\n }\n\n /**\n * @dev Variant of {modExp} that supports inputs of arbitrary length.\n */\n function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n (bool success, bytes memory result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n */\n function tryModExp(\n bytes memory b,\n bytes memory e,\n bytes memory m\n ) internal view returns (bool success, bytes memory result) {\n if (_zeroBytes(m)) return (false, new bytes(0));\n\n uint256 mLen = m.length;\n\n // Encode call args in result and move the free memory pointer\n result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n assembly (\"memory-safe\") {\n let dataPtr := add(result, 0x20)\n // Write result on top of args to avoid allocating extra memory.\n success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n // Overwrite the length.\n // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n mstore(result, mLen)\n // Set the memory pointer after the returned data.\n mstore(0x40, add(dataPtr, mLen))\n }\n }\n\n /**\n * @dev Returns whether the provided byte array is zero.\n */\n function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n for (uint256 i = 0; i < byteArray.length; ++i) {\n if (byteArray[i] != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n * using integer operations.\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n unchecked {\n // Take care of easy edge cases when a == 0 or a == 1\n if (a <= 1) {\n return a;\n }\n\n // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n // the current value as `ε_n = | x_n - sqrt(a) |`.\n //\n // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n // bigger than any uint256.\n //\n // By noticing that\n // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n // to the msb function.\n uint256 aa = a;\n uint256 xn = 1;\n\n if (aa >= (1 << 128)) {\n aa >>= 128;\n xn <<= 64;\n }\n if (aa >= (1 << 64)) {\n aa >>= 64;\n xn <<= 32;\n }\n if (aa >= (1 << 32)) {\n aa >>= 32;\n xn <<= 16;\n }\n if (aa >= (1 << 16)) {\n aa >>= 16;\n xn <<= 8;\n }\n if (aa >= (1 << 8)) {\n aa >>= 8;\n xn <<= 4;\n }\n if (aa >= (1 << 4)) {\n aa >>= 4;\n xn <<= 2;\n }\n if (aa >= (1 << 2)) {\n xn <<= 1;\n }\n\n // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n //\n // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n // This is going to be our x_0 (and ε_0)\n xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n // From here, Newton's method give us:\n // x_{n+1} = (x_n + a / x_n) / 2\n //\n // One should note that:\n // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n // = ((x_n² + a) / (2 * x_n))² - a\n // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n // = (x_n² - a)² / (2 * x_n)²\n // = ((x_n² - a) / (2 * x_n))²\n // ≥ 0\n // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n //\n // This gives us the proof of quadratic convergence of the sequence:\n // ε_{n+1} = | x_{n+1} - sqrt(a) |\n // = | (x_n + a / x_n) / 2 - sqrt(a) |\n // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n // = | (x_n - sqrt(a))² / (2 * x_n) |\n // = | ε_n² / (2 * x_n) |\n // = ε_n² / | (2 * x_n) |\n //\n // For the first iteration, we have a special case where x_0 is known:\n // ε_1 = ε_0² / | (2 * x_0) |\n // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n // ≤ 2**(2*e-4) / (3 * 2**(e-1))\n // ≤ 2**(e-3) / 3\n // ≤ 2**(e-3-log2(3))\n // ≤ 2**(e-4.5)\n //\n // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n // ε_{n+1} = ε_n² / | (2 * x_n) |\n // ≤ (2**(e-k))² / (2 * 2**(e-1))\n // ≤ 2**(2*e-2*k) / 2**e\n // ≤ 2**(e-2*k)\n xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above\n xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5\n xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9\n xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18\n xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36\n xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72\n\n // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n // sqrt(a) or sqrt(a) + 1.\n return xn - SafeCast.toUint(xn > a / xn);\n }\n }\n\n /**\n * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // If upper 8 bits of 16-bit half set, add 8 to result\n r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n // If upper 4 bits of 8-bit half set, add 4 to result\n r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n // Shifts value right by the current result and use it as an index into this lookup table:\n //\n // | x (4 bits) | index | table[index] = MSB position |\n // |------------|---------|-----------------------------|\n // | 0000 | 0 | table[0] = 0 |\n // | 0001 | 1 | table[1] = 0 |\n // | 0010 | 2 | table[2] = 1 |\n // | 0011 | 3 | table[3] = 1 |\n // | 0100 | 4 | table[4] = 2 |\n // | 0101 | 5 | table[5] = 2 |\n // | 0110 | 6 | table[6] = 2 |\n // | 0111 | 7 | table[7] = 2 |\n // | 1000 | 8 | table[8] = 3 |\n // | 1001 | 9 | table[9] = 3 |\n // | 1010 | 10 | table[10] = 3 |\n // | 1011 | 11 | table[11] = 3 |\n // | 1100 | 12 | table[12] = 3 |\n // | 1101 | 13 | table[13] = 3 |\n // | 1110 | 14 | table[14] = 3 |\n // | 1111 | 15 | table[15] = 3 |\n //\n // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n assembly (\"memory-safe\") {\n r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n }\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\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 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n }\n\n /**\n * @dev Return the log in base 256, 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n" }, @@ -92,7 +106,7 @@ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n using SafeCast for *;\n\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n uint256 private constant SPECIAL_CHARS_LOOKUP =\n (1 << 0x08) | // backspace\n (1 << 0x09) | // tab\n (1 << 0x0a) | // newline\n (1 << 0x0c) | // form feed\n (1 << 0x0d) | // carriage return\n (1 << 0x22) | // double quote\n (1 << 0x5c); // backslash\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev The string being parsed contains characters that are not in scope of the given base.\n */\n error StringsInvalidChar();\n\n /**\n * @dev The string being parsed is not a properly formatted address.\n */\n error StringsInvalidAddressFormat();\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 assembly (\"memory-safe\") {\n ptr := add(add(buffer, 0x20), length)\n }\n while (true) {\n ptr--;\n assembly (\"memory-safe\") {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\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 uint256 localValue = value;\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] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\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\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n * representation, according to EIP-55.\n */\n function toChecksumHexString(address addr) internal pure returns (string memory) {\n bytes memory buffer = bytes(toHexString(addr));\n\n // hash the hex part of buffer (skip length + 2 bytes, length 40)\n uint256 hashValue;\n assembly (\"memory-safe\") {\n hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n }\n\n for (uint256 i = 41; i > 1; --i) {\n // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n // case shift by xoring with 0x20\n buffer[i] ^= 0x20;\n }\n hashValue >>= 4;\n }\n return string(buffer);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input) internal pure returns (uint256) {\n return parseUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n uint256 result = 0;\n for (uint256 i = begin; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 9) return (false, 0);\n result *= 10;\n result += chr;\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `int256`.\n *\n * Requirements:\n * - The string must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input) internal pure returns (int256) {\n return parseInt(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n (bool success, int256 value) = tryParseInt(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n * the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n }\n\n uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n /**\n * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character or if the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, int256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseIntUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseIntUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, int256 value) {\n bytes memory buffer = bytes(input);\n\n // Check presence of a negative sign.\n bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n bool positiveSign = sign == bytes1(\"+\");\n bool negativeSign = sign == bytes1(\"-\");\n uint256 offset = (positiveSign || negativeSign).toUint();\n\n (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n if (absSuccess && absValue < ABS_MIN_INT256) {\n return (true, negativeSign ? -int256(absValue) : int256(absValue));\n } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n return (true, type(int256).min);\n } else return (false, 0);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input) internal pure returns (uint256) {\n return parseHexUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n * invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseHexUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseHexUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n // skip 0x prefix if present\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 offset = hasPrefix.toUint() * 2;\n\n uint256 result = 0;\n for (uint256 i = begin + offset; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 15) return (false, 0);\n result *= 16;\n unchecked {\n // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n result += chr;\n }\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input) internal pure returns (address) {\n return parseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n (bool success, address value) = tryParseAddress(input, begin, end);\n if (!success) revert StringsInvalidAddressFormat();\n return value;\n }\n\n /**\n * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n * formatted address. See {parseAddress-string} requirements.\n */\n function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n return tryParseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n */\n function tryParseAddress(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, address value) {\n if (end > bytes(input).length || begin > end) return (false, address(0));\n\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n // check that input is the correct length\n if (end - begin == expectedLength) {\n // length guarantees that this does not overflow, and value is at most type(uint160).max\n (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n return (s, address(uint160(v)));\n } else {\n return (false, address(0));\n }\n }\n\n function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n uint8 value = uint8(chr);\n\n // Try to parse `chr`:\n // - Case 1: [0-9]\n // - Case 2: [a-f]\n // - Case 3: [A-F]\n // - otherwise not supported\n unchecked {\n if (value > 47 && value < 58) value -= 48;\n else if (value > 96 && value < 103) value -= 87;\n else if (value > 64 && value < 71) value -= 55;\n else return type(uint8).max;\n }\n\n return value;\n }\n\n /**\n * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n *\n * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n *\n * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n * characters that are not in this range, but other tooling may provide different results.\n */\n function escapeJSON(string memory input) internal pure returns (string memory) {\n bytes memory buffer = bytes(input);\n bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n uint256 outputLength = 0;\n\n for (uint256 i; i < buffer.length; ++i) {\n bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n output[outputLength++] = \"\\\\\";\n if (char == 0x08) output[outputLength++] = \"b\";\n else if (char == 0x09) output[outputLength++] = \"t\";\n else if (char == 0x0a) output[outputLength++] = \"n\";\n else if (char == 0x0c) output[outputLength++] = \"f\";\n else if (char == 0x0d) output[outputLength++] = \"r\";\n else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n else if (char == 0x22) {\n // solhint-disable-next-line quotes\n output[outputLength++] = '\"';\n }\n } else {\n output[outputLength++] = char;\n }\n }\n // write the actual length and deallocate unused memory\n assembly (\"memory-safe\") {\n mstore(output, outputLength)\n mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n }\n\n return string(output);\n }\n\n /**\n * @dev Reads a bytes32 from a bytes array without bounds checking.\n *\n * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n * assembly block as such would prevent some optimizations.\n */\n function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n // This is not memory safe in the general case, but all calls to this private function are within bounds.\n assembly (\"memory-safe\") {\n value := mload(add(add(buffer, 0x20), offset))\n }\n }\n}\n" }, "project/contracts/FoRToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol\";\n\ncontract FoRToken is ERC20, ERC20Permit {\n constructor(\n uint256 initialSupply,\n string memory name,\n string memory symbol\n ) ERC20(name, symbol) ERC20Permit(name) {\n _mint(msg.sender, initialSupply);\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol\";\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\n\ncontract FoRToken is ERC20, ERC20Permit, AccessControl {\n using ECDSA for bytes32;\n\n // ============ Constants ============\n /// @notice Admin role for managing allow list\n bytes32 public constant ADMIN_ROLE = keccak256(\"ADMIN_ROLE\");\n /// @notice EIP712 typehash for AddToAllowList\n bytes32 public constant ADD_TO_ALLOWLIST_TYPEHASH =\n keccak256(\"AddToAllowList(address account,uint256 deadline)\");\n\n // ============ State Variables ============\n mapping(address => bool) private _allowList;\n\n // ============ Events ============\n event AllowListAdded(address indexed account);\n event AllowListRemoved(address indexed account);\n\n // ============ Errors ============\n error NotAllowListed(address account);\n error InvalidSignature();\n error SignatureExpired();\n error AlreadyAllowListed();\n\n // ============ Constructor ============\n constructor(\n uint256 initialSupply,\n string memory name,\n string memory symbol\n ) ERC20(name, symbol) ERC20Permit(name) {\n _mint(_msgSender(), initialSupply);\n \n // Grant roles to deployer\n _grantRole(DEFAULT_ADMIN_ROLE, _msgSender());\n _grantRole(ADMIN_ROLE, _msgSender());\n \n // Add deployer to allow list\n _allowList[_msgSender()] = true;\n emit AllowListAdded(_msgSender());\n }\n\n // ============ AllowList Management ============\n\n /// @notice Add an address to the allow list (ADMIN_ROLE only)\n /// @param account Address to add\n function addToAllowList(address account) external onlyRole(ADMIN_ROLE) {\n if (_allowList[account]) revert AlreadyAllowListed();\n _allowList[account] = true;\n emit AllowListAdded(account);\n }\n\n /// @notice Remove an address from the allow list (ADMIN_ROLE only)\n /// @param account Address to remove\n function removeFromAllowList(address account) external onlyRole(ADMIN_ROLE) {\n if (!_allowList[account]) revert NotAllowListed(account);\n _allowList[account] = false;\n emit AllowListRemoved(account);\n }\n\n /// @notice Add an address to the allow list using EIP712 signature from an admin\n /// @param account Address to add\n /// @param deadline Signature expiration timestamp\n /// @param signature Admin's EIP712 signature\n function addToAllowListWithSignature(\n address account,\n uint256 deadline,\n bytes calldata signature\n ) external {\n if (block.timestamp > deadline) revert SignatureExpired();\n if (_allowList[account]) revert AlreadyAllowListed();\n\n bytes32 structHash = keccak256(\n abi.encode(ADD_TO_ALLOWLIST_TYPEHASH, account, deadline)\n );\n bytes32 hash = _hashTypedDataV4(structHash);\n address signer = hash.recover(signature);\n\n if (!hasRole(ADMIN_ROLE, signer)) revert InvalidSignature();\n\n _allowList[account] = true;\n emit AllowListAdded(account);\n }\n\n /// @notice Check if an address is on the allow list\n /// @param account Address to check\n /// @return bool True if the address is on the allow list\n function isAllowListed(address account) public view returns (bool) {\n return _allowList[account];\n }\n\n // ============ Transfer Restrictions ============\n\n /// @notice Override transfer to enforce allow list\n function transfer(\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n _requireBothAllowListed(_msgSender(), to);\n return super.transfer(to, amount);\n }\n\n /// @notice Override transferFrom to enforce allow list\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n _requireBothAllowListed(from, to);\n return super.transferFrom(from, to, amount);\n }\n\n // ============ Internal Functions ============\n\n /// @notice Require both addresses to be on the allow list\n /// @param from Sender address\n /// @param to Recipient address\n function _requireBothAllowListed(address from, address to) internal view {\n if (!_allowList[from]) revert NotAllowListed(from);\n if (!_allowList[to]) revert NotAllowListed(to);\n }\n\n // ============ ERC165 Interface Support ============\n\n /// @notice Override supportsInterface to support AccessControl\n /// @param interfaceId Interface identifier to check\n /// @return bool True if the interface is supported\n function supportsInterface(\n bytes4 interfaceId\n ) public view override(AccessControl) returns (bool) {\n return super.supportsInterface(interfaceId);\n }\n}\n" } } } diff --git a/packages/contract/ignition/deployments/chain-31337/build-info/solc-0_8_28-5c8fdc318c3f0104ec4be3938796fca8ed4a8b34.json b/packages/contract/ignition/deployments/chain-31337/build-info/solc-0_8_28-5c8fdc318c3f0104ec4be3938796fca8ed4a8b34.json new file mode 100644 index 0000000..e097d8c --- /dev/null +++ b/packages/contract/ignition/deployments/chain-31337/build-info/solc-0_8_28-5c8fdc318c3f0104ec4be3938796fca8ed4a8b34.json @@ -0,0 +1,82 @@ +{ + "_format": "hh3-sol-build-info-1", + "id": "solc-0_8_28-5c8fdc318c3f0104ec4be3938796fca8ed4a8b34", + "solcVersion": "0.8.28", + "solcLongVersion": "0.8.28+commit.7893614a", + "userSourceNameMap": { + "contracts/RouterFactory.sol": "project/contracts/RouterFactory.sol" + }, + "input": { + "language": "Solidity", + "settings": { + "evmVersion": "cancun", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata" + ] + } + }, + "remappings": [ + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", + "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/" + ] + }, + "sources": { + "npm/@openzeppelin/contracts@5.4.0/access/AccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {IERC165, ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address account => bool) hasRole;\n bytes32 adminRole;\n }\n\n mapping(bytes32 role => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with an {AccessControlUnauthorizedAccount} error including the required role.\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n return _roles[role].hasRole[account];\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n * is missing `role`.\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert AccessControlUnauthorizedAccount(account, role);\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n if (callerConfirmation != _msgSender()) {\n revert AccessControlBadConfirmation();\n }\n\n _revokeRole(role, callerConfirmation);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n if (!hasRole(role, account)) {\n _roles[role].hasRole[account] = true;\n emit RoleGranted(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n if (hasRole(role, account)) {\n _roles[role].hasRole[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/access/IAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev External interface of AccessControl declared to support ERC-165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev The `account` is missing a role.\n */\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n /**\n * @dev The caller of a function is not the expected one.\n *\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n */\n error AccessControlBadConfirmation();\n\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted to signal this.\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).\n * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n */\n function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/token/ERC20/extensions/IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[ERC-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC-20 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 *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n * doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n * token.safeTransferFrom(msg.sender, address(this), value);\n * ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\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 * CAUTION: See Security Considerations above.\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" + }, + "npm/@openzeppelin/contracts@5.4.0/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\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 value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens as the allowance of `spender` over the\n * 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 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` 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(address from, address to, uint256 value) external returns (bool);\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\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 function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/Create2.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Create2.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\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 There's no code to deploy.\n */\n error Create2EmptyBytecode();\n\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(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n if (bytecode.length == 0) {\n revert Create2EmptyBytecode();\n }\n assembly (\"memory-safe\") {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n // if no address was created, and returndata is not empty, bubble revert\n if and(iszero(addr), not(iszero(returndatasize()))) {\n let p := mload(0x40)\n returndatacopy(p, 0, returndatasize())\n revert(p, returndatasize())\n }\n }\n if (addr == address(0)) {\n revert Errors.FailedDeployment();\n }\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(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {\n assembly (\"memory-safe\") {\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 := and(keccak256(start, 85), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/Errors.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\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[ERC 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" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/Pausable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract Pausable is Context {\n bool private _paused;\n\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n /**\n * @dev The operation failed because the contract is paused.\n */\n error EnforcedPause();\n\n /**\n * @dev The operation failed because the contract is not paused.\n */\n error ExpectedPause();\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n _requireNotPaused();\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n _requirePaused();\n _;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Throws if the contract is paused.\n */\n function _requireNotPaused() internal view virtual {\n if (paused()) {\n revert EnforcedPause();\n }\n }\n\n /**\n * @dev Throws if the contract is not paused.\n */\n function _requirePaused() internal view virtual {\n if (!paused()) {\n revert ExpectedPause();\n }\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n}\n" + }, + "npm/@openzeppelin/contracts@5.4.0/utils/ReentrancyGuard.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\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 EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\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 /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\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 if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\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 /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n" + }, + "project/contracts/Router.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {AccessControl} from \"@openzeppelin/contracts/access/AccessControl.sol\";\nimport {Pausable} from \"@openzeppelin/contracts/utils/Pausable.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {IERC20Permit} from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\";\nimport {ReentrancyGuard} from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/**\n * @title Router\n * @dev 寄付金の分配を管理するRouterコントラクト\n * 寄付金を基金、Burn、受取人の3つに分配します\n */\ncontract Router is AccessControl, Pausable, ReentrancyGuard {\n /// @notice カスタムエラー\n error InvalidAmount();\n error InvalidRecipient();\n error InvalidToken();\n\n /// @notice 基金管理者ロール\n bytes32 public constant FUND_MANAGER_ROLE = keccak256(\"FUND_MANAGER_ROLE\");\n\n /// @notice 分配比率管理者ロール\n bytes32 public constant RATIO_MANAGER_ROLE =\n keccak256(\"RATIO_MANAGER_ROLE\");\n\n /// @notice Burnアドレス(0xdEaD...)\n address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;\n\n /// @notice FORTokenコントラクトアドレス\n address public immutable forToken;\n\n /// @notice 基金への分配比率(基準: 10000 = 100%)\n uint256 public fundRatio;\n\n /// @notice Burnの分配比率(基準: 10000 = 100%)\n uint256 public burnRatio;\n\n /// @notice 基金ウォレットアドレス\n address public fundWallet;\n\n /**\n * @notice トークンが自動分配付きで送金された際に発行されるイベント\n * @param sender 送金を実行したアドレス (msg.sender)\n * @param from トークンの所有者アドレス\n * @param recipient 最終的にトークンを受け取るアドレス\n * @param totalAmount 分配前の総送金額\n * @param fundAmount 基金ウォレットへ送金された額\n * @param burnAmount Burnアドレスへ送金された額\n * @param recipientAmount 受取人が受け取った額\n */\n event TransferWithDistribution(\n address indexed sender,\n address indexed from,\n address indexed recipient,\n uint256 totalAmount,\n uint256 fundAmount,\n uint256 burnAmount,\n uint256 recipientAmount\n );\n\n /**\n * @notice 分配比率が更新された際に発行されるイベント\n * @param changedBy 比率を更新したアドレス\n * @param fundRatio 更新後の基金への分配比率\n * @param burnRatio 更新後のBurnへの分配比率\n * @param recipientRatio 更新後の受取人への分配比率\n */\n event DistributionRatioUpdated(\n address indexed changedBy,\n uint256 fundRatio,\n uint256 burnRatio,\n uint256 recipientRatio\n );\n\n /**\n * @dev コンストラクタ\n * @param _initialAdmin 初期管理者アドレス(全ロールを付与)\n * @param _forToken FORTokenコントラクトアドレス\n * @param _fundWallet 基金ウォレットアドレス\n * @param _fundRatio 基金への分配比率(基準: 10000 = 100%)\n * @param _burnRatio Burnの分配比率(基準: 10000 = 100%)\n */\n constructor(\n address _initialAdmin,\n address _forToken,\n address _fundWallet,\n uint256 _fundRatio,\n uint256 _burnRatio\n ) {\n require(_initialAdmin != address(0), \"Invalid initial admin address\");\n require(_forToken != address(0), \"Invalid token address\");\n forToken = _forToken;\n fundWallet = _fundWallet;\n fundRatio = _fundRatio;\n burnRatio = _burnRatio;\n\n // デフォルト管理者ロールの設定\n _grantRole(DEFAULT_ADMIN_ROLE, _initialAdmin);\n _grantRole(FUND_MANAGER_ROLE, _initialAdmin);\n _grantRole(RATIO_MANAGER_ROLE, _initialAdmin);\n }\n\n /**\n * @dev 基金の分配比率を更新する\n * @param _fundRatio 新しい基金への分配比率(基準: 10000 = 100%)\n */\n function setFundRatio(\n uint256 _fundRatio\n ) external onlyRole(RATIO_MANAGER_ROLE) whenNotPaused {\n require(_fundRatio + burnRatio <= 10000, \"Total ratio exceeds 100%\");\n fundRatio = _fundRatio;\n emit DistributionRatioUpdated(\n msg.sender,\n fundRatio,\n burnRatio,\n 10000 - fundRatio - burnRatio\n );\n }\n\n /**\n * @dev Burnの分配比率を更新する\n * @param _burnRatio 新しいBurnの分配比率(基準: 10000 = 100%)\n */\n function setBurnRatio(\n uint256 _burnRatio\n ) external onlyRole(RATIO_MANAGER_ROLE) whenNotPaused {\n require(fundRatio + _burnRatio <= 10000, \"Total ratio exceeds 100%\");\n burnRatio = _burnRatio;\n emit DistributionRatioUpdated(\n msg.sender,\n fundRatio,\n burnRatio,\n 10000 - fundRatio - burnRatio\n );\n }\n\n /**\n * @dev 基金ウォレットアドレスを更新する\n * @param _fundWallet 新しい基金ウォレットアドレス\n */\n function setFundWallet(\n address _fundWallet\n ) external onlyRole(FUND_MANAGER_ROLE) whenNotPaused {\n require(_fundWallet != address(0), \"Invalid fund wallet address\");\n fundWallet = _fundWallet;\n }\n\n /**\n * @dev コントラクトを一時停止する\n * @notice DEFAULT_ADMIN_ROLEのみが実行可能\n */\n function pause() external onlyRole(DEFAULT_ADMIN_ROLE) {\n _pause();\n }\n\n /**\n * @dev コントラクトの一時停止を解除する\n * @notice DEFAULT_ADMIN_ROLEのみが実行可能\n */\n function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) {\n _unpause();\n }\n\n /**\n * @notice permit署名を使用してトークンを送金し、自動分配を実行\n * @dev permitを実行した後、基金・Burn・受取人へトークンを分配\n * @param from トークン所有者アドレス(permit署名と一致する必要あり)\n * @param recipient 分配後の残りトークンを受け取るアドレス\n * @param amount 送金総額(分配前)\n * @param deadline permit署名の有効期限\n * @param v 署名コンポーネント v\n * @param r 署名コンポーネント r\n * @param s 署名コンポーネント s\n */\n function transferWithPermit(\n address from,\n address recipient,\n uint256 amount,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external whenNotPaused nonReentrant {\n // 入力値の検証\n if (amount == 0) revert InvalidAmount();\n if (recipient == address(0)) revert InvalidRecipient();\n\n // permitを実行してこのコントラクトを承認\n IERC20Permit(forToken).permit(\n from,\n address(this),\n amount,\n deadline,\n v,\n r,\n s\n );\n\n // 分配額を計算\n uint256 fundAmount = (amount * fundRatio) / 10000;\n uint256 burnAmount = (amount * burnRatio) / 10000;\n uint256 recipientAmount = amount - fundAmount - burnAmount;\n\n // 送金を実行\n IERC20 token = IERC20(forToken);\n\n if (fundAmount > 0) {\n require(\n token.transferFrom(from, fundWallet, fundAmount),\n \"Fund transfer failed\"\n );\n }\n\n if (burnAmount > 0) {\n require(\n token.transferFrom(from, BURN_ADDRESS, burnAmount),\n \"Burn transfer failed\"\n );\n }\n\n if (recipientAmount > 0) {\n require(\n token.transferFrom(from, recipient, recipientAmount),\n \"Recipient transfer failed\"\n );\n }\n\n // イベントを発行\n emit TransferWithDistribution(\n msg.sender,\n from,\n recipient,\n amount,\n fundAmount,\n burnAmount,\n recipientAmount\n );\n }\n}\n" + }, + "project/contracts/RouterFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {Create2} from \"@openzeppelin/contracts/utils/Create2.sol\";\nimport {Router} from \"./Router.sol\";\n\ncontract RouterFactory {\n function deploy(\n bytes32 _salt,\n address _initialAdmin,\n address _forToken,\n address _fundWallet,\n uint256 _fundRatio,\n uint256 _burnRatio\n ) external returns (address addr) {\n bytes memory bytecode = abi.encodePacked(\n type(Router).creationCode,\n abi.encode(_initialAdmin, _forToken, _fundWallet, _fundRatio, _burnRatio)\n );\n addr = Create2.deploy(0, _salt, bytecode);\n }\n\n function computeAddress(\n bytes32 _salt,\n address _initialAdmin,\n address _forToken,\n address _fundWallet,\n uint256 _fundRatio,\n uint256 _burnRatio\n ) external view returns (address addr) {\n bytes memory bytecode = abi.encodePacked(\n type(Router).creationCode,\n abi.encode(_initialAdmin, _forToken, _fundWallet, _fundRatio, _burnRatio)\n );\n addr = Create2.computeAddress(_salt, keccak256(bytecode));\n }\n}\n" + } + } + } +} \ No newline at end of file diff --git a/packages/contract/ignition/deployments/chain-31337/build-info/solc-0_8_28-d9ff8f47c1281e39c5910faa5e18f642426c9cb9.json b/packages/contract/ignition/deployments/chain-31337/build-info/solc-0_8_28-d9ff8f47c1281e39c5910faa5e18f642426c9cb9.json deleted file mode 100644 index a6c0571..0000000 --- a/packages/contract/ignition/deployments/chain-31337/build-info/solc-0_8_28-d9ff8f47c1281e39c5910faa5e18f642426c9cb9.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_format": "hh3-sol-build-info-1", - "id": "solc-0_8_28-d9ff8f47c1281e39c5910faa5e18f642426c9cb9", - "solcVersion": "0.8.28", - "solcLongVersion": "0.8.28+commit.7893614a", - "userSourceNameMap": { - "contracts/RouterFactory.sol": "project/contracts/RouterFactory.sol" - }, - "input": { - "language": "Solidity", - "settings": { - "evmVersion": "cancun", - "optimizer": { - "enabled": true, - "runs": 200 - }, - "outputSelection": { - "*": { - "": [ - "ast" - ], - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata" - ] - } - }, - "remappings": [ - "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/", - "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.4.0/" - ] - }, - "sources": { - "npm/@openzeppelin/contracts@5.4.0/access/AccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {IERC165, ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address account => bool) hasRole;\n bytes32 adminRole;\n }\n\n mapping(bytes32 role => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with an {AccessControlUnauthorizedAccount} error including the required role.\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n return _roles[role].hasRole[account];\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n * is missing `role`.\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert AccessControlUnauthorizedAccount(account, role);\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n if (callerConfirmation != _msgSender()) {\n revert AccessControlBadConfirmation();\n }\n\n _revokeRole(role, callerConfirmation);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n if (!hasRole(role, account)) {\n _roles[role].hasRole[account] = true;\n emit RoleGranted(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n if (hasRole(role, account)) {\n _roles[role].hasRole[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n}\n" - }, - "npm/@openzeppelin/contracts@5.4.0/access/IAccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev External interface of AccessControl declared to support ERC-165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev The `account` is missing a role.\n */\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n /**\n * @dev The caller of a function is not the expected one.\n *\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n */\n error AccessControlBadConfirmation();\n\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted to signal this.\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).\n * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n */\n function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n" - }, - "npm/@openzeppelin/contracts@5.4.0/utils/Context.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\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 function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" - }, - "npm/@openzeppelin/contracts@5.4.0/utils/Create2.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Create2.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\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 There's no code to deploy.\n */\n error Create2EmptyBytecode();\n\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(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n if (bytecode.length == 0) {\n revert Create2EmptyBytecode();\n }\n assembly (\"memory-safe\") {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n // if no address was created, and returndata is not empty, bubble revert\n if and(iszero(addr), not(iszero(returndatasize()))) {\n let p := mload(0x40)\n returndatacopy(p, 0, returndatasize())\n revert(p, returndatasize())\n }\n }\n if (addr == address(0)) {\n revert Errors.FailedDeployment();\n }\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(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {\n assembly (\"memory-safe\") {\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 := and(keccak256(start, 85), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n }\n}\n" - }, - "npm/@openzeppelin/contracts@5.4.0/utils/Errors.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n" - }, - "npm/@openzeppelin/contracts@5.4.0/utils/introspection/ERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" - }, - "npm/@openzeppelin/contracts@5.4.0/utils/introspection/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\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[ERC 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" - }, - "project/contracts/Router.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {AccessControl} from \"@openzeppelin/contracts/access/AccessControl.sol\";\n\n/**\n * @title Router\n * @dev 寄付金の分配を管理するRouterコントラクト\n * 寄付金を基金、Burn、受取人の3つに分配します\n */\ncontract Router is AccessControl {\n /// @notice 基金管理者ロール\n bytes32 public constant FUND_MANAGER_ROLE = keccak256(\"FUND_MANAGER_ROLE\");\n\n /// @notice 分配比率管理者ロール\n bytes32 public constant RATIO_MANAGER_ROLE =\n keccak256(\"RATIO_MANAGER_ROLE\");\n\n /// @notice Burnアドレス(0x0)\n address public constant BURN_ADDRESS = address(0);\n\n /// @notice 基金への分配比率(基準: 10000 = 100%)\n uint256 public fundRatio;\n\n /// @notice Burnの分配比率(基準: 10000 = 100%)\n uint256 public burnRatio;\n\n /// @notice 基金ウォレットアドレス\n address public fundWallet;\n\n /**\n * @dev コンストラクタ\n * @param _fundWallet 基金ウォレットアドレス\n * @param _fundRatio 基金への分配比率(基準: 10000 = 100%)\n * @param _burnRatio Burnの分配比率(基準: 10000 = 100%)\n */\n constructor(address _fundWallet, uint256 _fundRatio, uint256 _burnRatio) {\n fundWallet = _fundWallet;\n fundRatio = _fundRatio;\n burnRatio = _burnRatio;\n\n // デフォルト管理者ロールの設定\n _grantRole(DEFAULT_ADMIN_ROLE, _msgSender());\n _grantRole(FUND_MANAGER_ROLE, _msgSender());\n _grantRole(RATIO_MANAGER_ROLE, _msgSender());\n }\n\n /**\n * @dev 基金の分配比率を更新する\n * @param _fundRatio 新しい基金への分配比率(基準: 10000 = 100%)\n */\n function setFundRatio(\n uint256 _fundRatio\n ) external onlyRole(RATIO_MANAGER_ROLE) {\n require(_fundRatio + burnRatio <= 10000, \"Total ratio exceeds 100%\");\n fundRatio = _fundRatio;\n }\n\n /**\n * @dev Burnの分配比率を更新する\n * @param _burnRatio 新しいBurnの分配比率(基準: 10000 = 100%)\n */\n function setBurnRatio(\n uint256 _burnRatio\n ) external onlyRole(RATIO_MANAGER_ROLE) {\n require(fundRatio + _burnRatio <= 10000, \"Total ratio exceeds 100%\");\n burnRatio = _burnRatio;\n }\n\n /**\n * @dev 基金ウォレットアドレスを更新する\n * @param _fundWallet 新しい基金ウォレットアドレス\n */\n function setFundWallet(\n address _fundWallet\n ) external onlyRole(FUND_MANAGER_ROLE) {\n require(_fundWallet != address(0), \"Invalid fund wallet address\");\n fundWallet = _fundWallet;\n }\n}\n" - }, - "project/contracts/RouterFactory.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {Create2} from \"@openzeppelin/contracts/utils/Create2.sol\";\nimport {Router} from \"./Router.sol\";\n\ncontract RouterFactory {\n function deploy(\n bytes32 _salt,\n address _fundWallet,\n uint256 _fundRatio,\n uint256 _burnRatio\n ) external returns (address addr) {\n bytes memory bytecode = abi.encodePacked(\n type(Router).creationCode,\n abi.encode(_fundWallet, _fundRatio, _burnRatio)\n );\n addr = Create2.deploy(0, _salt, bytecode);\n }\n\n function computeAddress(\n bytes32 _salt,\n address _fundWallet,\n uint256 _fundRatio,\n uint256 _burnRatio\n ) external view returns (address addr) {\n bytes memory bytecode = abi.encodePacked(\n type(Router).creationCode,\n abi.encode(_fundWallet, _fundRatio, _burnRatio)\n );\n addr = Create2.computeAddress(_salt, keccak256(bytecode));\n }\n}\n" - } - } - } -} \ No newline at end of file diff --git a/packages/contract/ignition/deployments/chain-31337/deployed_addresses.json b/packages/contract/ignition/deployments/chain-31337/deployed_addresses.json index 5b4e912..8e8ddf3 100644 --- a/packages/contract/ignition/deployments/chain-31337/deployed_addresses.json +++ b/packages/contract/ignition/deployments/chain-31337/deployed_addresses.json @@ -1,4 +1,4 @@ { "FoRTokenModule#FoRToken": "0x5FbDB2315678afecb367f032d93F642f64180aa3", - "RouterFactoryModule#RouterFactory": "0xE4d289e9dA2164A959441dF278a32B3BEeFE8896" + "RouterFactoryModule#RouterFactory": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" } \ No newline at end of file diff --git a/packages/contract/ignition/deployments/chain-31337/journal.jsonl b/packages/contract/ignition/deployments/chain-31337/journal.jsonl index c1997df..51187b7 100644 --- a/packages/contract/ignition/deployments/chain-31337/journal.jsonl +++ b/packages/contract/ignition/deployments/chain-31337/journal.jsonl @@ -1,14 +1,20 @@ {"chainId":31337,"type":"DEPLOYMENT_INITIALIZE"} {"artifactId":"FoRTokenModule#FoRToken","constructorArgs":["1000000000000000000000000","FoR Token","FOR"],"contractName":"FoRToken","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"FoRTokenModule#FoRToken","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} -{"futureId":"FoRTokenModule#FoRToken","networkInteraction":{"data":"0x610160604052348015610010575f5ffd5b506040516114ab3803806114ab83398101604081905261002f9161039c565b6040805180820190915260018152603160f81b60208201528290819081846003610059838261048e565b506004610066828261048e565b506100769150839050600561012d565b6101205261008581600661012d565b61014052815160208084019190912060e052815190820120610100524660a05261011160e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c05250610125338461015f565b5050506105bf565b5f602083511015610148576101418361019c565b9050610159565b81610153848261048e565b5060ff90505b92915050565b6001600160a01b03821661018d5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6101985f83836101d9565b5050565b5f5f829050601f815111156101c6578260405163305a27a960e01b81526004016101849190610548565b80516101d18261057d565b179392505050565b6001600160a01b038316610203578060025f8282546101f891906105a0565b909155506102739050565b6001600160a01b0383165f90815260208190526040902054818110156102555760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610184565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661028f576002805482900390556102ad565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516102f291815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610322575f5ffd5b81516001600160401b0381111561033b5761033b6102ff565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610369576103696102ff565b604052818152838201602001851015610380575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f606084860312156103ae575f5ffd5b835160208501519093506001600160401b038111156103cb575f5ffd5b6103d786828701610313565b604086015190935090506001600160401b038111156103f4575f5ffd5b61040086828701610313565b9150509250925092565b600181811c9082168061041e57607f821691505b60208210810361043c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561048957805f5260205f20601f840160051c810160208510156104675750805b601f840160051c820191505b81811015610486575f8155600101610473565b50505b505050565b81516001600160401b038111156104a7576104a76102ff565b6104bb816104b5845461040a565b84610442565b6020601f8211600181146104ed575f83156104d65750848201515b5f19600385901b1c1916600184901b178455610486565b5f84815260208120601f198516915b8281101561051c57878501518255602094850194600190920191016104fc565b508482101561053957868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561043c575f1960209190910360031b1b16919050565b8082018082111561015957634e487b7160e01b5f52601160045260245ffd5b60805160a05160c05160e051610100516101205161014051610e9b6106105f395f6106e201525f6106b501525f61065e01525f61063601525f61059101525f6105bb01525f6105e50152610e9b5ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c806370a082311161008857806395d89b411161006357806395d89b41146101a2578063a9059cbb146101aa578063d505accf146101bd578063dd62ed3e146101d2575f5ffd5b806370a082311461014c5780637ecebe001461017457806384b0196e14610187575f5ffd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce567146101355780633644e51514610144575b5f5ffd5b6100d761020a565b6040516100e49190610c17565b60405180910390f35b6101006100fb366004610c4b565b61029a565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b610100610130366004610c73565b6102b3565b604051601281526020016100e4565b6101146102d6565b61011461015a366004610cad565b6001600160a01b03165f9081526020819052604090205490565b610114610182366004610cad565b6102e4565b61018f610301565b6040516100e49796959493929190610cc6565b6100d7610343565b6101006101b8366004610c4b565b610352565b6101d06101cb366004610d5c565b61035f565b005b6101146101e0366004610dc9565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021990610dfa565b80601f016020809104026020016040519081016040528092919081815260200182805461024590610dfa565b80156102905780601f1061026757610100808354040283529160200191610290565b820191905f5260205f20905b81548152906001019060200180831161027357829003601f168201915b5050505050905090565b5f336102a781858561049a565b60019150505b92915050565b5f336102c08582856104ac565b6102cb858585610528565b506001949350505050565b5f6102df610585565b905090565b6001600160a01b0381165f908152600760205260408120546102ad565b5f6060805f5f5f60606103126106ae565b61031a6106db565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60606004805461021990610dfa565b5f336102a7818585610528565b834211156103885760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886103d38c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61042d82610708565b90505f61043c82878787610734565b9050896001600160a01b0316816001600160a01b031614610483576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161037f565b61048e8a8a8a61049a565b50505050505050505050565b6104a78383836001610760565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811015610522578181101561051457604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161037f565b61052284848484035f610760565b50505050565b6001600160a01b03831661055157604051634b637e8f60e11b81525f600482015260240161037f565b6001600160a01b03821661057a5760405163ec442f0560e01b81525f600482015260240161037f565b6104a7838383610832565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156105dd57507f000000000000000000000000000000000000000000000000000000000000000046145b1561060757507f000000000000000000000000000000000000000000000000000000000000000090565b6102df604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60606102df7f00000000000000000000000000000000000000000000000000000000000000006005610958565b60606102df7f00000000000000000000000000000000000000000000000000000000000000006006610958565b5f6102ad610714610585565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f61074488888888610a01565b9250925092506107548282610ac9565b50909695505050505050565b6001600160a01b0384166107895760405163e602df0560e01b81525f600482015260240161037f565b6001600160a01b0383166107b257604051634a1406b160e11b81525f600482015260240161037f565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561052257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161082491815260200190565b60405180910390a350505050565b6001600160a01b03831661085c578060025f8282546108519190610e32565b909155506108cc9050565b6001600160a01b0383165f90815260208190526040902054818110156108ae5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161037f565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166108e857600280548290039055610906565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161094b91815260200190565b60405180910390a3505050565b606060ff83146109725761096b83610b85565b90506102ad565b81805461097e90610dfa565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa90610dfa565b80156109f55780601f106109cc576101008083540402835291602001916109f5565b820191905f5260205f20905b8154815290600101906020018083116109d857829003601f168201915b505050505090506102ad565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610a3a57505f91506003905082610abf565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610a8b573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610ab657505f925060019150829050610abf565b92505f91508190505b9450945094915050565b5f826003811115610adc57610adc610e51565b03610ae5575050565b6001826003811115610af957610af9610e51565b03610b175760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610b2b57610b2b610e51565b03610b4c5760405163fce698f760e01b81526004810182905260240161037f565b6003826003811115610b6057610b60610e51565b03610b81576040516335e2f38360e21b81526004810182905260240161037f565b5050565b60605f610b9183610bc2565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156102ad57604051632cd44ac360e21b815260040160405180910390fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c296020830184610be9565b9392505050565b80356001600160a01b0381168114610c46575f5ffd5b919050565b5f5f60408385031215610c5c575f5ffd5b610c6583610c30565b946020939093013593505050565b5f5f5f60608486031215610c85575f5ffd5b610c8e84610c30565b9250610c9c60208501610c30565b929592945050506040919091013590565b5f60208284031215610cbd575f5ffd5b610c2982610c30565b60ff60f81b8816815260e060208201525f610ce460e0830189610be9565b8281036040840152610cf68189610be9565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015610d4b578351835260209384019390920191600101610d2d565b50909b9a5050505050505050505050565b5f5f5f5f5f5f5f60e0888a031215610d72575f5ffd5b610d7b88610c30565b9650610d8960208901610c30565b95506040880135945060608801359350608088013560ff81168114610dac575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610dda575f5ffd5b610de383610c30565b9150610df160208401610c30565b90509250929050565b600181811c90821680610e0e57607f821691505b602082108103610e2c57634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102ad57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220959b3b2b2a1a1fda4804796a9c642499d98ab4c6794ec7a8593445a1903c44a964736f6c634300081c003300000000000000000000000000000000000000000000d3c21bcecceda1000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000009466f5220546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003464f520000000000000000000000000000000000000000000000000000000000","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"FoRTokenModule#FoRToken","networkInteraction":{"data":"0x610160604052348015610010575f5ffd5b50604051611ecd380380611ecd83398101604081905261002f916104bb565b6040805180820190915260018152603160f81b6020820152829081908184600361005983826105ad565b50600461006682826105ad565b50610076915083905060056101a1565b610120526100858160066101a1565b61014052815160208084019190912060e052815190820120610100524660a05261011160e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0525061012533846101d3565b61012f5f33610210565b5061015a7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610210565b50335f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a25050506106de565b5f6020835110156101bc576101b5836102bb565b90506101cd565b816101c784826105ad565b5060ff90505b92915050565b6001600160a01b0382166102015760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b61020c5f83836102f8565b5050565b5f8281526008602090815260408083206001600160a01b038516845290915281205460ff166102b4575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff1916600117905561026c3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101cd565b505f6101cd565b5f5f829050601f815111156102e5578260405163305a27a960e01b81526004016101f89190610667565b80516102f08261069c565b179392505050565b6001600160a01b038316610322578060025f82825461031791906106bf565b909155506103929050565b6001600160a01b0383165f90815260208190526040902054818110156103745760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016101f8565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166103ae576002805482900390556103cc565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161041191815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610441575f5ffd5b81516001600160401b0381111561045a5761045a61041e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156104885761048861041e565b60405281815283820160200185101561049f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f606084860312156104cd575f5ffd5b835160208501519093506001600160401b038111156104ea575f5ffd5b6104f686828701610432565b604086015190935090506001600160401b03811115610513575f5ffd5b61051f86828701610432565b9150509250925092565b600181811c9082168061053d57607f821691505b60208210810361055b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156105a857805f5260205f20601f840160051c810160208510156105865750805b601f840160051c820191505b818110156105a5575f8155600101610592565b50505b505050565b81516001600160401b038111156105c6576105c661041e565b6105da816105d48454610529565b84610561565b6020601f82116001811461060c575f83156105f55750848201515b5f19600385901b1c1916600184901b1784556105a5565b5f84815260208120601f198516915b8281101561063b578785015182556020948501946001909201910161061b565b508482101561065857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561055b575f1960209190910360031b1b16919050565b808201808211156101cd57634e487b7160e01b5f52601160045260245ffd5b60805160a05160c05160e05161010051610120516101405161179e61072f5f395f610d6401525f610d3701525f610c7501525f610c4d01525f610ba801525f610bd201525f610bfc015261179e5ff3fe608060405234801561000f575f5ffd5b5060043610610187575f3560e01c806370dd8d2e116100d957806395d89b4111610093578063d505accf1161006e578063d505accf1461037c578063d547741f1461038f578063dd62ed3e146103a2578063eba8dabc146103da575f5ffd5b806395d89b411461035a578063a217fddf14610362578063a9059cbb14610369575f5ffd5b806370dd8d2e146102c757806375b238fc146102f25780637ecebe001461030657806384b0196e146103195780638d33420a1461033457806391d1485414610347575f5ffd5b8063248a9ca31161014457806331f591021161011f57806331f59102146102715780633644e5151461028457806336568abe1461028c57806370a082311461029f575f5ffd5b8063248a9ca31461022b5780632f2ff15d1461024d578063313ce56714610262575f5ffd5b806301ffc9a71461018b57806306fdde03146101b3578063095ea7b3146101c8578063180cbefc146101db57806318160ddd1461021057806323b872dd14610218575b5f5ffd5b61019e6101993660046113f1565b6103ed565b60405190151581526020015b60405180910390f35b6101bb6103fd565b6040516101aa9190611446565b61019e6101d6366004611473565b61048d565b6102027f27635d090072063300e62545cc2f6a7dc583162c8abe1f7a7e48e152b6be1d2281565b6040519081526020016101aa565b600254610202565b61019e61022636600461149b565b6104a4565b6102026102393660046114d5565b5f9081526008602052604090206001015490565b61026061025b3660046114ec565b6104c2565b005b604051601281526020016101aa565b61026061027f366004611516565b6104ec565b610202610587565b61026061029a3660046114ec565b610595565b6102026102ad366004611516565b6001600160a01b03165f9081526020819052604090205490565b61019e6102d5366004611516565b6001600160a01b03165f9081526009602052604090205460ff1690565b6102025f5160206117495f395f51905f5281565b610202610314366004611516565b6105cd565b6103216105ea565b6040516101aa979695949392919061152f565b6102606103423660046115c5565b61062c565b61019e6103553660046114ec565b6107b9565b6101bb6107e3565b6102025f81565b61019e610377366004611473565b6107f2565b61026061038a366004611648565b61080e565b61026061039d3660046114ec565b610949565b6102026103b03660046116b5565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6102606103e8366004611516565b61096d565b5f6103f782610a10565b92915050565b60606003805461040c906116dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610438906116dd565b80156104835780601f1061045a57610100808354040283529160200191610483565b820191905f5260205f20905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b5f3361049a818585610a44565b5060019392505050565b5f6104af8484610a51565b6104ba848484610adb565b949350505050565b5f828152600860205260409020600101546104dc81610afe565b6104e68383610b0b565b50505050565b5f5160206117495f395f51905f5261050381610afe565b6001600160a01b0382165f9081526009602052604090205460ff161561053c57604051632a240d9f60e11b815260040160405180910390fd5b6001600160a01b0382165f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a25050565b5f610590610b9c565b905090565b6001600160a01b03811633146105be5760405163334bd91960e11b815260040160405180910390fd5b6105c88282610cc5565b505050565b6001600160a01b0381165f908152600760205260408120546103f7565b5f6060805f5f5f60606105fb610d30565b610603610d5d565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b8242111561064d57604051630819bdcd60e01b815260040160405180910390fd5b6001600160a01b0384165f9081526009602052604090205460ff161561068657604051632a240d9f60e11b815260040160405180910390fd5b604080517f27635d090072063300e62545cc2f6a7dc583162c8abe1f7a7e48e152b6be1d2260208201526001600160a01b03861691810191909152606081018490525f906080016040516020818303038152906040528051906020012090505f6106ef82610d8a565b90505f61073385858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508693925050610db69050565b905061074c5f5160206117495f395f51905f52826107b9565b61076957604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0387165f81815260096020526040808220805460ff19166001179055517ee56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d9190a250505050505050565b5f9182526008602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461040c906116dd565b5f6107fd3384610a51565b6108078383610dde565b9392505050565b834211156108375760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108828c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108dc82610d8a565b90505f6108eb82878787610deb565b9050896001600160a01b0316816001600160a01b031614610932576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161082e565b61093d8a8a8a610a44565b50505050505050505050565b5f8281526008602052604090206001015461096381610afe565b6104e68383610cc5565b5f5160206117495f395f51905f5261098481610afe565b6001600160a01b0382165f9081526009602052604090205460ff166109c757604051635bb897bf60e11b81526001600160a01b038316600482015260240161082e565b6001600160a01b0382165f81815260096020526040808220805460ff19169055517fe7fc45e1e6a61a6d67e182d4847f8c2dcde282d7008410c1bc3a7e8fa299eb909190a25050565b5f6001600160e01b03198216637965db0b60e01b14806103f757506301ffc9a760e01b6001600160e01b03198316146103f7565b6105c88383836001610e17565b6001600160a01b0382165f9081526009602052604090205460ff16610a9457604051635bb897bf60e11b81526001600160a01b038316600482015260240161082e565b6001600160a01b0381165f9081526009602052604090205460ff16610ad757604051635bb897bf60e11b81526001600160a01b038216600482015260240161082e565b5050565b5f33610ae8858285610ee9565b610af3858585610f5f565b506001949350505050565b610b088133610fbc565b50565b5f610b1683836107b9565b610b95575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff19166001179055610b4d3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016103f7565b505f6103f7565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610bf457507f000000000000000000000000000000000000000000000000000000000000000046145b15610c1e57507f000000000000000000000000000000000000000000000000000000000000000090565b610590604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f610cd083836107b9565b15610b95575f8381526008602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016103f7565b60606105907f00000000000000000000000000000000000000000000000000000000000000006005610ff5565b60606105907f00000000000000000000000000000000000000000000000000000000000000006006610ff5565b5f6103f7610d96610b9c565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f610dc4868661109e565b925092509250610dd482826110e7565b5090949350505050565b5f3361049a818585610f5f565b5f5f5f5f610dfb8888888861119f565b925092509250610e0b82826110e7565b50909695505050505050565b6001600160a01b038416610e405760405163e602df0560e01b81525f600482015260240161082e565b6001600160a01b038316610e6957604051634a1406b160e11b81525f600482015260240161082e565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156104e657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610edb91815260200190565b60405180910390a350505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156104e65781811015610f5157604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161082e565b6104e684848484035f610e17565b6001600160a01b038316610f8857604051634b637e8f60e11b81525f600482015260240161082e565b6001600160a01b038216610fb15760405163ec442f0560e01b81525f600482015260240161082e565b6105c8838383611267565b610fc682826107b9565b610ad75760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161082e565b606060ff831461100f576110088361138d565b90506103f7565b81805461101b906116dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611047906116dd565b80156110925780601f1061106957610100808354040283529160200191611092565b820191905f5260205f20905b81548152906001019060200180831161107557829003601f168201915b505050505090506103f7565b5f5f5f83516041036110d5576020840151604085015160608601515f1a6110c78882858561119f565b9550955095505050506110e0565b505081515f91506002905b9250925092565b5f8260038111156110fa576110fa611715565b03611103575050565b600182600381111561111757611117611715565b036111355760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561114957611149611715565b0361116a5760405163fce698f760e01b81526004810182905260240161082e565b600382600381111561117e5761117e611715565b03610ad7576040516335e2f38360e21b81526004810182905260240161082e565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156111d857505f9150600390508261125d565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611229573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661125457505f92506001915082905061125d565b92505f91508190505b9450945094915050565b6001600160a01b038316611291578060025f8282546112869190611729565b909155506113019050565b6001600160a01b0383165f90815260208190526040902054818110156112e35760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161082e565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661131d5760028054829003905561133b565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161138091815260200190565b60405180910390a3505050565b60605f611399836113ca565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156103f757604051632cd44ac360e21b815260040160405180910390fd5b5f60208284031215611401575f5ffd5b81356001600160e01b031981168114610807575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6108076020830184611418565b80356001600160a01b038116811461146e575f5ffd5b919050565b5f5f60408385031215611484575f5ffd5b61148d83611458565b946020939093013593505050565b5f5f5f606084860312156114ad575f5ffd5b6114b684611458565b92506114c460208501611458565b929592945050506040919091013590565b5f602082840312156114e5575f5ffd5b5035919050565b5f5f604083850312156114fd575f5ffd5b8235915061150d60208401611458565b90509250929050565b5f60208284031215611526575f5ffd5b61080782611458565b60ff60f81b8816815260e060208201525f61154d60e0830189611418565b828103604084015261155f8189611418565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156115b4578351835260209384019390920191600101611596565b50909b9a5050505050505050505050565b5f5f5f5f606085870312156115d8575f5ffd5b6115e185611458565b935060208501359250604085013567ffffffffffffffff811115611603575f5ffd5b8501601f81018713611613575f5ffd5b803567ffffffffffffffff811115611629575f5ffd5b87602082840101111561163a575f5ffd5b949793965060200194505050565b5f5f5f5f5f5f5f60e0888a03121561165e575f5ffd5b61166788611458565b965061167560208901611458565b95506040880135945060608801359350608088013560ff81168114611698575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156116c6575f5ffd5b6116cf83611458565b915061150d60208401611458565b600181811c908216806116f157607f821691505b60208210810361170f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b808201808211156103f757634e487b7160e01b5f52601160045260245ffdfea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a264697066735822122091b918cf2c46e7a2c094b0fd8a986f7c26d797d6865d166d3266cd617bdce16964736f6c634300081c003300000000000000000000000000000000000000000000d3c21bcecceda1000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000009466f5220546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003464f520000000000000000000000000000000000000000000000000000000000","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} {"futureId":"FoRTokenModule#FoRToken","networkInteractionId":1,"nonce":0,"type":"TRANSACTION_PREPARE_SEND"} -{"futureId":"FoRTokenModule#FoRToken","networkInteractionId":1,"nonce":0,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"3000000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0xdcf461a007b88fced501a5cd8a844b97bd935480bc4297c15b97d1d6612a6120"},"type":"TRANSACTION_SEND"} -{"futureId":"FoRTokenModule#FoRToken","hash":"0xdcf461a007b88fced501a5cd8a844b97bd935480bc4297c15b97d1d6612a6120","networkInteractionId":1,"receipt":{"blockHash":"0x12f4195d2d1225b01364a15c6437bd32959dcc61af30aa40b8b48299317643de","blockNumber":1,"contractAddress":"0x5FbDB2315678afecb367f032d93F642f64180aa3","logs":[{"address":"0x5FbDB2315678afecb367f032d93F642f64180aa3","data":"0x00000000000000000000000000000000000000000000d3c21bcecceda1000000","logIndex":0,"topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"FoRTokenModule#FoRToken","networkInteractionId":1,"nonce":0,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"3000000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0xc194f9508da773e05ddf919dfb05451c0386aaf06836e3ea189b720e1fd772fb"},"type":"TRANSACTION_SEND"} +{"futureId":"FoRTokenModule#FoRToken","hash":"0xc194f9508da773e05ddf919dfb05451c0386aaf06836e3ea189b720e1fd772fb","networkInteractionId":1,"receipt":{"blockHash":"0x6179292a31396b66e795bc13018a0e977d094251f0c6c34020aca340babc6a53","blockNumber":1,"contractAddress":"0x5FbDB2315678afecb367f032d93F642f64180aa3","logs":[{"address":"0x5FbDB2315678afecb367f032d93F642f64180aa3","data":"0x00000000000000000000000000000000000000000000d3c21bcecceda1000000","logIndex":0,"topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266"]},{"address":"0x5FbDB2315678afecb367f032d93F642f64180aa3","data":"0x","logIndex":1,"topics":["0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266"]},{"address":"0x5FbDB2315678afecb367f032d93F642f64180aa3","data":"0x","logIndex":2,"topics":["0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d","0xa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775","0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266"]},{"address":"0x5FbDB2315678afecb367f032d93F642f64180aa3","data":"0x","logIndex":3,"topics":["0x00e56b6623d31a13d7f3de1f433e634987aad40c35669f0f824222c304b5746d","0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} {"futureId":"FoRTokenModule#FoRToken","result":{"address":"0x5FbDB2315678afecb367f032d93F642f64180aa3","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} -{"artifactId":"RouterFactoryModule#RouterFactory","constructorArgs":[],"contractName":"RouterFactory","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"RouterFactoryModule#RouterFactory","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"create2","strategyConfig":{"salt":"0x0000000000000000000000000000000000000000000000000000000000000000"},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} -{"futureId":"RouterFactoryModule#RouterFactory","networkInteraction":{"data":"0x26307668000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000c446080604052348015600e575f5ffd5b50610c288061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c806398f3e1ed14610038578063b852a47a14610067575b5f5ffd5b61004b610046366004610272565b61007a565b6040516001600160a01b03909116815260200160405180910390f35b61004b610075366004610272565b610109565b5f5f6040518060200161008c90610265565b601f1982820381018352601f9091011660408181526001600160a01b038816602083015281018690526060810185905260800160408051601f19818403018152908290526100dd92916020016102ce565b60405160208183030381529060405290506100ff868280519060200120610188565b9695505050505050565b5f5f6040518060200161011b90610265565b601f1982820381018352601f9091011660408181526001600160a01b038816602083015281018690526060810185905260800160408051601f198184030181529082905261016c92916020016102ce565b60405160208183030381529060405290506100ff5f878361019b565b5f610194838330610233565b9392505050565b5f834710156101ca5760405163cf47918160e01b81524760048201526024810185905260440160405180910390fd5b81515f036101eb57604051631328927760e21b815260040160405180910390fd5b8282516020840186f590503d15198115161561020c576040513d5f823e3d81fd5b6001600160a01b0381166101945760405163b06ebf3d60e01b815260040160405180910390fd5b5f604051836040820152846020820152828152600b8101905060ff8153605590206001600160a01b0316949350505050565b610908806102eb83390190565b5f5f5f5f60808587031215610285575f5ffd5b8435935060208501356001600160a01b03811681146102a2575f5ffd5b93969395505050506040820135916060013590565b5f81518060208401855e5f93019283525090919050565b5f6102e26102dc83866102b7565b846102b7565b94935050505056fe608060405234801561000f575f5ffd5b5060405161090838038061090883398101604081905261002e9161016b565b600380546001600160a01b0319166001600160a01b038516179055600182905560028190556100635f61005e3390565b6100c2565b5061008e7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f336100c2565b506100b97f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e0336100c2565b505050506101aa565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16610162575f838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561011a3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610165565b505f5b92915050565b5f5f5f6060848603121561017d575f5ffd5b83516001600160a01b0381168114610193575f5ffd5b602085015160409095015190969495509392505050565b610751806101b75f395ff3fe608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c806355ce3b9a116100935780639370131f116100635780639370131f14610243578063a217fddf14610256578063d547741f1461025d578063fccc281314610270575f5ffd5b806355ce3b9a146101e9578063664a1ad6146101fc5780638ed648501461022757806391d1485414610230575f5ffd5b80632f83a6bc116100ce5780632f83a6bc1461019357806336568abe146101ba5780634dbfe416146101cd5780635192c82c146101e0575f5ffd5b806301ffc9a7146100ff578063248a9ca314610127578063253123d7146101575780632f2ff15d1461017e575b5f5ffd5b61011261010d366004610659565b610277565b60405190151581526020015b60405180910390f35b610149610135366004610687565b5f9081526020819052604090206001015490565b60405190815260200161011e565b6101497f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e081565b61019161018c3660046106b9565b6102ad565b005b6101497f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f81565b6101916101c83660046106b9565b6102d7565b6101916101db366004610687565b61030f565b61014960025481565b6101916101f73660046106e3565b61039e565b60035461020f906001600160a01b031681565b6040516001600160a01b03909116815260200161011e565b61014960015481565b61011261023e3660046106b9565b610441565b610191610251366004610687565b610469565b6101495f81565b61019161026b3660046106b9565b6104f3565b61020f5f81565b5f6001600160e01b03198216637965db0b60e01b14806102a757506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f828152602081905260409020600101546102c781610517565b6102d18383610524565b50505050565b6001600160a01b03811633146103005760405163334bd91960e11b815260040160405180910390fd5b61030a82826105b3565b505050565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e061033981610517565b6127106002548361034a91906106fc565b11156103985760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b60448201526064015b60405180910390fd5b50600155565b7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f6103c881610517565b6001600160a01b03821661041e5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642066756e642077616c6c657420616464726573730000000000604482015260640161038f565b50600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e061049381610517565b612710826001546104a491906106fc565b11156104ed5760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b604482015260640161038f565b50600255565b5f8281526020819052604090206001015461050d81610517565b6102d183836105b3565b610521813361061c565b50565b5f61052f8383610441565b6105ac575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556105643390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016102a7565b505f6102a7565b5f6105be8383610441565b156105ac575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016102a7565b6106268282610441565b6106555760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161038f565b5050565b5f60208284031215610669575f5ffd5b81356001600160e01b031981168114610680575f5ffd5b9392505050565b5f60208284031215610697575f5ffd5b5035919050565b80356001600160a01b03811681146106b4575f5ffd5b919050565b5f5f604083850312156106ca575f5ffd5b823591506106da6020840161069e565b90509250929050565b5f602082840312156106f3575f5ffd5b6106808261069e565b808201808211156102a757634e487b7160e01b5f52601160045260245ffdfea26469706673582212207316a0c7eb5db9a7f1205aa3a81311025a6532996bd6a20c27a34b3c7de2467f64736f6c634300081c0033a2646970667358221220a7d7ac2ee7e70dc06c622d65a15d5b4ccd1e631c04cf12e377862cdf1b8c1aa164736f6c634300081c003300000000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"artifactId":"RouterFactoryModule#RouterFactory","constructorArgs":[],"contractName":"RouterFactory","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"RouterFactoryModule#RouterFactory","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"RouterFactoryModule#RouterFactory","networkInteraction":{"data":"0x6080604052348015600e575f5ffd5b506114df8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80635342fa6d14610038578063accc0de914610067575b5f5ffd5b61004b6100463660046102a8565b61007a565b6040516001600160a01b03909116815260200160405180910390f35b61004b6100753660046102a8565b610114565b5f5f6040518060200161008c90610280565b601f1982820381018352601f9091011660408181526001600160a01b038a8116602084015289811682840152881660608301526080820187905260a08083018790528151808403909101815260c083019091526100ec929160e00161031a565b60405160208183030381529060405290506101085f89836101a8565b98975050505050505050565b5f5f6040518060200161012690610280565b601f1982820381018352601f9091011660408181526001600160a01b038a8116602084015289811682840152881660608301526080820187905260a08083018790528151808403909101815260c08301909152610186929160e00161031a565b6040516020818303038152906040529050610108888280519060200120610247565b5f834710156101d75760405163cf47918160e01b81524760048201526024810185905260440160405180910390fd5b81515f036101f857604051631328927760e21b815260040160405180910390fd5b8282516020840186f590503d151981151615610219576040513d5f823e3d81fd5b6001600160a01b0381166102405760405163b06ebf3d60e01b815260040160405180910390fd5b9392505050565b5f6102408383305f604051836040820152846020820152828152600b8101905060ff8153605590206001600160a01b0316949350505050565b6111738061033783390190565b80356001600160a01b03811681146102a3575f5ffd5b919050565b5f5f5f5f5f5f60c087890312156102bd575f5ffd5b863595506102cd6020880161028d565b94506102db6040880161028d565b93506102e96060880161028d565b9598949750929560808101359460a0909101359350915050565b5f81518060208401855e5f93019283525090919050565b5f61032e6103288386610303565b84610303565b94935050505056fe60a060405234801561000f575f5ffd5b5060405161117338038061117383398101604081905261002e91610242565b60016002556001600160a01b03851661008e5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e697469616c2061646d696e206164647265737300000060448201526064015b60405180910390fd5b6001600160a01b0384166100e45760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420746f6b656e206164647265737300000000000000000000006044820152606401610085565b6001600160a01b03848116608052600580546001600160a01b0319169185169190911790556003829055600481905561011d5f8661017e565b506101487f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f8661017e565b506101737f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e08661017e565b505050505050610294565b5f828152602081815260408083206001600160a01b038516845290915281205460ff1661021e575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101d63390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610221565b505f5b92915050565b80516001600160a01b038116811461023d575f5ffd5b919050565b5f5f5f5f5f60a08688031215610256575f5ffd5b61025f86610227565b945061026d60208701610227565b935061027b60408701610227565b6060870151608090970151959894975095949392505050565b608051610eb96102ba5f395f81816102c7015281816105f601526106a30152610eb95ff3fe608060405234801561000f575f5ffd5b5060043610610132575f3560e01c80635c975abb116100b457806391d148541161007957806391d14854146102955780639370131f146102a8578063a217fddf146102bb578063d32482c3146102c2578063d547741f146102e9578063fccc2813146102fc575f5ffd5b80635c975abb1461023b578063605629d614610246578063664a1ad6146102595780638456cb59146102845780638ed648501461028c575f5ffd5b806336568abe116100fa57806336568abe146101f15780633f4ba83a146102045780634dbfe4161461020c5780635192c82c1461021f57806355ce3b9a14610228575f5ffd5b806301ffc9a714610136578063248a9ca31461015e578063253123d71461018e5780632f2ff15d146101b55780632f83a6bc146101ca575b5f5ffd5b610149610144366004610ce4565b610305565b60405190151581526020015b60405180910390f35b61018061016c366004610d12565b5f9081526020819052604090206001015490565b604051908152602001610155565b6101807f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e081565b6101c86101c3366004610d44565b61033b565b005b6101807f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f81565b6101c86101ff366004610d44565b610365565b6101c861039d565b6101c861021a366004610d12565b6103b2565b61018060045481565b6101c8610236366004610d6e565b6104aa565b60015460ff16610149565b6101c8610254366004610d87565b610555565b60055461026c906001600160a01b031681565b6040516001600160a01b039091168152602001610155565b6101c8610983565b61018060035481565b6101496102a3366004610d44565b610995565b6101c86102b6366004610d12565b6109bd565b6101805f81565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6101c86102f7366004610d44565b610a83565b61026c61dead81565b5f6001600160e01b03198216637965db0b60e01b148061033557506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f8281526020819052604090206001015461035581610aa7565b61035f8383610ab1565b50505050565b6001600160a01b038116331461038e5760405163334bd91960e11b815260040160405180910390fd5b6103988282610b40565b505050565b5f6103a781610aa7565b6103af610ba9565b50565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e06103dc81610aa7565b6103e4610bfb565b612710600454836103f59190610e08565b11156104435760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b60448201526064015b60405180910390fd5b600382905560045433907fb55f79fe5ce919308890d69197336bfe5e7ec459de785951879b018086e8ce999084908061047e83612710610e1b565b6104889190610e1b565b6040805193845260208401929092529082015260600160405180910390a25050565b7f0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f6104d481610aa7565b6104dc610bfb565b6001600160a01b0382166105325760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642066756e642077616c6c657420616464726573730000000000604482015260640161043a565b50600580546001600160a01b0319166001600160a01b0392909216919091179055565b61055d610bfb565b610565610c21565b845f036105855760405163162908e360e11b815260040160405180910390fd5b6001600160a01b0386166105ac57604051634e46966960e11b815260040160405180910390fd5b60405163d505accf60e01b81526001600160a01b038881166004830152306024830152604482018790526064820186905260ff8516608483015260a4820184905260c482018390527f0000000000000000000000000000000000000000000000000000000000000000169063d505accf9060e4015f604051808303815f87803b158015610637575f5ffd5b505af1158015610649573d5f5f3e3d5ffd5b505050505f6127106003548761065f9190610e2e565b6106699190610e45565b90505f6127106004548861067d9190610e2e565b6106879190610e45565b90505f81610695848a610e1b565b61069f9190610e1b565b90507f00000000000000000000000000000000000000000000000000000000000000008315610787576005546040516323b872dd60e01b81526001600160a01b038d81166004830152918216602482015260448101869052908216906323b872dd906064016020604051808303815f875af1158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107449190610e64565b6107875760405162461bcd60e51b8152602060048201526014602482015273119d5b99081d1c985b9cd9995c8819985a5b195960621b604482015260640161043a565b8215610848576040516323b872dd60e01b81526001600160a01b038c8116600483015261dead6024830152604482018590528216906323b872dd906064016020604051808303815f875af11580156107e1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108059190610e64565b6108485760405162461bcd60e51b8152602060048201526014602482015273109d5c9b881d1c985b9cd9995c8819985a5b195960621b604482015260640161043a565b8115610912576040516323b872dd60e01b81526001600160a01b038c811660048301528b81166024830152604482018490528216906323b872dd906064016020604051808303815f875af11580156108a2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c69190610e64565b6109125760405162461bcd60e51b815260206004820152601960248201527f526563697069656e74207472616e73666572206661696c656400000000000000604482015260640161043a565b604080518a815260208101869052908101849052606081018390526001600160a01b03808c1691908d169033907f52f83311e33f533cde58953dc7f433120e12462be7e4b5f2a32c97291fa09a029060800160405180910390a45050505061097a6001600255565b50505050505050565b5f61098d81610aa7565b6103af610c49565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b7f6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e06109e781610aa7565b6109ef610bfb565b61271082600354610a009190610e08565b1115610a495760405162461bcd60e51b8152602060048201526018602482015277546f74616c20726174696f2065786365656473203130302560401b604482015260640161043a565b600482905560035433907fb55f79fe5ce919308890d69197336bfe5e7ec459de785951879b018086e8ce9990848061047e83612710610e1b565b5f82815260208190526040902060010154610a9d81610aa7565b61035f8383610b40565b6103af8133610c84565b5f610abc8383610995565b610b39575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610af13390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610335565b505f610335565b5f610b4b8383610995565b15610b39575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610335565b610bb1610cc1565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60015460ff1615610c1f5760405163d93c066560e01b815260040160405180910390fd5b565b6002805403610c4357604051633ee5aeb560e01b815260040160405180910390fd5b60028055565b610c51610bfb565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610bde565b610c8e8282610995565b610cbd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161043a565b5050565b60015460ff16610c1f57604051638dfc202b60e01b815260040160405180910390fd5b5f60208284031215610cf4575f5ffd5b81356001600160e01b031981168114610d0b575f5ffd5b9392505050565b5f60208284031215610d22575f5ffd5b5035919050565b80356001600160a01b0381168114610d3f575f5ffd5b919050565b5f5f60408385031215610d55575f5ffd5b82359150610d6560208401610d29565b90509250929050565b5f60208284031215610d7e575f5ffd5b610d0b82610d29565b5f5f5f5f5f5f5f60e0888a031215610d9d575f5ffd5b610da688610d29565b9650610db460208901610d29565b95506040880135945060608801359350608088013560ff81168114610dd7575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561033557610335610df4565b8181038181111561033557610335610df4565b808202811582820484141761033557610335610df4565b5f82610e5f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215610e74575f5ffd5b81518015158114610d0b575f5ffdfea2646970667358221220c1a3aa255a24522bf769c5a901f4208f5b481bf1e34da744c9127d4931fbfa0064736f6c634300081c0033a26469706673582212208cc41a9f27e6ba70a82853079221217d781cf51ddc55d6f3b240df1ef94b5b7564736f6c634300081c0033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} {"futureId":"RouterFactoryModule#RouterFactory","networkInteractionId":1,"nonce":1,"type":"TRANSACTION_PREPARE_SEND"} -{"futureId":"RouterFactoryModule#RouterFactory","networkInteractionId":1,"nonce":1,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2545516190"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0xa141b62c21422a18c12f64f4e957a72736c4593425f30cd7cf6c25ddbef47e7a"},"type":"TRANSACTION_SEND"} -{"futureId":"RouterFactoryModule#RouterFactory","hash":"0xa141b62c21422a18c12f64f4e957a72736c4593425f30cd7cf6c25ddbef47e7a","networkInteractionId":1,"receipt":{"blockHash":"0xf198b3e255641e1b7f6a6aa0e7f458283c812bcb083b60584d7623e92a8c3946","blockNumber":3,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":0,"topics":["0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7","0x000000000000000000000000e4d289e9da2164a959441df278a32b3beefe8896","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} -{"futureId":"RouterFactoryModule#RouterFactory","result":{"address":"0xE4d289e9dA2164A959441dF278a32B3BEeFE8896","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file +{"futureId":"RouterFactoryModule#RouterFactory","networkInteractionId":1,"nonce":1,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2750000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0xdc611a053c6a93ef5a75ec452f70e706ee2d230f72e7ae2265124804504f3ba7"},"type":"TRANSACTION_SEND"} +{"futureId":"RouterFactoryModule#RouterFactory","hash":"0xdc611a053c6a93ef5a75ec452f70e706ee2d230f72e7ae2265124804504f3ba7","networkInteractionId":1,"receipt":{"blockHash":"0x83540314a39513dc8c940beaef28ef81747522de41ba47e65ff3948554170c1a","blockNumber":2,"contractAddress":"0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"RouterFactoryModule#RouterFactory","result":{"address":"0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"args":["0x0000000000000000000000000000000000000000000000000000000000000000","0x8c713bb047edcc200427f7605e66e0329258dac9","0x5FbDB2315678afecb367f032d93F642f64180aa3","0x8c713bb047edcc200427f7605e66e0329258dac9",1500,500],"artifactId":"RouterFactoryModule#RouterFactory","contractAddress":"0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512","dependencies":["RouterFactoryModule#RouterFactory","FoRTokenModule#FoRToken"],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","functionName":"deploy","futureId":"RouterModule#RouterFactoryModule~RouterFactory.deploy","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"RouterModule#RouterFactoryModule~RouterFactory.deploy","networkInteraction":{"data":"0x5342fa6d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c713bb047edcc200427f7605e66e0329258dac90000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa30000000000000000000000008c713bb047edcc200427f7605e66e0329258dac900000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000001f4","id":1,"to":"0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"RouterModule#RouterFactoryModule~RouterFactory.deploy","networkInteractionId":1,"nonce":2,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"RouterModule#RouterFactoryModule~RouterFactory.deploy","networkInteractionId":1,"nonce":2,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2553918072"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x97a4f8024bc53a6656babc1e004b75a03f541c3b89013eea4b514ddc4a18c9ac"},"type":"TRANSACTION_SEND"} +{"futureId":"RouterModule#RouterFactoryModule~RouterFactory.deploy","hash":"0x97a4f8024bc53a6656babc1e004b75a03f541c3b89013eea4b514ddc4a18c9ac","networkInteractionId":1,"receipt":{"blockHash":"0xe51f3c47dae95aa7715906567ea5947ec2f148606d357680eb5887ce9214717f","blockNumber":3,"logs":[{"address":"0x3855b44011B599c506B464a7d91629A11AB930aA","data":"0x","logIndex":0,"topics":["0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9","0x000000000000000000000000e7f1725e7734ce288f8367e1bb143e90bb3f0512"]},{"address":"0x3855b44011B599c506B464a7d91629A11AB930aA","data":"0x","logIndex":1,"topics":["0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d","0x0b84ee281e5cf521a9ad54a86fafe78946b157177e231bd8ae785af4d3b3620f","0x0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9","0x000000000000000000000000e7f1725e7734ce288f8367e1bb143e90bb3f0512"]},{"address":"0x3855b44011B599c506B464a7d91629A11AB930aA","data":"0x","logIndex":2,"topics":["0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d","0x6eb7b5d79494977a37888770061a15887107ab7330d122990e924a580062e6e0","0x0000000000000000000000008c713bb047edcc200427f7605e66e0329258dac9","0x000000000000000000000000e7f1725e7734ce288f8367e1bb143e90bb3f0512"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"RouterModule#RouterFactoryModule~RouterFactory.deploy","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/contract/ignition/modules/Router.ts b/packages/contract/ignition/modules/Router.ts index f5d0c6d..489ddf9 100644 --- a/packages/contract/ignition/modules/Router.ts +++ b/packages/contract/ignition/modules/Router.ts @@ -1,11 +1,15 @@ import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; +import FoRToken from "./FoRToken.js"; import RouterFactory from "./RouterFactory.js"; export default buildModule("RouterModule", (m) => { + const { forToken } = m.useModule(FoRToken); const { routerFactory } = m.useModule(RouterFactory); m.call(routerFactory, "deploy", [ m.getParameter("salt"), + m.getParameter("initialAdmin"), + forToken, m.getParameter("fundWallet"), m.getParameter("fundRatio"), m.getParameter("burnRatio"), diff --git a/packages/contract/ignition/parameters.local.json b/packages/contract/ignition/parameters.local.json index 1a6b7a5..fd29877 100644 --- a/packages/contract/ignition/parameters.local.json +++ b/packages/contract/ignition/parameters.local.json @@ -6,6 +6,7 @@ }, "RouterModule": { "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "initialAdmin": "0x8c713bb047edcc200427f7605e66e0329258dac9", "fundWallet": "0x8c713bb047edcc200427f7605e66e0329258dac9", "fundRatio": 1500, "burnRatio": 500 diff --git a/packages/contract/ignition/parameters.sepolia.json b/packages/contract/ignition/parameters.sepolia.json index 1a6b7a5..fd29877 100644 --- a/packages/contract/ignition/parameters.sepolia.json +++ b/packages/contract/ignition/parameters.sepolia.json @@ -6,6 +6,7 @@ }, "RouterModule": { "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "initialAdmin": "0x8c713bb047edcc200427f7605e66e0329258dac9", "fundWallet": "0x8c713bb047edcc200427f7605e66e0329258dac9", "fundRatio": 1500, "burnRatio": 500 diff --git a/packages/contract/package.json b/packages/contract/package.json index 97ee816..8a48ebd 100644 --- a/packages/contract/package.json +++ b/packages/contract/package.json @@ -11,8 +11,10 @@ "check": "biome check", "deploy:local:RouterFactory": "hardhat ignition deploy ignition/modules/RouterFactory.ts --network localhost --strategy create2 --parameters ignition/parameters.local.json", "deploy:local:FoRToken": "hardhat ignition deploy ignition/modules/FoRToken.ts --network localhost --parameters ignition/parameters.local.json", + "deploy:local:Router": "hardhat ignition deploy ignition/modules/Router.ts --network localhost --parameters ignition/parameters.local.json", "deploy:sepolia:RouterFactory": "hardhat ignition deploy ignition/modules/RouterFactory.ts --network sepolia --strategy create2 --parameters ignition/parameters.sepolia.json", - "deploy:sepolia:FoRToken": "hardhat ignition deploy ignition/modules/FoRToken.ts --network sepolia --parameters ignition/parameters.sepolia.json" + "deploy:sepolia:FoRToken": "hardhat ignition deploy ignition/modules/FoRToken.ts --network sepolia --parameters ignition/parameters.sepolia.json", + "deploy:sepolia:Router": "hardhat ignition deploy ignition/modules/Router.ts --network sepolia --parameters ignition/parameters.sepolia.json" }, "type": "module", "devDependencies": { diff --git a/packages/contract/test/FORToken.ts b/packages/contract/test/FoRToken.ts similarity index 96% rename from packages/contract/test/FORToken.ts rename to packages/contract/test/FoRToken.ts index ad2ef90..0cd72ed 100644 --- a/packages/contract/test/FORToken.ts +++ b/packages/contract/test/FoRToken.ts @@ -2,13 +2,7 @@ import assert from "node:assert/strict"; import { describe, it } from "node:test"; import { network } from "hardhat"; -import { - encodeAbiParameters, - getAddress, - keccak256, - parseEther, - toHex, -} from "viem"; +import { encodeAbiParameters, keccak256, parseEther, toHex } from "viem"; import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; describe("FoRToken", async () => { @@ -22,7 +16,6 @@ describe("FoRToken", async () => { const SYMBOL = "FOR"; // Role constants - const DEFAULT_ADMIN_ROLE = "0x0000000000000000000000000000000000000000000000000000000000000000" as `0x${string}`; const ADMIN_ROLE = keccak256(toHex("ADMIN_ROLE")); // EIP712 constants @@ -337,7 +330,11 @@ describe("FoRToken", async () => { await forToken.write.transfer([newUser, transferAmount]); const userBalance = await forToken.read.balanceOf([newUser]); - assert.equal(userBalance, transferAmount, "User should have received tokens"); + assert.equal( + userBalance, + transferAmount, + "User should have received tokens", + ); // 7. Add another user to AllowList and verify token transfer between users await forToken.write.addToAllowList([account2.account.address]); @@ -347,8 +344,14 @@ describe("FoRToken", async () => { parseEther("50"), ]); - const account2Balance = await forToken.read.balanceOf([account2.account.address]); - assert.equal(account2Balance, parseEther("50"), "Account2 should have received tokens from user"); + const account2Balance = await forToken.read.balanceOf([ + account2.account.address, + ]); + assert.equal( + account2Balance, + parseEther("50"), + "Account2 should have received tokens from user", + ); }); // ============================================ @@ -603,6 +606,10 @@ describe("FoRToken", async () => { const supportsInterface = await forToken.read.supportsInterface([ "0x7965db0b", ]); - assert.equal(supportsInterface, true, "Should support IAccessControl interface"); + assert.equal( + supportsInterface, + true, + "Should support IAccessControl interface", + ); }); }); diff --git a/packages/contract/test/Router.transferWithPermit.ts b/packages/contract/test/Router.transferWithPermit.ts index 8948af7..50c9d39 100644 --- a/packages/contract/test/Router.transferWithPermit.ts +++ b/packages/contract/test/Router.transferWithPermit.ts @@ -1,926 +1,1090 @@ import assert from "node:assert/strict"; import { describe, it } from "node:test"; import { network } from "hardhat"; -import { parseEther, getAddress, type Address } from "viem"; +import { type Address, decodeEventLog, getAddress, parseEther } from "viem"; describe("Router.transferWithPermit", async () => { - const { viem } = await network.connect(); - const [deployer, account1, account2, fundWallet] = - await viem.getWalletClients(); - const publicClient = await viem.getPublicClient(); - - const NAME = "FoR"; - const SYMBOL = "FOR"; - const INITIAL_SUPPLY = parseEther("1000000"); - - // Test parameters - const fundRatio = 2000n; // 20% - const burnRatio = 1000n; // 10% - const BURN_ADDRESS = "0x000000000000000000000000000000000000dEaD" as Address; - - // Helper function to create permit signature - async function createPermitSignature( - signer: typeof account1, - token: any, - spender: Address, - amount: bigint, - deadline: bigint, - ) { - const nonce = await token.read.nonces([signer.account.address]); - const chainId = await publicClient.getChainId(); - - const domain = { - name: NAME, - version: "1", - chainId: chainId, - verifyingContract: token.address as Address, - }; - - const types = { - Permit: [ - { name: "owner", type: "address" }, - { name: "spender", type: "address" }, - { name: "value", type: "uint256" }, - { name: "nonce", type: "uint256" }, - { name: "deadline", type: "uint256" }, - ], - }; - - const message = { - owner: signer.account.address, - spender: spender, - value: amount, - nonce: nonce, - deadline: deadline, - }; - - const signature = await signer.signTypedData({ - domain, - types, - primaryType: "Permit", - message, - }); - - const r = `0x${signature.slice(2, 66)}` as `0x${string}`; - const s = `0x${signature.slice(66, 130)}` as `0x${string}`; - const v = Number.parseInt(signature.slice(130, 132), 16); - - return { v, r, s, nonce }; - } - - // A. Happy Path Tests - describe("Happy Path", () => { - it("Should transfer with permit and distribute correctly with standard ratios", async () => { - // Deploy contracts - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - // Give account1 tokens - await forToken.write.transfer([ - account1.account.address, - parseEther("1000"), - ]); - - // Create permit signature - const amount = parseEther("100"); - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - // Execute transferWithPermit - const hash = await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - v, - r, - s, - ]); - - await publicClient.waitForTransactionReceipt({ hash }); - - // Calculate expected amounts - const expectedFundAmount = (amount * fundRatio) / 10000n; - const expectedBurnAmount = (amount * burnRatio) / 10000n; - const expectedRecipientAmount = - amount - expectedFundAmount - expectedBurnAmount; - - // Verify balances - assert.equal( - await forToken.read.balanceOf([fundWallet.account.address]), - expectedFundAmount, - "Fund wallet should receive correct amount", - ); - assert.equal( - await forToken.read.balanceOf([BURN_ADDRESS]), - expectedBurnAmount, - "Burn address should receive correct amount", - ); - assert.equal( - await forToken.read.balanceOf([account2.account.address]), - expectedRecipientAmount, - "Recipient should receive correct amount", - ); - }); - - it("Should transfer with zero ratios (100% to recipient)", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - 0n, // 0% fund - 0n, // 0% burn - ]); - - await forToken.write.transfer([ - account1.account.address, - parseEther("1000"), - ]); - - const amount = parseEther("100"); - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - v, - r, - s, - ]); - - // All should go to recipient - assert.equal( - await forToken.read.balanceOf([account2.account.address]), - amount, - "Recipient should receive 100%", - ); - }); - - it("Should transfer with maximum ratios (100% total)", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - 5000n, // 50% fund - 5000n, // 50% burn - ]); - - await forToken.write.transfer([ - account1.account.address, - parseEther("1000"), - ]); - - const amount = parseEther("100"); - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - v, - r, - s, - ]); - - // Verify distribution - const fundAmount = await forToken.read.balanceOf([ - fundWallet.account.address, - ]); - const burnAmount = await forToken.read.balanceOf([BURN_ADDRESS]); - const recipientAmount = await forToken.read.balanceOf([ - account2.account.address, - ]); - - assert.equal(fundAmount, parseEther("50")); - assert.equal(burnAmount, parseEther("50")); - assert.equal(recipientAmount, 0n); - }); - }); - - // B. Distribution Validation Tests - describe("Distribution Validation", () => { - it("Should calculate exact distribution amounts", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - await forToken.write.transfer([ - account1.account.address, - parseEther("1000"), - ]); - - const amount = parseEther("100"); - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - v, - r, - s, - ]); - - // Verify sum equals total - const fundAmount = await forToken.read.balanceOf([ - fundWallet.account.address, - ]); - const burnAmount = await forToken.read.balanceOf([BURN_ADDRESS]); - const recipientAmount = await forToken.read.balanceOf([ - account2.account.address, - ]); - - assert.equal( - fundAmount + burnAmount + recipientAmount, - amount, - "Sum of distributions should equal total amount", - ); - }); - - it("Should handle rounding with small amounts", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - await forToken.write.transfer([account1.account.address, 1000n]); - - const amount = 10n; // Very small amount - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - v, - r, - s, - ]); - - // Verify no over-distribution due to rounding - const fundAmount = await forToken.read.balanceOf([ - fundWallet.account.address, - ]); - const burnAmount = await forToken.read.balanceOf([BURN_ADDRESS]); - const recipientAmount = await forToken.read.balanceOf([ - account2.account.address, - ]); - - assert.ok( - fundAmount + burnAmount + recipientAmount <= amount, - "Rounding should not cause over-distribution", - ); - }); - }); - - // C. Permit Integration Tests - describe("Permit Integration", () => { - it("Should fail with expired permit", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - await forToken.write.transfer([ - account1.account.address, - parseEther("1000"), - ]); - - const amount = parseEther("100"); - const deadline = BigInt(Math.floor(Date.now() / 1000) - 3600); // Expired - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - await assert.rejects( - async () => { - await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - v, - r, - s, - ]); - }, - (error: Error) => { - return error.message.includes("ERC2612ExpiredSignature"); - }, - "Should fail with expired permit", - ); - }); - - it("Should fail with invalid signature", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - await forToken.write.transfer([ - account1.account.address, - parseEther("1000"), - ]); - - const amount = parseEther("100"); - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - - // Use invalid signature - const invalidR = - "0x0000000000000000000000000000000000000000000000000000000000000001" as `0x${string}`; - const invalidS = - "0x0000000000000000000000000000000000000000000000000000000000000001" as `0x${string}`; - const invalidV = 27; - - await assert.rejects( - async () => { - await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - invalidV, - invalidR, - invalidS, - ]); - }, - (error: Error) => { - return error.message.includes("ERC2612InvalidSigner"); - }, - "Should fail with invalid signature", - ); - }); - - it("Should fail with reused permit (nonce already used)", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - await forToken.write.transfer([ - account1.account.address, - parseEther("1000"), - ]); - - const amount = parseEther("50"); - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - // First transfer should succeed - await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - v, - r, - s, - ]); - - // Second transfer with same signature should fail - await assert.rejects( - async () => { - await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - v, - r, - s, - ]); - }, - (error: Error) => { - return error.message.includes("ERC2612InvalidSigner"); - }, - "Should fail with reused permit", - ); - }); - }); - - // D. Error Handling Tests - describe("Error Handling", () => { - it("Should fail with zero amount", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - const amount = 0n; - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - await assert.rejects( - async () => { - await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - v, - r, - s, - ]); - }, - (error: Error) => { - return error.message.includes("InvalidAmount"); - }, - "Should fail with zero amount", - ); - }); - - it("Should fail with zero recipient address", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - await forToken.write.transfer([ - account1.account.address, - parseEther("1000"), - ]); - - const amount = parseEther("100"); - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - await assert.rejects( - async () => { - await router.write.transferWithPermit([ - account1.account.address, - "0x0000000000000000000000000000000000000000" as Address, // Zero address as recipient - amount, - deadline, - v, - r, - s, - ]); - }, - (error: Error) => { - return error.message.includes("InvalidRecipient"); - }, - "Should fail with zero recipient", - ); - }); - - it("Should fail with insufficient balance", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - // Don't give account1 any tokens - const amount = parseEther("100"); - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - await assert.rejects( - async () => { - await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - v, - r, - s, - ]); - }, - (error: Error) => { - return ( - error.message.includes("ERC20InsufficientBalance") || - error.message.includes("transfer failed") - ); - }, - "Should fail with insufficient balance", - ); - }); - - it("Should fail when contract is paused", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - await forToken.write.transfer([ - account1.account.address, - parseEther("1000"), - ]); - - // Pause the contract - await router.write.pause(); - - const amount = parseEther("100"); - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - await assert.rejects( - async () => { - await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - v, - r, - s, - ]); - }, - (error: Error) => { - return error.message.includes("EnforcedPause"); - }, - "Should fail when paused", - ); - }); - }); - - // E. Event Emission Tests - describe("Event Emission", () => { - it("Should emit TransferWithDistribution event with correct parameters", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - await forToken.write.transfer([ - account1.account.address, - parseEther("1000"), - ]); - - const amount = parseEther("100"); - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - const hash = await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - v, - r, - s, - ]); - - const receipt = await publicClient.waitForTransactionReceipt({ hash }); - - // Find the TransferWithDistribution event - const transferEvent = receipt.logs.find( - (log) => log.address.toLowerCase() === router.address.toLowerCase(), - ); - - assert.ok( - transferEvent, - "TransferWithDistribution event should be emitted", - ); - }); - }); - - // F. Edge Cases - describe("Edge Cases", () => { - it("Should handle self-transfer (from == recipient)", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - await forToken.write.transfer([ - account1.account.address, - parseEther("1000"), - ]); - - const initialBalance = await forToken.read.balanceOf([ - account1.account.address, - ]); - const amount = parseEther("100"); - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - await router.write.transferWithPermit([ - account1.account.address, - account1.account.address, // Self-transfer - amount, - deadline, - v, - r, - s, - ]); - - // account1 should have initial - fundAmount - burnAmount - const expectedFundAmount = (amount * fundRatio) / 10000n; - const expectedBurnAmount = (amount * burnRatio) / 10000n; - const finalBalance = await forToken.read.balanceOf([ - account1.account.address, - ]); - - assert.equal( - finalBalance, - initialBalance - expectedFundAmount - expectedBurnAmount, - "Self-transfer should work correctly", - ); - }); - - it("Should handle very large amounts", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - const largeAmount = parseEther("500000"); - await forToken.write.transfer([account1.account.address, largeAmount]); - - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - largeAmount, - deadline, - ); - - await router.write.transferWithPermit([ - account1.account.address, - account2.account.address, - largeAmount, - deadline, - v, - r, - s, - ]); - - // Verify distribution - const fundAmount = await forToken.read.balanceOf([ - fundWallet.account.address, - ]); - const burnAmount = await forToken.read.balanceOf([BURN_ADDRESS]); - const recipientAmount = await forToken.read.balanceOf([ - account2.account.address, - ]); - - assert.equal( - fundAmount + burnAmount + recipientAmount, - largeAmount, - "Large amount distribution should be accurate", - ); - }); - - it("Should handle relayer pattern (msg.sender != from)", async () => { - const forToken = await viem.deployContract("FoRToken", [ - INITIAL_SUPPLY, - NAME, - SYMBOL, - ]); - const router = await viem.deployContract("Router", [ - deployer.account.address, - forToken.address, - fundWallet.account.address, - fundRatio, - burnRatio, - ]); - - await forToken.write.transfer([ - account1.account.address, - parseEther("1000"), - ]); - - const amount = parseEther("100"); - const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); - const { v, r, s } = await createPermitSignature( - account1, - forToken, - router.address, - amount, - deadline, - ); - - // deployer (different from account1) calls transferWithPermit - const routerAsDeployer = await viem.getContractAt( - "Router", - router.address, - { - client: { wallet: deployer }, - }, - ); - - await routerAsDeployer.write.transferWithPermit([ - account1.account.address, - account2.account.address, - amount, - deadline, - v, - r, - s, - ]); - - // Verify transfer succeeded - const recipientBalance = await forToken.read.balanceOf([ - account2.account.address, - ]); - assert.ok( - recipientBalance > 0n, - "Relayer pattern should work (msg.sender != from)", - ); - }); - }); + const { viem } = await network.connect(); + const [deployer, account1, account2, fundWallet] = + await viem.getWalletClients(); + const publicClient = await viem.getPublicClient(); + type ForTokenContract = Awaited>; + + const NAME = "FoR"; + const SYMBOL = "FOR"; + const INITIAL_SUPPLY = parseEther("1000000"); + + // Test parameters + const fundRatio = 2000n; // 20% + const burnRatio = 1000n; // 10% + const BURN_ADDRESS = "0x000000000000000000000000000000000000dEaD" as Address; + + // Helper function to create permit signature + async function createPermitSignature( + signer: typeof account1, + token: ForTokenContract, + spender: Address, + amount: bigint, + deadline: bigint, + ) { + const nonce = await token.read.nonces([signer.account.address]); + const chainId = await publicClient.getChainId(); + + const domain = { + name: NAME, + version: "1", + chainId: chainId, + verifyingContract: token.address as Address, + }; + + const types = { + Permit: [ + { name: "owner", type: "address" }, + { name: "spender", type: "address" }, + { name: "value", type: "uint256" }, + { name: "nonce", type: "uint256" }, + { name: "deadline", type: "uint256" }, + ], + }; + + const message = { + owner: signer.account.address, + spender: spender, + value: amount, + nonce: nonce, + deadline: deadline, + }; + + const signature = await signer.signTypedData({ + domain, + types, + primaryType: "Permit", + message, + }); + + const r = `0x${signature.slice(2, 66)}` as `0x${string}`; + const s = `0x${signature.slice(66, 130)}` as `0x${string}`; + const v = Number.parseInt(signature.slice(130, 132), 16); + + return { v, r, s, nonce }; + } + + const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000" as Address; + + async function ensureAllowListed( + token: ForTokenContract, + addresses: Address[], + ) { + for (const address of addresses) { + if (address === ZERO_ADDRESS) { + continue; + } + + const isAllowed = await token.read.isAllowListed([address]); + if (!isAllowed) { + await token.write.addToAllowList([address]); + } + } + } + + async function allowListBase(token: ForTokenContract, extra: Address[] = []) { + await ensureAllowListed(token, [ + account1.account.address, + fundWallet.account.address, + BURN_ADDRESS, + ...extra, + ]); + } + + // A. Happy Path Tests + describe("Happy Path", () => { + it("Should transfer with permit and distribute correctly with standard ratios", async () => { + // Deploy contracts + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + // Give account1 tokens + await forToken.write.transfer([ + account1.account.address, + parseEther("1000"), + ]); + + // Create permit signature + const amount = parseEther("100"); + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + // Execute transferWithPermit + const hash = await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + v, + r, + s, + ]); + + await publicClient.waitForTransactionReceipt({ hash }); + + // Calculate expected amounts + const expectedFundAmount = (amount * fundRatio) / 10000n; + const expectedBurnAmount = (amount * burnRatio) / 10000n; + const expectedRecipientAmount = + amount - expectedFundAmount - expectedBurnAmount; + + // Verify balances + assert.equal( + await forToken.read.balanceOf([fundWallet.account.address]), + expectedFundAmount, + "Fund wallet should receive correct amount", + ); + assert.equal( + await forToken.read.balanceOf([BURN_ADDRESS]), + expectedBurnAmount, + "Burn address should receive correct amount", + ); + assert.equal( + await forToken.read.balanceOf([account2.account.address]), + expectedRecipientAmount, + "Recipient should receive correct amount", + ); + }); + + it("Should transfer with zero ratios (100% to recipient)", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + 0n, // 0% fund + 0n, // 0% burn + ]); + + await allowListBase(forToken, [account2.account.address]); + + await forToken.write.transfer([ + account1.account.address, + parseEther("1000"), + ]); + + const amount = parseEther("100"); + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + v, + r, + s, + ]); + + // All should go to recipient + assert.equal( + await forToken.read.balanceOf([account2.account.address]), + amount, + "Recipient should receive 100%", + ); + }); + + it("Should transfer with maximum ratios (100% total)", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + 5000n, // 50% fund + 5000n, // 50% burn + ]); + + await allowListBase(forToken, [account2.account.address]); + + await forToken.write.transfer([ + account1.account.address, + parseEther("1000"), + ]); + + const amount = parseEther("100"); + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + v, + r, + s, + ]); + + // Verify distribution + const fundAmount = await forToken.read.balanceOf([ + fundWallet.account.address, + ]); + const burnAmount = await forToken.read.balanceOf([BURN_ADDRESS]); + const recipientAmount = await forToken.read.balanceOf([ + account2.account.address, + ]); + + assert.equal(fundAmount, parseEther("50")); + assert.equal(burnAmount, parseEther("50")); + assert.equal(recipientAmount, 0n); + }); + }); + + // B. Distribution Validation Tests + describe("Distribution Validation", () => { + it("Should calculate exact distribution amounts", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + await forToken.write.transfer([ + account1.account.address, + parseEther("1000"), + ]); + + const amount = parseEther("100"); + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + v, + r, + s, + ]); + + // Verify sum equals total + const fundAmount = await forToken.read.balanceOf([ + fundWallet.account.address, + ]); + const burnAmount = await forToken.read.balanceOf([BURN_ADDRESS]); + const recipientAmount = await forToken.read.balanceOf([ + account2.account.address, + ]); + + assert.equal( + fundAmount + burnAmount + recipientAmount, + amount, + "Sum of distributions should equal total amount", + ); + }); + + it("Should handle rounding with small amounts", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + await forToken.write.transfer([account1.account.address, 1000n]); + + const amount = 10n; // Very small amount + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + v, + r, + s, + ]); + + // Verify no over-distribution due to rounding + const fundAmount = await forToken.read.balanceOf([ + fundWallet.account.address, + ]); + const burnAmount = await forToken.read.balanceOf([BURN_ADDRESS]); + const recipientAmount = await forToken.read.balanceOf([ + account2.account.address, + ]); + + assert.ok( + fundAmount + burnAmount + recipientAmount <= amount, + "Rounding should not cause over-distribution", + ); + }); + }); + + // C. Permit Integration Tests + describe("Permit Integration", () => { + it("Should fail with expired permit", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + await forToken.write.transfer([ + account1.account.address, + parseEther("1000"), + ]); + + const amount = parseEther("100"); + const deadline = BigInt(Math.floor(Date.now() / 1000) - 3600); // Expired + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + await assert.rejects( + async () => { + await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + v, + r, + s, + ]); + }, + (error: Error) => { + return error.message.includes("ERC2612ExpiredSignature"); + }, + "Should fail with expired permit", + ); + }); + + it("Should fail with invalid signature", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + await forToken.write.transfer([ + account1.account.address, + parseEther("1000"), + ]); + + const amount = parseEther("100"); + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + + // Use invalid signature + const invalidR = + "0x0000000000000000000000000000000000000000000000000000000000000001" as `0x${string}`; + const invalidS = + "0x0000000000000000000000000000000000000000000000000000000000000001" as `0x${string}`; + const invalidV = 27; + + await assert.rejects( + async () => { + await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + invalidV, + invalidR, + invalidS, + ]); + }, + (error: Error) => { + return error.message.includes("ERC2612InvalidSigner"); + }, + "Should fail with invalid signature", + ); + }); + + it("Should fail with reused permit (nonce already used)", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + await forToken.write.transfer([ + account1.account.address, + parseEther("1000"), + ]); + + const amount = parseEther("50"); + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + // First transfer should succeed + await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + v, + r, + s, + ]); + + // Second transfer with same signature should fail + await assert.rejects( + async () => { + await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + v, + r, + s, + ]); + }, + (error: Error) => { + return error.message.includes("ERC2612InvalidSigner"); + }, + "Should fail with reused permit", + ); + }); + }); + + // D. Error Handling Tests + describe("Error Handling", () => { + it("Should fail with zero amount", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + const amount = 0n; + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + await assert.rejects( + async () => { + await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + v, + r, + s, + ]); + }, + (error: Error) => { + return error.message.includes("InvalidAmount"); + }, + "Should fail with zero amount", + ); + }); + + it("Should fail with zero recipient address", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + await forToken.write.transfer([ + account1.account.address, + parseEther("1000"), + ]); + + const amount = parseEther("100"); + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + await assert.rejects( + async () => { + await router.write.transferWithPermit([ + account1.account.address, + "0x0000000000000000000000000000000000000000" as Address, // Zero address as recipient + amount, + deadline, + v, + r, + s, + ]); + }, + (error: Error) => { + return error.message.includes("InvalidRecipient"); + }, + "Should fail with zero recipient", + ); + }); + + it("Should fail with insufficient balance", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + // Don't give account1 any tokens + const amount = parseEther("100"); + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + await assert.rejects( + async () => { + await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + v, + r, + s, + ]); + }, + (error: Error) => { + return ( + error.message.includes("ERC20InsufficientBalance") || + error.message.includes("transfer failed") + ); + }, + "Should fail with insufficient balance", + ); + }); + + it("Should fail when contract is paused", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + await forToken.write.transfer([ + account1.account.address, + parseEther("1000"), + ]); + + // Pause the contract + await router.write.pause(); + + const amount = parseEther("100"); + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + await assert.rejects( + async () => { + await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + v, + r, + s, + ]); + }, + (error: Error) => { + return error.message.includes("EnforcedPause"); + }, + "Should fail when paused", + ); + }); + }); + + // E. Event Emission Tests + describe("Event Emission", () => { + it("Should emit TransferWithDistribution event with correct parameters", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + await forToken.write.transfer([ + account1.account.address, + parseEther("1000"), + ]); + + const amount = parseEther("100"); + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + const hash = await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + v, + r, + s, + ]); + + const receipt = await publicClient.waitForTransactionReceipt({ hash }); + + // Find the TransferWithDistribution event + const transferEvent = receipt.logs.find( + (log) => log.address.toLowerCase() === router.address.toLowerCase(), + ); + + assert.ok( + transferEvent, + "TransferWithDistribution event should be emitted", + ); + }); + + it("Should emit DistributionRatioUpdated on setFundRatio with correct values", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + const newFundRatio = 3000n; + const hash = await router.write.setFundRatio([newFundRatio]); + const receipt = await publicClient.waitForTransactionReceipt({ hash }); + const eventLog = receipt.logs.find( + (log) => log.address.toLowerCase() === router.address.toLowerCase(), + ); + + assert.ok(eventLog, "DistributionRatioUpdated event should be emitted"); + + const decoded = decodeEventLog({ + abi: router.abi, + data: eventLog.data, + topics: eventLog.topics, + eventName: "DistributionRatioUpdated", + }); + + assert.equal( + getAddress(decoded.args.changedBy), + getAddress(deployer.account.address), + "changedBy should match msg.sender", + ); + assert.equal( + decoded.args.fundRatio, + newFundRatio, + "fundRatio should be updated value", + ); + assert.equal( + decoded.args.burnRatio, + burnRatio, + "burnRatio should keep previous value", + ); + assert.equal( + decoded.args.recipientRatio, + 10000n - newFundRatio - burnRatio, + "recipientRatio should be derived correctly", + ); + }); + + it("Should emit DistributionRatioUpdated on setBurnRatio with correct values", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + const newBurnRatio = 1500n; + const hash = await router.write.setBurnRatio([newBurnRatio]); + const receipt = await publicClient.waitForTransactionReceipt({ hash }); + const eventLog = receipt.logs.find( + (log) => log.address.toLowerCase() === router.address.toLowerCase(), + ); + + assert.ok(eventLog, "DistributionRatioUpdated event should be emitted"); + + const decoded = decodeEventLog({ + abi: router.abi, + data: eventLog.data, + topics: eventLog.topics, + eventName: "DistributionRatioUpdated", + }); + + assert.equal( + getAddress(decoded.args.changedBy), + getAddress(deployer.account.address), + "changedBy should match msg.sender", + ); + assert.equal( + decoded.args.fundRatio, + fundRatio, + "fundRatio should keep previous value", + ); + assert.equal( + decoded.args.burnRatio, + newBurnRatio, + "burnRatio should be updated value", + ); + assert.equal( + decoded.args.recipientRatio, + 10000n - fundRatio - newBurnRatio, + "recipientRatio should be derived correctly", + ); + }); + }); + + // F. Edge Cases + describe("Edge Cases", () => { + it("Should handle self-transfer (from == recipient)", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + await forToken.write.transfer([ + account1.account.address, + parseEther("1000"), + ]); + + const initialBalance = await forToken.read.balanceOf([ + account1.account.address, + ]); + const amount = parseEther("100"); + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + await router.write.transferWithPermit([ + account1.account.address, + account1.account.address, // Self-transfer + amount, + deadline, + v, + r, + s, + ]); + + // account1 should have initial - fundAmount - burnAmount + const expectedFundAmount = (amount * fundRatio) / 10000n; + const expectedBurnAmount = (amount * burnRatio) / 10000n; + const finalBalance = await forToken.read.balanceOf([ + account1.account.address, + ]); + + assert.equal( + finalBalance, + initialBalance - expectedFundAmount - expectedBurnAmount, + "Self-transfer should work correctly", + ); + }); + + it("Should handle very large amounts", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + const largeAmount = parseEther("500000"); + await forToken.write.transfer([account1.account.address, largeAmount]); + + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + largeAmount, + deadline, + ); + + await router.write.transferWithPermit([ + account1.account.address, + account2.account.address, + largeAmount, + deadline, + v, + r, + s, + ]); + + // Verify distribution + const fundAmount = await forToken.read.balanceOf([ + fundWallet.account.address, + ]); + const burnAmount = await forToken.read.balanceOf([BURN_ADDRESS]); + const recipientAmount = await forToken.read.balanceOf([ + account2.account.address, + ]); + + assert.equal( + fundAmount + burnAmount + recipientAmount, + largeAmount, + "Large amount distribution should be accurate", + ); + }); + + it("Should handle relayer pattern (msg.sender != from)", async () => { + const forToken = await viem.deployContract("FoRToken", [ + INITIAL_SUPPLY, + NAME, + SYMBOL, + ]); + const router = await viem.deployContract("Router", [ + deployer.account.address, + forToken.address, + fundWallet.account.address, + fundRatio, + burnRatio, + ]); + + await allowListBase(forToken, [account2.account.address]); + + await forToken.write.transfer([ + account1.account.address, + parseEther("1000"), + ]); + + const amount = parseEther("100"); + const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600); + const { v, r, s } = await createPermitSignature( + account1, + forToken, + router.address, + amount, + deadline, + ); + + // deployer (different from account1) calls transferWithPermit + const routerAsDeployer = await viem.getContractAt( + "Router", + router.address, + { + client: { wallet: deployer }, + }, + ); + + await routerAsDeployer.write.transferWithPermit([ + account1.account.address, + account2.account.address, + amount, + deadline, + v, + r, + s, + ]); + + // Verify transfer succeeded + const recipientBalance = await forToken.read.balanceOf([ + account2.account.address, + ]); + assert.ok( + recipientBalance > 0n, + "Relayer pattern should work (msg.sender != from)", + ); + }); + }); }); diff --git a/packages/contract/test/Router.ts b/packages/contract/test/Router.ts index 1657afb..e501936 100644 --- a/packages/contract/test/Router.ts +++ b/packages/contract/test/Router.ts @@ -4,313 +4,313 @@ import { network } from "hardhat"; import { getAddress } from "viem"; describe("Router", async () => { - const { viem } = await network.connect(); - const [owner, user1] = await viem.getWalletClients(); - - const fundWallet = - "0x1234567890123456789012345678901234567890" as `0x${string}`; - const fundRatio = 2000n; // 20% - const burnRatio = 1000n; // 10% - - it("Should deploy with correct initial values", async () => { - const forToken = - "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address - const router = await viem.deployContract("Router", [ - owner.account.address, - forToken, - fundWallet, - fundRatio, - burnRatio, - ]); - - assert.equal(await router.read.fundWallet(), fundWallet); - assert.equal(await router.read.fundRatio(), fundRatio); - assert.equal(await router.read.burnRatio(), burnRatio); - assert.equal( - await router.read.BURN_ADDRESS(), - "0x000000000000000000000000000000000000dEaD", - ); - }); - - it("Should set up initial roles correctly", async () => { - const forToken = - "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address - const router = await viem.deployContract("Router", [ - owner.account.address, - forToken, - fundWallet, - fundRatio, - burnRatio, - ]); - - const FUND_MANAGER_ROLE = await router.read.FUND_MANAGER_ROLE(); - const RATIO_MANAGER_ROLE = await router.read.RATIO_MANAGER_ROLE(); - const DEFAULT_ADMIN_ROLE = await router.read.DEFAULT_ADMIN_ROLE(); - - assert.equal( - await router.read.hasRole([DEFAULT_ADMIN_ROLE, owner.account.address]), - true, - "Owner should have DEFAULT_ADMIN_ROLE", - ); - assert.equal( - await router.read.hasRole([FUND_MANAGER_ROLE, owner.account.address]), - true, - "Owner should have FUND_MANAGER_ROLE", - ); - assert.equal( - await router.read.hasRole([RATIO_MANAGER_ROLE, owner.account.address]), - true, - "Owner should have RATIO_MANAGER_ROLE", - ); - }); - - it("Should allow RATIO_MANAGER_ROLE to set fund ratio", async () => { - const forToken = - "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address - const router = await viem.deployContract("Router", [ - owner.account.address, - forToken, - fundWallet, - fundRatio, - burnRatio, - ]); - - const newFundRatio = 3000n; // 30% - await router.write.setFundRatio([newFundRatio]); - - assert.equal(await router.read.fundRatio(), newFundRatio); - }); - - it("Should allow RATIO_MANAGER_ROLE to set burn ratio", async () => { - const forToken = - "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address - const router = await viem.deployContract("Router", [ - owner.account.address, - forToken, - fundWallet, - fundRatio, - burnRatio, - ]); - - const newBurnRatio = 1500n; // 15% - await router.write.setBurnRatio([newBurnRatio]); - - assert.equal(await router.read.burnRatio(), newBurnRatio); - }); - - it("Should allow FUND_MANAGER_ROLE to set fund wallet", async () => { - const forToken = - "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address - const router = await viem.deployContract("Router", [ - owner.account.address, - forToken, - fundWallet, - fundRatio, - burnRatio, - ]); - - const newFundWallet = getAddress( - "0xabcdef0123456789012345678901234567890123", - ); - await router.write.setFundWallet([newFundWallet]); - - assert.equal( - (await router.read.fundWallet()).toLowerCase(), - newFundWallet.toLowerCase(), - ); - }); - - it("Should reject fund ratio that exceeds 100% total", async () => { - const forToken = - "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address - const router = await viem.deployContract("Router", [ - owner.account.address, - forToken, - fundWallet, - fundRatio, - burnRatio, - ]); - - const invalidFundRatio = 9500n; // 95%, total would be 105% - - await assert.rejects( - async () => { - await router.write.setFundRatio([invalidFundRatio]); - }, - (error: Error) => { - return error.message.includes("Total ratio exceeds 100%"); - }, - ); - }); - - it("Should reject burn ratio that exceeds 100% total", async () => { - const forToken = - "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address - const router = await viem.deployContract("Router", [ - owner.account.address, - forToken, - fundWallet, - fundRatio, - burnRatio, - ]); - - const invalidBurnRatio = 8500n; // 85%, total would be 105% - - await assert.rejects( - async () => { - await router.write.setBurnRatio([invalidBurnRatio]); - }, - (error: Error) => { - return error.message.includes("Total ratio exceeds 100%"); - }, - ); - }); - - it("Should reject zero address for fund wallet", async () => { - const forToken = - "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address - const router = await viem.deployContract("Router", [ - owner.account.address, - forToken, - fundWallet, - fundRatio, - burnRatio, - ]); - - const zeroAddress = - "0x0000000000000000000000000000000000000000" as `0x${string}`; - - await assert.rejects( - async () => { - await router.write.setFundWallet([zeroAddress]); - }, - (error: Error) => { - return error.message.includes("Invalid fund wallet address"); - }, - ); - }); - - it("Should allow granting RATIO_MANAGER_ROLE", async () => { - const forToken = - "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address - const router = await viem.deployContract("Router", [ - owner.account.address, - forToken, - fundWallet, - fundRatio, - burnRatio, - ]); - - const RATIO_MANAGER_ROLE = await router.read.RATIO_MANAGER_ROLE(); - - await router.write.grantRole([RATIO_MANAGER_ROLE, user1.account.address]); - - assert.equal( - await router.read.hasRole([RATIO_MANAGER_ROLE, user1.account.address]), - true, - "user1 should have RATIO_MANAGER_ROLE", - ); - }); - - it("Should allow revoking RATIO_MANAGER_ROLE", async () => { - const forToken = - "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address - const router = await viem.deployContract("Router", [ - owner.account.address, - forToken, - fundWallet, - fundRatio, - burnRatio, - ]); - - const RATIO_MANAGER_ROLE = await router.read.RATIO_MANAGER_ROLE(); - - await router.write.grantRole([RATIO_MANAGER_ROLE, user1.account.address]); - await router.write.revokeRole([RATIO_MANAGER_ROLE, user1.account.address]); - - assert.equal( - await router.read.hasRole([RATIO_MANAGER_ROLE, user1.account.address]), - false, - "user1 should not have RATIO_MANAGER_ROLE", - ); - }); - - it("Should reject unauthorized access to setFundRatio", async () => { - const forToken = - "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address - const router = await viem.deployContract("Router", [ - owner.account.address, - forToken, - fundWallet, - fundRatio, - burnRatio, - ]); - - const routerAsUser1 = await viem.getContractAt("Router", router.address, { - client: { wallet: user1 }, - }); - - await assert.rejects( - async () => { - await routerAsUser1.write.setFundRatio([3000n]); - }, - (error: Error) => { - return error.message.includes("AccessControl"); - }, - ); - }); - - it("Should reject unauthorized access to setBurnRatio", async () => { - const forToken = - "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address - const router = await viem.deployContract("Router", [ - owner.account.address, - forToken, - fundWallet, - fundRatio, - burnRatio, - ]); - - const routerAsUser1 = await viem.getContractAt("Router", router.address, { - client: { wallet: user1 }, - }); - - await assert.rejects( - async () => { - await routerAsUser1.write.setBurnRatio([1500n]); - }, - (error: Error) => { - return error.message.includes("AccessControl"); - }, - ); - }); - - it("Should reject unauthorized access to setFundWallet", async () => { - const forToken = - "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address - const router = await viem.deployContract("Router", [ - owner.account.address, - forToken, - fundWallet, - fundRatio, - burnRatio, - ]); - - const routerAsUser1 = await viem.getContractAt("Router", router.address, { - client: { wallet: user1 }, - }); - - const newFundWallet = getAddress( - "0xabcdef0123456789012345678901234567890123", - ); - - await assert.rejects( - async () => { - await routerAsUser1.write.setFundWallet([newFundWallet]); - }, - (error: Error) => { - return error.message.includes("AccessControl"); - }, - ); - }); + const { viem } = await network.connect(); + const [owner, user1] = await viem.getWalletClients(); + + const fundWallet = + "0x1234567890123456789012345678901234567890" as `0x${string}`; + const fundRatio = 2000n; // 20% + const burnRatio = 1000n; // 10% + + it("Should deploy with correct initial values", async () => { + const forToken = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const router = await viem.deployContract("Router", [ + owner.account.address, + forToken, + fundWallet, + fundRatio, + burnRatio, + ]); + + assert.equal(await router.read.fundWallet(), fundWallet); + assert.equal(await router.read.fundRatio(), fundRatio); + assert.equal(await router.read.burnRatio(), burnRatio); + assert.equal( + await router.read.BURN_ADDRESS(), + "0x000000000000000000000000000000000000dEaD", + ); + }); + + it("Should set up initial roles correctly", async () => { + const forToken = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const router = await viem.deployContract("Router", [ + owner.account.address, + forToken, + fundWallet, + fundRatio, + burnRatio, + ]); + + const FUND_MANAGER_ROLE = await router.read.FUND_MANAGER_ROLE(); + const RATIO_MANAGER_ROLE = await router.read.RATIO_MANAGER_ROLE(); + const DEFAULT_ADMIN_ROLE = await router.read.DEFAULT_ADMIN_ROLE(); + + assert.equal( + await router.read.hasRole([DEFAULT_ADMIN_ROLE, owner.account.address]), + true, + "Owner should have DEFAULT_ADMIN_ROLE", + ); + assert.equal( + await router.read.hasRole([FUND_MANAGER_ROLE, owner.account.address]), + true, + "Owner should have FUND_MANAGER_ROLE", + ); + assert.equal( + await router.read.hasRole([RATIO_MANAGER_ROLE, owner.account.address]), + true, + "Owner should have RATIO_MANAGER_ROLE", + ); + }); + + it("Should allow RATIO_MANAGER_ROLE to set fund ratio", async () => { + const forToken = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const router = await viem.deployContract("Router", [ + owner.account.address, + forToken, + fundWallet, + fundRatio, + burnRatio, + ]); + + const newFundRatio = 3000n; // 30% + await router.write.setFundRatio([newFundRatio]); + + assert.equal(await router.read.fundRatio(), newFundRatio); + }); + + it("Should allow RATIO_MANAGER_ROLE to set burn ratio", async () => { + const forToken = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const router = await viem.deployContract("Router", [ + owner.account.address, + forToken, + fundWallet, + fundRatio, + burnRatio, + ]); + + const newBurnRatio = 1500n; // 15% + await router.write.setBurnRatio([newBurnRatio]); + + assert.equal(await router.read.burnRatio(), newBurnRatio); + }); + + it("Should allow FUND_MANAGER_ROLE to set fund wallet", async () => { + const forToken = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const router = await viem.deployContract("Router", [ + owner.account.address, + forToken, + fundWallet, + fundRatio, + burnRatio, + ]); + + const newFundWallet = getAddress( + "0xabcdef0123456789012345678901234567890123", + ); + await router.write.setFundWallet([newFundWallet]); + + assert.equal( + (await router.read.fundWallet()).toLowerCase(), + newFundWallet.toLowerCase(), + ); + }); + + it("Should reject fund ratio that exceeds 100% total", async () => { + const forToken = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const router = await viem.deployContract("Router", [ + owner.account.address, + forToken, + fundWallet, + fundRatio, + burnRatio, + ]); + + const invalidFundRatio = 9500n; // 95%, total would be 105% + + await assert.rejects( + async () => { + await router.write.setFundRatio([invalidFundRatio]); + }, + (error: Error) => { + return error.message.includes("Total ratio exceeds 100%"); + }, + ); + }); + + it("Should reject burn ratio that exceeds 100% total", async () => { + const forToken = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const router = await viem.deployContract("Router", [ + owner.account.address, + forToken, + fundWallet, + fundRatio, + burnRatio, + ]); + + const invalidBurnRatio = 8500n; // 85%, total would be 105% + + await assert.rejects( + async () => { + await router.write.setBurnRatio([invalidBurnRatio]); + }, + (error: Error) => { + return error.message.includes("Total ratio exceeds 100%"); + }, + ); + }); + + it("Should reject zero address for fund wallet", async () => { + const forToken = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const router = await viem.deployContract("Router", [ + owner.account.address, + forToken, + fundWallet, + fundRatio, + burnRatio, + ]); + + const zeroAddress = + "0x0000000000000000000000000000000000000000" as `0x${string}`; + + await assert.rejects( + async () => { + await router.write.setFundWallet([zeroAddress]); + }, + (error: Error) => { + return error.message.includes("Invalid fund wallet address"); + }, + ); + }); + + it("Should allow granting RATIO_MANAGER_ROLE", async () => { + const forToken = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const router = await viem.deployContract("Router", [ + owner.account.address, + forToken, + fundWallet, + fundRatio, + burnRatio, + ]); + + const RATIO_MANAGER_ROLE = await router.read.RATIO_MANAGER_ROLE(); + + await router.write.grantRole([RATIO_MANAGER_ROLE, user1.account.address]); + + assert.equal( + await router.read.hasRole([RATIO_MANAGER_ROLE, user1.account.address]), + true, + "user1 should have RATIO_MANAGER_ROLE", + ); + }); + + it("Should allow revoking RATIO_MANAGER_ROLE", async () => { + const forToken = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const router = await viem.deployContract("Router", [ + owner.account.address, + forToken, + fundWallet, + fundRatio, + burnRatio, + ]); + + const RATIO_MANAGER_ROLE = await router.read.RATIO_MANAGER_ROLE(); + + await router.write.grantRole([RATIO_MANAGER_ROLE, user1.account.address]); + await router.write.revokeRole([RATIO_MANAGER_ROLE, user1.account.address]); + + assert.equal( + await router.read.hasRole([RATIO_MANAGER_ROLE, user1.account.address]), + false, + "user1 should not have RATIO_MANAGER_ROLE", + ); + }); + + it("Should reject unauthorized access to setFundRatio", async () => { + const forToken = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const router = await viem.deployContract("Router", [ + owner.account.address, + forToken, + fundWallet, + fundRatio, + burnRatio, + ]); + + const routerAsUser1 = await viem.getContractAt("Router", router.address, { + client: { wallet: user1 }, + }); + + await assert.rejects( + async () => { + await routerAsUser1.write.setFundRatio([3000n]); + }, + (error: Error) => { + return error.message.includes("AccessControl"); + }, + ); + }); + + it("Should reject unauthorized access to setBurnRatio", async () => { + const forToken = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const router = await viem.deployContract("Router", [ + owner.account.address, + forToken, + fundWallet, + fundRatio, + burnRatio, + ]); + + const routerAsUser1 = await viem.getContractAt("Router", router.address, { + client: { wallet: user1 }, + }); + + await assert.rejects( + async () => { + await routerAsUser1.write.setBurnRatio([1500n]); + }, + (error: Error) => { + return error.message.includes("AccessControl"); + }, + ); + }); + + it("Should reject unauthorized access to setFundWallet", async () => { + const forToken = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const router = await viem.deployContract("Router", [ + owner.account.address, + forToken, + fundWallet, + fundRatio, + burnRatio, + ]); + + const routerAsUser1 = await viem.getContractAt("Router", router.address, { + client: { wallet: user1 }, + }); + + const newFundWallet = getAddress( + "0xabcdef0123456789012345678901234567890123", + ); + + await assert.rejects( + async () => { + await routerAsUser1.write.setFundWallet([newFundWallet]); + }, + (error: Error) => { + return error.message.includes("AccessControl"); + }, + ); + }); }); diff --git a/packages/contract/test/RouterFactory.ts b/packages/contract/test/RouterFactory.ts index f6723c4..bea6396 100644 --- a/packages/contract/test/RouterFactory.ts +++ b/packages/contract/test/RouterFactory.ts @@ -16,7 +16,8 @@ describe("RouterFactory", async () => { }); // Test parameters - const FOR_TOKEN = "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address + const FOR_TOKEN = + "0x0000000000000000000000000000000000001234" as `0x${string}`; // Dummy FORToken address const FUND_WALLET = deployer.account.address; const FUND_RATIO = 100n; // 1% const BURN_RATIO = 50n; // 0.5% @@ -65,7 +66,14 @@ describe("RouterFactory", async () => { // Deploy Router contract via CREATE2 const deployHash = await routerFactory.write.deploy( - [SALT, deployer.account.address, FOR_TOKEN, FUND_WALLET, FUND_RATIO, BURN_RATIO], + [ + SALT, + deployer.account.address, + FOR_TOKEN, + FUND_WALLET, + FUND_RATIO, + BURN_RATIO, + ], { account: deployer.account }, ); @@ -97,7 +105,14 @@ describe("RouterFactory", async () => { ]); const deployHash1 = await routerFactory.write.deploy( - [SALT_1, deployer.account.address, FOR_TOKEN, FUND_WALLET, FUND_RATIO, BURN_RATIO], + [ + SALT_1, + deployer.account.address, + FOR_TOKEN, + FUND_WALLET, + FUND_RATIO, + BURN_RATIO, + ], { account: deployer.account }, ); await publicClient.waitForTransactionReceipt({ hash: deployHash1 }); @@ -173,13 +188,27 @@ describe("RouterFactory", async () => { // Deploy actual contracts const deployHash1 = await routerFactory.write.deploy( - [SALT_1, deployer.account.address, FOR_TOKEN, FUND_WALLET, FUND_RATIO_1, BURN_RATIO_1], + [ + SALT_1, + deployer.account.address, + FOR_TOKEN, + FUND_WALLET, + FUND_RATIO_1, + BURN_RATIO_1, + ], { account: deployer.account }, ); await publicClient.waitForTransactionReceipt({ hash: deployHash1 }); const deployHash2 = await routerFactory.write.deploy( - [SALT_2, deployer.account.address, FOR_TOKEN, FUND_WALLET, FUND_RATIO_2, BURN_RATIO_2], + [ + SALT_2, + deployer.account.address, + FOR_TOKEN, + FUND_WALLET, + FUND_RATIO_2, + BURN_RATIO_2, + ], { account: deployer.account }, ); await publicClient.waitForTransactionReceipt({ hash: deployHash2 }); @@ -215,7 +244,14 @@ describe("RouterFactory", async () => { ]); const deployHash = await routerFactory.write.deploy( - [SALT_TEST, deployer.account.address, FOR_TOKEN, TEST_FUND_WALLET, TEST_FUND_RATIO, TEST_BURN_RATIO], + [ + SALT_TEST, + deployer.account.address, + FOR_TOKEN, + TEST_FUND_WALLET, + TEST_FUND_RATIO, + TEST_BURN_RATIO, + ], { account: deployer.account }, ); await publicClient.waitForTransactionReceipt({ hash: deployHash }); @@ -254,7 +290,14 @@ describe("RouterFactory", async () => { ]); const deployHash = await routerFactory.write.deploy( - [SALT_ACCESS, deployer.account.address, FOR_TOKEN, FUND_WALLET, FUND_RATIO, BURN_RATIO], + [ + SALT_ACCESS, + deployer.account.address, + FOR_TOKEN, + FUND_WALLET, + FUND_RATIO, + BURN_RATIO, + ], { account: deployer.account }, ); await publicClient.waitForTransactionReceipt({ hash: deployHash }); @@ -281,11 +324,7 @@ describe("RouterFactory", async () => { deployer.account.address, ]); - assert.equal( - hasAdminRole, - true, - "Deployer should have DEFAULT_ADMIN_ROLE", - ); + assert.equal(hasAdminRole, true, "Deployer should have DEFAULT_ADMIN_ROLE"); assert.equal( hasFundManagerRole, true, @@ -312,7 +351,14 @@ describe("RouterFactory", async () => { ]); const deployHash = await routerFactory.write.deploy( - [SALT_PAUSABLE, deployer.account.address, FOR_TOKEN, FUND_WALLET, FUND_RATIO, BURN_RATIO], + [ + SALT_PAUSABLE, + deployer.account.address, + FOR_TOKEN, + FUND_WALLET, + FUND_RATIO, + BURN_RATIO, + ], { account: deployer.account }, ); await publicClient.waitForTransactionReceipt({ hash: deployHash }); @@ -322,7 +368,11 @@ describe("RouterFactory", async () => { // Verify initial state is not paused const initialPausedState = await router.read.paused(); - assert.equal(initialPausedState, false, "Router should not be paused initially"); + assert.equal( + initialPausedState, + false, + "Router should not be paused initially", + ); // Pause the contract const pauseHash = await router.write.pause({ account: deployer.account }); @@ -357,7 +407,14 @@ describe("RouterFactory", async () => { ]); const deployHash = await routerFactory.write.deploy( - [SALT_PAUSED_OPS, deployer.account.address, FOR_TOKEN, FUND_WALLET, FUND_RATIO, BURN_RATIO], + [ + SALT_PAUSED_OPS, + deployer.account.address, + FOR_TOKEN, + FUND_WALLET, + FUND_RATIO, + BURN_RATIO, + ], { account: deployer.account }, ); await publicClient.waitForTransactionReceipt({ hash: deployHash }); @@ -420,7 +477,14 @@ describe("RouterFactory", async () => { ]); const deployHash = await routerFactory.write.deploy( - [SALT_PERMISSIONS, deployer.account.address, FOR_TOKEN, FUND_WALLET, FUND_RATIO, BURN_RATIO], + [ + SALT_PERMISSIONS, + deployer.account.address, + FOR_TOKEN, + FUND_WALLET, + FUND_RATIO, + BURN_RATIO, + ], { account: deployer.account }, ); await publicClient.waitForTransactionReceipt({ hash: deployHash }); diff --git a/packages/indexer/.gitignore b/packages/indexer/.gitignore new file mode 100644 index 0000000..9640901 --- /dev/null +++ b/packages/indexer/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +build/ +generated/ +.env +subgraph.*.yaml +!subgraph.template.yaml diff --git a/packages/indexer/README.md b/packages/indexer/README.md new file mode 100644 index 0000000..4251194 --- /dev/null +++ b/packages/indexer/README.md @@ -0,0 +1,64 @@ +# FoR Indexer (Goldsky) + +FoR Router のイベントを Goldsky でインデックスするサブグラフです。 + +`subgraph.template.yaml` を共通テンプレートとして使い、 +`config/sepolia.json` / `config/base.json` から +`subgraph.sepolia.yaml` / `subgraph.base.yaml` を生成します。 + +## 対象イベント + +- `TransferWithDistribution` +- `DistributionRatioUpdated` + +## セットアップ + +```bash +pnpm install +``` + +## Goldsky CLI + +インストール: + +```bash +curl https://goldsky.com | sh +``` + +ログイン: + +```bash +goldsky login +``` + +## 事前準備 + +1. `packages/contract` で対象チェーンにコントラクトをデプロイ +2. デプロイ結果から Router の `address` と `startBlock` を取得 +3. `packages/indexer/config/.json` の `address` / `startBlock` を更新 + +## デプロイ手順 + +### Sepolia + +```bash +pnpm --filter @for/indexer build:sepolia +pnpm --filter @for/indexer deploy:sepolia +``` + +### Base + +```bash +pnpm --filter @for/indexer build:base +pnpm --filter @for/indexer deploy:base +``` + +補足: +- `deploy:*` は内部で `build:*` を実行します。 +- `for-/0.0.0` が既に存在すると `already exists` エラーになります。 +- その場合はデプロイ名/バージョンを変更するか、既存運用ルールに従って更新してください。 + +## 公開エンドポイント + +- Sepolia: `https://api.goldsky.com/api/public/project_cm5nv64onnxxz01wf8smdgk1e/subgraphs/for-sepolia/0.0.0/gn` +- Base: `` diff --git a/packages/indexer/config/base.json b/packages/indexer/config/base.json new file mode 100644 index 0000000..388281b --- /dev/null +++ b/packages/indexer/config/base.json @@ -0,0 +1,5 @@ +{ + "network": "base", + "address": "0x0000000000000000000000000000000000000000", + "startBlock": 0 +} diff --git a/packages/indexer/config/sepolia.json b/packages/indexer/config/sepolia.json new file mode 100644 index 0000000..ba34dee --- /dev/null +++ b/packages/indexer/config/sepolia.json @@ -0,0 +1,5 @@ +{ + "network": "sepolia", + "address": "0x53ad3cD165Aff7aBEb6eE14Bd74c5C652eF06a77", + "startBlock": 10333426 +} diff --git a/packages/indexer/package.json b/packages/indexer/package.json new file mode 100644 index 0000000..4734e95 --- /dev/null +++ b/packages/indexer/package.json @@ -0,0 +1,24 @@ +{ + "name": "@for/indexer", + "private": true, + "version": "0.0.0", + "description": "FoR event indexer workspace", + "scripts": { + "generate:sepolia": "mustache ./config/sepolia.json subgraph.template.yaml > subgraph.sepolia.yaml", + "codegen:sepolia": "pnpm run generate:sepolia && graph codegen subgraph.sepolia.yaml", + "build:sepolia": "pnpm run codegen:sepolia && graph build subgraph.sepolia.yaml", + "deploy:sepolia": "pnpm run build:sepolia && goldsky subgraph deploy for-sepolia/0.0.0 --path ./build", + "generate:base": "mustache ./config/base.json subgraph.template.yaml > subgraph.base.yaml", + "codegen:base": "pnpm run generate:base && graph codegen subgraph.base.yaml", + "build:base": "pnpm run codegen:base && graph build subgraph.base.yaml", + "deploy:base": "pnpm run build:base && goldsky subgraph deploy for-base/0.0.0 --path ./build", + "check": "biome check" + }, + "devDependencies": { + "@graphprotocol/graph-cli": "^0.98.1", + "@graphprotocol/graph-ts": "^0.38.2", + "@types/node": "^25.3.0", + "mustache": "^4.2.0", + "typescript": "^5.9.3" + } +} diff --git a/packages/indexer/schema.graphql b/packages/indexer/schema.graphql new file mode 100644 index 0000000..1b6bf66 --- /dev/null +++ b/packages/indexer/schema.graphql @@ -0,0 +1,34 @@ +type Transfer @entity(immutable: true) { + id: ID! + sender: User! + from: User! + to: User! + totalAmount: BigInt! + fundAmount: BigInt! + burnAmount: BigInt! + recipientAmount: BigInt! + blockNumber: BigInt! + timestamp: BigInt! + transactionHash: Bytes! + logIndex: BigInt! +} + +type DistributionRatio @entity(immutable: true) { + id: ID! + changedBy: User! + fundRatio: BigInt! + burnRatio: BigInt! + recipientRatio: BigInt! + blockNumber: BigInt! + timestamp: BigInt! + transactionHash: Bytes! + logIndex: BigInt! +} + +type User @entity(immutable: false) { + id: ID! + sentTransfers: [Transfer!]! @derivedFrom(field: "from") + receivedTransfers: [Transfer!]! @derivedFrom(field: "to") + executedTransfers: [Transfer!]! @derivedFrom(field: "sender") + ratioChanges: [DistributionRatio!]! @derivedFrom(field: "changedBy") +} diff --git a/packages/indexer/src/mapping.ts b/packages/indexer/src/mapping.ts new file mode 100644 index 0000000..c5132d0 --- /dev/null +++ b/packages/indexer/src/mapping.ts @@ -0,0 +1,64 @@ +// biome-ignore lint/style/useImportType: graph-ts mappings are compiled by AssemblyScript and require this import form. +import { + DistributionRatioUpdated as DistributionRatioUpdatedEvent, + TransferWithDistribution as TransferWithDistributionEvent, +} from "../generated/Router/Router"; +import { DistributionRatio, Transfer, User } from "../generated/schema"; + +function upsertUser(address: string): void { + let user = User.load(address); + if (user == null) { + user = new User(address); + user.save(); + } +} + +export function handleTransferWithDistribution( + event: TransferWithDistributionEvent, +): void { + const sender = event.params.sender.toHexString(); + const from = event.params.from.toHexString(); + const to = event.params.recipient.toHexString(); + + upsertUser(sender); + upsertUser(from); + upsertUser(to); + + const id = `${event.transaction.hash.toHexString()}-${event.logIndex.toString()}`; + const transfer = new Transfer(id); + + transfer.sender = sender; + transfer.from = from; + transfer.to = to; + transfer.totalAmount = event.params.totalAmount; + transfer.fundAmount = event.params.fundAmount; + transfer.burnAmount = event.params.burnAmount; + transfer.recipientAmount = event.params.recipientAmount; + transfer.blockNumber = event.block.number; + transfer.timestamp = event.block.timestamp; + transfer.transactionHash = event.transaction.hash; + transfer.logIndex = event.logIndex; + + transfer.save(); +} + +export function handleDistributionRatioUpdated( + event: DistributionRatioUpdatedEvent, +): void { + const changedBy = event.params.changedBy.toHexString(); + upsertUser(changedBy); + + const id = `${event.transaction.hash.toHexString()}-${event.logIndex.toString()}`; + const ratio = new DistributionRatio(id); + + ratio.changedBy = changedBy; + ratio.fundRatio = event.params.fundRatio; + ratio.burnRatio = event.params.burnRatio; + ratio.recipientRatio = event.params.recipientRatio; + ratio.blockNumber = event.block.number; + ratio.timestamp = event.block.timestamp; + ratio.transactionHash = event.transaction.hash; + ratio.logIndex = event.logIndex; + + ratio.save(); +} diff --git a/packages/indexer/subgraph.template.yaml b/packages/indexer/subgraph.template.yaml new file mode 100644 index 0000000..87d7c1d --- /dev/null +++ b/packages/indexer/subgraph.template.yaml @@ -0,0 +1,29 @@ +specVersion: 1.3.0 +schema: + file: ./schema.graphql + +dataSources: + - kind: ethereum/contract + name: Router + network: {{network}} + source: + address: "{{address}}" + abi: Router + startBlock: {{startBlock}} + mapping: + kind: ethereum/events + apiVersion: 0.0.9 + language: wasm/assemblyscript + entities: + - Transfer + - DistributionRatio + - User + abis: + - name: Router + file: ../contract/artifacts/contracts/Router.sol/Router.json + eventHandlers: + - event: TransferWithDistribution(indexed address,indexed address,indexed address,uint256,uint256,uint256,uint256) + handler: handleTransferWithDistribution + - event: DistributionRatioUpdated(indexed address,uint256,uint256,uint256) + handler: handleDistributionRatioUpdated + file: ./src/mapping.ts diff --git a/packages/indexer/tsconfig.json b/packages/indexer/tsconfig.json new file mode 100644 index 0000000..63c6406 --- /dev/null +++ b/packages/indexer/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "Node", + "allowJs": true, + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b0a687..9ce74f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,7 +43,7 @@ importers: dependencies: '@privy-io/react-auth': specifier: ^3.10.1 - version: 3.10.1(@solana-program/system@0.10.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana-program/token@0.9.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(@solana/sysvars@5.3.0(typescript@5.9.3))(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(permissionless@0.2.57(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(zod@3.25.76) + version: 3.10.1(@solana-program/system@0.10.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana-program/token@0.9.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(@solana/sysvars@5.3.0(typescript@5.9.3))(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(permissionless@0.2.57(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(zod@3.25.76) '@react-router/node': specifier: ^7.9.2 version: 7.9.6(react-router@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) @@ -71,10 +71,10 @@ importers: devDependencies: '@react-router/dev': specifier: ^7.9.2 - version: 7.9.6(@react-router/serve@7.9.6(react-router@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 7.9.6(@react-router/serve@7.9.6(react-router@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1))(yaml@2.8.1) '@tailwindcss/vite': specifier: ^4.1.13 - version: 4.1.17(vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 4.1.17(vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1)) '@types/node': specifier: ^22 version: 22.19.1 @@ -92,10 +92,28 @@ importers: version: 5.9.3 vite: specifier: ^7.1.7 - version: 7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + version: 7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 5.1.4(typescript@5.9.3)(vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1)) + + packages/indexer: + devDependencies: + '@graphprotocol/graph-cli': + specifier: ^0.98.1 + version: 0.98.1(@types/node@25.3.0)(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@graphprotocol/graph-ts': + specifier: ^0.38.2 + version: 0.38.2 + '@types/node': + specifier: ^25.3.0 + version: 25.3.0 + mustache: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 packages: @@ -309,6 +327,12 @@ packages: cpu: [x64] os: [win32] + '@chainsafe/is-ip@2.1.0': + resolution: {integrity: sha512-KIjt+6IfysQ4GCv66xihEitBjvhU/bixbbbFxdJ1sqCp4uJ0wuZiYBPhksZoy4lfaF0k9cwNzY5upEW/VWdw3w==} + + '@chainsafe/netmask@2.0.0': + resolution: {integrity: sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==} + '@coinbase/cdp-sdk@1.40.2': resolution: {integrity: sha512-JV+4h9uxAZNwGvaZE7AA13Y96jVi+eiovfmeKeLv7Nm2EX9FvXizC1O8TYD4aQVJ+pCGdI+G0MMiGYdgPQqh+Q==} @@ -321,6 +345,10 @@ packages: '@coinbase/wallet-sdk@4.3.6': resolution: {integrity: sha512-4q8BNG1ViL4mSAAvPAtpwlOs1gpC+67eQtgIwNvT3xyeyFFd+guwkc8bcX5rTmQhXpqnhzC4f0obACbP9CqMSA==} + '@dnsquery/dns-packet@6.1.1': + resolution: {integrity: sha512-WXTuFvL3G+74SchFAtz3FgIYVOe196ycvGsMgvSH/8Goptb1qpIQtIuM4SOK9G9lhMWYpHxnXyy544ZhluFOew==} + engines: {node: '>=6'} + '@ecies/ciphers@0.2.5': resolution: {integrity: sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} @@ -725,6 +753,13 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} + '@fastify/busboy@3.2.0': + resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} + + '@float-capital/float-subgraph-uncrashable@0.0.0-internal-testing.5': + resolution: {integrity: sha512-yZ0H5e3EpAYKokX/AbtplzlvSxEJY7ZfpvQyDzyODkks0hakAAlDG6fQu1SlDJMWorY7bbq1j7fCiFeTWci6TA==} + hasBin: true + '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} @@ -751,6 +786,14 @@ packages: peerDependencies: viem: '>=2.0.0' + '@graphprotocol/graph-cli@0.98.1': + resolution: {integrity: sha512-GrWFcRCBlLcRT+gIGundQl7yyrX3YWUPj66bxThKf5CJvvWXdZoNxrj27dMMqulsSwYmpCkb3YmpCiVJFGdpHw==} + engines: {node: '>=20.18.1'} + hasBin: true + + '@graphprotocol/graph-ts@0.38.2': + resolution: {integrity: sha512-87KIFSFs2+Te+mnmb7Y+M57oqzlLy20cIyPIRbn9qJfpZFSZHTKtBLT6KQmcsK0YkoWis9Ur3c3M2c9mmaaEHQ==} + '@hcaptcha/loader@2.3.0': resolution: {integrity: sha512-i4lnNxKBe+COf3R1nFZEWaZoHIoJjvDgWqvcNrdZq8ehoSNMN6KVZ56dcQ02qKie2h3+BkbkwlJA9DOIuLlK/g==} @@ -772,10 +815,160 @@ packages: peerDependencies: react: '>= 16 || ^19.0.0-rc' + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.2': + resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.23': + resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.23': + resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.23': + resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.10.1': + resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.11': + resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.2.2': + resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@ipld/dag-cbor@9.2.5': + resolution: {integrity: sha512-84wSr4jv30biui7endhobYhXBQzQE4c/wdoWlFrKcfiwH+ofaPg8fwsM8okX9cOzkkrsAsNdDyH3ou+kiLquwQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + + '@ipld/dag-json@10.2.6': + resolution: {integrity: sha512-51yc5azhmkvc9mp2HV/vtJ8SlgFXADp55wAPuuAjQZ+yPurAYuTVddS3ke5vT4sjcd4DbE+DWjsMZGXjFB2cuA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + + '@ipld/dag-pb@4.1.5': + resolution: {integrity: sha512-w4PZ2yPqvNmlAir7/2hsCRMqny1EY5jj26iZcSgxREJexmbAc2FI21jp26MqiNdfgAxvkCnf2N/TJI18GaDNwA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -796,6 +989,24 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@libp2p/crypto@5.1.13': + resolution: {integrity: sha512-8NN9cQP3jDn+p9+QE9ByiEoZ2lemDFf/unTgiKmS3JF93ph240EUVdbCyyEgOMfykzb0okTM4gzvwfx9osJebQ==} + + '@libp2p/interface@2.11.0': + resolution: {integrity: sha512-0MUFKoXWHTQW3oWIgSHApmYMUKWO/Y02+7Hpyp+n3z+geD4Xo2Rku2gYWmxcq+Pyjkz6Q9YjDWz3Yb2SoV2E8Q==} + + '@libp2p/interface@3.1.0': + resolution: {integrity: sha512-RE7/XyvC47fQBe1cHxhMvepYKa5bFCUyFrrpj8PuM0E7JtzxU7F+Du5j4VXbg2yLDcToe0+j8mB7jvwE2AThYw==} + + '@libp2p/logger@5.2.0': + resolution: {integrity: sha512-OEFS529CnIKfbWEHmuCNESw9q0D0hL8cQ8klQfjIVPur15RcgAEgc1buQ7Y6l0B6tCYg120bp55+e9tGvn8c0g==} + + '@libp2p/peer-id@5.1.9': + resolution: {integrity: sha512-cVDp7lX187Epmi/zr0Qq2RsEMmueswP9eIxYSFoMcHL/qcvRFhsxOfUGB8361E26s2WJvC9sXZ0oJS9XVueJhQ==} + '@lit-labs/ssr-dom-shim@1.5.0': resolution: {integrity: sha512-HLomZXMmrCFHSRKESF5vklAKsDY7/fsT/ZhqCu3V0UoW/Qbv8wxmO4W9bx4KnCCF2Zak4yuk+AGraK/bPmI4kA==} @@ -900,6 +1111,18 @@ packages: resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==} engines: {node: '>= 18'} + '@multiformats/dns@1.0.13': + resolution: {integrity: sha512-yr4bxtA3MbvJ+2461kYIYMsiiZj/FIqKI64hE4SdvWJUdWF9EtZLar38juf20Sf5tguXKFUruluswAO6JsjS2w==} + + '@multiformats/multiaddr-to-uri@11.0.2': + resolution: {integrity: sha512-SiLFD54zeOJ0qMgo9xv1Tl9O5YktDKAVDP4q4hL16mSq4O4sfFNagNADz8eAofxd6TfQUzGQ3TkRRG9IY2uHRg==} + + '@multiformats/multiaddr@12.5.1': + resolution: {integrity: sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ==} + + '@multiformats/multiaddr@13.0.1': + resolution: {integrity: sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==} + '@noble/ciphers@1.2.1': resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} engines: {node: ^14.21.3 || >=16} @@ -938,6 +1161,10 @@ packages: resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} engines: {node: ^14.21.3 || >=16} + '@noble/curves@2.0.1': + resolution: {integrity: sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==} + engines: {node: '>= 20.19.0'} + '@noble/hashes@1.3.2': resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} @@ -962,6 +1189,22 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@2.0.1': + resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} + engines: {node: '>= 20.19.0'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + '@nomicfoundation/edr-darwin-arm64@0.12.0-next.14': resolution: {integrity: sha512-sl0DibKSUOS7JXhUtaQ6FJUY+nk+uq5gx+Fyd9iiqs8awZPNn6KSuvV1EbWCi+yd3mrxgZ/wO8E77C1Dxj4xQA==} engines: {node: '>= 20'} @@ -1125,6 +1368,26 @@ packages: resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@oclif/core@4.5.5': + resolution: {integrity: sha512-iQzlaJQgPeUXrtrX71OzDwxPikQ7c2FhNd8U8rBB7BCtj2XYfmzBT/Hmbc+g9OKDIG/JkbJT0fXaWMMBrhi+1A==} + engines: {node: '>=18.0.0'} + + '@oclif/core@4.8.1': + resolution: {integrity: sha512-07mq0vKCWNsB85ZHeBMlTAiO0KLFqHyAeRK3bD2K8CI1tX3tiwkWw1lZQZkiw8MUBrhxdROhMkYMY4Q0l7JHqA==} + engines: {node: '>=18.0.0'} + + '@oclif/plugin-autocomplete@3.2.40': + resolution: {integrity: sha512-HCfDuUV3l5F5Wz7SKkaoFb+OMQ5vKul8zvsPNgI0QbZcQuGHmn3svk+392wSfXboyA1gq8kzEmKPAoQK6r6UNw==} + engines: {node: '>=18.0.0'} + + '@oclif/plugin-not-found@3.2.74': + resolution: {integrity: sha512-6RD/EuIUGxAYR45nMQg+nw+PqwCXUxkR6Eyn+1fvbVjtb9d+60OPwB77LCRUI4zKNI+n0LOFaMniEdSpb+A7kQ==} + engines: {node: '>=18.0.0'} + + '@oclif/plugin-warn-if-update-available@3.1.55': + resolution: {integrity: sha512-VIEBoaoMOCjl3y+w/kdfZMODi0mVMnDuM0vkBf3nqeidhRXVXq87hBqYDdRwN1XoD+eDfE8tBbOP7qtSOONztQ==} + engines: {node: '>=18.0.0'} + '@openzeppelin/contracts@5.4.0': resolution: {integrity: sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A==} @@ -1135,10 +1398,25 @@ packages: '@phosphor-icons/webcomponents@2.1.5': resolution: {integrity: sha512-JcvQkZxvcX2jK+QCclm8+e8HXqtdFW9xV4/kk2aL9Y3dJA2oQVt+pzbv1orkumz3rfx4K9mn9fDoMr1He1yr7Q==} + '@pinax/graph-networks-registry@0.7.1': + resolution: {integrity: sha512-Gn2kXRiEd5COAaMY/aDCRO0V+zfb1uQKCu5HFPoWka+EsZW27AlTINA7JctYYYEMuCbjMia5FBOzskjgEvj6LA==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@3.0.2': + resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} + engines: {node: '>=12'} + '@privy-io/api-base@1.7.3': resolution: {integrity: sha512-KAb7P+tfJpUtMYt3R2jrd2cFP4yIby1f/oX1yMU0DhHaKC0xdDPgqoXFkflwiE+5GUARUN1RVP6tUY3AW9RGDA==} @@ -1345,6 +1623,9 @@ packages: '@reown/appkit@1.8.9': resolution: {integrity: sha512-e3N2DAzf3Xv3jnoD8IsUo0/Yfwuhk7npwJBe1+9rDJIRwgPsyYcCLD4gKPDFC5IUIfOLqK7YtGOh9oPEUnIWpw==} + '@rescript/std@9.0.0': + resolution: {integrity: sha512-zGzFsgtZ44mgL4Xef2gOy1hrRVdrs9mcxCOOKZrIPsmbZW14yTkaF591GXxpQvjXiHtgZ/iA9qLyWH6oSReIxQ==} + '@rollup/rollup-android-arm-eabi@4.53.2': resolution: {integrity: sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==} cpu: [arm] @@ -1932,6 +2213,12 @@ packages: '@types/node@22.7.5': resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + '@types/node@25.3.0': + resolution: {integrity: sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -2124,6 +2411,31 @@ packages: '@walletconnect/window-metadata@1.0.1': resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + '@whatwg-node/disposablestack@0.0.6': + resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/fetch@0.10.13': + resolution: {integrity: sha512-b4PhJ+zYj4357zwk4TTuF2nEe0vVtOrwdsrNo5hL+u1ojXNhh1FgJ6pg1jzDlwlT4oBdzfSwaBwMCtFCsIWg8Q==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/node-fetch@0.8.5': + resolution: {integrity: sha512-4xzCl/zphPqlp9tASLVeUhB5+WJHbuWGYpfoC2q1qh5dw0AqZBW7L27V5roxYWijPxj4sspRAAoOH3d2ztaHUQ==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/promise-helpers@1.3.2': + resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} + engines: {node: '>=16.0.0'} + + abitype@0.7.1: + resolution: {integrity: sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==} + peerDependencies: + typescript: '>=4.9.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + abitype@1.0.6: resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} peerDependencies: @@ -2172,6 +2484,9 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} + abort-error@1.0.1: + resolution: {integrity: sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -2191,6 +2506,14 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2199,6 +2522,10 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -2211,19 +2538,48 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + ansis@3.17.0: + resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} + engines: {node: '>=14'} + + any-signal@4.2.0: + resolution: {integrity: sha512-LndMvYuAPf4rC195lk7oSFuHOYFpOszIYrNYv0gHAvz+aEhE9qPZLhmrIz5pXP2BSsPOXvsuHDXEGaiQhIh9wA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + apisauce@2.1.6: + resolution: {integrity: sha512-MdxR391op/FucS2YQRfB/NMRyCnHEPDd4h17LRIuVYi0BpGmMhpxc0shbOpfs5ahABuBEffNCGal5EcsydbBWg==} + + app-module-path@2.2.0: + resolution: {integrity: sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + assemblyscript@0.19.23: + resolution: {integrity: sha512-fwOQNZVTMga5KRsfY80g7cpOl4PsFQczMwHzdtgoqLXaYhkhavufKb0sB0l3T1DUxpAufA0KNhlbpuuhZUwxMA==} + hasBin: true + + assemblyscript@0.27.31: + resolution: {integrity: sha512-Ra8kiGhgJQGZcBxjtMcyVRxOEJZX64kd+XGpjWzjcjgxWJVv+CAQO0aDBk4GQVhjYbOkATarC83mHjAVGtwPBQ==} + engines: {node: '>=16', npm: '>=7'} + hasBin: true + async-mutex@0.2.6: resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -2240,6 +2596,9 @@ packages: peerDependencies: axios: 0.x || 1.x + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + axios@1.13.2: resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} @@ -2249,6 +2608,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} @@ -2269,9 +2632,23 @@ packages: big.js@6.2.2: resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + binaryen@102.0.0-nightly.20211028: + resolution: {integrity: sha512-GCJBVB5exbxzzvyt8MGDv/MeUjs6gkXDvf4xOIItRBptYl0Tz5sm1o/uG95YK0L0VeG5ajDu3hRtkBP2kzqC5w==} + hasBin: true + + binaryen@116.0.0-nightly.20240114: + resolution: {integrity: sha512-0GZrojJnuhoe+hiwji7QFaL3tBlJoA+KFUN7ouYSDGZLSo9CKM8swQX8n/UcbR0d1VuZKU+nhogNzv423JEu5A==} + hasBin: true + + bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + blob-to-it@2.0.10: + resolution: {integrity: sha512-I39vO57y+LBEIcAV7fif0sn96fYOYVqrPiOD+53MxQGv4DBgt1/HHZh0BHheWx2hVe24q5LTSXxqeV1Y3Nzkgg==} + bn.js@4.12.2: resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} @@ -2288,12 +2665,26 @@ packages: bowser@2.13.1: resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.3: + resolution: {integrity: sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==} + engines: {node: 18 || 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + browser-readablestream-to-it@2.0.10: + resolution: {integrity: sha512-I/9hEcRtjct8CzD9sVo9Mm4ntn0D+7tOVrjbPl69XAoOfgJ8NBdOQU+WX+5SHhcELJDb14mWt7zuvyqha+MEAQ==} + browserslist@4.28.0: resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -2305,9 +2696,24 @@ packages: bs58@6.0.0: resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + + buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -2315,6 +2721,10 @@ packages: resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} engines: {node: '>=6.14.2'} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -2335,6 +2745,10 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -2353,6 +2767,14 @@ packages: resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} engines: {node: '>=18.7'} + cborg@4.5.8: + resolution: {integrity: sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==} + hasBin: true + + 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'} @@ -2361,6 +2783,9 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} @@ -2368,9 +2793,33 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + clean-stack@3.0.1: + resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} + engines: {node: '>=10'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-table3@0.6.0: + resolution: {integrity: sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==} + engines: {node: 10.* || >= 12.*} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} @@ -2379,16 +2828,26 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -2408,6 +2867,12 @@ packages: resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} engines: {node: '>= 0.8.0'} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -2436,6 +2901,10 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cosmiconfig@7.0.1: + resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} + engines: {node: '>=10'} + crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} @@ -2447,6 +2916,10 @@ packages: cross-fetch@4.1.0: resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -2467,6 +2940,9 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + dag-jose@5.1.1: + resolution: {integrity: sha512-9alfZ8Wh1XOOMel8bMpDqWsDT72ojFQCJPtwZSev9qh4f8GoCV9qrJW8jcOUhcstO8Kfm09FHGo//jqiZq3z9w==} + date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} @@ -2511,6 +2987,26 @@ packages: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} + decompress-tar@4.1.1: + resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} + engines: {node: '>=4'} + + decompress-tarbz2@4.1.1: + resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} + engines: {node: '>=4'} + + decompress-targz@4.1.1: + resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} + engines: {node: '>=4'} + + decompress-unzip@4.0.1: + resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} + engines: {node: '>=4'} + + decompress@4.2.1: + resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} + engines: {node: '>=4'} + dedent@1.7.0: resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} peerDependencies: @@ -2519,10 +3015,25 @@ packages: babel-plugin-macros: optional: true + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -2564,6 +3075,10 @@ packages: dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + docker-compose@1.3.0: + resolution: {integrity: sha512-7Gevk/5eGD50+eMD+XDnFnOrruFkL0kSd7jEG4cjmqweDSUhB7i0g8is/nBdVpl+Bx338SqIB2GLKm32M+Vs6g==} + engines: {node: '>= 6.0.0'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2581,6 +3096,20 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + ejs@3.1.8: + resolution: {integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-fetch@1.9.1: + resolution: {integrity: sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==} + engines: {node: '>=6'} + electron-to-chromium@1.5.255: resolution: {integrity: sha512-Z9oIp4HrFF/cZkDPMpz2XSuVpc1THDpT4dlmATFlJUIBVCy9Vap5/rIXsASP1CscBacBqhabwh8vLctqBwEerQ==} @@ -2604,6 +3133,9 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} @@ -2618,6 +3150,10 @@ packages: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} + enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -2629,6 +3165,12 @@ packages: err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + err-code@3.0.1: + resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -2677,8 +3219,16 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} eth-block-tracker@7.1.0: @@ -2716,6 +3266,10 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + exit-hook@2.2.1: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} @@ -2742,6 +3296,16 @@ packages: resolution: {integrity: sha512-/boTcHZeIAQ2r/tL11voclBHDeP9WPxLt+tyAbVSyyXuUFyh0Tne7gJZTqGbxnvj79TjLdCXLOY7UIPhyG5MTw==} engines: {node: '>=6.0.0'} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-levenshtein@3.0.0: + resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} + fast-password-entropy@1.1.1: resolution: {integrity: sha512-dxm29/BPFrNgyEDygg/lf9c2xQR0vnQhG7+hZjAI39M/3um9fD4xiqG6F0ZjW6bya5m9CI0u6YryHGRtxCGCiw==} @@ -2755,6 +3319,16 @@ packages: fast-stable-stringify@1.0.0: resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -2767,6 +3341,26 @@ packages: fetch-retry@6.0.0: resolution: {integrity: sha512-BUFj1aMubgib37I3v4q78fYo63Po7t4HUPTpQ6/QE6yK6cIQrP+W43FYToeTEyg5m2Y7eFUtijUuAv/PDlWuag==} + file-type@3.9.0: + resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} + engines: {node: '>=0.10.0'} + + file-type@5.2.0: + resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} + engines: {node: '>=4'} + + file-type@6.2.0: + resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} + engines: {node: '>=4'} + + filelist@1.0.5: + resolution: {integrity: sha512-ct/ckWBV/9Dg3MlvCXsLcSUyoWwv9mCKqlhLNB2DAuXR/NZolSXlQqP5dyy6guWlPXBhodZyZ5lGPQcbQDxrEQ==} + engines: {node: 20 || >=22} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + filter-obj@1.1.0: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} @@ -2812,6 +3406,19 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} + engines: {node: '>=14.14'} + + fs-jetpack@4.3.1: + resolution: {integrity: sha512-dbeOK84F6BiQzk2yqqCVwCPWTxAvVGJ3fMQc6E2wuEohS28mR6yHngbrKuVCK1KHRx/ccByDylqu4H5PCP2urQ==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2836,6 +3443,13 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-iterator@1.0.2: + resolution: {integrity: sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} @@ -2844,23 +3458,62 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@2.3.1: + resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} + engines: {node: '>=0.10.0'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + get-tsconfig@4.13.0: resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + gluegun@5.2.0: + resolution: {integrity: sha512-jSUM5xUy2ztYFQANne17OUm/oAd7qSX7EBksS9bQDt9UvLPqcEkeWUebmaposb8Tx7eTTD8uJVWGRe6PYSsYkg==} + hasBin: true + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphql-import-node@0.0.5: + resolution: {integrity: sha512-OXbou9fqh9/Lm7vwXT0XoRN9J5+WCYKnbiTalgFDvkQERITRmcfncZs6aVABedd5B85yQU5EULS4a5pnbpuI0Q==} + peerDependencies: + graphql: '*' + + graphql@16.11.0: + resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + h3@1.15.4: resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} @@ -2868,6 +3521,10 @@ packages: resolution: {integrity: sha512-cXxaeSxFJ+u0MfbvWsS3Gdr7/uP7wjo4xviYcGdu9AKtwY6YsU+v0quK/j1NWmvO1Y4gk350SdZzQw++hJy4LA==} hasBin: true + 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'} @@ -2886,6 +3543,9 @@ packages: hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hashlru@2.3.0: + resolution: {integrity: sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -2904,10 +3564,18 @@ packages: resolution: {integrity: sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + http-call@5.3.0: + resolution: {integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==} + engines: {node: '>=8.0.0'} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -2915,6 +3583,14 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + idb-keyval@6.2.1: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} @@ -2927,13 +3603,40 @@ packages: immer@10.0.2: resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + interface-datastore@8.3.2: + resolution: {integrity: sha512-R3NLts7pRbJKc3qFdQf+u40hK8XWc0w4Qkx3OFEstC80VoaDUABY/dXA2EJPhtNC+bsrf41Ehvqb6+pnIclyRA==} + + interface-store@6.0.3: + resolution: {integrity: sha512-+WvfEZnFUhRwFxgz+QCQi7UC6o9AM0EHM9bpIe2Nhqb100NHCsTvNAn4eJgvgV2/tmLo1MP9nGxQKEcZTAueLA==} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + ipfs-unixfs@11.2.5: + resolution: {integrity: sha512-uasYJ0GLPbViaTFsOLnL9YPjX5VmhnqtWRriogAHOe4ApmIi9VAOFBzgDHsUW2ub4pEa/EysbtWk126g2vkU/g==} + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -2941,6 +3644,9 @@ packages: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} @@ -2952,6 +3658,23 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-electron@2.2.2: + resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -2960,14 +3683,46 @@ packages: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-natural-number@4.0.1: + resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} + is-retry-allowed@1.2.0: + resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} + engines: {node: '>=0.10.0'} + is-retry-allowed@2.2.0: resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} engines: {node: '>=10'} + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -2976,6 +3731,14 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -2989,6 +3752,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + iso-url@1.2.1: + resolution: {integrity: sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==} + engines: {node: '>=12'} + isomorphic-ws@4.0.1: resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} peerDependencies: @@ -3004,9 +3771,50 @@ packages: peerDependencies: ws: '*' + it-all@3.0.9: + resolution: {integrity: sha512-fz1oJJ36ciGnu2LntAlE6SA97bFZpW7Rnt0uEc1yazzR2nKokZLr8lIRtgnpex4NsmaBcvHF+Z9krljWFy/mmg==} + + it-first@3.0.9: + resolution: {integrity: sha512-ZWYun273Gbl7CwiF6kK5xBtIKR56H1NoRaiJek2QzDirgen24u8XZ0Nk+jdnJSuCTPxC2ul1TuXKxu/7eK6NuA==} + + it-glob@3.0.4: + resolution: {integrity: sha512-73PbGBTK/dHp5PX4l8pkQH1ozCONP0U+PB3qMqltxPonRJQNomINE3Hn9p02m2GOu95VoeVvSZdHI2N+qub0pw==} + + it-last@3.0.9: + resolution: {integrity: sha512-AtfUEnGDBHBEwa1LjrpGHsJMzJAWDipD6zilvhakzJcm+BCvNX8zlX2BsHClHJLLTrsY4lY9JUjc+TQV4W7m1w==} + + it-map@3.1.4: + resolution: {integrity: sha512-QB9PYQdE9fUfpVFYfSxBIyvKynUCgblb143c+ktTK6ZuKSKkp7iH58uYFzagqcJ5HcqIfn1xbfaralHWam+3fg==} + + it-peekable@3.0.8: + resolution: {integrity: sha512-7IDBQKSp/dtBxXV3Fj0v3qM1jftJ9y9XrWLRIuU1X6RdKqWiN60syNwP0fiDxZD97b8SYM58dD3uklIk1TTQAw==} + + it-pushable@3.2.3: + resolution: {integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==} + + it-stream-types@2.0.2: + resolution: {integrity: sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==} + + it-to-stream@1.0.0: + resolution: {integrity: sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + + jayson@4.2.0: + resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} + engines: {node: '>=8'} + hasBin: true + jayson@4.3.0: resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} engines: {node: '>=8'} @@ -3044,11 +3852,21 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} hasBin: true + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@3.0.2: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -3072,6 +3890,9 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + keccak@3.0.4: resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} @@ -3083,6 +3904,9 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + kubo-rpc-client@5.4.1: + resolution: {integrity: sha512-v86bQWtyA//pXTrt9y4iEwjW6pt1gA18Z1famWXIR/HN5TFdYwQ3yHOlRE6JSWBDQ0rR6FOMyrrGy8To78mXow==} + libphonenumber-js@1.12.33: resolution: {integrity: sha512-r9kw4OA6oDO4dPXkOrXTkArQAafIKAU71hChInV4FxZ69dxCfbwQGDPzqR5/vea94wU705/3AZroEbSoeVWrQw==} @@ -3156,6 +3980,13 @@ packages: resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lit-element@4.2.2: resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} @@ -3172,15 +4003,78 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.lowercase@4.3.0: + resolution: {integrity: sha512-UcvP1IZYyDKyEL64mmrwoA1AbFu5ahojhTtkOUr1K9dbuxzS9ev8i4TxMMGCqRC9TE8uDaSoufNAXxRPNTseVA==} + + lodash.lowerfirst@4.3.1: + resolution: {integrity: sha512-UUKX7VhP1/JL54NXg2aq/E1Sfnjjes8fNYTNkPU8ZmsaVeBvPHKdbNaN79Re5XRL01u6wbq3j0cbYZj71Fcu5w==} + + lodash.pad@4.5.1: + resolution: {integrity: sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg==} + + lodash.padend@4.6.1: + resolution: {integrity: sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==} + + lodash.padstart@4.6.1: + resolution: {integrity: sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==} + + lodash.repeat@4.1.0: + resolution: {integrity: sha512-eWsgQW89IewS95ZOcr15HHCX6FVDxq3f2PNUIng3fyzsPev9imFQxIYdFZ6crl8L56UR6ZlGDLcEb3RZsCSSqw==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.trim@4.5.1: + resolution: {integrity: sha512-nJAlRl/K+eiOehWKDzoBVrSMhK0K3A3YQsUNXHQa5yIrKBAhsZgSu3KoAFoFT+mEgiyBHddZ0pRk1ITpIp90Wg==} + + lodash.trimend@4.5.1: + resolution: {integrity: sha512-lsD+k73XztDsMBKPKvzHXRKFNMohTjoTKIIo4ADLn5dA65LZ1BqlAvSXhR2rPEC3BgAUQnzMnorqDtqn2z4IHA==} + + lodash.trimstart@4.5.1: + resolution: {integrity: sha512-b/+D6La8tU76L/61/aN0jULWHkT0EeJCmVstPBn/K9MtD2qBW83AsBNrr63dKuWYwVMO7ucv13QNO/Ek/2RKaQ==} + + lodash.uppercase@4.3.0: + resolution: {integrity: sha512-+Nbnxkj7s8K5U8z6KnEYPGUOGp3woZbB7Ecs7v3LkkjLQSm2kP9SKIILitN1ktn2mB/tmM9oSlku06I+/lH7QA==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + log-symbols@3.0.0: + resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} + engines: {node: '>=8'} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} @@ -3193,6 +4087,13 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + main-event@1.0.1: + resolution: {integrity: sha512-NWtdGrAca/69fm6DIVd8T9rtfDII4Q8NQbIbsKQq2VzS9eqOGYs8uaNQjcuaCq/d9H/o625aOTJX2Qoxzqw0Pw==} + + make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -3207,6 +4108,17 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -3220,6 +4132,10 @@ packages: micro-packed@0.7.3: resolution: {integrity: sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -3237,12 +4153,23 @@ packages: engines: {node: '>=4'} hasBin: true + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@10.2.3: + resolution: {integrity: sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.4: + resolution: {integrity: sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -3275,14 +4202,42 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + ms@3.0.0-canary.202508261828: + resolution: {integrity: sha512-NotsCoUCIUkojWCzQff4ttdCfIPoA1UGZsyQbi7KmqkNRfKCrvga8JJi2PknHymHOuor0cJSn/ylj52Cbt2IrQ==} + engines: {node: '>=18'} + + multiformats@13.1.3: + resolution: {integrity: sha512-CZPi9lFZCM/+7oRolWYsvalsyWQGFo+GpdaTmjxXXomC+nP/W1Rnxb9sUgjvmNmRZ5bOPqRAl4nuK+Ydw/4tGw==} + + multiformats@13.4.2: + resolution: {integrity: sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==} + multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + + native-fetch@4.0.2: + resolution: {integrity: sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==} + peerDependencies: + undici: '*' + ndjson@2.0.0: resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} engines: {node: '>=10'} @@ -3345,9 +4300,17 @@ packages: resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + obj-multiplex@1.0.0: resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -3377,12 +4340,24 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + openapi-fetch@0.13.8: resolution: {integrity: sha512-yJ4QKRyNxE44baQ9mY5+r/kAzZ8yXMemtNAOFwOzRXJscdjSxxzWSNlyBAr+o5JjkUw9Lc3W7OIoca0cY3PYnQ==} openapi-typescript-helpers@0.0.15: resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} + ora@4.0.2: + resolution: {integrity: sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig==} + engines: {node: '>=8'} + ox@0.11.1: resolution: {integrity: sha512-1l1gOLAqg0S0xiN1dH5nkPna8PucrZgrIJOfS49MLNiMevxu07Iz4ZjuJS9N+xifvT+PsZyIptS7WHM8nC+0+A==} peerDependencies: @@ -3439,6 +4414,17 @@ packages: typescript: optional: true + p-defer@3.0.0: + resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} + engines: {node: '>=8'} + + p-defer@4.0.1: + resolution: {integrity: sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==} + engines: {node: '>=12'} + + p-fifo@1.0.0: + resolution: {integrity: sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3451,6 +4437,14 @@ packages: resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} engines: {node: '>=18'} + p-queue@9.1.0: + resolution: {integrity: sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==} + engines: {node: '>=20'} + + p-timeout@7.0.1: + resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} + engines: {node: '>=20'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -3458,6 +4452,21 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-duration@2.1.5: + resolution: {integrity: sha512-/IX1KRw6zHDOOJrgIz++gvFASbFl7nc8GEXaLdD7d1t1x/GnrK6hh5Fgk8G3RLpkIEi4tsGj9pupGLWNg0EiJA==} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -3466,6 +4475,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -3474,15 +4487,26 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + permissionless@0.2.57: resolution: {integrity: sha512-QrzAoQGYPV/NJ2x5Sj18h7qed6f+kCyQAojrncN091UPiGqHjFNjgdsgreiv8pxlQgF4UcpuJUvsHLpOEBd6cQ==} peerDependencies: @@ -3503,6 +4527,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} @@ -3511,6 +4539,14 @@ packages: resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} engines: {node: '>=10'} + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + pino-abstract-transport@0.5.0: resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} @@ -3538,6 +4574,10 @@ packages: resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} hasBin: true + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} @@ -3625,6 +4665,13 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + progress-events@1.0.1: + resolution: {integrity: sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: @@ -3641,6 +4688,12 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + protons-runtime@5.6.0: + resolution: {integrity: sha512-/Kde+sB9DsMFrddJT/UZWe6XqvL7SL5dbag/DBCElFKhkwDj7XKt53S+mzLyaDP5OqS0wXjV5SA572uWDaT0Hg==} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -3675,6 +4728,9 @@ packages: resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} engines: {node: '>=6'} + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -3703,6 +4759,9 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-native-fetch-api@3.0.0: + resolution: {integrity: sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==} + react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -3744,6 +4803,10 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} + registry-auth-token@5.1.1: + resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} + engines: {node: '>=14'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -3751,6 +4814,10 @@ packages: require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -3758,13 +4825,26 @@ packages: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + rollup@4.53.2: resolution: {integrity: sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3773,6 +4853,13 @@ packages: rpc-websockets@9.3.2: resolution: {integrity: sha512-VuW2xJDnl1k8n8kjbdRSWawPRkwaVqUQNjE1TdeTawf0y0abGhtVJFTXCLfgpgGDBkO/Fj6kny8Dc/nvOW78MA==} + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -3799,10 +4886,19 @@ packages: secure-password-utilities@0.2.1: resolution: {integrity: sha512-znUg8ae3cpuAaogiFBhP82gD2daVkSz4Qv/L7OWjB7wWvfbCdeqqQuJkm2/IvhKQPOV0T739YPR6rb7vs0uWaw==} + seek-bzip@1.0.6: + resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} + hasBin: true + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} @@ -3866,6 +4962,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -3940,6 +5039,9 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + stream-to-it@1.0.1: + resolution: {integrity: sha512-AqHYAYPHcmvMrcLNgncE/q0Aj/ajP6A4qGhxP6EVn7K3YTNs0bJpJyk57wc2Heb7MUL64jurvmnmui8D9kjZgA==} + strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -3958,6 +5060,10 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3966,6 +5072,13 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} + strip-dirs@2.1.0: + resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -3988,10 +5101,22 @@ packages: resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} engines: {node: '>=14.0.0'} + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + tabbable@6.4.0: resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} @@ -4002,6 +5127,10 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + text-encoding-utf-8@1.0.2: resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} @@ -4014,6 +5143,9 @@ packages: through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} @@ -4021,10 +5153,21 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + to-buffer@1.2.2: resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} engines: {node: '>= 0.4'} + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -4064,10 +5207,17 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + tunnel@0.0.6: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -4093,12 +5243,24 @@ packages: ufo@1.6.2: resolution: {integrity: sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==} + uint8-varint@2.0.4: + resolution: {integrity: sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==} + + uint8arraylist@2.4.8: + resolution: {integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==} + uint8arrays@3.1.0: resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} uint8arrays@3.1.1: resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + uint8arrays@5.1.0: + resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==} + + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -4119,6 +5281,14 @@ packages: resolution: {integrity: sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==} engines: {node: '>=18.17'} + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + engines: {node: '>=20.18.1'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -4191,6 +5361,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + use-sync-external-store@1.2.0: resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: @@ -4210,6 +5383,9 @@ packages: resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} engines: {node: '>=6.14.2'} + utf8-codec@1.0.0: + resolution: {integrity: sha512-S/QSLezp3qvG4ld5PUfXiH7mCFxLKjSVZRFkB3DOjgwHuJPFDkInAXc/anf7BAbHt/D38ozDzL+QMZ6/7gsI6w==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -4367,6 +5543,32 @@ packages: typescript: optional: true + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + weald@1.1.1: + resolution: {integrity: sha512-PaEQShzMCz8J/AD2N3dJMc1hTZWkJeLKS2NMeiVkV5KDHwgZe7qXLEzyodsT/SODxWDdXJJqocuwf3kHzcXhSQ==} + + web3-errors@1.3.1: + resolution: {integrity: sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth-abi@4.4.1: + resolution: {integrity: sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-types@1.10.0: + resolution: {integrity: sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-utils@4.3.3: + resolution: {integrity: sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-validator@2.0.6: + resolution: {integrity: sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==} + engines: {node: '>=14', npm: '>=6.12.0'} + webextension-polyfill@0.10.0: resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} @@ -4376,6 +5578,10 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + wherearewe@2.0.1: + resolution: {integrity: sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -4393,6 +5599,13 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -4456,6 +5669,10 @@ packages: utf-8-validate: optional: true + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + x402@0.7.3: resolution: {integrity: sha512-8CIZsdMTOn52PjMH/ErVke9ebeZ7ErwiZ5FL3tN3Wny7Ynxs3LkuB/0q7IoccRLdVXA7f2lueYBJ2iDrElhXnA==} @@ -4473,14 +5690,37 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} @@ -4587,7 +5827,7 @@ snapshots: '@babel/types': 7.28.5 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -4745,7 +5985,7 @@ snapshots: '@babel/parser': 7.28.5 '@babel/template': 7.27.2 '@babel/types': 7.28.5 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -4774,9 +6014,9 @@ snapshots: - utf-8-validate - zod - '@base-org/account@2.4.0(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(zod@3.25.76)': + '@base-org/account@2.4.0(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@coinbase/cdp-sdk': 1.40.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@coinbase/cdp-sdk': 1.40.2(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10) '@noble/hashes': 1.4.0 clsx: 1.2.1 eventemitter3: 5.0.1 @@ -4833,12 +6073,18 @@ snapshots: '@biomejs/cli-win32-x64@2.3.7': optional: true - '@coinbase/cdp-sdk@1.40.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@chainsafe/is-ip@2.1.0': {} + + '@chainsafe/netmask@2.0.0': + dependencies: + '@chainsafe/is-ip': 2.1.0 + + '@coinbase/cdp-sdk@1.40.2(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: '@solana-program/system': 0.10.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) '@solana-program/token': 0.9.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) '@solana/kit': 5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10) abitype: 1.0.6(typescript@5.9.3)(zod@3.25.76) axios: 1.13.2 axios-retry: 4.5.0(axios@1.13.2) @@ -4896,6 +6142,11 @@ snapshots: - utf-8-validate - zod + '@dnsquery/dns-packet@6.1.1': + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + utf8-codec: 1.0.0 + '@ecies/ciphers@0.2.5(@noble/ciphers@1.3.0)': dependencies: '@noble/ciphers': 1.3.0 @@ -5217,6 +6468,15 @@ snapshots: '@fastify/busboy@2.1.1': {} + '@fastify/busboy@3.2.0': {} + + '@float-capital/float-subgraph-uncrashable@0.0.0-internal-testing.5': + dependencies: + '@rescript/std': 9.0.0 + graphql: 16.11.0 + graphql-import-node: 0.0.5(graphql@16.11.0) + js-yaml: 4.1.0 + '@floating-ui/core@1.7.3': dependencies: '@floating-ui/utils': 0.2.10 @@ -5250,6 +6510,48 @@ snapshots: transitivePeerDependencies: - supports-color + '@graphprotocol/graph-cli@0.98.1(@types/node@25.3.0)(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@float-capital/float-subgraph-uncrashable': 0.0.0-internal-testing.5 + '@oclif/core': 4.5.5 + '@oclif/plugin-autocomplete': 3.2.40 + '@oclif/plugin-not-found': 3.2.74(@types/node@25.3.0) + '@oclif/plugin-warn-if-update-available': 3.1.55 + '@pinax/graph-networks-registry': 0.7.1 + '@whatwg-node/fetch': 0.10.13 + assemblyscript: 0.19.23 + chokidar: 4.0.3 + debug: 4.4.3(supports-color@8.1.1) + decompress: 4.2.1 + docker-compose: 1.3.0 + fs-extra: 11.3.2 + glob: 11.0.3 + gluegun: 5.2.0(debug@4.4.3) + graphql: 16.11.0 + immutable: 5.1.4 + jayson: 4.2.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + js-yaml: 4.1.0 + kubo-rpc-client: 5.4.1(undici@7.16.0) + open: 10.2.0 + prettier: 3.6.2 + progress: 2.0.3 + semver: 7.7.3 + tmp-promise: 3.0.3 + undici: 7.16.0 + web3-eth-abi: 4.4.1(typescript@5.9.3)(zod@3.25.76) + yaml: 2.8.1 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - supports-color + - typescript + - utf-8-validate + - zod + + '@graphprotocol/graph-ts@0.38.2': + dependencies: + assemblyscript: 0.27.31 + '@hcaptcha/loader@2.3.0': {} '@hcaptcha/react-hcaptcha@1.17.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': @@ -5273,6 +6575,145 @@ snapshots: dependencies: react: 19.2.0 + '@inquirer/ansi@1.0.2': {} + + '@inquirer/checkbox@4.3.2(@types/node@25.3.0)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@25.3.0) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@25.3.0) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 25.3.0 + + '@inquirer/confirm@5.1.21(@types/node@25.3.0)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.3.0) + '@inquirer/type': 3.0.10(@types/node@25.3.0) + optionalDependencies: + '@types/node': 25.3.0 + + '@inquirer/core@10.3.2(@types/node@25.3.0)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@25.3.0) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 25.3.0 + + '@inquirer/editor@4.2.23(@types/node@25.3.0)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.3.0) + '@inquirer/external-editor': 1.0.3(@types/node@25.3.0) + '@inquirer/type': 3.0.10(@types/node@25.3.0) + optionalDependencies: + '@types/node': 25.3.0 + + '@inquirer/expand@4.0.23(@types/node@25.3.0)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.3.0) + '@inquirer/type': 3.0.10(@types/node@25.3.0) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 25.3.0 + + '@inquirer/external-editor@1.0.3(@types/node@25.3.0)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 25.3.0 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/input@4.3.1(@types/node@25.3.0)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.3.0) + '@inquirer/type': 3.0.10(@types/node@25.3.0) + optionalDependencies: + '@types/node': 25.3.0 + + '@inquirer/number@3.0.23(@types/node@25.3.0)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.3.0) + '@inquirer/type': 3.0.10(@types/node@25.3.0) + optionalDependencies: + '@types/node': 25.3.0 + + '@inquirer/password@4.0.23(@types/node@25.3.0)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@25.3.0) + '@inquirer/type': 3.0.10(@types/node@25.3.0) + optionalDependencies: + '@types/node': 25.3.0 + + '@inquirer/prompts@7.10.1(@types/node@25.3.0)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@25.3.0) + '@inquirer/confirm': 5.1.21(@types/node@25.3.0) + '@inquirer/editor': 4.2.23(@types/node@25.3.0) + '@inquirer/expand': 4.0.23(@types/node@25.3.0) + '@inquirer/input': 4.3.1(@types/node@25.3.0) + '@inquirer/number': 3.0.23(@types/node@25.3.0) + '@inquirer/password': 4.0.23(@types/node@25.3.0) + '@inquirer/rawlist': 4.1.11(@types/node@25.3.0) + '@inquirer/search': 3.2.2(@types/node@25.3.0) + '@inquirer/select': 4.4.2(@types/node@25.3.0) + optionalDependencies: + '@types/node': 25.3.0 + + '@inquirer/rawlist@4.1.11(@types/node@25.3.0)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.3.0) + '@inquirer/type': 3.0.10(@types/node@25.3.0) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 25.3.0 + + '@inquirer/search@3.2.2(@types/node@25.3.0)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.3.0) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@25.3.0) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 25.3.0 + + '@inquirer/select@4.4.2(@types/node@25.3.0)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@25.3.0) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@25.3.0) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 25.3.0 + + '@inquirer/type@3.0.10(@types/node@25.3.0)': + optionalDependencies: + '@types/node': 25.3.0 + + '@ipld/dag-cbor@9.2.5': + dependencies: + cborg: 4.5.8 + multiformats: 13.4.2 + + '@ipld/dag-json@10.2.6': + dependencies: + cborg: 4.5.8 + multiformats: 13.4.2 + + '@ipld/dag-pb@4.1.5': + dependencies: + multiformats: 13.4.2 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -5282,6 +6723,8 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/cliui@9.0.0': {} + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 @@ -5305,6 +6748,53 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@leichtgewicht/ip-codec@2.0.5': {} + + '@libp2p/crypto@5.1.13': + dependencies: + '@libp2p/interface': 3.1.0 + '@noble/curves': 2.0.1 + '@noble/hashes': 2.0.1 + multiformats: 13.4.2 + protons-runtime: 5.6.0 + uint8arraylist: 2.4.8 + uint8arrays: 5.1.0 + + '@libp2p/interface@2.11.0': + dependencies: + '@multiformats/dns': 1.0.13 + '@multiformats/multiaddr': 12.5.1 + it-pushable: 3.2.3 + it-stream-types: 2.0.2 + main-event: 1.0.1 + multiformats: 13.4.2 + progress-events: 1.0.1 + uint8arraylist: 2.4.8 + + '@libp2p/interface@3.1.0': + dependencies: + '@multiformats/dns': 1.0.13 + '@multiformats/multiaddr': 13.0.1 + main-event: 1.0.1 + multiformats: 13.4.2 + progress-events: 1.0.1 + uint8arraylist: 2.4.8 + + '@libp2p/logger@5.2.0': + dependencies: + '@libp2p/interface': 2.11.0 + '@multiformats/multiaddr': 12.5.1 + interface-datastore: 8.3.2 + multiformats: 13.4.2 + weald: 1.1.1 + + '@libp2p/peer-id@5.1.9': + dependencies: + '@libp2p/crypto': 5.1.13 + '@libp2p/interface': 2.11.0 + multiformats: 13.4.2 + uint8arrays: 5.1.0 + '@lit-labs/ssr-dom-shim@1.5.0': {} '@lit/react@1.0.8(@types/react@19.2.6)': @@ -5402,11 +6892,11 @@ snapshots: dependencies: openapi-fetch: 0.13.8 - '@metamask/sdk-communication-layer@0.33.1(cross-fetch@4.1.0)(eciesjs@0.4.16)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + '@metamask/sdk-communication-layer@0.33.1(cross-fetch@4.1.0(encoding@0.1.13))(eciesjs@0.4.16)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': dependencies: '@metamask/sdk-analytics': 0.0.5 bufferutil: 4.1.0 - cross-fetch: 4.1.0 + cross-fetch: 4.1.0(encoding@0.1.13) date-fns: 2.30.0 debug: 4.3.4 eciesjs: 0.4.16 @@ -5422,17 +6912,17 @@ snapshots: dependencies: '@paulmillr/qr': 0.2.1 - '@metamask/sdk@0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + '@metamask/sdk@0.33.1(bufferutil@4.1.0)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.28.4 '@metamask/onboarding': 1.0.1 '@metamask/providers': 16.1.0 '@metamask/sdk-analytics': 0.0.5 - '@metamask/sdk-communication-layer': 0.33.1(cross-fetch@4.1.0)(eciesjs@0.4.16)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@metamask/sdk-communication-layer': 0.33.1(cross-fetch@4.1.0(encoding@0.1.13))(eciesjs@0.4.16)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@metamask/sdk-install-modal-web': 0.32.1 '@paulmillr/qr': 0.2.1 bowser: 2.13.1 - cross-fetch: 4.1.0 + cross-fetch: 4.1.0(encoding@0.1.13) debug: 4.3.4 eciesjs: 0.4.16 eth-rpc-errors: 4.0.3 @@ -5441,7 +6931,7 @@ snapshots: pump: 3.0.3 readable-stream: 3.6.2 socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) - tslib: 2.7.0 + tslib: 2.8.1 util: 0.12.5 uuid: 8.3.2 transitivePeerDependencies: @@ -5460,8 +6950,8 @@ snapshots: '@scure/base': 1.2.6 '@types/debug': 4.1.12 '@types/lodash': 4.17.21 - debug: 4.4.3 - lodash: 4.17.21 + debug: 4.4.3(supports-color@8.1.1) + lodash: 4.17.23 pony-cause: 2.1.11 semver: 7.7.3 uuid: 9.0.1 @@ -5472,7 +6962,7 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) semver: 7.7.3 superstruct: 1.0.4 transitivePeerDependencies: @@ -5485,7 +6975,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) pony-cause: 2.1.11 semver: 7.7.3 uuid: 9.0.1 @@ -5499,7 +6989,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) pony-cause: 2.1.11 semver: 7.7.3 uuid: 9.0.1 @@ -5510,6 +7000,36 @@ snapshots: '@msgpack/msgpack@3.1.2': {} + '@multiformats/dns@1.0.13': + dependencies: + '@dnsquery/dns-packet': 6.1.1 + '@libp2p/interface': 3.1.0 + hashlru: 2.3.0 + p-queue: 9.1.0 + progress-events: 1.0.1 + uint8arrays: 5.1.0 + + '@multiformats/multiaddr-to-uri@11.0.2': + dependencies: + '@multiformats/multiaddr': 12.5.1 + + '@multiformats/multiaddr@12.5.1': + dependencies: + '@chainsafe/is-ip': 2.1.0 + '@chainsafe/netmask': 2.0.0 + '@multiformats/dns': 1.0.13 + abort-error: 1.0.1 + multiformats: 13.4.2 + uint8-varint: 2.0.4 + uint8arrays: 5.1.0 + + '@multiformats/multiaddr@13.0.1': + dependencies: + '@chainsafe/is-ip': 2.1.0 + multiformats: 13.4.2 + uint8-varint: 2.0.4 + uint8arrays: 5.1.0 + '@noble/ciphers@1.2.1': {} '@noble/ciphers@1.3.0': {} @@ -5546,6 +7066,10 @@ snapshots: dependencies: '@noble/hashes': 1.8.0 + '@noble/curves@2.0.1': + dependencies: + '@noble/hashes': 2.0.1 + '@noble/hashes@1.3.2': {} '@noble/hashes@1.4.0': {} @@ -5558,6 +7082,20 @@ snapshots: '@noble/hashes@1.8.0': {} + '@noble/hashes@2.0.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + '@nomicfoundation/edr-darwin-arm64@0.12.0-next.14': {} '@nomicfoundation/edr-darwin-x64@0.12.0-next.14': {} @@ -5614,7 +7152,7 @@ snapshots: '@nomicfoundation/ignition-core': 3.0.5(bufferutil@4.1.0)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 3.0.5 chalk: 5.6.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) hardhat: 3.0.15(bufferutil@4.1.0)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 @@ -5631,7 +7169,7 @@ snapshots: '@nomicfoundation/hardhat-utils': 3.0.5 '@nomicfoundation/hardhat-zod-utils': 3.0.1(zod@3.25.76) chalk: 5.6.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) hardhat: 3.0.15(bufferutil@4.1.0)(utf-8-validate@5.0.10) zod: 3.25.76 transitivePeerDependencies: @@ -5680,7 +7218,7 @@ snapshots: '@nomicfoundation/hardhat-utils@3.0.5': dependencies: '@streamparser/json-node': 0.0.22 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) env-paths: 2.2.1 ethereum-cryptography: 2.2.1 fast-equals: 5.3.3 @@ -5698,7 +7236,7 @@ snapshots: '@nomicfoundation/hardhat-zod-utils': 3.0.1(zod@3.25.76) cbor2: 1.12.0 chalk: 5.6.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) hardhat: 3.0.15(bufferutil@4.1.0)(utf-8-validate@5.0.10) semver: 7.7.3 zod: 3.25.76 @@ -5739,7 +7277,7 @@ snapshots: '@nomicfoundation/hardhat-utils': 3.0.5 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor2: 1.12.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) ethers: 6.15.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) immer: 10.0.2 lodash-es: 4.17.21 @@ -5805,11 +7343,82 @@ snapshots: proc-log: 3.0.0 semver: 7.7.3 transitivePeerDependencies: - - bluebird + - bluebird + + '@npmcli/promise-spawn@6.0.2': + dependencies: + which: 3.0.1 + + '@oclif/core@4.5.5': + dependencies: + ansi-escapes: 4.3.2 + ansis: 3.17.0 + clean-stack: 3.0.1 + cli-spinners: 2.9.2 + debug: 4.4.3(supports-color@8.1.1) + ejs: 3.1.10 + get-package-type: 0.1.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + lilconfig: 3.1.3 + minimatch: 9.0.5 + semver: 7.7.3 + string-width: 4.2.3 + supports-color: 8.1.1 + tinyglobby: 0.2.15 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + + '@oclif/core@4.8.1': + dependencies: + ansi-escapes: 4.3.2 + ansis: 3.17.0 + clean-stack: 3.0.1 + cli-spinners: 2.9.2 + debug: 4.4.3(supports-color@8.1.1) + ejs: 3.1.10 + get-package-type: 0.1.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + lilconfig: 3.1.3 + minimatch: 10.2.3 + semver: 7.7.3 + string-width: 4.2.3 + supports-color: 8.1.1 + tinyglobby: 0.2.15 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + + '@oclif/plugin-autocomplete@3.2.40': + dependencies: + '@oclif/core': 4.8.1 + ansis: 3.17.0 + debug: 4.4.3(supports-color@8.1.1) + ejs: 3.1.10 + transitivePeerDependencies: + - supports-color + + '@oclif/plugin-not-found@3.2.74(@types/node@25.3.0)': + dependencies: + '@inquirer/prompts': 7.10.1(@types/node@25.3.0) + '@oclif/core': 4.8.1 + ansis: 3.17.0 + fast-levenshtein: 3.0.0 + transitivePeerDependencies: + - '@types/node' - '@npmcli/promise-spawn@6.0.2': + '@oclif/plugin-warn-if-update-available@3.1.55': dependencies: - which: 3.0.1 + '@oclif/core': 4.8.1 + ansis: 3.17.0 + debug: 4.4.3(supports-color@8.1.1) + http-call: 5.3.0 + lodash: 4.17.23 + registry-auth-token: 5.1.1 + transitivePeerDependencies: + - supports-color '@openzeppelin/contracts@5.4.0': {} @@ -5819,9 +7428,23 @@ snapshots: dependencies: lit: 3.3.0 + '@pinax/graph-networks-registry@0.7.1': {} + '@pkgjs/parseargs@0.11.0': optional: true + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@3.0.2': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + '@privy-io/api-base@1.7.3': dependencies: zod: 3.25.76 @@ -5855,7 +7478,7 @@ snapshots: '@privy-io/popup@0.0.1': {} - '@privy-io/react-auth@3.10.1(@solana-program/system@0.10.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana-program/token@0.9.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(@solana/sysvars@5.3.0(typescript@5.9.3))(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(permissionless@0.2.57(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(zod@3.25.76)': + '@privy-io/react-auth@3.10.1(@solana-program/system@0.10.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana-program/token@0.9.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(@solana/sysvars@5.3.0(typescript@5.9.3))(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(permissionless@0.2.57(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@base-org/account': 1.1.1(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(zod@3.25.76) '@coinbase/wallet-sdk': 4.3.2 @@ -5876,8 +7499,8 @@ snapshots: '@simplewebauthn/browser': 13.2.2 '@tanstack/react-virtual': 3.13.18(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@wallet-standard/app': 1.1.0 - '@walletconnect/ethereum-provider': 2.22.4(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@walletconnect/universal-provider': 2.22.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/ethereum-provider': 2.22.4(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.22.4(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) eventemitter3: 5.0.1 fast-password-entropy: 1.1.1 jose: 4.15.9 @@ -5896,7 +7519,7 @@ snapshots: tinycolor2: 1.6.0 uuid: 9.0.1 viem: 2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - x402: 0.7.3(@solana/sysvars@5.3.0(typescript@5.9.3))(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + x402: 0.7.3(@solana/sysvars@5.3.0(typescript@5.9.3))(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10) zustand: 5.0.9(@types/react@19.2.6)(immer@10.0.2)(react@19.2.0)(use-sync-external-store@1.4.0(react@19.2.0)) optionalDependencies: '@solana-program/system': 0.10.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) @@ -5984,7 +7607,7 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@react-router/dev@7.9.6(@react-router/serve@7.9.6(react-router@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@react-router/dev@7.9.6(@react-router/serve@7.9.6(react-router@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@babel/core': 7.28.5 '@babel/generator': 7.28.5 @@ -6014,8 +7637,8 @@ snapshots: semver: 7.7.3 tinyglobby: 0.2.15 valibot: 1.1.0(typescript@5.9.3) - vite: 7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) - vite-node: 3.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1) optionalDependencies: '@react-router/serve': 7.9.6(react-router@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) typescript: 5.9.3 @@ -6124,11 +7747,11 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-controllers@1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-controllers@1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 1.13.2(@types/react@19.2.6)(react@19.2.0) viem: 2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: @@ -6159,11 +7782,11 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-controllers@1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-controllers@1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-wallet': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.21.9(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 2.1.7(@types/react@19.2.6)(react@19.2.0) viem: 2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: @@ -6194,12 +7817,12 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-pay@1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-pay@1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) lit: 3.3.0 valtio: 1.13.2(@types/react@19.2.6)(react@19.2.0) transitivePeerDependencies: @@ -6230,12 +7853,12 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-pay@1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-pay@1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) + '@reown/appkit-controllers': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) lit: 3.3.0 valtio: 2.1.7(@types/react@19.2.6)(react@19.2.0) transitivePeerDependencies: @@ -6274,12 +7897,12 @@ snapshots: dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76)': + '@reown/appkit-scaffold-ui@1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) lit: 3.3.0 transitivePeerDependencies: @@ -6311,12 +7934,12 @@ snapshots: - valtio - zod - '@reown/appkit-scaffold-ui@1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76)': + '@reown/appkit-scaffold-ui@1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) + '@reown/appkit-controllers': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) '@reown/appkit-wallet': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) lit: 3.3.0 transitivePeerDependencies: @@ -6348,10 +7971,10 @@ snapshots: - valtio - zod - '@reown/appkit-ui@1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-ui@1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) lit: 3.3.0 qrcode: 1.5.3 @@ -6383,11 +8006,11 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-ui@1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-ui@1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@phosphor-icons/webcomponents': 2.1.5 '@reown/appkit-common': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-wallet': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) lit: 3.3.0 qrcode: 1.5.3 @@ -6419,14 +8042,14 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76)': + '@reown/appkit-utils@1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-polyfills': 1.7.8 '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 1.13.2(@types/react@19.2.6)(react@19.2.0) viem: 2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: @@ -6457,15 +8080,15 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76)': + '@reown/appkit-utils@1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-polyfills': 1.8.9 '@reown/appkit-wallet': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@wallet-standard/wallet': 1.1.0 '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.21.9(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 2.1.7(@types/react@19.2.6)(react@19.2.0) viem: 2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: @@ -6518,18 +8141,18 @@ snapshots: - typescript - utf-8-validate - '@reown/appkit@1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit@1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-pay': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-pay': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-polyfills': 1.7.8 - '@reown/appkit-scaffold-ui': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) - '@reown/appkit-ui': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@walletconnect/types': 2.21.0 - '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) bs58: 6.0.0 valtio: 1.13.2(@types/react@19.2.6)(react@19.2.0) viem: 2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -6561,17 +8184,17 @@ snapshots: - utf-8-validate - zod - '@reown/appkit@1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit@1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-pay': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-pay': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-polyfills': 1.8.9 - '@reown/appkit-scaffold-ui': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) - '@reown/appkit-ui': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) + '@reown/appkit-scaffold-ui': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) + '@reown/appkit-ui': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.6)(react@19.2.0))(zod@3.25.76) '@reown/appkit-wallet': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.21.9(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) bs58: 6.0.0 semver: 7.7.2 valtio: 2.1.7(@types/react@19.2.6)(react@19.2.0) @@ -6606,6 +8229,8 @@ snapshots: - utf-8-validate - zod + '@rescript/std@9.0.0': {} + '@rollup/rollup-android-arm-eabi@4.53.2': optional: true @@ -6706,8 +8331,8 @@ snapshots: '@scure/bip32@1.6.2': dependencies: - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 '@scure/base': 1.2.6 '@scure/bip32@1.7.0': @@ -6723,7 +8348,7 @@ snapshots: '@scure/bip39@1.5.4': dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.7.2 '@scure/base': 1.2.6 '@scure/bip39@1.6.0': @@ -7174,11 +8799,11 @@ snapshots: '@wallet-standard/base': 1.1.0 '@wallet-standard/features': 1.1.0 - '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/web3.js@1.98.4(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.28.4 '@noble/curves': 1.9.7 - '@noble/hashes': 1.4.0 + '@noble/hashes': 1.8.0 '@solana/buffer-layout': 4.0.1 '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) agentkeepalive: 4.6.0 @@ -7188,7 +8813,7 @@ snapshots: buffer: 6.0.3 fast-stable-stringify: 1.0.0 jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) rpc-websockets: 9.3.2 superstruct: 2.0.2 transitivePeerDependencies: @@ -7268,12 +8893,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 '@tailwindcss/oxide-win32-x64-msvc': 4.1.17 - '@tailwindcss/vite@4.1.17(vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@tailwindcss/vite@4.1.17(vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.17 '@tailwindcss/oxide': 4.1.17 tailwindcss: 4.1.17 - vite: 7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1) '@tanstack/query-core@5.90.16': {} @@ -7314,6 +8939,12 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/node@25.3.0': + dependencies: + undici-types: 7.18.2 + + '@types/parse-json@4.0.2': {} + '@types/react-dom@19.2.3(@types/react@19.2.6)': dependencies: '@types/react': 19.2.6 @@ -7336,18 +8967,18 @@ snapshots: dependencies: '@types/node': 22.19.1 - '@wagmi/connectors@6.2.0(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.16)(@types/react@19.2.6)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76)': + '@wagmi/connectors@6.2.0(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.16)(@types/react@19.2.6)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76)': dependencies: - '@base-org/account': 2.4.0(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(zod@3.25.76) + '@base-org/account': 2.4.0(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(zod@3.25.76) '@coinbase/wallet-sdk': 4.3.6(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(zod@3.25.76) '@gemini-wallet/core': 0.3.2(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(encoding@0.1.13)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.16)(@types/react@19.2.6)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - '@walletconnect/ethereum-provider': 2.21.1(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - porto: 0.2.35(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.16)(@types/react@19.2.6)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + porto: 0.2.35(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.16)(@types/react@19.2.6)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) viem: 2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: typescript: 5.9.3 @@ -7598,17 +9229,17 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/ethereum-provider@2.21.1(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/ethereum-provider@2.21.1(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@reown/appkit': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@reown/appkit': 1.7.8(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/sign-client': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/types': 2.21.1 - '@walletconnect/universal-provider': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.21.1(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: @@ -7639,10 +9270,10 @@ snapshots: - utf-8-validate - zod - '@walletconnect/ethereum-provider@2.22.4(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/ethereum-provider@2.22.4(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@reown/appkit': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@reown/appkit': 1.8.9(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 @@ -7650,7 +9281,7 @@ snapshots: '@walletconnect/logger': 3.0.0 '@walletconnect/sign-client': 2.22.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/types': 2.22.4 - '@walletconnect/universal-provider': 2.22.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.22.4(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/utils': 2.22.4(typescript@5.9.3)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: @@ -7692,11 +9323,11 @@ snapshots: '@walletconnect/time': 1.0.2 events: 3.3.0 - '@walletconnect/jsonrpc-http-connection@1.0.8': + '@walletconnect/jsonrpc-http-connection@1.0.8(encoding@0.1.13)': dependencies: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/safe-json': 1.0.2 - cross-fetch: 3.2.0 + cross-fetch: 3.2.0(encoding@0.1.13) events: 3.3.0 transitivePeerDependencies: - encoding @@ -8043,10 +9674,10 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/universal-provider@2.21.0(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 @@ -8083,10 +9714,10 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/universal-provider@2.21.1(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 @@ -8123,10 +9754,10 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/universal-provider@2.21.9(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 @@ -8163,10 +9794,10 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.22.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/universal-provider@2.22.4(bufferutil@4.1.0)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 @@ -8391,6 +10022,33 @@ snapshots: '@walletconnect/window-getters': 1.0.1 tslib: 1.14.1 + '@whatwg-node/disposablestack@0.0.6': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/fetch@0.10.13': + dependencies: + '@whatwg-node/node-fetch': 0.8.5 + urlpattern-polyfill: 10.1.0 + + '@whatwg-node/node-fetch@0.8.5': + dependencies: + '@fastify/busboy': 3.2.0 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/promise-helpers@1.3.2': + dependencies: + tslib: 2.8.1 + + abitype@0.7.1(typescript@5.9.3)(zod@3.25.76): + dependencies: + typescript: 5.9.3 + optionalDependencies: + zod: 3.25.76 + abitype@1.0.6(typescript@5.9.3)(zod@3.25.76): optionalDependencies: typescript: 5.9.3 @@ -8425,6 +10083,8 @@ snapshots: dependencies: event-target-shim: 5.0.1 + abort-error@1.0.1: {} + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -8440,10 +10100,20 @@ snapshots: ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@4.1.1: {} + ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -8452,19 +10122,46 @@ snapshots: ansi-styles@6.2.3: {} + ansis@3.17.0: {} + + any-signal@4.2.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + apisauce@2.1.6(debug@4.4.3): + dependencies: + axios: 0.21.4(debug@4.4.3) + transitivePeerDependencies: + - debug + + app-module-path@2.2.0: {} + arg@5.0.2: {} + argparse@2.0.1: {} + array-flatten@1.1.1: {} + assemblyscript@0.19.23: + dependencies: + binaryen: 102.0.0-nightly.20211028 + long: 5.3.2 + source-map-support: 0.5.21 + + assemblyscript@0.27.31: + dependencies: + binaryen: 116.0.0-nightly.20240114 + long: 5.3.2 + async-mutex@0.2.6: dependencies: tslib: 2.8.1 + async@3.2.6: {} + asynckit@0.4.0: {} atomic-sleep@1.0.0: {} @@ -8478,9 +10175,15 @@ snapshots: axios: 1.13.2 is-retry-allowed: 2.2.0 + axios@0.21.4(debug@4.4.3): + dependencies: + follow-redirects: 1.15.11(debug@4.4.3) + transitivePeerDependencies: + - debug + axios@1.13.2: dependencies: - follow-redirects: 1.15.11 + follow-redirects: 1.15.11(debug@4.4.3) form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -8497,6 +10200,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base-x@3.0.11: dependencies: safe-buffer: 5.2.1 @@ -8513,8 +10218,21 @@ snapshots: big.js@6.2.2: {} + binaryen@102.0.0-nightly.20211028: {} + + binaryen@116.0.0-nightly.20240114: {} + + bl@1.2.3: + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + blakejs@1.2.1: {} + blob-to-it@2.0.10: + dependencies: + browser-readablestream-to-it: 2.0.10 + bn.js@4.12.2: {} bn.js@5.2.2: {} @@ -8544,12 +10262,27 @@ snapshots: bowser@2.13.1: {} + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.3: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + brorand@1.1.0: {} + browser-readablestream-to-it@2.0.10: {} + browserslist@4.28.0: dependencies: baseline-browser-mapping: 2.8.29 @@ -8566,8 +10299,24 @@ snapshots: dependencies: base-x: 5.0.1 + buffer-alloc-unsafe@1.1.0: {} + + buffer-alloc@1.2.0: + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + + buffer-crc32@0.2.13: {} + + buffer-fill@1.0.0: {} + buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -8577,6 +10326,10 @@ snapshots: dependencies: node-gyp-build: 4.8.4 + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + bytes@3.1.2: {} cac@6.7.14: {} @@ -8598,6 +10351,8 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 + callsites@3.1.0: {} + camelcase@5.3.1: {} camelize@1.0.1: {} @@ -8608,6 +10363,14 @@ snapshots: cbor2@1.12.0: {} + cborg@4.5.8: {} + + 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 @@ -8615,30 +10378,61 @@ snapshots: chalk@5.6.2: {} + chardet@2.1.1: {} + charenc@0.0.2: {} chokidar@4.0.3: dependencies: readdirp: 4.1.2 + clean-stack@3.0.1: + dependencies: + escape-string-regexp: 4.0.0 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + cli-table3@0.6.0: + dependencies: + object-assign: 4.1.1 + string-width: 4.2.3 + optionalDependencies: + colors: 1.4.0 + + cli-width@4.1.0: {} + cliui@6.0.0: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + clone@1.0.4: {} + clsx@1.2.1: {} clsx@2.1.1: {} + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + color-convert@2.0.1: dependencies: color-name: 1.1.4 + color-name@1.1.3: {} + color-name@1.1.4: {} colorette@2.0.20: {} + colors@1.4.0: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -8663,6 +10457,13 @@ snapshots: transitivePeerDependencies: - supports-color + concat-map@0.0.1: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -8681,20 +10482,34 @@ snapshots: core-util-is@1.0.3: {} + cosmiconfig@7.0.1: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + crc-32@1.2.2: {} - cross-fetch@3.2.0: + cross-fetch@3.2.0(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding - cross-fetch@4.1.0: + cross-fetch@4.1.0(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -8717,6 +10532,11 @@ snapshots: csstype@3.2.3: {} + dag-jose@5.1.1: + dependencies: + '@ipld/dag-cbor': 9.2.5 + multiformats: 13.1.3 + date-fns@2.30.0: dependencies: '@babel/runtime': 7.28.4 @@ -8733,22 +10553,75 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.4.3: + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 decamelize@1.2.0: {} decode-uri-component@0.2.2: {} + decompress-tar@4.1.1: + dependencies: + file-type: 5.2.0 + is-stream: 1.1.0 + tar-stream: 1.6.2 + + decompress-tarbz2@4.1.1: + dependencies: + decompress-tar: 4.1.1 + file-type: 6.2.0 + is-stream: 1.1.0 + seek-bzip: 1.0.6 + unbzip2-stream: 1.4.3 + + decompress-targz@4.1.1: + dependencies: + decompress-tar: 4.1.1 + file-type: 5.2.0 + is-stream: 1.1.0 + + decompress-unzip@4.0.1: + dependencies: + file-type: 3.9.0 + get-stream: 2.3.1 + pify: 2.3.0 + yauzl: 2.10.0 + + decompress@4.2.1: + dependencies: + decompress-tar: 4.1.1 + decompress-tarbz2: 4.1.1 + decompress-targz: 4.1.1 + decompress-unzip: 4.0.1 + graceful-fs: 4.2.11 + make-dir: 1.3.0 + pify: 2.3.0 + strip-dirs: 2.1.0 + dedent@1.7.0: {} + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 + define-lazy-prop@3.0.0: {} + defu@6.1.4: {} delay@5.0.0: {} @@ -8773,6 +10646,10 @@ snapshots: dijkstrajs@1.0.3: {} + docker-compose@1.3.0: + dependencies: + yaml: 2.8.1 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -8797,6 +10674,18 @@ snapshots: ee-first@1.1.1: {} + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + ejs@3.1.8: + dependencies: + jake: 10.9.4 + + electron-fetch@1.9.1: + dependencies: + encoding: 0.1.13 + electron-to-chromium@1.5.255: {} elliptic@6.6.1: @@ -8819,6 +10708,10 @@ snapshots: encodeurl@2.0.0: {} + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -8826,7 +10719,7 @@ snapshots: engine.io-client@6.6.4(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) engine.io-parser: 5.2.3 ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) xmlhttprequest-ssl: 2.1.2 @@ -8842,6 +10735,10 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.0 + enquirer@2.3.6: + dependencies: + ansi-colors: 4.1.3 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -8851,6 +10748,12 @@ snapshots: err-code@2.0.3: {} + err-code@3.0.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -8940,6 +10843,10 @@ snapshots: escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + etag@1.8.1: {} eth-block-tracker@7.1.0: @@ -8997,6 +10904,18 @@ snapshots: events@3.3.0: {} + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + exit-hook@2.2.1: {} express@4.21.2: @@ -9037,7 +10956,7 @@ snapshots: extension-port-stream@3.0.0: dependencies: - readable-stream: 3.6.2 + readable-stream: 4.7.0 webextension-polyfill: 0.10.0 eyes@0.1.8: {} @@ -9048,6 +10967,20 @@ snapshots: fast-equals@5.3.3: {} + fast-fifo@1.3.2: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-levenshtein@3.0.0: + dependencies: + fastest-levenshtein: 1.0.16 + fast-password-entropy@1.1.1: {} fast-redact@3.5.0: {} @@ -9056,12 +10989,36 @@ snapshots: fast-stable-stringify@1.0.0: {} + fastest-levenshtein@1.0.16: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 fetch-retry@6.0.0: {} + file-type@3.9.0: {} + + file-type@5.2.0: {} + + file-type@6.2.0: {} + + filelist@1.0.5: + dependencies: + minimatch: 10.2.3 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + filter-obj@1.1.0: {} finalhandler@1.3.1: @@ -9081,7 +11038,9 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - follow-redirects@1.15.11: {} + follow-redirects@1.15.11(debug@4.4.3): + optionalDependencies: + debug: 4.4.3(supports-color@8.1.1) for-each@0.3.5: dependencies: @@ -9106,6 +11065,21 @@ snapshots: fresh@0.5.2: {} + fs-constants@1.0.0: {} + + fs-extra@11.3.2: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-jetpack@4.3.1: + dependencies: + minimatch: 3.1.4 + rimraf: 2.7.1 + + fs.realpath@1.0.0: {} + fsevents@2.3.3: optional: true @@ -9130,6 +11104,10 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-iterator@1.0.2: {} + + get-package-type@0.1.0: {} + get-port@5.1.1: {} get-proto@1.0.1: @@ -9137,10 +11115,21 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stream@2.3.1: + dependencies: + object-assign: 4.1.1 + pinkie-promise: 2.0.1 + + get-stream@6.0.1: {} + get-tsconfig@4.13.0: dependencies: resolve-pkg-maps: 1.0.0 + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + glob@10.5.0: dependencies: foreground-child: 3.3.1 @@ -9150,12 +11139,73 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.2.3 + minimatch: 10.2.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.2 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + globrex@0.1.2: {} + gluegun@5.2.0(debug@4.4.3): + dependencies: + apisauce: 2.1.6(debug@4.4.3) + app-module-path: 2.2.0 + cli-table3: 0.6.0 + colors: 1.4.0 + cosmiconfig: 7.0.1 + cross-spawn: 7.0.3 + ejs: 3.1.8 + enquirer: 2.3.6 + execa: 5.1.1 + fs-jetpack: 4.3.1 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.lowercase: 4.3.0 + lodash.lowerfirst: 4.3.1 + lodash.pad: 4.5.1 + lodash.padend: 4.6.1 + lodash.padstart: 4.6.1 + lodash.repeat: 4.1.0 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.trim: 4.5.1 + lodash.trimend: 4.5.1 + lodash.trimstart: 4.5.1 + lodash.uppercase: 4.3.0 + lodash.upperfirst: 4.3.1 + ora: 4.0.2 + pluralize: 8.0.0 + semver: 7.3.5 + which: 2.0.2 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - debug + gopd@1.2.0: {} + graceful-fs@4.2.10: {} + graceful-fs@4.2.11: {} + graphql-import-node@0.0.5(graphql@16.11.0): + dependencies: + graphql: 16.11.0 + + graphql@16.11.0: {} + h3@1.15.4: dependencies: cookie-es: 1.2.2 @@ -9179,7 +11229,7 @@ snapshots: adm-zip: 0.4.16 chalk: 5.6.2 chokidar: 4.0.3 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) enquirer: 2.4.1 ethereum-cryptography: 2.2.1 micro-eth-signer: 0.14.0 @@ -9194,6 +11244,8 @@ snapshots: - supports-color - utf-8-validate + has-flag@3.0.0: {} + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -9211,6 +11263,8 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 + hashlru@2.3.0: {} + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -9229,6 +11283,17 @@ snapshots: dependencies: lru-cache: 7.18.3 + http-call@5.3.0: + dependencies: + content-type: 1.0.5 + debug: 4.4.3(supports-color@8.1.1) + is-retry-allowed: 1.2.0 + is-stream: 2.0.1 + parse-json: 4.0.0 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - supports-color + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -9237,6 +11302,8 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + human-signals@2.1.0: {} + humanize-ms@1.2.1: dependencies: ms: 2.1.3 @@ -9245,6 +11312,14 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + idb-keyval@6.2.1: {} idb-keyval@6.2.2: {} @@ -9253,10 +11328,38 @@ snapshots: immer@10.0.2: {} + immutable@5.1.4: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + inherits@2.0.4: {} + ini@1.3.8: {} + + interface-datastore@8.3.2: + dependencies: + interface-store: 6.0.3 + uint8arrays: 5.1.0 + + interface-store@6.0.3: {} + ipaddr.js@1.9.1: {} + ipfs-unixfs@11.2.5: + dependencies: + protons-runtime: 5.6.0 + uint8arraylist: 2.4.8 + iron-webcrypto@1.2.1: {} is-arguments@1.2.0: @@ -9264,6 +11367,8 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-arrayish@0.2.1: {} + is-buffer@1.1.6: {} is-callable@1.2.7: {} @@ -9272,6 +11377,14 @@ snapshots: dependencies: hasown: 2.0.2 + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-electron@2.2.2: {} + + is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} is-generator-function@1.1.2: @@ -9282,6 +11395,22 @@ snapshots: has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@1.0.0: {} + + is-natural-number@4.0.1: {} + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -9289,14 +11418,26 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + is-retry-allowed@1.2.0: {} + is-retry-allowed@2.2.0: {} + is-stream@1.1.0: {} + is-stream@2.0.1: {} is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.19 + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + isarray@1.0.0: {} isarray@2.0.5: {} @@ -9305,6 +11446,8 @@ snapshots: isexe@2.0.0: {} + iso-url@1.2.1: {} + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -9317,12 +11460,71 @@ snapshots: dependencies: ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + it-all@3.0.9: {} + + it-first@3.0.9: {} + + it-glob@3.0.4: + dependencies: + fast-glob: 3.3.3 + + it-last@3.0.9: {} + + it-map@3.1.4: + dependencies: + it-peekable: 3.0.8 + + it-peekable@3.0.8: {} + + it-pushable@3.2.3: + dependencies: + p-defer: 4.0.1 + + it-stream-types@2.0.2: {} + + it-to-stream@1.0.0: + dependencies: + buffer: 6.0.3 + fast-fifo: 1.3.2 + get-iterator: 1.0.2 + p-defer: 3.0.0 + p-fifo: 1.0.0 + readable-stream: 3.6.2 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.5 + picocolors: 1.1.1 + + jayson@4.2.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + json-stringify-safe: 5.0.1 + stream-json: 1.9.1 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: '@types/connect': 3.4.38 @@ -9364,8 +11566,16 @@ snapshots: js-tokens@4.0.0: {} + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + jsesc@3.0.2: {} + json-parse-better-errors@1.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + json-parse-even-better-errors@3.0.2: {} json-rpc-engine@6.1.0: @@ -9381,6 +11591,12 @@ snapshots: json5@2.2.3: {} + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + keccak@3.0.4: dependencies: node-addon-api: 2.0.2 @@ -9391,6 +11607,44 @@ snapshots: kleur@3.0.3: {} + kubo-rpc-client@5.4.1(undici@7.16.0): + dependencies: + '@ipld/dag-cbor': 9.2.5 + '@ipld/dag-json': 10.2.6 + '@ipld/dag-pb': 4.1.5 + '@libp2p/crypto': 5.1.13 + '@libp2p/interface': 2.11.0 + '@libp2p/logger': 5.2.0 + '@libp2p/peer-id': 5.1.9 + '@multiformats/multiaddr': 12.5.1 + '@multiformats/multiaddr-to-uri': 11.0.2 + any-signal: 4.2.0 + blob-to-it: 2.0.10 + browser-readablestream-to-it: 2.0.10 + dag-jose: 5.1.1 + electron-fetch: 1.9.1 + err-code: 3.0.1 + ipfs-unixfs: 11.2.5 + iso-url: 1.2.1 + it-all: 3.0.9 + it-first: 3.0.9 + it-glob: 3.0.4 + it-last: 3.0.9 + it-map: 3.1.4 + it-peekable: 3.0.8 + it-to-stream: 1.0.0 + merge-options: 3.0.4 + multiformats: 13.4.2 + nanoid: 5.1.6 + native-fetch: 4.0.2(undici@7.16.0) + parse-duration: 2.1.5 + react-native-fetch-api: 3.0.0 + stream-to-it: 1.0.1 + uint8arrays: 5.1.0 + wherearewe: 2.0.1 + transitivePeerDependencies: + - undici + libphonenumber-js@1.12.33: {} lightningcss-android-arm64@1.30.2: @@ -9442,6 +11696,10 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.2 lightningcss-win32-x64-msvc: 1.30.2 + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + lit-element@4.2.2: dependencies: '@lit-labs/ssr-dom-shim': 1.5.0 @@ -9464,14 +11722,58 @@ snapshots: lodash-es@4.17.21: {} + lodash.camelcase@4.3.0: {} + + lodash.kebabcase@4.1.1: {} + + lodash.lowercase@4.3.0: {} + + lodash.lowerfirst@4.3.1: {} + + lodash.pad@4.5.1: {} + + lodash.padend@4.6.1: {} + + lodash.padstart@4.6.1: {} + + lodash.repeat@4.1.0: {} + + lodash.snakecase@4.1.1: {} + + lodash.startcase@4.4.0: {} + + lodash.trim@4.5.1: {} + + lodash.trimend@4.5.1: {} + + lodash.trimstart@4.5.1: {} + + lodash.uppercase@4.3.0: {} + + lodash.upperfirst@4.3.1: {} + lodash@4.17.21: {} + lodash@4.17.23: {} + + log-symbols@3.0.0: + dependencies: + chalk: 2.4.2 + + long@5.3.2: {} + lru-cache@10.4.3: {} + lru-cache@11.2.6: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lru-cache@7.18.3: {} lucide-react@0.554.0(react@19.2.0): @@ -9482,6 +11784,12 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + main-event@1.0.1: {} + + make-dir@1.3.0: + dependencies: + pify: 3.0.0 + math-intrinsics@1.1.0: {} md5@2.3.0: @@ -9494,6 +11802,14 @@ snapshots: merge-descriptors@1.0.3: {} + merge-options@3.0.4: + dependencies: + is-plain-obj: 2.1.0 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + methods@1.1.2: {} micro-eth-signer@0.14.0: @@ -9508,6 +11824,11 @@ snapshots: dependencies: '@scure/base': 1.2.6 + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + mime-db@1.52.0: {} mime-db@1.54.0: {} @@ -9518,10 +11839,20 @@ snapshots: mime@1.6.0: {} + mimic-fn@2.1.0: {} + minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} + minimatch@10.2.3: + dependencies: + brace-expansion: 5.0.3 + + minimatch@3.1.4: + dependencies: + brace-expansion: 1.1.12 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 @@ -9550,10 +11881,26 @@ snapshots: ms@2.1.3: {} + ms@3.0.0-canary.202508261828: {} + + multiformats@13.1.3: {} + + multiformats@13.4.2: {} + multiformats@9.9.0: {} + mustache@4.2.0: {} + + mute-stream@2.0.0: {} + nanoid@3.3.11: {} + nanoid@5.1.6: {} + + native-fetch@4.0.2(undici@7.16.0): + dependencies: + undici: 7.16.0 + ndjson@2.0.0: dependencies: json-stringify-safe: 5.0.1 @@ -9570,9 +11917,11 @@ snapshots: node-fetch-native@1.6.7: {} - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-gyp-build@4.8.4: {} @@ -9609,12 +11958,18 @@ snapshots: npm-package-arg: 10.1.0 semver: 7.7.3 + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + obj-multiplex@1.0.0: dependencies: end-of-stream: 1.4.5 once: 1.4.0 readable-stream: 2.3.8 + object-assign@4.1.1: {} + object-inspect@1.13.4: {} ofetch@1.5.1: @@ -9641,12 +11996,33 @@ snapshots: dependencies: wrappy: 1.0.2 + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@10.2.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + openapi-fetch@0.13.8: dependencies: openapi-typescript-helpers: 0.0.15 openapi-typescript-helpers@0.0.15: {} + ora@4.0.2: + dependencies: + chalk: 2.4.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + log-symbols: 3.0.0 + strip-ansi: 5.2.0 + wcwidth: 1.0.1 + ox@0.11.1(typescript@5.9.3)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.11.1 @@ -9680,11 +12056,11 @@ snapshots: ox@0.6.7(typescript@5.9.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.1 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.9.3)(zod@3.25.76) + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.3 @@ -9713,7 +12089,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.9.3)(zod@3.25.76) + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.3 @@ -9765,6 +12141,15 @@ snapshots: transitivePeerDependencies: - zod + p-defer@3.0.0: {} + + p-defer@4.0.1: {} + + p-fifo@1.0.0: + dependencies: + fast-fifo: 1.3.2 + p-defer: 3.0.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -9775,14 +12160,41 @@ snapshots: p-map@7.0.4: {} + p-queue@9.1.0: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 7.0.1 + + p-timeout@7.0.1: {} + p-try@2.2.0: {} package-json-from-dist@1.0.1: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-duration@2.1.5: {} + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.4 + json-parse-better-errors: 1.0.2 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + parseurl@1.3.3: {} path-exists@4.0.0: {} + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-scurry@1.11.1: @@ -9790,12 +12202,21 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.2: + dependencies: + lru-cache: 11.2.6 + minipass: 7.1.2 + path-to-regexp@0.1.12: {} + path-type@4.0.0: {} + pathe@1.1.2: {} pathe@2.0.3: {} + pend@1.2.0: {} + permissionless@0.2.57(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)): dependencies: viem: 2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -9806,10 +12227,18 @@ snapshots: picomatch@4.0.3: {} + pify@2.3.0: {} + pify@3.0.0: {} pify@5.0.0: {} + pinkie-promise@2.0.1: + dependencies: + pinkie: 2.0.4 + + pinkie@2.0.4: {} + pino-abstract-transport@0.5.0: dependencies: duplexify: 4.1.3 @@ -9873,11 +12302,13 @@ snapshots: sonic-boom: 2.8.0 thread-stream: 0.15.2 + pluralize@8.0.0: {} + pngjs@5.0.0: {} pony-cause@2.1.11: {} - porto@0.2.35(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.16)(@types/react@19.2.6)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): + porto@0.2.35(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.16)(@types/react@19.2.6)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): dependencies: '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.16)(@types/react@19.2.6)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) hono: 4.11.3 @@ -9891,7 +12322,7 @@ snapshots: '@tanstack/react-query': 5.90.16(react@19.2.0) react: 19.2.0 typescript: 5.9.3 - wagmi: 2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) transitivePeerDependencies: - '@types/react' - immer @@ -9935,6 +12366,10 @@ snapshots: process@0.11.10: {} + progress-events@1.0.1: {} + + progress@2.0.3: {} + promise-inflight@1.0.1: {} promise-retry@2.0.1: @@ -9947,6 +12382,14 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 + proto-list@1.2.4: {} + + protons-runtime@5.6.0: + dependencies: + uint8-varint: 2.0.4 + uint8arraylist: 2.4.8 + uint8arrays: 5.1.0 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -9987,6 +12430,8 @@ snapshots: split-on-first: 1.1.0 strict-uri-encode: 2.0.0 + queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} radix3@1.1.2: {} @@ -10013,6 +12458,10 @@ snapshots: react-is@18.3.1: {} + react-native-fetch-api@3.0.0: + dependencies: + p-defer: 3.0.0 + react-refresh@0.14.2: {} react-router@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): @@ -10055,18 +12504,35 @@ snapshots: real-require@0.2.0: {} + registry-auth-token@5.1.1: + dependencies: + '@pnpm/npm-conf': 3.0.2 + require-directory@2.1.1: {} require-main-filename@2.0.0: {} + resolve-from@4.0.0: {} + resolve-pkg-maps@1.0.0: {} resolve.exports@2.0.3: {} + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + retry@0.12.0: {} + reusify@1.1.0: {} + rfdc@1.4.1: {} + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + rollup@4.53.2: dependencies: '@types/estree': 1.0.8 @@ -10108,6 +12574,12 @@ snapshots: bufferutil: 4.1.0 utf-8-validate: 5.0.10 + run-applescript@7.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} @@ -10128,8 +12600,16 @@ snapshots: secure-password-utilities@0.2.1: {} + seek-bzip@1.0.6: + dependencies: + commander: 2.20.3 + semver@6.3.1: {} + semver@7.3.5: + dependencies: + lru-cache: 6.0.0 + semver@7.7.2: {} semver@7.7.3: {} @@ -10218,6 +12698,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} sisteransi@1.0.5: {} @@ -10227,7 +12709,7 @@ snapshots: socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) engine.io-client: 6.6.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) socket.io-parser: 4.2.5 transitivePeerDependencies: @@ -10238,7 +12720,7 @@ snapshots: socket.io-parser@4.2.5: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -10295,6 +12777,10 @@ snapshots: stream-shift@1.0.3: {} + stream-to-it@1.0.1: + dependencies: + it-stream-types: 2.0.2 + strict-uri-encode@2.0.0: {} string-width@4.2.3: @@ -10317,6 +12803,10 @@ snapshots: dependencies: safe-buffer: 5.2.1 + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -10325,6 +12815,12 @@ snapshots: dependencies: ansi-regex: 6.2.2 + strip-dirs@2.1.0: + dependencies: + is-natural-number: 4.0.1 + + strip-final-newline@2.0.0: {} + strip-json-comments@3.1.1: {} styled-components@6.2.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0): @@ -10347,16 +12843,36 @@ snapshots: superstruct@2.0.2: {} + supports-color@10.2.2: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + tabbable@6.4.0: {} tailwindcss@4.1.17: {} tapable@2.3.0: {} + tar-stream@1.6.2: + dependencies: + bl: 1.2.3 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + readable-stream: 2.3.8 + to-buffer: 1.2.2 + xtend: 4.0.2 + text-encoding-utf-8@1.0.2: {} thread-stream@0.15.2: @@ -10371,6 +12887,8 @@ snapshots: dependencies: readable-stream: 3.6.2 + through@2.3.8: {} + tinycolor2@1.6.0: {} tinyglobby@0.2.15: @@ -10378,12 +12896,22 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.5 + + tmp@0.2.5: {} + to-buffer@1.2.2: dependencies: isarray: 2.0.5 safe-buffer: 5.2.1 typed-array-buffer: 1.0.3 + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + toidentifier@1.0.1: {} tr46@0.0.3: {} @@ -10414,8 +12942,14 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + tunnel@0.0.6: {} + type-fest@0.21.3: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -10435,6 +12969,15 @@ snapshots: ufo@1.6.2: {} + uint8-varint@2.0.4: + dependencies: + uint8arraylist: 2.4.8 + uint8arrays: 5.1.0 + + uint8arraylist@2.4.8: + dependencies: + uint8arrays: 5.1.0 + uint8arrays@3.1.0: dependencies: multiformats: 9.9.0 @@ -10443,6 +12986,15 @@ snapshots: dependencies: multiformats: 9.9.0 + uint8arrays@5.1.0: + dependencies: + multiformats: 13.4.2 + + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + uncrypto@0.1.3: {} undici-types@6.19.8: {} @@ -10457,6 +13009,10 @@ snapshots: undici@6.22.0: {} + undici@7.16.0: {} + + universalify@2.0.1: {} + unpipe@1.0.0: {} unstorage@1.17.3(idb-keyval@6.2.2): @@ -10478,6 +13034,8 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + urlpattern-polyfill@10.1.0: {} + use-sync-external-store@1.2.0(react@19.2.0): dependencies: react: 19.2.0 @@ -10494,6 +13052,8 @@ snapshots: dependencies: node-gyp-build: 4.8.4 + utf8-codec@1.0.0: {} + util-deprecate@1.0.2: {} util@0.12.5: @@ -10624,13 +13184,13 @@ snapshots: - utf-8-validate - zod - vite-node@3.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0): + vite-node@3.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1): dependencies: cac: 6.7.14 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -10645,18 +13205,18 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0): + vite@7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -10670,11 +13230,12 @@ snapshots: jiti: 2.6.1 lightningcss: 1.30.2 tsx: 4.21.0 + yaml: 2.8.1 - wagmi@2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76): + wagmi@2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76): dependencies: '@tanstack/react-query': 5.90.16(react@19.2.0) - '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.16)(@types/react@19.2.6)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76) + '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.16)(@types/react@19.2.6)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76) '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.16)(@types/react@19.2.6)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.0))(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) react: 19.2.0 use-sync-external-store: 1.4.0(react@19.2.0) @@ -10716,6 +13277,48 @@ snapshots: - utf-8-validate - zod + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + weald@1.1.1: + dependencies: + ms: 3.0.0-canary.202508261828 + supports-color: 10.2.2 + + web3-errors@1.3.1: + dependencies: + web3-types: 1.10.0 + + web3-eth-abi@4.4.1(typescript@5.9.3)(zod@3.25.76): + dependencies: + abitype: 0.7.1(typescript@5.9.3)(zod@3.25.76) + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - typescript + - zod + + web3-types@1.10.0: {} + + web3-utils@4.3.3: + dependencies: + ethereum-cryptography: 2.2.1 + eventemitter3: 5.0.1 + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-validator: 2.0.6 + + web3-validator@2.0.6: + dependencies: + ethereum-cryptography: 2.2.1 + util: 0.12.5 + web3-errors: 1.3.1 + web3-types: 1.10.0 + zod: 3.25.76 + webextension-polyfill@0.10.0: {} webidl-conversions@3.0.1: {} @@ -10725,6 +13328,10 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + wherearewe@2.0.1: + dependencies: + is-electron: 2.2.2 + which-module@2.0.1: {} which-typed-array@1.1.19: @@ -10745,6 +13352,12 @@ snapshots: dependencies: isexe: 2.0.0 + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + + wordwrap@1.0.0: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -10785,7 +13398,11 @@ snapshots: bufferutil: 4.1.0 utf-8-validate: 5.0.10 - x402@0.7.3(@solana/sysvars@5.3.0(typescript@5.9.3))(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10): + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.1 + + x402@0.7.3(@solana/sysvars@5.3.0(typescript@5.9.3))(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10): dependencies: '@scure/base': 1.2.6 '@solana-program/compute-budget': 0.11.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) @@ -10798,7 +13415,7 @@ snapshots: '@wallet-standard/base': 1.1.0 '@wallet-standard/features': 1.1.0 viem: 2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - wagmi: 2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.0))(@types/react@19.2.6)(bufferutil@4.1.0)(encoding@0.1.13)(immer@10.0.2)(react@19.2.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.43.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' @@ -10846,11 +13463,19 @@ snapshots: yallist@3.1.1: {} + yallist@4.0.0: {} + + yaml@1.10.2: {} + + yaml@2.8.1: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 + yargs-parser@21.1.1: {} + yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -10865,6 +13490,13 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yoctocolors-cjs@2.1.3: {} + zod@3.22.4: {} zod@3.25.76: {} diff --git a/query-sample.mjs b/query-sample.mjs new file mode 100644 index 0000000..e69de29