From 7794385ebed29b279c15b53d6eac911b611fdff3 Mon Sep 17 00:00:00 2001 From: Maciej Skrzypkowski Date: Wed, 22 Jan 2025 13:59:03 +0100 Subject: [PATCH] Taiko main v2 (#14) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: fix lint errors * test: update tests * chore(taiko-client): update CI badge and path (#18441) * ci(repo): delete some workflows and release configs (#18440) * feat(docs-site): update network config, list cooldown, proving windows and bonds for every tier, remove banner (#18377) Co-authored-by: Daniel Wang <99078276+dantaik@users.noreply.github.com> * fix(protocol): fix debitBond bug and add additional tests (#18443) * feat: changes based on comments * feat: changes based on comments * feat(taiko-client): add chain ID to `TryDecompress()` (#18444) * refactor(protocol): slightly improve EssentialContract (#18445) * fix: fix lint errors * fix(protocol): revert `B_TIER_OPTIMISTIC` back to `""` (#18446) * feat(taiko-client): compatible changes for `lastProposedIn` (#18442) * ci(protocol): revert release-please workflow (#18447) * build(deps): bump github.com/golang-jwt/jwt/v4 from 4.5.0 to 4.5.1 in the go_modules group (#18448) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(main): release docs-site 1.15.0 (#18428) * feat(taiko-client): revert pr 18442 (#18450) * test: add more tests * test: add more tests * docs(protocol): upgrade verifiers to support proof aggregation in Hekla (#18453) * feat(protocol): allow `local.params.parentMetaHash` to remain as 0 (#18451) * feat(docs-site): update graphic for hekla network config (#18457) * feat(repo): don't run workflows on release-please branches (#18459) * fix(repo): revert release-please (#18461) * refactor(protocol): extra a new function in LibProposing (#18456) * chore: update some comments * feat: check soft block height * feat(taiko-client): update Go contract bindings (#18462) * chore(main): release docs-site 1.16.0 (#18458) Co-authored-by: Roger <50648015+RogerLamTd@users.noreply.github.com> * build docker image which will used in hive test * build docker image which will used in hive test * feat(taiko-client): avoid coping the whole struct (#18463) * feat(protocol): update sp1 to 3.0.0 prod version (#18465) * feat(protocol): request zk proofs(risc0 & sp1) in mainnet (#18467) * feat(protocol): tolerate invalid BaseFeeConfig on L2 (#18338) Co-authored-by: dantaik Co-authored-by: gavin Co-authored-by: David Co-authored-by: Bernat Canal Garceran Co-authored-by: taiko-bot <160625009+taiko-kitty@users.noreply.github.com> Co-authored-by: Roger <50648015+RogerLamTd@users.noreply.github.com> Co-authored-by: maskpp Co-authored-by: smtmfft <99081233+smtmfft@users.noreply.github.com> Co-authored-by: Ivan Lagunovsky Co-authored-by: jeff <113397187+cyberhorsey@users.noreply.github.com> Co-authored-by: Karim Co-authored-by: Karim <162329697+kimo-ice@users.noreply.github.com> Co-authored-by: YoGhurt111 * docs(protocol): upgrade sp1 remote verifier in Hekla (#18469) * feat(relayer): confirmations before indexing for relayer should be configurable (#18466) * feat(docs-site): update testnet address (#18472) * feat(repo): fix workflows, restore merge-gatekeeper (#18471) * docs(protocol): add mainnet zkVM verifiers deployment (#18454) * feat(protocol): measure gas per block using a debug event (#18470) * feat(protocol): increase zk(risc0 & sp1) rate in mainnet (#18481) * test(protocol): check LibEIP1559 function results in fuzz tests (#18475) * chore(docs-site): update block-states.mdx (#18480) * fix(repo): ignore draft PRs merge-gatekeeper (#18488) * feat(docs-site): update tier config and graphic (#18487) * chore(main): release docs-site 1.17.0 (#18476) * chore(repo): improve documentation and changelog (#18489) * docs(protocol): add Ontake fork audit report from OpenZeppelin (#18491) * chore(protocol): fix typos in documentation files (#18490) * feat(eventindexer): eventindexer post ontake fork (#18474) * build(deps): bump github.com/buildkite/terminal-to-html/v3 from 3.8.0 to 3.16.3 (#18478) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump golang.org/x/sync from 0.8.0 to 0.9.0 (#18479) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump github.com/prysmaticlabs/prysm/v5 from 5.1.0 to 5.1.2 (#18477) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * docs(protocol): update mainnet deployment docs (#18482) * build(deps): bump github.com/go-resty/resty/v2 from 2.15.3 to 2.16.0 (#18492) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump github.com/buildkite/terminal-to-html/v3 from 3.16.3 to 3.16.4 (#18493) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: check if BatchID is nil * chore: update go.sum * chore: update go.mod * feat: only snap sync to the highest safe block * chore(docs-site): update tier router address (#18495) * chore(main): release docs-site 1.17.1 (#18496) * test: fix tests * docs(balance-monitor): fix typo Update main.go (#18502) * docs(repo): improve grammar and readability (#18501) * feat(repo): add geth-rpc-gateway (#18382) * fix(relayer): temp fix if `txSender` is not available for `txIndex` when processing events (#18513) * build(deps): bump github.com/pressly/goose/v3 from 3.20.0 to 3.23.0 (#18509) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump github.com/go-resty/resty/v2 from 2.16.0 to 2.16.2 (#18510) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * ci(repo): change to trigger hive test manually (#18514) * refactor(taiko-client): move `utils` package from `internal/` to `pkg/` (#18516) * test(taiko-client): fix some lint issues for `taiko-client` (#18517) * feat(taiko-client): fix utils reference and lint error (#18518) * ci(repo): update go mod and use random port (#18515) * test(taiko-client): skip `TestCheckL1ReorgToSameHeightFork` temporarily (#18522) * feat(docs-site): add software releases page that shows latest software releases and protocol deployments (#18523) * chore(main): release docs-site 1.18.0 (#18526) * default false sig check * feat(taiko-client): add more preconf logs (#18524) * feat(docs-site): add escenario and explanation for contestable rollup (#18530) * chore(main): release docs-site 1.19.0 (#18532) * feat(nfts): trailblazers "registerEvent" contract (#18198) * feat(nfts): trailblazers badges s2 (#18040) Co-authored-by: bearni95 * feat(taiko-client): enable proof aggregation (batch proofs) (#18163) Co-authored-by: David Co-authored-by: maskpp * feat(docs-site): add taiko-protocol section with economics and codebase analysis (#18542) Co-authored-by: RogerLamTd Co-authored-by: swarna1101 * chore(main): release docs-site 1.20.0 (#18550) * chore(docs-site): update hekla proof tier config graphic and address (#18554) * chore(docs-site): add goldsky to dev tools (#18552) * feat(taiko-client): don't change safeBlockHash and finalizedBlockHash (#18544) * feat(protocol): decrease the rate of risc0 in Hekla (#18553) * fix(docs-site): correct graphic (#18561) * chore(main): release docs-site 1.20.1 (#18555) * fix(docs-site): link of goldsky in dev tools (#18562) * chore(main): release docs-site 1.20.2 (#18563) * fix(docs-site): update hekla graphic (#18572) * chore(main): release docs-site 1.20.3 (#18573) * feat: add client and protocol workflows * feat(bridge-ui): remove fee padding (#18546) * feat(nfts): eventRegister contract update (#18547) * chore(main): fix misspelled (#18581) * chore(protocol): remove repetitive words in audit report (#18584) Signed-off-by: RiceChuan * ci(relayer): stop running CI actions when updating `go.mod` (#18591) * build(deps): bump github.com/labstack/echo/v4 from 4.12.0 to 4.13.2 (#18583) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: David * build(deps): bump golang.org/x/sync from 0.9.0 to 0.10.0 (#18560) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump github.com/stretchr/testify from 1.9.0 to 1.10.0 (#18539) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: David * feat(repo): don't run vercel workflow on fork (#18593) * feat: update go.mod * feat(repo): disable docs-site preview run on fork (#18596) * chore(docs-site): fix broken link (#18585) Co-authored-by: Roger <50648015+RogerLamTd@users.noreply.github.com> * chore(docs-site): fix typos in node operator guides (#18586) Co-authored-by: Roger <50648015+RogerLamTd@users.noreply.github.com> * feat(bridge-ui): add curve (#18549) * feat(taiko-client): check baseFee before append the latest soft block (#18533) * feat(protocol): change HeklaTaikoToken's clock mode to timestamp to test the DAO (#18597) * docs(protocol): update Hekla deployments (#18598) * feat(protocol): introduce ForkManager to improve protocol fork management (#18508) Co-authored-by: dantaik Co-authored-by: David * fix(taiko-client): valid status check in `BatchGetBlocksProofStatus` (#18595) * fix(nft): fix s2 badges remigration (#18578) Co-authored-by: Korbinian Co-authored-by: Korbinian * feat(protocol): propose a batch blocks conditionally (#18570) Co-authored-by: YoGhurt111 * feat(taiko-client): make p2p-sync required (#18571) * fix: fix swaggo error * feat: go fmt * chore(main): release bridge-ui 2.13.0 (#18430) * build(deps): bump codecov/codecov-action from 4 to 5 (#18543) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(protocol): adjust the zk ratio(risc0 & sp1) (#18613) * feat(protocol): update `RollupAddressCache` with new `MainnetTierRouter` address (#18619) * chore(protocol): delete gas debug event (#18620) * chore(docs-site): update proof tier graphic (#18617) * build(deps): bump github.com/labstack/echo/v4 from 4.13.2 to 4.13.3 (#18623) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump github.com/pressly/goose/v3 from 3.23.0 to 3.24.0 (#18624) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump github.com/prysmaticlabs/prysm/v5 from 5.1.2 to 5.2.0 (#18625) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(taiko-client): improve `ProofBuffer` (#18627) * chore(main): release taiko-client 0.40.0 (#18436) * ci(protocol): make the storage layout table clearer (#18633) Co-authored-by: dantaik * feat(docs-site): add doc for SGX Verifier. (#18579) * chore(main): release docs-site 1.21.0 (#18592) * docs(protocol): update mainnet deployment docs (#18621) * chore(repo): fix broken links (#18635) * chore(repo): improve license (#18634) * docs(repo): fix links to LICENSE file (#18641) * chore(main): release protocol 1.11.0 (#18433) Co-authored-by: Daniel Wang <99078276+dantaik@users.noreply.github.com> * docs(protocol): update mainnet deployment docs (#18645) * feat(taiko-client): catch raiko deserialization errors (#18644) * feat(taiko-client): optimize aggregation loggingain (#18643) * test(taiko-client): cleanup pre-ontake tests (#18647) * feat(taiko-client): revert pr-18571 (#18648) * ci(taiko-client): release client as `"taiko-alethia-client"` (#18651) * ci(protocol): improve check-links (#18652) * fix(repo): improve link checking (#18653) * ci(repo): fix release-please (#18654) Co-authored-by: Daniel Wang <99078276+dantaik@users.noreply.github.com> * docs(repo): update `README` (#18650) Co-authored-by: dionysuz <13951458+dionysuzx@users.noreply.github.com> * feat: revert unncessary changes * feat(protocol): make `TaikoL2Deprecated` ABI go-ethereum compatible (#18659) Co-authored-by: Daniel Wang * feat(taiko-client): introduce `TaikoL2.GetBasefeeV2` (#18660) Co-authored-by: Gavin Yu * ci(protocol): revert releasing protocol 1.11.0 (#18662) * chore(main): release taiko-alethia-protocol 1.11.0 (#18663) * fix(taiko-client): fix `GetBasefeeV2` usage (#18664) * build(deps): bump github.com/labstack/echo-contrib from 0.17.1 to 0.17.2 (#18666) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump gorm.io/datatypes from 1.2.4 to 1.2.5 (#18665) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: David * feat(taiko-client): remove an unused package (#18668) * chore(taiko-client): improve `proofBuffer` logs (#18669) * chore(main): release taiko-alethia-client 0.41.0 (#18655) * ci(taiko-client): update docker image building configs (#18671) * chore(taiko-client): cleanup pre-ontake proposer code (#18672) * chore(main): release taiko-alethia-client 0.41.1 (#18673) * chore(taiko-client): optimize logging (#18674) * chore(taiko-client): cleanup pre-ontake prover code (#18677) * chore(taiko-client): remove some unused flags (#18678) * chore(docs-site): revert zk coverage docs (#18682) Co-authored-by: David * chore(repo): don't run docker build and push on forks (#18687) * feat(protocol): adjust zk(risc0 & sp1) ratio (#18684) * fix(protocol): add timestamp as a new parameter to getBasefeeV2 (#18686) Co-authored-by: Daniel Wang <99078276+dantaik@users.noreply.github.com> Co-authored-by: YoGhurt111 * fix(taiko-client): add #18442 back (#18685) * ci(protocol): revert "chore(main): release taiko-alethia-protocol 1.11.0 (#18663)" (#18688) * chore(taiko-client): fix typos in Swagger documentation for uptime endpoint (#18681) * fix(taiko-client): add timestamp as a new parameter to getBasefeeV2 (#18691) Co-authored-by: Daniel Wang <99078276+dantaik@users.noreply.github.com> * chore(guardian-prover-health-check): fix api doc (#18693) * fix(repo): fix some Go compiler errors (#18689) * chore(protocol): fix documentation (#18694) * feat(taiko-client): introduce `TxBuilderWithFallback` (#18690) * chore(relayer): fix docs (#18697) * chore(taiko-client): fix docs (#18698) * fix(repo): update versioning in version.go for client (#18700) * fix(taiko-client): fix proposing fee estimation (#18702) * chore(repo): workflows skip dependabot prs (#18701) * fix(taiko-client): fix blob transactions estimation when proposing (#18703) * fix(relayer): extra padding for contract messages, always pad non-contracts (#18699) * chore(main): release docs-site 1.21.1 (#18639) * test(taiko-client): add more fallback proposing tests (#18705) * chore(main): release taiko-alethia-protocol 1.11.0 (#18695) * build(deps): bump github.com/go-git/go-git/v5 from 5.12.0 to 5.13.1 (#18708) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(taiko-client): build blob transactions when gas estimation failed (#18712) * feat(taiko-client): remove an unused flag for proposer (#18709) * chore(taiko-client): add more metrics for `TxBuilderWithFallback` (#18711) * chore(taiko-client): more cost estimation metrics (#18713) * chore(docs-site): update codebase analysis to reflect protocol changes (#18714) * chore(taiko-client): add more proof generation metrics (#18715) * chore(taiko-client): improve prover logs (#18718) * chore(main): release taiko-alethia-client 0.42.0 (#18676) * chore(taiko-client): always use `blockID` instead of `height` for L2 blocks in logs (#18719) * chore(eventindexer): rm ei generator (#18723) * ci(repo): standardize workflow naming (#18726) * ci(repo): update pnpm installer (#18725) * chore(repo): update dependabot config (#18722) * build(deps): bump the github-actions-updates group with 2 updates (#18728) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(taiko-client): improve proposer gas estimation (#18727) * chore(main): release taiko-alethia-client 0.42.1 (#18720) * feat(taiko-client): soft block driver APIs (#18273) Co-authored-by: RogerLamTd Co-authored-by: Roger <50648015+RogerLamTd@users.noreply.github.com> Co-authored-by: github-actions[bot] Co-authored-by: Daniel Wang <99078276+dantaik@users.noreply.github.com> Co-authored-by: maskpp Co-authored-by: Jeffery Walsh * chore(main): release docs-site 1.21.2 (#18716) * chore(taiko-client): bump `taiko-geth` dep (#18730) * chore(taiko-client): add softBlock server start log (#18731) * fix(taiko-client): fix pages workflow (#18734) * fix(taiko-client): remove `finalizedBlock` info when P2P syncing (#18735) * fix(taiko-client): revert `tracker.triggered` related changes (#18737) * chore(taiko-client): improve `TxBuilderWithFallback` logs (#18738) * fix(taiko-client): check the `blockID` of the last verified block before using it as `FinalizedBlockHash` (#18739) * fixed protocol deployment for tests * Proposer tests fixed * Driver skipped test brought back * chain syncer skipped test brought back * skip pr title validate * refac: add protocol dockerfile and update deployment script * More error logs * binding regenerated * Potential fix for code scanning alert no. 5: Incorrect conversion between integer types Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * potential leak of sensitive information, copilot warning * missing import --------- Signed-off-by: dependabot[bot] Signed-off-by: RiceChuan Co-authored-by: David Co-authored-by: AlexWu Co-authored-by: Daniel Wang <99078276+dantaik@users.noreply.github.com> Co-authored-by: Roger <50648015+RogerLamTd@users.noreply.github.com> Co-authored-by: Gavin Yu Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: taiko-bot <160625009+taiko-kitty@users.noreply.github.com> Co-authored-by: maskpp Co-authored-by: smtmfft <99081233+smtmfft@users.noreply.github.com> Co-authored-by: dantaik Co-authored-by: Bernat Canal Garceran Co-authored-by: Ivan Lagunovsky Co-authored-by: jeff <113397187+cyberhorsey@users.noreply.github.com> Co-authored-by: Karim Co-authored-by: Karim <162329697+kimo-ice@users.noreply.github.com> Co-authored-by: YoGhurt111 Co-authored-by: Dmitry <98899785+mdqst@users.noreply.github.com> Co-authored-by: Noisy <125606576+donatik27@users.noreply.github.com> Co-authored-by: leopardracer <136604165+leopardracer@users.noreply.github.com> Co-authored-by: Donny <130464015+defitricks@users.noreply.github.com> Co-authored-by: Hopium <135053852+Hopium21@users.noreply.github.com> Co-authored-by: xiaodino Co-authored-by: Jeffery Walsh Co-authored-by: Korbinian Co-authored-by: bearni95 Co-authored-by: Jünger <98948000+0xjunger@users.noreply.github.com> Co-authored-by: RogerLamTd Co-authored-by: swarna1101 Co-authored-by: nmjustinchan Co-authored-by: DikaCream Co-authored-by: RiceChuan Co-authored-by: futreall <86553580+futreall@users.noreply.github.com> Co-authored-by: Tristav <124001124+Pricstas@users.noreply.github.com> Co-authored-by: Korbinian Co-authored-by: dionysuz <13951458+dionysuzx@users.noreply.github.com> Co-authored-by: Daniel Wang Co-authored-by: FT <140458077+zeevick10@users.noreply.github.com> Co-authored-by: github-actions[bot] Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .github/_typos.toml | 7 - .../install-pnpm-dependencies/action.yml | 28 +- .github/dependabot.yml | 43 +- .../Taiko Icon => .github}/taiko-icon-blk.svg | 0 .github/workflows/bridge-ui--ci.yml | 5 +- .github/workflows/bridge-ui.yml | 34 +- .github/workflows/docs-site--preview.yml | 14 +- .github/workflows/docs-site--production.yml | 5 +- .github/workflows/eventindexer.yml | 33 +- .github/workflows/fork-diff--preview.yml | 15 +- .github/workflows/fork-diff--production.yml | 5 +- .../guardian-prover-health-check-ui.yml | 34 +- .../guardian-prover-health-check.yml | 18 +- .github/workflows/monitors.yml | 40 + .github/workflows/nfts.yml | 18 +- .github/workflows/protocol.yml | 79 +- .github/workflows/relayer.yml | 31 +- .github/workflows/repo--auto-approve-pr.yml | 10 +- .github/workflows/repo--check-links.yml | 20 + .../workflows/repo--close-inactive-issues.yml | 23 - .github/workflows/repo--do-not-merge-pr.yml | 20 + .github/workflows/repo--merge-gatekeeper.yml | 21 + .github/workflows/repo--release-please.yml | 4 +- .github/workflows/repo--typo-check.yml | 9 +- .github/workflows/repo--validate-pr-title.yml | 11 +- .github/workflows/repo--vercel-deploy.yml | 10 +- .github/workflows/snaefell-ui--ci.yml | 5 +- .github/workflows/snaefell-ui.yml | 13 +- .github/workflows/supplementary-contracts.yml | 13 +- .github/workflows/taiko-client--docker.yml | 128 +- .github/workflows/taiko-client--hive-test.yml | 44 + .github/workflows/taiko-client--pages.yml | 63 + .github/workflows/taiko-client--test.yml | 40 +- .github/workflows/taikoon-ui--ci.yml | 5 +- .github/workflows/taikoon-ui.yml | 10 +- .github/workflows/ui-lib--ci.yml | 5 +- .gitignore | 1 - .release-please-manifest.json | 20 +- CONTRIBUTING.md | 2 +- Dockerfile | 4 +- LICENSE | 21 + LICENSE.md | 9 - README.md | 67 +- _typos.toml | 15 +- go.mod | 291 +- go.sum | 1454 +- lefthook.yml | 36 +- lychee.toml | 2 + .../balance-monitor/balance_monitor.go | 85 +- .../balance-monitor/prometheus.go | 12 +- packages/balance-monitor/cmd/main.go | 2 +- packages/branding/CHANGELOG.md | 41 - .../Taiko Icon/taiko-icon-mono-2x.png | Bin 14501 -> 0 bytes .../Taiko Icon/taiko-icon-mono.png | Bin 6012 -> 0 bytes .../Taiko Icon/taiko-icon-wht-2x.png | Bin 15441 -> 0 bytes .../Taiko Icon/taiko-icon-wht.png | Bin 6610 -> 0 bytes .../Taiko Icon/taiko-icon-wht_background.png | Bin 7654 -> 0 bytes .../Taiko Logos/taiko-h-blk.png | Bin 35028 -> 0 bytes .../Taiko Logos/taiko-h-mono.png | Bin 31563 -> 0 bytes .../Taiko Logos/taiko-h-wht.png | Bin 34550 -> 0 bytes .../Taiko Logos/taiko-h-wht_background.png | Bin 18281 -> 0 bytes .../Taiko Logos/taiko-v-blk.png | Bin 32118 -> 0 bytes .../Taiko Logos/taiko-v-mono.png | Bin 30009 -> 0 bytes .../Taiko Logos/taiko-v-wht-background.png | Bin 16912 -> 0 bytes .../Taiko Logos/taiko-v-wht.png | Bin 31636 -> 0 bytes packages/branding/README.md | 17 - .../Taiko Icon/taiko-icon-mono.svg | 3 - .../Taiko Logos/taiko-h-blk.svg | 8 - .../Taiko Logos/taiko-h-mono.svg | 8 - .../Taiko Logos/taiko-h-wht.svg | 8 - .../Taiko Logos/taiko-v-blk.svg | 8 - .../Taiko Logos/taiko-v-mono.svg | 8 - .../Taiko Logos/taiko-v-wht.svg | 8 - packages/branding/package.json | 5 - packages/branding/taiko-icon-wht-200x200.png | Bin 11958 -> 0 bytes .../branding/testnet-token-images/bull.svg | 6 - .../branding/testnet-token-images/horse.svg | 5 - .../branding/testnet-token-images/ttko.svg | 10 - packages/bridge-ui/CHANGELOG.md | 63 + packages/bridge-ui/package.json | 4 +- packages/bridge-ui/src/app.config.ts | 6 +- .../ImportStep/ImportStep.svelte | 3 +- .../ImportStep/TokenInput/TokenInput.svelte | 24 +- .../ReviewStep/ReviewStep.svelte | 29 +- .../StepNavigation/StepNavigation.svelte | 4 +- .../src/components/Bridge/NFTBridge.svelte | 2 + .../IDInput/IDInput.svelte | 3 +- .../ImportStep/TokenAmountInput.svelte | 3 +- .../StepNavigation/StepNavigation.svelte | 4 +- .../SharedBridgeComponents/Actions.svelte | 71 +- .../AddressInput/AddressInput.svelte | 16 +- .../ConfirmationStep/ConfirmationStep.svelte | 24 +- .../ProcessingFee/ProcessingFee.svelte | 19 +- .../ProcessingFee/RecommendedFee.svelte | 7 +- .../RecipientStep/DestOwner.svelte | 178 + .../RecipientStep/Recipient.svelte | 83 +- .../RecipientStep/RecipientStep.svelte | 4 + .../bridge-ui/src/components/Bridge/state.ts | 3 + .../ChainSelectors/ChainPill/ChainPill.svelte | 7 +- .../SelectorDialogs/ChainsDialog.svelte | 3 +- .../ConnectButton/ConnectButton.svelte | 13 +- .../src/components/Dialogs/Claim.svelte | 6 +- .../Dialogs/ClaimDialog/ClaimDialog.svelte | 18 +- .../ReleaseDialog/ReleaseDialog.svelte | 3 +- .../Dialogs/RetryDialog/RetryDialog.svelte | 5 +- .../Dialogs/Shared/ClaimConfirmStep.svelte | 16 +- .../Dialogs/Shared/ClaimPreCheck.svelte | 140 +- .../Dialogs/Shared/ReviewStep.svelte | 2 +- .../ExplorerLink/ExplorerLink.svelte | 16 +- .../src/components/Header/Header.svelte | 52 +- .../bridge-ui/src/components/Icon/Icon.svelte | 12 + .../src/components/NFTs/NFTInfoDialog.svelte | 3 +- .../NotificationToast.svelte | 3 +- .../src/components/Paginator/Paginator.svelte | 16 +- .../src/components/Relayer/Relayer.svelte | 120 + .../bridge-ui/src/components/Relayer/index.ts | 1 + .../SideNavigation/SideNavigation.svelte | 54 +- .../src/components/StatusDot/StatusDot.svelte | 3 +- .../TokenDropdown/AddCustomERC20.svelte | 3 +- .../TokenDropdown/TokenDropdown.svelte | 3 +- .../src/components/Tooltip/Tooltip.svelte | 3 +- .../Transactions/ChainSymbol.svelte | 11 + .../Dialogs/DesktopDetailsDialog.svelte | 325 + .../Dialogs/MobileDetailsDialog.svelte | 340 + .../components/Transactions/Dialogs/index.ts | 2 + .../Filter/StatusFilterDialog.svelte | 4 +- .../Filter/StatusFilterDropdown.svelte | 13 +- .../Transactions/InsufficientFunds.svelte | 3 +- .../Transactions/MobileDetailsDialog.svelte | 218 - .../Rows/FungibleTransactionRow.svelte | 241 + .../Rows/NftTransactionRow.svelte | 289 + .../src/components/Transactions/Rows/index.ts | 2 + .../Transactions/Status/Status.svelte | 60 +- .../Status/StatusInfoDialog.svelte | 3 +- .../Transactions/Transaction.svelte | 289 - .../Transactions/Transactions.svelte | 119 +- packages/bridge-ui/src/i18n/en.json | 67 +- packages/bridge-ui/src/libs/bridge/Bridge.ts | 74 +- .../src/libs/bridge/ERC1155Bridge.ts | 4 +- .../bridge-ui/src/libs/bridge/ERC20Bridge.ts | 54 +- .../bridge-ui/src/libs/bridge/ERC721Bridge.ts | 4 +- .../bridge-ui/src/libs/bridge/ETHBridge.ts | 4 +- .../src/libs/bridge/fetchTransactions.ts | 16 +- packages/bridge-ui/src/libs/bridge/types.ts | 8 +- .../src/libs/fee/recommendProcessingFee.ts | 37 +- .../libs/fee/recommendedProcessingFee.test.ts | 155 + .../src/libs/polling/messageStatusPoller.ts | 48 +- .../src/libs/proof/BridgeProver.test.ts | 15 +- .../bridge-ui/src/libs/proof/BridgeProver.ts | 34 +- .../libs/relayer/RelayerAPIService.test.ts | 59 +- .../src/libs/relayer/RelayerAPIService.ts | 68 +- packages/bridge-ui/src/libs/relayer/types.ts | 9 +- .../src/libs/storage/BridgeTxService.ts | 36 +- .../src/libs/token/getTokenApprovalStatus.ts | 16 + .../src/libs/util/formatTimestamp.ts | 11 + .../src/libs/util/getBlockFromTxHash.ts | 23 + .../src/libs/util/getBlockTimestamp.ts | 13 + ...Wallet.test.ts => isSmartContract.test.ts} | 10 +- ...rtContractWallet.ts => isSmartContract.ts} | 6 +- .../src/libs/util/mergeTransactions.test.ts | 22 +- .../src/libs/util/mergeTransactions.ts | 4 +- .../src/libs/util/responsiveCheck.ts | 49 + .../bridge-ui/src/libs/util/shortenAddress.ts | 2 +- .../bridge-ui/src/libs/util/truncateString.ts | 1 + packages/bridge-ui/src/libs/util/uid.test.ts | 14 - packages/bridge-ui/src/libs/util/uid.ts | 3 - packages/bridge-ui/src/libs/wagmi/watcher.ts | 8 +- packages/bridge-ui/src/routes/+layout.svelte | 40 +- .../bridge-ui/src/routes/relayer/+page.svelte | 11 + .../src/routes/transactions/+page.svelte | 2 +- packages/bridge-ui/src/styles/override.css | 10 + .../bridge-ui/src/tests/mocks/transactions.ts | 4 +- packages/bridge-ui/static/coins/crvUSD.png | Bin 0 -> 269529 bytes packages/bridge-ui/static/coins/curve.png | Bin 0 -> 39786 bytes packages/bridge-ui/static/coins/dai.webp | Bin 0 -> 486 bytes packages/bridge-ui/static/coins/scrvUSD.png | Bin 0 -> 49422 bytes packages/bridge-ui/tailwind.config.js | 6 + packages/docs-site/CHANGELOG.md | 286 + packages/docs-site/astro.config.ts | 69 +- packages/docs-site/package.json | 8 +- .../bridging-process-message.excalidraw.png | Bin 161234 -> 0 bytes .../bridging-send-message.excalidraw.png | Bin 146508 -> 0 bytes .../docs/core-concepts/contestable.png | Bin 0 -> 866650 bytes .../docs/core-concepts/proof-tiers.png | Bin 0 -> 165241 bytes .../content/docs/guides/verify-as-proxy.webp | Bin 0 -> 267130 bytes .../proof-tier-config-hekla.webp | Bin 0 -> 331187 bytes .../proof-tier-config-mn.webp | Bin 149029 -> 277469 bytes .../network-reference/proof-tier-config.webp | Bin 150073 -> 0 bytes .../docs/taiko-protocol/based-economics.png | Bin 0 -> 214929 bytes .../taiko-protocol/bridging-dest-chain.webp | Bin 0 -> 285673 bytes .../taiko-protocol/bridging-source-chain.webp | Bin 0 -> 252729 bytes .../proposed.png | Bin .../proved.png | Bin .../taiko-nodes.png | Bin .../verified.png | Bin packages/docs-site/src/content/config.ts | 3 + .../{based-sequencing.md => based-rollup.md} | 6 +- .../docs/core-concepts/contestable-rollup.md | 27 + .../docs/core-concepts/contestable-rollups.md | 8 - .../docs/core-concepts/inception-layers.md | 2 +- .../docs/core-concepts/multi-proofs.md | 10 +- .../docs/core-concepts/what-is-taiko.md | 6 +- .../node-operators/deploy-a-proverset.mdx | 185 + .../node-operators/enable-a-proposer.mdx | 32 +- .../guides/node-operators/enable-a-prover.mdx | 71 +- .../node-operators/node-troubleshooting.mdx | 95 +- .../run-a-mainnet-taiko-node-from-source.mdx | 4 +- .../run-a-taiko-node-with-docker.mdx | 2 +- .../run-a-testnet-taiko-node-from-source.mdx | 2 +- .../differences-from-ethereum.md | 10 +- .../network-reference/mainnet-addresses.md | 15 +- .../network-configuration.md | 24 - .../network-configuration.mdx | 47 + ...configuration.md => rpc-configuration.mdx} | 7 + .../software-releases-and-deployments.md | 26 + .../network-reference/testnet-addresses.md | 14 +- .../docs/resources/developer-tools.mdx | 44 +- .../content/docs/resources/terminology.mdx | 22 + .../content/docs/start-here/contributing.md | 2 +- .../block-states.mdx | 20 +- .../bridging.md | 46 +- .../codebase-analysis/sgxverifier-contract.md | 108 + .../codebase-analysis/taikol1-contract.md | 143 + .../codebase-analysis/taikol2-contract.md | 116 + .../content/docs/taiko-protocol/economics.md | 15 + .../taiko-nodes.md | 6 +- packages/eventindexer/.gitignore | 9 +- packages/eventindexer/.golangci.yml | 3 +- packages/eventindexer/.l2.env | 8 +- packages/eventindexer/.swaggo | 3 + .../AssignmentHook.json} | 679 +- .../TaikoL1.json => eventindexer/Bridge.json} | 2025 +- packages/eventindexer/ProverPool.json | 0 packages/eventindexer/README.md | 1 - packages/eventindexer/SgxVerifier.json | 968 - packages/eventindexer/Swap.json | 1032 - packages/eventindexer/TaikoL1.json | 2088 -- packages/eventindexer/TaikoToken.json | 1084 - packages/eventindexer/api/api.go | 30 +- packages/eventindexer/api/config.go | 17 +- packages/eventindexer/cmd/flags/common.go | 7 +- packages/eventindexer/cmd/flags/generator.go | 24 - packages/eventindexer/cmd/flags/indexer.go | 24 +- packages/eventindexer/cmd/main.go | 8 - .../assignmenthook/AssignmentHook.go | 2202 -- .../eventindexer/contracts/bridge/Bridge.go | 91 +- packages/eventindexer/contracts/erc721/abi.go | 39 + .../contracts/sgxverifier/SgxVerifier.go | 61 +- .../eventindexer/contracts/taikol1/TaikoL1.go | 1825 +- .../contracts/taikotoken/TaikoToken.go | 29 +- packages/eventindexer/db.go | 25 - packages/eventindexer/docs/docs.go | 172 +- packages/eventindexer/docs/swagger.json | 160 +- packages/eventindexer/docs/swagger.yaml | 114 +- packages/eventindexer/erc20_balance.go | 57 + packages/eventindexer/errors.go | 1 + packages/eventindexer/event.go | 5 +- packages/eventindexer/generator/config.go | 75 - .../eventindexer/generator/config_test.go | 58 - packages/eventindexer/generator/generator.go | 652 - packages/eventindexer/indexer/config.go | 24 +- packages/eventindexer/indexer/config_test.go | 3 - packages/eventindexer/indexer/filter.go | 130 +- .../indexer/index_erc20_transfers.go | 263 + .../indexer/index_nft_transfers.go | 34 +- .../indexer/index_raw_block_data.go | 75 +- packages/eventindexer/indexer/indexer.go | 62 +- .../indexer/save_block_assigned_event.go | 82 - .../indexer/save_block_proposed_event.go | 125 +- .../indexer/save_block_verified_event.go | 98 +- .../indexer/save_message_sent_event.go | 26 +- .../save_transition_contested_event.go | 69 + .../indexer/save_transition_proved_event.go | 101 +- .../set_initial_processing_block_height.go | 5 +- ...0906208840_create_erc20_metadata_table.sql | 18 + ...0906208841_create_erc20_balances_table.sql | 19 + ...alter_erc20_balances_table_add_indexes.sql | 10 + ...alter_erc20_metadata_table_add_indexes.sql | 10 + ..._events_table_add_block_id_event_index.sql | 10 + ...852_alter_erc20_balances_addtl_indexes.sql | 10 + packages/eventindexer/pkg/db/db.go | 39 +- packages/eventindexer/pkg/flags/config.go | 3 +- .../pkg/http/get_block_proposed_by.go | 36 + .../pkg/http/get_block_proven_by.go | 48 + .../pkg/http/get_by_address_and_event_test.go | 2 +- .../get_count_by_address_and_event_test.go | 2 +- ..._erc20_balances_by_address_and_chain_id.go | 46 + .../pkg/http/get_unique_proposers_test.go | 2 +- .../pkg/http/get_unique_provers_test.go | 2 +- packages/eventindexer/pkg/http/routes.go | 3 + packages/eventindexer/pkg/http/server.go | 41 +- packages/eventindexer/pkg/http/server_test.go | 35 +- .../pkg/mock/erc20_balance_repository.go | 61 + .../eventindexer/pkg/mock/event_repository.go | 25 +- packages/eventindexer/pkg/repo/account.go | 13 +- .../eventindexer/pkg/repo/account_test.go | 6 +- packages/eventindexer/pkg/repo/chart.go | 21 +- packages/eventindexer/pkg/repo/chart_test.go | 10 +- .../eventindexer/pkg/repo/containers_test.go | 15 +- .../eventindexer/pkg/repo/erc20_balance.go | 234 + .../pkg/repo/erc20_balance_test.go | 165 + packages/eventindexer/pkg/repo/event.go | 67 +- packages/eventindexer/pkg/repo/interface.go | 1 + packages/eventindexer/pkg/repo/nft_balance.go | 55 +- .../eventindexer/pkg/repo/nft_balance_test.go | 7 +- packages/eventindexer/pkg/repo/transaction.go | 12 +- .../eventindexer/pkg/repo/transaction_test.go | 8 +- packages/eventindexer/pkg/tasks/tasks.go | 51 - packages/eventindexer/{ => scripts}/abigen.sh | 10 +- packages/eventindexer/scripts/swagger.sh | 2 +- packages/fork-diff/CHANGELOG.md | 7 + packages/fork-diff/README.md | 2 +- packages/fork-diff/package.json | 2 +- packages/fork-diff/version_config.json | 2 +- packages/geth-rpc-gateway/.gitignore | 1 + packages/geth-rpc-gateway/README.md | 73 + packages/geth-rpc-gateway/main.go | 314 + .../CHANGELOG.md | 25 + .../package.json | 4 +- .../src/lib/dataFetcher.ts | 3 + .../static/config/hekla/guardians.json | 4 +- .../static/config/mainnet/guardians.json | 3 +- .../guardian-prover-health-check/.default.env | 2 +- .../guardian-prover-health-check/.gitignore | 5 +- .../guardian-prover-health-check/README.md | 1 - packages/guardian-prover-health-check/db.go | 28 - .../guardian-prover-health-check/db/db.go | 37 +- .../healthcheck.go | 2 +- .../healthchecker/config.go | 17 +- .../healthchecker/config_test.go | 3 +- .../healthchecker/healthchecker.go | 12 +- ..._checks_by_guardian_prover_address_test.go | 4 +- .../http/get_health_checks_test.go | 4 +- ...signed_block_by_guardian_prover_address.go | 1 + ...d_block_by_guardian_prover_address_test.go | 17 +- ...startup_by_guardian_prover_address_test.go | 3 +- .../http/get_signed_blocks.go | 1 + ...tartups_by_guardian_prover_address_test.go | 3 +- .../get_uptime_by_guardian_prover_address.go | 4 +- .../http/post_health_check.go | 3 +- .../http/post_signed_block.go | 16 +- .../http/post_startup.go | 3 +- .../http/server.go | 2 +- .../guardian-prover-health-check/mock/db.go | 2 + .../mock/health_check_repo.go | 2 +- .../mock/signed_block_repo.go | 5 +- .../mock/startup_repo.go | 2 +- .../repo/containers_test.go | 2 +- .../guardian-prover-health-check/repo/db.go | 17 - .../repo/healthcheck.go | 34 +- .../repo/healthcheck_test.go | 15 +- .../repo/signed_block.go | 34 +- .../repo/signed_block_test.go | 12 +- .../repo/startup.go | 26 +- .../repo/startup_test.go | 15 +- .../scripts/abigen.sh | 8 +- .../scripts/swagger.sh | 4 +- .../signed_block.go | 7 +- .../guardian-prover-health-check/startup.go | 2 +- packages/monitors/.gitignore | 1 + packages/monitors/README.md | 3 + .../.defender/deployment-log.mystack.json | 9 + .../monitors/defender/mainnet/.env.example | 2 + packages/monitors/defender/mainnet/README.md | 236 + .../actions/Bridge-MessageProcessed/index.js | 312 + .../ER20Vault-BridgedTokenChanged/index.js | 210 + .../actions/ERC20Vault-BalanceDrop/index.js | 210 + .../GuardianProver-ApprovedCount/index.js | 140 + .../GuardianProver-ConflictingProofs/index.js | 150 + .../GuardianProver-GuardiansUpdated/index.js | 132 + .../index.js | 127 + .../SGXVerifier-verifyProofFailure/index.js | 107 + .../actions/TaikoL1-BlockProposed/index.js | 373 + .../actions/TaikoL1-BlockVerified/index.js | 187 + .../TaikoL1-CalldataTxListCount/index.js | 138 + .../actions/TaikoL1-ProvingPaused/index.js | 120 + .../TaikoL1-TransitionContestedCount/index.js | 237 + .../actions/TaikoL1-TransitionProved/index.js | 223 + .../Vaults-BridgedTokenDeployed/index.js | 332 + .../monitors/defender/mainnet/serverless.yml | 912 + packages/monitors/package.json | 16 + packages/nfts/README.md | 4 +- packages/nfts/contract_layout.md | 56 + .../contracts/eventRegister/EventRegister.sol | 282 + .../contracts/galxe/RegisterGalxePoints.sol | 14 + .../party-ticket/TaikoPartyTicket.sol | 298 + .../party-ticket/TaikoPartyTicketV2.sol | 51 + .../profile/RegisterProfilePicture.sol | 97 + .../nfts/contracts/snaefell/SnaefellToken.sol | 13 + .../nfts/contracts/taikoon/TaikoonToken.sol | 15 + .../trailblazers-airdrop/ERC20Airdrop.sol | 107 + .../trailblazers-airdrop/MerkleClaimable.sol | 147 + .../trailblazers-badges/ECDSAWhitelist.sol | 149 + .../TrailblazersBadges.sol | 224 + .../TrailblazersBadgesV3.sol | 24 + .../BadgeRecruitment.sol | 745 + .../BadgeRecruitmentV2.sol | 141 + .../TrailblazersBadgesS2.sol | 211 + .../TrailblazersS1BadgesV4.sol | 70 + .../TrailblazersS1BadgesV5.sol | 66 + .../party-token/metadata/golden-winner.json | 5 + .../nfts/data/party-token/metadata/loser.json | 5 + .../data/party-token/metadata/raffle.json | 5 + .../data/party-token/metadata/winner.json | 6 + .../data/party-token/static/golden-winner.png | Bin 0 -> 356870 bytes .../nfts/data/party-token/static/loser.png | Bin 0 -> 267461 bytes .../nfts/data/party-token/static/raffle.png | Bin 0 -> 169317 bytes .../nfts/data/party-token/static/winner.gif | Bin 0 -> 1353312 bytes .../nfts/deployments/eventRegister/hekla.json | 3 + .../deployments/eventRegister/mainnet.json | 3 + .../deployments/gen-layouts.sh | 29 +- .../nfts/deployments/party-ticket/hekla.json | 3 + .../deployments/party-ticket/mainnet.json | 3 + packages/nfts/deployments/profile/hekla.json | 3 + .../nfts/deployments/profile/mainnet.json | 3 + packages/nfts/deployments/taikoon/hekla.json | 5 + .../nfts/deployments/taikoon/localhost.json | 2 +- .../trailblazers-airdrop/hekla.json | 5 + .../trailblazers-airdrop/mainnet.json | 5 + .../trailblazers-badges/hekla.json | 5 + .../trailblazers-badges/localhost.json | 5 + .../trailblazers-badges/mainnet.json | 5 + .../trailblazers-season-2/hekla.json | 6 + .../trailblazers-season-2/mainnet.json | 6 + packages/nfts/foundry.toml | 6 +- packages/nfts/package.json | 47 +- .../nfts/script/party-ticket/sol/Deploy.s.sol | 67 + .../script/party-ticket/sol/UpgradeV2.s.sol | 54 + .../nfts/script/party-ticket/sol/Utils.s.sol | 77 + packages/nfts/script/profile/Deploy.s.sol | 44 + packages/nfts/script/profile/Utils.s.sol | 61 + .../nfts/script/snaefell/sol/Deploy.s.sol | 17 +- packages/nfts/script/taikoon/js/4everland.js | 2 +- packages/nfts/script/taikoon/sol/Deploy.s.sol | 18 +- .../nfts/script/taikoon/sol/UpgradeV2.sol | 46 + packages/nfts/script/taikoon/sol/Utils.s.sol | 3 + .../trailblazer/eventRegister/Deploy.s.sol | 25 + .../script/trailblazer/galxe/Deploy.s.sol | 25 + .../trailblazers-badges/Deploy.s.sol | 83 + .../trailblazers-badges/UpgradeS1.sol | 41 + .../trailblazers-badges/UpgradeV3.s.sol | 44 + .../trailblazers-badges/UpgradeV3.sol | 44 + .../trailblazers-badges/UpgradeV4.s.sol | 52 + .../trailblazers-badges/Utils.s.sol | 80 + .../script/trailblazers-airdrop/Deploy.s.sol | 93 + .../script/trailblazers-airdrop/Utils.s.sol | 78 + .../script/trailblazers-season-2/Deploy.s.sol | 163 + .../RecruitmentUpgradeV2.s.sol | 163 + .../trailblazers-season-2/UpgradeV2.s.sol | 50 + .../script/trailblazers-season-2/Utils.s.sol | 86 + .../test/party-ticket/TaikoPartyTicket.t.sol | 285 + .../party-ticket/TaikoPartyTicketV2.t.sol | 197 + .../test/profile/RegisterProfilePicture.t.sol | 266 + packages/nfts/test/taikoon/Upgradeable.t.sol | 61 +- .../eventRegister/EventRegister.t.sol | 269 + .../galxe/RegisterGalxePoints.t.sol | 40 + .../TrailblazersBadges.t.sol | 386 + .../TrailblazersBadgesV3.t.sol | 88 + .../trailblazers-airdrop/ERC20Airdrop.t.sol | 151 + .../BadgeRecruitment.t.sol | 493 + .../BadgeRecruitmentV2.t.sol | 349 + .../TrailblazersBadgesS2.t.sol | 111 + packages/nfts/test/util/Blacklist.sol | 4 + packages/nfts/test/util/MockTokens.sol | 68 + .../test/util/TrailblazerBadgesS1MintTo.sol | 24 + packages/protocol/.env.example | 2 +- packages/protocol/.eslintignore | 4 +- packages/protocol/.gitignore | 15 + packages/protocol/.solhint.json | 4 +- packages/protocol/.solhintignore | 9 +- packages/protocol/CHANGELOG.md | 592 + packages/protocol/README.md | 162 +- .../code4rena-2024-03-taiko-final-report.md | 6 +- ...eppelin_taiko_protocol_audit_june_2024.pdf | Bin 0 -> 610624 bytes ...iko_protocol_ontake_audit_nov_2024.pdf.pdf | Bin 0 -> 165663 bytes packages/protocol/contract_layout.md | 533 - packages/protocol/contract_layout_layer1.md | 1828 ++ packages/protocol/contract_layout_layer2.md | 825 + packages/protocol/contracts/L1/ITaikoL1.sol | 40 - packages/protocol/contracts/L1/TaikoData.sol | 173 - .../protocol/contracts/L1/TaikoErrors.sol | 39 - .../protocol/contracts/L1/TaikoEvents.sol | 79 - packages/protocol/contracts/L1/TaikoL1.sol | 248 - .../contracts/L1/hooks/AssignmentHook.sol | 194 - .../protocol/contracts/L1/hooks/IHook.sol | 20 - .../contracts/L1/libs/LibProposing.sol | 233 - .../protocol/contracts/L1/libs/LibProving.sol | 468 - .../protocol/contracts/L1/libs/LibUtils.sol | 126 - .../contracts/L1/libs/LibVerifying.sol | 262 - .../contracts/L1/tiers/TierProviderBase.sol | 75 - .../contracts/L1/tiers/TierProviderV2.sol | 21 - .../contracts/L1/tiers/TierProviderV3.sol | 24 - .../contracts/L1/tiers/TierRouter.sol | 14 - .../protocol/contracts/L2/DelegateOwner.sol | 118 - .../protocol/contracts/L2/Lib1559Math.sol | 76 - packages/protocol/contracts/L2/TaikoL2.sol | 263 - .../contracts/automata-attestation/README.md | 4 - .../contracts/compiled/FiatTokenProxy.json | 552 - .../contracts/compiled/FiatTokenV2_1.json | 3852 ---- .../protocol/contracts/compiled/README.md | 24 - .../AutomataDcapV3Attestation.sol | 33 +- .../layer1/automata-attestation/README.md | 4 + .../interfaces/IAttestation.sol | 4 +- .../interfaces/ISigVerifyLib.sol | 2 +- .../lib/EnclaveIdStruct.sol | 2 +- .../lib/PEMCertChainLib.sol | 12 +- .../lib/QuoteV3Auth/V3Parser.sol | 10 +- .../lib/QuoteV3Auth/V3Struct.sol | 2 +- .../lib/TCBInfoStruct.sol | 2 +- .../lib/interfaces/IPEMCertChainLib.sol | 2 +- .../automata-attestation/utils/Asn1Decode.sol | 2 +- .../automata-attestation/utils/BytesUtils.sol | 2 +- .../automata-attestation/utils/SHA1.sol | 2 +- .../utils/SigVerifyLib.sol | 2 +- .../utils/X509DateUtils.sol | 2 +- .../contracts/layer1/based/ITaikoL1.sol | 97 + .../contracts/layer1/based/LibBonds.sol | 164 + .../contracts/layer1/based/LibData.sol | 49 + .../contracts/layer1/based/LibProposing.sol | 312 + .../contracts/layer1/based/LibProving.sol | 575 + .../contracts/layer1/based/LibUtils.sol | 285 + .../contracts/layer1/based/LibVerifying.sol | 198 + .../contracts/layer1/based/TaikoData.sol | 215 + .../contracts/layer1/based/TaikoEvents.sol | 154 + .../contracts/layer1/based/TaikoL1.sol | 325 + .../contracts/layer1/devnet/DevnetTaikoL1.sol | 31 + .../devnet/DevnetTierRouter.sol} | 14 +- .../contracts/layer1/fork/ForkManager.sol | 70 + .../contracts/layer1/hekla/HeklaTaikoL1.sol | 33 + .../layer1/hekla/HeklaTaikoToken.sol | 163 + .../layer1/hekla/HeklaTierRouter.sol | 45 + .../contracts/layer1/mainnet/README.md | 5 + .../layer1/mainnet/addrcache/AddressCache.sol | 43 + .../mainnet/addrcache/RollupAddressCache.sol | 62 + .../mainnet/addrcache/SharedAddressCache.sol | 71 + .../mainnet/multirollup/MainnetBridge.sol | 53 + .../multirollup/MainnetERC1155Vault.sol | 26 + .../mainnet/multirollup/MainnetERC20Vault.sol | 26 + .../multirollup/MainnetERC721Vault.sol | 26 + .../MainnetSharedAddressManager.sol | 26 + .../multirollup/MainnetSignalService.sol | 26 + .../reentrylock/LibFasterReentryLock.sol | 26 + .../mainnet/rollup/MainnetGuardianProver.sol | 25 + .../mainnet/rollup/MainnetProverSet.sol | 26 + .../rollup/MainnetRollupAddressManager.sol | 26 + .../layer1/mainnet/rollup/MainnetTaikoL1.sol | 53 + .../mainnet/rollup/MainnetTierRouter.sol | 44 + .../rollup/verifiers/MainnetRisc0Verifier.sol | 25 + .../rollup/verifiers/MainnetSP1Verifier.sol | 29 + .../rollup/verifiers/MainnetSgxVerifier.sol | 25 + .../verifiers/MainnetTeeAnyVerifier.sol | 24 + .../verifiers/MainnetZkAndTeeVerifier.sol | 24 + .../rollup/verifiers/MainnetZkAnyVerifier.sol | 24 + .../contracts/layer1/preconf/README.md | 3 + .../preconf/avs-mvp/PreconfServiceManager.sol | 88 + .../preconf/avs-mvp/iface/IAVSDirectory.sol | 38 + .../avs-mvp/iface/IDelegationManager.sol | 22 + .../layer1/preconf/avs-mvp/iface/ISlasher.sol | 18 + .../avs-mvp/iface/IStrategyManager.sol | 18 + .../preconf/avs-mvp/impl/AVSDirectory.sol | 48 + .../avs-mvp/impl/DelegationManager.sol | 55 + .../layer1/preconf/avs-mvp/impl/Slasher.sol | 31 + .../preconf/avs-mvp/impl/StrategyManager.sol | 39 + .../eigenlayer/PreconfServiceManager.sol | 10 + .../layer1/preconf/iface/IPreconfRegistry.sol | 91 + .../preconf/iface/IPreconfServiceManager.sol | 25 + .../preconf/iface/IPreconfTaskManager.sol | 127 + .../preconf/impl/LibPreconfConstants.sol | 12 + .../layer1/preconf/impl/PreconfRegistry.sol | 246 + .../preconf/impl/PreconfTaskManager.sol | 637 + .../layer1/preconf/libs/LibBLS12381.sol | 468 + .../layer1/preconf/libs/LibBLSSignature.sol | 38 + .../layer1/preconf/libs/LibEIP4788.sol | 98 + .../layer1/preconf/libs/LibMerkleUtils.sol | 80 + .../preconf/mock/MockPreconfRegistry.sol | 245 + .../layer1/preconf/mock/MockTaikoToken.sol | 13 + .../{L1 => layer1}/provers/GuardianProver.sol | 239 +- .../contracts/layer1/provers/ProverSet.sol | 185 + .../team/airdrop/ERC20Airdrop.sol | 2 +- .../team/airdrop/MerkleClaimable.sol | 4 +- .../team/tokenunlock/TokenUnlock.sol | 46 +- .../{L1 => layer1}/tiers/ITierProvider.sol | 25 +- .../{L1 => layer1}/tiers/ITierRouter.sol | 2 +- .../contracts/layer1/tiers/LibTiers.sol | 31 + .../layer1/tiers/TierProviderBase.sol | 96 + .../{tko => layer1/token}/TaikoToken.sol | 27 +- .../{ => layer1}/verifiers/IVerifier.sol | 24 +- .../verifiers}/LibPublicInput.sol | 4 +- .../layer1/verifiers/Risc0Verifier.sol | 127 + .../layer1/verifiers/SP1Verifier.sol | 129 + .../layer1/verifiers/SgxVerifier.sol | 265 + .../verifiers/SgxVerifierBase.sol} | 109 +- .../verifiers/compose/ComposeVerifier.sol | 123 + .../verifiers/compose/TeeAnyVerifier.sol | 30 + .../verifiers/compose/ZkAndTeeVerifier.sol | 24 + .../verifiers/compose/ZkAnyVerifier.sol | 30 + .../contracts/layer2/DelegateOwner.sol | 152 + .../contracts/layer2/based/IBlockHash.sol | 11 + .../contracts/layer2/based/LibEIP1559.sol | 123 + .../{L2 => layer2/based}/LibL2Config.sol | 3 +- .../contracts/layer2/based/TaikoL2.sol | 341 + .../layer2/based/TaikoL2Deprecated.sol | 60 + .../contracts/layer2/devnet/DevnetTaikoL2.sol | 12 + .../contracts/layer2/hekla/HeklaTaikoL2.sol | 12 + .../layer2/mainnet/MainnetTaikoL2.sol | 12 + .../token}/BridgedTaikoToken.sol | 14 +- .../mainnet/L1RollupAddressManager.sol | 57 - .../mainnet/L1SharedAddressManager.sol | 68 - .../contracts/{ => shared}/bridge/Bridge.sol | 212 +- .../contracts/{ => shared}/bridge/IBridge.sol | 2 +- .../{ => shared}/bridge/IQuotaManager.sol | 2 +- .../{ => shared}/bridge/QuotaManager.sol | 10 +- .../contracts/{ => shared}/bridge/README.md | 0 .../{ => shared}/common/AddressManager.sol | 18 +- .../{ => shared}/common/AddressResolver.sol | 55 +- .../{ => shared}/common/EssentialContract.sol | 63 +- .../{ => shared}/common/IAddressManager.sol | 2 +- .../{ => shared}/common/IAddressResolver.sol | 12 +- .../{libs => shared/common}/LibAddress.sol | 20 +- .../{libs => shared/common}/LibBytes.sol | 4 +- .../{libs => shared/common}/LibMath.sol | 6 +- .../{libs => shared/common}/LibNetwork.sol | 33 +- .../{ => shared}/common/LibStrings.sol | 15 +- .../{libs => shared/common}/LibTrieProof.sol | 12 +- .../contracts/shared/data/LibSharedData.sol | 13 + .../{ => shared}/signal/ISignalService.sol | 14 +- .../{ => shared}/signal/SignalService.sol | 29 +- .../{tko => shared/token}/TaikoTokenBase.sol | 2 +- .../{ => shared}/tokenvault/BaseNFTVault.sol | 2 +- .../{ => shared}/tokenvault/BaseVault.sol | 4 +- .../tokenvault/BridgedERC1155.sol | 6 +- .../{ => shared}/tokenvault/BridgedERC20.sol | 9 +- .../shared/tokenvault/BridgedERC20V2.sol | 118 + .../{ => shared}/tokenvault/BridgedERC721.sol | 6 +- .../{ => shared}/tokenvault/ERC1155Vault.sol | 10 +- .../{ => shared}/tokenvault/ERC20Vault.sol | 13 +- .../{ => shared}/tokenvault/ERC721Vault.sol | 10 +- .../tokenvault/IBridgedERC1155.sol | 6 +- .../{ => shared}/tokenvault/IBridgedERC20.sol | 25 +- .../tokenvault/IBridgedERC721.sol | 6 +- .../tokenvault/LibBridgedToken.sol | 2 +- .../contracts/team/proving/ProverSet.sol | 125 - .../protocol/contracts/thirdparty/README.md | 9 - .../contracts/thirdparty/optimism/Bytes.sol | 152 - .../thirdparty/optimism/rlp/RLPReader.sol | 303 - .../thirdparty/optimism/rlp/RLPWriter.sol | 70 - .../thirdparty/optimism/trie/MerkleTrie.sol | 247 - .../optimism/trie/SecureMerkleTrie.sol | 57 - .../risczero/IRiscZeroReceiptVerifier.sol | 27 - .../thirdparty/solmate/LibFixedPointMath.sol | 82 - .../contracts/verifiers/RiscZeroVerifier.sol | 87 - .../deployments/hekla-contract-logs.md | 248 +- .../deployments/mainnet-contract-logs-L1.md | 186 +- .../deployments/mainnet-contract-logs-L2.md | 25 +- .../deployments/mainnet-transfer-logs-L1.md | 10 +- .../docs/analysis/MrPotatoMagic-Analysis.md | 8 +- .../docs/analysis/Sathish9098-Analysis.md | 2 +- .../docs/analysis/kaveyjoe-Analysis.md | 4 +- .../protocol/docs/how_taiko_is_deployed.md | 4 +- .../protocol/docs/how_taiko_proves_blocks.md | 2 +- packages/protocol/foundry.toml | 44 +- packages/protocol/package.json | 40 +- packages/protocol/script/download_solc.sh | 2 +- packages/protocol/script/gen-layouts.sh | 113 + .../AddSGXVerifierInstances.s.sol | 6 +- .../{ => layer1}/DeployERC20Airdrop.s.sol | 6 +- .../layer1/DeployHeklaL2Contracts.s.sol | 35 + .../{ => layer1}/DeployLabsProverPool.s.sol | 6 +- .../DeployProtocolOnL1.s.sol} | 196 +- .../script/layer1/DeployProverSet.s.sol | 39 + .../DeployQuotaManager.s.sol} | 8 +- .../script/layer1/DeployRisc0Verifier.s.sol | 28 + .../script/layer1/DeploySP1Verifier.s.sol | 31 + .../{ => layer1}/DeployTaikoToken.s.sol | 6 +- .../layer1/SendMessageToDelegateOwner.s.sol | 56 + .../script/{ => layer1}/SetDcapParams.s.sol | 6 +- .../script/layer1/UpdateMainnetOntakeL1.s.sol | 42 + .../script/layer1/UpdateRisc0Verifier.s.sol | 21 + .../script/layer1/UpdateSP1Verifier.s.sol | 23 + .../script/layer1/UpgradeHeklaOntakeL1.s.sol | 52 + .../script/layer1/UpgradeHeklaOntakeL2.s.sol | 77 + .../{ => layer1}/config_dcap_sgx_verifier.sh | 18 +- .../script/layer1/deploy_protocol_on_l1.sh | 21 + .../script/layer1/preconf/BaseScript.sol | 28 + .../layer1/preconf/deployment/DeployAVS.s.sol | 73 + .../deployment/DeployEigenlayerMVP.s.sol | 50 + .../layer1/preconf/deployment/deploy_avs.sh | 17 + .../deployment/deploy_eigenlayer_mvp.sh | 10 + .../deployment/mock/DeployMockAVS.s.sol | 75 + .../mock/DeployMockTaikoToken.s.sol | 13 + .../layer1/preconf/misc/EmptyContract.sol | 5 + .../{ => layer1}/tokenunlock/Deploy.data.json | 0 .../{ => layer1}/tokenunlock/Deploy.s.sol | 12 +- .../{ => layer1}/tokenunlock/Vest.data.json | 6 +- .../script/layer1/tokenunlock/Vest.s.sol | 58 + .../layer1/tokenunlock/exercise1.data.json | 632 + .../script/layer2/DeployDelegateOwner.s.sol | 28 + .../PostGenesisConfig.s.sol} | 12 +- .../PostGenesisQuery.s.sol} | 12 +- .../script/layer2/UpdateMainnetOntakeL2.s.sol | 21 + packages/protocol/script/merge_contracts.py | 27 - .../AuthorizeTaikoForMultihop.s.sol | 6 +- .../script/{ => shared}/SetAddress.s.sol | 4 +- .../{ => shared}/SetRemoteBridgeSuites.s.sol | 4 +- packages/protocol/script/test_deploy_on_l1.sh | 44 - .../protocol/script/tokenunlock/Vest.s.sol | 53 - .../upgrade/UpgradeAddressManager.s.sol | 13 - .../upgrade/UpgradeAssignmentHook.s.sol | 13 - .../script/upgrade/UpgradeBridge.s.sol | 13 - .../script/upgrade/UpgradeERC1155Vault.s.sol | 13 - .../script/upgrade/UpgradeERC20Vault.s.sol | 13 - .../script/upgrade/UpgradeERC721Vault.s.sol | 13 - .../upgrade/UpgradeGuardianProver.s.sol | 13 - .../script/upgrade/UpgradeScript.s.sol | 32 - .../script/upgrade/UpgradeSignalService.s.sol | 13 - .../script/upgrade/UpgradeTaikoL1.s.sol | 13 - .../script/upgrade/UpgradeTierProvider.s.sol | 19 - packages/protocol/script/upgrade_to.sh | 10 - .../protocol/test/L1/TaikoL1TestGroup6.t.sol | 92 - packages/protocol/test/L2/Lib1559Math.t.sol | 38 - packages/protocol/test/L2/TaikoL2.t.sol | 126 - .../test/L2/TaikoL2EIP1559Configurable.sol | 46 - .../protocol/test/L2/TaikoL2NoFeeCheck.t.sol | 201 - .../protocol/test/common/TestMulticall3.sol | 57 - .../{ => test}/genesis/GenerateGenesis.g.sol | 43 +- .../test/genesis/data/genesis_config.js | 61 + .../test/genesis/data/genesis_config.json | 1 + .../genesis/generate}/erc20.ts | 2 +- .../genesis/generate/generate.ts} | 20 +- .../genesis/generate}/interface.ts | 0 .../genesis/generate}/taikoL2.ts | 4 +- .../genesis/generate}/utils.ts | 2 +- .../genesis/genesis.test.sh} | 14 +- .../protocol/{ => test}/genesis/mainnet.js | 0 .../{ => test}/genesis/test_config.js | 10 +- .../genesis/testnet/docker-compose.yml | 4 +- .../{ => test}/genesis/testnet/init_geth.sh | 0 .../{ => test}/genesis/testnet/keyfile.json | 0 .../{ => test}/genesis/testnet/password | 0 packages/protocol/test/layer1/TaikoL1Test.sol | 15 + .../AutomataDcapV3AttestationTest.t.sol | 34 +- .../assets/0424/tcb_00706A100000.json | 244 + .../assets/0424/tcb_00906ED50000.json | 0 .../assets/0424/tcb_00A067110000.json | 0 .../assets/0424/tcb_30606a000000.json | 221 + .../assets/0923/identity.json | 0 .../assets/0923/tcb_00606A000000.json | 0 .../assets/0923/v3quote.json | 0 .../automata-attestation/assets/complex.json | 0 .../common/AttestationBase.t.sol | 53 +- .../utils/DcapTestUtils.t.sol | 16 +- .../utils/V3QuoteParseUtils.t.sol | 17 +- .../based}/GuardianProver1.t.sol | 7 +- .../based}/GuardianProver2.t.sol | 5 +- .../test/layer1/based/MockTaikoL1.sol | 68 + .../test/{L1 => layer1/based}/TaikoL1.t.sol | 92 +- .../based}/TaikoL1LibProvingWithTiers.t.sol | 229 +- .../{L1 => layer1/based}/TaikoL1TestBase.sol | 135 +- .../based}/TaikoL1TestGroup1.t.sol | 232 +- .../layer1/based/TaikoL1TestGroup10.t.sol | 45 + .../layer1/based/TaikoL1TestGroup11.t.sol | 69 + .../based}/TaikoL1TestGroup2.t.sol | 113 +- .../based}/TaikoL1TestGroup3.t.sol | 103 +- .../based}/TaikoL1TestGroup4.t.sol | 69 +- .../based}/TaikoL1TestGroup5.t.sol | 132 +- .../test/layer1/based/TaikoL1TestGroup6.t.sol | 86 + .../based}/TaikoL1TestGroup7.t.sol | 42 +- .../based}/TaikoL1TestGroup8.t.sol | 58 +- .../test/layer1/based/TaikoL1TestGroup9.t.sol | 374 + .../based}/TaikoL1TestGroupBase.sol | 163 +- .../based/TestTierRouter.sol} | 29 +- .../test/layer1/fork/ForkManager.t.sol | 69 + .../protocol/test/layer1/preconf/BaseTest.sol | 17 + .../beacon/BeaconProofsVerification.sol | 70 + .../preconf/blocks/BlockProposing.t.sol | 239 + .../layer1/preconf/bls/BLSExpandMsgXmd.t.sol | 129 + .../preconf/bls/BLSHashToFieldFp2.t.sol | 103 + .../bls/script-test/BLSHashToCurveG2.sol | 34 + .../bls/script-test/BLSVerifySignature.sol | 64 + .../layer1/preconf/fixtures/BeaconProofs.sol | 135 + .../preconf/fixtures/BlocksFixtures.sol | 66 + .../preconf/fixtures/LookaheadFixtures.sol | 53 + .../lookahead/IncorrectLookahead.t.sol | 661 + .../preconf/lookahead/LookaheadPosting.t.sol | 428 + .../preconf/mocks/MockBeaconBlockRoot.sol | 18 + .../preconf/mocks/MockPreconfRegistry.sol | 55 + .../mocks/MockPreconfServiceManager.sol | 15 + .../team/airdrop/ERC20Airdrop.t.sol | 4 +- .../team/airdrop/MerkleClaimable.t.sol | 4 +- .../team/tokenunlock/TokenUnlock.t.sol | 7 +- .../verifiers}/MockPlonkVerifier.sol | 4 +- .../verifiers/Risc0Verifier.t.sol} | 38 +- .../verifiers/RiscZeroGroth16Verifier.t.sol | 160 + .../layer1/verifiers/SP1PlonkVerifier.t.sol | 159 + .../test/layer1/verifiers/SP1Verifier.t.sol | 160 + .../{ => layer1}/verifiers/SgxVerifier.t.sol | 101 +- .../verifiers/compose/ComposeVerifeir.t.sol | 228 + .../test/{L2 => layer2}/DelegateOwner.t.sol | 30 +- .../protocol/test/layer2/LibEIP1559.t.sol | 153 + .../test/{L2 => layer2}/LibL2Signer.sol | 4 +- packages/protocol/test/layer2/TaikoL2.t.sol | 187 + packages/protocol/test/layer2/TaikoL2Test.sol | 10 + .../test/libs/LibFixedPointMath.t.sol | 47 - .../test/{ => shared}/DeployCapability.sol | 4 +- .../test/{ => shared}/HelperContracts.sol | 6 +- .../protocol/test/{ => shared}/TaikoTest.sol | 39 +- .../test/{ => shared}/bridge/Bridge.t.sol | 21 +- .../test/{ => shared}/bridge/Bridge2.t.sol | 2 +- .../bridge/Bridge2_failMessage.t.sol | 2 +- .../bridge/Bridge2_processMessage.t.sol | 2 +- .../bridge/Bridge2_recallMessage.t.sol | 2 +- .../bridge/Bridge2_retryMessage.t.sol | 2 +- .../bridge/Bridge2_sendMessage.t.sol | 4 +- .../{ => shared}/bridge/QuotaManager.t.sol | 2 +- .../{ => shared}/common/AddressManager.t.sol | 6 +- .../{ => shared}/common/AddressResolver.t.sol | 6 +- .../common/EssentialContract.t.sol | 2 +- .../{libs => shared/common}/LibAddress.t.sol | 4 +- .../common}/LibTrieProof.t.sol | 4 +- .../{ => shared}/signal/SignalService.t.sol | 2 +- .../thirdparty/LibUint512Math.sol | 2 +- .../test/shared/thirdparty/Multicall3.sol | 256 + .../erc20 => shared/token}/FreeMintERC20.sol | 2 +- .../token}/MayFailFreeMintERC20.sol | 2 +- .../erc20 => shared/token}/RegularERC20.sol | 2 +- .../tokenvault/BridgedERC20V2.t.sol} | 4 +- .../tokenvault/ERC1155Vault.t.sol | 2 +- .../{ => shared}/tokenvault/ERC20Vault.t.sol | 4 +- .../{ => shared}/tokenvault/ERC721Vault.t.sol | 2 +- .../test/thirdparty/LibFixedPointMath.t.sol | 40 - .../test/thirdparty/optimisim/Bytes.t.sol | 129 - .../thirdparty/optimisim/rlp/RLPReader.t.sol | 128 - .../optimisim/trie/SecureMerkleTrie.t.sol | 130 - packages/protocol/tsconfig.json | 12 + .../airdrop/airdrop_db/example_claimList.json | 7 - .../protocol/utils/airdrop/buildMerkleTree.ts | 97 - packages/relayer/.gitignore | 5 +- packages/relayer/.golangci.yml | 8 +- packages/relayer/.l1indexer.example.env | 3 +- packages/relayer/ERC1155Vault.json | 1026 - packages/relayer/ERC20Vault.json | 1102 - packages/relayer/ERC721Vault.json | 982 - packages/relayer/ICrossChainSync.json | 74 - packages/relayer/QuotaManager.json | 569 - packages/relayer/README.md | 3 +- packages/relayer/SignalService.json | 885 - packages/relayer/api/api.go | 12 +- packages/relayer/api/config.go | 6 +- packages/relayer/api/config_test.go | 6 +- packages/relayer/bindings/bridge/Bridge.go | 73 +- .../bindings/erc1155vault/ERC1155Vault.go | 2 +- .../relayer/bindings/erc20vault/ERC20Vault.go | 55 +- .../bindings/erc721vault/ERC721Vault.go | 2 +- .../bindings/quotamanager/QuotaManager.go | 157 +- packages/relayer/bindings/taikol1/TaikoL1.go | 630 +- packages/relayer/bridge/bridge.go | 7 +- packages/relayer/cmd/flags/common.go | 4 +- packages/relayer/cmd/flags/indexer.go | 50 +- packages/relayer/cmd/flags/processor.go | 8 + packages/relayer/db.go | 28 - packages/relayer/docs/docs.go | 2 +- packages/relayer/docs/swagger.json | 2 +- packages/relayer/docs/swagger.yaml | 2 +- packages/relayer/event.go | 69 +- packages/relayer/indexer/config.go | 96 +- packages/relayer/indexer/config_test.go | 6 +- .../indexer/handle_chain_data_synced_event.go | 18 +- .../indexer/handle_message_processed_event.go | 4 +- .../indexer/handle_message_sent_event.go | 24 +- .../handle_message_status_changed_event.go | 2 +- packages/relayer/indexer/indexer.go | 98 +- packages/relayer/indexer/indexer_test.go | 4 - packages/relayer/indexer/save_event_to_db.go | 12 +- .../set_initial_Indexing_block_by_mode.go | 3 +- ...set_initial_indexing_block_by_mode_test.go | 2 - ...1708366667_alter_events_add_dest_owner.sql | 9 + .../migrations/1708366668_index_data.sql | 33 + .../1708366669_alert_events_is_profitable.sql | 23 + packages/relayer/pkg/db/db.go | 31 +- packages/relayer/pkg/http/get_block_info.go | 2 + .../relayer/pkg/http/get_events_by_address.go | 109 + .../pkg/http/get_events_by_address_test.go | 4 +- .../http/get_recommended_processing_fees.go | 7 +- packages/relayer/pkg/http/server.go | 31 +- packages/relayer/pkg/http/server_test.go | 18 +- packages/relayer/pkg/mock/eth_client.go | 16 + packages/relayer/pkg/mock/event_repository.go | 63 +- packages/relayer/pkg/mock/mock_tx_sender.go | 19 + packages/relayer/pkg/repo/containers_test.go | 5 +- packages/relayer/pkg/repo/db.go | 17 - packages/relayer/pkg/repo/event.go | 119 +- packages/relayer/pkg/repo/event_test.go | 25 +- packages/relayer/pkg/utils/scan_blocks.go | 5 +- .../relayer/processor/can_process_message.go | 2 +- packages/relayer/processor/config.go | 17 +- packages/relayer/processor/config_test.go | 6 +- packages/relayer/processor/is_profitable.go | 22 +- .../relayer/processor/is_profitable_test.go | 7 +- packages/relayer/processor/process_message.go | 89 +- .../relayer/processor/process_message_test.go | 1 + packages/relayer/processor/processor.go | 75 +- packages/relayer/processor/processor_test.go | 3 - .../processor/wait_for_confirmations.go | 2 +- .../processor/wait_for_confirmations_test.go | 2 +- .../relayer/processor/wait_header_synced.go | 2 +- packages/relayer/prometheus.go | 20 + packages/relayer/scripts/abigen.sh | 6 +- packages/relayer/scripts/swagger.sh | 4 +- packages/relayer/types.go | 107 +- packages/relayer/types_test.go | 10 - packages/relayer/watchdog/config.go | 6 +- packages/relayer/watchdog/config_test.go | 6 +- packages/relayer/watchdog/watchdog.go | 27 +- packages/snaefell-ui/CHANGELOG.md | 22 + packages/snaefell-ui/package.json | 8 +- .../MintDisclaimer.modal.svelte | 7 +- .../modals/MintDisclaimer.modal/classes.ts | 11 +- .../snaefell-ui/src/generated/abi/index.ts | 27 +- packages/snaefell-ui/src/lib/ipfs/config.ts | 1 - packages/snaefell-ui/src/lib/ipfs/get.ts | 6 +- .../snaefell-ui/src/lib/ipfs/getMetadata.ts | 16 +- .../src/lib/util/isCountdownActive.ts | 6 - packages/snaefell-ui/src/lib/wagmi/watcher.ts | 2 +- packages/snaefell-ui/vite.config.ts | 8 +- packages/snaefell-ui/wagmi.config.ts | 2 +- .../contracts/blacklist/IMinimalBlacklist.sol | 2 +- .../deployments/blacklist/hekla.json | 3 + .../deployments/blacklist/mainnet.json | 3 + packages/supplementary-contracts/package.json | 6 +- .../script/blacklist/Deploy.data.json | 155 +- .../script/blacklist/Deploy.sol | 72 +- .../script/utils/safe_batch_transfer.py | 89 + packages/taiko-client/.golangci.yml | 21 +- packages/taiko-client/.swaggo | 2 - packages/taiko-client/CHANGELOG.md | 578 + packages/taiko-client/Dockerfile | 7 +- packages/taiko-client/Makefile | 10 +- packages/taiko-client/README.md | 4 +- packages/taiko-client/bindings/.githead | 2 +- .../bindings/encoding/custom_error.go | 6 + .../taiko-client/bindings/encoding/input.go | 377 +- .../bindings/encoding/input_test.go | 44 +- .../taiko-client/bindings/encoding/struct.go | 120 +- .../bindings/encoding/struct_test.go | 2 +- .../bindings/gen_address_manager.go | 2 +- .../bindings/gen_assignment_hook.go | 2026 -- .../bindings/gen_guardian_prover.go | 151 +- .../bindings/gen_lib_proposing.go | 212 +- .../taiko-client/bindings/gen_lib_proving.go | 700 +- .../taiko-client/bindings/gen_lib_utils.go | 157 +- .../bindings/gen_lib_verifying.go | 292 +- .../taiko-client/bindings/gen_prover_set.go | 362 +- .../taiko-client/bindings/gen_sgx_verifier.go | 41 +- .../taiko-client/bindings/gen_taiko_l1.go | 2767 ++- .../taiko-client/bindings/gen_taiko_l2.go | 534 +- .../taiko-client/bindings/gen_taiko_token.go | 23 +- .../bindings/gen_tier_provider.go | 88 +- .../bindings/metadata/interface.go | 40 + .../bindings/metadata/metadata_legacy.go | 168 + .../bindings/metadata/metadata_ontake.go | 164 + packages/taiko-client/cmd/flags/common.go | 26 +- packages/taiko-client/cmd/flags/driver.go | 41 +- packages/taiko-client/cmd/flags/proposer.go | 92 +- packages/taiko-client/cmd/flags/prover.go | 118 +- packages/taiko-client/cmd/logger/logger.go | 2 +- packages/taiko-client/docs/docs.go | 296 +- packages/taiko-client/docs/index.html | 8 +- packages/taiko-client/docs/swagger.json | 288 +- packages/taiko-client/docs/swagger.yaml | 249 +- .../anchor_tx_constructor.go | 32 +- .../anchor_tx_constructor_test.go | 15 + .../driver/chain_syncer/beaconsync/syncer.go | 20 +- .../driver/chain_syncer/blob/soft_block.go | 298 + .../driver/chain_syncer/blob/syncer.go | 361 +- .../driver/chain_syncer/blob/syncer_test.go | 128 +- .../driver/chain_syncer/chain_syncer.go | 9 +- .../driver/chain_syncer/chain_syncer_test.go | 49 +- packages/taiko-client/driver/config.go | 55 +- packages/taiko-client/driver/config_test.go | 14 +- packages/taiko-client/driver/driver.go | 71 +- packages/taiko-client/driver/driver_test.go | 427 +- .../driver/signer/fixed_k_signer.go | 2 +- .../taiko-client/driver/soft_blocks/api.go | 306 + .../taiko-client/driver/soft_blocks/server.go | 130 + .../driver/soft_blocks/server_test.go | 36 + .../taiko-client/driver/state/l1_current.go | 12 +- packages/taiko-client/driver/state/state.go | 72 +- .../taiko-client/driver/state/state_test.go | 2 +- .../txlist_decompressor.go | 58 +- .../txlist_decompressor_test.go | 21 +- .../driver/txlist_fetcher/blob.go | 31 +- .../driver/txlist_fetcher/calldata.go | 43 +- .../driver/txlist_fetcher/interface.go | 4 +- .../taiko-client/integration_test/README.md | 4 + .../integration_test/deploy_l1_contract.sh | 6 +- .../integration_test/entrypoint.sh | 23 +- .../integration_test/hive_test.go | 127 + .../taiko-client/integration_test/l1_env.sh | 8 +- .../taiko-client/integration_test/test_env.sh | 40 +- .../internal/docker/docker_env.sh | 26 +- .../internal/docker/nodes/docker-compose.yml | 46 +- .../taiko-client/internal/docker/start.sh | 13 +- packages/taiko-client/internal/docker/stop.sh | 9 +- .../taiko-client/internal/metrics/metrics.go | 46 +- .../taiko-client/internal/testutils/helper.go | 227 +- .../internal/testutils/interfaces.go | 8 +- .../taiko-client/internal/testutils/suite.go | 100 +- .../taiko-client/internal/utils/test_utils.go | 16 - .../taiko-client/internal/version/version.go | 2 +- packages/taiko-client/package.json | 2 +- .../chain_iterator/block_batch_iterator.go | 9 + .../event_iterator/block_proposed_iterator.go | 39 +- .../taiko-client/pkg/config/chain_config.go | 73 + packages/taiko-client/pkg/jwt/jwt.go | 2 +- packages/taiko-client/pkg/rpc/beaconclient.go | 18 +- .../taiko-client/pkg/rpc/blob_datasource.go | 29 +- .../pkg/rpc/blob_datasource_test.go | 34 - packages/taiko-client/pkg/rpc/client.go | 40 +- packages/taiko-client/pkg/rpc/client_test.go | 26 +- packages/taiko-client/pkg/rpc/dial.go | 6 +- packages/taiko-client/pkg/rpc/dial_test.go | 5 +- packages/taiko-client/pkg/rpc/engine.go | 11 +- packages/taiko-client/pkg/rpc/ethclient.go | 142 +- .../taiko-client/pkg/rpc/ethclient_test.go | 26 + packages/taiko-client/pkg/rpc/fallback.go | 29 - .../taiko-client/pkg/rpc/fallback_test.go | 13 - packages/taiko-client/pkg/rpc/methods.go | 438 +- packages/taiko-client/pkg/rpc/methods_test.go | 4 +- packages/taiko-client/pkg/rpc/subscription.go | 72 + packages/taiko-client/pkg/rpc/utils.go | 248 +- .../taiko-client/pkg/utils/txmgr_selector.go | 62 + .../pkg/utils/txmgr_selector_test.go | 29 + .../{internal => pkg}/utils/util_test.go | 2 +- .../{internal => pkg}/utils/utils.go | 11 +- packages/taiko-client/proposer/config.go | 59 +- packages/taiko-client/proposer/config_test.go | 39 +- packages/taiko-client/proposer/proposer.go | 313 +- .../taiko-client/proposer/proposer_test.go | 268 +- .../prover_selector/eth_fee_eoa_selector.go | 269 - .../eth_fee_eoa_selector_test.go | 71 - .../proposer/prover_selector/interface.go | 20 - .../proposer/transaction_builder/blob.go | 139 +- .../proposer/transaction_builder/calldata.go | 114 +- .../transaction_builder/calldata_test.go | 59 +- .../proposer/transaction_builder/common.go | 26 - .../transaction_builder/common_test.go | 80 - .../proposer/transaction_builder/fallback.go | 206 + .../transaction_builder/fallback_test.go | 139 + .../proposer/transaction_builder/interface.go | 9 +- .../anchor_tx_validator.go | 4 +- .../anchor_tx_validator_test.go | 2 +- packages/taiko-client/prover/config.go | 64 +- packages/taiko-client/prover/config_test.go | 38 +- .../event_handler/assignment_expired.go | 25 +- .../prover/event_handler/block_proposed.go | 130 +- .../event_handler/block_proposed_test.go | 9 +- .../prover/event_handler/block_verified.go | 7 +- .../event_handler/block_verified_test.go | 2 +- .../prover/event_handler/interface.go | 17 +- .../event_handler/transition_contested.go | 17 +- .../prover/event_handler/transition_proved.go | 26 +- .../event_handler/transition_proved_test.go | 59 +- .../taiko-client/prover/event_handler/util.go | 39 +- packages/taiko-client/prover/init.go | 48 +- packages/taiko-client/prover/init_test.go | 8 +- .../prover/proof_producer/dummy_producer.go | 18 +- .../proof_producer/dummy_producer_test.go | 5 +- .../proof_producer/guardian_producer.go | 28 +- .../proof_producer/guardian_producer_test.go | 23 +- .../proof_producer/optimistic_producer.go | 43 +- .../optimistic_producer_test.go | 8 +- .../prover/proof_producer/proof_producer.go | 35 +- .../prover/proof_producer/sgx_producer.go | 371 +- .../proof_producer/sgx_producer_test.go | 5 +- .../prover/proof_producer/zkvm_producer.go | 539 + .../prover/proof_submitter/interface.go | 10 +- .../prover/proof_submitter/proof_buffer.go | 122 + .../prover/proof_submitter/proof_contester.go | 7 +- .../proof_submitter/proof_contester_test.go | 4 +- .../prover/proof_submitter/proof_submitter.go | 362 +- .../proof_submitter/proof_submitter_test.go | 120 +- .../proof_submitter/transaction/builder.go | 99 +- .../transaction/builder_test.go | 10 +- .../proof_submitter/transaction/sender.go | 98 +- .../transaction/sender_test.go | 34 +- packages/taiko-client/prover/prover.go | 251 +- packages/taiko-client/prover/prover_test.go | 434 +- packages/taiko-client/prover/server/api.go | 301 - .../taiko-client/prover/server/api_test.go | 50 - packages/taiko-client/prover/server/server.go | 148 - .../taiko-client/prover/server/server_test.go | 128 - packages/taiko-client/scripts/gen_bindings.sh | 28 +- .../taiko-client/scripts/gen_swagger_json.sh | 2 +- packages/taikoon-ui/.env.example | 4 +- packages/taikoon-ui/CHANGELOG.md | 56 + packages/taikoon-ui/package.json | 9 +- .../components/Collection/Collection.svelte | 25 +- .../src/components/Header/Header.svelte | 4 +- .../src/components/Mint/Mint.svelte | 59 +- .../components/NftRenderer/NftRenderer.svelte | 13 - .../SwitchChainModal/SwitchChainModal.svelte | 6 +- .../components/core/Section/Section.svelte | 4 +- .../MintConfirmation.modal.svelte | 2 +- .../sections/Countdown.section.svelte | 99 - .../sections/Information.section.svelte | 20 +- .../src/components/sections/index.ts | 1 - .../taikoon-ui/src/generated/abi/index.ts | 29 +- .../src/generated/whitelist/hekla.json | 67 + .../src/generated/whitelist/mainnet.json | 2498 +- packages/taikoon-ui/src/i18n/en.json | 3 +- packages/taikoon-ui/src/lib/chain/chains.ts | 122 +- packages/taikoon-ui/src/lib/ens/getAddress.ts | 4 +- packages/taikoon-ui/src/lib/ens/getName.ts | 4 +- packages/taikoon-ui/src/lib/ipfs/config.ts | 1 - packages/taikoon-ui/src/lib/ipfs/get.ts | 6 - .../taikoon-ui/src/lib/ipfs/getMetadata.ts | 33 +- packages/taikoon-ui/src/lib/ipfs/httpGet.ts | 4 + packages/taikoon-ui/src/lib/ipfs/index.ts | 4 +- .../taikoon-ui/src/lib/token/balanceOf.ts | 8 +- packages/taikoon-ui/src/lib/token/canMint.ts | 21 +- .../src/lib/token/estimateMintGasCost.ts | 18 +- packages/taikoon-ui/src/lib/token/index.ts | 9 +- .../taikoon-ui/src/lib/token/maxSupply.ts | 4 +- packages/taikoon-ui/src/lib/token/mint.ts | 39 +- packages/taikoon-ui/src/lib/token/name.ts | 8 +- packages/taikoon-ui/src/lib/token/ownerOf.ts | 10 +- .../taikoon-ui/src/lib/token/tokenOfOwner.ts | 4 +- packages/taikoon-ui/src/lib/token/tokenURI.ts | 4 +- .../taikoon-ui/src/lib/token/totalSupply.ts | 4 +- .../src/lib/user/totalWhitelistMintCount.ts | 16 +- .../src/lib/util/calculateGasPrice.ts | 13 + .../src/lib/util/isDevelopmentEnv.ts | 3 + .../src/lib/wagmi/estimateContractGas.ts | 2 +- .../taikoon-ui/src/lib/wagmi/getBalance.ts | 4 +- .../taikoon-ui/src/lib/wagmi/getConfig.ts | 27 +- packages/taikoon-ui/src/lib/wagmi/getLogs.ts | 2 +- .../taikoon-ui/src/lib/wagmi/publicClient.ts | 6 +- packages/taikoon-ui/src/lib/wagmi/watcher.ts | 6 +- .../taikoon-ui/src/lib/whitelist/getProof.ts | 14 +- .../taikoon-ui/src/lib/whitelist/index.ts | 10 +- packages/taikoon-ui/src/wagmi.config.ts | 17 +- packages/taikoon-ui/wagmi.config.ts | 9 +- packages/ui-lib/package.json | 2 +- pnpm-lock.yaml | 18866 ++++++++++------ release-please-config.json | 53 +- taiko-deploy | 28 + 1146 files changed, 70493 insertions(+), 46989 deletions(-) delete mode 100644 .github/_typos.toml rename {packages/branding/RGB SVG (For Digital Use)/Taiko Icon => .github}/taiko-icon-blk.svg (100%) create mode 100644 .github/workflows/monitors.yml create mode 100644 .github/workflows/repo--check-links.yml delete mode 100644 .github/workflows/repo--close-inactive-issues.yml create mode 100644 .github/workflows/repo--do-not-merge-pr.yml create mode 100644 .github/workflows/repo--merge-gatekeeper.yml create mode 100644 .github/workflows/taiko-client--hive-test.yml create mode 100644 .github/workflows/taiko-client--pages.yml create mode 100644 LICENSE delete mode 100644 LICENSE.md create mode 100644 lychee.toml delete mode 100644 packages/branding/CHANGELOG.md delete mode 100644 packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-mono-2x.png delete mode 100644 packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-mono.png delete mode 100644 packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht-2x.png delete mode 100644 packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht.png delete mode 100644 packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht_background.png delete mode 100644 packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-blk.png delete mode 100644 packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-mono.png delete mode 100644 packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-wht.png delete mode 100644 packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-wht_background.png delete mode 100644 packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-blk.png delete mode 100644 packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-mono.png delete mode 100644 packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-wht-background.png delete mode 100644 packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-wht.png delete mode 100644 packages/branding/README.md delete mode 100644 packages/branding/RGB SVG (For Digital Use)/Taiko Icon/taiko-icon-mono.svg delete mode 100644 packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-blk.svg delete mode 100644 packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-mono.svg delete mode 100644 packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-wht.svg delete mode 100644 packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-blk.svg delete mode 100644 packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-mono.svg delete mode 100644 packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-wht.svg delete mode 100644 packages/branding/package.json delete mode 100644 packages/branding/taiko-icon-wht-200x200.png delete mode 100644 packages/branding/testnet-token-images/bull.svg delete mode 100644 packages/branding/testnet-token-images/horse.svg delete mode 100644 packages/branding/testnet-token-images/ttko.svg create mode 100644 packages/bridge-ui/src/components/Bridge/SharedBridgeComponents/RecipientStep/DestOwner.svelte create mode 100644 packages/bridge-ui/src/components/Relayer/Relayer.svelte create mode 100644 packages/bridge-ui/src/components/Relayer/index.ts create mode 100644 packages/bridge-ui/src/components/Transactions/ChainSymbol.svelte create mode 100644 packages/bridge-ui/src/components/Transactions/Dialogs/DesktopDetailsDialog.svelte create mode 100644 packages/bridge-ui/src/components/Transactions/Dialogs/MobileDetailsDialog.svelte create mode 100644 packages/bridge-ui/src/components/Transactions/Dialogs/index.ts delete mode 100644 packages/bridge-ui/src/components/Transactions/MobileDetailsDialog.svelte create mode 100644 packages/bridge-ui/src/components/Transactions/Rows/FungibleTransactionRow.svelte create mode 100644 packages/bridge-ui/src/components/Transactions/Rows/NftTransactionRow.svelte create mode 100644 packages/bridge-ui/src/components/Transactions/Rows/index.ts delete mode 100644 packages/bridge-ui/src/components/Transactions/Transaction.svelte create mode 100644 packages/bridge-ui/src/libs/fee/recommendedProcessingFee.test.ts create mode 100644 packages/bridge-ui/src/libs/util/formatTimestamp.ts create mode 100644 packages/bridge-ui/src/libs/util/getBlockFromTxHash.ts create mode 100644 packages/bridge-ui/src/libs/util/getBlockTimestamp.ts rename packages/bridge-ui/src/libs/util/{isSmartContractWallet.test.ts => isSmartContract.test.ts} (79%) rename packages/bridge-ui/src/libs/util/{isSmartContractWallet.ts => isSmartContract.ts} (70%) create mode 100644 packages/bridge-ui/src/libs/util/responsiveCheck.ts delete mode 100644 packages/bridge-ui/src/libs/util/uid.test.ts delete mode 100644 packages/bridge-ui/src/libs/util/uid.ts create mode 100644 packages/bridge-ui/src/routes/relayer/+page.svelte create mode 100644 packages/bridge-ui/static/coins/crvUSD.png create mode 100644 packages/bridge-ui/static/coins/curve.png create mode 100644 packages/bridge-ui/static/coins/dai.webp create mode 100644 packages/bridge-ui/static/coins/scrvUSD.png delete mode 100644 packages/docs-site/src/assets/content/docs/core-concepts/bridging-process-message.excalidraw.png delete mode 100644 packages/docs-site/src/assets/content/docs/core-concepts/bridging-send-message.excalidraw.png create mode 100644 packages/docs-site/src/assets/content/docs/core-concepts/contestable.png create mode 100644 packages/docs-site/src/assets/content/docs/core-concepts/proof-tiers.png create mode 100644 packages/docs-site/src/assets/content/docs/guides/verify-as-proxy.webp create mode 100644 packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config-hekla.webp delete mode 100644 packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config.webp create mode 100644 packages/docs-site/src/assets/content/docs/taiko-protocol/based-economics.png create mode 100644 packages/docs-site/src/assets/content/docs/taiko-protocol/bridging-dest-chain.webp create mode 100644 packages/docs-site/src/assets/content/docs/taiko-protocol/bridging-source-chain.webp rename packages/docs-site/src/assets/content/docs/{core-concepts => taiko-protocol}/proposed.png (100%) rename packages/docs-site/src/assets/content/docs/{core-concepts => taiko-protocol}/proved.png (100%) rename packages/docs-site/src/assets/content/docs/{core-concepts => taiko-protocol}/taiko-nodes.png (100%) rename packages/docs-site/src/assets/content/docs/{core-concepts => taiko-protocol}/verified.png (100%) rename packages/docs-site/src/content/docs/core-concepts/{based-sequencing.md => based-rollup.md} (58%) create mode 100644 packages/docs-site/src/content/docs/core-concepts/contestable-rollup.md delete mode 100644 packages/docs-site/src/content/docs/core-concepts/contestable-rollups.md create mode 100644 packages/docs-site/src/content/docs/guides/node-operators/deploy-a-proverset.mdx delete mode 100644 packages/docs-site/src/content/docs/network-reference/network-configuration.md create mode 100644 packages/docs-site/src/content/docs/network-reference/network-configuration.mdx rename packages/docs-site/src/content/docs/network-reference/{rpc-configuration.md => rpc-configuration.mdx} (86%) create mode 100644 packages/docs-site/src/content/docs/network-reference/software-releases-and-deployments.md create mode 100644 packages/docs-site/src/content/docs/resources/terminology.mdx rename packages/docs-site/src/content/docs/{core-concepts => taiko-protocol}/block-states.mdx (74%) rename packages/docs-site/src/content/docs/{core-concepts => taiko-protocol}/bridging.md (61%) create mode 100644 packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/sgxverifier-contract.md create mode 100644 packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol1-contract.md create mode 100644 packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol2-contract.md create mode 100644 packages/docs-site/src/content/docs/taiko-protocol/economics.md rename packages/docs-site/src/content/docs/{core-concepts => taiko-protocol}/taiko-nodes.md (93%) create mode 100644 packages/eventindexer/.swaggo rename packages/{guardian-prover-health-check/GuardianProver.json => eventindexer/AssignmentHook.json} (73%) rename packages/{relayer/TaikoL1.json => eventindexer/Bridge.json} (50%) delete mode 100644 packages/eventindexer/ProverPool.json delete mode 100644 packages/eventindexer/SgxVerifier.json delete mode 100644 packages/eventindexer/Swap.json delete mode 100644 packages/eventindexer/TaikoL1.json delete mode 100644 packages/eventindexer/TaikoToken.json delete mode 100644 packages/eventindexer/cmd/flags/generator.go delete mode 100644 packages/eventindexer/contracts/assignmenthook/AssignmentHook.go create mode 100644 packages/eventindexer/contracts/erc721/abi.go delete mode 100644 packages/eventindexer/db.go create mode 100644 packages/eventindexer/erc20_balance.go delete mode 100644 packages/eventindexer/generator/config.go delete mode 100644 packages/eventindexer/generator/config_test.go delete mode 100644 packages/eventindexer/generator/generator.go create mode 100644 packages/eventindexer/indexer/index_erc20_transfers.go delete mode 100644 packages/eventindexer/indexer/save_block_assigned_event.go create mode 100644 packages/eventindexer/migrations/20270906208840_create_erc20_metadata_table.sql create mode 100644 packages/eventindexer/migrations/20270906208841_create_erc20_balances_table.sql create mode 100644 packages/eventindexer/migrations/20270906208842_alter_erc20_balances_table_add_indexes.sql create mode 100644 packages/eventindexer/migrations/20270906208843_alter_erc20_metadata_table_add_indexes.sql create mode 100644 packages/eventindexer/migrations/20270906208844_alter_events_table_add_block_id_event_index.sql create mode 100644 packages/eventindexer/migrations/20270906208852_alter_erc20_balances_addtl_indexes.sql create mode 100644 packages/eventindexer/pkg/http/get_block_proposed_by.go create mode 100644 packages/eventindexer/pkg/http/get_block_proven_by.go create mode 100644 packages/eventindexer/pkg/http/get_erc20_balances_by_address_and_chain_id.go create mode 100644 packages/eventindexer/pkg/mock/erc20_balance_repository.go create mode 100644 packages/eventindexer/pkg/repo/erc20_balance.go create mode 100644 packages/eventindexer/pkg/repo/erc20_balance_test.go create mode 100644 packages/eventindexer/pkg/repo/interface.go delete mode 100644 packages/eventindexer/pkg/tasks/tasks.go rename packages/eventindexer/{ => scripts}/abigen.sh (54%) create mode 100644 packages/geth-rpc-gateway/.gitignore create mode 100644 packages/geth-rpc-gateway/README.md create mode 100644 packages/geth-rpc-gateway/main.go delete mode 100644 packages/guardian-prover-health-check/db.go delete mode 100644 packages/guardian-prover-health-check/repo/db.go create mode 100644 packages/monitors/.gitignore create mode 100644 packages/monitors/README.md create mode 100644 packages/monitors/defender/mainnet/.defender/deployment-log.mystack.json create mode 100644 packages/monitors/defender/mainnet/.env.example create mode 100644 packages/monitors/defender/mainnet/README.md create mode 100644 packages/monitors/defender/mainnet/actions/Bridge-MessageProcessed/index.js create mode 100644 packages/monitors/defender/mainnet/actions/ER20Vault-BridgedTokenChanged/index.js create mode 100644 packages/monitors/defender/mainnet/actions/ERC20Vault-BalanceDrop/index.js create mode 100644 packages/monitors/defender/mainnet/actions/GuardianProver-ApprovedCount/index.js create mode 100644 packages/monitors/defender/mainnet/actions/GuardianProver-ConflictingProofs/index.js create mode 100644 packages/monitors/defender/mainnet/actions/GuardianProver-GuardiansUpdated/index.js create mode 100644 packages/monitors/defender/mainnet/actions/GuardianProver-ProvingAutoPauseEnabled/index.js create mode 100644 packages/monitors/defender/mainnet/actions/SGXVerifier-verifyProofFailure/index.js create mode 100644 packages/monitors/defender/mainnet/actions/TaikoL1-BlockProposed/index.js create mode 100644 packages/monitors/defender/mainnet/actions/TaikoL1-BlockVerified/index.js create mode 100644 packages/monitors/defender/mainnet/actions/TaikoL1-CalldataTxListCount/index.js create mode 100644 packages/monitors/defender/mainnet/actions/TaikoL1-ProvingPaused/index.js create mode 100644 packages/monitors/defender/mainnet/actions/TaikoL1-TransitionContestedCount/index.js create mode 100644 packages/monitors/defender/mainnet/actions/TaikoL1-TransitionProved/index.js create mode 100644 packages/monitors/defender/mainnet/actions/Vaults-BridgedTokenDeployed/index.js create mode 100644 packages/monitors/defender/mainnet/serverless.yml create mode 100644 packages/monitors/package.json create mode 100644 packages/nfts/contract_layout.md create mode 100644 packages/nfts/contracts/eventRegister/EventRegister.sol create mode 100644 packages/nfts/contracts/galxe/RegisterGalxePoints.sol create mode 100644 packages/nfts/contracts/party-ticket/TaikoPartyTicket.sol create mode 100644 packages/nfts/contracts/party-ticket/TaikoPartyTicketV2.sol create mode 100644 packages/nfts/contracts/profile/RegisterProfilePicture.sol create mode 100644 packages/nfts/contracts/trailblazers-airdrop/ERC20Airdrop.sol create mode 100644 packages/nfts/contracts/trailblazers-airdrop/MerkleClaimable.sol create mode 100644 packages/nfts/contracts/trailblazers-badges/ECDSAWhitelist.sol create mode 100644 packages/nfts/contracts/trailblazers-badges/TrailblazersBadges.sol create mode 100644 packages/nfts/contracts/trailblazers-badges/TrailblazersBadgesV3.sol create mode 100644 packages/nfts/contracts/trailblazers-season-2/BadgeRecruitment.sol create mode 100644 packages/nfts/contracts/trailblazers-season-2/BadgeRecruitmentV2.sol create mode 100644 packages/nfts/contracts/trailblazers-season-2/TrailblazersBadgesS2.sol create mode 100644 packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV4.sol create mode 100644 packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV5.sol create mode 100644 packages/nfts/data/party-token/metadata/golden-winner.json create mode 100644 packages/nfts/data/party-token/metadata/loser.json create mode 100644 packages/nfts/data/party-token/metadata/raffle.json create mode 100644 packages/nfts/data/party-token/metadata/winner.json create mode 100644 packages/nfts/data/party-token/static/golden-winner.png create mode 100644 packages/nfts/data/party-token/static/loser.png create mode 100644 packages/nfts/data/party-token/static/raffle.png create mode 100644 packages/nfts/data/party-token/static/winner.gif create mode 100644 packages/nfts/deployments/eventRegister/hekla.json create mode 100644 packages/nfts/deployments/eventRegister/mainnet.json rename packages/{protocol => nfts}/deployments/gen-layouts.sh (56%) create mode 100644 packages/nfts/deployments/party-ticket/hekla.json create mode 100644 packages/nfts/deployments/party-ticket/mainnet.json create mode 100644 packages/nfts/deployments/profile/hekla.json create mode 100644 packages/nfts/deployments/profile/mainnet.json create mode 100644 packages/nfts/deployments/taikoon/hekla.json create mode 100644 packages/nfts/deployments/trailblazers-airdrop/hekla.json create mode 100644 packages/nfts/deployments/trailblazers-airdrop/mainnet.json create mode 100644 packages/nfts/deployments/trailblazers-badges/hekla.json create mode 100644 packages/nfts/deployments/trailblazers-badges/localhost.json create mode 100644 packages/nfts/deployments/trailblazers-badges/mainnet.json create mode 100644 packages/nfts/deployments/trailblazers-season-2/hekla.json create mode 100644 packages/nfts/deployments/trailblazers-season-2/mainnet.json create mode 100644 packages/nfts/script/party-ticket/sol/Deploy.s.sol create mode 100644 packages/nfts/script/party-ticket/sol/UpgradeV2.s.sol create mode 100644 packages/nfts/script/party-ticket/sol/Utils.s.sol create mode 100644 packages/nfts/script/profile/Deploy.s.sol create mode 100644 packages/nfts/script/profile/Utils.s.sol create mode 100644 packages/nfts/script/taikoon/sol/UpgradeV2.sol create mode 100644 packages/nfts/script/trailblazer/eventRegister/Deploy.s.sol create mode 100644 packages/nfts/script/trailblazer/galxe/Deploy.s.sol create mode 100644 packages/nfts/script/trailblazer/trailblazers-badges/Deploy.s.sol create mode 100644 packages/nfts/script/trailblazer/trailblazers-badges/UpgradeS1.sol create mode 100644 packages/nfts/script/trailblazer/trailblazers-badges/UpgradeV3.s.sol create mode 100644 packages/nfts/script/trailblazer/trailblazers-badges/UpgradeV3.sol create mode 100644 packages/nfts/script/trailblazer/trailblazers-badges/UpgradeV4.s.sol create mode 100644 packages/nfts/script/trailblazer/trailblazers-badges/Utils.s.sol create mode 100644 packages/nfts/script/trailblazers-airdrop/Deploy.s.sol create mode 100644 packages/nfts/script/trailblazers-airdrop/Utils.s.sol create mode 100644 packages/nfts/script/trailblazers-season-2/Deploy.s.sol create mode 100644 packages/nfts/script/trailblazers-season-2/RecruitmentUpgradeV2.s.sol create mode 100644 packages/nfts/script/trailblazers-season-2/UpgradeV2.s.sol create mode 100644 packages/nfts/script/trailblazers-season-2/Utils.s.sol create mode 100644 packages/nfts/test/party-ticket/TaikoPartyTicket.t.sol create mode 100644 packages/nfts/test/party-ticket/TaikoPartyTicketV2.t.sol create mode 100644 packages/nfts/test/profile/RegisterProfilePicture.t.sol create mode 100644 packages/nfts/test/trailblazer/eventRegister/EventRegister.t.sol create mode 100644 packages/nfts/test/trailblazer/galxe/RegisterGalxePoints.t.sol create mode 100644 packages/nfts/test/trailblazer/trailblazers-badges/TrailblazersBadges.t.sol create mode 100644 packages/nfts/test/trailblazer/trailblazers-badges/TrailblazersBadgesV3.t.sol create mode 100644 packages/nfts/test/trailblazers-airdrop/ERC20Airdrop.t.sol create mode 100644 packages/nfts/test/trailblazers-season-2/BadgeRecruitment.t.sol create mode 100644 packages/nfts/test/trailblazers-season-2/BadgeRecruitmentV2.t.sol create mode 100644 packages/nfts/test/trailblazers-season-2/TrailblazersBadgesS2.t.sol create mode 100644 packages/nfts/test/util/MockTokens.sol create mode 100644 packages/nfts/test/util/TrailblazerBadgesS1MintTo.sol create mode 100644 packages/protocol/audit/open_zeppelin_taiko_protocol_audit_june_2024.pdf create mode 100644 packages/protocol/audit/open_zeppelin_taiko_protocol_ontake_audit_nov_2024.pdf.pdf delete mode 100644 packages/protocol/contract_layout.md create mode 100644 packages/protocol/contract_layout_layer1.md create mode 100644 packages/protocol/contract_layout_layer2.md delete mode 100644 packages/protocol/contracts/L1/ITaikoL1.sol delete mode 100644 packages/protocol/contracts/L1/TaikoData.sol delete mode 100644 packages/protocol/contracts/L1/TaikoErrors.sol delete mode 100644 packages/protocol/contracts/L1/TaikoEvents.sol delete mode 100644 packages/protocol/contracts/L1/TaikoL1.sol delete mode 100644 packages/protocol/contracts/L1/hooks/AssignmentHook.sol delete mode 100644 packages/protocol/contracts/L1/hooks/IHook.sol delete mode 100644 packages/protocol/contracts/L1/libs/LibProposing.sol delete mode 100644 packages/protocol/contracts/L1/libs/LibProving.sol delete mode 100644 packages/protocol/contracts/L1/libs/LibUtils.sol delete mode 100644 packages/protocol/contracts/L1/libs/LibVerifying.sol delete mode 100644 packages/protocol/contracts/L1/tiers/TierProviderBase.sol delete mode 100644 packages/protocol/contracts/L1/tiers/TierProviderV2.sol delete mode 100644 packages/protocol/contracts/L1/tiers/TierProviderV3.sol delete mode 100644 packages/protocol/contracts/L1/tiers/TierRouter.sol delete mode 100644 packages/protocol/contracts/L2/DelegateOwner.sol delete mode 100644 packages/protocol/contracts/L2/Lib1559Math.sol delete mode 100644 packages/protocol/contracts/L2/TaikoL2.sol delete mode 100644 packages/protocol/contracts/automata-attestation/README.md delete mode 100644 packages/protocol/contracts/compiled/FiatTokenProxy.json delete mode 100644 packages/protocol/contracts/compiled/FiatTokenV2_1.json delete mode 100644 packages/protocol/contracts/compiled/README.md rename packages/protocol/contracts/{ => layer1}/automata-attestation/AutomataDcapV3Attestation.sol (95%) create mode 100644 packages/protocol/contracts/layer1/automata-attestation/README.md rename packages/protocol/contracts/{ => layer1}/automata-attestation/interfaces/IAttestation.sol (80%) rename packages/protocol/contracts/{ => layer1}/automata-attestation/interfaces/ISigVerifyLib.sol (92%) rename packages/protocol/contracts/{ => layer1}/automata-attestation/lib/EnclaveIdStruct.sol (96%) rename packages/protocol/contracts/{ => layer1}/automata-attestation/lib/PEMCertChainLib.sol (97%) rename packages/protocol/contracts/{ => layer1}/automata-attestation/lib/QuoteV3Auth/V3Parser.sol (97%) rename packages/protocol/contracts/{ => layer1}/automata-attestation/lib/QuoteV3Auth/V3Struct.sol (98%) rename packages/protocol/contracts/{ => layer1}/automata-attestation/lib/TCBInfoStruct.sol (96%) rename packages/protocol/contracts/{ => layer1}/automata-attestation/lib/interfaces/IPEMCertChainLib.sol (97%) rename packages/protocol/contracts/{ => layer1}/automata-attestation/utils/Asn1Decode.sol (99%) rename packages/protocol/contracts/{ => layer1}/automata-attestation/utils/BytesUtils.sol (99%) rename packages/protocol/contracts/{ => layer1}/automata-attestation/utils/SHA1.sol (99%) rename packages/protocol/contracts/{ => layer1}/automata-attestation/utils/SigVerifyLib.sol (98%) rename packages/protocol/contracts/{ => layer1}/automata-attestation/utils/X509DateUtils.sol (99%) create mode 100644 packages/protocol/contracts/layer1/based/ITaikoL1.sol create mode 100644 packages/protocol/contracts/layer1/based/LibBonds.sol create mode 100644 packages/protocol/contracts/layer1/based/LibData.sol create mode 100644 packages/protocol/contracts/layer1/based/LibProposing.sol create mode 100644 packages/protocol/contracts/layer1/based/LibProving.sol create mode 100644 packages/protocol/contracts/layer1/based/LibUtils.sol create mode 100644 packages/protocol/contracts/layer1/based/LibVerifying.sol create mode 100644 packages/protocol/contracts/layer1/based/TaikoData.sol create mode 100644 packages/protocol/contracts/layer1/based/TaikoEvents.sol create mode 100644 packages/protocol/contracts/layer1/based/TaikoL1.sol create mode 100644 packages/protocol/contracts/layer1/devnet/DevnetTaikoL1.sol rename packages/protocol/contracts/{L1/tiers/DevnetTierProvider.sol => layer1/devnet/DevnetTierRouter.sol} (60%) create mode 100644 packages/protocol/contracts/layer1/fork/ForkManager.sol create mode 100644 packages/protocol/contracts/layer1/hekla/HeklaTaikoL1.sol create mode 100644 packages/protocol/contracts/layer1/hekla/HeklaTaikoToken.sol create mode 100644 packages/protocol/contracts/layer1/hekla/HeklaTierRouter.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/README.md create mode 100644 packages/protocol/contracts/layer1/mainnet/addrcache/AddressCache.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/addrcache/SharedAddressCache.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/multirollup/MainnetBridge.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSignalService.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/reentrylock/LibFasterReentryLock.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/rollup/MainnetProverSet.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/rollup/MainnetRollupAddressManager.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetRisc0Verifier.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSP1Verifier.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol create mode 100644 packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol create mode 100644 packages/protocol/contracts/layer1/preconf/README.md create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/impl/AVSDirectory.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/impl/DelegationManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/impl/Slasher.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/impl/StrategyManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol create mode 100644 packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol create mode 100644 packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol create mode 100644 packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol create mode 100644 packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol create mode 100644 packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol create mode 100644 packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol create mode 100644 packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol create mode 100644 packages/protocol/contracts/layer1/preconf/mock/MockTaikoToken.sol rename packages/protocol/contracts/{L1 => layer1}/provers/GuardianProver.sol (51%) create mode 100644 packages/protocol/contracts/layer1/provers/ProverSet.sol rename packages/protocol/contracts/{ => layer1}/team/airdrop/ERC20Airdrop.sol (98%) rename packages/protocol/contracts/{ => layer1}/team/airdrop/MerkleClaimable.sol (97%) rename packages/protocol/contracts/{ => layer1}/team/tokenunlock/TokenUnlock.sol (83%) rename packages/protocol/contracts/{L1 => layer1}/tiers/ITierProvider.sol (63%) rename packages/protocol/contracts/{L1 => layer1}/tiers/ITierRouter.sol (94%) create mode 100644 packages/protocol/contracts/layer1/tiers/LibTiers.sol create mode 100644 packages/protocol/contracts/layer1/tiers/TierProviderBase.sol rename packages/protocol/contracts/{tko => layer1/token}/TaikoToken.sol (65%) rename packages/protocol/contracts/{ => layer1}/verifiers/IVerifier.sol (55%) rename packages/protocol/contracts/{verifiers/libs => layer1/verifiers}/LibPublicInput.sol (94%) create mode 100644 packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol create mode 100644 packages/protocol/contracts/layer1/verifiers/SP1Verifier.sol create mode 100644 packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol rename packages/protocol/contracts/{verifiers/SgxVerifier.sol => layer1/verifiers/SgxVerifierBase.sol} (68%) create mode 100644 packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol create mode 100644 packages/protocol/contracts/layer1/verifiers/compose/TeeAnyVerifier.sol create mode 100644 packages/protocol/contracts/layer1/verifiers/compose/ZkAndTeeVerifier.sol create mode 100644 packages/protocol/contracts/layer1/verifiers/compose/ZkAnyVerifier.sol create mode 100644 packages/protocol/contracts/layer2/DelegateOwner.sol create mode 100644 packages/protocol/contracts/layer2/based/IBlockHash.sol create mode 100644 packages/protocol/contracts/layer2/based/LibEIP1559.sol rename packages/protocol/contracts/{L2 => layer2/based}/LibL2Config.sol (88%) create mode 100644 packages/protocol/contracts/layer2/based/TaikoL2.sol create mode 100644 packages/protocol/contracts/layer2/based/TaikoL2Deprecated.sol create mode 100644 packages/protocol/contracts/layer2/devnet/DevnetTaikoL2.sol create mode 100644 packages/protocol/contracts/layer2/hekla/HeklaTaikoL2.sol create mode 100644 packages/protocol/contracts/layer2/mainnet/MainnetTaikoL2.sol rename packages/protocol/contracts/{tko => layer2/token}/BridgedTaikoToken.sol (79%) delete mode 100644 packages/protocol/contracts/mainnet/L1RollupAddressManager.sol delete mode 100644 packages/protocol/contracts/mainnet/L1SharedAddressManager.sol rename packages/protocol/contracts/{ => shared}/bridge/Bridge.sol (80%) rename packages/protocol/contracts/{ => shared}/bridge/IBridge.sol (99%) rename packages/protocol/contracts/{ => shared}/bridge/IQuotaManager.sol (97%) rename packages/protocol/contracts/{ => shared}/bridge/QuotaManager.sol (93%) rename packages/protocol/contracts/{ => shared}/bridge/README.md (100%) rename packages/protocol/contracts/{ => shared}/common/AddressManager.sol (73%) rename packages/protocol/contracts/{ => shared}/common/AddressResolver.sol (66%) rename packages/protocol/contracts/{ => shared}/common/EssentialContract.sol (70%) rename packages/protocol/contracts/{ => shared}/common/IAddressManager.sol (96%) rename packages/protocol/contracts/{ => shared}/common/IAddressResolver.sol (87%) rename packages/protocol/contracts/{libs => shared/common}/LibAddress.sol (83%) rename packages/protocol/contracts/{libs => shared/common}/LibBytes.sol (94%) rename packages/protocol/contracts/{libs => shared/common}/LibMath.sol (83%) rename packages/protocol/contracts/{libs => shared/common}/LibNetwork.sol (59%) rename packages/protocol/contracts/{ => shared}/common/LibStrings.sol (67%) rename packages/protocol/contracts/{libs => shared/common}/LibTrieProof.sol (83%) create mode 100644 packages/protocol/contracts/shared/data/LibSharedData.sol rename packages/protocol/contracts/{ => shared}/signal/ISignalService.sol (94%) rename packages/protocol/contracts/{ => shared}/signal/SignalService.sol (94%) rename packages/protocol/contracts/{tko => shared/token}/TaikoTokenBase.sol (98%) rename packages/protocol/contracts/{ => shared}/tokenvault/BaseNFTVault.sol (99%) rename packages/protocol/contracts/{ => shared}/tokenvault/BaseVault.sol (98%) rename packages/protocol/contracts/{ => shared}/tokenvault/BridgedERC1155.sol (96%) rename packages/protocol/contracts/{ => shared}/tokenvault/BridgedERC20.sol (97%) create mode 100644 packages/protocol/contracts/shared/tokenvault/BridgedERC20V2.sol rename packages/protocol/contracts/{ => shared}/tokenvault/BridgedERC721.sol (96%) rename packages/protocol/contracts/{ => shared}/tokenvault/ERC1155Vault.sol (97%) rename packages/protocol/contracts/{ => shared}/tokenvault/ERC20Vault.sol (98%) rename packages/protocol/contracts/{ => shared}/tokenvault/ERC721Vault.sol (96%) rename packages/protocol/contracts/{ => shared}/tokenvault/IBridgedERC1155.sol (91%) rename packages/protocol/contracts/{ => shared}/tokenvault/IBridgedERC20.sol (61%) rename packages/protocol/contracts/{ => shared}/tokenvault/IBridgedERC721.sol (90%) rename packages/protocol/contracts/{ => shared}/tokenvault/LibBridgedToken.sol (98%) delete mode 100644 packages/protocol/contracts/team/proving/ProverSet.sol delete mode 100644 packages/protocol/contracts/thirdparty/README.md delete mode 100644 packages/protocol/contracts/thirdparty/optimism/Bytes.sol delete mode 100644 packages/protocol/contracts/thirdparty/optimism/rlp/RLPReader.sol delete mode 100644 packages/protocol/contracts/thirdparty/optimism/rlp/RLPWriter.sol delete mode 100644 packages/protocol/contracts/thirdparty/optimism/trie/MerkleTrie.sol delete mode 100644 packages/protocol/contracts/thirdparty/optimism/trie/SecureMerkleTrie.sol delete mode 100644 packages/protocol/contracts/thirdparty/risczero/IRiscZeroReceiptVerifier.sol delete mode 100644 packages/protocol/contracts/thirdparty/solmate/LibFixedPointMath.sol delete mode 100644 packages/protocol/contracts/verifiers/RiscZeroVerifier.sol create mode 100755 packages/protocol/script/gen-layouts.sh rename packages/protocol/script/{ => layer1}/AddSGXVerifierInstances.s.sol (86%) rename packages/protocol/script/{ => layer1}/DeployERC20Airdrop.s.sol (94%) create mode 100644 packages/protocol/script/layer1/DeployHeklaL2Contracts.s.sol rename packages/protocol/script/{ => layer1}/DeployLabsProverPool.s.sol (84%) rename packages/protocol/script/{DeployOnL1.s.sol => layer1/DeployProtocolOnL1.s.sol} (66%) create mode 100644 packages/protocol/script/layer1/DeployProverSet.s.sol rename packages/protocol/script/{DeployL1QuotaManager.s.sol => layer1/DeployQuotaManager.s.sol} (90%) create mode 100644 packages/protocol/script/layer1/DeployRisc0Verifier.s.sol create mode 100644 packages/protocol/script/layer1/DeploySP1Verifier.s.sol rename packages/protocol/script/{ => layer1}/DeployTaikoToken.s.sol (88%) create mode 100644 packages/protocol/script/layer1/SendMessageToDelegateOwner.s.sol rename packages/protocol/script/{ => layer1}/SetDcapParams.s.sol (94%) create mode 100644 packages/protocol/script/layer1/UpdateMainnetOntakeL1.s.sol create mode 100644 packages/protocol/script/layer1/UpdateRisc0Verifier.s.sol create mode 100644 packages/protocol/script/layer1/UpdateSP1Verifier.s.sol create mode 100644 packages/protocol/script/layer1/UpgradeHeklaOntakeL1.s.sol create mode 100644 packages/protocol/script/layer1/UpgradeHeklaOntakeL2.s.sol rename packages/protocol/script/{ => layer1}/config_dcap_sgx_verifier.sh (93%) create mode 100755 packages/protocol/script/layer1/deploy_protocol_on_l1.sh create mode 100644 packages/protocol/script/layer1/preconf/BaseScript.sol create mode 100644 packages/protocol/script/layer1/preconf/deployment/DeployAVS.s.sol create mode 100644 packages/protocol/script/layer1/preconf/deployment/DeployEigenlayerMVP.s.sol create mode 100644 packages/protocol/script/layer1/preconf/deployment/deploy_avs.sh create mode 100644 packages/protocol/script/layer1/preconf/deployment/deploy_eigenlayer_mvp.sh create mode 100644 packages/protocol/script/layer1/preconf/deployment/mock/DeployMockAVS.s.sol create mode 100644 packages/protocol/script/layer1/preconf/deployment/mock/DeployMockTaikoToken.s.sol create mode 100644 packages/protocol/script/layer1/preconf/misc/EmptyContract.sol rename packages/protocol/script/{ => layer1}/tokenunlock/Deploy.data.json (100%) rename packages/protocol/script/{ => layer1}/tokenunlock/Deploy.s.sol (73%) rename packages/protocol/script/{ => layer1}/tokenunlock/Vest.data.json (100%) create mode 100644 packages/protocol/script/layer1/tokenunlock/Vest.s.sol create mode 100644 packages/protocol/script/layer1/tokenunlock/exercise1.data.json create mode 100644 packages/protocol/script/layer2/DeployDelegateOwner.s.sol rename packages/protocol/script/{L2PostGenesisConfig.s.sol => layer2/PostGenesisConfig.s.sol} (94%) rename packages/protocol/script/{L2PostGenesisQuery.s.sol => layer2/PostGenesisQuery.s.sol} (93%) create mode 100644 packages/protocol/script/layer2/UpdateMainnetOntakeL2.s.sol delete mode 100644 packages/protocol/script/merge_contracts.py rename packages/protocol/script/{ => shared}/AuthorizeTaikoForMultihop.s.sol (85%) rename packages/protocol/script/{ => shared}/SetAddress.s.sol (92%) rename packages/protocol/script/{ => shared}/SetRemoteBridgeSuites.s.sol (97%) delete mode 100755 packages/protocol/script/test_deploy_on_l1.sh delete mode 100644 packages/protocol/script/tokenunlock/Vest.s.sol delete mode 100644 packages/protocol/script/upgrade/UpgradeAddressManager.s.sol delete mode 100644 packages/protocol/script/upgrade/UpgradeAssignmentHook.s.sol delete mode 100644 packages/protocol/script/upgrade/UpgradeBridge.s.sol delete mode 100644 packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol delete mode 100644 packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol delete mode 100644 packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol delete mode 100644 packages/protocol/script/upgrade/UpgradeGuardianProver.s.sol delete mode 100644 packages/protocol/script/upgrade/UpgradeScript.s.sol delete mode 100644 packages/protocol/script/upgrade/UpgradeSignalService.s.sol delete mode 100644 packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol delete mode 100644 packages/protocol/script/upgrade/UpgradeTierProvider.s.sol delete mode 100755 packages/protocol/script/upgrade_to.sh delete mode 100644 packages/protocol/test/L1/TaikoL1TestGroup6.t.sol delete mode 100644 packages/protocol/test/L2/Lib1559Math.t.sol delete mode 100644 packages/protocol/test/L2/TaikoL2.t.sol delete mode 100644 packages/protocol/test/L2/TaikoL2EIP1559Configurable.sol delete mode 100644 packages/protocol/test/L2/TaikoL2NoFeeCheck.t.sol delete mode 100644 packages/protocol/test/common/TestMulticall3.sol rename packages/protocol/{ => test}/genesis/GenerateGenesis.g.sol (92%) create mode 100644 packages/protocol/test/genesis/data/genesis_config.js create mode 100644 packages/protocol/test/genesis/data/genesis_config.json rename packages/protocol/{utils/generate_genesis => test/genesis/generate}/erc20.ts (97%) rename packages/protocol/{utils/generate_genesis/main.ts => test/genesis/generate/generate.ts} (82%) rename packages/protocol/{utils/generate_genesis => test/genesis/generate}/interface.ts (100%) rename packages/protocol/{utils/generate_genesis => test/genesis/generate}/taikoL2.ts (99%) rename packages/protocol/{utils/generate_genesis => test/genesis/generate}/utils.ts (99%) rename packages/protocol/{genesis/generate_genesis.test.sh => test/genesis/genesis.test.sh} (87%) rename packages/protocol/{ => test}/genesis/mainnet.js (100%) rename packages/protocol/{ => test}/genesis/test_config.js (95%) rename packages/protocol/{ => test}/genesis/testnet/docker-compose.yml (79%) rename packages/protocol/{ => test}/genesis/testnet/init_geth.sh (100%) rename packages/protocol/{ => test}/genesis/testnet/keyfile.json (100%) rename packages/protocol/{ => test}/genesis/testnet/password (100%) create mode 100644 packages/protocol/test/layer1/TaikoL1Test.sol rename packages/protocol/test/{ => layer1}/automata-attestation/AutomataDcapV3AttestationTest.t.sol (51%) create mode 100644 packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00706A100000.json rename packages/protocol/test/{ => layer1}/automata-attestation/assets/0424/tcb_00906ED50000.json (100%) rename packages/protocol/test/{ => layer1}/automata-attestation/assets/0424/tcb_00A067110000.json (100%) create mode 100644 packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_30606a000000.json rename packages/protocol/test/{ => layer1}/automata-attestation/assets/0923/identity.json (100%) rename packages/protocol/test/{ => layer1}/automata-attestation/assets/0923/tcb_00606A000000.json (100%) rename packages/protocol/test/{ => layer1}/automata-attestation/assets/0923/v3quote.json (100%) rename packages/protocol/test/{ => layer1}/automata-attestation/assets/complex.json (100%) rename packages/protocol/test/{ => layer1}/automata-attestation/common/AttestationBase.t.sol (89%) rename packages/protocol/test/{ => layer1}/automata-attestation/utils/DcapTestUtils.t.sol (95%) rename packages/protocol/test/{ => layer1}/automata-attestation/utils/V3QuoteParseUtils.t.sol (91%) rename packages/protocol/test/{L1 => layer1/based}/GuardianProver1.t.sol (94%) rename packages/protocol/test/{L1 => layer1/based}/GuardianProver2.t.sol (95%) create mode 100644 packages/protocol/test/layer1/based/MockTaikoL1.sol rename packages/protocol/test/{L1 => layer1/based}/TaikoL1.t.sol (70%) rename packages/protocol/test/{L1 => layer1/based}/TaikoL1LibProvingWithTiers.t.sol (70%) rename packages/protocol/test/{L1 => layer1/based}/TaikoL1TestBase.sol (65%) rename packages/protocol/test/{L1 => layer1/based}/TaikoL1TestGroup1.t.sol (61%) create mode 100644 packages/protocol/test/layer1/based/TaikoL1TestGroup10.t.sol create mode 100644 packages/protocol/test/layer1/based/TaikoL1TestGroup11.t.sol rename packages/protocol/test/{L1 => layer1/based}/TaikoL1TestGroup2.t.sol (59%) rename packages/protocol/test/{L1 => layer1/based}/TaikoL1TestGroup3.t.sol (67%) rename packages/protocol/test/{L1 => layer1/based}/TaikoL1TestGroup4.t.sol (64%) rename packages/protocol/test/{L1 => layer1/based}/TaikoL1TestGroup5.t.sol (68%) create mode 100644 packages/protocol/test/layer1/based/TaikoL1TestGroup6.t.sol rename packages/protocol/test/{L1 => layer1/based}/TaikoL1TestGroup7.t.sol (55%) rename packages/protocol/test/{L1 => layer1/based}/TaikoL1TestGroup8.t.sol (57%) create mode 100644 packages/protocol/test/layer1/based/TaikoL1TestGroup9.t.sol rename packages/protocol/test/{L1 => layer1/based}/TaikoL1TestGroupBase.sol (51%) rename packages/protocol/test/{L1/TestTierProvider.sol => layer1/based/TestTierRouter.sol} (77%) create mode 100644 packages/protocol/test/layer1/fork/ForkManager.t.sol create mode 100644 packages/protocol/test/layer1/preconf/BaseTest.sol create mode 100644 packages/protocol/test/layer1/preconf/beacon/BeaconProofsVerification.sol create mode 100644 packages/protocol/test/layer1/preconf/blocks/BlockProposing.t.sol create mode 100644 packages/protocol/test/layer1/preconf/bls/BLSExpandMsgXmd.t.sol create mode 100644 packages/protocol/test/layer1/preconf/bls/BLSHashToFieldFp2.t.sol create mode 100644 packages/protocol/test/layer1/preconf/bls/script-test/BLSHashToCurveG2.sol create mode 100644 packages/protocol/test/layer1/preconf/bls/script-test/BLSVerifySignature.sol create mode 100644 packages/protocol/test/layer1/preconf/fixtures/BeaconProofs.sol create mode 100644 packages/protocol/test/layer1/preconf/fixtures/BlocksFixtures.sol create mode 100644 packages/protocol/test/layer1/preconf/fixtures/LookaheadFixtures.sol create mode 100644 packages/protocol/test/layer1/preconf/lookahead/IncorrectLookahead.t.sol create mode 100644 packages/protocol/test/layer1/preconf/lookahead/LookaheadPosting.t.sol create mode 100644 packages/protocol/test/layer1/preconf/mocks/MockBeaconBlockRoot.sol create mode 100644 packages/protocol/test/layer1/preconf/mocks/MockPreconfRegistry.sol create mode 100644 packages/protocol/test/layer1/preconf/mocks/MockPreconfServiceManager.sol rename packages/protocol/test/{ => layer1}/team/airdrop/ERC20Airdrop.t.sol (98%) rename packages/protocol/test/{ => layer1}/team/airdrop/MerkleClaimable.t.sol (98%) rename packages/protocol/test/{ => layer1}/team/tokenunlock/TokenUnlock.t.sol (98%) rename packages/protocol/test/{mocks => layer1/verifiers}/MockPlonkVerifier.sol (84%) rename packages/protocol/test/{verifiers/RiscZeroVerifier.t.sol => layer1/verifiers/Risc0Verifier.t.sol} (81%) create mode 100644 packages/protocol/test/layer1/verifiers/RiscZeroGroth16Verifier.t.sol create mode 100644 packages/protocol/test/layer1/verifiers/SP1PlonkVerifier.t.sol create mode 100644 packages/protocol/test/layer1/verifiers/SP1Verifier.t.sol rename packages/protocol/test/{ => layer1}/verifiers/SgxVerifier.t.sol (78%) create mode 100644 packages/protocol/test/layer1/verifiers/compose/ComposeVerifeir.t.sol rename packages/protocol/test/{L2 => layer2}/DelegateOwner.t.sol (88%) create mode 100644 packages/protocol/test/layer2/LibEIP1559.t.sol rename packages/protocol/test/{L2 => layer2}/LibL2Signer.sol (98%) create mode 100644 packages/protocol/test/layer2/TaikoL2.t.sol create mode 100644 packages/protocol/test/layer2/TaikoL2Test.sol delete mode 100644 packages/protocol/test/libs/LibFixedPointMath.t.sol rename packages/protocol/test/{ => shared}/DeployCapability.sol (97%) rename packages/protocol/test/{ => shared}/HelperContracts.sol (90%) rename packages/protocol/test/{ => shared}/TaikoTest.sol (66%) rename packages/protocol/test/{ => shared}/bridge/Bridge.t.sol (96%) rename packages/protocol/test/{ => shared}/bridge/Bridge2.t.sol (98%) rename packages/protocol/test/{ => shared}/bridge/Bridge2_failMessage.t.sol (99%) rename packages/protocol/test/{ => shared}/bridge/Bridge2_processMessage.t.sol (99%) rename packages/protocol/test/{ => shared}/bridge/Bridge2_recallMessage.t.sol (99%) rename packages/protocol/test/{ => shared}/bridge/Bridge2_retryMessage.t.sol (99%) rename packages/protocol/test/{ => shared}/bridge/Bridge2_sendMessage.t.sol (97%) rename packages/protocol/test/{ => shared}/bridge/QuotaManager.t.sol (99%) rename packages/protocol/test/{ => shared}/common/AddressManager.t.sol (93%) rename packages/protocol/test/{ => shared}/common/AddressResolver.t.sol (92%) rename packages/protocol/test/{ => shared}/common/EssentialContract.t.sol (98%) rename packages/protocol/test/{libs => shared/common}/LibAddress.t.sol (98%) rename packages/protocol/test/{libs => shared/common}/LibTrieProof.t.sol (99%) rename packages/protocol/test/{ => shared}/signal/SignalService.t.sol (99%) rename packages/protocol/test/{ => shared}/thirdparty/LibUint512Math.sol (99%) create mode 100644 packages/protocol/test/shared/thirdparty/Multicall3.sol rename packages/protocol/test/{common/erc20 => shared/token}/FreeMintERC20.sol (95%) rename packages/protocol/test/{common/erc20 => shared/token}/MayFailFreeMintERC20.sol (98%) rename packages/protocol/test/{common/erc20 => shared/token}/RegularERC20.sol (90%) rename packages/protocol/test/{tokenvault/BridgedERC20.t.sol => shared/tokenvault/BridgedERC20V2.t.sol} (98%) rename packages/protocol/test/{ => shared}/tokenvault/ERC1155Vault.t.sol (99%) rename packages/protocol/test/{ => shared}/tokenvault/ERC20Vault.t.sol (99%) rename packages/protocol/test/{ => shared}/tokenvault/ERC721Vault.t.sol (99%) delete mode 100644 packages/protocol/test/thirdparty/LibFixedPointMath.t.sol delete mode 100644 packages/protocol/test/thirdparty/optimisim/Bytes.t.sol delete mode 100644 packages/protocol/test/thirdparty/optimisim/rlp/RLPReader.t.sol delete mode 100644 packages/protocol/test/thirdparty/optimisim/trie/SecureMerkleTrie.t.sol create mode 100644 packages/protocol/tsconfig.json delete mode 100644 packages/protocol/utils/airdrop/airdrop_db/example_claimList.json delete mode 100644 packages/protocol/utils/airdrop/buildMerkleTree.ts delete mode 100644 packages/relayer/ERC1155Vault.json delete mode 100644 packages/relayer/ERC20Vault.json delete mode 100644 packages/relayer/ERC721Vault.json delete mode 100644 packages/relayer/ICrossChainSync.json delete mode 100644 packages/relayer/QuotaManager.json delete mode 100644 packages/relayer/SignalService.json delete mode 100644 packages/relayer/db.go create mode 100644 packages/relayer/migrations/1708366667_alter_events_add_dest_owner.sql create mode 100644 packages/relayer/migrations/1708366668_index_data.sql create mode 100644 packages/relayer/migrations/1708366669_alert_events_is_profitable.sql delete mode 100644 packages/relayer/pkg/repo/db.go delete mode 100644 packages/snaefell-ui/src/lib/ipfs/config.ts delete mode 100644 packages/snaefell-ui/src/lib/util/isCountdownActive.ts create mode 100644 packages/supplementary-contracts/deployments/blacklist/hekla.json create mode 100644 packages/supplementary-contracts/deployments/blacklist/mainnet.json create mode 100644 packages/supplementary-contracts/script/utils/safe_batch_transfer.py delete mode 100644 packages/taiko-client/bindings/gen_assignment_hook.go create mode 100644 packages/taiko-client/bindings/metadata/interface.go create mode 100644 packages/taiko-client/bindings/metadata/metadata_legacy.go create mode 100644 packages/taiko-client/bindings/metadata/metadata_ontake.go create mode 100644 packages/taiko-client/driver/chain_syncer/blob/soft_block.go create mode 100644 packages/taiko-client/driver/soft_blocks/api.go create mode 100644 packages/taiko-client/driver/soft_blocks/server.go create mode 100644 packages/taiko-client/driver/soft_blocks/server_test.go create mode 100644 packages/taiko-client/integration_test/hive_test.go delete mode 100644 packages/taiko-client/internal/utils/test_utils.go create mode 100644 packages/taiko-client/pkg/config/chain_config.go delete mode 100644 packages/taiko-client/pkg/rpc/blob_datasource_test.go delete mode 100644 packages/taiko-client/pkg/rpc/fallback.go delete mode 100644 packages/taiko-client/pkg/rpc/fallback_test.go create mode 100644 packages/taiko-client/pkg/utils/txmgr_selector.go create mode 100644 packages/taiko-client/pkg/utils/txmgr_selector_test.go rename packages/taiko-client/{internal => pkg}/utils/util_test.go (93%) rename packages/taiko-client/{internal => pkg}/utils/utils.go (96%) delete mode 100644 packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector.go delete mode 100644 packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector_test.go delete mode 100644 packages/taiko-client/proposer/prover_selector/interface.go delete mode 100644 packages/taiko-client/proposer/transaction_builder/common.go delete mode 100644 packages/taiko-client/proposer/transaction_builder/common_test.go create mode 100644 packages/taiko-client/proposer/transaction_builder/fallback.go create mode 100644 packages/taiko-client/proposer/transaction_builder/fallback_test.go create mode 100644 packages/taiko-client/prover/proof_producer/zkvm_producer.go create mode 100644 packages/taiko-client/prover/proof_submitter/proof_buffer.go delete mode 100644 packages/taiko-client/prover/server/api.go delete mode 100644 packages/taiko-client/prover/server/api_test.go delete mode 100644 packages/taiko-client/prover/server/server.go delete mode 100644 packages/taiko-client/prover/server/server_test.go delete mode 100644 packages/taikoon-ui/src/components/sections/Countdown.section.svelte create mode 100644 packages/taikoon-ui/src/generated/whitelist/hekla.json delete mode 100644 packages/taikoon-ui/src/lib/ipfs/config.ts delete mode 100644 packages/taikoon-ui/src/lib/ipfs/get.ts create mode 100644 packages/taikoon-ui/src/lib/ipfs/httpGet.ts create mode 100644 packages/taikoon-ui/src/lib/util/calculateGasPrice.ts create mode 100644 packages/taikoon-ui/src/lib/util/isDevelopmentEnv.ts create mode 100644 taiko-deploy diff --git a/.github/_typos.toml b/.github/_typos.toml deleted file mode 100644 index d7fc0095f57..00000000000 --- a/.github/_typos.toml +++ /dev/null @@ -1,7 +0,0 @@ -[default.extend-words] -TGE = "TGE" -TKO = "TKO" -Ethereum = "Ethereum" - -[files] -extend-exclude = ["packages/protocol/audit"] \ No newline at end of file diff --git a/.github/actions/install-pnpm-dependencies/action.yml b/.github/actions/install-pnpm-dependencies/action.yml index 4f25f1d7908..e353f14dfa2 100644 --- a/.github/actions/install-pnpm-dependencies/action.yml +++ b/.github/actions/install-pnpm-dependencies/action.yml @@ -1,39 +1,25 @@ -name: "Install pnpm dependencies" -description: "Install pnpm dependencies" +name: Install pnpm dependencies +description: Reusable action to install pnpm dependencies runs: - using: "composite" + using: composite steps: - name: Set up Git to use HTTPS shell: bash run: | git config --global url."https://github.com/".insteadOf "git@github.com:" - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Install pnpm uses: pnpm/action-setup@v4 - id: pnpm-install with: version: 9 run_install: false - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - - name: Setup pnpm cache - uses: actions/cache@v4 + - name: Install Node.js + uses: actions/setup-node@v4 with: - path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- + node-version: 20 + cache: pnpm - name: Install dependencies shell: bash diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 7cb08e48c33..187d50f2309 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,13 +1,32 @@ +# Dependabot configuration for automated dependency updates. +# This file is the single source of truth and overrides any GitHub repo settings. +# +# Key features: +# - Monthly updates scheduled for Saturday 04:20 ET +# - Dependencies are grouped by ecosystem to minimize PR noise +# - Each group has designated reviewers and single PR limit +# - To ignore updates for a dependency, add to ecosystem's ignore field (and open +# a GitHub issue if needed for tracking): +# ignore: +# - dependency-name: "golang.org/x/crypto" # skip all crypto updates + version: 2 updates: - package-ecosystem: "gomod" directory: "/" schedule: - interval: "weekly" + interval: "monthly" day: "saturday" time: "04:20" timezone: "America/New_York" - open-pull-requests-limit: 10 + reviewers: + - "davidtaikocha" + - "RogerLamTd" + open-pull-requests-limit: 1 + groups: + go-updates: + patterns: + - "*" - package-ecosystem: "github-actions" directory: "/" @@ -16,13 +35,27 @@ updates: day: "saturday" time: "04:20" timezone: "America/New_York" - open-pull-requests-limit: 10 + reviewers: + - "davidtaikocha" + - "RogerLamTd" + open-pull-requests-limit: 1 + groups: + github-actions-updates: + patterns: + - "*" - package-ecosystem: "npm" directory: "/" schedule: - interval: "weekly" + interval: "monthly" day: "saturday" time: "04:20" timezone: "America/New_York" - open-pull-requests-limit: 10 + reviewers: + - "KorbinianK" + - "bearni95" + open-pull-requests-limit: 1 + groups: + npm-updates: + patterns: + - "*" diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Icon/taiko-icon-blk.svg b/.github/taiko-icon-blk.svg similarity index 100% rename from packages/branding/RGB SVG (For Digital Use)/Taiko Icon/taiko-icon-blk.svg rename to .github/taiko-icon-blk.svg diff --git a/.github/workflows/bridge-ui--ci.yml b/.github/workflows/bridge-ui--ci.yml index d270c524ece..4c1bb10c375 100644 --- a/.github/workflows/bridge-ui--ci.yml +++ b/.github/workflows/bridge-ui--ci.yml @@ -4,13 +4,16 @@ on: workflow_call jobs: build: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: - name: Cancel previous runs uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/bridge-ui.yml b/.github/workflows/bridge-ui.yml index ff942d2b9a1..b767a57be71 100644 --- a/.github/workflows/bridge-ui.yml +++ b/.github/workflows/bridge-ui.yml @@ -2,34 +2,42 @@ name: Bridge UI CI/CD on: push: + paths: + - "packages/bridge-ui/**" + branches-ignore: + - dependabot/** + - release-please--branches--** tags: - "bridge-ui-v*" + pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/bridge-ui/**" jobs: build-and-test: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} uses: ./.github/workflows/bridge-ui--ci.yml # Deployment name follow the pattern: deploy___ # Internal Devnet - deploy_bridge-ui_devnet_preview: - if: ${{ github.ref_type != 'tag' }} - needs: build-and-test - uses: ./.github/workflows/repo--vercel-deploy.yml - with: - environment: "preview" - flags: "" - secrets: - vercel_project_id: ${{ secrets.VERCEL_PROJECT_ID_BRIDGE_UI_INTERNAL }} - vercel_org_id: ${{ secrets.VERCEL_ORG_ID }} - vercel_token: ${{ secrets.VERCEL_TOKEN }} + # deploy_bridge-ui_devnet_preview: + # if: ${{ github.event_name == 'pull_request' && (contains(github.event.pull_request.labels.*.name, 'option.workflow_on') || github.event.pull_request.draft == false && github.head_ref != 'release-please-*') }} + # needs: build-and-test + # uses: ./.github/workflows/repo--vercel-deploy.yml + # with: + # environment: "preview" + # flags: "" + # secrets: + # vercel_project_id: ${{ secrets.VERCEL_PROJECT_ID_BRIDGE_UI_INTERNAL }} + # vercel_org_id: ${{ secrets.VERCEL_ORG_ID }} + # vercel_token: ${{ secrets.VERCEL_TOKEN }} # Hekla testnet deploy_bridge-ui_hekla_preview: - if: ${{ github.ref_type != 'tag' }} + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: @@ -54,7 +62,7 @@ jobs: # Mainnet deploy_bridge-ui_mainnet_preview: - if: ${{ github.ref_type != 'tag' }} + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: diff --git a/.github/workflows/docs-site--preview.yml b/.github/workflows/docs-site--preview.yml index 910fa4dc969..acd2226b733 100644 --- a/.github/workflows/docs-site--preview.yml +++ b/.github/workflows/docs-site--preview.yml @@ -5,17 +5,21 @@ env: VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID_DOCS_SITE }} on: - push: - branches-ignore: - - main - - release-please-* + pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/docs-site/**" + branches-ignore: + - release-please--branches--** jobs: deploy-docs-site-preview: - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.event.pull_request.head.repo.fork == false && github.actor != 'dependabot[bot]' }} + runs-on: [arc-runner-set] steps: + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/docs-site--production.yml b/.github/workflows/docs-site--production.yml index c450567596f..78e03a182a7 100644 --- a/.github/workflows/docs-site--production.yml +++ b/.github/workflows/docs-site--production.yml @@ -11,8 +11,11 @@ on: jobs: deploy-docs-site-production: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/eventindexer.yml b/.github/workflows/eventindexer.yml index 5f947171e48..a8ee1217846 100644 --- a/.github/workflows/eventindexer.yml +++ b/.github/workflows/eventindexer.yml @@ -6,19 +6,21 @@ on: paths: - "packages/eventindexer/**" pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/eventindexer/**" - - "go.mod" - - "go.sum" + branches-ignore: + - release-please--branches--** jobs: lint-eventindexer: name: lint-eventindexer - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please' && !startsWith(github.head_ref, 'refs/heads/dependabot/')) }} + runs-on: [arc-runner-set] steps: - uses: actions/setup-go@v5 with: - go-version: 1.21.0 + go-version: 1.23.0 - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v6 @@ -28,10 +30,11 @@ jobs: # Optional: working directory, useful for monorepos working-directory: ./packages/eventindexer - args: --config=.golangci.yml --timeout=4m + args: --config=.golangci.yml --timeout=10m test-eventindexer: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please' && !startsWith(github.head_ref, 'refs/heads/dependabot/')) }} needs: lint-eventindexer steps: - name: Cancel Previous Runs @@ -39,27 +42,34 @@ jobs: with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: ">=1.21.0" + go-version: ">=1.23.0" - name: eventindexer - Unit Tests working-directory: ./packages/eventindexer run: go test `go list ./... | grep -v ./contracts | grep -v ./mock | grep -v ./cmd` -coverprofile=coverage.txt -covermode=atomic - name: eventindexer - Upload coverage to Codecov - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: files: ./packages/eventindexer/coverage.txt flags: eventindexer push-eventindexer-docker-image: - if: ${{ github.event_name == 'pull_request' }} + # Skip dependabot PRs + if: ${{ github.event_name == 'pull_request' && ! startsWith(github.head_ref, 'refs/heads/dependabot/') && !startsWith(github.head_ref, 'release-please') && github.event.pull_request.head.repo.fork == false }} name: Build and push docker image - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout uses: actions/checkout@v4 with: @@ -91,9 +101,8 @@ jobs: type=sha - name: Build and push - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: - platforms: linux/amd64 push: true context: . tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/fork-diff--preview.yml b/.github/workflows/fork-diff--preview.yml index 64f4d69bca4..a93f356e107 100644 --- a/.github/workflows/fork-diff--preview.yml +++ b/.github/workflows/fork-diff--preview.yml @@ -5,18 +5,21 @@ env: VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID_FORK_DIFF }} on: - workflow_dispatch: - push: - branches-ignore: - - main - - release-please-* + pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/fork-diff/**" + branches-ignore: + - release-please--branches--** jobs: deploy-fork-diff-preview: - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} + runs-on: [arc-runner-set] steps: + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/fork-diff--production.yml b/.github/workflows/fork-diff--production.yml index fa9c9db3f1f..c8c7b7cbce2 100644 --- a/.github/workflows/fork-diff--production.yml +++ b/.github/workflows/fork-diff--production.yml @@ -12,8 +12,11 @@ on: jobs: deploy-fork-diff-production: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/guardian-prover-health-check-ui.yml b/.github/workflows/guardian-prover-health-check-ui.yml index 52edcb02cb3..f95cd350ad4 100644 --- a/.github/workflows/guardian-prover-health-check-ui.yml +++ b/.github/workflows/guardian-prover-health-check-ui.yml @@ -7,26 +7,30 @@ on: pull_request: paths: - "packages/guardian-prover-health-check-ui/**" + branches-ignore: + - release-please--branches--** jobs: build-and-test: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} uses: ./.github/workflows/guardian-prover-health-check-ui--ci.yml # Deployment name follow the pattern: deploy___ - deploy_guardians-ui_mainnet_preview: - if: ${{ github.ref_name != 'main' }} - needs: build-and-test - uses: ./.github/workflows/repo--vercel-deploy.yml - with: - environment: "preview" - flags: "" - secrets: - vercel_project_id: ${{ secrets.VERCEL_PROJECT_ID_GUARDIAN_UI_MAINNET }} - vercel_org_id: ${{ secrets.VERCEL_ORG_ID }} - vercel_token: ${{ secrets.VERCEL_TOKEN }} + + # deploy_guardians-ui_devnet_preview: + # if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') }} + # needs: build-and-test + # uses: ./.github/workflows/repo--vercel-deploy.yml + # with: + # environment: "preview" + # flags: "" + # secrets: + # vercel_project_id: ${{ secrets.VERCEL_PROJECT_ID_GUARDIAN_UI_INTERNAL }} + # vercel_org_id: ${{ secrets.VERCEL_ORG_ID }} + # vercel_token: ${{ secrets.VERCEL_TOKEN }} deploy_guardians-ui_hekla_preview: - if: ${{ github.ref_name != 'main' }} + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: @@ -37,15 +41,15 @@ jobs: vercel_org_id: ${{ secrets.VERCEL_ORG_ID }} vercel_token: ${{ secrets.VERCEL_TOKEN }} - deploy_guardians-ui_devnet_preview: - if: ${{ github.ref_name != 'main' }} + deploy_guardians-ui_mainnet_preview: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: environment: "preview" flags: "" secrets: - vercel_project_id: ${{ secrets.VERCEL_PROJECT_ID_GUARDIAN_UI_INTERNAL }} + vercel_project_id: ${{ secrets.VERCEL_PROJECT_ID_GUARDIAN_UI_MAINNET }} vercel_org_id: ${{ secrets.VERCEL_ORG_ID }} vercel_token: ${{ secrets.VERCEL_TOKEN }} diff --git a/.github/workflows/guardian-prover-health-check.yml b/.github/workflows/guardian-prover-health-check.yml index 6bbe33e603a..74277283274 100644 --- a/.github/workflows/guardian-prover-health-check.yml +++ b/.github/workflows/guardian-prover-health-check.yml @@ -8,17 +8,18 @@ on: pull_request: paths: - "packages/guardian-prover-health-check/**" - - "go.mod" - - "go.sum" + branches-ignore: + - release-please--branches--** jobs: lint-guardian-prover-health-check: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} name: lint-guardian-prover-health-check runs-on: [taiko-runner] steps: - uses: actions/setup-go@v5 with: - go-version: 1.21.0 + go-version: 1.23.0 - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v6 @@ -31,6 +32,7 @@ jobs: args: --config=.golangci.yml --timeout=4m test-guardian-prover-health-check: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} runs-on: [taiko-runner] needs: lint-guardian-prover-health-check steps: @@ -42,20 +44,21 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.0" + go-version: "1.23.0" - name: guardian-prover-health-check - Unit Tests working-directory: ./packages/guardian-prover-health-check run: go test `go list ./... | grep -v ./contracts | grep -v ./mock | grep -v ./cmd` -coverprofile=coverage.txt -covermode=atomic - name: guardian-prover-health-check - Upload coverage to Codecov - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: files: ./packages/guardian-prover-health-check/coverage.txt flags: guardian-prover-health-check push-guardian-prover-health-check-docker-image: - if: ${{ github.event_name == 'pull_request' }} + # Skip dependabot PRs + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' && github.event.pull_request.head.repo.fork == false }} name: Build and push docker image runs-on: [taiko-runner] @@ -91,9 +94,8 @@ jobs: type=sha - name: Build and push - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: - platforms: linux/amd64 push: true context: . tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/monitors.yml b/.github/workflows/monitors.yml new file mode 100644 index 00000000000..c7fadee635d --- /dev/null +++ b/.github/workflows/monitors.yml @@ -0,0 +1,40 @@ +name: Monitors + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + paths: + - "packages/monitors/**" + - "!packages/monitors/**/*.md" + branches-ignore: + - release-please--branches--** + +jobs: + deploy-protocol-monitors: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} + runs-on: [taiko-runner] + permissions: + # Give the necessary permissions for stefanzweifel/git-auto-commit-action. + contents: write + steps: + - name: Cancel previous runs + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install pnpm dependencies + uses: ./.github/actions/install-pnpm-dependencies + + - name: Deploy Monitors on OZ Defender + working-directory: packages/monitors/defender/mainnet + env: + DEFENDER_API_KEY: ${{ secrets.DEFENDER_API_KEY }} + DEFENDER_API_SECRET: ${{ secrets.DEFENDER_API_SECRET }} + SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }} + run: | + npx serverless deploy diff --git a/.github/workflows/nfts.yml b/.github/workflows/nfts.yml index 1ee342819fa..269caac6802 100644 --- a/.github/workflows/nfts.yml +++ b/.github/workflows/nfts.yml @@ -1,23 +1,27 @@ name: NFTs on: - push: - branches: [main] - paths: - - "packages/nfts/**" pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/nfts/**" + - "!packages/nfts/contract_layout_*" + branches-ignore: + - release-please--branches--** jobs: build-nfts-contracts: - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') }} + runs-on: [arc-runner-set] steps: - name: Cancel previous runs uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 with: @@ -29,9 +33,9 @@ jobs: - name: Install pnpm dependencies uses: ./.github/actions/install-pnpm-dependencies - - name: Check formatting + - name: Format solidity && update contract layout table working-directory: ./packages/nfts - run: forge fmt --check + run: pnpm layout && forge fmt - name: Solidity compilation working-directory: ./packages/nfts diff --git a/.github/workflows/protocol.yml b/.github/workflows/protocol.yml index c27a94d479e..852364b0779 100644 --- a/.github/workflows/protocol.yml +++ b/.github/workflows/protocol.yml @@ -1,17 +1,22 @@ name: Protocol on: - push: - branches: [main] - paths: - - "packages/protocol/**" pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/protocol/**" + - "!packages/protocol/contract_layout_*" + - "!packages/protocol/audit/**" + - "!packages/protocol/docs/**" + - "!packages/protocol/simulation/**" + - "!packages/protocol/deployments/**" + branches-ignore: + - release-please--branches--** jobs: build-protocol: - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} + runs-on: [arc-runner-set] permissions: # Give the necessary permissions for stefanzweifel/git-auto-commit-action. contents: write @@ -21,6 +26,10 @@ jobs: with: access_token: ${{ github.token }} + - name: Prepare environment + continue-on-error: true + run: sudo apt-get update && sudo apt-get install -y git wget + - name: Checkout repository uses: actions/checkout@v4 with: @@ -32,32 +41,60 @@ jobs: - name: Install pnpm dependencies uses: ./.github/actions/install-pnpm-dependencies - - name: Unit tests + - name: Clean up and fmt working-directory: ./packages/protocol - run: pnpm clean && pnpm test + run: pnpm clean && forge fmt - - name: Format solidity && update contract layout table + - name: L2-Unit tests working-directory: ./packages/protocol - run: pnpm layout && forge fmt + run: pnpm compile:l2 && pnpm test:l2 && pnpm layout:l2 + + - name: L1-Unit tests + working-directory: ./packages/protocol + run: pnpm compile:l1 && pnpm test:l1 && pnpm layout:l1 - name: Commit contract layout table uses: stefanzweifel/git-auto-commit-action@v5 with: - commit_message: "forge fmt & update contract layout table" - - - name: Generate genesis - working-directory: ./packages/protocol - run: pnpm test:genesis - - - name: Run snapshot (Foundry) - working-directory: ./packages/protocol - run: pnpm snapshot + commit_message: "forge fmt & update contract layout tables" - - name: Deploy L1 contracts + - name: L1-Deploy contracts working-directory: ./packages/protocol + timeout-minutes: 2 run: | anvil --hardfork cancun & - while ! nc -z localhost 8545; do + until cast chain-id --rpc-url "http://localhost:8545" 2> /dev/null; do sleep 1 done - pnpm test:deploy + pnpm test:deploy:l1 + + genesis-docker: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} + runs-on: [taiko-runner] + permissions: + # Give the necessary permissions for stefanzweifel/git-auto-commit-action. + contents: write + steps: + - name: Cancel previous runs + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1.2.0 + + - name: Install pnpm dependencies + uses: ./.github/actions/install-pnpm-dependencies + + - name: Compile + working-directory: ./packages/protocol + run: pnpm clean && pnpm compile + + - name: L2-Generate Genesis (using docker) + working-directory: ./packages/protocol + run: pnpm genesis:test diff --git a/.github/workflows/relayer.yml b/.github/workflows/relayer.yml index e8f334219f9..1c84fd58801 100644 --- a/.github/workflows/relayer.yml +++ b/.github/workflows/relayer.yml @@ -6,19 +6,21 @@ on: paths: - "packages/relayer/**" pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/relayer/**" - - "go.mod" - - "go.sum" + branches-ignore: + - release-please--branches--** jobs: lint-relayer: name: lint-relayer - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && !startsWith(github.head_ref, 'refs/heads/dependabot/')}} + runs-on: [arc-runner-set] steps: - uses: actions/setup-go@v5 with: - go-version: 1.21.0 + go-version: 1.23.0 - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v6 @@ -31,7 +33,8 @@ jobs: args: --config=.golangci.yml --timeout=4m test-relayer: - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && !startsWith(github.head_ref, 'refs/heads/dependabot/') }} + runs-on: [arc-runner-set] needs: lint-relayer steps: - name: Cancel Previous Runs @@ -39,27 +42,34 @@ jobs: with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.0" + go-version: "1.23.0" - name: relayer - Unit Tests working-directory: ./packages/relayer run: go test `go list ./... | grep -v ./contracts | grep -v ./mock | grep -v ./cmd` -coverprofile=coverage.txt -covermode=atomic - name: relayer - Upload coverage to Codecov - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: files: ./packages/relayer/coverage.txt flags: relayer push-relayer-docker-image: - if: ${{ github.event_name == 'pull_request' }} + # Skip dependabot PRs + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && !startsWith(github.head_ref, 'refs/heads/dependabot/') && github.event.pull_request.head.repo.fork == false }} name: Build and push docker image - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout uses: actions/checkout@v4 with: @@ -91,9 +101,8 @@ jobs: type=sha - name: Build and push - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: - platforms: linux/amd64 push: true context: . tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/repo--auto-approve-pr.yml b/.github/workflows/repo--auto-approve-pr.yml index eb73dc2ad40..7fc2d401c33 100644 --- a/.github/workflows/repo--auto-approve-pr.yml +++ b/.github/workflows/repo--auto-approve-pr.yml @@ -1,12 +1,16 @@ name: Auto Approve PR -on: pull_request_target +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + branches-ignore: + - release-please--branches--** jobs: auto-approve: - runs-on: ubuntu-latest + if: github.event.pull_request.draft == false && github.actor == 'dependabot[bot]' + runs-on: [arc-runner-set] permissions: pull-requests: write - if: github.actor == 'dependabot[bot]' steps: - uses: hmarr/auto-approve-action@v4 diff --git a/.github/workflows/repo--check-links.yml b/.github/workflows/repo--check-links.yml new file mode 100644 index 00000000000..44be99f6d9a --- /dev/null +++ b/.github/workflows/repo--check-links.yml @@ -0,0 +1,20 @@ +name: Check links + +on: + push: + paths: + - "**/README.md" + - docs/** + +jobs: + check-links: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Check links + uses: lycheeverse/lychee-action@v2 + with: + args: --no-progress --verbose "**/README.md" diff --git a/.github/workflows/repo--close-inactive-issues.yml b/.github/workflows/repo--close-inactive-issues.yml deleted file mode 100644 index 7775bdf73ec..00000000000 --- a/.github/workflows/repo--close-inactive-issues.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Close Inactive Issues - -on: - schedule: - - cron: "30 1 * * *" - -jobs: - close-issues: - runs-on: ubuntu-latest - permissions: - issues: write - pull-requests: write - steps: - - uses: actions/stale@v9 - with: - days-before-issue-stale: 30 - days-before-issue-close: 7 - stale-issue-label: "stale" - stale-issue-message: "This issue is stale because it has been open for 30 days with no activity." - close-issue-message: "This issue was closed because it has been inactive for a week since being marked as stale." - days-before-pr-stale: -1 - days-before-pr-close: -1 - repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/repo--do-not-merge-pr.yml b/.github/workflows/repo--do-not-merge-pr.yml new file mode 100644 index 00000000000..b3e8484c8d6 --- /dev/null +++ b/.github/workflows/repo--do-not-merge-pr.yml @@ -0,0 +1,20 @@ +name: Check for "option.do-not-merge" Label + +on: + pull_request: + types: [labeled, unlabeled, synchronize, opened, reopened] + +jobs: + check_label: + if: github.event.pull_request.draft == false + runs-on: [arc-runner-set] + steps: + - name: Check for "option.do-not-merge" label + id: check_label + uses: actions/github-script@v7 + with: + script: | + const labels = context.payload.pull_request.labels.map(label => label.name); + if (labels.includes("option.do-not-merge")) { + core.setFailed('The "option.do-not-merge" label is present. PR cannot be merged.'); + } diff --git a/.github/workflows/repo--merge-gatekeeper.yml b/.github/workflows/repo--merge-gatekeeper.yml new file mode 100644 index 00000000000..795a81aa7cf --- /dev/null +++ b/.github/workflows/repo--merge-gatekeeper.yml @@ -0,0 +1,21 @@ +name: Merge Gatekeeper + +on: + pull_request: + branches: + - main + merge_group: # Trigger in merge queue to pass the required status check + +jobs: + merge-gatekeeper: + if: ${{ github.event_name == 'pull_request' && github.event.pull_request.draft == false }} + runs-on: [arc-runner-set] + permissions: + checks: read + statuses: read + steps: + - name: Run Merge Gatekeeper + uses: upsidr/merge-gatekeeper@v1 + with: + timeout: 1200 + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/repo--release-please.yml b/.github/workflows/repo--release-please.yml index 10a4bb7af6b..99559795b17 100644 --- a/.github/workflows/repo--release-please.yml +++ b/.github/workflows/repo--release-please.yml @@ -11,8 +11,8 @@ permissions: jobs: release-please: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: - - uses: google-github-actions/release-please-action@v4 + - uses: googleapis/release-please-action@v4 with: token: ${{ secrets.RELEASE_PLEASE_TOKEN }} diff --git a/.github/workflows/repo--typo-check.yml b/.github/workflows/repo--typo-check.yml index 415c8be1e64..503638d100f 100644 --- a/.github/workflows/repo--typo-check.yml +++ b/.github/workflows/repo--typo-check.yml @@ -4,12 +4,17 @@ on: [pull_request] jobs: check-for-typos: - runs-on: [taiko-runner] + if: ${{ contains(github.event.pull_request.labels.*.name, 'option.workflow_on') || github.event.pull_request.draft == false && github.head_ref != 'release-please-*' && github.actor != 'dependabot[bot]' }} + runs-on: [arc-runner-set] + steps: - name: Checkout the repository uses: actions/checkout@v4 + - name: Install wget + run: sudo apt-get update && sudo apt-get install -y wget + - name: Check for typos uses: crate-ci/typos@master with: - config: ${{github.workspace}}/.github/_typos.toml + config: ${{github.workspace}}/_typos.toml diff --git a/.github/workflows/repo--validate-pr-title.yml b/.github/workflows/repo--validate-pr-title.yml index 7112ecbb60e..87ff98d7cfb 100644 --- a/.github/workflows/repo--validate-pr-title.yml +++ b/.github/workflows/repo--validate-pr-title.yml @@ -5,16 +5,13 @@ on: types: - opened - edited - - synchronize - push: - branches: - - release-please-* # Trigger for release-please PRs, but skip the job - merge_group: # Trigger in the merge queue, but skip the job + +if: false # skipping for preconf-taiko-mono jobs: validate-pr-title: - if: github.event_name == 'pull_request_target' - runs-on: [taiko-runner] + if: contains(github.event.pull_request.labels.*.name, 'option.workflow_on') || github.event.pull_request.draft == false && github.head_ref != 'release-please-*' + runs-on: [arc-runner-set] steps: - uses: amannn/action-semantic-pull-request@v5 env: diff --git a/.github/workflows/repo--vercel-deploy.yml b/.github/workflows/repo--vercel-deploy.yml index 1c5ad381386..ff61914bdfc 100644 --- a/.github/workflows/repo--vercel-deploy.yml +++ b/.github/workflows/repo--vercel-deploy.yml @@ -26,8 +26,16 @@ env: jobs: build-deploy: - runs-on: [taiko-runner] + if: ${{ github.actor != 'dependabot' && github.event.pull_request.head.repo.fork == false }} + runs-on: [arc-runner-set] steps: + - name: Print Vercel Project ID + run: | + echo "Vercel Project ID: ${{ env.VERCEL_PROJECT_ID }}" + + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/snaefell-ui--ci.yml b/.github/workflows/snaefell-ui--ci.yml index 59eb8b0481a..0ac40398279 100644 --- a/.github/workflows/snaefell-ui--ci.yml +++ b/.github/workflows/snaefell-ui--ci.yml @@ -4,13 +4,16 @@ on: workflow_call jobs: build: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: - name: Cancel previous runs uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 with: diff --git a/.github/workflows/snaefell-ui.yml b/.github/workflows/snaefell-ui.yml index 43d378d8dae..7a0971ca25c 100644 --- a/.github/workflows/snaefell-ui.yml +++ b/.github/workflows/snaefell-ui.yml @@ -1,20 +1,17 @@ name: Snaefell UI CI/CD on: - push: - tags: - - "snaefull-ui-v*" - pull_request: - paths: - - "packages/snaefell-ui/**" + workflow_dispatch: jobs: build-and-test: + if: ${{ github.actor != 'dependabot[bot]' }} uses: ./.github/workflows/snaefell-ui--ci.yml # Deployment name follow the pattern: deploy___ + # The following Vercel project is not found, so disable it at least for now. deploy_snaefell-ui_mainnet_preview: - if: ${{ github.ref_name != 'main' }} + if: ${{ github.actor != 'dependabot[bot]' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: @@ -26,7 +23,7 @@ jobs: vercel_token: ${{ secrets.VERCEL_TOKEN }} deploy_snaefell-ui_mainnet_production: - if: ${{ startsWith(github.ref, 'refs/tags/snaefull-ui-v') }} + if: ${{ github.actor != 'dependabot[bot]' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: diff --git a/.github/workflows/supplementary-contracts.yml b/.github/workflows/supplementary-contracts.yml index 5f144d0c9e7..1fb4203d178 100644 --- a/.github/workflows/supplementary-contracts.yml +++ b/.github/workflows/supplementary-contracts.yml @@ -1,23 +1,26 @@ name: Supplementary Contracts on: - push: - branches: [main] - paths: - - "packages/supplementary-contracts/**" pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/supplementary-contracts/**" + branches-ignore: + - release-please--branches--** jobs: build-supplementary-contracts: - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') }} + runs-on: [arc-runner-set] steps: - name: Cancel previous runs uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 with: diff --git a/.github/workflows/taiko-client--docker.yml b/.github/workflows/taiko-client--docker.yml index 8159d5a3340..da509987b15 100644 --- a/.github/workflows/taiko-client--docker.yml +++ b/.github/workflows/taiko-client--docker.yml @@ -1,73 +1,131 @@ -name: "Push docker image to GAR" +name: "Build and Push Multi-Arch Docker Image" on: push: - branches: [main] + branches: [main, preconf-driver-apis] tags: - - "taiko-client-v*" + - "taiko-alethia-client-v*" paths: - "packages/taiko-client/**" +env: + REGISTRY_IMAGE: us-docker.pkg.dev/evmchain/images/taiko-client + jobs: - push-docker-image: + build: name: Build and push docker image - runs-on: ubuntu-latest + strategy: + matrix: + include: + - runner: arc-runner-set + platform: linux/amd64 + - runner: arc-runner-set-arm64 + platform: linux/arm64 + + runs-on: ${{ matrix.runner }} steps: + - name: Prepare Environment + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + sudo apt-get update && sudo apt-get install -y git + - name: Checkout uses: actions/checkout@v4 - name: Login to GAR - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: us-docker.pkg.dev username: _json_key password: ${{ secrets.GAR_JSON_KEY }} - name: Set up QEMU - uses: docker/setup-qemu-action@v1 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v3 - name: Docker meta id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: - images: | - us-docker.pkg.dev/evmchain/images/taiko-client + images: ${{ env.REGISTRY_IMAGE }} tags: | type=ref,event=branch type=ref,event=pr type=ref,event=tag type=sha - - name: Cache Go build - uses: actions/cache@v4 - with: - path: | - ${{ runner.os }}-go_build-platforms - key: ${{ runner.os }}-go_build-platforms - restore-keys: | - ${{ runner.os }}-go_build-platforms - - - name: Inject cache into docker - uses: reproducible-containers/buildkit-cache-dance@v3.1.0 - with: - cache-map: | - { - "${{ runner.os }}-go_build-platforms": "/root/.cache/go-build" - } - skip-extraction: ${{ steps.cache.outputs.cache-hit }} - - - name: Build and push - uses: docker/build-push-action@v2 + - name: Build and push by digest + id: build + uses: docker/build-push-action@v6 with: context: . - cache-from: type=gha - cache-to: type=gha,mode=max file: packages/taiko-client/Dockerfile - platforms: linux/amd64,linux/arm64 + platforms: ${{ matrix.platform }} push: true - tags: ${{ steps.meta.outputs.tags }} + tags: ${{ env.REGISTRY_IMAGE }} labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + + - name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: arc-runner-set + needs: + - build + steps: + - name: Prepare Environment + run: sudo apt-get update && sudo apt-get install -y jq + + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: /tmp/digests + pattern: digests-* + merge-multiple: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + tags: | + type=ref,event=branch + type=ref,event=pr + type=ref,event=tag + type=sha + + - name: Login to GAR + uses: docker/login-action@v3 + with: + registry: us-docker.pkg.dev + username: _json_key + password: ${{ secrets.GAR_JSON_KEY }} + + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} diff --git a/.github/workflows/taiko-client--hive-test.yml b/.github/workflows/taiko-client--hive-test.yml new file mode 100644 index 00000000000..0a488e9f1cc --- /dev/null +++ b/.github/workflows/taiko-client--hive-test.yml @@ -0,0 +1,44 @@ +name: "Taiko Client Hive Tests" + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + paths: + - "packages/taiko-client/**" + - "go.mod" + - "go.sum" + branches-ignore: + - release-please--branches--** + +jobs: + hive_tests: + if: ${{ github.event.pull_request.draft == false && contains(github.event.pull_request.labels.*.name, 'option.hive-test') }} + name: hive tests + runs-on: [arc-runner-set] + timeout-minutes: 40 + + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + + - uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: 1.23 + cache: true + + - name: Clone taikoxyz/hive + run: git clone https://github.com/taikoxyz/hive.git /tmp/hive + + - name: Hive tests + working-directory: packages/taiko-client + run: | + export HIVE_DIR=/tmp/hive + go test -v -p=1 ./integration_test -timeout=2400s diff --git a/.github/workflows/taiko-client--pages.yml b/.github/workflows/taiko-client--pages.yml new file mode 100644 index 00000000000..6a829504df9 --- /dev/null +++ b/.github/workflows/taiko-client--pages.yml @@ -0,0 +1,63 @@ +name: "Taiko Client Github Pages" + +on: + push: + branches: [main] + paths: + - "packages/taiko-client/**" + +jobs: + swagger-gen: + runs-on: [arc-runner-set] + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: main + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: "1.23" + + - name: Install swaggo + run: | + export CGO_ENABLED=0 + go install github.com/swaggo/swag/cmd/swag@latest + + - name: Generate Swagger documentation + run: | + export CGO_ENABLED=0 + cd packages/taiko-client + ./scripts/gen_swagger_json.sh + + - name: Commit Swagger docs + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + if ! git diff --quiet; then + git add -u + git commit -m "Update Swagger documentation" + git push origin HEAD:${{ github.ref_name }} + else + echo "No changes to commit" + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + deploy: + runs-on: [arc-runner-set] + needs: swagger-gen + permissions: + contents: write + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: packages/taiko-client/docs # Set this to where your `index.html` is located + publish_branch: gh-pages + destination_dir: soft-block-apis diff --git a/.github/workflows/taiko-client--test.yml b/.github/workflows/taiko-client--test.yml index 44664f18a40..ce1fc48cfbc 100644 --- a/.github/workflows/taiko-client--test.yml +++ b/.github/workflows/taiko-client--test.yml @@ -1,40 +1,50 @@ name: "CI" on: - push: - branches: [main] - paths: - - "packages/taiko-client/**" pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/taiko-client/**" - "go.mod" - "go.sum" + - "!**/*.md" + branches-ignore: + - release-please--branches--** jobs: lint: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} name: Lint - runs-on: ubuntu-latest + runs-on: [ubuntu-latest] steps: - uses: actions/checkout@v4 - name: Set up Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: - go-version: 1.21 + go-version: 1.23 cache: true + - name: Install golangci-lint + run: go install -v github.com/golangci/golangci-lint/cmd/golangci-lint@v1.60.0 + - name: Lint working-directory: packages/taiko-client - run: make lint + run: golangci-lint run --path-prefix=./ --config=.golangci.yml integration_tests: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') }} name: Integration tests - runs-on: ubuntu-latest + runs-on: [ubuntu-latest] + timeout-minutes: 15 + + strategy: + matrix: + execution_node: [l2_geth] steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.11.0 + uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} @@ -44,19 +54,21 @@ jobs: uses: foundry-rs/foundry-toolchain@v1 - name: Set up Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: - go-version: 1.21 + go-version: 1.23 cache: true - name: Install pnpm dependencies uses: ./.github/actions/install-pnpm-dependencies - - name: Test + - name: Run Tests on ${{ matrix.execution_node }} execution engine working-directory: packages/taiko-client + env: + L2_NODE: ${{ matrix.execution_node }} run: make test - name: Codecov.io - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v5 with: files: packages/taiko-client/coverage.out diff --git a/.github/workflows/taikoon-ui--ci.yml b/.github/workflows/taikoon-ui--ci.yml index 8aecc97c8bd..7088ceb84f7 100644 --- a/.github/workflows/taikoon-ui--ci.yml +++ b/.github/workflows/taikoon-ui--ci.yml @@ -4,13 +4,16 @@ on: workflow_call jobs: build: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: - name: Cancel previous runs uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 with: diff --git a/.github/workflows/taikoon-ui.yml b/.github/workflows/taikoon-ui.yml index c62bccee488..68dcd504654 100644 --- a/.github/workflows/taikoon-ui.yml +++ b/.github/workflows/taikoon-ui.yml @@ -1,12 +1,6 @@ name: Taikoon UI CI/CD - on: - push: - tags: - - "taikoon-ui-v*" - pull_request: - paths: - - "packages/taikoon-ui/**" + workflow_dispatch: jobs: build-and-test: @@ -14,7 +8,6 @@ jobs: # Deployment name follow the pattern: deploy___ deploy_taikoon-ui_mainnet_preview: - if: ${{ github.ref_name != 'main' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: @@ -26,7 +19,6 @@ jobs: vercel_token: ${{ secrets.VERCEL_TOKEN }} deploy_taikoon-ui_mainnet_production: - if: ${{ startsWith(github.ref, 'refs/tags/taikoon-ui-v') }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: diff --git a/.github/workflows/ui-lib--ci.yml b/.github/workflows/ui-lib--ci.yml index 46160239765..9dc97e4b1c2 100644 --- a/.github/workflows/ui-lib--ci.yml +++ b/.github/workflows/ui-lib--ci.yml @@ -4,13 +4,16 @@ on: workflow_call jobs: build: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: - name: Cancel previous runs uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 with: diff --git a/.gitignore b/.gitignore index 86e934589eb..0d0cf5a22b0 100644 --- a/.gitignore +++ b/.gitignore @@ -116,7 +116,6 @@ __pycache__/ # VSCode .vscode/launch.json -packages/protocol/config.js .vercel # Idea diff --git a/.release-please-manifest.json b/.release-please-manifest.json index d66f6fee1f1..f9eeba087e8 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,17 +1,15 @@ { - "packages/branding": "0.4.0", - "packages/bridge-ui": "2.11.0", - "packages/docs-site": "1.9.0", + "packages/bridge-ui": "2.13.0", + "packages/docs-site": "1.21.2", "packages/eventindexer": "0.13.0", - "packages/fork-diff": "0.6.0", + "packages/fork-diff": "0.6.1", "packages/guardian-prover-health-check": "0.1.0", - "packages/guardian-prover-health-check-ui": "0.1.0", - "packages/protocol": "1.6.0", + "packages/guardian-prover-health-check-ui": "0.2.0", + "packages/protocol": "1.11.0", "packages/relayer": "0.12.0", - "packages/taiko-client": "0.25.0", - "packages/nfts": "1.0.0", + "packages/snaefell-ui": "1.1.0", "packages/supplementary-contracts": "1.0.0", - "packages/taikoon-ui": "1.0.0", - "packages/ui-lib": "1.0.0", - "packages/snaefell-ui": "1.0.0" + "packages/taiko-client": "0.42.1", + "packages/taikoon-ui": "1.3.0", + "packages/ui-lib": "1.0.0" } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5c6e590f4db..a31271e28fb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,7 +26,7 @@ This section describes our coding standards at Taiko. **It is important you use the correct commit type**. For minor semver bumps, use `feat`, for patches use `fix`. For a major bump use `feat(scope)!` or `fix(scope)!`. If you use `chore`, `docs`, or `ci`, then it won't result in a release-please PR or version bump. -Specify the scope of your change with a [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/) in the PR title (for example, `feat(scope): description of feature`). This will be squashed and merged into the `main` branch. You can find the full list of allowed scopes [here](https://github.com/taikoxyz/taiko-mono/blob/main/.github/workflows/validate-pr-title.yml). +Specify the scope of your change with a [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/) in the PR title (for example, `feat(scope): description of feature`). This will be squashed and merged into the `main` branch. You can find the full list of allowed scopes [here](https://github.com/taikoxyz/taiko-mono/blob/main/.github/workflows/repo--validate-pr-title.yml). Because we squash all of the changes into a single commit, please try to keep the PR limited to the scope specified in the commit message. This commit message will end up in the automated changelog by checking which packages are affected by the commit. diff --git a/Dockerfile b/Dockerfile index a1d52db69d5..106561266b2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ ARG PACKAGE=eventindexer -FROM golang:1.21.0 as builder +FROM golang:1.23.0 AS builder ARG PACKAGE @@ -27,4 +27,4 @@ RUN apk add --no-cache ca-certificates COPY --from=builder /taiko-mono/packages/${PACKAGE}/bin/${PACKAGE} /usr/local/bin/ -ENTRYPOINT /usr/local/bin/${PACKAGE} \ No newline at end of file +ENTRYPOINT /usr/local/bin/${PACKAGE} diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000000..876c140821d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023–present Taiko Labs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 8ccef57ef1d..00000000000 --- a/LICENSE.md +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright 2023 Taiko Labs - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 24413da7ef7..8ba1fea61f9 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@

- Logo for Taiko + Logo for Taiko

- Taiko + Taiko Alethia

- A based rollup. + The first based rollup.

@@ -17,40 +17,43 @@ [![YouTube](https://img.shields.io/youtube/channel/subscribers/UCxd_ARE9LtAEdnRQA6g1TaQ)](https://www.youtube.com/@taikoxyz) [![GitPOAP Badge](https://public-api.gitpoap.io/v1/repo/taikoxyz/taiko-mono/badge)](https://www.gitpoap.io/gh/taikoxyz/taiko-mono) -[![License](https://img.shields.io/github/license/taikoxyz/taiko-mono)](https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md) +[![License](https://img.shields.io/github/license/taikoxyz/taiko-mono)](https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE)
## Documentation -End user documentation can be found at [docs.taiko.xyz](https://docs.taiko.xyz). Protocol specs can be found [here](./packages/protocol/docs/README.md). - -Each package of the monorepo is well documented and includes a README. - -## Project structure - -
-taiko-mono/
-├── CHANGELOG.md
-├── CONTRIBUTING.md
-├── LICENSE.md
-├── README.md
-├── packages
-│   ├── branding: Taiko branding materials.
-│   ├── bridge-ui: Bridge UI.
-│   ├── docs-site: End user documentation site.
-│   ├── eventindexer: Event indexer.
-│   ├── fork-diff: Fork diff page.
-│   ├── guardian-prover-health-check: Guardian prover health check service.
-│   ├── guardian-prover-health-check-ui: Guardian prover health check UI.
-│   ├── protocol: Taiko protocol smart contracts.
-│   ├── relayer: Bridge backend relayer.
-│   ├── supplementary-contracts: Supplementary smart contracts that are not part of the Taiko rollup protocol.
-│   ├── taiko-client: Taiko client implementation in Go.
-│   ├── nfts: Taiko NFTs.
-│   └── taikoon-ui: Taikoon NFT UI.
-...
-
+Get started with Taiko Alethia: + +- [Taiko Alethia docs](https://docs.taiko.xyz) — High-level concepts, guides, resources, and reference pages for getting started. +- [Protocol specs](./packages/protocol/docs/README.md) — In-depth specifications of the Taiko Alethia protocol for deeper understanding. +- [Smart contracts](./packages/protocol/contracts/) — Taiko Alethia protocol smart contracts, fully documented with NatSpec. + +## Packages + +> [!TIP] +> Make sure your node is using the latest version tags for taiko-client and taiko-geth. Check out the [node releases page](https://docs.taiko.xyz/network-reference/software-releases-and-deployments)! + +| Package | Description | +| :---------------------------------------------------------------------------- | :----------------------------------------------------------------- | +| [balance-monitor](./packages/balance-monitor) | Service that monitors Ethereum L1/L2 addresses and token balances. | +| [blobstorage](./packages/blobstorage) | Service for storing and retrieving blob data. | +| [bridge-ui](./packages/bridge-ui) | Bridge UI. | +| [docs-site](./packages/docs-site) | End user documentation site. | +| [eventindexer](./packages/eventindexer) | Event indexer. | +| [fork-diff](./packages/fork-diff) | Fork diff page. | +| [geth-rpc-gateway](./packages/geth-rpc-gateway) | RPC gateway for geth nodes. | +| [guardian-prover-health-check](./packages/guardian-prover-health-check) | Guardian prover health check service. | +| [guardian-prover-health-check-ui](./packages/guardian-prover-health-check-ui) | Guardian prover health check UI. | +| [monitors](./packages/monitors) | Monitoring and alerting services. | +| [nfts](./packages/nfts) | NFT-related smart contracts and utilities. | +| [protocol](./packages/protocol) | Taiko Alethia protocol smart contracts. | +| [relayer](./packages/relayer) | Bridge backend relayer. | +| [snaefell-ui](./packages/snaefell-ui) | Snaefell UI. | +| [supplementary-contracts](./packages/supplementary-contracts) | Supplementary contracts not part of the Taiko Alethia protocol. | +| [taiko-client](./packages/taiko-client) | Taiko Alethia client implementation in Go. | +| [taikoon-ui](./packages/taikoon-ui) | Taikoon UI. | +| [ui-lib](./packages/ui-lib) | UI library. | ## Issues diff --git a/_typos.toml b/_typos.toml index 00649e4dd6b..b854bc37085 100644 --- a/_typos.toml +++ b/_typos.toml @@ -2,8 +2,15 @@ # False positives extend-ignore-identifiers-re = [ "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG", + "bafybeiegdqpwx3he5dvoxqklspdjekjepjcobfaakyficksratn73qbbyy", "TGE", "tge", + "preconf", + "preconfer", + "baed", + "Groth", + "groth", + "GROTH" ] [files] @@ -11,11 +18,13 @@ extend-exclude = [ "*.png", "*.svg", "go.mod", + "go.sum", + "pnpm-lock.yaml", + "**/**/pnpm-lock.yaml", "CHANGELOG.md", "packages/protocol/audit/code4rena-2024-03-taiko-final-report.md", - "packages/protocol/contracts/automata-attestation/**", - "packages/protocol/contracts/thirdparty/**", - "packages/protocol/contracts/compiled/**", + "packages/protocol/contracts/layer1/automata-attestation/**", + "packages/protocol/deployments/**", # TODO: fix typos and remove these "packages/taiko-client/**", ] diff --git a/go.mod b/go.mod index e7ca851f51f..5c4e824bc8e 100644 --- a/go.mod +++ b/go.mod @@ -1,197 +1,165 @@ module github.com/taikoxyz/taiko-mono -go 1.21 +go 1.23 require ( - github.com/btcsuite/btcd/btcec/v2 v2.3.3 - github.com/buildkite/terminal-to-html/v3 v3.8.0 + github.com/btcsuite/btcd/btcec/v2 v2.3.4 + github.com/buildkite/terminal-to-html/v3 v3.16.4 github.com/cenkalti/backoff v2.2.1+incompatible github.com/cenkalti/backoff/v4 v4.3.0 github.com/cyberhorsey/errors v0.0.0-20220929234051-087d6d8bb841 github.com/cyberhorsey/webutils v0.0.0-20230314183728-56890c6ddbe7 - github.com/davecgh/go-spew v1.1.1 + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 + github.com/dgraph-io/badger/v4 v4.2.0 github.com/ethereum-optimism/optimism v1.7.4 - github.com/ethereum/go-ethereum v1.13.15 - github.com/go-git/go-git/v5 v5.12.0 - github.com/go-resty/resty/v2 v2.7.0 + github.com/ethereum/go-ethereum v1.14.11 + github.com/ethereum/hive v0.0.0-20240822135954-91829ccfb2c5 + github.com/go-git/go-git/v5 v5.13.1 + github.com/go-resty/resty/v2 v2.16.2 github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 github.com/google/uuid v1.6.0 github.com/gorilla/rpc v1.2.1 + github.com/gorilla/websocket v1.5.3 github.com/joho/godotenv v1.5.1 - github.com/labstack/echo-contrib v0.17.1 - github.com/labstack/echo/v4 v4.12.0 + github.com/labstack/echo-jwt/v4 v4.3.0 + github.com/labstack/echo-contrib v0.17.2 + github.com/labstack/echo-jwt/v4 v4.3.0 + github.com/labstack/echo/v4 v4.13.3 github.com/labstack/gommon v0.4.2 github.com/modern-go/reflect2 v1.0.2 - github.com/morkid/paginate v1.1.7 + github.com/morkid/paginate v1.1.8 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 github.com/pkg/errors v0.9.1 - github.com/pressly/goose/v3 v3.20.0 - github.com/prometheus/client_golang v1.19.0 - github.com/prysmaticlabs/prysm/v4 v4.2.0 + github.com/pressly/goose/v3 v3.24.0 + github.com/prometheus/client_golang v1.20.5 + github.com/prysmaticlabs/prysm/v5 v5.2.0 github.com/rabbitmq/amqp091-go v1.10.0 github.com/shopspring/decimal v1.4.0 - github.com/stretchr/testify v1.9.0 - github.com/swaggo/swag v1.16.3 - github.com/testcontainers/testcontainers-go v0.30.0 - github.com/urfave/cli/v2 v2.27.2 - golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 - golang.org/x/sync v0.7.0 + github.com/stretchr/testify v1.10.0 + github.com/swaggo/swag v1.16.4 + github.com/testcontainers/testcontainers-go v0.34.0 + github.com/urfave/cli/v2 v2.27.5 + golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa + golang.org/x/sync v0.10.0 gopkg.in/go-playground/assert.v1 v1.2.1 gopkg.in/yaml.v3 v3.0.1 - gorm.io/datatypes v1.2.0 - gorm.io/driver/mysql v1.5.6 - gorm.io/gorm v1.25.10 + gorm.io/datatypes v1.2.5 + gorm.io/driver/mysql v1.5.7 + gorm.io/gorm v1.25.12 gotest.tools v2.2.0+incompatible ) require ( - contrib.go.opencensus.io/exporter/jaeger v0.2.1 // indirect dario.cat/mergo v1.0.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/DataDog/zstd v1.5.2 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect github.com/KyleBanks/depth v1.2.1 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Microsoft/hcsshim v0.11.4 // indirect - github.com/ProtonMail/go-crypto v1.0.0 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect - github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/ProtonMail/go-crypto v1.1.3 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect - github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/btcsuite/btcd v0.24.0 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect + github.com/btcsuite/btcd v0.24.2 // indirect github.com/btcsuite/btcd/btcutil v1.1.5 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect - github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4 // indirect + github.com/cockroachdb/pebble v1.1.2 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/containerd/cgroups v1.1.0 // indirect - github.com/containerd/containerd v1.7.12 // indirect + github.com/containerd/containerd v1.7.18 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/cpuguy83/dockercfg v0.3.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect - github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/cyphar/filepath-securejoin v0.3.6 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v27.1.1+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/elastic/gosigar v0.14.2 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect + github.com/ethereum/hive/hiveproxy v0.0.0-20240808014330-625b82294b46 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fjl/memsize v0.0.2 // indirect - github.com/flynn/noise v1.0.0 // indirect - github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect - github.com/getsentry/sentry-go v0.18.0 // indirect + github.com/fsouza/go-dockerclient v1.11.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-git/go-billy/v5 v5.6.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/spec v0.20.4 // indirect - github.com/go-openapi/swag v0.19.15 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.13.0 // indirect github.com/go-sql-driver/mysql v1.8.1 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt v3.2.2+incompatible // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang-jwt/jwt/v4 v4.5.1 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/flatbuffers v1.12.1 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8 // indirect - github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b // indirect github.com/gorilla/css v1.0.0 // indirect - github.com/gorilla/mux v1.8.0 // indirect - github.com/gorilla/websocket v1.5.1 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.4 // indirect + github.com/holiman/uint256 v1.3.1 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iancoleman/strcase v0.2.0 // indirect - github.com/ipfs/go-cid v0.4.1 // indirect - github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/compress v1.17.6 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect - github.com/koron/go-ssdp v0.0.4 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.2.3 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-flow-metrics v0.1.0 // indirect - github.com/libp2p/go-libp2p v0.32.1 // indirect - github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect - github.com/libp2p/go-libp2p-mplex v0.9.0 // indirect - github.com/libp2p/go-libp2p-pubsub v0.10.1 // indirect - github.com/libp2p/go-mplex v0.7.0 // indirect - github.com/libp2p/go-msgio v0.3.0 // indirect - github.com/libp2p/go-nat v0.2.0 // indirect - github.com/libp2p/go-netroute v0.2.1 // indirect - github.com/libp2p/go-reuseport v0.4.0 // indirect - github.com/libp2p/go-yamux/v4 v4.0.1 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect + github.com/lithammer/dedent v1.1.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mfridman/interpolate v0.0.2 // indirect github.com/microcosm-cc/bluemonday v1.0.26 // indirect - github.com/miekg/dns v1.1.56 // indirect - github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect - github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/minio/sha256-simd v1.0.1 // indirect - github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/pointerstructure v1.2.1 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect @@ -200,113 +168,80 @@ require ( github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/morkid/gocache v1.0.0 // indirect - github.com/mr-tron/base58 v1.2.0 // indirect - github.com/multiformats/go-base32 v0.1.0 // indirect - github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr v0.12.3 // indirect - github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect - github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect - github.com/multiformats/go-multibase v0.2.0 // indirect - github.com/multiformats/go-multicodec v0.9.0 // indirect - github.com/multiformats/go-multihash v0.2.3 // indirect - github.com/multiformats/go-multistream v0.5.0 // indirect - github.com/multiformats/go-varint v0.0.7 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/neko-neko/echo-logrus/v2 v2.0.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/ginkgo/v2 v2.15.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/opencontainers/runtime-spec v1.1.0 // indirect - github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.13.0 // indirect - github.com/prometheus/prom2json v1.3.0 // indirect - github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 // indirect - github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect - github.com/prysmaticlabs/gohashtree v0.0.3-alpha // indirect - github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c // indirect - github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-20 v0.3.4 // indirect - github.com/quic-go/quic-go v0.39.4 // indirect - github.com/quic-go/webtransport-go v0.6.0 // indirect - github.com/raulk/go-watchdog v1.3.0 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/prysmaticlabs/fastssz v0.0.0-20241008181541-518c4ce73516 // indirect + github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e // indirect + github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/rs/cors v1.9.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rs/cors v1.11.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/schollz/progressbar/v3 v3.3.4 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect - github.com/sethvargo/go-retry v0.2.4 // indirect + github.com/sethvargo/go-retry v0.3.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/shirou/gopsutil/v3 v3.23.12 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/skeema/knownhosts v1.2.2 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/afero v1.10.0 // indirect - github.com/supranational/blst v0.3.11 // indirect + github.com/skeema/knownhosts v1.3.0 // indirect + github.com/supranational/blst v0.3.13 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect - github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.44.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect - github.com/wealdtech/go-bytesutil v1.1.1 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect + github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - go.etcd.io/bbolt v1.3.8 // indirect - go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect - go.uber.org/dig v1.17.1 // indirect - go.uber.org/fx v1.20.1 // indirect - go.uber.org/mock v0.3.0 // indirect + go.opentelemetry.io/otel v1.31.0 // indirect + go.opentelemetry.io/otel/metric v1.31.0 // indirect + go.opentelemetry.io/otel/trace v1.31.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.19.0 // indirect - google.golang.org/api v0.44.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/grpc v1.63.2 // indirect - google.golang.org/protobuf v1.33.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/mod v0.20.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.8.0 // indirect + golang.org/x/tools v0.24.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect + google.golang.org/grpc v1.69.2 // indirect + google.golang.org/protobuf v1.36.1 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apimachinery v0.26.2 // indirect - k8s.io/client-go v0.26.2 // indirect - k8s.io/klog/v2 v2.90.1 // indirect - k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 // indirect - lukechampine.com/blake3 v1.2.1 // indirect + k8s.io/apimachinery v0.30.4 // indirect + k8s.io/client-go v0.30.4 // indirect + k8s.io/klog/v2 v2.120.1 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect rsc.io/tmplfunc v0.0.3 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) -replace github.com/ethereum/go-ethereum v1.13.15 => github.com/taikoxyz/taiko-geth v0.0.0-20240504072040-7e1b8b65a3f8 +replace github.com/ethereum/go-ethereum v1.14.11 => github.com/taikoxyz/taiko-geth v1.11.2-0.20250107082544-a2cbf904eaae -replace github.com/ethereum-optimism/optimism v1.7.4 => github.com/taikoxyz/optimism v0.0.0-20240508063202-db34e8c760ea +replace github.com/ethereum-optimism/optimism v1.7.4 => github.com/taikoxyz/optimism v0.0.0-20241003061504-cdf8af288f39 replace github.com/uber/jaeger-client-go => github.com/uber/jaeger-client-go v2.25.0+incompatible + +replace github.com/ethereum/hive v0.0.0-20240822135954-91829ccfb2c5 => github.com/taikoxyz/hive v0.0.0-20240827015317-405b241dd082 diff --git a/go.sum b/go.sum index 2e10f46f909..80587bed24e 100644 --- a/go.sum +++ b/go.sum @@ -1,146 +1,57 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= -contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= -dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= -dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e h1:ZIWapoIRN1VqT8GR8jAwb1Ie9GyehWjVcGh32Y2MznE= +github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= -github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= -github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= -github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk= +github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/sarama v1.26.1/go.mod h1:NbSGBSSndYaIhRcBtY9V0U7AyH+x71bG668AuWys/yU= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/aristanetworks/fsnotify v1.4.2/go.mod h1:D/rtu7LpjYM8tRJphJ0hUBYpjai8SfX+aSNsWDTq/Ks= -github.com/aristanetworks/glog v0.0.0-20191112221043-67e8567f59f3/go.mod h1:KASm+qXFKs/xjSoWn30NrWBBvdTTQq+UjkhjEJHfSFA= -github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96 h1:XJH0YfVFKbq782tlNThzN/Ud5qm/cx6LXOA/P6RkTxc= -github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96/go.mod h1:QZe5Yh80Hp1b6JxQdpfSEEe8X7hTyTEZSosSrFf/oJE= -github.com/aristanetworks/splunk-hec-go v0.3.3/go.mod h1:1VHO9r17b0K7WmOlLb9nTk/2YanvOEnLMUgsFrxBROc= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM= github.com/bazelbuild/rules_go v0.23.2/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= -github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= -github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= -github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= +github.com/btcsuite/btcd v0.24.2 h1:aLmxPguqxza+4ag8R1I2nnJjSu2iFn/kqtHTIImswcY= +github.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/btcec/v2 v2.3.3 h1:6+iXlDKE8RMtKsvK0gshlXIuPbyWM/h84Ensb7o3sC0= -github.com/btcsuite/btcd/btcec/v2 v2.3.3/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= @@ -158,11 +69,8 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/buildkite/terminal-to-html/v3 v3.8.0 h1:S7ImMS8W+2yS/9D4ugrXzB95C4AuNaKcaw/eR/95bFU= -github.com/buildkite/terminal-to-html/v3 v3.8.0/go.mod h1:j3XxsnYElte/Bo7Pft+U5eQWWbcx3j51uQ8fo43VrjM= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/buildkite/terminal-to-html/v3 v3.16.4 h1:QFYO8IGvRnp7tGgiQb8g9uFU8kY9wOzxsFFx17+yy6Q= +github.com/buildkite/terminal-to-html/v3 v3.16.4/go.mod h1:r/J7cC9c3EzBzP3/wDz0RJLPwv5PUAMp+KF2w+ntMc0= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -170,9 +78,6 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -180,58 +85,42 @@ github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpR github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4 h1:PuHFhOUMnD62r80dN+Ik5qco2drekgsUSVdcHsvllec= -github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= -github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0= -github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk= +github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= +github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= +github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= @@ -239,18 +128,17 @@ github.com/cyberhorsey/errors v0.0.0-20220929234051-087d6d8bb841 h1:FaPua89k9Kmk github.com/cyberhorsey/errors v0.0.0-20220929234051-087d6d8bb841/go.mod h1:qSH/IvpdArCjfny4ODMko/7U0z4JoNIWctgCnUrapnI= github.com/cyberhorsey/webutils v0.0.0-20230314183728-56890c6ddbe7 h1:KYOh2RfWAltxYsfD/Ar5D3zB4+AuNQejXW5BvMlGor4= github.com/cyberhorsey/webutils v0.0.0-20230314183728-56890c6ddbe7/go.mod h1:bNNUHadsCy1HleNUToQ/t11vmKI9/+9Taw8K6GyxERo= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM= +github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U= github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= @@ -258,119 +146,81 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeC github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018 h1:cNcG4c2n5xanQzp2hMyxDxPYVQmZ91y4WN6fJFlndLo= -github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018/go.mod h1:MIonLggsKgZLUSt414ExgwNtlOL5MuEoAJP514mwGe8= +github.com/dgraph-io/badger/v4 v4.2.0/go.mod h1:qfCqhPoWDFJRx1gp5QwwyGo8xk1lbHUxvK9nK0OGAak= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY= +github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= -github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/elazarl/goproxy v1.2.3 h1:xwIyKHbaP5yfT6O9KIeYJR5549MXRQkoQMRXGztz8YQ= +github.com/elazarl/goproxy v1.2.3/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 h1:RWHKLhCrQThMfch+QJ1Z8veEq5ZO3DfIhZ7xgRP9WTc= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0KqyLdNJYD7O5cpDlaFMNZzlxYNcWsJUxs= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= +github.com/ethereum/hive/hiveproxy v0.0.0-20240808014330-625b82294b46 h1:paQKR+EGmEwr9viJoSgC0gOW4YPBRvrD5tPKn6CNRD8= +github.com/ethereum/hive/hiveproxy v0.0.0-20240808014330-625b82294b46/go.mod h1:H5dh/7x2Mf5SR7cKLXDZLWRMtolNhvb3uKR1Gy3aF60= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= -github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= -github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/fsouza/go-dockerclient v1.11.0 h1:4ZAk6W7rPAtPXm7198EFqA5S68rwnNQORxlOA5OurCA= +github.com/fsouza/go-dockerclient v1.11.0/go.mod h1:0I3TQCRseuPTzqlY4Y3ajfsg2VAdMQoazrkxJTiJg8s= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= -github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-billy/v5 v5.6.1 h1:u+dcrgaguSSkbjzHwelEjc0Yj300NUevrrPphk/SoRA= +github.com/go-git/go-billy/v5 v5.6.1/go.mod h1:0AsLr1z2+Uksi4NlElmMblP5rPcDZNRCD8ujZCRR2BE= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= -github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-git/go-git/v5 v5.13.1 h1:DAQ9APonnlvSWpvolXWIuV6Q6zXy2wHbN4cVlNR5Q+M= +github.com/go-git/go-git/v5 v5.13.1/go.mod h1:qryJB4cSBoq3FRoBRf5A77joojuBcmPJ0qu3XXXVixc= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= @@ -383,227 +233,115 @@ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91 github.com/go-playground/validator/v10 v10.4.0/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ= github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4= -github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= -github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-resty/resty/v2 v2.16.2 h1:CpRqTjIzq/rweXUt9+GxzzQdlkqMdt8Lm/fuK/CAbAg= +github.com/go-resty/resty/v2 v2.16.2/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 h1:k4Tw0nt6lwro3Uin8eqoET7MDA4JnT8YgbCjc/g5E3k= github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8 h1:Ep/joEub9YwcjRY6ND3+Y/w0ncE540RtGatVhtZL0/Q= github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= -github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b h1:RMpPgZTSApbPf7xaVel+QkoGPRLFLrwFO89uDUHEGf0= -github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/rpc v1.2.1 h1:yC+LMV5esttgpVvNORL/xX4jvTTEUE30UZhZ5JF7K9k= github.com/gorilla/rpc v1.2.1/go.mod h1:uNpOihAlF5xRFLuTYhfR0yfCTm0WTQSQttkMSptRfGk= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e h1:wCMygKUQhmcQAjlk2Gquzq6dLmyMv2kF+llRspoRgrk= github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= +github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.1.3/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= -github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= -github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= -github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= -github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= -github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs= +github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= -github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= -github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= @@ -611,71 +349,44 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg= -github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.12/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= -github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= -github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/klauspost/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= -github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo-contrib v0.17.1 h1:7I/he7ylVKsDUieaGRZ9XxxTYOjfQwVzHzUYrNykfCU= -github.com/labstack/echo-contrib v0.17.1/go.mod h1:SnsCZtwHBAZm5uBSAtQtXQHI3wqEA73hvTn0bYMKnZA= +github.com/labstack/echo-contrib v0.17.2 h1:K1zivqmtcC70X9VdBFdLomjPDEVHlrcAObqmuFj1c6w= +github.com/labstack/echo-contrib v0.17.2/go.mod h1:NeDh3PX7j/u+jR4iuDt1zHmWZSCz9c/p9mxXcDpyS8E= +github.com/labstack/echo-jwt/v4 v4.3.0 h1:8JcvVCrK9dRkPx/aWY3ZempZLO336Bebh4oAtBcxAv4= +github.com/labstack/echo-jwt/v4 v4.3.0/go.mod h1:OlWm3wqfnq3Ma8DLmmH7GiEAz2S7Bj23im2iPMEAR+Q= github.com/labstack/echo/v4 v4.0.0/go.mod h1:tZv7nai5buKSg5h/8E6zz4LsD/Dqh9/91Mvs7Z5Zyno= github.com/labstack/echo/v4 v4.1.15/go.mod h1:GWO5IBVzI371K8XJe50CSvHjQCafK6cw8R/moLhEU6o= -github.com/labstack/echo/v4 v4.12.0 h1:IKpw49IMryVB2p1a4dzwlhP1O2Tf2E0Ir/450lH+kI0= -github.com/labstack/echo/v4 v4.12.0/go.mod h1:UP9Cr2DJXbOK3Kr9ONYzNowSh7HP0aG0ShAyycHSJvM= +github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= +github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g= github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= @@ -685,107 +396,46 @@ github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2 github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.3 h1:6BE2vPT0lqoz3fmOesHZiaiFh7889ssCo2GMvLCfiuA= github.com/leodido/go-urn v1.2.3/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= -github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.32.1 h1:wy1J4kZIZxOaej6NveTWCZmHiJ/kY7GoAqXgqNCnPps= -github.com/libp2p/go-libp2p v0.32.1/go.mod h1:hXXC3kXPlBZ1eu8Q2hptGrMB4mZ3048JUoS4EKaHW5c= -github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= -github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= -github.com/libp2p/go-libp2p-mplex v0.9.0 h1:R58pDRAmuBXkYugbSSXR9wrTX3+1pFM1xP2bLuodIq8= -github.com/libp2p/go-libp2p-mplex v0.9.0/go.mod h1:ro1i4kuwiFT+uMPbIDIFkcLs1KRbNp0QwnUXM+P64Og= -github.com/libp2p/go-libp2p-pubsub v0.10.1 h1:/RqOZpEtAolsr8/9CC8KqROJSOZeu7lK7fPftn4MwNg= -github.com/libp2p/go-libp2p-pubsub v0.10.1/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw= -github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= -github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= -github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY= -github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU= -github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= -github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= -github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= -github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= -github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= -github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= -github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= -github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= -github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= -github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs= -github.com/microsoft/go-mssqldb v1.7.0 h1:sgMPW0HA6Ihd37Yx0MzHyKD726C2kY/8KJsQtXHNaAs= -github.com/microsoft/go-mssqldb v1.7.0/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= -github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= -github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= -github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/microsoft/go-mssqldb v1.8.0 h1:7cyZ/AT7ycDsEoWPIXibd+aVKFtteUNhDGf3aobP+tw= +github.com/microsoft/go-mssqldb v1.8.0/go.mod h1:6znkekS3T2vp0waiMhen4GPU1BiAsrP+iXHcE7a7rFo= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= -github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -794,6 +444,8 @@ github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= @@ -805,8 +457,6 @@ github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= @@ -815,50 +465,12 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/morkid/gocache v1.0.0 h1:hTnU78Dqp2vs9al5vJC2TmmMF+Hm3nDH1AgRBjSXE+0= github.com/morkid/gocache v1.0.0/go.mod h1:xK+hmoEMjYffIBvjn7DE8WfSd/rF5Kz/G9f20OliMJY= -github.com/morkid/paginate v1.1.7 h1:qgU1qLhYxlckJ11CoUn7tQpT4k5SmWTTa1NpdSNbShg= -github.com/morkid/paginate v1.1.7/go.mod h1:1VCx2ARlAVEv2Yd+YHTGRMs0Gacvi75dCrPidrmPq5g= -github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= -github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= -github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= -github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= -github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= -github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.12.3 h1:hVBXvPRcKG0w80VinQ23P5t7czWgg65BmIvQKjDydU8= -github.com/multiformats/go-multiaddr v0.12.3/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= -github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= -github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= -github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= -github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= -github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= -github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= -github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= -github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= -github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= -github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= -github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/morkid/paginate v1.1.8 h1:nAk+ZIzSAjFdCeOFdH5j+xq2ipiuXKySsY3/DthVELQ= +github.com/morkid/paginate v1.1.8/go.mod h1:dmJDIOQirmfa03fH7M4neVRfl7xQth11OQdFT5e+4bY= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/neko-neko/echo-logrus/v2 v2.0.1 h1:BX2U6uv2N3UiUY75y+SntQak5S1AJIel9j+5Y6h4Nb4= github.com/neko-neko/echo-logrus/v2 v2.0.1/go.mod h1:GDYWo9CY4VXk/vn5ac5reoutYEkZEexlFI01MzHXVG0= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -866,173 +478,83 @@ github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= -github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= -github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc= -github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= -github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.4.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/pressly/goose/v3 v3.20.0 h1:uPJdOxF/Ipj7ABVNOAMJXSxwFXZGwMGHNqjC8e61VA0= -github.com/pressly/goose/v3 v3.20.0/go.mod h1:BRfF2GcG4FTG12QfdBVy3q1yveaf4ckL9vWwEcIO3lA= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/pressly/goose/v3 v3.24.0 h1:sFbNms7Bd++2VMq6HSgDHDLWa7kHz1qXzPb3ZIU72VU= +github.com/pressly/goose/v3 v3.24.0/go.mod h1:rEWreU9uVtt0DHCyLzF9gRcWiiTF/V+528DV+4DORug= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.0.10/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o= -github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= -github.com/prometheus/prom2json v1.3.0 h1:BlqrtbT9lLH3ZsOVhXPsHzFrApCTKRifB7gjJuypu6Y= -github.com/prometheus/prom2json v1.3.0/go.mod h1:rMN7m0ApCowcoDlypBHlkNbp5eJQf/+1isKykIP5ZnM= -github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 h1:c3p3UzV4vFA7xaCDphnDWOjpxcadrQ26l5b+ypsvyxo= -github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44/go.mod h1:MA5zShstUwCQaE9faGHgCGvEWUbG87p4SAXINhmCkvg= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= -github.com/prysmaticlabs/gohashtree v0.0.3-alpha h1:1EVinCWdb3Lorq7xn8DYQHf48nCcdAM3Vb18KsFlRWY= -github.com/prysmaticlabs/gohashtree v0.0.3-alpha/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= -github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c h1:9PHRCuO/VN0s9k+RmLykho7AjDxblNYI5bYKed16NPU= -github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c/go.mod h1:ZRws458tYHS/Zs936OQ6oCrL+Ict5O4Xpwve1UQ6C9M= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prysmaticlabs/fastssz v0.0.0-20241008181541-518c4ce73516 h1:xuVAdtz5ShYblG2sPyb4gw01DF8InbOI/kBCQjk7NiM= +github.com/prysmaticlabs/fastssz v0.0.0-20241008181541-518c4ce73516/go.mod h1:h2OlIZD/M6wFvV3YMZbW16lFgh3Rsye00G44J2cwLyU= +github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e h1:ATgOe+abbzfx9kCPeXIW4fiWyDdxlwHw07j8UGhdTd4= +github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= +github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b h1:VK7thFOnhxAZ/5aolr5Os4beiubuD08WiuiHyRqgwks= +github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b/go.mod h1:HRuvtXLZ4WkaB1MItToVH2e8ZwKwZPY5/Rcby+CvvLY= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294 h1:q9wE0ZZRdTUAAeyFP/w0SwBEnCqlVy2+on6X2/e+eAU= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294/go.mod h1:ZVEbRdnMkGhp/pu35zq4SXxtvUwWK0J1MATtekZpH2Y= -github.com/prysmaticlabs/prysm/v4 v4.2.0 h1:87QoRT3Azs7c1Y6SnIq0+CNtQRbAt0sVKGj2OxRT1Rw= -github.com/prysmaticlabs/prysm/v4 v4.2.0/go.mod h1:PQrQtHJeeqTz4K3udN/EX1Gs2xhWR4j93gSj0OQZ1f4= -github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= -github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-20 v0.3.4 h1:MfFAPULvst4yoMgY9QmtpYmfij/em7O8UUi+bNVm7Cg= -github.com/quic-go/qtls-go1-20 v0.3.4/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= -github.com/quic-go/quic-go v0.39.4 h1:PelfiuG7wXEffUT2yceiqz5V6Pc0TA5ruOd1LcmFc1s= -github.com/quic-go/quic-go v0.39.4/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q= -github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY= -github.com/quic-go/webtransport-go v0.6.0/go.mod h1:9KjU4AEBqEQidGHNDkZrb8CAa1abRaosM2yGOyiikEc= +github.com/prysmaticlabs/prysm/v5 v5.2.0 h1:JqKKK5aqehZN9GiSOSSw4M57NpbvG0nIxqFK5KpPnRw= +github.com/prysmaticlabs/prysm/v5 v5.2.0/go.mod h1:cQc+NIMKaHjPvY566HsYcuni763nzuUWnDsDbk45bbs= github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= -github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= -github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= -github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= +github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/schollz/progressbar/v3 v3.3.4 h1:nMinx+JaEm/zJz4cEyClQeAw5rsYSB5th3xv+5lV6Vg= -github.com/schollz/progressbar/v3 v3.3.4/go.mod h1:Rp5lZwpgtYmlvmGo1FyDwXMqagyRBQYSDwzlP9QDu84= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= -github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= -github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= +github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE= +github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= @@ -1043,59 +565,17 @@ github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= -github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= -github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= -github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= -github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= -github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= -github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= -github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= -github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= -github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= -github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= -github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= -github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= -github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= -github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= -github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= -github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY= +github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -1114,43 +594,35 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= -github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= +github.com/supranational/blst v0.3.13/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A= +github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/taikoxyz/optimism v0.0.0-20240508063202-db34e8c760ea h1:+oLT2sxS+KLgHZVW4toyKavAMbgjYkFOiL0YpciATnQ= -github.com/taikoxyz/optimism v0.0.0-20240508063202-db34e8c760ea/go.mod h1:bkiRWtDE4T9nXmaK5NBKC/buX5GnyJ6VKozGFwiwKxs= -github.com/taikoxyz/taiko-geth v0.0.0-20240504072040-7e1b8b65a3f8 h1:z4juQ4Nyp2T836JTCNC8t3vrbr0K9v2pPUV/ir2dy9s= -github.com/taikoxyz/taiko-geth v0.0.0-20240504072040-7e1b8b65a3f8/go.mod h1:nqByouVW0a0qx5KKgvYgoXba+pYEHznAAQp6LhZilgM= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU= -github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4= -github.com/testcontainers/testcontainers-go v0.30.0 h1:jmn/XS22q4YRrcMwWg0pAwlClzs/abopbsBzrepyc4E= -github.com/testcontainers/testcontainers-go v0.30.0/go.mod h1:K+kHNGiM5zjklKjgTtcrEetF3uhWbMUyqAQoyoh8Pf0= +github.com/taikoxyz/hive v0.0.0-20240827015317-405b241dd082 h1:ymZR+Y88LOnA8i3KeuJXK7hff2n7bpMIhONPJwpcA5w= +github.com/taikoxyz/hive v0.0.0-20240827015317-405b241dd082/go.mod h1:RHnIu3EFehrWX3JhFAMQSXD5uz7l0xaNroTzXrap7EQ= +github.com/taikoxyz/optimism v0.0.0-20241003061504-cdf8af288f39 h1:JssMxaDmORjQ9RPZNulVJhAD8zSPd6LZFq5wsr6Nwz8= +github.com/taikoxyz/optimism v0.0.0-20241003061504-cdf8af288f39/go.mod h1:ym7scR7ZHvEmwx1DLGVDzFlAdR+uhP1+Z4XCiFuSD5s= +github.com/taikoxyz/taiko-geth v1.11.2-0.20250107082544-a2cbf904eaae h1:exc3MDRDbpNahMwIA+yGFLJb8Umtqs4JLOBpa8hh4Us= +github.com/taikoxyz/taiko-geth v1.11.2-0.20250107082544-a2cbf904eaae/go.mod h1:+l/fr42Mma+xBnhefL/+z11/hcmJ2egl+ScIVPjhc7E= +github.com/testcontainers/testcontainers-go v0.34.0 h1:5fbgF0vIN5u+nD3IWabQwRybuB4GY8G2HHgCkbMzMHo= +github.com/testcontainers/testcontainers-go v0.34.0/go.mod h1:6P/kMkQe8yqPHfPWNulFGdFHTD8HB2vLq/231xY2iPQ= github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e h1:cR8/SYRgyQCt5cNCMniB/ZScMkhI9nk8U5C7SbISXjo= github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e/go.mod h1:Tu4lItkATkonrYuvtVjG0/rhy15qrNGNTjPdaphtZ/8= -github.com/tjfoc/gmsm v1.3.0/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279 h1:+LynomhWB+14Plp/bOONEAZCtvCZk4leRbTvNzNVkL0= -github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279/go.mod h1:GA3+Mq3kt3tYAfM0WZCu7ofy+GW9PuGysHfhr+6JX7s= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= -github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.27.2 h1:6e0H+AkS+zDckwPCUrZkKX38mRaau4nL2uipkJpbkcI= -github.com/urfave/cli/v2 v2.27.2/go.mod h1:g0+79LmHHATl7DAcHO99smiR/T7uGLw84w8Y42x+4eM= +github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= +github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.22.0/go.mod h1:0mw2RjXGOzxf4NL2jni3gUQ7LfjjUSiG5sskOUUSEpU= @@ -1163,691 +635,281 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= -github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/wealdtech/go-bytesutil v1.1.1 h1:ocEg3Ke2GkZ4vQw5lp46rmO+pfqCCTgq35gqOy8JKVc= -github.com/wealdtech/go-bytesutil v1.1.1/go.mod h1:jENeMqeTEU8FNZyDFRVc7KqBdRKSnJ9CCh26TcuNb9s= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw= -github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk= -github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE= -github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= -go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= +go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= -go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= -go.uber.org/fx v1.20.1 h1:zVwVQGS8zYvhh9Xxcu4w1M6ESyeMzebzj2NbSayZ4Mk= -go.uber.org/fx v1.20.1/go.mod h1:iSYNbHf2y55acNCwCXKx7LbWb5WG1Bnue5RDXz1OREg= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= -go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190130090550-b01c7a725664/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI= +golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226101413-39120d07d75e/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200221224223-e1da425f72fd/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= -golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0 h1:URs6qR1lAxDsqWITsQXI4ZkGiYJ5dHtRNiCpfs2OeKA= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= -google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200218151345-dad8c97a84f5/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 h1:fVoAXEKA4+yufmbdVYv+SE73+cPZbbbe8paLsHfkK+U= +google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53/go.mod h1:riSXTwQ4+nqmPGtobMFyW5FqVAmIs0St6VPp4Ug7CE4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= +google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610= +google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/redis.v4 v4.2.4/go.mod h1:8KREHdypkCEojGKQcjMqAODMICIVwZAONWq8RowTITA= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/datatypes v1.2.0 h1:5YT+eokWdIxhJgWHdrb2zYUimyk0+TaFth+7a0ybzco= -gorm.io/datatypes v1.2.0/go.mod h1:o1dh0ZvjIjhH/bngTpypG6lVRJ5chTBxE09FH/71k04= -gorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8= -gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= -gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM= -gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA= +gorm.io/datatypes v1.2.5 h1:9UogU3jkydFVW1bIVVeoYsTpLRgwDVW3rHfJG6/Ek9I= +gorm.io/datatypes v1.2.5/go.mod h1:I5FUdlKpLb5PMqeMQhm30CQ6jXP8Rj89xkTeCSAaAD4= +gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= +gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U= +gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A= gorm.io/driver/sqlite v1.1.4/go.mod h1:mJCeTFr7+crvS+TRnWc5Z3UvwxUN1BGBLMrf5LA9DYw= gorm.io/driver/sqlite v1.4.3 h1:HBBcZSDnWi5BW3B3rwvVTc510KGkBkexlOg0QrmLUuU= gorm.io/driver/sqlite v1.4.3/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= -gorm.io/driver/sqlserver v1.4.1 h1:t4r4r6Jam5E6ejqP7N82qAJIJAht27EGT41HyPfXRw0= -gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHDnJLig= +gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g= +gorm.io/driver/sqlserver v1.5.4/go.mod h1:+frZ/qYmuna11zHPlh5oc2O6ZA/lS88Keb0XSH1Zh/g= gorm.io/gorm v1.20.7/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.21.3/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= -gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s= -gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= +gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.26.2 h1:dM3cinp3PGB6asOySalOZxEG4CZ0IAdJsrYZXE/ovGQ= -k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU= -k8s.io/apimachinery v0.26.2 h1:da1u3D5wfR5u2RpLhE/ZtZS2P7QvDgLZTi9wrNZl/tQ= -k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= -k8s.io/client-go v0.26.2 h1:s1WkVujHX3kTp4Zn4yGNFK+dlDXy1bAAkIl+cFAiuYI= -k8s.io/client-go v0.26.2/go.mod h1:u5EjOuSyBa09yqqyY7m3abZeovO/7D/WehVVlZ2qcqU= -k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= -k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 h1:kmDqav+P+/5e1i9tFfHq1qcF3sOrDp+YEkVDAHu7Jwk= -k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= -lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +k8s.io/api v0.30.4 h1:XASIELmW8w8q0i1Y4124LqPoWMycLjyQti/fdYHYjCs= +k8s.io/api v0.30.4/go.mod h1:ZqniWRKu7WIeLijbbzetF4U9qZ03cg5IRwl8YVs8mX0= +k8s.io/apimachinery v0.30.4 h1:5QHQI2tInzr8LsT4kU/2+fSeibH1eIHswNx480cqIoY= +k8s.io/apimachinery v0.30.4/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= +k8s.io/client-go v0.30.4 h1:eculUe+HPQoPbixfwmaSZGsKcOf7D288tH6hDAdd+wY= +k8s.io/client-go v0.30.4/go.mod h1:IBS0R/Mt0LHkNHF4E6n+SUDPG7+m2po6RZU7YHeOpzc= +k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= +k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= -modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= -modernc.org/libc v1.41.0/go.mod h1:w0eszPsiXoOnoMJgrXjglgLuDy/bt5RR4y3QzUUeodY= +modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U= +modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= -modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= -modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= -modernc.org/sqlite v1.29.6 h1:0lOXGrycJPptfHDuohfYgNqoe4hu+gYuN/pKgY5XjS4= -modernc.org/sqlite v1.29.6/go.mod h1:S02dvcmm7TnTRvGhv8IGYyLnIt7AS2KPaB1F/71p75U= +modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= +modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +modernc.org/sqlite v1.34.1 h1:u3Yi6M0N8t9yKRDwhXcyp1eS5/ErhPTBggxWFuR6Hfk= +modernc.org/sqlite v1.34.1/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/lefthook.yml b/lefthook.yml index 1f17bb93795..b8708725161 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -1,19 +1,19 @@ # lefthook.yml -pre-commit: - parallel: true - commands: - bridge-ui: - glob: "packages/bridge-ui/**.{js,ts,css,svelte}" - run: pnpm -F bridge-ui svelte:check && pnpm -F bridge-ui lint:fix && git add {staged_files} - guardian-ui: - glob: "packages/guardian-prover-health-check-ui/**.{js,ts,css,svelte}" - run: pnpm -F guardian-prover-health-check-ui svelte:check && pnpm -F guardian-prover-health-check-ui lint:fix && git add {staged_files} - protocol_sol: - glob: "packages/protocol/**.{sol}" - run: pnpm -F protocol lint:sol && git add {staged_files} - protocol_ts: - glob: "packages/protocol/**.{ts}" - run: pnpm -F protocol eslint && git add {staged_files} - repo: - glob: "**.{json,md,yaml,yml}" - run: pnpm prettier {staged_files} --write && git add {staged_files} +# pre-commit: +# parallel: true +# commands: +# bridge-ui: +# glob: "packages/bridge-ui/**.{js,ts,css,svelte}" +# run: pnpm -F bridge-ui svelte:check && pnpm -F bridge-ui lint:fix && git add {staged_files} +# guardian-ui: +# glob: "packages/guardian-prover-health-check-ui/**.{js,ts,css,svelte}" +# run: pnpm -F guardian-prover-health-check-ui svelte:check && pnpm -F guardian-prover-health-check-ui lint:fix && git add {staged_files} +# protocol_sol: +# glob: "packages/protocol/**.{sol}" +# run: pnpm -F protocol lint:sol && git add {staged_files} +# protocol_ts: +# glob: "packages/protocol/**.{ts}" +# run: pnpm -F protocol eslint && git add {staged_files} +# repo: +# glob: "**.{json,md,yaml,yml}" +# run: pnpm prettier {staged_files} --write && git add {staged_files} diff --git a/lychee.toml b/lychee.toml new file mode 100644 index 00000000000..9ba6633e075 --- /dev/null +++ b/lychee.toml @@ -0,0 +1,2 @@ +exclude_path = ["node_modules"] +exclude = ["etherscan.io"] diff --git a/packages/balance-monitor/balance-monitor/balance_monitor.go b/packages/balance-monitor/balance-monitor/balance_monitor.go index e4735b1eefe..c91b54ef48b 100644 --- a/packages/balance-monitor/balance-monitor/balance_monitor.go +++ b/packages/balance-monitor/balance-monitor/balance_monitor.go @@ -96,10 +96,14 @@ func (b *BalanceMonitor) Start() error { b.checkEthBalance(context.Background(), b.l2EthClient, l2EthBalanceGauge, "L2", address) // Check ERC-20 token balances + var balance float64 = 0 for _, tokenAddress := range b.erc20Addresses { - b.checkErc20Balance(context.Background(), b.l1EthClient, l1Erc20BalanceGauge, "L1", tokenAddress, address) - b.checkErc20Balance(context.Background(), b.l2EthClient, l2Erc20BalanceGauge, "L2", tokenAddress, address) + balance = balance + b.checkErc20Balance(context.Background(), b.l1EthClient, "L1", tokenAddress, address) + balance = balance + b.checkErc20Balance(context.Background(), b.l2EthClient, "L2", tokenAddress, address) + } + l1Erc20BalanceGauge.WithLabelValues(address.Hex()).Set(balance) + slog.Info("ERC-20 Balance", "address", address.Hex(), "balance", balance) // Add a 1 second sleep between address checks time.Sleep(time.Second) } @@ -111,7 +115,7 @@ func (b *BalanceMonitor) Start() error { func (b *BalanceMonitor) checkEthBalance(ctx context.Context, client ethClient, gauge *prometheus.GaugeVec, clientLabel string, address common.Address) { balance, err := b.getEthBalance(ctx, client, address) if err != nil { - slog.Info(fmt.Sprintf("Failed to get %s ETH balance for address", clientLabel), "address", address.Hex(), "error", err) + slog.Warn(fmt.Sprintf("Failed to get %s ETH balance for address", clientLabel), "address", address.Hex(), "error", err) return } balanceFloat, _ := new(big.Float).Quo(new(big.Float).SetInt(balance), big.NewFloat(1e18)).Float64() @@ -119,32 +123,45 @@ func (b *BalanceMonitor) checkEthBalance(ctx context.Context, client ethClient, slog.Info(fmt.Sprintf("%s ETH Balance", clientLabel), "address", address.Hex(), "balance", balanceFloat) } -func (b *BalanceMonitor) checkErc20Balance(ctx context.Context, client ethClient, gauge *prometheus.GaugeVec, clientLabel string, tokenAddress, holderAddress common.Address) { - tokenBalance, err := b.getErc20Balance(ctx, client, tokenAddress, holderAddress) - if err != nil { - slog.Info(fmt.Sprintf("Failed to get %s ERC-20 balance for address", clientLabel), "address", holderAddress.Hex(), "tokenAddress", tokenAddress.Hex(), "error", err) - return - } - +func (b *BalanceMonitor) checkErc20Balance(ctx context.Context, client ethClient, clientLabel string, tokenAddress, holderAddress common.Address) float64 { // Check the cache for the token decimals tokenDecimals, ok := b.erc20DecimalsCache[tokenAddress] if !ok { // If not in the cache, fetch the decimals from the contract - tokenDecimals, err = b.getErc20Decimals(ctx, client, tokenAddress) + tokenDecimals, err := b.getErc20Decimals(ctx, client, tokenAddress) if err != nil { - slog.Info(fmt.Sprintf("Failed to get %s ERC-20 decimals for token", clientLabel), "tokenAddress", tokenAddress.Hex(), "error", err) - return + slog.Warn(fmt.Sprintf("Failed to get %s ERC-20 decimals for token. Use default value: 18", clientLabel), "tokenAddress", tokenAddress.Hex(), "error", err) + tokenDecimals = 18 } // Cache the fetched decimals b.erc20DecimalsCache[tokenAddress] = tokenDecimals } - tokenBalanceFloat, _ := new(big.Float).Quo(new(big.Float).SetInt(tokenBalance), big.NewFloat(math.Pow(10, float64(tokenDecimals)))).Float64() - gauge.WithLabelValues(tokenAddress.Hex(), holderAddress.Hex()).Set(tokenBalanceFloat) - slog.Info(fmt.Sprintf("%s ERC-20 Balance", clientLabel), "tokenAddress", tokenAddress.Hex(), "address", holderAddress.Hex(), "balance", tokenBalanceFloat) + var tokenBalanceFloat float64 = 0 + tokenBalance, err := b.getErc20Balance(ctx, client, tokenAddress, holderAddress) + if err != nil { + slog.Warn(fmt.Sprintf("Failed to get %s ERC-20 balance for address", clientLabel), "address", holderAddress.Hex(), "tokenAddress", tokenAddress.Hex(), "error", err) + tokenBalanceFloat = 0 + } else { + tokenBalanceFloat, _ = new(big.Float).Quo(new(big.Float).SetInt(tokenBalance), big.NewFloat(math.Pow(10, float64(tokenDecimals)))).Float64() + } + + var tokenBondBalanceFloat float64 = 0 + tokenBondBalance, err := b.getErc20BondBalance(ctx, client, tokenAddress, holderAddress) + if err != nil { + slog.Warn(fmt.Sprintf("Failed to get %s ERC-20 bond balance for address", clientLabel), "address", holderAddress.Hex(), "tokenAddress", tokenAddress.Hex(), "error", err) + tokenBondBalanceFloat = 0 + } else { + tokenBondBalanceFloat, _ = new(big.Float).Quo(new(big.Float).SetInt(tokenBondBalance), big.NewFloat(math.Pow(10, float64(tokenDecimals)))).Float64() + } + + balance := tokenBalanceFloat + tokenBondBalanceFloat + slog.Info(fmt.Sprintf("%s ERC-20 Balance", clientLabel), "tokenAddress", tokenAddress.Hex(), "address", holderAddress.Hex(), "balance", balance) + return balance } -const erc20ABI = `[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"}]` +const erc20BalanceOfABI = `[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"}]` +const erc20BondBalanceOfABI = `[{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"bondBalanceOf","outputs":[{"name":"balance","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"}]` type ERC20 interface { BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error) @@ -159,8 +176,9 @@ func (b *BalanceMonitor) getEthBalance(ctx context.Context, client ethClient, ad return balance, nil } +// TODO (ruby): merge getErc20Balance and getErc20BondBalance func (b *BalanceMonitor) getErc20Balance(ctx context.Context, client ethClient, tokenAddress, holderAddress common.Address) (*big.Int, error) { - parsedABI, err := abi.JSON(strings.NewReader(erc20ABI)) + parsedABI, err := abi.JSON(strings.NewReader(erc20BalanceOfABI)) if err != nil { return nil, err } @@ -188,8 +206,37 @@ func (b *BalanceMonitor) getErc20Balance(ctx context.Context, client ethClient, return balance, nil } +func (b *BalanceMonitor) getErc20BondBalance(ctx context.Context, client ethClient, tokenAddress, holderAddress common.Address) (*big.Int, error) { + parsedABI, err := abi.JSON(strings.NewReader(erc20BondBalanceOfABI)) + if err != nil { + return nil, err + } + + tokenContract := bind.NewBoundContract(tokenAddress, parsedABI, client, client, client) + + var result []interface{} + err = tokenContract.Call(&bind.CallOpts{ + Context: ctx, + }, &result, "bondBalanceOf", holderAddress) + + if err != nil { + return nil, err + } + + if len(result) == 0 { + return nil, fmt.Errorf("no result from token contract call") + } + + balance, ok := result[0].(*big.Int) + if !ok { + return nil, fmt.Errorf("unexpected type for bondBalanceOf result") + } + + return balance, nil +} + func (b *BalanceMonitor) getErc20Decimals(ctx context.Context, client ethClient, tokenAddress common.Address) (uint8, error) { - parsedABI, err := abi.JSON(strings.NewReader(erc20ABI)) + parsedABI, err := abi.JSON(strings.NewReader(erc20BalanceOfABI)) if err != nil { return 0, err } diff --git a/packages/balance-monitor/balance-monitor/prometheus.go b/packages/balance-monitor/balance-monitor/prometheus.go index 7980ac72140..fa8d1673282 100644 --- a/packages/balance-monitor/balance-monitor/prometheus.go +++ b/packages/balance-monitor/balance-monitor/prometheus.go @@ -15,9 +15,9 @@ var ( l1Erc20BalanceGauge = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "l1_erc20_balance", - Help: "ERC-20 token balance of addresses on L1", + Help: "ERC-20 token balance of addresses", }, - []string{"token_address", "address"}, + []string{"address"}, ) l2EthBalanceGauge = prometheus.NewGaugeVec( prometheus.GaugeOpts{ @@ -26,18 +26,10 @@ var ( }, []string{"address"}, ) - l2Erc20BalanceGauge = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Name: "l2_erc20_balance", - Help: "ERC-20 token balance of addresses on L2", - }, - []string{"token_address", "address"}, - ) ) func init() { prometheus.MustRegister(l1EthBalanceGauge) prometheus.MustRegister(l2EthBalanceGauge) prometheus.MustRegister(l1Erc20BalanceGauge) - prometheus.MustRegister(l2Erc20BalanceGauge) } diff --git a/packages/balance-monitor/cmd/main.go b/packages/balance-monitor/cmd/main.go index 7f01d6d1672..7dc4ba8b049 100644 --- a/packages/balance-monitor/cmd/main.go +++ b/packages/balance-monitor/cmd/main.go @@ -31,7 +31,7 @@ func main() { { Name: "balance-monitor", Flags: flags.CommonFlags, - Usage: "Starts the balance monitor oftware", + Usage: "Starts the balance monitor software", Description: "Taiko balance monitor", Action: utils.SubcommandAction(new(balanceMonitor.BalanceMonitor)), }, diff --git a/packages/branding/CHANGELOG.md b/packages/branding/CHANGELOG.md deleted file mode 100644 index aedb7801235..00000000000 --- a/packages/branding/CHANGELOG.md +++ /dev/null @@ -1,41 +0,0 @@ -# Changelog - -## [0.4.0](https://github.com/taikoxyz/taiko-mono/compare/branding-v0.3.0...branding-v0.4.0) (2024-05-13) - - -## [0.3.0](https://github.com/taikoxyz/taiko-mono/compare/branding-v0.2.0...branding-v0.3.0) (2023-08-15) - - -### Features - -* **bridge-ui-v2:** Activities page ([#14504](https://github.com/taikoxyz/taiko-mono/issues/14504)) ([4dff4b3](https://github.com/taikoxyz/taiko-mono/commit/4dff4b317e0ecda43c9804a9e04d2f22c8332a60)) -* **protocol:** alpha-4 with staking-based tokenomics ([#14065](https://github.com/taikoxyz/taiko-mono/issues/14065)) ([1eeba9d](https://github.com/taikoxyz/taiko-mono/commit/1eeba9d97ed8e6e4a8d07a8b0af163a16fbc9ccf)) - -## [0.2.0](https://github.com/taikoxyz/taiko-mono/compare/branding-v0.1.2...branding-v0.2.0) (2023-07-24) - - -### Features - -* **website:** update setting up wallet docs ([#14227](https://github.com/taikoxyz/taiko-mono/issues/14227)) ([3751198](https://github.com/taikoxyz/taiko-mono/commit/3751198826c1db7de00ecb83645c13b23d1ed9e3)) - -## [0.1.2](https://github.com/taikoxyz/taiko-mono/compare/branding-v0.1.1...branding-v0.1.2) (2023-06-12) - - -### Bug Fixes - -* **repo,branding:** update to new taiko logo ([#13881](https://github.com/taikoxyz/taiko-mono/issues/13881)) ([0878874](https://github.com/taikoxyz/taiko-mono/commit/08788746a7485831d1a590073049e2d9abccadbb)) - -## [0.1.1](https://github.com/taikoxyz/taiko-mono/compare/branding-v0.1.0...branding-v0.1.1) (2023-03-29) - - -### Bug Fixes - -* **branding:** remove deprecated logos and wordmarks ([#13393](https://github.com/taikoxyz/taiko-mono/issues/13393)) ([b14472c](https://github.com/taikoxyz/taiko-mono/commit/b14472c55e2109a0e3a6b6a9d44c80ca36992397)) - -## [0.1.0](https://github.com/taikoxyz/taiko-mono/compare/branding-v0.0.1...branding-v0.1.0) (2023-01-19) - - -### Features - -* implement release-please workflow ([#12967](https://github.com/taikoxyz/taiko-mono/issues/12967)) ([b0c8b60](https://github.com/taikoxyz/taiko-mono/commit/b0c8b60da0af3160db758f83c1f6368a3a712593)) -* **website:** update website homepage ([#278](https://github.com/taikoxyz/taiko-mono/issues/278)) ([07a2709](https://github.com/taikoxyz/taiko-mono/commit/07a270995351849bf63acdf0878dcc91fae8f71a)) diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-mono-2x.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-mono-2x.png deleted file mode 100644 index 381c8795f3976c9f925b9d05f828b480ac50363d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14501 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 QLNBM+R@YOjP(elfFP<{*2><{9 diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-mono.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-mono.png deleted file mode 100644 index d1b40c4f068d662cfe32a147ae285f9abc576db9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6012 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 oIhoW>!Bk52SawE*8l(j diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht-2x.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht-2x.png deleted file mode 100644 index a27c17f5d52e4a365710155bd2ef7c0b18238ba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15441 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 TZ2|9$T{hlV)4q#TK}7yPi8ChQ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht.png deleted file mode 100644 index e01188021725c3c2247c0e0c841c1302c72bfbc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6610 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 VQ+$#x&?5Mc*3o>XfmMTs{U6>){)_+s diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht_background.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht_background.png deleted file mode 100644 index cd8b64069fc496b35b69019cbd24799efd9f795f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7654 zcmeHM_g7QR(?>+5NtcckMFc@0AiV?$MVb_)w*a9?=u$#`PzWUyk=~_9k#3|nC836n z(h&(A0!r`jUZ3yxUwD6b&v|psJ-ItOJD;7|o!QyBQMx*6x5-(_iHL}9KU0V36A@j* z{(VSq0+eDaQ%>NI%w65Yi-?GV{_k^*C?ks*AYSv*S9?lSImo^aG)Nqjw3Ud6YT_x* zp*M(#I0BwQlwSB<+nUoZ$yr74{W%L%m+(8US^M=5rRW!HTxMZrg3+M8otq39`^YK1CH24X^BY?$Q^dBE@Mg!i zO$cQ}3IvoBgs-4P#V&F-2Y)_mJnrVmq>$9CP8QCpkKqlXU5 zyWYKFeu(`@(+eK(w$UM<}h0+Vj<2b zUfx0$PqarLDN<~V5E}C+dOpIqU12+PXnB)Z2%tt7-%%Y2(!?K~<4w)l9i%jfX;)}g zkwX5#7fBTcX^G&l>yVKkidAF)!sQ~Jm|csjPnCG-EZMQy@C_r(-4A^9dr*fMJt!IZc4M>45k=w7+7Mw4+{9IAssb=}UbW zt0{MNHd&90Dn!XSILs8OLcVR6(?FR_WHVO~>BC2}K;?l<^$zx%L^n?=44Cp>PSkdj|9MGFyZz3aLhQ{}$9NSEdLh0pD0-Qt zA@ZvXKuIxqMe7iOip(srB6yzIo9MmC)8%Z_;OcNmm(*O9mu;D;o#AC=$=BsPmJcPZ zhh=jFw;T+?SXL8>_3{(~lfhx{&0f(yiNH1ZG#6+i%h_s&c|u8f-I~S835r|4iq!?bU%r8p*8+f~rr*}w=9C-epcZ}qjbGKI66h$)AVoS{AQNRltfIPoUK<_dzs+

AA$Dj*~o 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 E2XNyGdH?_b diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-blk.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-blk.png deleted file mode 100644 index 98e6505fbefe8c20d2ae70f48fdea13901e13b5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35028 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 diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-mono.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-mono.png deleted file mode 100644 index d6bf87de4559b17b4266f7684f7feb84e6ef2e6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31563 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 G1pOaZix*x1 diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-wht.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-wht.png deleted file mode 100644 index 5473dcaac256e60b1ae2bce7bcb25e545be84b1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34550 zcmYg&2Rzm7`~Sy5cJ`K8AtRJg*-9m49(yJudt}7HF{4N&5@jUWdlL?dGLmc#j$~vU z$~ZX2@BUQJ_y7OAo~P&OocnW+>%Qjux~>zed+RD4H5WAmL3G!zUDk)7V<-qB>7YCY zKCy~FWd{C3<$2B22ZGp6!T*w6*FU)qJ|ywczp4(EeBt>C{zB%cc2f<4$`fezZOI`h z`qA~vYK8$ME0gB>7FWl&55$biMH}e3UXMoYU)lUd8Fv*2{?N=6{2rX+w@DH}mdSYS zVt{(W4`IZ4#0+DeBKX6}_k&%S@3+m*Vj_7-)(+)mPib!(rzO2SvZk;r|nR?alX6NeoQc0Oi0-GP7D||Wd zBjpE{>s_fz_l=Wb-_(94-`8xqv^dv>Cq(@n1VMIcV3x}`wZ2?x!qV@m>W%f- z|GpBsiX+uFu_>M?d1&PE??b6$WXhPx_r3D-3&#UpD$I~S;(8qN4~53xll&clabnnk zm_03q4BSN?Z@ay)t6DfbVsxAO_rA>zIGnUre!+r;rulHPitZ}uzi-;XapFGTS~hjp zo=qyUWO-O*ix2*_9O3qFV#r;b8U1ua0xOf)B(Sn;X|=tYHf^R-LiO)`Pdl))m?rCh z^4o^ZHAWk4SBtuQ)%pH?TX(^%fkfy>J1w6xWrqD7xfX12nfSl&Fx6noLh7SFS2WG} z92}F^Sh|A{|Gu-Jl9)s@@~_k%E6k}sXgB`f=bT~mQg;3fHKG3wCwUo1O4|xfpZ;pBG;wIdcqTrk-3_4W z3j-?1a@f1HjdEtQPHXA>M}-7HXyeV0nU4>h=HxhyHjrXU|GvVAYC@8|#xLOYap&}m z<|d;i*Bbvj7_IIMsfF6Re4^mWO9hQ2`hPE>BB}Xs&kkRE^zf|^reZL;Y!%VF^Z&oh zsYcOzni7e`8-gqO@!9$({v-FXymb=EyR}>U#gwR}cBi%Wm7dp^KK@RJC%)Wmc4>`w zKH>4>-##J19)W=kQXOS-;EU^NOlX=_AW)Y_4bB>E^d3wV5M3?dSHc$}UWc?y`z1^# z+rMmt9QzM8_h)8i_OBcj5tWv<0uKk=2z~7MUoXVF8w?B#Cdkwvh@TbE^hMc3;IDBB zm2veZj@4>E-YHlKp!w@F->vdC`wGN+WHsgWFE%8+7#J9^WItp91c_k*_ZaqixDqQ8 zBsTag$<%5zxJ(q@h1z*ihpk6eSN0|JUEpJ zeGaBLR-=THBU_1Z6h%{3qZ9I_p(Rb)uYcSuy`r&VKBTYqfeAYpj*cyG*i!V%@MB5F z9@JYm;ufZQdU|TWHwYm3IG)Dhg%CfTk|&&Qrsm3%9&)v?q&prY6RZzLZnvmZFImwx zBR_>&vpWZ;ysr0|nq~&CViu9MeJ

LmQkyrpd*(Zr*HS0rXP^dhFavRfsEhQYowW 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 K9+oIszWG1m@P$VJ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-wht_background.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-wht_background.png deleted file mode 100644 index 44b7aa1648312a3a0f24d25343eeeda1a52802df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18281 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 EA9LQ(P5=M^ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-mono.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-mono.png deleted file mode 100644 index 9e0c5e5c232d6a7128a4441d387f7e21ab7c29da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30009 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 z 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 diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-wht-background.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-wht-background.png deleted file mode 100644 index 2c28cec6ff1dd6670ed411ced22ba4d450f7a04d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16912 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


#s0wc9YqMpz4>r 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 diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-wht.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-wht.png deleted file mode 100644 index 4d91bfce969d542e43c6bef4963d39c8fe98b7d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31636 zcmeFZbyQSq`vAIW1O$VUK`;S9N@9=}2?d5OX+ePjhnA93k436TH%JSJ#L%UHfaDN5 z0}L=Ap>+3sH|P7l-@5R4uYVQckd|cK@deN_@_%t z4enfA&5{QHJK=igo(BZ6UWNaW-POCY3~rKn=&30|Mctfp;DXZr7U~uRl|<6--=~70 zC)e&O-!kwa`+H#FZr&Cx>|bm#PBUBYupZ8!uKkb3Mh69 zw9{{^XP4i3UZM?G9H6C)R9vPth>$vi9u?o4yh(j4V>9Z+qwiOg-)`sf|NU{Wr}BYp zzVk|Oen(JIbX5Wb{hsWbf9@uOw?dTfk+LykPKjPuGtQ|Iio{W$$}pd5C#@2dak6hD zQ^e=i&}BhRY8o=e33F40sq$kdAnV`Y3qpU}R-Q*skIpz{zE-H{D?*}byp)#f((GiY zW|Gmk{pq>#tOajgY$_$>dhwYkl%&u26`8V#Q6}u818;4k5*8#U6JH-JBt{=cSd9?{!Z z@C9V!Z><>`(@y59`@c7kO9{NdNg?te6AFGRounqa8`zjGrGcQx*TPOP`Wso`V(6G$;DNt8NG zy`gr^$_aNMpg>uQ`<7D>DKENrE_j}{6*8FVn@?rxZq3$iYtjslN!TLp&XJO#;1CC} zwREP*?)85rtKt^1#Og5mU_88FdfB`LkvrqCFRZ;KPY>n3HgbgW-!!G3&J#)&9Sz&#$H|=GVE19smQ`r z9Jpg!>FP9rkE?&Owi2XC4$)=XFet9LmrMOKsnI8%`GgF50jSGodG<2)idBrHb5{79 z4Jh~-;3sBO`Sz;BE00XFG!uYa6@9_Q=U#G=9dr=i2Wtk!5`)maOiav(&Pl}*06<8V z=?HhGgTjqr_Fz4D^<3Zl@Sk*W6Z0v~i9sV0hg-$ssF4#8AK(T>w^bEwOc~-9 zz~~B*c(`f=Dc*-)6T88ci^Zce9lBamlW%e6kxG@A{B2N1^m(Ayh{osW1v z=9us;D0zD^+f3$f}G!SBTZQhaK62e)+p?o8U%gdg;{$R9>7;P!Dl zzZc4a>f*<8J2^F?^Tz@AEsO#w{geNaLgy;j>e5u&&u_DBe7gCkisg5w0+YT9FYOQG zJ&!uDx;9z++}j*ZuX{BJl;iB7dLI`noRq|SW!T6Y%I2rUol1%n;~-TRG@sPV%(uwl)tDkbN02* z{Y;I^05|Jnx#9i4C$;q6j)tA@3naTJ8o+5k@d3IPBZ@zl1Yk;=e; z(z2?yo}7}?P_HeZbluRm+%lsP1HnTdf!|X^9&GAgwLKK`1Lg%aASa(Fp>>%4E^?*^ zesTt(L78a6E8X{!Mls%7i`4&lHmz>^VJfY~H%R99-(|gGI~lru@s{MXG}emn-q#{| z9WzH?KNH8Si4eKY)AzO>jtJnyqVrpWg7!Kmo!Mxt+2Qxl2IFz5bL3wgi#U*|(z8_P zoNz$sIv}IHG8W}Na&-O5rRBMfEAJ{kYgDezX0O*-FhR5D03GB_Bb$Xr)dweEyc+m3 zT#Sj9tjYROLL@nWiu%(He-_7~0r?VbYLpq`WNXuDOag6dUAzNkK-2`2; zfve^igcD%eUN)ErA|V1ThNp7m9Pb|<^rXsOclOkOdY&8_xC=hYhL3Yr)=gNbHwcYn zMpj?LKQ^?5b`?da$NQtf(dyr%v}Y!&7jR&^`U|084WPeV=MvbXhxDH0fs?&gLoTQh zY8nrvVR;1y?}T5-<0=fS<7zPsO&p6*ONdZ4`#+kRUjoo-L<_vsegE8O`e0!;?`S3` z(mMn(I`9qXGz~xyS9Azx-+(03p4Z%v8z$1ZQ$E^2;&6{(CGEt}m<149DV|B*wy}-| zXVr5hIw#oi()DX00N6qRyNy}1`7M8R-|{3B)*FXLmc6iOe&~4?iUnsK|ME%geynqr zqnqgcwcQOTv#fAuN4mckpfpB+rPz!gr%^{G=U;r!Ow7jkpH@K+hdYyx-vBajeI#>G z!R4RRC=YC{|3V;h>nsl>^c?KfEb)Jo)QvNjh{*P3rvmsg2q!ZU2M2x85$mi1wk#JF z{ClY&$dPdH1)oPSsao-LxeQr91&qm>4}_=PhC9i~I3lU>0`n2l;fJAgurV-odi3tU z^fWW*RDizntJ+;5G_m8I6Ed*5k}Xpzz>5ead!c!bLLjuraa4 zqmj+*qm+%c@Di1?8ZF@t)jQjyLiX4HFJi{gfOYXQm7W6l4ZgejrcNs@mfjYyL_~2i{X0q^oy_Y?S{4hMs{iNsb7vHBj&7MT#n`2cfhA$oWM3A{+frfzW-T@ zST$s{k%V(%Rc3&U{k!oc#=kn1hL32c)5uKwL`)sBJSFLLBu z(S;hRfC)GMeyhClT9Ik3#5$n0BYr7^4`?S>H+W6?ScUGuLSvq(>^68-6?lL*LT4r> zkjt<_voO8ruVIw+=>lY434X0r=Nc8qkV5&?Yn%aKY%pNXkw!C?9F& zxQbSHI$f`cE9AS25P&^oN+=1I@+$MuNEzL@iez~Ptt_CcuW_<%iJeeX0C-Kh$JIBW zT63C8G-K{BAgmlr*l}4v*zQj-VSfX{)@sBSw1U%$P=eFi54RTbsh1X-`paL9aMqKc z9{&Wt{1Iq@uH46SLpP`UP+5lI1iQS?;Rr}55o{kXF3MkM_;?jax!eC6%|3MYa~FymV)5_wpjSAGC=&JBK7hKSRs(kL|~i?Kw+ zHXk(348R_nO*0)~HWnPak%4Ya*sS3T0XicIn8il)CoG2fv89+{Xu}D+`Tx_ko{;ql zyfC-yH0oOI0%yhH4Gn;Y4nx~mSF&XuuvhVh!$uE6_vhRpGSJ0N))%cw+91b2ZD=o9xG= zZU@_Hc|KNHRCe3MKCgmp73?e5>iv&^Xg5GW^AXF#$M zUBE0V0I-IRe<}9-7c*;zqru2*_VfG|F`!Ymqru|hFo#K5p!6nzd%#Tvc>?GdrySi7 z3#!al3`4PD4)d>oHRTDh0o-#0TiXY6bYg-+VS`S-zB~8-6}&4@91}n_#dNrXV+E6$ z&)oAfYRKvQ5{*jeJNTYEVndY~nQ_e^^obqp+4Seb?EMzV(o{@;ztE){8F{a&^H;oe zPk|GG1;J1E6qfwUW6abuFJQ!-GZqWyj6O_R!?vlh7p$W2{x4Z9VX~ZoZ`moIUF(fO zn)yBQJlpsgz5`T?IUq-`gw!ZzB8u-dp!rweY%rL>6meF@U74+0bw24bY#2`V5?BcK z+#71*d91M+KwvXho$YC?RbfaRftvg?`_ZW{3mTox7S6bU!Ht1Ut>eH$GQYCj4L`uo zk{Nm8RgRojfex|$3_oy8r~nL`XS%;)r1QaCLI^le#}f1s*f;h#*^F!WO(W)y*RGqd zXtyNOE97!02+Z%0HMYQT+bW+8_4E;{{haUi4?rNbDp>ONKlb3G<4VkF)I*J9_MVk! zVz)LK$`t9+yN5)qnRRw{GHC$6i23I|vc?_wQ+i{sv+eedL;n!iH!O0LWrV12fe*ee z`%Zj4sVc5=U$8O>7yw}5lVa{7$UvM5*7beUL$lGH>oa&~E-?m7LpUQK%*)$gU9eh# zRq@PF@4xaQfGb=0%GVA8qq-V0#SQr6>?&sC+wlhrY5cG^Y5Yu7aXQQ)LmNnn9xN%j zfM0d0bf4PV14YNHHTT((^Iy_z0JFzG%<5I)gD)fIu?`p35?Yy5k%ctS;2H45X!3P- zHfD*&P{7R-ms@K#N+w0o#GYn@3R8C?OZF_RFt{G+oKUf%!u%0~hoi3nK+@cSiPza* z@>^8JPpTDhsND?%`zL_?^LX&&1uY;+@ceB-YYXt{CL{7i6_Ww@bknC%x<9kbGI_YD zpX&ihF_5S~_Pug}lF~^(qb9z9#btCSxx2lZY46PEP$TSLgZ_QiuPQFl_vl=oxMrRs z;6W%Bh-Kl$I#lQe zpE6F8DcoUF1@o6}@Rmq&%;Oa9;3&XC(Up2XF9n#I(Apd_7PN}KQTo`GyhR?&4?r1o zIAnhjC%NFA-%_im-#wdM@fk5rCKV45^@hiW^MwO`Gq6#>yde-%kk*GHaknvr+^mNh zfnE((FT%MbT~ZKV3fT2&g&@g)CHKuMvK*a`+3YOILy7-9(EH7{ zgvHr(N4Qrp_M~q$IF7J-&YeHbEzOHWq=;p_5z|l*>wD6|X$y@@zt3{1 zor|2gtRMzm2T2^A=j5h&1h49|uGB|8+T5|rVq%O?2rqD!FLXu)mnKp|KfviBs4)#- z4uTi}uQe)#sXlQcvqwhAJ5An&bY$U!V9J6*Q=H6VncXChW|E6{8{+%vS|JHQ5RVu&sx>hHi`Lo9bK4e=B0ciV7s{r4}Ce8sZpBT%4FG8NlP^2UGO0_b8yLgw-5rT z>nx{zDrJML4t7iV(oB=WRdriEn1Y94!E=REHyu@!xfV;$nD$$R3y$_OC9@NCUzc5* z4*M4dNAV~=Wk&gC(Y9$F+3&V55*7^yb-=>;CrdSfaFtW__XT!SxXV zL1tvQq~o!LjCR0R)T;O)unFt|sReE1t0GxTd#&N4b=>_uO1{V#EQrwnLqWMpj4{_9 z9I{_^n!HbtBnk?)bRRw0n4cPL$IKuF-V1!~tSRY_*c?{H?6vV^BQS`T?h5D3ssPxH zBU1!UL~w|#<-rXak{jeP+`2yMzhVK%0rDX%@qmZPeptv`U1z2k07@?R4z7ZUBCh7Z zA*A{*WAHGnnZDH4*6Mf5+VTxY>pr4_24Ue@b%`QqXJZ_4UhX8+Zs6LSKT_wu2EZoI z89{5fZ*2dO^AZ1jZUR2}?gj}-u%j^^e4zOK>?26E4 zJ%Yh>fPGjxVqLSY?t4KXxfkVcaPeO)lZO^Na00g^oinI&K_)~eFB>B`dH-d?YrtE; z;fJ8$TQInT;+fG9G#(E2QkTH2S%M{HPGpMF@O61#5sio#2=_rkW%e7C3$kH4>9AVQ zVIo0xj=tVY&XCS|z^6(eM5hB8W1hua4vGO_xpIHNVJ)2F6nTRAwBL!V>md)$7bjDc z2=tw47{bp*FA>Uon5+X6wmmocc(*8m`E$Y9E~N^vhTOk}uiOGDQo{%`{&X7#ol5_) z6;ikkv0=Z}&ZLWCj3c8`!*{{NTXEDdBgW17W?y;_S2ZBan$J!<0rfyEA?dYJa-( zn{;&K1@&qGv5Ay54G?ios56_xDM<1+>7;+{Sale9)Bq?bL#8MUG+XR-tm<*XS`xn@ z`8qciUg0+){bI3~2ajztlDs<-ZyxgjCDJ5MAU{Q;zy(n zgE-o-irMw#gx1pi7({F{A#0x1dy~u|LA2@Yam8+D7oLLzy00)4cY?(>m|nWpZTDB5 zBt9H6`2?rK)56#4p1Z)@HoMm= zebT&wCq*-{@?aC>h8UpkALnd?J-)|2I?2N8MJXlO$lv*m2GlX!= z7^hAKr<`l)Z#9cN3L;WMIlvc7db){Dqihy!`~{AZbA_4h;h7&O+_#X3H-~?m3&t3s zu{$EvQdH@cJqZgA_$AfM8N$)hAQ3f|JQ8^3`nRT%XPX^9(&1+4TN96*h~g_BF*!?! zX-c@H(0C0>%?UxE?@ASQx$BwK-3URG@{lfahDQYC1JT_w#ugcY<9GW=p}~V7_5} zd_C7b=5X2ki(y(&;z&1w1N*$59a%EvK-(w)^7m4| z;nX%tvw>;X<_kz4dq20S8mzPbpTJq=0XWB(%~uRmvefVn@=PH^t@TUyQ_I|h>xO_c z)c|z5rHG^IR&&*4$}b{g$dJXh_zAzusmMdOee0``6eyc`GX7@4x(Up_vm^YPl-5k# ztVz>u1>x;n1lcS=nA=aK(N<5f*=Y3Hpp*H%WeZxp!syG(D_z1%)DS>C{aVOeJacvm zr6GH`YJKd%`Y+)n|7q$#>t#w?>t)rF^?OprBl=xea+^K**|+o%0=R=svzhRx>1V^9 z-rAe~ZS0MAKt4-xY$N+Y*tSYp3}A&Q0IxiM>{C=Z%HUUk;V}H3y;kbMh($j z+g=xR=4W(F{mEdmGht7g?y|fKFM|edm^>@fu^J1otMHs)j1Vj<3~@WrzcmMBb&Njv z>1hCBJN>$@*q2#>J7-sPb;=fhd(*w^K^*OG#!7w+z6HPFR#d6HP_5!uRjsio`79$0 z?=xO23Kxk)*nx?~S4}E~XS?;>Bi)$mmw5Z zCwa&rn#_4v-lzWLb1vrar}%=YAj_)c7RPNh8@-`#>0J-8sZ zR6&tu^GsByuC2f-Ahjn?^*j&yo!_2p=l}<~d;T+*gTs|J?DMfsHMahqc{}Fo2Zss@ zs0;E%&0Ur43NgiXK|{q9igy8AjuO|qgFrzIQ*$(-!k_&L>nSOC;O&{6t; zDE9K-?r(U%7A+#h=nrAyVg9qih* zTW|;`fGV8dBAEnWzf+ovr&7ZYOkU{-C+AOw-vw} z)bMctbb3Cij3E^4O$GH{i<%nY$oAs zGk2?(zDobHdLb)v#r3rP5K#+ZfhH{`=6-0-mG^sNJHEee?wKdvmMp7 ze*cV$<1lX0U#`+1%iFPRVI61kc6xf+9G$E@$0(VtN|bS77yz}2{N>KB;>7^~t`$_4 ztFzyHWZ%T*CU|qnr(KmQvbRHxm37Cz(}E*2Yld6(eCyGwXV12H8Xe%a+OLj=HRo6y z7)_;TJjiOLP6?SA z5ihy7m5iiT2i9FhBf2@En}t~aNyRVbs6m5^_%X|4rGvXi{D>ZFIkUSuIHD)_rhj^^ zwM(xAaRma=0P`Pf-7!@b!Lre+$%V=XS0i1d9p?Oj!(x5W{l(|06-`{ruL5v}T-(d+0|@A_u} zA#>H{X(Wp7kM0#xBJ0GsEV^lw zBi3zV=ntoJ*r3~(6eiC9Ppzm9sIu^N6O9|XqbJ=A#%~B8`6i=ltp0{qp>b1BLo0t5 z07zp+85hJ?r@gbdY<=3B{7G3fWIF6%T}O{gkgtH?BV;D|EBf`$y8W3eDv>Vgi9DS( zPg;>(cjXCIt3KK5KSQ{rEBA|%jcyPtEtVuj$U;CavgP}NZzfv8{tj=zO=JJ}?*&W% zzp4%T$g9f}h{KHGmwj*N|4f{SY)8aJNI+Ksv)Xtr_>%a{857Zc+qc$7?o$bboF}f= zjM@uLCX@g-$MEk9v%cpmnmH?*nL!O^i|3AFZw^5pltrjRTz|$47pYNYW7g2A1xCWA zmi1l@1Nm;wTZSbG$s;AA7=n%2fSLwM6w`t8I{M1rjmSZLK-Bd7KvIVQyI8k%tY|u` zCP#SgDGkow;UbD-a;U7n87^Mc4ZvAcN<@$YUE^}F?j~yZbFtQ~q^Bmf{12%0&;3y7 zeez7S*NMh3|3IMJfRjhN*oqj|{844ssEW;PdIe>Lp=5iX`ijb`ag zxp=VJZR|t_mqvS?t{Ue>bk2kjQ7k|Cbj++jOZ5XM)FXmTe|0;#KEhr)9PtW)j>>KH zY&aNNI|XO?XAAxNwA&5yW5soUR81PUW2Y-l6P4q`T&ja*Q}V{w4(b{X4j!-SzN}3* z>h!f`n9=^b zSR^)6rxlrOS-)L`y2wNKAyRmt>|*rvjOCa^C`Z`>zJb#@n0y@s_Uo$1Gj?M6y^mu3 z=X(B3g;uI_5vRgPi7fIdc?l%?w(0N+^jX6n$dv4py{X5|0_*?4tK^N%9be4H-9_xR z7#V8YmaTu9YN=X5x#+B)JL0L&Ei~QFz%mJ~3Ou%*f0!xBCFR1f{sOF1>Wkgyj4}&% zvW&BT675{v@_UxVVcg3Oq(OBYFlrvQjsK?$sQ2b_tKNGns?BP^H1mqz|>H z6zuf=!1NDYdp}cKsM`7ZJ?!Wh*Yv zJEW(4r0b>;6?rvtUIR1tXjriIXl}W=&|L=USm*lZ@mS#clDE@Mmn6wMKtl=v)nlIU z+@l4A4=mpWlgd*CC4$;_vTjr6Cr8d6Pt%=@2E9mePO+gDGIJgPATylME}k}b zbGGNyqn~km2uNSDf>P^IBgLzGe!keNEHM)<$NjVu)FkP>eTsZcH6B{K|Lm4}^dd5c zV}CpQeQMj_Uf z+D-$va?qV@1mr)lriN5HV2_Z;2t5CV0;`Ga!SLy5= zUX1k{a?8a|#smuZ%Uuq&v&An4!8?MAdlHhGRb7OdHGAF6#p;9b-aWb6ckx@ z_*fc#HPT+a=T;lLB?;yZ-M{`TY#<~Xb!m7!#%@B{#2#03+)6dBD~DUolNO;OMCFlpwwstw zCR*m8Y(T|#H-MN|r)0SK!mMjXT5{}fVd|krPRv^Cj=L;4r7yr`Rr^Fnwnt01c#36F zeoo7y_!&-u$steQp`cEV%LF7Lbe!XL5fJy9T=~0`rweA0{?S@J8mDSHg1aZsm(hA0VA<3j^xI4%8)t zrr_|lJV~H?;RRlDMgZ%^YL=&-r~qu}Jj)UTVV^w&9uCw5IwF!5bbdQ$MwIS`JD*eAUwc*i0zSYBf8owFa#8~!5l0I?$ z7)*N-HMX~f&o%0PsL!Xxh8L4B*O*6lrQKyko<^4ck|axPzYI>o~O*VK`amEcaTQ{R{t;>>h~>!ydl z{#>Gw&`7oH&d$GT11P6%pq#p=ylZ;$rHqrNJzAEsJ07~CvljwO5NCY@9oIFvdYE5G z*RqVgd)fIRQcAg`wAHG&H3UT0_W*z89k{O*$WTQF`QD{#0f`O8K2l;obzkP7Ffx;u zQ7tE0CM6GTrp6(3PkvIw)Xx%d+Zmw_id~RP)yhhIQ+$zlD`~W8#eN9o@7! zK6(GW8Esa4AYM)_C`>79e4~glBJjV;;xzx-6>@}V<6VQWr)Le%hFs@4hi^i0`p-vG9lipY8NKKon%aL`>rGoepbLvdg-+XyK)7~#_SuHYt>)vg%O z+-5&Zp8Nku2OhffOJTKkWLv|PRAfY!jf)En-1-ton!z^IM(5v5)P4Fj{{zBBd6GrSk1|LVdj#Wf#+f+EQv-U36EH41??y#LCu(lz#^$u70^tg!3SrH*<(vU3M zsPCF1zM^G}dCB))5tjR4Z!{b2l|haQ5N}3JbXAt>pxP4kq6W^_chQI z3(*F#bE!Bsw6dBW+p3%9EQ`CsH&ixy^ck?`+)Yp0t@xeRM&N#qH^RM+rh+pe9yO^( zU8@I&*6X_I*og|@Gr5E$p%?yIaH)jzw@wUl&$d* zVDtMDaW_2PDw$}1V?_9_iwPveruQml8q zDLtIoN}C<}L0a8u0Ueo64r`Y?8kTu!e!*GSiHdp7&-&$$1v;iL)pm?XjRYqtQ)TZh zU_tQxOq9XAy)eF^?;npAmJa&m_dVjjJ67P@$Kl~-EOs(%_4F$^xni{|N<)gDk6I%8 zj(7(GgF|3DO|wOznE^@>ld2chZ~7v2pZe$ZEO7_<%jEXMf{8;IQI)DC!mZk%lY>cn z{?Yg70=VZJRrc8YTqeUZS!rxt@OQsCxG#5BSfCTXKlK@@&_$Wq`#IPDsk(&TD=%-S4;M|_Sj9`63q-hzZewkM;`&Gl=!<=xx zDXj>@p00U8VPRrGb`Wk*~pCr+jWV>)~(D9~mQgi=|(uxRh z(?R4Xu6Y(XR~J)}T)=)a943>^d- zHsis*K~bP?X2Pc+>f0hO$$b6SI{iInrGQJGn6G+Le~y&+(pow{)BXD|3#Fz9P>v_}OURQCT1Cxtawpy6|C5(hLiBuYAP6g9=3mSg4jG#rQ;UT85dl`I7!sDFfOfFFOtb zHvZJwDn!s#PRFpFBM!(!t^cH(oidv$sAL+qu3zbY4(0Q(-)?~$G*kGcU=^bN!OYqB zo&^08-OtL&%I9WN1oTx4`Qvn&k()NnvST;jzSHjn~S_@y+LYzTKNT`Kfl|oP+~u3?#Q7 zMo1edi@Xd8v&qZo)5I}>q^g(m2mMaA$+FW#%Fr7(lMLx|yh*NKJ&Ay z($6%E?9Xd~Mw@}OH`<2jQmJ#|ElW3AtJP)gw$-t-vl-qAQ|mGRZhFWl_zbq~yJ&%iEp3p1zxy*mlSQg|u z(^(yb__2DpIvrfBt|_|I?<|=yVzV9&PTjL6-OWwi)lj|iiwqThuPZ*jmcNK zmb_$)^g8I9H%5>#-xYbO6wd!EJ|!Z|&L(j6hXEa@45dZH|D)+A!KfF>L3_nVemio`2yw}vgzh|^9bY#li*|H*58A`Vm?)+ zb97v0zkMHX=P5uJ+rw|_P zunMMHJxXXz`s)GeGbU-z!*M)x3N9l>M^b^G&nSw5t-l}lX8x^eiTWye)1($nIFyh| zG$_Z7Ha*-v?$Jf zHW@QeWY5a_iqz8av@;>;A{as(Sy$FgPHe@|{k)m*wX5b}&}7gQQUM%$>MB+j+4rbW ze)rq7noe9cI{Dp{-t@`AgR&Bi7kHveXoJYvmw;83%DMvcT#BN=oX#MFfsh4Ge2L1w zKPDiDEZRo~^C`v;OfA&)N91~ur=uPY~euc z-oBQUmH$Q5^Gq4@g}~XXqZEGGg!Q!nl43o6?F@Ts+X~dus%%>Z}CIW4`74nB^CwkR=+x(CRY4; zReT?_^>feOr@Qz(YVV4Tc>6@vdBFv7+`iL9JdR*xim&=YTrz$+lzhxkuJ^AdE!l{2 z70R=7zZm=4X{Q<_^~lY+_1cBPZ;NBw+YOi38THvxhM5}XaL@g$#7376iS}B)z;o8I;Vf_%{25lJSH(4Ox4RUau4 zw&_B)4l)*UTc6N8#&ondQP%@vWIgEKZ^BK^lY!k94cr8 zo=Z{$14jno+6X@~Egsp1ds~Ow0nEz@_^`>Z$6-0-rvb!u|KNA*k;S*J9#rXC0#?!MuhoSc z3!+(5f~s}~lfmp?q|(RYrS2u}fYm^#4){Q1Ahuj}&Ziv-eGh_v!eWpQ+!|%m{f}kv z&irj3xPCs}3R+^+(W&w`F!&`nIf^Bpl_(t02`+9?W9m(#7vIPfT;kSo7NCUrf5uBXa3+thy)6;vr7J9KRcog># zu2t{dMaXgnHR0=hGv)dcSKY9jnKt6il7y(B%@y2T%}2pta7E`e9BmZ8r=*f0tvvf0 zEQ`NB7YN2L%T9j=CB-26w5>9|+ZXW;NAFp`{~=@MH4Lk-+L=|5>|R~+B=fsWHFeim zj#@pcfTVbuPNt0Zw&W;dnrxn4lG37TlK!qYG6%J%0=1wo*PlqE1v>Xqs&3#yC@ z8j;?RkmVXB%d9H$vU#5{wHbx}bCPY>PB(q~wJSrw;BgC)^Sf8g0Fi0`I4@)B^U@$#3nYxc0VtEu#?U zw+A|?)HHgCOdb&vdQ}o!9l&u)Hwd55n~rZ@D$Z8qkn0O~-%Uev*dr#+cp`OOXyCFT zT}(l1x)LS*(4!;U9sJ(S*Qz~JDnnTR=f6&(Y>8`(bVHOnWnk9K(#2*y0P={A z6e>HNx|OHCFFoq?_4)doRB+Y&BF9e#c=pm@dvc!Pc8Kgl0XjY1(nN~l&Rx8@edn9^@hmP)qA&V2}U7BP%$LtW3B2kv^K zX4dd)Zw-PtMIexNb%(r{zuGZ4xW52X_-^j8&E+~Re^$vpYo0Ql+j5k)x!-$`N5cVv zQLce%Pkp?7cMfZ!2!j!~&%V9Sny@g~#vODD?sUxkK^iQs9~L@cAKi1R4S8I(r+6=e zQtg_Jkf9s@u__wM^q&ugt+l#JS4r1$cY&$rBiGqdHKy(h$V{_7)kUduG_Dy%rBeav z?DLn{Z@*v^#^023k!2iLi9+N2c^Ojw#(Ez*VWjK6aADSXM|qdcMql`wkr}9fgG{$z zWa?G}2(9Xk&~(1mF0noEo0Zzx!P55$j`CP**(Dn?*m5Fv4PA)*yAjxYGxwjy)p8dIoyNmdb<*e{Tm1dRt z{`&4l*YUu*2;f-Pao1Z&yrwW6H&y6rM{nYhUm$Ir4);WrcEUnmf2p>`XQ~I!M3>Ky z`P%(sId1;XjIT_k`5zAqjvL+NH6r`cX4ftR309(Ha$^Ze238uz{n1i@uJ(`AmM;p8r@Hu2)7#s|zwz=wj)E z4;C1|VrDho+}!*J{7l6O@DrsfF}<1q3@$)d(<0SscE3e%qcRcgQ0 z{|wcMX!H-aHEGqYWL{jeYn1{s!KQh{3x**`J-&Jb^n;Mb-zr+GAPlX?SnqR;&c5v- z4+bGUS+K@M_J-E}{(fw_3K(5Tb9}aPB1P^=i~tC*DImx|OC<0GbI35EVw3@jOXUS5 zeP->iDQ}#lwDKIX?&A@?4p0HQA^d+hh*z_LH6r%7x%D7`HL9jeg8&f%75-4a8- z5+ej!Qrem(uSD8$!1u*DFm1u+RqiSx)WIq2{vu-pLQRzXBT6WC9&o@-KE~3Y?l1)T*?w-S#1L3!LdbR>N+$=hef`V=$i*PZt`KxM zQe_jI0_I6~jRuHXb-40y3h<5Z*0oqH_8ot#H$|}JT=!_;*~fdA0JYAUi!6dxFnaKl z0xw9fbc^rivw~k8=@ocR-wIm2qM@`{SfG>TAE_nFGeK$I)GT4Ca!-DnizS0Cg~7R^^oA)TZVy=3_hBhQlT zSrJUMkeu;j5s(KN1?T*dWgSn*b5Zm4N)n(BzF~j}TdM*c<6zsCPVCJ{)l3_FK5nlE zIk&YRh!Za#{d5vC%$H=(p&F=jEn-jOfJL*iq2VZS*YnIlOb@dQ&>3O;&)ooLc+CMs z7`EF-=t~`5FnqwRdNeh^jIj?POOqX>A{|pcSC6qR?@}Tmf31picm3-okQ8E%Adw7W z&dIkz5n-@7$70_#{w=FkU?i%6ZlQ6@E9u#)-|qC2xsvx>PC45>ntHTjcPDmT z+@vD6)B7|aonroHZlGp(6&j}+F0vrpH9k-_KIb04F56dD1#XZe<2GBhs-c<*#g3n#!hgG#4t>6H-`~iODp;E@UmJ9qX za$ALxR99Cg0Wb!Zy&9t-Ia{t^;q5$n_pEEn${vWHg)eY_tVfas#%RIcaZzK`q!FbB zb5U@yHq`llM1fxf*DzpDCXOG|_twBN;>`;<34*L|`LTr6^l2u-->2^{fIn$@0{m_A zc8t>Y7=%iOI@;DJPo5w!gt3$Glg}DV|1vtb5NgVz`7dLG%h)Ns=PN*qyJz_bg3Iyu z=B6+U*I@`<;4)al^V%_j)3$RxV<8E{IZ}dyZ21UFpN#VarNuH0PP7L zExkc=zSZyLKgk9i%5pzp_YT6y0zF>7_vBaQUS+@B*n`#PprgAuaqa%LhH0yu9^RdI z3Jvbl9mS~>(DjatA%z{$WUV9KBkAHNt8M$0ejARK6mlnoTAH7^{Xac@c_5VE7xy4b z))tH+v?04BJ4F(*j5W&)QiSaL*a>BqEZKK6go;V_Box`V!q^65Ob9b!Z145`z3=N^ z_dauq}@1KCdiyg;`ki` zjxUK30vA%D><_8a-&Hp88j{Dx!prL3l49}X6q zkz~MND(!8`Be3u%sqNb#7qJ78jPA@GdON#1lz{2+M0irM?(JuRjXm$BUFW-ora`Xo}1%}>+N6Bg=Ujz*;{^pMCi)po7 zVFgt>8K9aF#}*OQ%anj0$jATPFDLCGdFX6eb%*T~TeN~Q5Rsou-t?w%D$HuOXWTB+ z=xM@;=h52f6+6QZFRv1L>W&(o>^X?Eu)37&P9r z)s4=Jtd?EJ+VJ~AH`8T#+Qljnv+5wbRQ#Y-j~@0}Ss+!8d8^zNGntXA`F){hX!EN? zzaf!I53G0iwl%_ii>U0cwj_;B0<*Bmvvek?j#ax*4*!a5!|N&AZGWUt&hpaDMdjxW zF2ANo*0zodi_ntw*M)qIu1o`kofpfy4-e>4TG`k@0n|3p0wr5~(*lLZKfCm%wQJUr zUd)v8wl%G79iC!ymCk9o{qs2XZe|8_mf>slGwbIJ-y!%36N*!D6q42ROfBnbf`>QU zTYiMah2_@Be^!ebRJ$!)0qq>#Ohh(NbEJXXwI!V2_xZd0#L0JUe1>=O%uh@!RI&FA zrv|^cA?x>9wuTmlxm!+fHmAb8T)S|89@6gu>aCvXC$57W028!mT zX|}Ln8}~2KVs8{uvlg1h!?JYB1pF zAiy<$=4H>b!d9-R@QQd`eyY;#qMK0Gu7I8HhR6OG*TpYvSg&tuu^c~UjmGT4LbLSB z$Kan!qbLUmA?C$T1ag4@@Ql8jVB0+lZKmO!$NXU#-fna|jo2X%0};>zdjMJCVg=Bor#s#c{W?_v5y$JK&;8EGQx z40WK`hDeW@3#d)ukk2nkMec&Zf9)mj?2#p{wJ-C~sMprjk%EoyGm(F{7+g2y;woEc z0_p2`XY7R++dYaUdpQ~uQiz<6(vv;i`IvR;i(#ui++T61IL=jRgX_y0aPn@*tdT^G2F?=`D;aENu5Fd%r<^Nb@e_hktW1BhnG#;f+-hly|tU% zR6Na>OW0=4$iXJ`jIq1t!m7{Jo%I<~3)XJ%K`P|BM&az5?`lZbSjF>+ zGiT;>*M0E=R273&rz?pshtv-3vAM#t&biC+V-n^v6o*w7Js5{DPz#+dQ;0~OigUmZBCEF zzGMRWrd5gyFMVzD`W+#Af%V2@CL!~LOD{kaBQYST$M@o~eOV1?bDPW0;eoLnmr`M- z`43girlzLb+~Et}Ous#h?=g{yOL6y`_P&Y#eq2W3O0?#VZ-U>|KSif2WIqlfrxsUw z-U0?V6WM-LgNf|CXz-^9wv2Y0-~DD|g{$VzG2w*?uuHQM@T*hj?n5C@(2oqUv=L~- zAVvS{g_#-zBe{^LlKpASwqb=tVdVWcQW7Er2hkWixcr?OuvQbr;?^KQ@lo7m0j-HT zC#_98ZB`o7Ke*8>JNG@cx|46BQ0xC%ZPWfQw|>4#%XN0I3zRd7`ZCq0qpwL&=hQfa zuLJqHl}b{`BkWKkFzdYf5gCgq4+%s=c(2mZ=RfYETpdza`3jFO5ulEFz5p1v7dL+=@E%Z&UMO^I3iwYa&v&$SKB9oNx z-a(APgzrTAI5_b?MOZIwcufj@h8iT2HGm8nm-I8NP^`zDw)hd(BYTLbf!{k+S@tW8 zL0d%cCn1<@m!tCXiuRZHW4B`;BLpOrjs#oel;xdtPVzWgHA%-zgpC@2Iz(z7DX9*t z?!+8OvCbxUx4#;mAm~w$SieZ&_Y7(O8H0z_jSY(_hD(W!q+J`t0MU#N*F2~j_j_$6 zi7Ygwhcs^btgD)%2;(1HFv}`|=H!xgd(%YB1RTu*9P;8~gIX2omjKRju$e@V(hChJ zG~3?!rA?tMrg!y0GK;4zxXCW;&V?!hZFmJUC9~9ZoOb4EWeME+>tVLXtXV>LkXPzq z?@vN|=kAZ8!vkYUm$~pP*)fF845h9jHr4XI<#zTr6C=yhz$53g`*n9uYlkAWQsIHD zUjEcZ7BcSJplVoBJ^UTZVthl6;{$6}z3Y>K`=eLELfNd5_4it2Xk+=lHsVFM0ynNH zd$!NH?cvcPyvzAD2RnH=%ZCk3uz;n#Z9Hy$Vox+w1%DVLcM!7ZlgJ-TM+p2&*xK4U z%#^AcWgh-g+1Wteiz6+xV!PiaVzYmCta}*zc#uXU11JU-vh&>>eUZk?gz$t;Y_z+? zz+QBTxP;MM4?A#1@b!JPtG1lriTY#KGcO;UH0}xG_Zy6Qe_%lfe3NuaDTlmm)#*=V z9KY`nHnwmOaiB|)5Bk+D8Ds&FA81G4x~?5hhvaU>hggqLG*?E=*PV`OwP3|vllt}p zJNM~p%B{W5#o$Q)Ls|>IZGCHuc1bnL&c5bjZXQwE1??*$6Dj@P$)lPzG!ME==)}4H zI4MQLbuCiJL~g>smMi5cV)tQDh{%ng=cm5Jo59H+;+&Y})AbrR?3;y_q8}W7Hetv!q3J5((`>8o!sIZR#5+J4*1$WgKU zOCfFJK=U)C_<oVF2rq?^0k6Y@wX83O8aMN<4ciLitl?G?> zRcm2C3Hy7J_6EaoxGI!c>y6Ekg9X*POWVbq#DisMnrYHV_UsvjOJTGtiR@$E_An;0 zNJ(GPWwW?Srf=Pss)A1~{>n7jyaS#9jA<^)2*KX0np8>Dc|Cj3xVqVa8mKb=#6;C$ zO!)cuWE8Xb1g<=-weVdzs=We#$<&Ek?V0T>_YLEVRhDI13j!l|CG$TdHhzA=^!Ytw zG&&+x7SK*YgUcwvN8WJ*nQ5{1V&HfmwE z$KjnbQ@8j$wRn+p;mk|qv%-+5X;X{6p%1vNgZcL9sx1M>;%9=^!zQ-jbC_X;%3i;}BgXFJlJyT%cX^I04H65w5P$pS@hW9m{GwR`k;?qXJBOp(F1zMaze^E&_TPFKSvjzK+^92413yg0t}#Vl9Nb^ubT*&q(RImDCppi45ec)>P0?XXdk~*BP+gTiagW7P{hB zY4y#lUN(B}>z1omYqMz2a*otri-xrKAI(2afqhU_ z$vH8pRdScur|xVedK`u8S)@-r|@~dC(Q^ByW7T{fP5fewmeccxkkd&xGe8! z&xrnsz3g_4%Lt>?bUWBxCCaP^|7pZEuoZ*(R%PnB0c zx=?p7eV_O6^V=DjbgkW34s^?3&L7ieVYbL)xfG=^AVgiD$8mDD9nyilF(3;|D&{?Z zi8`Y)u-`=!?wb4WoOnAISDkUnuUJpVaynK~F)@=d>Kptm=E!4;(Wpku9kxFk8x#Mg zd)G$GFFKsmppRpw+%(@-aB0w4{hXOWs5mGjYA;HcQ4gatjrx8r`M^S0@55CT`c#2j zKxBq5R;Pt*3Fw&BO;5HSUe!XnF2obEeKZ{_-ooFh7g!GqXt<*D?kSJ!jp&J;bU=uL z4uMPWI*8$oqql422C7+RP)!CXPV1F3D;YsL# zIABFoO6xAaP8y0YX1%SB6b*K(kax~G5+%B=egrZiuZN!1U82=)+wg!yrdG(C{1=pv z0EC7dwO#mH71CRqP@Gq>$vuUpwF{GzE3XHQnMy$8;Xcvo<*&ena!8%2IpXp`tu5n( z$Bbn{j1)08%x7Yty7$8I@kX7$z6)?=_Ska*zo5A8vvtxIniE=71}ZYkL$I^Zcq#?Q z51Sc61Hbx4C3yz&l)ae9VLtdcXa7DRTmbv~s268?w3!t8E}tX|2B627sR#olWpo9= zLdI)@cWbifhnBOPbs44o57edny(XND@EX^nfc(Q9d{3H4s*r)%U5Ic!h;aB!<-x61N%Tc|zN;iF z%8E%ST$0ZJ_q85r)&hmJzLOx(qtqqyCyP!^{*0~esdH>~_T2#YHdfJ=XG zh6CV!=By3Qd$ANN+lNW2i+`s~xVy2c6lX5I;~3!wIalRx9C&sLDlk;seiborp`3bTx6_)bYfxRD zp?r0tO36+vI7B2^h4n<{{qrq=0F^hfU1Kb@u=+sq+M8Jajz}>KCzQtN(Auqp^SsDc z4b8KDbVPc5#*~Gw00Nq$vd_ROv<#|9wGF8eo0>3?Ruk6>DGsEN2=^zeC`OE5>8pmQ zAWwgYjqXGST+}Qaw!pjH#SCBkL=r!n;nx0C-YG>dKje){b(_E9EeQL{wy{*!scqw} zt_IW9#|sDhUO~P`~n#ZL5V~f zF_`QmX%25J87&|1!K9J9{1gQ9U2HU;-fPS!O9MT;VJ%txi1kfr((~Ak*(Mw2?Ll~n zk6=p*R=4nx4_DYl$3jFH7K=>-II)mPwGbUfM49Wjhe|UuB@`rIadpoB_-PmTjO1pR z#YTYsG7~wX#K4MV@s*+GZsxuAMqDDjar}Hlx+24k zS6{Up288nZ37zQ#gG+QaTy+Ls78RW&gvCHok_t3_o(DJpp8PY+;ap+!gK8}{QD*V9 zINQv7*H78WMY6x#Zmyla-NFlzQI$-vmfM!do^9N4B|);JHo{ycjQK zEL{Jx)F8*QT$UQLn?OSB-O-UT0M(xgd#|hNnDQikTL3KknneZln#-L`T4pe2b)M*j z($edNTo64?9Wr(N{j2Sn2ge&d>3vuGLk^YdADz!> z=1iT09{JH=pw5uYLI-f{G3*LDS5XNa+Ebvi;KBpC(k5ju9>|w>RU7N;jZJpZd8(l* zuYfQWO|o!T=*x%}f2+Ha_L81V7_Ux!neFY8z)>3> zNKUu*gyG>`cUxK4>C8WCYZ~Y+fgf=h+^|v)_CF`bqqQmFQV8Z!y2fe4m-N}1fq zHc)=77&nQFSrlS+Lo?90|87io+R%a~&rBQ(1|JsPBkZWKR+zMR#n}9mWPWGSoI7(% zwGHGueBCc|)X`Fret@(+!WDfaDVOnDmc!5;DST7_>m64Lipc1RXs#L433wIrRBW}sqz4!U&wN>v?!@l1Siwqn)8g?O_ zB55vV}Z!=;2l(h59#hZ(!ppX;gZsQhWX}b1oJt(c+OrQy^$~Vu#1RxecgsK9DulNKa3XbxYEJYrDT|4FXGD z7W|{FwUIGI^RR>Cjyn%Txe$DL`}_M-uum21p%)t2g(r&LYbKwci$~v|cx}>=xQKVn zZ{=~Ex7FlcNu#PWo@JU@=}O>E6`J}bk5d@+d@iLAk^67hu#SSwCxXf_pzjN)2phC_ z28?G6TmGFS(&ldY7TFN?t@@Tw>ZU(FbegGTfcJ!TXh6`0V9_1_*wX|X2kQ7xYJ-=_ zJAI68Zx!5BoXe}#H@i8leXjZla2X{q(k19Orpt@p)u`IN6XoQFKA{#x0w7`Ec!&e{ z1gpFFbiZ5mNGefbTzjg95*HyQb0av<0>hMd&UiSM&G?-&I^>*>#Vi)v!kzOBII|?1 zoGG+y#N*QZb~5UV7I0!Sg+~q6ngF??V{X{^)+!Uq*cHv2aDVKRak*-C`s&1I&n4~6 z_D707o9p*z^;QSjxz zA7biZ4iTHwB~S?d#_~JTUhN2>ZiPukd%}n39sM1u;lTT?D3}ge^6)xixq9V8z%a?z zxTI(0#ni==?7MpkCm(opuqW5^>5^3z05HiAp?i6b*;^wK8)4*-1G5- zI-(L^OkJZ`DZynF=fN)Ok~cbe&WzCo{vT^&Tf@qtg1$u2LFv`kg!{!w5wDFs2&Nyg z$}tEnNd$xgx2L1J2#k8^r8zD48^F@%seecpFOZ{gME|24Sk7wfjaz*+iC*6~?tIWo zLT*h;Q@~Wb;hoHEn^;3gSx=(EUyp&EQeR(QO3AFVeSeAL!R6BQ-kb{4ksX5Wz@>J7 zsjl|s->~JMjYBltR0i)s)#6CkW>s}`6?j25 zN~gs&EUdr;&x7rv7y2pCqT(1$yg8M~h`P9A`E)jaP4BfHr z9*|Mo2xf3P;3R4#P?^nkP>sJ?jyz0b?U<` zPArgg@UK@2j_8oP7K%aV(;gHqC1MOz7iA17i0Ah;3|SRTVxnxC<%m>*58Oz;U!Y*O z|M<#?GG)8~7Lq?W-`S}gp*3q(+<@e-N@-2%0UkXj&nCxL?1*!Td+Ib!rh+R6K|S`k zz!&@AwM3DjMFrc^_#TS*6+^~i;bLPMs85`${o{_4sM;$Ln~ukl!8;^^k=O2WIVt~a zyZ>F|xbVvl=KZBtFVUk)8;yq6M(IIB;J~Pranhnl0)lTPQl958 z@rhsID%W>dz6?F9_v8-*y4F%^; z6sr-)8xL{BSca|}q=!Z4ZY*Z!D)6NWSxxTw(go`|@hC&wFJkI}otT;%DDlmu8cSH| z*_aZ?W!3P+iXix0@-f8EFKu%2{-&b3vwG(Km<+qRjXe2ZM+?xAd)v$4UWI+xW}M+& z!b#S!DruQN6fPohF=tO6He5A2R%cYsr&e`Y+ElBl#dlSHP>toUvyP8$#;ulTf9*nq zn_m#kZjjtgch{x~E-ltLk2-st7Z8razmf&=ly z^rIqmQ!o6$$BxAGLFT>y1c$c_(~Z{5V7Gs|A~uFr^Hp74W0Yg)?&q<7$l3`n{k+QT z2_(TK45eC?qDKbuDx~N=g+Q8nDu~+uE~9>f)4S3}HTc+W6Y7zQ*Ym?5l|7VNS12NAbe_Ti)47H+KvD%J=S@4eN0kZ&=@v7tvjiV} z3t;GkxP5AF&arf@FV>56MfYp=4pRzyxGR!=cqN9uH$}EIi)&k#Z;VVh3gxm}LT{9D z0#clGiOeTZRZzVVg^SY(N0r$q?baGPTxX}rK?ut|LsyTU0lGpwlo0pz-LWm&5=S^m zo#HKd0e59=;a!Pzm$^?zuOj{Yuk-tltF0PdhpIRsQwPMxb|PeZpy{VOA>|oNtTfNi zyiY3E!YaCcYpeK8V@#7GBgYAV;~A2z(wBQ#9m)C}PFitsZ2w%5jZWJ9)>_~?KiNrn-DCC-p2iC9Oxq=G?Fo31UIv82wHZ|9(qmUK9xif{CuG2cYRL0Rqz(aWV8LXx4XfUJZvXj&#)xeWbP_~{`d8j)#Xc% zD}!YtH)_{?JIN56vc~jPi=`_aNM?hIi*6b%*}UbLvoS>c!7m}qm*fdGc*;Zmqw=bC zhaiD0p@$*1#1Jljj8?OiN&YvUQogR4mK4?{hiiuy_{wUI%WLI~hRpVK`CX2t3CkP5 z4+0`d+XmCl6i07-*?6%5c&p(0alGS9fo|xh$CVx!6^H&x(gvP;u{U65qXHE%DUzJQzJL?2@X#MgRw_h)@?Ob z4L9E|5&d29db3HOoIL%gX#>RG9+XV=zjAU3TFAo?S^Ib20kg__Hn)E1HQ5I?)IxRO z$2{W8KFIrKNjAFfed~4RfoPj){RofH(_J;D0X`n@#l{k^_J1o0T$K5lTAW`@+M7*0 zjwEax&PQ1%;@;D^UVkymls&QUl;Xxf!=~IajMs?jkLd9FPKd%awZ2$%jqz3vrgW3O z7pK>04J7~nXWtH6ElPJ18db7DC9&^E^OH#G`A`nu`=NH_fd|(^a~yho>QNWFd&Sg< zml+1q{$D@A5kt73*ciL3VvB3&886T4jA@8Ll?~R?4v{6<=DLCzR&F89@y71^M;esL zMK*aJylFu$JK|VSVn(xgD0Q0m&9VJaW@{pSKE76xuyK6xc~aM<#U#S)-h}IuM@Jic zQ47VP;;Pm(VV>R_h1T~<$2v(fZ;}>U_-IlsLq~SV9VEvY(tC4Vtu3jS4SF3nZgW{T zcs>;rYu%2(re>Z0eJ7wea*B0(VnwLAEbL%dH960rEhJBU-D7VyaLk&%;JM@3#6`CX1NyYPJ@#?kq}siT zm#QzrwTUZDL)iDs%AYW({=}k4kNVU-$vK&=>_#{YB9}jHc!^AhA}i6|q7$kq-r3pN z*0>+Z4cCwYI!94hers>Z^=IYF381mW0l5DW*c(6^ZvSLFd%|LFt>>d7>9cn7iFz*k zZ?^xsV5oOh6QCjElFVU9LCAZ@5@oW$~<*ZXuU2b*4TlxG3D!pX@2T zSM=)rD{2V-jlFExf^ z{vxYutrxv@eA20ZM7#fd`UB2{b^ck365vu)?{V~5Q*)KZ`>^(ZdLhLLX@dpqj1^c` zNY7{XCaZ52b=}M@$+F3jKWT_B5umF1=cqFE8d2g?2;ngb+%cIjY&l1h-r*rv_C11h z84Q^g_Y+J-v7%sF_xWA(`Rfv&HcL8F^4Y@7P|aK)K(rvclD;aM)aZQ~x}ENJZ$n+E zzk=yxMl1-lp@PD#_g>WYiv5#lm1F9H2v#<5rQ9BLJHg;hnXUXTXZXl$CtEAJ`ei?F zF@Q_hr+PW#g|6<$kqO+L^`OEPAGNzwTyoH*_PjoKHLqo}m;tvk#wY-JG- ztG#N?Dp% z`Q#-OGL}`z20EI%Zf>4hu8SAsDmkz2;oBU+{KajFY>GU7_m2)oatJIar5GF`$^pmw z^M@?yRdLzFf&u5s3b3v7zs&!$)zgyWeKQfg06lJi%wZbin4FcrmVrno=*b5~zvsby z*-Bc@M7Dj;Z4%L#FTS>#+|j_GSIPw3r-`*X08)-LT_O(~20v6eY0S-2r&o?4cL;sq zkMJm~%Bpq0Y&PcG@87yqcg*vpU`g#>-$t%QMJN%4nap~H^VGaMp`iRqjah)pL33Vi zK$yip654hC+4+iluBoA8Ya?#Een*^;9Bm5*{8XGE3|J_^@6KhUnF@$TdXjPTZ28`| zav79O&XRjhUNhh1?}b}+r^l|kc`n`#fI3nA)DKC}WfL2td2>6DZPLE#13gj8uiaEa zQ!2M>E@CsKxi*bjztzO;+~11<(xrigemBhC3Iss+sTDI)A#af$bto z31^-E+*MG}X}&x? z>U@y5E`o9$hyRN>q>oeMKmpyjuI;*qOX6hNY|DeqLN_|T_#|&d%RNzat{9?HvAp$c zh$)hQ(pIX};R9K*ZFEa11=O{$MaZs>|MK%Xt8H88PaiI)Tt6$;;z9u*zTH-T`Z${& zZpA@EB*cxUZrj^rLF?y(3MGA@RgZ2iMFxYcu&cYUW)v+|!vhK01q+Fr9P#?@qWo_3 zIddqE*|>w!x6X?Clo^nb$}w6K8!H}qphLcJ`n$%3d;BU_xZ3VQlU4oae<+@o>jG^b zJy0Cj+WKh2>`oOha+A;Nl|t1svH_6YL;A(q?8{|R)1CB2;lr3x28?@Kb0lmERt}328{@6@fL7PHjnhYZLHxSA%zjl*c1Sdggbs>k5$m zZzV)Db|{3@`=8U* z90N}b;+3t6TGzvBT3O1iCw2Nu;;Q{9$X z3N<~S_1~3OJ%Q2JRgTp|w*06RxcT<|(W1ik_!SM6dR)2nGIS3Eh(vdY6S=)4ue$Tf z0$kSOCvKiyf8}!eYS8W5vl{0`f5Hk2iNiq>s|fYnC+A}DQO6cvCo7VgFB>o36c2V6 zw+-<$(Br=53^(Y<((Y-5@I392=vORleT3i8U>_WV5w}0QsX5ki3dtq4%r|Qv{|-2> zYMDWN#*(IZ%S%IExeI3YsNdnmw#90Vqq>ct@+XrQ5_&+srFmB^-*Rijx~HiKx1wp& zFY&$MT#jYoF(;f$Z|vhMkV%;P$l+V!aW2NWGPmv%#j^hQW4MeaNY-BQW9Grkwf&0a zJ7(^aSnp5L-^>p>cbp?1z>dscgyIgUb5-@-#OWn|5i}^TupW>CW5KH8#7mA!L<`|S z4`uQ(#=83!1R})%fgU&qot7xHt&Gs~V>-=PFw@_HZY+IWcib-l$}ilVAd8q|(+{iv RPRdIlS{i!ys?}^F{tw|!>bC#@ diff --git a/packages/branding/README.md b/packages/branding/README.md deleted file mode 100644 index 4310f3767ab..00000000000 --- a/packages/branding/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Taiko branding guide - -This package contains some branding assets for Taiko. The full brand kit can be found on [Figma](). - -## Naming - -Use `Taiko` or `Taiko Labs` for the name. - -Use `taikoxyz` for the social handle (e.g., Twitter: [@taikoxyz](https://twitter.com/taikoxyz), GitHub: [@taikoxyz](https://github.com/taikoxyz)). - -## Files - -Look inside of this package for some common files you can use. Otherwise, please resort to the [Figma](). - -## Colors - -Our primary hex color is `#E81899`. For the full color palette and further details, please resort to the [Figma](). diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Icon/taiko-icon-mono.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Icon/taiko-icon-mono.svg deleted file mode 100644 index c5a360a4ec4..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Icon/taiko-icon-mono.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-blk.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-blk.svg deleted file mode 100644 index 07be42d8fa5..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-blk.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-mono.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-mono.svg deleted file mode 100644 index a3f703443c6..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-mono.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-wht.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-wht.svg deleted file mode 100644 index 74b63e542e9..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-wht.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-blk.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-blk.svg deleted file mode 100644 index 210b2484787..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-blk.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-mono.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-mono.svg deleted file mode 100644 index 1b4fa1da044..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-mono.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-wht.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-wht.svg deleted file mode 100644 index 37b726687f4..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-wht.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packages/branding/package.json b/packages/branding/package.json deleted file mode 100644 index 16625484576..00000000000 --- a/packages/branding/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "@taiko/branding", - "version": "0.4.0", - "private": true -} diff --git a/packages/branding/taiko-icon-wht-200x200.png b/packages/branding/taiko-icon-wht-200x200.png deleted file mode 100644 index bbe444a7b826c2a5d8fdcf9853cf6b750e39c632..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11958 zcmc(FWmH?;)-LYu?ry;;?pCZg!7Vr>xI^*cv`BHEGSO^FRxaw+3dQbPEKNkkt(|5H= zP2tlG6QTz6MnJ$O{&OKBK2B`pv zCk5^x9~*`McQ+4ji2!M)zw}BxjsHvom>B+o__#_l$^S9PV50ScK@sc)Vi4uy=e6VK z7iAC==d-u5wXw6cS3j+j%dHMMzgv2F;g&F?&VR|y>W$z%Nr=;>vV^2@g zOin&N5D5Ul-`}6lUx*Lv

ZE7Z(Tc3jzcMd7lux-hm!IHUYdI-pv2fpak-^^Kypx zIDl$xY@zY#1p4dc1(m&z{BNM~lfs{}LyMeu)3_p1% z^zZZPii$71zz)uCPYd39stOG1%8H@_;-aFwf_wshxvQlmq3+@BW8+~5Qdg2@dI}Gp zv$MT~g8;~0Oh8bC*Ir0em{(ZDo}c%bjrcQOetR1sF_5URy&b>!zvPv`cD{d-;9v6g z|CjPQUd~TdXyf)@*7K(}|74GZnzQ%Qz6SoYc=SP@{~WnFGyIh>5;k^!3PGC5?oS4Q z?3w;K?fhSkz(3UbJAs~*{x9<4A24sQgO9(B7f9amDO&#rnFn}sAMmGW|G@`tLZ3X_nwuafd2Pie=R2Fx00vqZ=G>o!a&ljtY% z@CZw936RQbDGSS~t#r)f+TDGp_pZJ_x>^pd?byzDg{??;6^;KogI-bDNd?#3}kHea&_OI*q~uconba=W6YHG;AeXd&?Y*Gqwlufd`ya2h1>p^w;YdQ^$t## z!H~kZzLjWhv~%W6^GN9;VGa@9xe{Byun8eq7py`@gu!02`IGP#!9AjzNnqHMfz*pE zS0roGgN{BOw{A~DUZO?^su&jS>RLs3?bt0L=?gHx)3h)(_a(It*3LuTj6_h3`j!4{ z{Af}Z(ylo**=x)WCn4OlQ1j6QD{9jD-_x|!V#KZLx1(^(ReG2kH_A9#M|i{GoR!l> z^x`rN3PQYGfLA3KWWR$*BRYdlP)znwZdJdUYahWBi)FmckcU8f_nG9qS2|-ELSo*V z-nPgasmrxk)wu`fX>Vm<_oQ7<(VkJ`!qjty4$E*OKQ}WL0h**j%Pf%7sT6fM6RLFm z=&9>gEHlx&cjViQzYCyA0I)rAQ0@tJ6~tGJ+*y@7;$WpC_({^LBnlK(zP9*)wvk@f zS$49xf}l;(u};eQQSxi{_bRi`2VtXUWjH|t^Nd<&6h|h>9$Cv|XE-mI%j8iz7@0$A zagZY16);FTA~P7q&)${_OC_r_Oq*)G8L|zkdNZC3yhLubED

Gi5sOk5zVW>Bj(a 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 BQZfJl diff --git a/packages/branding/testnet-token-images/bull.svg b/packages/branding/testnet-token-images/bull.svg deleted file mode 100644 index deae0a33f16..00000000000 --- a/packages/branding/testnet-token-images/bull.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/packages/branding/testnet-token-images/horse.svg b/packages/branding/testnet-token-images/horse.svg deleted file mode 100644 index 2fdee8a6793..00000000000 --- a/packages/branding/testnet-token-images/horse.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/packages/branding/testnet-token-images/ttko.svg b/packages/branding/testnet-token-images/ttko.svg deleted file mode 100644 index 9e02705a372..00000000000 --- a/packages/branding/testnet-token-images/ttko.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/packages/bridge-ui/CHANGELOG.md b/packages/bridge-ui/CHANGELOG.md index 475bd4f6832..95b3a0b3280 100644 --- a/packages/bridge-ui/CHANGELOG.md +++ b/packages/bridge-ui/CHANGELOG.md @@ -1,5 +1,68 @@ # Changelog +## [2.13.0](https://github.com/taikoxyz/taiko-mono/compare/bridge-ui-v2.12.0...bridge-ui-v2.13.0) (2024-12-17) + + +### Features + +* **bridge-ui:** add curve ([#18549](https://github.com/taikoxyz/taiko-mono/issues/18549)) ([fd6feef](https://github.com/taikoxyz/taiko-mono/commit/fd6feef545c2432eea8e71c68dc3f3964fe65c17)) +* **bridge-ui:** add padding when claiming to smart contract ([#18141](https://github.com/taikoxyz/taiko-mono/issues/18141)) ([ce5d485](https://github.com/taikoxyz/taiko-mono/commit/ce5d4859a77631ec406ccb5d571efcd91e5fd2f8)) +* **bridge-ui:** more detailed transactions view ([#17899](https://github.com/taikoxyz/taiko-mono/issues/17899)) ([6fe7c44](https://github.com/taikoxyz/taiko-mono/commit/6fe7c447b7c9c13b5868c65c69a9ddfeb968901a)) +* **bridge-ui:** remove fee padding ([#18546](https://github.com/taikoxyz/taiko-mono/issues/18546)) ([3966bb1](https://github.com/taikoxyz/taiko-mono/commit/3966bb1cea358923284de74b81e3ce512b8291dd)) + + +### Bug Fixes + +* **bridge-ui:** balance visually not updating correctly when switching chains ([#17832](https://github.com/taikoxyz/taiko-mono/issues/17832)) ([f495e40](https://github.com/taikoxyz/taiko-mono/commit/f495e406633fc9349e8d3a125c463c0be1e15b66)) +* **bridge-ui:** increase pagesize ([#17886](https://github.com/taikoxyz/taiko-mono/issues/17886)) ([9e38a33](https://github.com/taikoxyz/taiko-mono/commit/9e38a33cd361dc6bd2e2e77a8017151eb08400f3)) + + +### Workflow + +* **protocol:** trigger patch release (1.10.1) ([#18358](https://github.com/taikoxyz/taiko-mono/issues/18358)) ([f4f4796](https://github.com/taikoxyz/taiko-mono/commit/f4f4796488059b02c79d6fb15170df58dd31dc4e)) + + +### Build + +* **deps-dev:** bump @sveltejs/kit from 2.5.7 to 2.5.21 ([#17901](https://github.com/taikoxyz/taiko-mono/issues/17901)) ([7a32ac4](https://github.com/taikoxyz/taiko-mono/commit/7a32ac40a654521c82cb3ff5b6f5af87d0a915a4)) +* **deps:** bump github.com/stretchr/testify from 1.9.0 to 1.10.0 ([#18539](https://github.com/taikoxyz/taiko-mono/issues/18539)) ([79f3fab](https://github.com/taikoxyz/taiko-mono/commit/79f3fab5f1d1ec1bb4ee18afb9268b622e894780)) +* **deps:** bump golang.org/x/sync from 0.9.0 to 0.10.0 ([#18560](https://github.com/taikoxyz/taiko-mono/issues/18560)) ([3d51970](https://github.com/taikoxyz/taiko-mono/commit/3d51970aa0953bbfecaeebf76ea7e664c875c0e4)) + +## [2.12.0](https://github.com/taikoxyz/taiko-mono/compare/bridge-ui-v2.11.0...bridge-ui-v2.12.0) (2024-07-18) + + +### Features + +* **bridge-ui:** configurable destOwner ([#17721](https://github.com/taikoxyz/taiko-mono/issues/17721)) ([3220a22](https://github.com/taikoxyz/taiko-mono/commit/3220a22ad11fb3bded7e1641b1de93d5a391461e)) +* **bridge-ui:** fallback gasprice for processingfee ([#17578](https://github.com/taikoxyz/taiko-mono/issues/17578)) ([c621426](https://github.com/taikoxyz/taiko-mono/commit/c621426c430bd01a3f7dbbb39058e8357601c507)) +* **bridge-ui:** polishing ([#17460](https://github.com/taikoxyz/taiko-mono/issues/17460)) ([a3faee0](https://github.com/taikoxyz/taiko-mono/commit/a3faee088ee5ed235f9b4020aa2afce77d0f8108)) +* **bridge-ui:** relayer component ([#17777](https://github.com/taikoxyz/taiko-mono/issues/17777)) ([458e259](https://github.com/taikoxyz/taiko-mono/commit/458e259e3f2cbcf316d27a239fc19a7ca417ce4d)) +* **bridge-ui:** rounding fix. ([#17409](https://github.com/taikoxyz/taiko-mono/issues/17409)) ([eac7434](https://github.com/taikoxyz/taiko-mono/commit/eac743445b9a1c21ed03aede036098ba3add261a)) +* **bridge-ui:** update usdc wording, add minimum fee check ([#17419](https://github.com/taikoxyz/taiko-mono/issues/17419)) ([07211da](https://github.com/taikoxyz/taiko-mono/commit/07211da83c9f5ca782fc5d9a02680968bf81ee24)) + + +### Bug Fixes + +* **bridge-ui:** bigint conversion ([#17534](https://github.com/taikoxyz/taiko-mono/issues/17534)) ([4279ccd](https://github.com/taikoxyz/taiko-mono/commit/4279ccd59024578d51b39a6b26a0138409a42f44)) +* **bridge-ui:** fix claiming for recipients that do not match srcOwner ([#17576](https://github.com/taikoxyz/taiko-mono/issues/17576)) ([6eaaa12](https://github.com/taikoxyz/taiko-mono/commit/6eaaa127bf12df486ce648f66d719138631e851f)) +* **bridge-ui:** fix funds message ([#17507](https://github.com/taikoxyz/taiko-mono/issues/17507)) ([55293a5](https://github.com/taikoxyz/taiko-mono/commit/55293a5208f729964279fb07056a90b08e56a4ec)) +* **bridge-ui:** fix manual claim issue ([#17518](https://github.com/taikoxyz/taiko-mono/issues/17518)) ([3f5b73d](https://github.com/taikoxyz/taiko-mono/commit/3f5b73ddf47dd1c9853d5d2d9a75e8cd95ecccbf)) +* **bridge-ui:** fix parsing relayer ([#17551](https://github.com/taikoxyz/taiko-mono/issues/17551)) ([1b3eb90](https://github.com/taikoxyz/taiko-mono/commit/1b3eb9029ae7e6903496d774c9c115c73774c097)) +* **bridge-ui:** fix USDT approvals ([#17539](https://github.com/taikoxyz/taiko-mono/issues/17539)) ([37cb7af](https://github.com/taikoxyz/taiko-mono/commit/37cb7af834d189051c2de895b384997c4fc13b9a)) +* **bridge-ui:** handle local tx better ([#17684](https://github.com/taikoxyz/taiko-mono/issues/17684)) ([3455e11](https://github.com/taikoxyz/taiko-mono/commit/3455e11c5f82b25fcb9a35d2f781b46891493372)) +* **bridge-ui:** increase gaslimit for erc20 ([#17531](https://github.com/taikoxyz/taiko-mono/issues/17531)) ([3a7268d](https://github.com/taikoxyz/taiko-mono/commit/3a7268df33e5f778b22b7624c4baec6739083641)) +* **bridge-ui:** lock continue button when fee is calculating ([#17548](https://github.com/taikoxyz/taiko-mono/issues/17548)) ([5781b33](https://github.com/taikoxyz/taiko-mono/commit/5781b338221dbe1e8ab2a1556ffeeaa239b8d957)) +* **bridge-ui:** msg value mapping ([#17554](https://github.com/taikoxyz/taiko-mono/issues/17554)) ([e58d41a](https://github.com/taikoxyz/taiko-mono/commit/e58d41a39b7e132fe094d04bb453929155f4ba4b)) +* **bridge-ui:** recallMessage fix ([#17547](https://github.com/taikoxyz/taiko-mono/issues/17547)) ([11755d1](https://github.com/taikoxyz/taiko-mono/commit/11755d164a532980214e69219d328fa66a06f6cc)) +* **bridge-ui:** small fixes ([#17375](https://github.com/taikoxyz/taiko-mono/issues/17375)) ([5236d0a](https://github.com/taikoxyz/taiko-mono/commit/5236d0a50a82e3915eb955962ccc930110d6274e)) + + +### Chores + +* **bridge-ui:** add DAI ([#17714](https://github.com/taikoxyz/taiko-mono/issues/17714)) ([3439579](https://github.com/taikoxyz/taiko-mono/commit/3439579356c8f8bfbcc77b68c1d08cb142ab4196)) +* **bridge-ui:** add symbiosis ([#17505](https://github.com/taikoxyz/taiko-mono/issues/17505)) ([9e504d2](https://github.com/taikoxyz/taiko-mono/commit/9e504d27976d25da89a48e7a4453f6e36f8055f3)) +* **bridge-ui:** update stablecoin warning and campaign info ([#17716](https://github.com/taikoxyz/taiko-mono/issues/17716)) ([c370c7e](https://github.com/taikoxyz/taiko-mono/commit/c370c7e0976bbe1160b074be665d751410367d16)) + ## [2.11.0](https://github.com/taikoxyz/taiko-mono/compare/bridge-ui-v2.10.1...bridge-ui-v2.11.0) (2024-05-27) diff --git a/packages/bridge-ui/package.json b/packages/bridge-ui/package.json index 18cc131771b..601c5923d39 100644 --- a/packages/bridge-ui/package.json +++ b/packages/bridge-ui/package.json @@ -1,6 +1,6 @@ { "name": "bridge-ui", - "version": "2.11.0", + "version": "2.13.0", "private": true, "scripts": { "dev": "vite dev", @@ -23,7 +23,7 @@ "devDependencies": { "@playwright/test": "^1.43.1", "@sveltejs/adapter-auto": "^3.2.0", - "@sveltejs/kit": "^2.5.7", + "@sveltejs/kit": "^2.5.21", "@sveltejs/vite-plugin-svelte": "^3.1.0", "@types/debug": "^4.1.12", "@types/object-hash": "^3.0.6", diff --git a/packages/bridge-ui/src/app.config.ts b/packages/bridge-ui/src/app.config.ts index 2ae6db4e931..8c9ebc03692 100644 --- a/packages/bridge-ui/src/app.config.ts +++ b/packages/bridge-ui/src/app.config.ts @@ -1,8 +1,8 @@ export const gasLimitConfig = { GAS_RESERVE: 650_000, // based on Bridge.sol ethGasLimit: 100_000, - erc20NotDeployedGasLimit: 650_000, - erc20DeployedGasLimit: 200_000, + erc20NotDeployedGasLimit: 750_000, + erc20DeployedGasLimit: 500_000, erc721NotDeployedGasLimit: 2_400_000, erc721DeployedGasLimit: 1_100_000, erc1155NotDeployedGasLimit: 2_600_000, @@ -42,7 +42,7 @@ export const toastConfig = { }; export const apiService = { - timeout: 5000, + timeout: 10_000, // 10 seconds }; export const ipfsConfig = { diff --git a/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/ImportStep/ImportStep.svelte b/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/ImportStep/ImportStep.svelte index 7a86cff7250..b928cf206cc 100644 --- a/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/ImportStep/ImportStep.svelte +++ b/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/ImportStep/ImportStep.svelte @@ -1,7 +1,7 @@

@@ -326,7 +342,7 @@
- + diff --git a/packages/bridge-ui/src/components/Transactions/Rows/NftTransactionRow.svelte b/packages/bridge-ui/src/components/Transactions/Rows/NftTransactionRow.svelte new file mode 100644 index 00000000000..51214d9396c --- /dev/null +++ b/packages/bridge-ui/src/components/Transactions/Rows/NftTransactionRow.svelte @@ -0,0 +1,289 @@ + + + +
+ + {#if $isMobile} +
+
+
+
+ + {shortenAddress(bridgeTx.message?.from, 4, 3)} +
+
+ + {shortenAddress(bridgeTx.message?.to, 4, 3)} +
+
+ +
+ {#if loading} + + {:else} + NFT + {/if} +
+ + + {:else if $isDesktop} +
+ NFT +
+ {token?.name ? truncateString(token?.name, 8) : $t('common.not_available_short')} + #{token?.tokenId} +
+
+ +
+ + {shortenAddress(bridgeTx.message?.from)} +
+
+ + {shortenAddress(bridgeTx.message?.to)} +
+ + {:else if $isTablet} +
+ NFT +
+ +
+ + {shortenAddress(bridgeTx.message?.from, 5, 1)} +
+
+ + {shortenAddress(bridgeTx.message?.to, 5, 1)} +
+ {/if} + +
+ +
+ + {#if $isDesktop} +
+ {#if timestamp} + {timestamp} + {:else} + + {/if} +
+ +
+ +
+ {/if} +
+ + + + + + + + + + + + handleClaimingDone()} /> + + diff --git a/packages/bridge-ui/src/components/Transactions/Rows/index.ts b/packages/bridge-ui/src/components/Transactions/Rows/index.ts new file mode 100644 index 00000000000..64e41f1f2ea --- /dev/null +++ b/packages/bridge-ui/src/components/Transactions/Rows/index.ts @@ -0,0 +1,2 @@ +export { default as FungibleTransactionRow } from './FungibleTransactionRow.svelte'; +export { default as NftTransactionRow } from './NftTransactionRow.svelte'; diff --git a/packages/bridge-ui/src/components/Transactions/Status/Status.svelte b/packages/bridge-ui/src/components/Transactions/Status/Status.svelte index 868218e8a6a..8c0d8efe8ea 100644 --- a/packages/bridge-ui/src/components/Transactions/Status/Status.svelte +++ b/packages/bridge-ui/src/components/Transactions/Status/Status.svelte @@ -8,6 +8,7 @@ import { isTransactionProcessable } from '$libs/bridge/isTransactionProcessable'; import { BridgePausedError } from '$libs/error'; import { PollingEvent, startPolling } from '$libs/polling/messageStatusPoller'; + import { bridgeTxService } from '$libs/storage'; import { isBridgePaused } from '$libs/util/checkForPausedContracts'; import { account } from '$stores/account'; import { connectedSourceChain } from '$stores/network'; @@ -15,14 +16,14 @@ const dispatch = createEventDispatcher(); export let bridgeTx: BridgeTransaction; - - let polling: ReturnType; + export let bridgeTxStatus: Maybe; + export let textOnly: boolean = false; // UI state let isProcessable = false; // bridge tx state to be processed: claimed/retried/released - export let bridgeTxStatus: Maybe; - + let polling: ReturnType; let loading = false; + let hasError = false; function onProcessable(isTxProcessable: boolean) { isProcessable = isTxProcessable; @@ -31,6 +32,7 @@ function onStatusChange(status: MessageStatus) { // Keeping model and UI in sync bridgeTxStatus = bridgeTx.msgStatus = status; + dispatch('statusChange', status); } async function handleRetryClick() { @@ -69,6 +71,16 @@ // TODO: implement release handling } + $: if (hasError && $account.address) { + if (bridgeTxService.transactionIsStoredLocally($account.address, bridgeTx)) { + // If we can't start polling, it maybe an old/outdated transaction in the local storage, so we remove it + bridgeTxService.removeTransactions($account.address, [bridgeTx]); + if (!bridgeTxService.transactionIsStoredLocally($account.address, bridgeTx)) { + dispatch('transactionRemoved', bridgeTx); + } + } + } + onMount(async () => { if (bridgeTx && $account?.address) { bridgeTxStatus = bridgeTx.msgStatus; @@ -87,8 +99,8 @@ polling.emitter.on(PollingEvent.STATUS, onStatusChange); } } catch (err) { - console.error(err); - // TODO: handle error + console.warn('Cannot start polling', err); + hasError = true; } } }); @@ -110,20 +122,38 @@ {$t(`transactions.status.${loading}`)} {:else if bridgeTxStatus === MessageStatus.NEW} - + {#if textOnly} + + {$t('transactions.status.claimable')} + {:else} + + {/if} {:else if bridgeTxStatus === MessageStatus.RETRIABLE} - + {#if textOnly} + + {$t('transactions.status.retriable')} + {:else} + + {/if} {:else if bridgeTxStatus === MessageStatus.DONE} {$t('transactions.status.claimed.name')} {:else if bridgeTxStatus === MessageStatus.FAILED} - + {#if textOnly} + + {$t('transactions.status.releasable')} + {:else} + + {/if} + {:else if bridgeTxStatus === MessageStatus.RECALLED} + + {$t('transactions.status.released.name')} {:else} diff --git a/packages/bridge-ui/src/components/Transactions/Status/StatusInfoDialog.svelte b/packages/bridge-ui/src/components/Transactions/Status/StatusInfoDialog.svelte index 3dc7f7245b5..672480a605e 100644 --- a/packages/bridge-ui/src/components/Transactions/Status/StatusInfoDialog.svelte +++ b/packages/bridge-ui/src/components/Transactions/Status/StatusInfoDialog.svelte @@ -3,13 +3,12 @@ import { CloseButton } from '$components/Button'; import { Icon } from '$components/Icon'; - import { uid } from '$libs/util/uid'; export let modalOpen = false; export let noIcon = false; - const dialogId = `dialog-${uid()}`; + const dialogId = `dialog-${crypto.randomUUID()}`; const closeModal = () => (modalOpen = false); diff --git a/packages/bridge-ui/src/components/Transactions/Transaction.svelte b/packages/bridge-ui/src/components/Transactions/Transaction.svelte deleted file mode 100644 index a27e720be9e..00000000000 --- a/packages/bridge-ui/src/components/Transactions/Transaction.svelte +++ /dev/null @@ -1,289 +0,0 @@ - - -{#if isNFT} - - -
-{:else} - -
- {#if isDesktopOrLarger} -
- -
-
- -
-
- {#if item.tokenType === TokenType.ERC20} - {formatUnits(item.amount ? item.amount : BigInt(0), item.decimals ?? 0)} - {:else if item.tokenType === TokenType.ETH} - {formatEther(item.amount ? item.amount : BigInt(0))} - {/if} - {item.symbol} -
- {:else} -
-
-
- {getChainName(Number(item.srcChainId))} - - - - {getChainName(Number(item.destChainId))} -
-
- {#if item.tokenType === TokenType.ERC20} - {formatUnits(item.amount ? item.amount : BigInt(0), item.decimals ?? 0)} - {:else if item.tokenType === TokenType.ETH} - {formatEther(item.amount ? item.amount : BigInt(0))} - {/if} - {item.symbol} -
-
-
- {/if} - -
- -
- -
-{/if} - - - - - - - - - - - - - - claimingDone()} /> diff --git a/packages/bridge-ui/src/components/Transactions/Transactions.svelte b/packages/bridge-ui/src/components/Transactions/Transactions.svelte index 8c278355759..d26de657103 100644 --- a/packages/bridge-ui/src/components/Transactions/Transactions.svelte +++ b/packages/bridge-ui/src/components/Transactions/Transactions.svelte @@ -3,7 +3,6 @@ import { t } from 'svelte-i18n'; import type { Address } from 'viem'; - import { Alert } from '$components/Alert'; import { activeBridge } from '$components/Bridge/state'; import { destNetwork } from '$components/Bridge/state'; import { BridgeTypes } from '$components/Bridge/types'; @@ -20,18 +19,18 @@ import { Spinner } from '$components/Spinner'; import StatusDot from '$components/StatusDot/StatusDot.svelte'; import { transactionConfig } from '$config'; - import { PUBLIC_SLOW_L1_BRIDGING_WARNING } from '$env/static/public'; import { type BridgeTransaction, fetchTransactions, MessageStatus } from '$libs/bridge'; import { chainIdToChain } from '$libs/chain'; import { getAlternateNetwork } from '$libs/network'; import { bridgeTxService } from '$libs/storage'; import { TokenType } from '$libs/token'; + import { isDesktop, isTablet } from '$libs/util/responsiveCheck'; import { account } from '$stores'; import type { Account } from '$stores/account'; import { StatusFilterDialog, StatusFilterDropdown } from './Filter'; + import { FungibleTransactionRow, NftTransactionRow } from './Rows/'; import { StatusInfoDialog } from './Status'; - import Transaction from './Transaction.svelte'; let transactions: BridgeTransaction[] = []; @@ -49,8 +48,6 @@ let selectedStatus: MessageStatus | null = null; // null indicates no filter is applied - let slowL1Warning = PUBLIC_SLOW_L1_BRIDGING_WARNING || false; - let menuOpen = false; const toggleMenu = () => { @@ -85,6 +82,10 @@ } }; + const handleTransactionRemoved = () => { + refresh(); + }; + const updateTransactions = async (address: Address) => { if (loadingTxs) return; loadingTxs = true; @@ -116,14 +117,14 @@ $: transactionsToShow = getTransactionsToShow(currentPage, pageSize, tokenAndStatusFilteredTransactions); - $: fungibleDesktopView = isDesktopOrLarger && $activeBridge === BridgeTypes.FUNGIBLE; - $: nftDesktopView = isDesktopOrLarger && $activeBridge === BridgeTypes.NFT; + $: fungibleView = $activeBridge === BridgeTypes.FUNGIBLE; + $: nftView = $activeBridge === BridgeTypes.NFT; $: fungibleTokens = [TokenType.ERC20, TokenType.ETH]; $: nftTokens = [TokenType.ERC721, TokenType.ERC1155]; $: allTokens = [...fungibleTokens, ...nftTokens]; - $: displayTokenTypesBasedOnType = fungibleDesktopView ? fungibleTokens : nftDesktopView ? nftTokens : allTokens; + $: displayTokenTypesBasedOnType = fungibleView ? fungibleTokens : nftView ? nftTokens : allTokens; $: filteredTransactions = transactions.filter((tx) => displayTokenTypesBasedOnType.includes(tx.tokenType)); @@ -140,8 +141,6 @@ $: renderTransactions = !renderLoading && isConnected && hasTxs; $: renderNoTransactions = !renderLoading && transactionsToShow.length === 0; - $: displayL1Warning = slowL1Warning; - onMount(() => { const alternateChainID = getAlternateNetwork(); if (!$destNetwork && alternateChainID) { @@ -154,7 +153,7 @@
- {#if isDesktopOrLarger} + {#if $isDesktop}
- +
@@ -197,42 +196,74 @@
{/if} - {#if displayL1Warning} -
- {$t('bridge.alerts.slow_bridging')} -
- {/if}
-
- {#if isDesktopOrLarger} -
- {#if $activeBridge === BridgeTypes.FUNGIBLE} -
{$t('transactions.header.from')}
-
{$t('transactions.header.to')}
-
{$t('transactions.header.amount')}
-
+
+ +
+ {#if $activeBridge === BridgeTypes.FUNGIBLE} + {#if $isDesktop} +
{$t('transactions.header.from')}
+
{$t('transactions.header.to')}
+
{$t('transactions.header.amount')}
+
{$t('transactions.header.status')}
-
{$t('transactions.header.explorer')}
- {:else if $activeBridge === BridgeTypes.NFT} -
{$t('transactions.header.item')}
-
{$t('transactions.header.from')}
-
{$t('transactions.header.to')}
-
{$t('transactions.header.amount')}
-
+
{$t('transactions.header.date')}
+
+ {:else if $isTablet} +
{$t('transactions.header.from')}
+
{$t('transactions.header.to')}
+
{$t('transactions.header.amount')}
+
{$t('transactions.header.status')}
-
- {$t('transactions.header.explorer')} + {:else} +
+ {$t('transactions.header.details')} +
+
{$t('transactions.header.amount')}
+
+ {$t('transactions.header.status')} +
{/if} -
-
- {/if} + {:else if $activeBridge === BridgeTypes.NFT} + {#if $isDesktop} +
{$t('transactions.header.nft')}
+
{$t('transactions.header.from')}
+
{$t('transactions.header.to')}
+
+ {$t('transactions.header.status')} + +
+
{$t('transactions.header.date')}
+
+ {:else if $isTablet} +
{$t('transactions.header.nft')}
+
{$t('transactions.header.from')}
+
{$t('transactions.header.to')}
+ +
+ {$t('transactions.header.status')} + +
+ {:else} +
+ {$t('transactions.header.details')} +
+
{$t('transactions.header.nft')}
+
+ {$t('transactions.header.status')} + +
+ {/if} + {/if} +
+
{#if renderLoading}
@@ -244,9 +275,15 @@
- {#each transactionsToShow as item (item.hash)} - -
+ {#each transactionsToShow as bridgeTx (bridgeTx.srcTxHash)} + {@const status = bridgeTx.msgStatus} + {@const isFungible = bridgeTx.tokenType === TokenType.ERC20 || bridgeTx.tokenType === TokenType.ETH} + {#if isFungible} + + {:else} + + {/if} +
{/each}
{/if} @@ -260,7 +297,7 @@
-
+
handlePageChange(detail)} />
diff --git a/packages/bridge-ui/src/i18n/en.json b/packages/bridge-ui/src/i18n/en.json index f9e04b28cec..927488038db 100644 --- a/packages/bridge-ui/src/i18n/en.json +++ b/packages/bridge-ui/src/i18n/en.json @@ -39,10 +39,9 @@ "nft_scan_again": "Scan again" }, "alerts": { - "not_enough_funds": "You do not have enough ETH to cover the processing fee and transaction fee", - "slow_bridging": "Please note: Bridging to L1 will take around 24hrs!", + "not_enough_funds": "You do not have enough ETH to cover the processing fee and transaction fee. Please add more ETH to your wallet (>= 0.0015 ETH).", + "slow_bridging": "Please note: Bridging to L1 will take around 4hs!", "smart_contract_wallet": "It seems you are using a smart contract wallet. Please double check that the recipient matches your wallet on the destination or change it accordingly.", - "stable_coin": "You are bridging a stable coin. For USDC, we are currently partnering with Stargate Bridge for liquidity. Consider using their bridge, as the ecosystem partners are likely using their bridged version", "wrapped_eth": "You are bridging wrapped ETH. Please be aware that un-wrapping will only work on the original chain of the token, NOT on the destination." }, "button": { @@ -53,6 +52,9 @@ "bridging": "Bridging", "fetch": "Fetch NFT data", "import": "Import", + "reset": "Reset", + "reset_approval": "Reset Approval", + "resetting": "Resetting", "validating": "Validating..." }, "description": { @@ -205,6 +207,9 @@ "recipient": "Recipient", "review": "Review" } + }, + "usdt_approval": { + "info": "You have previously approved a lower amount of USDT. To adjust the approval, you must first reset the previous amount to 0. This requirement is unique to USDT." } }, "chain_selector": { @@ -243,7 +248,12 @@ "name": "Name", "not_available_short": "N/A", "ok": "Okay", + "owner": { + "destination": "Destination owner" + }, "recipient": "Recipient", + "relayer": "Relayer", + "reset_to_wallet": "Reset to current address", "review": "Review", "search_token": "Search token", "see_results": "See results", @@ -255,11 +265,22 @@ "symbol": "Symbol", "to": "To", "token_id": "Token ID", - "token_standard": "Token standard" + "token_standard": "Token standard", + "tx_hash": "Tx hash" }, "custom_recipient": { "placeholder": "Add custom recipient" }, + "destOwner": { + "alerts": { + "smartContract": "You cannot set the destination owner to a contract address" + }, + "description": "You can set a custom address that should be able to claim the transaction on the destination chain, for example if the recipient is a smart contract that cannot manually claim.", + "placeholder": "add address that should be able to manually claim...", + "title": "Destination owner", + "tooltip": "Defaults to your address. You can specify a different address that should be able to claim this transaction.", + "tooltip_title": "What is Destination Owner?" + }, "faucet": { "button": { "checking": "Checking mintability", @@ -285,7 +306,7 @@ }, "title": "Faucet", "warning": { - "insufficient_balance": "You don't have enough ETH to complete the transaction. Please add some ETH to your wallet.", + "insufficient_balance": "You don't have enough ETH to complete the transaction. Please add more ETH to your wallet (>= 0.0015 ETH)", "no_connected": "Please connect your wallet to mint tokens.", "not_mintable": "This token is not mintable on this network. Please switch to the correct network.", "token_minted": "You have already minted this token.", @@ -420,6 +441,18 @@ "tooltip": "Defaults to your address. You can add a custom recipient address as well.", "tooltip_title": "What is Custom Recipient?" }, + "relayer_component": { + "address_input_label": "Enter the recipient address", + "description": "This component allows you to manually claim any claimable transaction", + "no_tx_found": "No claimable transactions found", + "step1": { + "title": "Step 1: Select the recipient" + }, + "step2": { + "title": "Step 2: Search the transaction you want" + }, + "title": "Relayer Component" + }, "switch_modal": { "description": "Your current network is not supported. Please select one of the following chains to proceed:", "title": "Incorrect network detected" @@ -486,6 +519,7 @@ "pre_check": { "chain_check": "Connected to the correct chain", "funds_check": "Sufficient funds to claim", + "only_destowner_can_claim": "This transaction can only be claimed by the destination owner. Please connect to the correct wallet to claim this transaction.", "quota_check": "Sufficient daily quota", "ready": "You can continue with the claim process!", "step": "Claim step", @@ -497,9 +531,12 @@ "title": "What is \"Connected to the correct chain\"?" }, "funds": { - "description": "In order to claim the transaction yourself, you need enough funds on the destination chain. If you've kept the default processing fee, the relayer will likely claim for you soon.", + "description": "In order to claim the transaction yourself, you need enough funds on the destination chain (>= 0.0015 ETH). If you've kept the default processing fee, the relayer will likely claim for you soon.", "title": "What is \"Sufficient funds to claim\"?" }, + "processing_fee": { + "description": "A processing fee has been set for this transaction. If the fee is high enough, a relayer may claim it automatically. Regardless, you can choose to manually claim the transaction. Note that the fee is non-refundable." + }, "quota": { "description": "Currently there is a daily limit of how much of this asset can be bridged to L1. If the quota is reached, please try again the next day.", "title": "What is \"Sufficient daily quota\"?" @@ -515,6 +552,11 @@ }, "description": "Track your bridge transactions here.", "details_dialog": { + "claimed_by": "Claimed by", + "destination_owner": "Destination owner", + "initiated_date": "Date initiated", + "recipient_address": "Recipient address", + "sender_address": "Sender address", "title": "Transaction details" }, "errors": { @@ -526,20 +568,25 @@ "claimed": "Claimed", "failed": "Failed", "processing": "Processing", + "released": "Released", "retry": "Retriable", "title": "Filters" }, "header": { "amount": "Amount", + "date": "Date", + "details": "Details", "explorer": "Explorer", "from": "From", "item": "Item", + "nft": "NFT", "status": "Status", "to": "To" }, "link": { "explorer": "View details", - "explorer_short": "View" + "explorer_short": "View", + "view": "Details" }, "no_transactions": "No transactions found", "release": { @@ -558,6 +605,7 @@ "description": "Your asset is now ready for claiming on the destination chain and requires a transaction. If you have set a processing fee, the relayer will automatically handle the claiming process on your behalf.", "name": "Claim" }, + "claimable": "Claimable", "claimed": { "description": "Your asset has successfully completed the bridging process and is now available to you on the destination chain.", "name": "Claimed" @@ -582,11 +630,16 @@ "description": "Transaction is processing. Depending on the pending blocks to be verified this can take up to several minutes.", "name": "Processing" }, + "releasable": "Releasable", "release": { "description": "Your bridged asset cannot be processed and is now accessible to you on the source chain.", "name": "Release" }, + "released": { + "name": "Released" + }, "releasing": "Releasing", + "retriable": "Retriable", "retry": { "description": "The relayer was unable to process this message, and you will need to retry the processing yourself.", "name": "Retry" diff --git a/packages/bridge-ui/src/libs/bridge/Bridge.ts b/packages/bridge-ui/src/libs/bridge/Bridge.ts index 54fabdc98d1..5e73e5d268d 100644 --- a/packages/bridge-ui/src/libs/bridge/Bridge.ts +++ b/packages/bridge-ui/src/libs/bridge/Bridge.ts @@ -1,11 +1,12 @@ import { getPublicClient, readContract, simulateContract, writeContract } from '@wagmi/core'; -import { getContract, type Hash, UserRejectedRequestError, type WalletClient } from 'viem'; +import { getAddress, getContract, type Hash, UserRejectedRequestError, type WalletClient } from 'viem'; import { bridgeAbi } from '$abi'; import { routingContractsMap } from '$bridgeConfig'; import { MessageStatusError, ProcessMessageError, ReleaseError, WrongChainError, WrongOwnerError } from '$libs/error'; import type { BridgeProver } from '$libs/proof'; import { getConnectedWallet } from '$libs/util/getConnectedWallet'; +import { isSmartContract } from '$libs/util/isSmartContract'; import { getLogger } from '$libs/util/logger'; import { config } from '$libs/wagmi'; @@ -40,13 +41,15 @@ export abstract class Bridge { const srcChainId = Number(message.srcChainId); const destChainId = Number(message.destChainId); - const { srcOwner } = message; + const { srcOwner, destOwner } = message; if (!wallet || !wallet.account || !wallet.chain) throw new Error('Wallet is not connected'); const userAddress = wallet.account.address; - // Are we the owner of the message? - if (srcOwner.toLowerCase() !== userAddress.toLowerCase()) { - throw new WrongOwnerError('user cannot process this as it is not their message'); + // Are we the owner of the message, either src or dest? + if (getAddress(srcOwner) !== getAddress(userAddress) && getAddress(destOwner) !== getAddress(userAddress)) { + if (bridgeTx.message?.gasLimit === 0) { + throw new WrongOwnerError('user cannot process this as it is not their message'); + } } const destBridgeAddress = routingContractsMap[destChainId][srcChainId].bridgeAddress; @@ -166,7 +169,7 @@ export abstract class Bridge { abstract estimateGas(args: BridgeArgs): Promise; abstract bridge(args: BridgeArgs): Promise; - async processMessage(args: ClaimArgs): Promise { + async processMessage(args: ClaimArgs, force = false): Promise { const { messageStatus, destBridgeAddress } = await this.beforeProcessing(args); let blockNumber; @@ -203,7 +206,7 @@ export abstract class Bridge { // Initial claim await this.beforeClaiming({ ...args, messageStatus }); - txHash = await this.processNewMessage({ ...args, bridgeContract, client }); + txHash = await this.processNewMessage({ ...args, bridgeContract, client }, force); } else if (messageStatus === MessageStatus.RETRIABLE) { // Claiming after a failed attempt await this.beforeRetrying({ ...args, messageStatus }); @@ -225,7 +228,7 @@ export abstract class Bridge { } } - private async processNewMessage(args: ProcessMessageType): Promise { + private async processNewMessage(args: ProcessMessageType, force = false): Promise { const { bridgeTx, bridgeContract, client } = args; const { message } = bridgeTx; if (!message) throw new ProcessMessageError('Message is not defined'); @@ -261,24 +264,30 @@ export abstract class Bridge { estimatedGas = 1_300_000n; } - const { request } = await simulateContract(config, { - address: bridgeContract.address, - abi: bridgeContract.abi, - functionName: 'processMessage', - args: [message, proof], - gas: estimatedGas, - }); - log('Simulate contract for processMessage', request); - - return await writeContract(config, request); + if (message.to && (await isSmartContract(message.to, Number(message.destChainId)))) { + log(`Recipient is a smart contract, increasing fees by 5 percent`); + estimatedGas = (estimatedGas * 105n) / 100n; + } + if (force) { + return await writeContract(config, { + address: bridgeContract.address, + abi: bridgeContract.abi, + functionName: 'processMessage', + args: [message, proof], + gas: estimatedGas, + }); + } else { + const { request } = await simulateContract(config, { + address: bridgeContract.address, + abi: bridgeContract.abi, + functionName: 'processMessage', + args: [message, proof], + gas: estimatedGas, + }); + log('Simulate contract for processMessage', request); - // return await writeContract(config, { - // address: bridgeContract.address, - // abi: bridgeContract.abi, - // functionName: 'processMessage', - // args: [message, proof], - // gas: estimatedGas, - // }); + return await writeContract(config, request); + } } private async retryMessage(args: RetryMessageArgs): Promise { @@ -290,10 +299,13 @@ export abstract class Bridge { if (!message) throw new ProcessMessageError('Message is not defined'); - const estimatedGas = await bridgeContract.estimateGas.retryMessage([message, isFinalAttempt], { + let estimatedGas = await bridgeContract.estimateGas.retryMessage([message, isFinalAttempt], { account: client.account, }); - + if (message.to && (await isSmartContract(message.to, Number(message.destChainId)))) { + log(`Recipient is a smart contract, increasing fees by 5 percent`); + estimatedGas = (estimatedGas * 105n) / 100n; + } log('Estimated gas for retryMessage', estimatedGas); const { request } = await simulateContract(config, { @@ -316,9 +328,15 @@ export abstract class Bridge { log('Estimating gas for recallMessage', bridgeContract.address, [message, proof]); - const estimatedGas = await bridgeContract.estimateGas.recallMessage([message, proof], { account: client.account }); + let estimatedGas = await bridgeContract.estimateGas.recallMessage([message, proof], { account: client.account }); log('Estimated gas for recallMessage', estimatedGas); + if (message.from && (await isSmartContract(message.from, Number(message.srcChainId)))) { + log(`Sender is a smart contract, increasing fees by 5 percent`); + estimatedGas = (estimatedGas * 105n) / 100n; + } + log('Estimated gas for retryMessage', estimatedGas); + const { request } = await simulateContract(config, { address: bridgeContract.address, abi: bridgeContract.abi, diff --git a/packages/bridge-ui/src/libs/bridge/ERC1155Bridge.ts b/packages/bridge-ui/src/libs/bridge/ERC1155Bridge.ts index bdc64eab286..94f9931e828 100644 --- a/packages/bridge-ui/src/libs/bridge/ERC1155Bridge.ts +++ b/packages/bridge-ui/src/libs/bridge/ERC1155Bridge.ts @@ -4,7 +4,7 @@ import { getContract, UserRejectedRequestError } from 'viem'; import { bridgeAbi, erc1155Abi, erc1155VaultAbi } from '$abi'; import { routingContractsMap } from '$bridgeConfig'; -import { gasLimitZero } from '$components/Bridge/state'; +import { destOwnerAddress, gasLimitZero } from '$components/Bridge/state'; import { gasLimitConfig } from '$config'; import { ApproveError, @@ -223,7 +223,7 @@ export class ERC1155Bridge extends Bridge { const sendERC1155Args: NFTBridgeTransferOp = { destChainId: BigInt(destChainId), to, - destOwner: to, + destOwner: get(destOwnerAddress) || to, token, gasLimit: Number(gasLimit), fee, diff --git a/packages/bridge-ui/src/libs/bridge/ERC20Bridge.ts b/packages/bridge-ui/src/libs/bridge/ERC20Bridge.ts index 3eb95ee70aa..e3023d93070 100644 --- a/packages/bridge-ui/src/libs/bridge/ERC20Bridge.ts +++ b/packages/bridge-ui/src/libs/bridge/ERC20Bridge.ts @@ -4,7 +4,7 @@ import { getContract, UserRejectedRequestError } from 'viem'; import { bridgeAbi, erc20Abi, erc20VaultAbi } from '$abi'; import { routingContractsMap } from '$bridgeConfig'; -import { gasLimitZero } from '$components/Bridge/state'; +import { destOwnerAddress, gasLimitZero } from '$components/Bridge/state'; import { gasLimitConfig } from '$config'; import { ApproveError, @@ -75,7 +75,7 @@ export class ERC20Bridge extends Bridge { const sendERC20Args = { destChainId: BigInt(destChainId), - destOwner: to, + destOwner: get(destOwnerAddress) || to, to, token, amount, @@ -111,7 +111,7 @@ export class ERC20Bridge extends Bridge { return estimatedGas; } - async requireAllowance({ amount, tokenAddress, ownerAddress, spenderAddress }: RequireAllowanceArgs) { + async getAllowance({ amount, tokenAddress, ownerAddress, spenderAddress }: RequireAllowanceArgs) { isBridgePaused().then((paused) => { if (paused) throw new BridgePausedError('Bridge is paused'); }); @@ -125,6 +125,14 @@ export class ERC20Bridge extends Bridge { chainId: (await getConnectedWallet()).chain.id, }); + return allowance; + } + async requireAllowance({ amount, tokenAddress, ownerAddress, spenderAddress }: RequireAllowanceArgs, reset = false) { + const allowance = await this.getAllowance({ amount, tokenAddress, ownerAddress, spenderAddress }); + + if (reset) { + return true; + } const requiresAllowance = allowance < amount; log('Allowance is', allowance, 'requires allowance?', requiresAllowance); @@ -132,15 +140,18 @@ export class ERC20Bridge extends Bridge { return requiresAllowance; } - async approve(args: ApproveArgs) { + async approve(args: ApproveArgs, reset = false) { const { amount, tokenAddress, spenderAddress, wallet } = args; if (!wallet || !wallet.account) throw new Error('No wallet found'); - const requireAllowance = await this.requireAllowance({ - amount, - tokenAddress, - ownerAddress: wallet.account.address, - spenderAddress, - }); + const requireAllowance = await this.requireAllowance( + { + amount, + tokenAddress, + ownerAddress: wallet.account.address, + spenderAddress, + }, + reset, + ); if (!requireAllowance) { throw new NoAllowanceRequiredError(`no allowance required for the amount ${amount}`); @@ -148,10 +159,31 @@ export class ERC20Bridge extends Bridge { try { log(`Calling approve for spender "${spenderAddress}" for token "${tokenAddress}" with amount`, amount); + // USDT does not play nice with the default ERC20 ABI, this works for both + const approvalABI = [ + { + constant: false, + inputs: [ + { + name: '_spender', + type: 'address', + }, + { + name: '_value', + type: 'uint256', + }, + ], + name: 'approve', + outputs: [], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + ]; const { request } = await simulateContract(config, { address: tokenAddress, - abi: erc20Abi, + abi: approvalABI, functionName: 'approve', args: [spenderAddress, amount], }); diff --git a/packages/bridge-ui/src/libs/bridge/ERC721Bridge.ts b/packages/bridge-ui/src/libs/bridge/ERC721Bridge.ts index 294bdb69909..45c5f6968b7 100644 --- a/packages/bridge-ui/src/libs/bridge/ERC721Bridge.ts +++ b/packages/bridge-ui/src/libs/bridge/ERC721Bridge.ts @@ -4,7 +4,7 @@ import { getContract, UserRejectedRequestError } from 'viem'; import { bridgeAbi, erc721Abi, erc721VaultAbi } from '$abi'; import { routingContractsMap } from '$bridgeConfig'; -import { gasLimitZero } from '$components/Bridge/state'; +import { destOwnerAddress, gasLimitZero } from '$components/Bridge/state'; import { gasLimitConfig } from '$config'; import { ApproveError, @@ -235,7 +235,7 @@ export class ERC721Bridge extends Bridge { const sendERC721Args: NFTBridgeTransferOp = { destChainId: BigInt(destChainId), to, - destOwner: to, + destOwner: get(destOwnerAddress) || to, token, gasLimit: Number(gasLimit), fee, diff --git a/packages/bridge-ui/src/libs/bridge/ETHBridge.ts b/packages/bridge-ui/src/libs/bridge/ETHBridge.ts index 5cbae26530e..b81911ec2cd 100644 --- a/packages/bridge-ui/src/libs/bridge/ETHBridge.ts +++ b/packages/bridge-ui/src/libs/bridge/ETHBridge.ts @@ -3,7 +3,7 @@ import { get } from 'svelte/store'; import { getContract, UserRejectedRequestError } from 'viem'; import { bridgeAbi } from '$abi'; -import { gasLimitZero } from '$components/Bridge/state'; +import { destOwnerAddress, gasLimitZero } from '$components/Bridge/state'; import { BridgePausedError, SendMessageError } from '$libs/error'; import type { BridgeProver } from '$libs/proof'; import { isBridgePaused } from '$libs/util/checkForPausedContracts'; @@ -55,7 +55,7 @@ export class ETHBridge extends Bridge { srcOwner: owner, from: owner, - destOwner: to, + destOwner: get(destOwnerAddress) || to, srcChainId: BigInt(srcChainId), destChainId: BigInt(destChainId), diff --git a/packages/bridge-ui/src/libs/bridge/fetchTransactions.ts b/packages/bridge-ui/src/libs/bridge/fetchTransactions.ts index 0e5b180aeb0..9df3998b429 100644 --- a/packages/bridge-ui/src/libs/bridge/fetchTransactions.ts +++ b/packages/bridge-ui/src/libs/bridge/fetchTransactions.ts @@ -10,16 +10,20 @@ import { type BridgeTransaction, MessageStatus } from './types'; const log = getLogger('bridge:fetchTransactions'); let error: Error; -export async function fetchTransactions(userAddress: Address) { +export async function fetchTransactions(userAddress: Address, chainId?: number) { // Transactions from local storage const localTxs: BridgeTransaction[] = await bridgeTxService.getAllTxByAddress(userAddress); // Get all transactions from all relayers const relayerTxPromises: Promise[] = relayerApiServices.map(async (relayerApiService) => { - const { txs } = await relayerApiService.getAllBridgeTransactionByAddress(userAddress, { - page: 0, - size: 100, - }); + const { txs } = await relayerApiService.getAllBridgeTransactionByAddress( + userAddress, + { + page: 0, + size: 500, + }, + chainId, + ); log(`fetched ${txs?.length ?? 0} transactions from relayer`, txs); return txs; }); @@ -46,7 +50,7 @@ export async function fetchTransactions(userAddress: Address) { if (outdatedLocalTransactions.length > 0) { log( `found ${outdatedLocalTransactions.length} outdated transaction(s)`, - outdatedLocalTransactions.map((tx) => tx.hash), + outdatedLocalTransactions.map((tx) => tx.srcTxHash), ); } diff --git a/packages/bridge-ui/src/libs/bridge/types.ts b/packages/bridge-ui/src/libs/bridge/types.ts index 099035c7387..dc794acf422 100644 --- a/packages/bridge-ui/src/libs/bridge/types.ts +++ b/packages/bridge-ui/src/libs/bridge/types.ts @@ -9,7 +9,7 @@ export enum MessageStatus { RETRIABLE, DONE, FAILED, - PROVEN, // UI ONLY + RECALLED, } // struct Message { @@ -90,7 +90,8 @@ export type RelayerMessage = { export type ModifiedTransactionReceipt = Omit & { blockNumber: Hex }; export type BridgeTransaction = { - hash: Hash; + srcTxHash: Hash; + destTxHash: Hash; from: Address; amount: bigint; symbol: string; @@ -100,6 +101,7 @@ export type BridgeTransaction = { tokenType: TokenType; blockNumber: Hex; msgHash: Hash; + processingFee: bigint; message?: Message; msgStatus?: MessageStatus; @@ -109,6 +111,8 @@ export type BridgeTransaction = { status?: MessageStatus; receipt?: TransactionReceipt; canonicalTokenAddress?: Address; + claimedBy?: Address; + fee?: bigint; }; interface BaseBridgeTransferOp { diff --git a/packages/bridge-ui/src/libs/fee/recommendProcessingFee.ts b/packages/bridge-ui/src/libs/fee/recommendProcessingFee.ts index 8e1595d8ad0..780031c07ff 100644 --- a/packages/bridge-ui/src/libs/fee/recommendProcessingFee.ts +++ b/packages/bridge-ui/src/libs/fee/recommendProcessingFee.ts @@ -1,5 +1,5 @@ import { getPublicClient } from '@wagmi/core'; -import { formatGwei } from 'viem'; +import { formatGwei, parseGwei } from 'viem'; import { gasLimitConfig } from '$config'; import { PUBLIC_FEE_MULTIPLIER } from '$env/static/public'; @@ -38,9 +38,14 @@ export async function recommendProcessingFee({ const maxPriorityFee = await destPublicClient.estimateMaxPriorityFeePerGas(); log(`maxPriorityFee: ${formatGwei(maxPriorityFee)} gwei`); - const gasPrice = await destPublicClient.getGasPrice(); + let gasPrice = await destPublicClient.getGasPrice(); log(`gasPrice: ${formatGwei(gasPrice)} gwei`); + if (gasPrice < parseGwei('0.01')) { + log(`gasPrice is less than 0.01 gwei, setting gasPrice to 0.01 gwei`); + gasPrice = parseGwei('0.01'); + } + if (!baseFee) throw new Error('Unable to get base fee'); log(`baseFee: ${formatGwei(baseFee)} gwei`); @@ -89,20 +94,20 @@ export async function recommendProcessingFee({ if (!estimatedMsgGaslimit) throw new Error('Unable to calculate fee'); // Initial fee multiplicator and add fallback - let feeMultiplicator: number = parseInt(PUBLIC_FEE_MULTIPLIER); - - if (gasPrice <= 50000000n) { - feeMultiplicator = 4; - log(`gasPrice ${formatGwei(gasPrice)} is less than 0.5 gwei, setting feeMultiplicator to 4`); - } else if (gasPrice <= 100000000n && gasPrice > 50000000n) { - feeMultiplicator = 3; - log( - `gasPrice ${formatGwei(gasPrice)} is less than 0.1 gwei and more than 0.05 gwei, setting feeMultiplicator to 3`, - ); - } else { - feeMultiplicator = 2; - log(`gasPrice ${formatGwei(gasPrice)} is more than 0.1 gwei, setting feeMultiplicator to 2`); - } + const feeMultiplicator: number = parseInt(PUBLIC_FEE_MULTIPLIER) || 1; + + // if (gasPrice <= parseGwei('0.05')) { + // feeMultiplicator = 4; + // log(`gasPrice {formatGwei(gasPrice)} is less than 0.5 gwei, setting feeMultiplicator to 4`); + // } else if (gasPrice <= parseGwei('0.1') && gasPrice > parseGwei('0.05')) { + // feeMultiplicator = 3; + // log( + // `gasPrice ${formatGwei(gasPrice)} is less than 0.1 gwei and more than 0.05 gwei, setting feeMultiplicator to 3`, + // ); + // } else { + // feeMultiplicator = 2; + // log(`gasPrice ${formatGwei(gasPrice)} is more than 0.1 gwei, setting feeMultiplicator to 2`); + // } const fee = estimatedMsgGaslimit * Number(gasPrice) * feeMultiplicator; return BigInt(fee); diff --git a/packages/bridge-ui/src/libs/fee/recommendedProcessingFee.test.ts b/packages/bridge-ui/src/libs/fee/recommendedProcessingFee.test.ts new file mode 100644 index 00000000000..22190579d79 --- /dev/null +++ b/packages/bridge-ui/src/libs/fee/recommendedProcessingFee.test.ts @@ -0,0 +1,155 @@ +import { getPublicClient } from '@wagmi/core'; +import { parseGwei } from 'viem'; + +import { gasLimitConfig } from '$config'; +import { ETHToken } from '$libs/token'; +import { getTokenAddresses } from '$libs/token/getTokenAddresses'; +import { L1_CHAIN_ID, L2_CHAIN_ID, MOCK_ERC20, MOCK_ERC721, MOCK_ERC1155 } from '$mocks'; + +import { recommendProcessingFee } from './recommendProcessingFee'; + +vi.mock('@wagmi/core'); +vi.mock('$customToken'); +vi.mock('$bridgeConfig'); +vi.mock('$libs/token/getTokenAddresses'); + +const mockClient = { + request: vi.fn(), + getBlock: vi.fn(), + estimateMaxPriorityFeePerGas: vi.fn(), + getGasPrice: vi.fn(), +}; + +describe('recommendedProcessingFee', () => { + beforeAll(() => { + vi.mocked(getPublicClient).mockReturnValue(mockClient); + vi.mocked(mockClient.getBlock).mockReturnValue({ baseFeePerGas: 11n }); + vi.mocked(mockClient.estimateMaxPriorityFeePerGas).mockReturnValue(42n); + }); + + describe('ETH fees', () => { + it('should calculate the recommended processing fee for ETH when gasPrice is a normal value (0.15 gwei)', async () => { + // Given + const token = ETHToken; + const srcChainId = L1_CHAIN_ID; + const destChainId = L2_CHAIN_ID; + + const gasLimit = gasLimitConfig.GAS_RESERVE; + + const reportedGasPrice = parseGwei('0.15'); + const feeMultiplicator = 1; + + const expectedFee = gasLimit * Number(reportedGasPrice) * feeMultiplicator; + + vi.mocked(mockClient.getGasPrice).mockReturnValue(reportedGasPrice); + + // When + const result = await recommendProcessingFee({ token, destChainId, srcChainId }); + + // Then + expect(result).toBe(BigInt(expectedFee)); + }); + }); + + describe('ERC20 fees', () => { + it('should calculate the recommended processing fee for deployed ERC20', async () => { + // Given + const token = MOCK_ERC20; + const srcChainId = L1_CHAIN_ID; + const destChainId = L2_CHAIN_ID; + + const gasLimit = gasLimitConfig.GAS_RESERVE + gasLimitConfig.erc20DeployedGasLimit; + + const reportedGasPrice = parseGwei('0.15'); + const feeMultiplicator = 1; + + const expectedFee = gasLimit * Number(reportedGasPrice) * feeMultiplicator; + + vi.mocked(mockClient.getGasPrice).mockReturnValue(reportedGasPrice); + vi.mocked(getTokenAddresses).mockResolvedValue({ + bridged: { + chainId: L1_CHAIN_ID, + address: MOCK_ERC20.addresses[L1_CHAIN_ID], + }, + canonical: { + chainId: L2_CHAIN_ID, + address: MOCK_ERC20.addresses[L2_CHAIN_ID], + }, + }); + + // When + const result = await recommendProcessingFee({ token, destChainId, srcChainId }); + + // Then + expect(result).toBe(BigInt(expectedFee)); + }); + }); + + describe('ERC721 fees', () => { + it('should calculate the recommended processing fee for deployed ERC721', async () => { + // Given + const token = MOCK_ERC721; + const srcChainId = L1_CHAIN_ID; + const destChainId = L2_CHAIN_ID; + + const gasLimit = gasLimitConfig.GAS_RESERVE + gasLimitConfig.erc721DeployedGasLimit; + + const reportedGasPrice = parseGwei('0.12'); + const feeMultiplicator = 1; + + const expectedFee = gasLimit * Number(reportedGasPrice) * feeMultiplicator; + + vi.mocked(mockClient.getGasPrice).mockReturnValue(reportedGasPrice); + vi.mocked(getTokenAddresses).mockResolvedValue({ + bridged: { + chainId: L1_CHAIN_ID, + address: MOCK_ERC721.addresses[L1_CHAIN_ID], + }, + canonical: { + chainId: L2_CHAIN_ID, + address: MOCK_ERC721.addresses[L2_CHAIN_ID], + }, + }); + + // When + const result = await recommendProcessingFee({ token, destChainId, srcChainId }); + + // Then + expect(result).toBe(BigInt(expectedFee)); + }); + }); + + describe('ERC1155 fees', () => { + it('should calculate the recommended processing fee for deployed ERC1155', async () => { + // Given + const token = MOCK_ERC1155; + const srcChainId = L1_CHAIN_ID; + const destChainId = L2_CHAIN_ID; + + const gasLimit = gasLimitConfig.GAS_RESERVE + gasLimitConfig.erc1155DeployedGasLimit; + + const reportedGasPrice = parseGwei('0.12'); + const feeMultiplicator = 1; + + const expectedFee = gasLimit * Number(reportedGasPrice) * feeMultiplicator; + + vi.mocked(mockClient.getGasPrice).mockReturnValue(reportedGasPrice); + vi.mocked(getTokenAddresses).mockResolvedValue({ + bridged: { + chainId: L1_CHAIN_ID, + address: MOCK_ERC1155.addresses[L1_CHAIN_ID], + }, + canonical: { + chainId: L2_CHAIN_ID, + address: MOCK_ERC1155.addresses[L2_CHAIN_ID], + }, + }); + + // When + const result = await recommendProcessingFee({ token, destChainId, srcChainId }); + + // Then + expect(result).toBe(BigInt(expectedFee)); + }); + }); +}); diff --git a/packages/bridge-ui/src/libs/polling/messageStatusPoller.ts b/packages/bridge-ui/src/libs/polling/messageStatusPoller.ts index b517e8f41dc..fc2f0b5f56a 100644 --- a/packages/bridge-ui/src/libs/polling/messageStatusPoller.ts +++ b/packages/bridge-ui/src/libs/polling/messageStatusPoller.ts @@ -49,7 +49,7 @@ const hashIntervalMap: Record = {}; * } */ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true) { - const { hash, srcChainId, destChainId, msgHash, msgStatus } = bridgeTx; + const { srcTxHash, srcChainId, destChainId, msgHash, msgStatus } = bridgeTx; // Without this we cannot poll at all. Let's throw an error // that can be handled in the UI @@ -63,14 +63,19 @@ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true) // We want to notify whoever is calling this function of different // events: PollingEvent - let emitter = hashEmitterMap[hash]; - let interval = hashIntervalMap[hash]; + let emitter = hashEmitterMap[srcTxHash]; + let interval = hashIntervalMap[srcTxHash]; const destChainClient = createPublicClient({ chain: chains.find((chain) => chain.id === Number(destChainId)), transport: http(), }); + const srcChainClient = createPublicClient({ + chain: chains.find((chain) => chain.id === Number(srcChainId)), + transport: http(), + }); + // We are gonna be polling the destination bridge contract const destBridgeAddress = routingContractsMap[Number(destChainId)][Number(srcChainId)].bridgeAddress; const destBridgeContract = getContract({ @@ -79,16 +84,24 @@ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true) client: destChainClient, }); + // In case for recalled messages we need to check the source bridge contract + const srcBridgeAddress = routingContractsMap[Number(srcChainId)][Number(destChainId)].bridgeAddress; + const srcBridgeContract = getContract({ + address: srcBridgeAddress, + abi: bridgeAbi, + client: srcChainClient, + }); + const stopPolling = () => { - const interval = hashIntervalMap[hash]; + const interval = hashIntervalMap[srcTxHash]; if (interval) { log('Stop polling for transaction', bridgeTx); // Clean up clearInterval(interval as ReturnType); // clearInterval only needs the ID - delete hashEmitterMap[hash]; - delete hashIntervalMap[hash]; - hashIntervalMap[hash] = null; + delete hashEmitterMap[srcTxHash]; + delete hashIntervalMap[srcTxHash]; + hashIntervalMap[srcTxHash] = null; emitter.emit(PollingEvent.STOP); } @@ -100,7 +113,7 @@ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true) }; const pollingFn = async () => { - log('Polling for transaction', bridgeTx.hash); + log('Polling for transaction', bridgeTx.srcTxHash); const isProcessable = await isTransactionProcessable(bridgeTx); emitter.emit(PollingEvent.PROCESSABLE, isProcessable); @@ -108,15 +121,26 @@ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true) const messageStatus: MessageStatus = await destBridgeContract.read.messageStatus([bridgeTx.msgHash]); emitter.emit(PollingEvent.STATUS, messageStatus); + if (messageStatus === MessageStatus.FAILED) { + // check if the message is recalled + const recallStatus = await srcBridgeContract.read.messageStatus([bridgeTx.msgHash]); + if (recallStatus === MessageStatus.RECALLED) { + log(`Message ${bridgeTx.msgHash} has been recalled.`); + emitter.emit(PollingEvent.STATUS, MessageStatus.RECALLED); + stopPolling(); + return; + } + } + let blockNumber: Hex; if (!bridgeTx.blockNumber) { - const receipt = await getTransactionReceipt(config, { hash: bridgeTx.hash }); + const receipt = await getTransactionReceipt(config, { hash: bridgeTx.srcTxHash }); blockNumber = toHex(receipt.blockNumber); bridgeTx.blockNumber = blockNumber; } if (messageStatus === MessageStatus.DONE) { - log(`Poller has picked up the change of status to DONE for hash ${hash}.`); + log(`Poller has picked up the change of status to DONE for hash ${srcTxHash}.`); stopPolling(); } } catch (err) { @@ -132,8 +156,8 @@ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true) emitter = new EventEmitter(); interval = setInterval(pollingFn, bridgeTransactionPoller.interval); - hashEmitterMap[hash] = emitter; - hashIntervalMap[hash] = interval; + hashEmitterMap[srcTxHash] = emitter; + hashIntervalMap[srcTxHash] = interval; // setImmediate isn't standard if (runImmediately) { diff --git a/packages/bridge-ui/src/libs/proof/BridgeProver.test.ts b/packages/bridge-ui/src/libs/proof/BridgeProver.test.ts index 4282167757e..a92d2d402e5 100644 --- a/packages/bridge-ui/src/libs/proof/BridgeProver.test.ts +++ b/packages/bridge-ui/src/libs/proof/BridgeProver.test.ts @@ -1,5 +1,14 @@ import { getPublicClient, readContract } from '@wagmi/core'; -import { BlockNotFoundError, keccak256, numberToHex, stringToHex, toBytes, zeroAddress, zeroHash } from 'viem'; +import { + BlockNotFoundError, + type Hash, + keccak256, + numberToHex, + stringToHex, + toBytes, + zeroAddress, + zeroHash, +} from 'viem'; import { signalServiceAbi } from '$abi'; import { routingContractsMap } from '$bridgeConfig'; @@ -102,9 +111,11 @@ describe('BridgeProver', () => { decimals: 0, destChainId: BigInt(167001), from: '0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199', - hash: '0xc0a3476ac80c3468a65702864ff4ef22ca5b54afac3d0911fb14165cdada7f1c', + srcTxHash: '0xc0a3476ac80c3468a65702864ff4ef22ca5b54afac3d0911fb14165cdada7f1c', + destTxHash: '' as Hash, msgHash: '0x36973cd4172846df09d48d0bf428802d674848d39229962bbaec2e2fea465f15', srcChainId: 32382n, + processingFee: 0n, message: { data: '0x', destChainId: 167001n, diff --git a/packages/bridge-ui/src/libs/proof/BridgeProver.ts b/packages/bridge-ui/src/libs/proof/BridgeProver.ts index 9ff338e88b4..b942b748523 100644 --- a/packages/bridge-ui/src/libs/proof/BridgeProver.ts +++ b/packages/bridge-ui/src/libs/proof/BridgeProver.ts @@ -211,7 +211,7 @@ export class BridgeProver { } async getEncodedSignalProofForRecall({ bridgeTx }: { bridgeTx: BridgeTransaction }) { - const { message, msgHash } = bridgeTx; + const { blockNumber, message, msgHash } = bridgeTx; log('msgHash', msgHash); if (!message) throw new ProofGenerationError('Message is not defined'); @@ -304,8 +304,36 @@ export class BridgeProver { // Get the signalServiceAddress for the source chain const destSignalServiceAddress = routingContractsMap[Number(destChainId)][Number(srcChainId)].signalServiceAddress; + const srcSignalServiceAddress = routingContractsMap[Number(srcChainId)][Number(destChainId)].signalServiceAddress; + + const syncedChainData = await readContract(config, { + address: srcSignalServiceAddress, + abi: signalServiceAbi, + functionName: 'getSyncedChainData', + args: [destChainId, keccak256(toBytes('STATE_ROOT')), 0n], + chainId: Number(srcChainId), + }); + + log('syncedChainData', syncedChainData); + + const latestSyncedblock = syncedChainData[0]; + + const synced = latestSyncedblock >= hexToBigInt(blockNumber); + log('synced', synced, latestSyncedblock, hexToBigInt(blockNumber)); + if (!synced) { + throw new BlockNotSyncedError('block is not synced yet'); + } - const block = await destChainClient.getBlock({ blockTag: 'latest' }); + // Get the block based on the blocknumber from the destination chain + let block; + try { + block = await destChainClient.getBlock({ blockNumber: latestSyncedblock }); + if (!block || block.hash === null || block.number === null) { + throw new BlockNotFoundError({ blockNumber: latestSyncedblock }); + } + } catch { + throw new BlockNotFoundError({ blockNumber: latestSyncedblock }); + } const signal = await this.getSignalForFailedMessage(msgHash); @@ -330,7 +358,7 @@ export class BridgeProver { // Build the hopProof const hopProof: HopProof = { - chainId: BigInt(destChainId), + chainId: BigInt(srcChainId), blockId: BigInt(block.number), rootHash: block.stateRoot, cacheOption: 0n, // Todo: could be configurable diff --git a/packages/bridge-ui/src/libs/relayer/RelayerAPIService.test.ts b/packages/bridge-ui/src/libs/relayer/RelayerAPIService.test.ts index e36fa5b2a62..54bb60637f4 100644 --- a/packages/bridge-ui/src/libs/relayer/RelayerAPIService.test.ts +++ b/packages/bridge-ui/src/libs/relayer/RelayerAPIService.test.ts @@ -7,36 +7,18 @@ function setupMocks() { vi.mock('axios'); vi.mock('@wagmi/core'); vi.mock('@web3modal/wagmi'); - vi.mock('$customToken', () => { - return { - customToken: [ - { - name: 'Bull Token', - addresses: { - '31336': '0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0', - '167002': '0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE', - }, - symbol: 'BLL', - decimals: 18, - type: 'ERC20', - logoURI: 'ipfs://QmezMTpT6ovJ3szb3SKDM9GVGeQ1R8DfjYyXG12ppMe2BY', - mintable: true, - }, - { - name: 'Horse Token', - addresses: { - '31336': '0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e', - '167002': '0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1', - }, - symbol: 'HORSE', - decimals: 18, - type: 'ERC20', - logoURI: 'ipfs://QmU52ZxmSiGX24uDPNUGG3URyZr5aQdLpACCiD6tap4Mgc', - mintable: true, + vi.mock('$bridgeConfig', () => ({ + routingContractsMap: { + 1: { + 167000: { bridgeAddress: '0xd60247c6848b7ca29eddf63aa924e53db6ddd8ec' }, + }, + 167000: { + 1: { + bridgeAddress: '', }, - ], - }; - }); + }, + }, + })); } describe('RelayerAPIService', () => { @@ -44,6 +26,11 @@ describe('RelayerAPIService', () => { setupMocks(); }); + afterEach(() => { + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + // Given const mockedAxios = vi.mocked(axios, true); @@ -76,10 +63,20 @@ describe('RelayerAPIService', () => { const relayerAPIService = new RelayerAPIService(baseUrl); const address = '0x123'; const paginationParams = { page: 1, size: 10 }; - const chainID = 1; + + const mockResponse = { + data: { + page: 1, + size: 10, + total: 100, + items: [], + }, + status: 200, + }; + mockedAxios.get.mockResolvedValue(mockResponse); // When - const result = await relayerAPIService.getAllBridgeTransactionByAddress(address, paginationParams, chainID); + const result = await relayerAPIService.getAllBridgeTransactionByAddress(address, paginationParams); // Then expect(result).toBeDefined(); diff --git a/packages/bridge-ui/src/libs/relayer/RelayerAPIService.ts b/packages/bridge-ui/src/libs/relayer/RelayerAPIService.ts index 3e98f8754b1..c3fe07c7a86 100644 --- a/packages/bridge-ui/src/libs/relayer/RelayerAPIService.ts +++ b/packages/bridge-ui/src/libs/relayer/RelayerAPIService.ts @@ -1,7 +1,7 @@ import { getTransactionReceipt, readContract } from '@wagmi/core'; import axios from 'axios'; import { Buffer } from 'buffer'; -import type { Address, Hash, Hex, TransactionReceipt } from 'viem'; +import { type Address, getAddress, type Hash, type Hex, type TransactionReceipt } from 'viem'; import { bridgeAbi } from '$abi'; import { routingContractsMap } from '$bridgeConfig'; @@ -137,14 +137,23 @@ export class RelayerAPIService { async getAllBridgeTransactionByAddress( address: Address, paginationParams: PaginationParams, - chainID?: number, + chainId?: number, ): Promise { - const params = { - address, - chainID, - event: 'MessageSent', - ...paginationParams, - }; + let params; + if (chainId) { + params = { + address, + chainID: chainId, + event: 'MessageSent', + ...paginationParams, + }; + } else { + params = { + address, + event: 'MessageSent', + ...paginationParams, + }; + } const apiTxs: APIResponse = await this.getTransactionsFromAPI(params); @@ -168,6 +177,7 @@ export class RelayerAPIService { } const items = RelayerAPIService._filterDuplicateAndWrongBridge(apiTxs.items); + const txs: BridgeTransaction[] = items.map((tx: APIResponseTransaction) => { let data: string | Hex = tx.data.Message.Data; if (data === '') { @@ -177,31 +187,39 @@ export class RelayerAPIService { data = `0x${buffer.toString('hex')}`; } + const tokenType: TokenType = _eventToTokenType(tx.eventType); + + const value = tx.data.Message.Value > 0n ? BigInt(tx.amount) : 0n; + const transformedTx = { status: tx.status, amount: BigInt(tx.amount), symbol: tx.canonicalTokenSymbol || 'ETH', decimals: tx.canonicalTokenDecimals, - hash: tx.data.Raw.transactionHash, - from: tx.messageOwner, + srcTxHash: tx.data.Raw.transactionHash, + destTxHash: tx.processedTxHash, + from: getAddress(tx.messageOwner), srcChainId: tx.data.Message.SrcChainId, destChainId: tx.data.Message.DestChainId, msgHash: tx.msgHash, - tokenType: _eventToTokenType(tx.eventType), + tokenType: tokenType, blockNumber: tx.data.Raw.blockNumber, canonicalTokenAddress: tx.canonicalTokenAddress, + processingFee: BigInt(tx.data.Message.Fee.toString()), + claimedBy: tx.claimedBy ? getAddress(tx.claimedBy) : undefined, + fee: tx.fee ? BigInt(tx.fee) : undefined, message: { id: tx.data.Message.Id, - to: tx.data.Message.To, - destOwner: tx.data.Message.DestOwner, + to: getAddress(tx.data.Message.To), + destOwner: getAddress(tx.data.Message.DestOwner), data: data as Hex, - srcOwner: tx.data.Message.SrcOwner, - from: tx.data.Message.From, - gasLimit: Number(tx.data.Message.GasLimit), - value: BigInt(tx.amount), + srcOwner: getAddress(tx.data.Message.SrcOwner), + from: getAddress(tx.data.Message.From), + gasLimit: tx.data.Message.GasLimit, + value, srcChainId: BigInt(tx.data.Message.SrcChainId), destChainId: BigInt(tx.data.Message.DestChainId), - fee: BigInt(tx.data.Message.Fee), + fee: BigInt(tx.data.Message.Fee.toString()), }, } satisfies BridgeTransaction; @@ -210,16 +228,21 @@ export class RelayerAPIService { const txsPromises = txs.map(async (bridgeTx) => { if (!bridgeTx) return; - if (bridgeTx.from.toLowerCase() !== address.toLowerCase()) return; - const { destChainId, srcChainId, hash, msgHash } = bridgeTx; + + const senderMatch = getAddress(bridgeTx.from) === getAddress(address); + const receiverMatch = bridgeTx.message && getAddress(bridgeTx.message.destOwner) === getAddress(address); + + if (!senderMatch && !receiverMatch) return; + + const { destChainId, srcChainId, srcTxHash, msgHash } = bridgeTx; // Returns the transaction receipt for hash or null // if the transaction has not been mined. - const receipt = await RelayerAPIService._getTransactionReceipt(Number(srcChainId), hash); + const receipt = await RelayerAPIService._getTransactionReceipt(Number(srcChainId), srcTxHash); // TODO: do we want to show these transactions? if (!receipt || receipt === null) { - log('Transaction not mined yet', { hash, srcChainId }); + log('Transaction not mined yet', { srcTxHash, srcChainId }); } bridgeTx.receipt = receipt as TransactionReceipt; @@ -234,6 +257,7 @@ export class RelayerAPIService { // Update the status bridgeTx.msgStatus = msgStatus; + return bridgeTx; }); diff --git a/packages/bridge-ui/src/libs/relayer/types.ts b/packages/bridge-ui/src/libs/relayer/types.ts index 90ed2b64ed0..48504ea28a5 100644 --- a/packages/bridge-ui/src/libs/relayer/types.ts +++ b/packages/bridge-ui/src/libs/relayer/types.ts @@ -1,4 +1,4 @@ -import type { Address, Hex } from 'viem'; +import type { Address, Hash, Hex } from 'viem'; import type { BridgeTransaction, RelayerMessage } from '$libs/bridge'; @@ -58,9 +58,14 @@ export type APIResponseTransaction = { canonicalTokenName: string; canonicalTokenDecimals: number; amount: string; - msgHash: Hex; + msgHash: Hash; messageOwner: Address; event: string; + claimedBy: Address; + processedTxHash: Hash; + fee: string; + isProfitable: boolean; + isProfitableEvaluatedAt: string; }; export type RelayerBlockInfo = { diff --git a/packages/bridge-ui/src/libs/storage/BridgeTxService.ts b/packages/bridge-ui/src/libs/storage/BridgeTxService.ts index f69c8373287..c46ef355d26 100644 --- a/packages/bridge-ui/src/libs/storage/BridgeTxService.ts +++ b/packages/bridge-ui/src/libs/storage/BridgeTxService.ts @@ -8,7 +8,6 @@ import { type BridgeTransaction, MessageStatus } from '$libs/bridge'; import { getMessageStatusForMsgHash } from '$libs/bridge/getMessageStatusForMsgHash'; import { isSupportedChain } from '$libs/chain'; import { FilterLogsError } from '$libs/error'; -import { fetchTransactionReceipt } from '$libs/util/fetchTransactionReceipt'; import { jsonParseWithDefault } from '$libs/util/jsonParseWithDefault'; import { getLogger } from '$libs/util/logger'; import { config } from '$libs/wagmi'; @@ -21,7 +20,11 @@ export class BridgeTxService { //Todo: duplicate code in RelayerAPIService private static async _getTransactionReceipt(chainId: number, hash: Hash) { try { - return await fetchTransactionReceipt(hash, chainId); + return await waitForTransactionReceipt(config, { + hash, + chainId: Number(chainId), + timeout: pendingTransaction.waitTimeout, + }); } catch (error) { log(`Error getting transaction receipt for ${hash}: ${error}`); return null; @@ -94,11 +97,11 @@ export class BridgeTxService { private async _enhanceTx(tx: BridgeTransaction, address: Address, waitForTx: boolean) { // Filters out the transactions that are not from the current address - if (tx.from.toLowerCase() !== address.toLowerCase()) return; + // if (tx.from.toLowerCase() !== address.toLowerCase()) return; const bridgeTx: BridgeTransaction = { ...tx }; // prevent mutation - const { destChainId, srcChainId, hash } = bridgeTx; + const { destChainId, srcChainId, srcTxHash } = bridgeTx; // Ignore transactions from chains not supported by the bridge if (!isSupportedChain(Number(srcChainId))) return; @@ -107,15 +110,11 @@ export class BridgeTxService { if (waitForTx) { // We might want to wait for the transaction to be mined - receipt = await waitForTransactionReceipt(config, { - hash, - chainId: Number(srcChainId), - timeout: pendingTransaction.waitTimeout, - }); - } else { - // Returns the transaction receipt for hash or null - // if the transaction has not been mined. - receipt = await BridgeTxService._getTransactionReceipt(Number(srcChainId), hash); + try { + receipt = await BridgeTxService._getTransactionReceipt(Number(srcChainId), srcTxHash); + } catch (error) { + console.error('Error waiting for transaction receipt', error); + } } if (!receipt) { @@ -201,7 +200,7 @@ export class BridgeTxService { async getTxByHash(hash: Hash, address: Address) { const txs = this._getTxFromStorage(address); - const tx = txs.find((tx) => tx.hash === hash) as BridgeTransaction; + const tx = txs.find((tx) => tx.srcTxHash === hash) as BridgeTransaction; log('Transaction from storage', { ...tx }); @@ -237,9 +236,9 @@ export class BridgeTxService { log('Removing transactions from storage', txs); const txsFromStorage = this._getTxFromStorage(address); - const txsToRemove = txs.map((tx) => tx.hash); + const txsToRemove = txs.map((tx) => tx.srcTxHash); - const filteredTxs = txsFromStorage.filter((tx) => !txsToRemove.includes(tx.hash)); + const filteredTxs = txsFromStorage.filter((tx) => !txsToRemove.includes(tx.srcTxHash)); this.updateByAddress(address, filteredTxs); } @@ -249,4 +248,9 @@ export class BridgeTxService { const key = `${storageService.bridgeTxPrefix}-${address}`; this.storage.removeItem(key); } + + transactionIsStoredLocally(address: Address, tx: BridgeTransaction) { + const txs = this._getTxFromStorage(address); + return txs.some((t) => t.srcTxHash === tx.srcTxHash); + } } diff --git a/packages/bridge-ui/src/libs/token/getTokenApprovalStatus.ts b/packages/bridge-ui/src/libs/token/getTokenApprovalStatus.ts index 94a5cbcf88d..0fa606db40b 100644 --- a/packages/bridge-ui/src/libs/token/getTokenApprovalStatus.ts +++ b/packages/bridge-ui/src/libs/token/getTokenApprovalStatus.ts @@ -6,6 +6,7 @@ import { destNetwork, enteredAmount, insufficientAllowance, + needsApprovalReset, selectedToken, } from '$components/Bridge/state'; import { bridges, ContractType, type RequireApprovalArgs } from '$libs/bridge'; @@ -27,6 +28,7 @@ export enum ApprovalStatus { ETH_NO_APPROVAL_REQUIRED, APPROVAL_REQUIRED, NO_APPROVAL_REQUIRED, + RESET_REQUIRED, } export const getTokenApprovalStatus = async (token: Maybe): Promise => { @@ -57,6 +59,7 @@ export const getTokenApprovalStatus = async (token: Maybe): Promise } if (token.type === TokenType.ERC20) { log('checking approval status for ERC20'); + needsApprovalReset.set(false); const tokenVaultAddress = routingContractsMap[currentChainId][destinationChainId].erc20VaultAddress; const bridge = bridges[TokenType.ERC20] as ERC20Bridge; @@ -72,6 +75,19 @@ export const getTokenApprovalStatus = async (token: Maybe): Promise insufficientAllowance.set(requireAllowance); allApproved.set(!requireAllowance); if (requireAllowance) { + // specific check for USDT + if (get(selectedToken)?.symbol === 'tUSDT') { + const allowance = await bridge.getAllowance({ + amount: get(enteredAmount), + tokenAddress, + ownerAddress, + spenderAddress: tokenVaultAddress, + }); + if (allowance > 0n) { + needsApprovalReset.set(true); + return ApprovalStatus.RESET_REQUIRED; + } + } return ApprovalStatus.APPROVAL_REQUIRED; } return ApprovalStatus.NO_APPROVAL_REQUIRED; diff --git a/packages/bridge-ui/src/libs/util/formatTimestamp.ts b/packages/bridge-ui/src/libs/util/formatTimestamp.ts new file mode 100644 index 00000000000..a183fb5fb8a --- /dev/null +++ b/packages/bridge-ui/src/libs/util/formatTimestamp.ts @@ -0,0 +1,11 @@ +export const formatTimestamp = (timestamp: number): string => { + const date = new Date(timestamp * 1000); + const day = String(date.getDate()).padStart(2, '0'); + const month = String(date.getMonth() + 1).padStart(2, '0'); // Months are zero-based + const year = String(date.getFullYear()); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + + return `${day}/${month}/${year}, ${hours}:${minutes}:${seconds}`; +}; diff --git a/packages/bridge-ui/src/libs/util/getBlockFromTxHash.ts b/packages/bridge-ui/src/libs/util/getBlockFromTxHash.ts new file mode 100644 index 00000000000..4ca49781db4 --- /dev/null +++ b/packages/bridge-ui/src/libs/util/getBlockFromTxHash.ts @@ -0,0 +1,23 @@ +import { getTransaction, type GetTransactionReturnType } from '@wagmi/core'; +import type { Hash } from 'viem'; + +import { getLogger } from '$libs/util/logger'; +import { config } from '$libs/wagmi'; + +const log = getLogger('getBlockFromTxHash'); + +export const getBlockFromTxHash = async (txHash: Hash, chainId: bigint) => { + if (!txHash || !chainId) { + console.error('Missing txHash or chainId', txHash, chainId); + throw new Error('Missing txHash or chainId'); + } + + log('Getting block from tx hash', txHash, chainId); + const transactionData: GetTransactionReturnType = await getTransaction(config, { + hash: txHash, + chainId: Number(chainId), + }); + log('Transaction data', transactionData); + const { blockNumber } = transactionData; + return blockNumber; +}; diff --git a/packages/bridge-ui/src/libs/util/getBlockTimestamp.ts b/packages/bridge-ui/src/libs/util/getBlockTimestamp.ts new file mode 100644 index 00000000000..067d2f78509 --- /dev/null +++ b/packages/bridge-ui/src/libs/util/getBlockTimestamp.ts @@ -0,0 +1,13 @@ +import { getPublicClient } from '@wagmi/core'; + +import { ClientError } from '$libs/error'; +import { config } from '$libs/wagmi'; + +export const geBlockTimestamp = async (srcChainId: bigint, blockNumber: bigint) => { + const client = getPublicClient(config, { chainId: Number(srcChainId) }); + if (!client) throw new ClientError('Client not found'); + const block = await client.getBlock({ + blockNumber, + }); + return block.timestamp; +}; diff --git a/packages/bridge-ui/src/libs/util/isSmartContractWallet.test.ts b/packages/bridge-ui/src/libs/util/isSmartContract.test.ts similarity index 79% rename from packages/bridge-ui/src/libs/util/isSmartContractWallet.test.ts rename to packages/bridge-ui/src/libs/util/isSmartContract.test.ts index ba9be467fff..64d9d996582 100644 --- a/packages/bridge-ui/src/libs/util/isSmartContractWallet.test.ts +++ b/packages/bridge-ui/src/libs/util/isSmartContract.test.ts @@ -4,7 +4,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { config } from '$libs/wagmi'; import { L1_CHAIN_ID } from '$mocks'; -import { isSmartContractWallet } from './isSmartContractWallet'; +import { isSmartContract } from './isSmartContract'; // Mock wagmi core vi.mock('@wagmi/core'); @@ -13,7 +13,7 @@ vi.mock('$customToken'); vi.mock('$libs/token'); -describe('isSmartContractWallet', () => { +describe('isSmartContract', () => { const mockWalletAddress = '0x1234567890abcdef1234567890abcdef12345678'; const mockChainId = L1_CHAIN_ID; const mockClient = { @@ -30,7 +30,7 @@ describe('isSmartContractWallet', () => { mockClient.getBytecode.mockResolvedValueOnce('0x6000600055'); // When - const result = await isSmartContractWallet(mockWalletAddress, mockChainId); + const result = await isSmartContract(mockWalletAddress, mockChainId); // Then expect(result).toBe(true); @@ -43,7 +43,7 @@ describe('isSmartContractWallet', () => { mockClient.getBytecode.mockResolvedValueOnce('0x'); // When - const result = await isSmartContractWallet(mockWalletAddress, mockChainId); + const result = await isSmartContract(mockWalletAddress, mockChainId); // Then expect(result).toBe(false); @@ -56,6 +56,6 @@ describe('isSmartContractWallet', () => { vi.mocked(getPublicClient).mockReturnValueOnce(null); // When/Then - await expect(isSmartContractWallet(mockWalletAddress, mockChainId)).rejects.toThrow('No public client found'); + await expect(isSmartContract(mockWalletAddress, mockChainId)).rejects.toThrow('No public client found'); }); }); diff --git a/packages/bridge-ui/src/libs/util/isSmartContractWallet.ts b/packages/bridge-ui/src/libs/util/isSmartContract.ts similarity index 70% rename from packages/bridge-ui/src/libs/util/isSmartContractWallet.ts rename to packages/bridge-ui/src/libs/util/isSmartContract.ts index 53c49bf1e35..9bbc18e2332 100644 --- a/packages/bridge-ui/src/libs/util/isSmartContractWallet.ts +++ b/packages/bridge-ui/src/libs/util/isSmartContract.ts @@ -5,9 +5,9 @@ import { config } from '$libs/wagmi'; import { getLogger } from './logger'; -const log = getLogger('util:isSmartContractWallet'); +const log = getLogger('util:isSmartContract'); -export const isSmartContractWallet = async (walletAddress: Address, chainId: number) => { +export const isSmartContract = async (walletAddress: Address, chainId: number) => { const publicClient = getPublicClient(config, { chainId }); if (!publicClient) throw new Error('No public client found'); @@ -18,6 +18,6 @@ export const isSmartContractWallet = async (walletAddress: Address, chainId: num if (byteCode !== '0x' && byteCode !== undefined) { isSmartContract = true; } - log('isSmartContractWallet', isSmartContract, walletAddress, chainId); + log('isSmartContract', isSmartContract, walletAddress, chainId); return isSmartContract; }; diff --git a/packages/bridge-ui/src/libs/util/mergeTransactions.test.ts b/packages/bridge-ui/src/libs/util/mergeTransactions.test.ts index f6196e92cee..ffb09bc4a03 100644 --- a/packages/bridge-ui/src/libs/util/mergeTransactions.test.ts +++ b/packages/bridge-ui/src/libs/util/mergeTransactions.test.ts @@ -47,11 +47,13 @@ describe('mergeUniqueTransactions', () => { // Given const localTxs: BridgeTransaction[] = [ { - hash: 'hash1' as Hex, + srcTxHash: 'hash1' as Hex, + destTxHash: 'destHash1' as Hex, from: 'address1' as Address, amount: BigInt(1000), symbol: 'symbol1', decimals: 2, + processingFee: 1111n, srcChainId: BigInt(1), destChainId: BigInt(2), msgStatus: MessageStatus.DONE, @@ -62,11 +64,13 @@ describe('mergeUniqueTransactions', () => { tokenType: 'ERC20' as TokenType, }, { - hash: 'hash2' as Hex, + srcTxHash: 'hash2' as Hex, + destTxHash: 'destHash2' as Hex, from: 'address2' as Address, amount: BigInt(2000), symbol: 'symbol2', decimals: 2, + processingFee: 1111n, srcChainId: BigInt(1), destChainId: BigInt(2), msgStatus: MessageStatus.DONE, @@ -79,11 +83,13 @@ describe('mergeUniqueTransactions', () => { const relayerTx: BridgeTransaction[] = [ { - hash: 'hash3' as Hex, + srcTxHash: 'hash3' as Hex, + destTxHash: 'destHash3' as Hex, from: 'address3' as Address, amount: BigInt(3000), symbol: 'symbol3', decimals: 2, + processingFee: 1111n, srcChainId: BigInt(1), destChainId: BigInt(2), msgStatus: MessageStatus.DONE, @@ -93,11 +99,13 @@ describe('mergeUniqueTransactions', () => { blockNumber: '0x123', }, { - hash: 'hash4' as Hex, + srcTxHash: 'hash4' as Hex, + destTxHash: 'destHash4' as Hex, from: 'address4' as Address, amount: BigInt(4000), symbol: 'symbol4', decimals: 2, + processingFee: 1111n, srcChainId: BigInt(1), destChainId: BigInt(2), msgStatus: MessageStatus.DONE, @@ -136,10 +144,12 @@ describe('mergeUniqueTransactions', () => { const localWithOutdated = [ ...localTxs, { - hash: 'hash3' as Hex, + srcTxHash: 'hash3' as Hex, + destTxHash: 'destHash3' as Hex, from: 'address2' as Address, amount: BigInt(2000), symbol: 'symbol2', + processingFee: 1111n, decimals: 2, srcChainId: BigInt(1), destChainId: BigInt(2), @@ -164,5 +174,5 @@ describe('mergeUniqueTransactions', () => { }); function extractHashes(transactions: BridgeTransaction[]): Hex[] { - return transactions.map((tx) => tx.hash); + return transactions.map((tx) => tx.srcTxHash); } diff --git a/packages/bridge-ui/src/libs/util/mergeTransactions.ts b/packages/bridge-ui/src/libs/util/mergeTransactions.ts index 42805471ed3..d5865fa665b 100644 --- a/packages/bridge-ui/src/libs/util/mergeTransactions.ts +++ b/packages/bridge-ui/src/libs/util/mergeTransactions.ts @@ -10,13 +10,13 @@ export const mergeAndCaptureOutdatedTransactions = ( relayerTx: BridgeTransaction[], ): MergeResult => { const relayerTxMap: Map = new Map(); - relayerTx.forEach((tx) => relayerTxMap.set(tx.hash, tx)); + relayerTx.forEach((tx) => relayerTxMap.set(tx.srcTxHash, tx)); const outdatedLocalTransactions: BridgeTransaction[] = []; const mergedTransactions: BridgeTransaction[] = []; for (const tx of localTxs) { - if (!relayerTxMap.has(tx.hash)) { + if (!relayerTxMap.has(tx.srcTxHash)) { mergedTransactions.push(tx); } else { outdatedLocalTransactions.push(tx); diff --git a/packages/bridge-ui/src/libs/util/responsiveCheck.ts b/packages/bridge-ui/src/libs/util/responsiveCheck.ts new file mode 100644 index 00000000000..295f9142dd2 --- /dev/null +++ b/packages/bridge-ui/src/libs/util/responsiveCheck.ts @@ -0,0 +1,49 @@ +import { derived, writable } from 'svelte/store'; + +export let desktopQuery: MediaQueryList; +export let tabletQuery: MediaQueryList; +export let mobileQuery: MediaQueryList; + +// Writable stores to track media query states +const isDesktopQuery = writable(true); +const isTabletQuery = writable(false); +const isMobileQuery = writable(false); + +// Function to update the writable stores based on media query changes +export function updateMediaQueries() { + if (desktopQuery) { + isDesktopQuery.set(desktopQuery.matches); + } + if (tabletQuery) { + isTabletQuery.set(tabletQuery.matches); + } + if (mobileQuery) { + isMobileQuery.set(mobileQuery.matches); + } +} + +export function mediaQueryHandler() { + updateMediaQueries(); +} + +// Derived stores to compute the values based on media queries +export const isDesktop = derived(isDesktopQuery, ($isDesktopQuery) => $isDesktopQuery); +export const isTablet = derived(isTabletQuery, ($isTabletQuery) => $isTabletQuery); +export const isMobile = derived(isMobileQuery, ($isMobileQuery) => $isMobileQuery); + +// Function to initialize media queries only on the client side +export function initializeMediaQueries() { + if (typeof window !== 'undefined') { + desktopQuery = window.matchMedia('(min-width: 1200px)'); + tabletQuery = window.matchMedia('(min-width: 768px) and (max-width: 1199px)'); + mobileQuery = window.matchMedia('(max-width: 767px)'); + + // Set initial values + updateMediaQueries(); + + // Listen for changes + desktopQuery.addEventListener('change', updateMediaQueries); + tabletQuery.addEventListener('change', updateMediaQueries); + mobileQuery.addEventListener('change', updateMediaQueries); + } +} diff --git a/packages/bridge-ui/src/libs/util/shortenAddress.ts b/packages/bridge-ui/src/libs/util/shortenAddress.ts index 23902b714fa..25588b0718b 100644 --- a/packages/bridge-ui/src/libs/util/shortenAddress.ts +++ b/packages/bridge-ui/src/libs/util/shortenAddress.ts @@ -1,4 +1,4 @@ -export const shortenAddress = (address: string, charsStart = 6, charsEnd = 4, sep = '…') => { +export const shortenAddress = (address: string | undefined, charsStart = 6, charsEnd = 4, sep = '…') => { if (!address) return '0x'; return [address.slice(0, charsStart), address.slice(-charsEnd)].join(sep); }; diff --git a/packages/bridge-ui/src/libs/util/truncateString.ts b/packages/bridge-ui/src/libs/util/truncateString.ts index 266795e21dd..593065a6070 100644 --- a/packages/bridge-ui/src/libs/util/truncateString.ts +++ b/packages/bridge-ui/src/libs/util/truncateString.ts @@ -1,3 +1,4 @@ export function truncateString(str: string, maxlength: number, strBoundary = '…') { + if (!str) return; return str.length > maxlength ? `${str.substring(0, maxlength)}${strBoundary}` : str; } diff --git a/packages/bridge-ui/src/libs/util/uid.test.ts b/packages/bridge-ui/src/libs/util/uid.test.ts deleted file mode 100644 index 44ee4aa327e..00000000000 --- a/packages/bridge-ui/src/libs/util/uid.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { uid } from './uid'; - -describe('uid', () => { - it('should always return a unique id', () => { - const generatedIds = new Set(); - - // Is this unique enough? 😅 - for (let i = 0; i < 1000; i++) { - generatedIds.add(uid()); - } - - expect(generatedIds.size).toBe(1000); - }); -}); diff --git a/packages/bridge-ui/src/libs/util/uid.ts b/packages/bridge-ui/src/libs/util/uid.ts deleted file mode 100644 index 62cb3175f16..00000000000 --- a/packages/bridge-ui/src/libs/util/uid.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function uid() { - return Math.floor(Math.random() * Date.now()).toString(16); -} diff --git a/packages/bridge-ui/src/libs/wagmi/watcher.ts b/packages/bridge-ui/src/libs/wagmi/watcher.ts index 3523b253ddf..31fe27791c6 100644 --- a/packages/bridge-ui/src/libs/wagmi/watcher.ts +++ b/packages/bridge-ui/src/libs/wagmi/watcher.ts @@ -3,13 +3,14 @@ import { watchAccount } from '@wagmi/core'; import { chains, isSupportedChain } from '$libs/chain'; import { refreshUserBalance } from '$libs/util/balance'; import { checkForPausedContracts } from '$libs/util/checkForPausedContracts'; -import { isSmartContractWallet } from '$libs/util/isSmartContractWallet'; +import { isSmartContract } from '$libs/util/isSmartContract'; import { getLogger } from '$libs/util/logger'; import { account, connectedSmartContractWallet } from '$stores/account'; import { switchChainModal } from '$stores/modal'; import { connectedSourceChain } from '$stores/network'; import { config } from './client'; + const log = getLogger('wagmi:watcher'); let isWatching = false; @@ -23,6 +24,7 @@ export async function startWatching() { async onChange(data) { await checkForPausedContracts(); log('Account changed', data); + account.set(data); refreshUserBalance(); const { chainId, address } = data; @@ -30,7 +32,7 @@ export async function startWatching() { if (chainId && address) { let smartWallet = false; try { - smartWallet = (await isSmartContractWallet(address, Number(chainId))) || false; + smartWallet = (await isSmartContract(address, Number(chainId))) || false; } catch (error) { console.error('Error checking for smart contract wallet', error); } finally { @@ -49,10 +51,8 @@ export async function startWatching() { // the source chain. const srcChain = chains.find((c) => c.id === Number(chainId)); if (srcChain) connectedSourceChain.set(srcChain); - refreshUserBalance(); } - account.set(data); }, }); diff --git a/packages/bridge-ui/src/routes/+layout.svelte b/packages/bridge-ui/src/routes/+layout.svelte index 2a1865c3636..b54c6cf4f2c 100644 --- a/packages/bridge-ui/src/routes/+layout.svelte +++ b/packages/bridge-ui/src/routes/+layout.svelte @@ -4,14 +4,24 @@ import { onDestroy, onMount } from 'svelte'; + import { browser } from '$app/environment'; import { AccountConnectionToast } from '$components/AccountConnectionToast'; import { BridgePausedModal } from '$components/BridgePausedModal'; import { Header } from '$components/Header'; import { NotificationToast } from '$components/NotificationToast'; import { SideNavigation } from '$components/SideNavigation'; import { SwitchChainModal } from '$components/SwitchChainModal'; + import { + desktopQuery, + initializeMediaQueries, + mediaQueryHandler, + mobileQuery, + tabletQuery, + } from '$libs/util/responsiveCheck'; import { startWatching, stopWatching } from '$libs/wagmi'; + let sideBarOpen = false; + const syncPointer = ({ x, y }: { x: number; y: number }) => { document.documentElement.style.setProperty('--x', x.toFixed(2)); document.documentElement.style.setProperty('--xp', (x / window.innerWidth).toFixed(2)); @@ -21,18 +31,40 @@ onMount(async () => { await startWatching(); - document.body.addEventListener('pointermove', syncPointer); + initializeMediaQueries(); + + if (desktopQuery) { + desktopQuery.addEventListener('change', mediaQueryHandler); + document.body.addEventListener('pointermove', syncPointer); + } + if (tabletQuery) { + tabletQuery.addEventListener('change', mediaQueryHandler); + } + if (mobileQuery) { + mobileQuery.addEventListener('change', mediaQueryHandler); + } }); onDestroy(() => { stopWatching(); - document.body.removeEventListener('pointermove', syncPointer); + if (browser) { + document.body.removeEventListener('pointermove', syncPointer); + } + if (desktopQuery) { + desktopQuery.removeEventListener('change', mediaQueryHandler); + } + if (tabletQuery) { + tabletQuery.removeEventListener('change', mediaQueryHandler); + } + if (mobileQuery) { + mobileQuery.removeEventListener('change', mediaQueryHandler); + } }); - -
+
+
diff --git a/packages/bridge-ui/src/routes/relayer/+page.svelte b/packages/bridge-ui/src/routes/relayer/+page.svelte new file mode 100644 index 00000000000..ae0d824f7e0 --- /dev/null +++ b/packages/bridge-ui/src/routes/relayer/+page.svelte @@ -0,0 +1,11 @@ + + + + Taiko Bridge | Relayer + + + + diff --git a/packages/bridge-ui/src/routes/transactions/+page.svelte b/packages/bridge-ui/src/routes/transactions/+page.svelte index f821c3def6a..c775c4aa328 100644 --- a/packages/bridge-ui/src/routes/transactions/+page.svelte +++ b/packages/bridge-ui/src/routes/transactions/+page.svelte @@ -4,7 +4,7 @@ - Taiko Bridge | Activities + Taiko Bridge | Transactions diff --git a/packages/bridge-ui/src/styles/override.css b/packages/bridge-ui/src/styles/override.css index 2ac1f9b46f2..d3e2c6c6800 100644 --- a/packages/bridge-ui/src/styles/override.css +++ b/packages/bridge-ui/src/styles/override.css @@ -83,3 +83,13 @@ input[type='number'] { .label { padding: 0; } + +html:has(.drawer-toggle:checked) { + overflow-y: hidden; + scrollbar-gutter: unset; +} + +:root:has(:is(.modal-open, .modal:target, .modal-toggle:checked + .modal, .modal[open])) { + overflow: hidden; + scrollbar-gutter: unset; +} diff --git a/packages/bridge-ui/src/tests/mocks/transactions.ts b/packages/bridge-ui/src/tests/mocks/transactions.ts index 57dfaa6fa80..101ee295376 100644 --- a/packages/bridge-ui/src/tests/mocks/transactions.ts +++ b/packages/bridge-ui/src/tests/mocks/transactions.ts @@ -9,10 +9,12 @@ import { L1_CHAIN_ID, L2_CHAIN_ID } from './chains'; import { MOCK_MESSAGE_L1_L2 } from './messages'; export const MOCK_BRIDGE_TX_1 = { - hash: zeroHash, + srcTxHash: zeroHash, + destTxHash: zeroHash, status: 0, msgStatus: MessageStatus.NEW, msgHash: zeroHash, + processingFee: 1111n, from: ALICE, amount: 123n, symbol: 'WAGMI', diff --git a/packages/bridge-ui/static/coins/crvUSD.png b/packages/bridge-ui/static/coins/crvUSD.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae01bbed989ab8bc856c0c1fefd34babf8371db GIT binary patch literal 269529 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%0DcE!lb5x{$J=GSeXgvp-=Tq?Xuz#7J_Far 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 Cq#%O; literal 0 HcmV?d00001 diff --git a/packages/bridge-ui/static/coins/curve.png b/packages/bridge-ui/static/coins/curve.png new file mode 100644 index 0000000000000000000000000000000000000000..1f869a2d96b03a629125548bf42f6007f681df24 GIT binary patch literal 39786 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 literal 0 HcmV?d00001 diff --git a/packages/bridge-ui/tailwind.config.js b/packages/bridge-ui/tailwind.config.js index 2aef58aa151..f1a37132d25 100644 --- a/packages/bridge-ui/tailwind.config.js +++ b/packages/bridge-ui/tailwind.config.js @@ -6,6 +6,9 @@ export default { content: ['./src/**/*.{html,js,svelte,ts}'], theme: { extend: { + width: { + dvw: '100dvw', + }, colors: { /*************** * Base colors * @@ -248,6 +251,9 @@ export default { '--warning-sentiment': '#EBB222', // yellow-400 '--warning-background': '#382800', // yellow-800 + '--neutral-sentiment': '#0052CC', // blue-500 + '--neutral-sentiment-background': '#002966', // blue-700 + '--elevated-background': '#191E28', // grey-800 '--neutral-background': '#2B303B', // grey-700 '--neutral-content': '#2B303B', // grey-800 diff --git a/packages/docs-site/CHANGELOG.md b/packages/docs-site/CHANGELOG.md index a47c16e9666..db1bac8ab3a 100644 --- a/packages/docs-site/CHANGELOG.md +++ b/packages/docs-site/CHANGELOG.md @@ -1,5 +1,291 @@ # Changelog +## [1.21.2](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.21.1...docs-site-v1.21.2) (2025-01-07) + + +### Chores + +* **docs-site:** update codebase analysis to reflect protocol changes ([#18714](https://github.com/taikoxyz/taiko-mono/issues/18714)) ([6157af5](https://github.com/taikoxyz/taiko-mono/commit/6157af5c63608876c5f090017c315ca59c6bd4ef)) + +## [1.21.1](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.21.0...docs-site-v1.21.1) (2025-01-03) + + +### Chores + +* **docs-site:** revert zk coverage docs ([#18682](https://github.com/taikoxyz/taiko-mono/issues/18682)) ([26c5fb3](https://github.com/taikoxyz/taiko-mono/commit/26c5fb3ad09a061997ffba28e91938b172d28798)) +* **repo:** fix broken links ([#18635](https://github.com/taikoxyz/taiko-mono/issues/18635)) ([8e53a6e](https://github.com/taikoxyz/taiko-mono/commit/8e53a6e6a2654b8a599fe1df187e2fd88c22d96e)) + +## [1.21.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.20.3...docs-site-v1.21.0) (2024-12-23) + + +### Features + +* **docs-site:** add doc for SGX Verifier. ([#18579](https://github.com/taikoxyz/taiko-mono/issues/18579)) ([08b2c49](https://github.com/taikoxyz/taiko-mono/commit/08b2c49f19b25643b4570642d1612b15d5d71290)) + + +### Chores + +* **docs-site:** fix broken link ([#18585](https://github.com/taikoxyz/taiko-mono/issues/18585)) ([38bbb55](https://github.com/taikoxyz/taiko-mono/commit/38bbb55dc076a03751871dde5d61729282a68d9a)) +* **docs-site:** fix typos in node operator guides ([#18586](https://github.com/taikoxyz/taiko-mono/issues/18586)) ([b4bd23c](https://github.com/taikoxyz/taiko-mono/commit/b4bd23ca0798ab239730765a4ca1d8e49ef6e52e)) +* **docs-site:** update proof tier graphic ([#18617](https://github.com/taikoxyz/taiko-mono/issues/18617)) ([becffb7](https://github.com/taikoxyz/taiko-mono/commit/becffb7cc81c6f17436985a81750a5eef7f980e1)) + + +### Build + +* **deps:** bump github.com/stretchr/testify from 1.9.0 to 1.10.0 ([#18539](https://github.com/taikoxyz/taiko-mono/issues/18539)) ([79f3fab](https://github.com/taikoxyz/taiko-mono/commit/79f3fab5f1d1ec1bb4ee18afb9268b622e894780)) +* **deps:** bump golang.org/x/sync from 0.9.0 to 0.10.0 ([#18560](https://github.com/taikoxyz/taiko-mono/issues/18560)) ([3d51970](https://github.com/taikoxyz/taiko-mono/commit/3d51970aa0953bbfecaeebf76ea7e664c875c0e4)) + +## [1.20.3](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.20.2...docs-site-v1.20.3) (2024-12-09) + + +### Bug Fixes + +* **docs-site:** update hekla graphic ([#18572](https://github.com/taikoxyz/taiko-mono/issues/18572)) ([ee50fdc](https://github.com/taikoxyz/taiko-mono/commit/ee50fdceec2d8f3a58a67f07b41e832898108e5d)) + + +### Chores + +* **main:** release docs-site 1.20.2 ([#18563](https://github.com/taikoxyz/taiko-mono/issues/18563)) ([ca837f1](https://github.com/taikoxyz/taiko-mono/commit/ca837f1ec3126871d6e8da3323fd8dc8becf7107)) + +## [1.20.2](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.20.1...docs-site-v1.20.2) (2024-12-08) + + +### Bug Fixes + +* **docs-site:** link of goldsky in dev tools ([#18562](https://github.com/taikoxyz/taiko-mono/issues/18562)) ([802569a](https://github.com/taikoxyz/taiko-mono/commit/802569ab2b7ebde69eae45e63228bb280b30fc12)) + +## [1.20.1](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.20.0...docs-site-v1.20.1) (2024-12-07) + + +### Bug Fixes + +* **docs-site:** correct graphic ([#18561](https://github.com/taikoxyz/taiko-mono/issues/18561)) ([b574358](https://github.com/taikoxyz/taiko-mono/commit/b5743588e6492a67e1e5d3cc88906f92fec673bb)) + + +### Chores + +* **docs-site:** add goldsky to dev tools ([#18552](https://github.com/taikoxyz/taiko-mono/issues/18552)) ([4b83b5f](https://github.com/taikoxyz/taiko-mono/commit/4b83b5f76157d73f2c798195730b67adaf9ef09d)) +* **docs-site:** update hekla proof tier config graphic and address ([#18554](https://github.com/taikoxyz/taiko-mono/issues/18554)) ([0854e12](https://github.com/taikoxyz/taiko-mono/commit/0854e12beb8ad4036eecaa3d72589bdb5ab82927)) + +## [1.20.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.19.0...docs-site-v1.20.0) (2024-12-06) + + +### Features + +* **docs-site:** add taiko-protocol section with economics and codebase analysis ([#18542](https://github.com/taikoxyz/taiko-mono/issues/18542)) ([55acc93](https://github.com/taikoxyz/taiko-mono/commit/55acc93c1cf6628f2d1ca6f0b2ca20a257f74e1f)) + +## [1.19.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.18.0...docs-site-v1.19.0) (2024-11-28) + + +### Features + +* **docs-site:** add escenario and explanation for contestable rollup ([#18530](https://github.com/taikoxyz/taiko-mono/issues/18530)) ([7246fbb](https://github.com/taikoxyz/taiko-mono/commit/7246fbb76d46532af61f147b0761851f0cc90b91)) + +## [1.18.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.17.1...docs-site-v1.18.0) (2024-11-26) + + +### Features + +* **docs-site:** add software releases page that shows latest software releases and protocol deployments ([#18523](https://github.com/taikoxyz/taiko-mono/issues/18523)) ([23862a2](https://github.com/taikoxyz/taiko-mono/commit/23862a26890492231cdbf5dd07366e294debda99)) + +## [1.17.1](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.17.0...docs-site-v1.17.1) (2024-11-18) + + +### Chores + +* **docs-site:** update tier router address ([#18495](https://github.com/taikoxyz/taiko-mono/issues/18495)) ([73ba72e](https://github.com/taikoxyz/taiko-mono/commit/73ba72e27586119f269a2c6baf29b6386fcf352c)) + +## [1.17.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.16.0...docs-site-v1.17.0) (2024-11-12) + + +### Features + +* **docs-site:** update testnet address ([#18472](https://github.com/taikoxyz/taiko-mono/issues/18472)) ([cda3956](https://github.com/taikoxyz/taiko-mono/commit/cda3956f23f5ae913d1432e90417351db52572fb)) +* **docs-site:** update tier config and graphic ([#18487](https://github.com/taikoxyz/taiko-mono/issues/18487)) ([af081af](https://github.com/taikoxyz/taiko-mono/commit/af081af99512e07763f1b95f2f747d43633320da)) + + +### Chores + +* **docs-site:** update block-states.mdx ([#18480](https://github.com/taikoxyz/taiko-mono/issues/18480)) ([3dff524](https://github.com/taikoxyz/taiko-mono/commit/3dff5248ae06be93c69c99b3d891133d8cbe2057)) + +## [1.16.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.15.0...docs-site-v1.16.0) (2024-11-07) + + +### Features + +* **docs-site:** update graphic for hekla network config ([#18457](https://github.com/taikoxyz/taiko-mono/issues/18457)) ([1d9b753](https://github.com/taikoxyz/taiko-mono/commit/1d9b753d7163104e5593d3c46d019d9cdae7d549)) + +## [1.15.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.14.0...docs-site-v1.15.0) (2024-11-05) + + +### Features + +* **docs-site:** update network config, list cooldown, proving windows and bonds for every tier, remove banner ([#18377](https://github.com/taikoxyz/taiko-mono/issues/18377)) ([df16035](https://github.com/taikoxyz/taiko-mono/commit/df160358ad022025e76b5957ad0952e4f804dacd)) + + +### Documentation + +* **docs-site:** update mainnet prover docs ([#18367](https://github.com/taikoxyz/taiko-mono/issues/18367)) ([4fd7b59](https://github.com/taikoxyz/taiko-mono/commit/4fd7b5922dd1447d91ec7fea83c987cb1643cc1b)) + + +### Workflow + +* **protocol:** trigger patch release (1.10.1) ([#18358](https://github.com/taikoxyz/taiko-mono/issues/18358)) ([f4f4796](https://github.com/taikoxyz/taiko-mono/commit/f4f4796488059b02c79d6fb15170df58dd31dc4e)) + +## [1.14.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.13.0...docs-site-v1.14.0) (2024-10-25) + + +### Features + +* **docs-site:** add banner for mainnet protocol upgrade ([#18306](https://github.com/taikoxyz/taiko-mono/issues/18306)) ([550dda3](https://github.com/taikoxyz/taiko-mono/commit/550dda334dfa2d53a757ce46091acaba4248371a)) + +## [1.13.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.12.3...docs-site-v1.13.0) (2024-10-25) + + +### Features + +* **docs-site:** add pyth to taiko docs ([#18294](https://github.com/taikoxyz/taiko-mono/issues/18294)) ([59832f1](https://github.com/taikoxyz/taiko-mono/commit/59832f1324cbf98de339552fd8d5039afe3d0e9c)) + +## [1.12.3](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.12.2...docs-site-v1.12.3) (2024-10-20) + + +### Chores + +* **docs-site:** remove banner ([#18267](https://github.com/taikoxyz/taiko-mono/issues/18267)) ([1a46093](https://github.com/taikoxyz/taiko-mono/commit/1a460932a704d3660269336540812f33d7e8cbc4)) + +## [1.12.2](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.12.1...docs-site-v1.12.2) (2024-10-14) + + +### Bug Fixes + +* **docs-site:** fix edit link ([#18243](https://github.com/taikoxyz/taiko-mono/issues/18243)) ([ea55bc2](https://github.com/taikoxyz/taiko-mono/commit/ea55bc24ea7184655804b88cc3c424b69fc87103)) + +## [1.12.1](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.12.0...docs-site-v1.12.1) (2024-09-30) + + +### Chores + +* **docs-site:** fix broken diagram and delete self-direction link ([#18180](https://github.com/taikoxyz/taiko-mono/issues/18180)) ([2e20c28](https://github.com/taikoxyz/taiko-mono/commit/2e20c28e1ac482d3f6bb8ac5e182a43675853166)) + + +### Documentation + +* **docs-site:** add warning to proposer page and update banner ([#18186](https://github.com/taikoxyz/taiko-mono/issues/18186)) ([b02ea92](https://github.com/taikoxyz/taiko-mono/commit/b02ea92af01b37670c2545dbd4e332ab4803ae03)) + +## [1.12.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.9...docs-site-v1.12.0) (2024-09-19) + + +### Features + +* **docs-site:** sitewide banner for ontake fork notification ([#18111](https://github.com/taikoxyz/taiko-mono/issues/18111)) ([5ed6c80](https://github.com/taikoxyz/taiko-mono/commit/5ed6c8085e44b77283fe5ef8874f751126364d84)) +* **docs-site:** update docs for ontake fork hekla ([#18143](https://github.com/taikoxyz/taiko-mono/issues/18143)) ([49b5071](https://github.com/taikoxyz/taiko-mono/commit/49b50712551849d185c98237098d236bb0cf884c)) +* **docs-site:** update graphics and links for hekla ontake fork ([#18146](https://github.com/taikoxyz/taiko-mono/issues/18146)) ([48a27af](https://github.com/taikoxyz/taiko-mono/commit/48a27afe6be22fc7e1a9d2346ae292544faac0b3)) + + +### Bug Fixes + +* **docs-site:** remove duplicate wording ([#18105](https://github.com/taikoxyz/taiko-mono/issues/18105)) ([92c53f8](https://github.com/taikoxyz/taiko-mono/commit/92c53f8655dbdab4c7db1b023823a4e760240894)) + + +### Documentation + +* **docs-site:** fix broken link ([#18139](https://github.com/taikoxyz/taiko-mono/issues/18139)) ([e56b81b](https://github.com/taikoxyz/taiko-mono/commit/e56b81bbd83f26c95641cf7deab82dbb5a3da835)) + +## [1.11.9](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.8...docs-site-v1.11.9) (2024-09-15) + + +### Documentation + +* **docs-site:** add forge verify in faq ([#17937](https://github.com/taikoxyz/taiko-mono/issues/17937)) ([513d9fe](https://github.com/taikoxyz/taiko-mono/commit/513d9fe745ff947e6a1f3f21cfc568432b008d65)) +* **docs-site:** added documentation for PORTERS ([#18033](https://github.com/taikoxyz/taiko-mono/issues/18033)) ([548884d](https://github.com/taikoxyz/taiko-mono/commit/548884d10ca3dc9931c025428f827335e42b55db)) +* **docs-site:** update docs for hekla ontake ([#18090](https://github.com/taikoxyz/taiko-mono/issues/18090)) ([f877568](https://github.com/taikoxyz/taiko-mono/commit/f8775684f32f46f04e8bc8a416f7e2bacfb32530)) + +## [1.11.8](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.7...docs-site-v1.11.8) (2024-08-08) + + +### Documentation + +* **docs-site:** add more node troubleshooting ([#17872](https://github.com/taikoxyz/taiko-mono/issues/17872)) ([9c31ffc](https://github.com/taikoxyz/taiko-mono/commit/9c31ffc58b36a07286606e8e289504f49301d4df)) + +## [1.11.7](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.6...docs-site-v1.11.7) (2024-07-20) + + +### Documentation + +* **repo, docs-site:** add release info links ([#17819](https://github.com/taikoxyz/taiko-mono/issues/17819)) ([c268467](https://github.com/taikoxyz/taiko-mono/commit/c268467b5af165855bdc909ac245e14aa92f1e17)) + +## [1.11.6](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.5...docs-site-v1.11.6) (2024-07-19) + + +### Documentation + +* **docs-site:** address docs and scripts friction points ([#17815](https://github.com/taikoxyz/taiko-mono/issues/17815)) ([c74968b](https://github.com/taikoxyz/taiko-mono/commit/c74968b61828babf218fbc8e8ded001a853a93c3)) +* **docs-site:** update deploy-a-proverset.mdx ([#17813](https://github.com/taikoxyz/taiko-mono/issues/17813)) ([dd09223](https://github.com/taikoxyz/taiko-mono/commit/dd09223de53669b84241672eeb4b8574e5c7f821)) + +## [1.11.5](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.4...docs-site-v1.11.5) (2024-07-17) + + +### Documentation + +* **docs-site:** add upgrade proverset script instructions ([#17799](https://github.com/taikoxyz/taiko-mono/issues/17799)) ([91d307c](https://github.com/taikoxyz/taiko-mono/commit/91d307c8edd527fa46011f2e21f5cc928853e0c8)) +* **docs-site:** update developer tools page ([#17738](https://github.com/taikoxyz/taiko-mono/issues/17738)) ([21ad192](https://github.com/taikoxyz/taiko-mono/commit/21ad192df174b78820c83910d559652c7ceefec0)) +* **docs-site:** update edited Taiko BCR Explorer link ([#17798](https://github.com/taikoxyz/taiko-mono/issues/17798)) ([11ecf83](https://github.com/taikoxyz/taiko-mono/commit/11ecf8325b79b25ee9fdf32bfd0c5971edf43670)) +* **docs-site:** update URL for .env.sample file ([#17794](https://github.com/taikoxyz/taiko-mono/issues/17794)) ([e8c1b18](https://github.com/taikoxyz/taiko-mono/commit/e8c1b18e89133daeade27e8e16d9328363c1a263)) + +## [1.11.4](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.3...docs-site-v1.11.4) (2024-07-10) + + +### Documentation + +* **docs-site:** remove prover_endpoints from guide ([#17769](https://github.com/taikoxyz/taiko-mono/issues/17769)) ([ed4c9d6](https://github.com/taikoxyz/taiko-mono/commit/ed4c9d69cb60c0e3547c65b748f9fa78211713c3)) +* **docs-site:** update enable-prover site ([#17757](https://github.com/taikoxyz/taiko-mono/issues/17757)) ([15a5e7f](https://github.com/taikoxyz/taiko-mono/commit/15a5e7f059ca0c7d17f8b6c6cf472338a9d04fec)) + +## [1.11.3](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.2...docs-site-v1.11.3) (2024-07-04) + + +### Documentation + +* **docs-site,protocol:** streamline ProverSet deployment ([#17730](https://github.com/taikoxyz/taiko-mono/issues/17730)) ([919cb4c](https://github.com/taikoxyz/taiko-mono/commit/919cb4cd0064d1cfa994e53a30a73f98975cfe34)) + +## [1.11.2](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.1...docs-site-v1.11.2) (2024-07-01) + + +### Chores + +* **docs-site:** updates outdated client link in docs ([#17713](https://github.com/taikoxyz/taiko-mono/issues/17713)) ([4c321e2](https://github.com/taikoxyz/taiko-mono/commit/4c321e29a6714820290cc04b5b5f8662414feea5)) + + +### Documentation + +* **docs-site,protocol:** deploy proverset guide and scripts ([#17702](https://github.com/taikoxyz/taiko-mono/issues/17702)) ([a3e1cf7](https://github.com/taikoxyz/taiko-mono/commit/a3e1cf72bc4ad925d3652359a2f4d5fb466b79b0)) +* **docs-site:** add definitions and explanations for bonds ([#17673](https://github.com/taikoxyz/taiko-mono/issues/17673)) ([98276cc](https://github.com/taikoxyz/taiko-mono/commit/98276cc5dfb7ca828119163014488a3fe44605cf)) +* **docs-site:** add disclaimer and reminder to set addresses ([#17712](https://github.com/taikoxyz/taiko-mono/issues/17712)) ([677a0b6](https://github.com/taikoxyz/taiko-mono/commit/677a0b666b58ad2f56f0e4cad4d52f56d75cbcca)) +* **docs-site:** add warning about rpc rate limit ([#17700](https://github.com/taikoxyz/taiko-mono/issues/17700)) ([eebb9df](https://github.com/taikoxyz/taiko-mono/commit/eebb9df8d02b97cf210006b1de35dcf2df2b1b5e)) + +## [1.11.1](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.0...docs-site-v1.11.1) (2024-06-24) + + +### Documentation + +* **docs-site:** update guardian minority bond amount and enable a prover guide ([#17636](https://github.com/taikoxyz/taiko-mono/issues/17636)) ([801a85e](https://github.com/taikoxyz/taiko-mono/commit/801a85e4ea958fed11a6b85bdcac501da0a9ed47)) +* **docs-site:** update proof tier config for testnet ([#17627](https://github.com/taikoxyz/taiko-mono/issues/17627)) ([53d672b](https://github.com/taikoxyz/taiko-mono/commit/53d672b2a87b1b26521ce4b782226e1ff22e5b40)) + +## [1.11.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.10.0...docs-site-v1.11.0) (2024-06-18) + + +### Features + +* **docs-site:** add dune dashboard to dev tools ([#17617](https://github.com/taikoxyz/taiko-mono/issues/17617)) ([ae0b0f0](https://github.com/taikoxyz/taiko-mono/commit/ae0b0f0838541a58ff4f5018098881c15eeae46c)) +* **docs-site:** add verify in batches explanation ([#17600](https://github.com/taikoxyz/taiko-mono/issues/17600)) ([0a8a886](https://github.com/taikoxyz/taiko-mono/commit/0a8a88675413b0f579d4d4889897d2e8404a67f6)) + +## [1.10.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.9.0...docs-site-v1.10.0) (2024-06-14) + + +### Features + +* **docs-site:** update guides ([#17536](https://github.com/taikoxyz/taiko-mono/issues/17536)) ([4a9ba42](https://github.com/taikoxyz/taiko-mono/commit/4a9ba42cadd1b2cd7d1a29097192ffe167eda3e2)) +* **docs-site:** update multiple articles ([#17552](https://github.com/taikoxyz/taiko-mono/issues/17552)) ([1561f92](https://github.com/taikoxyz/taiko-mono/commit/1561f92dded423676ced15c28ff7fa26cd6c96f5)) + ## [1.9.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.8.1...docs-site-v1.9.0) (2024-06-07) diff --git a/packages/docs-site/astro.config.ts b/packages/docs-site/astro.config.ts index f504f963c4f..0c4eeda19e7 100644 --- a/packages/docs-site/astro.config.ts +++ b/packages/docs-site/astro.config.ts @@ -17,18 +17,12 @@ export default defineConfig({ plugins: [ starlightLinksValidator({ exclude: [ - // "/api-reference/blob-storage", "/api-reference/bridge-relayer", "/api-reference/event-indexer", "/api-reference/prover-server", ], }), starlightOpenAPI([ - // { - // base: "api-reference/blob-storage", - // label: "Blob Storage API", - // schema: "../blobstorage/docs/swagger.yaml", - // }, { base: "api-reference/bridge-relayer", label: "Bridge Relayer API", @@ -39,11 +33,6 @@ export default defineConfig({ label: "Event Indexer API", schema: "../eventindexer/docs/swagger.yaml", }, - { - base: "api-reference/prover-server", - label: "Prover Server API", - schema: "../taiko-client/docs/swagger.yaml", - }, ]), ], components: { @@ -52,7 +41,8 @@ export default defineConfig({ }, title: "Docs", editLink: { - baseUrl: "https://github.com/taikoxyz/docs/edit/main/", + baseUrl: + "https://github.com/taikoxyz/taiko-mono/edit/main/packages/docs-site", }, customCss: ["./src/styles/custom.css"], logo: { @@ -78,34 +68,39 @@ export default defineConfig({ label: "Core Concepts", items: [ { label: "What is Taiko?", link: "/core-concepts/what-is-taiko/" }, - { - label: "Based sequencing", - link: "/core-concepts/based-sequencing/", - }, { label: "Contestable rollups (BCR)", - link: "/core-concepts/contestable-rollups/", + link: "/core-concepts/contestable-rollup/", }, { label: "Booster rollups (BBR)", link: "/core-concepts/booster-rollups/", }, { label: "Multi-proofs", link: "/core-concepts/multi-proofs/" }, - { label: "Block states", link: "/core-concepts/block-states" }, - { - label: "Taiko nodes", - link: "/core-concepts/taiko-nodes/", - }, - { - label: "Bridging", - link: "/core-concepts/bridging/", - }, { label: "Inception layers", link: "/core-concepts/inception-layers/", }, ], }, + { + label: "Taiko Protocol", + items: [ + { + label: "Codebase Analysis", + collapsed: true, + items: [ + {label: "TaikoL1 Contract", link: "/taiko-protocol/codebase-analysis/taikol1-contract"}, + {label: "TaikoL2 Contract", link: "/taiko-protocol/codebase-analysis/taikol2-contract"}, + {label: "SGXVerifier Contract", link: "/taiko-protocol/codebase-analysis/sgxverifier-contract"}, + ], + }, + { label: "Block states", link: "/taiko-protocol/block-states" }, + { label: "Bridging", link: "/taiko-protocol/bridging" }, + { label: "Economics", link: "/taiko-protocol/economics" }, + { label: "Taiko nodes", link: "/taiko-protocol/taiko-nodes" }, + ] + }, { label: "Guides", items: [ @@ -117,8 +112,14 @@ export default defineConfig({ label: "Set up your wallet", link: "/guides/app-developers/set-up-your-wallet/", }, - { label: "Receive tokens", link: "/guides/app-developers/receive-tokens/" }, - { label: "Bridge tokens", link: "/guides/app-developers/bridge-tokens/" }, + { + label: "Receive tokens", + link: "/guides/app-developers/receive-tokens/", + }, + { + label: "Bridge tokens", + link: "/guides/app-developers/bridge-tokens/", + }, { label: "Deploy a contract", link: "/guides/app-developers/deploy-a-contract/", @@ -155,13 +156,17 @@ export default defineConfig({ link: "/guides/node-operators/run-a-testnet-taiko-node-from-source/", }, { - label: "Run a Taiko testnet proposer", + label: "Run a Taiko proposer", link: "/guides/node-operators/enable-a-proposer/", }, { - label: "Run a Taiko testnet prover", + label: "Run a Taiko prover", link: "/guides/node-operators/enable-a-prover/", }, + { + label: "Deploy a ProverSet", + link: "guides/node-operators/deploy-a-proverset/", + }, { label: "Node troubleshooting", link: "/guides/node-operators/node-troubleshooting/", @@ -189,6 +194,10 @@ export default defineConfig({ label: "Network configuration", link: "/network-reference/network-configuration", }, + { + label: "Software releases", + link: "/network-reference/software-releases-and-deployments", + }, { label: "RPC configuration", link: "/network-reference/rpc-configuration", diff --git a/packages/docs-site/package.json b/packages/docs-site/package.json index 158b67160fd..511b09a51c3 100644 --- a/packages/docs-site/package.json +++ b/packages/docs-site/package.json @@ -1,7 +1,7 @@ { "name": "docs-site", "type": "module", - "version": "1.9.0", + "version": "1.21.2", "scripts": { "dev": "astro dev", "start": "astro dev", @@ -10,9 +10,9 @@ "astro": "astro" }, "dependencies": { - "@astrojs/check": "^0.6.0", - "@astrojs/starlight": "^0.22.2", - "astro": "^4.8.3", + "@astrojs/check": "^0.8.0", + "@astrojs/starlight": "^0.25.0", + "astro": "^4.11.5", "astro-og-canvas": "^0.5.0", "canvaskit-wasm": "^0.39.1", "sharp": "^0.33.3", diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/bridging-process-message.excalidraw.png b/packages/docs-site/src/assets/content/docs/core-concepts/bridging-process-message.excalidraw.png deleted file mode 100644 index 791c444d1345f54069408e1fd420378fe4102684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161234 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 OPgO}vu~`0kz<&cIvr{er diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/bridging-send-message.excalidraw.png b/packages/docs-site/src/assets/content/docs/core-concepts/bridging-send-message.excalidraw.png deleted file mode 100644 index c53a592c5cf9dd30d080d44c352fce7fa30006b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146508 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

1gIavhq-GIQU%>d zK4JK7Av=A83DZMaYO&avY7@P`=i^#r_5#4YW=?yT*HMmBk|=g>er~EZ z)^qsJ%e|fg-XVFIuqH$*`RGCp{|qNY%2jM*q9SX)+OzW!39`Chs5iDs{67qqkBn3| zl^gI*mIZpxFHvG{PsbVL8Nsz{{@<6kIKTXOq2)Wh=Qk+Be=cWfYU6=19oqgSFclnd zc>P}lq35N*V!g^VUO!CKN@l>WSGB@Yc{IRvng{DsBLxq}3>0h}to8r1*dG83=tG~8 zK0x1L;@2X8sQ9JYkKs|{{USvhXkDSrU7@sOvpf6WM!#g#TD~^*eV@jUp8MFoO4GiI z#a`x8{^*G4BLBSvOxUrN-e1f581%Uo(TOD!f<_KwRSbL_$r9W$d6o9|lT4;!SChoq8DcgNh!V_9`%fQhn zIaU2YR8iA#?llLY4%W>=CCNp1LZjNos+%J~zmIlvy}tx~p6 z{ui(42Vm9@M#g>ro94s~T&89Hz5?_=CjBd@{_pZYe)vD*0KV{lp7VcU^)HU%{~yns z+_+AFWAi=s3g?Pb*rtLKK(@kuc^B3S3|h-V#Vxyo0nq*S+-3Pe^KJ#JiSwiHxh9aU zCOkSSCV&L_M{s8@c)t0ZUw03nM4j`{48F<%%&nuHZo1ZFr7zPBo}X@P+^5gJ>X{z) zqhDkWAPFtT((!&-7zC(fWAbm0erz_)x2SEmebN9(YQDYf9{c&jDyv*g0L?~8OWv2D z-1O~5q9R9C)bF2t4PF!FqgB;3=clxmkqD4U#=^`G0LvKT+r!+Ni7>z7Npj!Y+2zuNH>20KC=DlI_Pt z1?c)p*%)9r;yL>vYA=Obtz|Cg^Uyg5bE~G0XRiqO?Vj(D!qons-vBX^kRVa@jsE0y z{(VDh37;29iBgTz@GXGqvRC!&-v!7OU^hK=&#QgO$FB5^Lvt@v4W)-FC;*;Z+>0eRZ-Vz*E8KjMO zHiis7ZX7`sA*Af?uf<_ zY!L=K2?8jn+pG-iV?3RMPmNx26$MYobG3y>7v-o#V7>IO>V^~@CgA;m*?f8B_W=hu z{k=|Tu4@YSr;~_hhOHp1pDk|_D6kZ+_C}z(wNzk zNR_kwPjl9`j>|29>nn5IVt8K3+V=v#od~TehQdoPRMslO63*SafeIjK-+R$g2s}^Z z#{k63)*6?-mg4JiEr*+*Ur(M!(?}sMQqb=A(c{g0hT|CoIk-AL>d=HT#8A4(akIi7 zo*ZtjFO}gKdn*^@8io`j!C4HggO*0|>@Z2RX#)i?r`s zz}`LxZ{NYugn9P@l&$5CR)9M+CtgvRz8rKVr8pTTnDkjYo9N!yNlIfJq!H7JWOe#> z&JI2H?HA74pVZP_0@#Y%*ZN9-#DGi@0mCY<*FU`;aqU-M(3eX9xQ~6jQRhskC1UiW zmapkXZJY#;qKK8HFd&NF;+*3_gs=4C&f3!jfDde~RaE=#`~*CBD@Fasdsse3k-zg! z2S91Ns?6%2yx#v(X4y5&AOsZe&KUb>XS_1J)3i0U|rFStHyT$ z=u>*I@iQ^5kprv}It2gO%F<-{yml@!NyfQy?cPCq75kVwU)$e(~QRCR~%4@jf$d>VHCR< z`Q4AAkHWU!t&Yq9?ASJFqfP;~y@%Ji87J;B$ty?UJ`@rsT5KB6x0ahZB)ei7MxVMO z#nGZC7t~0&KY$a%=!f?pWgmPAT{UqhDe0j12hPP})}&+wsSoT%s(M&hYoM9D~HLtFohg;*Xx|{KAv7O2EVE z^|5Y?5A_TKU}uV-ed;a=bXL+srRhy=vd7bD3s4V5ea0R+=d^r(mG^5Z{;_xUyUAN- zl_2OdOu{Y9P3JBgsoosDr}5zRrw0H(hzX*(97Hb*hfYFLl2q-2bc`Z98_JYOQ=U!7 zOA>gBB2PT$WA%AL@rk|i!^(oAj#q9NNx!SF7C1vq#6l(TR8y3CEK|Kbj7EZ0$Z-96 z0e5;GN*6NDNmYsXEAS{RPXrcVbg9Tu5Oq*mLuh;M;eCZoIsQ!K+vF)a&ErnThu=$` zF4z@2)pL4tRYmD@`N#aBZqj88sP~>4ZlYoR=omaV0Z`?icS$lN#fw8MlIUXYxTGdR z?oG;`HBV zGbNqkgL7sYC*_-vWnKwdfz8JhJff7G;1S@DS*ac`?#PzAc8EfRv8)1==M;CP_|?S| z_p&=bQrt>ytDTUIf@}!?CHWZIgR4#LhH9%ounrVY_OjyKm~Dg;8+>FPN@9c`__gs-UpAK}(?UeHndW)^q8ETYefm#$mO zsI`w}*2>RSxLlm6aN`4{L`LXRLNxO;*&7=4h1iDzYe}e0ayJ{Piawxq+{%Q)Q92Fh zMD!xxqGKstsTyY!1u1cETh-ft<;VoU%PgNxMx5u!luiSYg0F8W9Q@ujG=cFwjQTsF zWB9@l4qfI+>VWRV!t8i z$~mDn`04dFbF(^4K2>__fI-=~)MS;FY?n5+??8$3svMIe1HmMvP4kuAVdmddTn180 zppj(5vp>P<&=~0{9VR~a8_68Y2-(YMFhYtrMHcN=a2>)wI2g@1)dMl2gjbqcnrQ@j zaWaSr`CwYI)p$kt9%7=G=NwSe5@h0o&Y79i*D9ac32n+JrnUl{`?>S3Tk=Md8{{6P z_?mIo8j2Yt>xw+9$E4fwgHu#HFM5AtwuRkl@PF#L^DptoT@t`=?6pM75&$nszPR@*Y_EwV&ezW%VbuL z03SJNvHQj9LTALWM7mDz?;o!Mxt~dohv#E$vfqtX>WvrmJOaclldasfKV_tnfWoc4 zDb0fZ2c;BsUpiZNLb3-Dk4UVX#J-mcdXRM9^VgFBLL|xJEGvB=;BE*$ioat~XcO-N zC*{4gBmcNhIDtxuFI~b9tZd zlf19?eP-x|UeI+IZ<(z^uU={X`6L&p=%@kk!u~te1b~%2x1&r$kl2cW(Z!tHzGm2G z!p(PPs5`9L259YmzHf^y?X9}Lq699*%kZ-xG6Zg3lZxj6_Zmm4G!d>YEC%N2x{%O( zdL4gne++hY1F{%RPV1Per5+f978U>h>O>nMmQ3a5Zd^Md);)`Lb|+V)eN2_ zw)dTozQ$~CLUk`mc|$?>1nmi2HII78Q*K8bSa-p*JY?hx?_S&FPf2Ov>tz^$wtiFU zWr4&u;RIqjFVpPW2t{C$9~jU&--{*@7=?dR9!YoH@zZ6TycObXE%=Fd)g}P;b+Opx z90Pi8bKcH)jl6LJ0?fql5lYPe1{1ivG=|h)3eRYl9*3#LzfBV*O{6uT%-)$5VxeK) z@&wl+NaT++e%dmGKB?dbD_FqpFv%ouR$)+BOr&s)AvkIxg1PVv{;$c>1*JIGjVRrz~d zqwK5%DuU*fy=#DU<)JiXOhjBEQ-OSfQ874EIws05M2wbieA>V1S|!CxAV)g~@dnIRFYn?C07VWlrVuyZ+nZ*UOj_F*d`V7JL+(%8mK)LeQUHtp! zM^dV1lKGgc{8sP*3sKkH=(xF})7g%hom>BfJ)d_OT4d#V&wUnk$*1!!K7~gM55eo# z)2iPgDJAGhDQr~@?=l+(REN3EruYsX&(BG!jVxn-FBW(lPO)A6ArjT@cyS<$N`>mR z*A+U)|H5GZ>R-Hzq7ZG;buoF`U=$cnA4R*a9`HnMXXe{3x{dM$LaOJtAH|-^i?UDA zpH##>eZvioX19_k2pSPh`vRu8vO(Gj&ws3mj}%2#E|4!3a;QJ`q4^Ril|LwoC85Ne zEJshQvKS>+#gO=_B+NhAp>;%ZvE;GTKP_S&NXks}nw@2PW0*_55;7XI{2ll7+C!x_ z=v8DU7-VPwhqPT{k+I7!*SzsS`)?uMUzq-zu=BS<-(-h5=Caj7MabxC%y_vb6s@l^ zbhuVUmg<67wUrrG9{|n%R74*&(9-<(L+gOj3X-o=oNj&f)|rfRj6z?fKK?55g_xvG zf_Dt539jtn#p||=e|^&bpy|g^z(@n ze6coT5xL_3k2|G*?8W#d0a5#G(cp#HaJlW^GOdwi^9w3j#rkcVt!WL#bVT_INio{mQ6zVz?M^BYuFKK>kM{o81&{1WJExKuF4neO#{Jv7x- z*g>v^@;jjEs=D0~x%DDZ>OR2wMvQ=LzZJcy(0vU2RC-3! zB-{zIiABAdUVGNa?#m{@OjB=&1ci~D3&?z@G0wig1Yzq5ohAZM&eb`1zil8qBDqK~ zmLD2_-c4^D#~qZd27J^UN~AD*I)^vvSB>{nRe|?hOJH4akWpFZn34467eGGR_m$f@ z-KPEbiTAm%3kzr-$2CsAz4Qh2f}#~DppC_}0-YlPs129THIq1nmf-Czq%x@hehdTStJaI<<_+vgpLmr$Rs=~^D=z@ z*x<{UmEl!kDrwzM&;M+axZ$oWUhRv0H#gVk_q5Ef#s(I$i2PE%3uv-b7#(G(%)|k} zt@(4*pEJ&I1wgA4{Pn5+!(Dt}`UgM*v?j9eQ4nbJO7%P6Dxey+IWLVKYNxsHF0@Jl zTH8dJVKeSK@VfgNVTX`}vkwy0`|$W5!1}_B*pPcHx5NFV;pe3LbJ*_mp{09{8%r=C z1Z@G9tR9>t5KEs@-SNBS&)%=S5!P9|4S2m90GSL$bf8UD`vD=a=N5o#-T!>Asi1pJ z5wNDWSv^7M&mS@tC)L0;t1jjT<$p)B)?0=*?};&a9Po?IF2X5BhKwfumox{Sdql;h z`E-atOu%Wl`eh+BCS9q5N6HCMyXZgBwDWs+06T}{EQ}*Xvr{ki>H5C1)96Am zS8K#m6WM(2fuluN-qXF5rz-{lh_;Iez&2QVN8CmqbbZj>px^SN)7Urn;s%^!|B_An z{g_XH-+k-JVy@IX7n5$A#n5bp#8V}p(w*KtY^IUIb~?Bs#4aPbqgMg7>VXRpu*LqW zBcS)(y8Y+G)?gBfRz3m(#UDU{qDGh4Z$q%xlxHgtmEZB00`2z*(Sg3 zBi)zDwJM`T^Z=lKrDj`t*UeAy3 zi^6TxB|K4F@dmY*!;9}y&z){?)a=NuGX+(BEJ$77p9xrk*&SpvZDYD=f7?)s#w-9Q zf~s9=F6Soz99&FMSz%L({1tLd_V-BCZ}jx3u@3-ThF?QD0*F>b8*P;hP(?Zp@JO1N zhrtAZkzI(i)zAmfJj>HjV8Rw17`MGgEdsfYC4oDabfllUCRdWlf0EQ>hV z2Si?dN$g9KM(&}%05vW3);(wLpWy(ywl5HGF?in{Xffkx?m+2N&!u|~cZ-n({x~jT zhn%zJP}L(6-`9Y6`(Q9tbxl+{Uo^hU^Ht8P+@?H%Dx{w0_?ug3s#1&O>*`n7-5{lk0rf=ya3zXV!soNb5n*ZWD}8`RVd$&vK6dx)Vg#iQL-B6_4Kh_^DW9W& zjr23lqCCW;_%5-|0wwaJWsP6-=IkTot_0m0-HT=# z2hWQ5atD|}J`mD)X7CZdc_Ft?mzq_RXqQgSA_;M*Zu^no;8~jSi=V)nsDF136VU%H z=%Y4;3gJEO2O!;NBD!U(%YVleK%^+R5RcS=G(dxb&@+d-Z!Uz)8YOY;sxZM}cdxND zK?%2}fC}_yrN04kJI6I|fTN!|Tir#h-+|s3Bh20hBnr~F=k7poPYPaZH1Efy>%8ZX!M9dozs_VUrTTi_yupg~Q za?wl`^~cSiwlE&jeuyp}vOH5kRbgduIm2z%rMAyClMM|)qRLA#?(qJ#hw8h_s$5T= zKB?3Z3iToQ8z$BtT$6X1+Nhw9f zc;M1gH0a^1>Z40%L#^9+F4nFdAp3a^AxlJ!BnaE#!tTK(g}Amfi^*H?!N-no5^<@DXz@(QJ%f=53D z(CW~dtkOGk&xeeyrhvWx^7{CMUsn`RIENXmb4rB^QSd(|#km(n9PYYAYrftzAouUt zoiH@>)d3G_$W&hJ=l-UT_lL4w6vA}YGPA~9leKiOsXy(3?|gfidbkyC1gVK(ZGv2m zk*e76MyeGvL#*Q8WWs^~5b}~ve73NzStcX3Xq^ml3LWx6=T_gpYe#_QFY2HyE7q;k zbqVVav)l+`wNL%PY=R}}m9_H!W$Cnd_5RnJesl36S(KS?8)rXMg9V|Yl$R?lOGKLF zf;OPrg|>q_I{6?f3ZLa`L4G=f1*iDW>{6lF80Q?^J33nh!hsLkn)IM7)y`-k6;T_# z(;cm2%yP7-3^EW>;_FS=h%%m}cfdZAt*NsPfEexS^76+`tO1z$ekKcq1rO?aQopF^ z3I3hvGDLle6%u4;#MXpYSi)0yPSsovuYPx!8=Ny>adY+F6kVMTxFFG*;i*yd8ZZ&QKV^v;vi?1Mtv~?eT*7bYw$k5 zly&>3A?2k!wvPYKPJ9JgfZzbtkx}AGUo+rXbNQhG=W49Kc@O*zy=wtWu2fb}e{H!e zRWEZg>PzEi-@MQ2KUz@Yy;nCaJULrc%Fh+$f4n@Si$>f0AC}~PHVtEuH%f7;I&}^ znU0Uh)%epv9IyjOmITNom-jXh{+rqPc@2>D)JgC$o-?Pj|9%x!6}+D%o?Eb)Vl#$; z1q?y#d$O^{#p9zrd>ABz7|Pshf{2&wAd&H>g}@ZT$w$6@1IigUPDPSLPn+0GnyWW( zJT05F4VAewr`IMQbn_EWYvC7QZWieRuVtp?)ojaE&i!g%eD{Nk+Xo93VhIGq+XuQ> zCh&I)W&WA09GpLBBI z^Vyx5-#X6m3tGB&GKxF1vCqAP7iAW$#64r}1W_5?(Yjq69=n0PLM%y{=>$b?Mb?|M zDdhCtqM5xP({F@H4%29}vwjB1iqx-VUX|6zElRfS;K*HTRo#B}th4?5^t|gt%1k8! zF2bq;iQP!n6b^s_vh)=iL%HAI zjdQRErnsC!8l4)+XAkJP@fkAB!kH*Mmo=54aw%C*oDbjoX&@$b&ln~KWfD!* zILuC+bB1>Sm@6yn_3RF*y1CIfg&8zWmR{8pH!2eSV!s(P>H&~2;gssAO_{UEt#1iR?8FG! z2o^NiJwnh)W+J*E`Wv@;*-8p1HBMM7*q3s5A5Ztq-gTj3;WF~!I3mKRiHsyBi+*Eu z0H<`!jKI3}5Js~uq>~@5kP+mvOl;ptbhOGlsz zQUW3>At~LR(ka~~AR*EXf}kQu2-4jpo&WuK_4EC`;~nGPaqm%h&VKe@d+oL7nrkk8 zzaEkL{pCpejft9~*`NF>PphM9{lZ!jzk>=;3{*0YIgx_lllxRP#OHc7_a>evQLMKejXl?LdaxOjETykH&Ryk;M0*-CLGo<21Uq(iy? z0Vj~>CCIIN)ABua8RT6`5Sb1JFZJ{Q4Axc>%j zruswjoMeEVOc#}Wk;Fw7m61Y-*j7Q`i+v?EJc90(IkT5snx13!6_8z^Yi3ORF899b zNASSLNSu7|2HT(g{csnxpG@6XwiuRP7Q+}#^m3HGL{|TH%LiPW#YN7HGjxSo&MEGX zk{VfR*Q31|4hO8)-UZ0wAP`OIg+ zDWliuZ7|6N48K>}%~ywxqIVz~Ev7Du>4}Xu0`4I0(1mi`y_JiFEz5#eFNI?#)y>JH zB8}RC>{6-OGu%s`R5_`k+;g4(ggB@F(|g^kls$S!Lb7hVr##{1a(m39qR-H-Eyfs5 z+X(d&8wexs7oZm{AQj0IzsZrRA3wZr(16ctK@4xn3@*yl&gJW_#i6KbEU6uT-^FMQU!T1 z5UHvbS6n*Cy(G)i<)64&eB%laJ@Kg?jN@I4{g&<#xbO;~YuG2thQ#Xl#$NI-K9!}? z-%l|i`(-Dv?Vsc17lv;dfcfIiFU?mz)YWTM9V|&1ATv&Gn)Z_~TuHpbzkBX}RqYpR z)qZ#jIOK}2 z^%z#dTcxw-szcgkK5(>M9$afCEg@|hX(hVumVUT!Fcg?N1X2aT*&T7o1u)mJ4rPiT zBe+$HqE0HXj-Qn&B2zHyMS~_9FaN~&gk^g=j2*cfJN4mfGrbK%?A|~d_eg8&>f>M? zX2!7MAdPI%fAI~kUw9C4$NcM8KYtZ5LqUWhFDVf6>an`GZg-UiOjILzqov z<4XK$Wf%0ZpK+uKcWQ`@@ZVwC*d`V}=BjHEeSm5i>D#a_ zP;kTymLXC1oxo0M^xykC$c|_es+)yJXvNaou;hJq9zVM|k>njBdGTwJFRC{+L7SgZ zFUw|I(xsxzz4oUxLu7ln!bdR7o3w2V=*mNzddlrJ^XcPfksZ_-zjgu zAud)Fo?yx~8^ewlG`UhDR@*mvpyVO&wx={@O}ScgSxuqB?+=PBpDhxkrBw)j9Q{9b zXo5mETW1(5VYf&@kHFgkRuZ+Isj~$f&mO@axQj&$>HQR_q5uPIKT}P7s()4Z;S!K+ zP$7B;_y@iXfdWH_sYStwq6bgur|jYlBBYhW{dn26w{pqDX^GV`$kM+xU6B$S5~9q1*gAfPvuH%hl!{lGuy$o^eOr?6No1H%&LIwlr@J zj@qps{=w4^h%n;$?QFE_H-nNY3a6ylxGAW(|33CeJ)3SG;egStI&SlXnV5IF(V4wc zz>1KJQ90$%@5bO&0+oO7|3?D`YBLj^pE>00(>3Gll$E(N(d;?;4?^E_jF11x-p3$dBz%z; zXmM$opR)dKAxaR_6n(NO4Agu^Jaz;g6oBHPBI<3f5lL z0tl$ISQcU8_vpPhYN6bJ^nV=iS{1;NcfODp0KaMe0wt0)^9xla&lBXdyID5>rcR3l zr1Mxy#YRC??rXs%JKv$&&WYt7jR`YpGPHl09Znfm)2{g_xDl%m++a-=lQ=6f9)=jFs7%3*IN|S0c7K0=u&EFGBuZd zrXBvK?c5@I2X2}BXI0xtq_a8Z4*^T9(Pp}_0A=nXUvn$HnV&iGa!T!2Lxxo3MdTfx z&J53k&u-lRy(%mbelqj2VJJ_&$w$(oYKVnZ!YwanH0bX%WS64$6RDT$*E#@p;{)l+ zbccS{=h|!}n#a39Vv($(=VcC@HQ7Nxk0xM=$PAj=?e>7%yg3ca|m{Bbj6{?e=eeD{Z3Iy_pwi zi#3uIJC7^nN12=<8N%!&%>1yzlChuTYPILBXxNX;!z=}S&}SJg#8fVXZ+3YelUFeB zCj_NN{YAX}R%jn4+35pOxfTUOcHqvYWavj(6C-lx-Rh#$R@2;%*Fyn>#&* zHlwl$P-3)s=tQgRH-wg7CgaorqgbB|{z3%DW4a1OGR-I9e zwe%E#;DPdLPm%x?a!`sazs5O!Q!X#tpCz`zjM;j+n&HCr!DnNe>+5qlHuChaA^{iS zzG>%~s%0bj)&I#@@)P-02WkO<&*n609|H9k(!8-MsCXk%N~)w6uL@_V zuvXLRJ2gqeS(|n^6kHBF!!B5r5cH8`PjpZ>e35d2s~n)pEh$kpcRB}j$+V4+jsFhY zP`EsF{h2xxjmqemWg}6O$~wu#=2W)G#q{f`%3;sKEYaoH^N2$bCzW$juWid|nWGK# z!9$=S!u_BlJh9-jjcW4`V;7pG8}|8pWY)h{U8?}h)vUrE|CN0Oxw7kt`-5&UZ zKP1ZL;QZQ6gBi1ksi=bD-*F`f<@<0iwuaj?qJF&yQ;{(V(kal)WhYZx!3#BC5Hn5Z z(34xWNY>P8d380Luh0VExE+w~a6+eYjDd1I@iPWO#C{y89IX}|%Q~-#$J$s1ShXeO zJ4;H1op}B_uVOZ^48#H^+(q9T$~xL2Rospb1b;rvO7|xzTZb;eD64 zNoa|n^<;hGVxQ-z7^~Gd9HgbQtjh#jr9;g*hKaTs? z3SoSH;eo_F>K~P?({boH-v$)i;ZFQ0&N}v4pA?(B>;Xm*U$F7|kG$kb12#UY)hR&D zS@FI)dfeN63D9H*a6gT_02*l1Aon#dW%cW0xdBK({5Guar~-)~7ikRjKQ^nlHQ&5Ixlp6cSBQzWx$>A&BwbW!7ta z8jt~P02Y3*3X(e0e?(y+AwEEavRV)@_S~1N+bDh4D2pf34cO01I!FuBYXKmyI2H-W zkhNChTrSg&{um>1cK3MALN`a&+iX1kp94x7Zr~HKO+t-7?2c>oapIoQ9sG@O$tqv?qk~o*-TzC|H|NaEvuqDX`CVps?#7*Ba#2z@~)O#$Kbi4jS(I8+`(Yz>C*ji(vp>e?mkM2y_0Mv%?sc;$ZH;51-ZwgS#Z-B zh;JD0SO93Oo!Cx&UK0TKu*c5;%smbM-PO^zU_1fYJ`zdhBfegqr%!;`9nmiw^4DE? zc=O7akcjMUoI7)aVnAPRx~kXmChf&tVXZzj#`MCNs7HMNLPbI-R8;Kz4qWitIBAna zteV}Sq_O zryWhil0bSFZ-AJN&GFYSV0u$fHNc<`5E#W$yPw?Lay&Tzu^z8~8+)JieC7Y4Y6E~_ zCyaMMUr@C6v)#NAB(wUS80}q(-Z{a8P)Sn4;y}P1WIS}N_#2g}PC)m|tB@xeu!NP| z$B{Vh`=9FeTR7xI_eI?L|4YN9tUasxX%c{YuiiiQgYTUzuvf>vf@Gu{SH^{IATr8R zK$LR;tExKhDXH+v^KeLE2SDofAP49gU`5{^+N2L^;=E9T93u4EfzYii_sVdETs6i* zqW9&#LdZKR`v*G3w~lg5SgXy56sVjM051A_3e*LxRw`>$?h$S#kTsEfymit6EOkml zs4M`Z0Bo6Anqi>g8nUb;hswri(iyhNuORAhY;P*XTvl4&Rr1g{j&#r}^+L;O!zjGB>gq?)PwF}LAP`%L02|QAe!Be@;+E~*tT1b&oTxJl%^cGC4X2)hR7-Ly&5}+}HK) z%qKIe?+Smu-C2w8Cw~Tz>gM8HYletEI%S~=v-sPeMR%HZCApQg5!w2v1Pc)NJ~_Up zME{W!&`|pm>8J2wJdzV;EWmqEO~UAP`%}JG#z8pK#{GdIDhf5>SodaK96U0ZX&C`G z#4jZmt^Wl;Qf!+D&X0R}L0fjz|G<6INCI6wEKFVkFNh@T@`GKcGBEbiPsRb4Na5j^QnS?sG9 zO<|onV)0a1z`Tw*7gw1#0_=|}@~8yMh$RlE?>t(9(6yq;XH@jxNgN25>%<)B-yQT` z33`wc)tmxfsIO$uD~+q(wvVEs04MS5K&_c2f`YlXJz;lpP4{JcDPO;dmg+p{>Yj;` z*sAQp^1$B)$tkF&;FX=qYqaiMIkrQ)-v(to^@Im5x_u74t=hU-Gu{{5pN}6k0yXO? zuBNSpMZap@==zUgf)!z6PxKAKYUuc=_tipWC)KLDi7-S0DOf*!CQyvS)(m?_CHqL< zAD39Kp4NHmXVoJil2&{<3J(*#8?#nlJQ6=TaI4@K|LgVOsKe0e1lg;BfXkk^aqBI? z`LhvJ?#8kNA~nk7mGfQ(_kZzFEp=U(2uk74Po*o3$AGQticPc(pt|35^c*>^bFWqU ze0##K!oJW2>B^*6PH>E+Rz9=*LiCRd080fUq03EaP|tU_RC;TK#&EH<1=_Y<~=pUu(LPj6tDnl8hcdYn?C(oj|f#fgaKo7Y_HUnlBGhXQ?F0rLcFp+AnJ@`Uh$j?lP+ zryFa#akIiZaDGSL0ke9W_D&yHNE3B$B&EnO*mke3>j9hZGjl?Fe~%ZT;FOqE)fX2^ zhK z)YVFwt)vf&MW2#H6o%}Zl2Et+W?-j9d5y8-vri97SC&83$yiY`!`R!f=NpQ;ZGNOTa_`Q z9I&c%x)q-`Kw|NA*RWGN*8Ck^_XU}zBtr+K8~Zyh-7Bpai0hSmPdhSVx(PzdHG{m; zLML)#Oiz}7i~1ks0zRWb#5@8F2w0VDl79qLLYH|DU(UG|6uW&ZukL3HLd6LsuK9Ec z;)@^-Cub=Rehl_NgUzvWibnw+vES0ZIIrv^6=aTz-;N;W3hAbP$~d4;pqJ0g94R)Q z0*rm?3*X>Yx!z?~q_Yy6w0L3xyF$ti)L9{Ma3Q~X=0R^5oE3lv1sLo968y!+5bv#( zVt4o39q;F+yutj~k2J&g^Htr*Zb%{uKYX?0>_Dw>AN?piy8FF&I*Gpc)wAiz@&d~- zBFs4ys{#?jqZjUL1SePM&#rWC%Le0EgkfmE{C7T>LIhNf8iVvVv`UoH+^lyI!`BZe z(>}h}N@2q z|D`X*P)pg;{4DbE_`i1lT^s1Q!;s_?2JNh}{ zVN6kxKa!YxL?@0q+td*Dl9=o)qf@;~vVfGE?Tx`-XJ>hFnqzaBHaM{GNJ>_nll0Fi zZY~XNLDQjUxvV6QEG&9O1j(K#t$+E-_WbS9!p&={DfC3jT(n3@ZEaLbsBKB4Q)np= zfBb_r2_PU`Q%q5TI{D`jmlA)$_7NZjzBS0~5edo#tkz)pq*6K*&KPKI3$jF}0Fra3 zEri%Zq~w2*5Qywbv5SQ7B6x;Knoi%&VU<60Zu!p0y`K8QUYYoHZGfQwfMoy@oMYE` z_4Z_{LblarxKvqKfYoODPpv7K8wWzblVG$Kq+kwER2Iu*a$h)Q)F%uF(!f&kYIgIP z4=D#uYAC0Nnl>2qIvg~HI>6|ilmJf0)$}Bi?9VI^_^CofZw!*D#W*aKPu#n|@P`1TTly&8|H}k;Gn-Y6be_&Hk~&^VO6Dyin+_Ppfv9O)ftVJWT%cKJWm0AN}oWB zp1H-Kn8K9xvTeF(Fj(SBK;g|D4dJme4N%D%z8GD-VG#qM_yk$d{oqe6x? zr<;D6#x~Y!;A&d&0-s)5>Py&q1>Jo{0&|=B!&SK(HH>|5%erWz@z~-y0Tp?TfPUNV zv_9NZYkhG;cE;*gH~9~A#wB%MttB6lnUXpbU5K<{oxiJyF8dVoiWT?Cj@4d4dZ6hhIzciRFA=UP@d0@EU9TsN_rPl+^qbL z$7Gg_X)@9}^xgSK>hFOr5P{IPfx}@_0~R^BCoWmsKk|maZFwSM=Y11C+Z40o=wcT* z?;4~7Za07cLwmeBlwiiZBn55rKtBEWum+rIe`>>bbyhD=?nyy|_L<&hUfd3A_W=0s$(opIYf zXOCc8q%Dg}i~J_alYiPbj52^+X7_a`*oyKn=F@9-kG0R*Ha9f zGY2A@e-rgym37;=AB#*JK@D$Cpu%-6brHFVqYVpqY58BTBMpYa)F_<@UZt23q=-tL zr;}{kg4>oje$=w*rk?tw)`so&RrDG;y%Lo)X-9%O+gS2VS-QNb_}9Yd|FCs93bNtq zZ9K}K@Sh3T;q{EKdsG_bL8ij<6|qk^>C};t>pa?ctCvR|glm90wW=w$b@BgMVmgSq z9Z-JEgOMG{A$9y7^SR!OG}`e=$^``?AN>dxQgjbVh@~lQWx}s=tI4L0g7K&}p!zz9 z)>;P2^G8t zKc04Oxd+l153Nz+nbaHr;1vXMR7<_qJCBws#?8&0p8o$ET`3%Cs9RD6>WS2KRZ-O) zzr7y#&KO`ci43_|UPUT@y)&E)L<@Q>>wgF>EYfoj$VC3cF?P^Vp*jReL$?g25YF-g zqFLRidse3mga9Hk%$rsr|Lanb2~UAw409wZG=SomcEAW&gKC7c_U7jT@Q*z>TL9c+ z1Bz%%_WC~;8Qb@e?m$2gVELET*?AqCD<+yto92ORkPPSoR`#ZLiO-bZ6}jf+;!kvtR57})0Rj4FPQ`F1oJ;T0ShCL z%N-beQ4@&5D9MUHIgisTb$5pmw~S)OGP$&1iE0%6!-Q{x>9`A9CxC{bNJr4L2DQ(D z#Dk3ZIUCnU063*Y-VeurZsq^6foyNgxm<;~U;v}eLQ(pk+hyDvcUt>~&C%Uct%3h$ zC^Zw9!VkW2D)3QX82R-OJ)^LV8zAt0ct9{j!sSjYI(2j#_udj{GPSr{zU9v8X;O0j zcRQ&8gDY%ONCa89VgZzuT$fSp$7dspfVZ(BphMQefBWNIE{a`h;E4Mx9$N*-9sQRl zNy!EIDK(Ahl25=~_yxgt{vk&frr7}9)tSOtY?l^5yPxC)*I3C`Wu2l=)X0s0D)d6( zEkJjubUgEM6Bw-naWN^Ffdz=ZL?P-}3`OQ*pk8%KU2JvsHuiu=f1AFxX=dpRZECk6w31SHQIR-5ExJMMsK zTWtWYSknL*;Q~Hxp={v4=Zpw}i1B>Krxp;rVYiSC4}sRlj^x=Aac`!Y*${o+3{>3< z@khbHrer@9X)PX%j{diB2qeff(Epf5pl`#P1gP+^0c>ceS?`N-mvLFRKv9H|;q!$w zsEDHul(3&M5MGx5?`VH00e*e-SqVGvAF6(+ppJ7_9k8~!;ep&C!S9OAuC#!7R~m2)!&eKP;6Jj)gZ4=C-@cnoYQr4!nNRHBY7^_!!q5k{e2U>og#wrBPr z=}{vFz|$w7hfZOok;ZGt1|Tyy1EwcHbMd0>Hz-gXQmQ+vfe?G>`$ga2B-xnx8%b4gGo=cYoZ0 ztN82~c(~d^?TKta!NIlOH7Lz$0QmZJ8$Q@R+UCdLQoaLS%w2#&imD(PR8BSd(fS?F ze?}DJ2cO0&0@n8RWu~bnRZ&kGBAjnyyN+FM?v) zOXYI7o`5g1M9_whYoj>pbJOB;HsiV&IrBASRH>o?hzgM26E*)113>AjfVuF=FCcW# zA1pnk2xV`;|E~ZEjrGD*%hGPE{VS+%(*;vSK!$G$g|J=rpPF$XEU;V?0WRF$QIRT~ z#cf;R8{LgClU$3vxell>$_}*4+pnrOOC^k8R0LOR?=v~i2Prrn{p#|qR0C%UD^^%T1t`h~MVlej0~26^@S24ou? zsl=SiR&#Pb{?XfELUCeG2YN8~T|lnGozNbX12h0k<$DB{fBV~49}=Lvi0gbuxG>M% z40G```5+hFj6Ho}XpWA=u{+T7H1|xsO zoNnjuvc3s4|1LoMK27bhH4kJnmQ{06>);!qa?zU_t!FC~&>`mGH(sDZ-fNb4&Rsv} z525q>PKC`NhZ3a3ew2G{7)>$+YS5CTf)jP7ir2Js9-O5qaeGXBZ@s>{s7v6|mPm_5 zqPu{~?ZA50lB>M&xPGz;j)rO|-uAva7hxKN5>d z@Gh?>E`JOQA#WlP=`wwsA`5NnaL9@XE$_=rhutfwUDJ%Q=`qQdS>OadN%xvL5~ohD z0f%;rRYuErlh5w%6G&NS4lUW6Hn>gWo{&x1PDAC--kJr_#4#+x&r~H8i4cau6AqUl zVs0U51DzYqz#iDJ=9p=h?$@a@l{?bmqDRx9h`FVBBYAbGmB@Vv9K8PT;JrPt1=8Hv zi!o6uFqNq2#6l~U2D7Bh`1T43me2{AUVU)`A;0qPm9L`)4jiXbSjV1s1z)A;Gvp?4 z8yj&ouF)OYB5VjE4Ju9i-rVJrhs}2VQY6R(Q=-sPg6QbF8^L!dk}z@$|2g8smnT=M z!C_f5mJRWCr{%UJ_t{o)V_qFD_XMPR_4 z+=uPBs5oA1M$Pr-t(pbOrCA__XrRd91~;Ym720>T@I9l9CX#r42pjM6!s8YM)oO@_ z%zYH5n%xVam8pHggYYLn_BWf{mcymnN_knoo2J?LzV%#rbUvsV7LDtC3hRZ5e?-AN z0V&1ozBs+P>d<5h*POs)b93~*$H0q=w;0N_#P}{2B=FIYakuaNlD@IavK=XoZ5*s2 zK&FGEUIv1hF9Om*aL$jE>B_B<8~EYX#KD_p>KO9AZb!cn zTzqnbB>&L&*{Ac-p<&*|5}@907(~}cM*yGCp%aD46w^QQ`>+S9+aBgi6Qd!%gV4Nq zMtI>V4qeF790>MGoELNOQ1}5|>MpODqHmxt<-GI>NF}{%1(CG&5yg-&qL_fwpW|UN zlsFFGGwDFO@~rd^VRbx-A@j%Bo@&sl#ZGxjn}>Z+wdZ4UOGdzIjN^#({*ST#m|`Hi zL(gU!jLuJe-j0jd0e9aACzYRakpefthQLN+YG>8O& z87wurZd;)$m8;xjVJxcY7ctUnk~dKYp+i;3Sbz$*$> z-{yX^m+w$*-iyf;d0ptf7#fN{8BiAoGdPvXRS0ESUm(NuFW^<>aFkvecsmy*8Q_~E z#nLB*?B=whXz{Aq^z$MSF>(iC& z&4=Qkj@ZdSJIUUeZemB*YF_IQo(sBX^oW+6co~#uXs-Gfhp@fVDc2-)wC;Z}@@FD))!)f>V$8)9uOn3b0Ap@3LnVq6roBscz=!biCw;{*QKrWyEwc{_ zyYk3rfTpN6;+E|_!lUnK45-zDBphpm0>k)JUT?g$LPLnCc?*;iHIL@}HdI%>_L=zx zqBJ@^fiLXA6^xw>_+x!>@M7;AqT7zps-1(h+@nY68q|D~K_Q|uf(wzJl_Lc0{JUfddq&2Be%YqP6{oO4^#}JI;!PTxu#QFeDpQJt3MgsPdVF#8I#I; zWg{uQT_*W&b4wFVKj8*$B6JJZA9-;X>;9)J!=|K-eQ7hySi5FBSu;w9SA8WKuL!dr zE|$_?o!5gdaLOgHxwz6%T=O(H+fk8n(4R>(&%K$UYacfG;*e$#Z%K1L2u!H-_xo9U zZ=@M82gN<3L$yJ-&`}ABlc$`7y#p8oEIW*3mWVS6;I#K4*TLNUR2D^Grah7C$)r;= zfk>x84bZ0olCZKJx3Fw~J%mLfoeiOhIw4-dq-FiAsOXsGBFMCF#@!^pVVibDPhnAU z`hC8IL)6J>PCkkL<972C+~al>i*#Z8-1A#97!DZzfopgNbbFN{9E4~NqKMafw}}q0 z>-;f@F=(mN`#5Fzu^1F7gv|pmy(IUfxsvr@gdMBqAzb=#rqm%qd9dO}6Ak~mtdWrr zF)N}ASI9QSF3D)eBNW0iMN$(s3$lI<)$cBPqm3f%TvQ&(ccXJh+i^}sz!mMJoL27T zJYN|QYX0u;IdN9~^>{PT6p4Emme%D(tx@(6Eg$2=RxSNISKoQ|8+a>8t`>_qbEaGU zs%-TYxM&w&lzwCF;c;CrxCr>|i=2u5EjcV_vU@iSI`H;Gp}EU2j0mCpLSa&D!tR>w z+r5^~+&8-CJAyVV1w!VR9G8R=G6?iDao0Xy*Lmw*(C{#ia%S%np3}T^L|u?;vBfw$ zRjqVWs-X3~v2_14l)k&vF?|nEEIPXG6cV~xh1SKo-lv~M55!!;RCkNf%l2KH!=*bA zx09TC<$p)UGz2)wB-d;iGV(93onz+B9lfR~)p%4bvR>+%s2LKiyFgm_9=Qn)P8ChO zU^e{Q-N{?k=()kqG<=#x=z<06#f8~0gc;pyUJmNS4!BlPPe@NjAo4<(}w-7*P2&~^-5Nj4jWkr}_T4J)W z?THxa&%50|qlpT7O_PA^8a3zEDFbcsJw6mnrS$vRFAi_%zmB=r9NE={9^oXedUy-# zb1jToH=VxPF9eU8C?<8DlLCk6qwQ=3^?lbnom>C2Bzud`LdQRk@{q{h*?sW_cPA{kUDZ%qj*ThGvl2Mrp zec^7@y0$+ZLfIDD=%i2-Z~kypM-4}45cEi+q7f#)F`u=sh@#FhBA{72 zm&PI#k)hc`$8*)+2o4cH-{Jt4+H0d<6M*E`Jcr!qysbaV-S@Wg0S+044VrEam21TN z=^Hx^GIHG!>3;uawireRrnExBm`WHo)-%-0%G0je!`#Q*ypFkoWH_*r_N*X`dfK^! zHNX02Hj8z}1c|TT;oIZBZzxY5PW`s?8bN0ki@!`;!E3a+qLkqx#-N$BRLn#t<35yr0bPer58(a@WzY?Slbj1)^ zwy3lY+N9=R5ym$|?M6bCCl|jzUmU0y?=0Kt(wF0FhKEljJ~C$+Qs*1fxgLqd$Gg9W z6v&T`r`<<{AP6D;Ohf~qH^h@L4>|2~MVo_q1GA5V|h zj2n%k7|kHrt1e_rVIvfoyMF%381>0wyMw2ZbN6Cg^SoTwLp-?813h?+GUtQn`|eHY z4ROEv`0d}8W>D9-^F$m8pHet`DlxsnKJ=mV1>W7PkFh;6G@61j?A8o~K`(mD5@EJ| z*zLJ^wvy9Wl`;%ipU7=QEQHBzHE1<*#w3|S#F*|aC#=!xhYb=~A4DJqQSUkMD!z_o z4h`kkh>6IlDw+gCfkZ;l&?dq*+ zouzeYx(y+42$|av$Qd!dv8mMK-zp;ZdQh~LI+EgZKg`!r)aWz2;-i^nH`x`_=j5N7 zxxix)uvCl~VL9R_V``|Oa8+8QGs3B!m{s%=4hEf=2WJ|&FH!ItsB_i(f{^WV4Y>;o z87X8TUkF37_Xh(?$012m0>5a6VID?(z&jU=86wbpbn*@{h=^b!jQvWL2_6gmGy(~H zjXgC1GTod9Dv?I+D&?b=BI1v?dlITjpD0@_%0&CWES&PKO#(L=3()4FjHg0vMnDD__%=!L>69pp_bOdY3j5 z)UWu#olU+B=)oj{TZtan8g?%KUj_0IWyh~qB zPx9$96M9E*X$u2O$rSa@h!Sy;vwbA`s#hw2f*YGR%KDtfOn%=NVcVa;s@dZ1Bu4}_ z-*y9XBp_a88#DII|J`LJmVxcez50BCQ(3##ab2_a?oRddfqd{L!yl~;YO}OIV4eR2 z5G?!%3J@1HS9tF4R!%p4c_uT8JPwaBdx=?um%gd<;6tTp%ilNs1>V$+G7B&!v8fwf zi+?GDZ$qK+aNBF5%G=yOn2SCUg_1DH6)Ycv2qXtB#Z3#S_9Z_Wk#)LXwtP9V`y{7w z2wHBF3%s8JP;l`#9&WE%s%JBNQ|BSG3IVrq{pEGVXF5?rtf%TVf^qKBK@i5syT=be z({;+BOm%bmPrP?N?-AJ_$k54B5pQ_-5^UUgZ;f`Bp$g08c;6MWC%7j)d|~P72IQ+wiQZNg~^46lL7*TQc+18y>&!6(aC? z`R~wfP1dSFNc2W-@{^R{#tL$omHFf65@rWWpLwk(`8!_J$L_2LIxj^3YT?PVeslC2 zo({JpE}yNE-;>^ zP{d{U(0kgSUaWa196ReISN4mf|Lw|lA28KnEDd*Zm0fGLnRqLv>RiX_~e#o z74?Jbls1FOr#E+ptDY&$Hm^)a+i%AQ4IEzFO=-?;~Pxzc0Sm6hXaX;JP2+eLJ3iQl7#?G?GTj z2vnSNfVGKZQcJB@$GUR(%z5(7xQ4ZQ2Eoe|`{eCQuz{d?|3C<{4;Sn#%L3cIn0`(n z%;-za>{n^OMJ>jIwfShw8cSE-xm>eXwRNJeWW<5v{*-|1?kwDsryk8i_p{3#VYUyPq za0jegaq;oQm`uls|LxaM-D0Is%oBQUt!yy0i9OTAI&jAX}iW1(Z1^$w>kRz7f_fmh0 zldR&o=hEXBkgo+!DdsKY)|pbvBL1v%<+EPAyFxbU(0n#@TmjyyrQd@vqfa?m;%?Qd zX@Y8&V`Z#rX@ZG>A)u>tS^s@dxNzldC9?u1W7?PWcU6A}8cGJ80WwKP;0%aa2WQqy zI4S!G#bppSc`2?f>re!aPCV-O9;q* zB?+<-+^;`jHVDQDPcl4HZ=jw&;zfTw_9vQwptJ5tBM9re=C~MKoOPb9syhZ8Pz z1YO{`tnmx`o^)cp_cZ=wi+=^7HfiKxOqZ$UVfr9+Y_Oyfej`$o@Eq zPA=T+x~Dq(Qy%-{{%=MtOJy!Iu~UicDjOXE)dlv?SVhcZNGwN{Yhl~nm=i+IWt1sA zvdW-*Otb!pn8S*{)$&-$6=%|-UkH#HshOjt*%msxq8woW{snOVszs(dSuEIY# zcb9_Gg8}pzhy%q#>Q`ThK<8ui*!kX?KWIahukZU%Vj9(|`vpIPkx*D!kxR67va4NA z?UdN`AB9hQ*mftYOw_74gNlEW-3hIObf4DJ-JdVBl=?Fz*q9ZT*BIc^sB3+3j1CLq z#*9w0lBBF`!v!kA?%rk-ymG#597Y@>D#<#!*Y;lpG~K%~Sna+FI4l%pEe+yP<(t>p zXm0tT4?npzR8l@}%q?=Tl6Zhkt{f%q#yfJ`i|Ey7jVZHd@yrjBz#=Jwz$lSF&Y>lA z4li9*4zV)Vr~hX!PXs~lK&^cG>{lK`6Vi$kF)=cSV_mHkvzygu-0+}8G9%*Ipw@%W zVYY3F4z_JnJZm9Rmk*t9E@tCu5SX>!6)L`FZT}hw%koJY&XZU2L;Xp4v@}+(tbcN1 z+lIEM%BK5}jl&>`cERB^0N?C{KDuvWAX!B-md?T9!dWgjuJ=vsI6~?5IdPGS!=$ zx8qU;tV$&^SjMqE`rJ_d^J%9z$VALpxGYV?1{jwB*itr1+}x@O5ZoG!q8jCiv3`pd z%Z|7kKI4=e7ly{3y0sQ05+xV7wwvW0hoY9I9OZe2QdE>7UP87L^Jb!~lF&k09S=(t z^8nCLw!}GU*xh@nG`FrV2F;Z#MIT(B6;T>A=|sIZVD4?Z)I50N5S9S=-i}V`r}OAX zS5@4t54YvBoOT|3kRL7o+Q%o;8vEAD5vaaB_ZY9xtXE6po7^ezLVr1!)Y27<7RtGD zJ2!6G$mdCHPC2K6a+SwUY_5cRy-uCaf!TzRTXjMjkL*FZOJ?#wu+y8nVV#-ki@njw zz_Q=5NG`iSmHr&?Xa6ADLx3YavwJvEa0dYs(8lA|qeHtVq$4=e1dcBPX+>%&Bf@uI zk2Xr=9|OSGvAXr@eKXy~r|8EHTrtU4KZ@8z$d{h=Np#Y+!W@jj(jeKNA8Pp>9d*>r z>M)=d9R40u@ne7g=tlDRY_E<>!S3Gd(y z9=9P2tIrjqQcuJ?Pj<>p9g{L7PwSz(k12s*8e<5E&Dj* zsHNziIArXrlnw$HmT>Xtzt@#;q_B8ng`}%~XH>YVN%6zAB!i_>q1nD;t|uhOqNig9 z4vt^%jY{^l!wH5<}}3?LQiJ6i^U)ora8$K_5$S#u2m+d;VZUfEx_#fso8g~U-BA1L+6VC(#F z^7iE;W2Y!w#m^mY`Ig_48xe4f#2>8UFEK8&85=3%QWPo%aKTIsY@0QnNV!c3Cl=kR z4zfxKzSY+yEg2PuyYhv#>HJ7bn*`Jsi5%`Uh5N#GF&Q6az>Hz)Fg6yLx?GcEEalm6 z^hvZ=9|H)sf9C8-tEc>Ez{hjEUj$F6=+28S?R&E$7Rroa?n~lz{B}!tnGv^wQ@rmVuO=>4Hi1AtCF}7+JbC9T++4TX_HRC}@l{fLhpCfV}-u zsHTnfhl{xBBYGDc;p6om%uQ*Xn}07Yw+Z)1?K@ZeJz1XHG3|X&Rha8jpkW=>aGvB> z5_4dvOi@7OZCSnlJhPhhn6Tsk0vIHN#POJjV0eA|$QtdPRM@9o5#;P{Sy2z)MoxS8 zQn6Jd)1m6oU|}ep$wedtJ|N%jFTAmpFJ$xF^IK9?Pa3(pcs`K$xU^V1h*2fMgHjPA z-@Nag-){*u;((c~46%XFpsP&H$~SE@`Ng7hyBRmlov%W-G>TdVCEra(q%)CFm7pZG zQw&KgiTf$~uhCY&WcT5><#Mwcd$bcg#8qhcUL#L_xZFTUNnJha__>#!4-2!bv2$w1 zpP&>RCbI<0EoYp^j8)bfYc=-ITo#c07B|NSj(4WD`O(j~ViuqJ8QQFb{xB9cN}$K(|#u7%J9cT0Ea*j62=L9+V9{(R%?;TI|`~QzeGRq#xKK9Pu zBjea)B@wdeSjQ-2r)-XyT}DWmg<})hM~<>394jkiE8pv=*ZcRm-F|=edeyl-pV#xc z9@pb>f86i)N6GzZ+}N#AhQft&R>PBVg$T zxi4kIm-(gw&+zrnx5&#h`!fvGHDF7a1g4q~{@(j(Tu{{F`yz5j%E;*tB<9>Gr5c|y z2w&7|Haa2%4bA=VcaI98$!DD;H69CH#;=K^RF+WhAjTo_3?;j*%G%0VNeuYLL~13U zA7P}@m=!G%d`S?^gQ{cUgW67io_jZ;Wh z*;N0jOIcYz<7Inqi}E}DUkYq$9r+TkZQ>#LzBGP-ZO_Os;e?xz;Zw+V78M6LaOn}N zjd=>{HSBl@s+utD2w4k-D4f29R;yvO3b zCL*)e?5(szLRha(G$mg^dZ9AT@##u_8oy20!wSQZqTHYpp75u3NdzXpP;zPAvWy3Q z-@Fr(rEsmuW!1hUgdFA;G0SqufG%y3>I!LO*L*JpXOk+x>;B<1sL&r-X;tkGvT_+Hk%3HEU) zMI4hH#vthplU!;9bAcr<0cq*#wLhVRCU+afIecU*iH_x@x$Sdx(s>qeSLEGX5@Op+ zaRMb?F}1IKm)qv~NT7Gs>#8PIfu<{2`FnBoWH>FqAD1I=%2>u%S$WT_v@`o?*QrF` zXm_Wl`16pI6C*)=wYHX_vRmP@j9bd%j*Q36KfQ4a9Ga!ZI(bs`V?U1=;VoF)=KS~EIq!nnqn5$zIAgc|))PC= zKnY~r95#GF8TJ->NmN+#n~i1I84q>uaaEfM1*|i0s!rad$;fX@o+eF8+h~Ng(zkP- zbVTsOS_Mfa-lV3E7NQ9E%G*=nNZ0JWz+4@Zt<8E?qW^$T#AlTk#8;VCmG)n7(hI;J^)p?8`7#nqW+6YbtN6x}VUF}0$JdK5cD zcKxQZ-}bk6_5l;4L?M3(Mp%r11B(${Ap1#|2-{_uB!Bjvt9+x`jbZiZ;%XD1*Rc5q zqL!K0zD`y%uE_8b@aOtlespnzN_I!a9VP+(EJWzMqV(jNl>9~p-YCBGe6>9zPXE4W z0uxH@&-H^FMNIzo(z`G$$ffKDQC>*RUEP}k@lfqb7&|D?1M$g7H*T3OFJ*Afsne-1 z-HSHi)r9~=loJ>R-G;YJl^mXHb6gdjGII~jHpDz;#y$b7A34YcYLIH(q+eh}6q=TJ zM#jcVgt~0W$$00$=%F41g7BNrqOCdMQ!c&anU$Or-h){~H<+YJ!YUTL?wq>$WM`pU z6o}Dfo*Y$Oy&GvEs_@Qe9fpt19@0ZNWha*nW>l zczZMzHzwPo6#=;5CjDvr+`y~fD18j@(P9v^T#jPR?x7D0RFPJ;D4K(;zb8hYO?ja! z6T1o~6caTLu~(Vp@5ayxSJ+$qLs6kX%pxz23$Bq2#h{a%odRAH3^Tk1xU*{lx<|49 z-g4@CLDUdC z?oJHosig^8+yR@Y5Ta-L#w2=tt7;Y>_g;nByL%E#6+H^M(hC0oK?<;=wVxU~vP3J> zvcKdEz(yUo%{s6do_Vr2WIjV|C3KGvyo5~$F4o1O7|b_719-K6UnMktrW!EKN}EOh z11Al@wqEd_nQ(=W*J82Br$kh#0+l9ZMy}PG(N=?`<`dUIZ)a-;Srd5Zjy(BMUJSZF zU}2R3ZYjDE_MHg(CIHwhCOnFfj)X__8`=AdK$2bp7)=T|?0>MPf?F$R@r>-v*@ynG zN3>L-fwcN5g72l$MP%Vv_4f-YKY@H_z=l(x4lsU_fM=nH_aqc_oUot@r%rmQo_pZI zhE}vyT*5=>ftP4g4e0w!Ry~Liu&C1ot#m#xa?li?^)LGjoSw6o(CsKHsrLPK6Nffi zrZ6CK=m%Xi?!A>^GZN?P1h)(5nhKYpInB^5Dfby31I6Pa*3P??Rtg`=L}sY|wzR>! z9noL|_f_&D@|M8EgY~=B)@rPd6v|dqv@;){lVt!n4*XCp`@X?P7#{CTuL33@O7=mB z5IJ}M{({Z-Nj2;_21Ko!xUCR5yE9bY71aQuN(2KhjZKbB^xZO8@2lg-Vs*THcQeog@EDsW4$!0xJ2=FW?|)|5|W>4S*z1TT!KFCDlxB3!w+`;Op|8W5Z46wTz zpo~}i^;mC%bG2hk7c`flDb+54Q(!rKI2y^sad8@PDA>Ff#If%$fX6zLE#{OE#~`Jz zoi4x&B1(~(umGOjqD_62F_isqViXi#_l*jn*On^G0OB;U%46~GdQ)Rf!NwU}X8NG- zPL%0ypAjB0;|PvKcry!>K9D0t(!J~XE%FP2nHR8Xz6*2`!q3TA(t%J;3&^ImYZdOhVmLD6mUI zO+hJ-{gq3&uVcS~)9oMGK^VZEdct4a_vuhhusXtUNW@7pn^SZU#d1 znQYAl9Yxe7oXvuI*rX`HTR+4|((vCA2*2U)+RU0nj|lADUq22DW<8+OJpZ)X z*Duswg2bX8+Uq-bc^o6XAH)84(*ZVwjMPWH@5kL07qH9%6Ij>BEVt_N38l#=0Qp}x zU-5pG%{5c-M5~`)8P&ne?*dbroWPojW9tZnfB;999qt1XJNEvA*-M(}8@1BT~ z0Y7Bxt~tR9N%F!Yce|nZq#*~0Ah2U5@ZLpHw!|$CihWcK-3lmR-2WMl>+kUY4+-rt z?SPtGFvtWb@;vbjQhw^ulnVMU->O{_Z8-*L{*SNa#eZ9SO;5eYW1n3WGxnDU62nFNl3#Pup^1y8MhJ~w|MW2 zcn|tpOR}8Y+&$JB5NDAnDv17sXhh`Sox4DFfzBj?yDfXcn**EJu;KQa-H?G7!EchJ z&%JjVW~K+)8i?6Di+XT_K5gh(Uo)>xOo_e*?oL_b3HQHi^O^7{LE7uGrT&(hI(U`S zttNwjgN-%U-O$o6Z%oTm7s2Vt)u3xp%N2kuKywOckmK3&kRQpV@D{v0_YGO>RoYHR zc=SyAf%ruTsTan71_rdvvwk;y4HyK{r6;F%8E(ZmVyrx#flFlSY1;a6Ahi0?#U?wy zxE0UmZONiTnZnpL5=fX-t8Umh&m)%h{@PG=)ZIh`HsrgT*l z$=?{G%!MsiqHSvUAW8QL+ppt_mhu|E&Y{pk1183;zz@tCPhC$BHjS!nyElGNR<0Z4 zy|=6k*#CiU_V+Hk-&AK1nAK|0%c5G8;fEm-nc3g~OQ@(G+SONbdBB~M6qi-TlP?e? z6R2JfG-V5r=IelOta>kz1&|1otFW36>~yCYAOMTL%n_KyN$8AZ#uR&o!O%ro>6TJW z!jzk5)f-zZl^5K3O+36O>Ny1th1rBuVL@@$cvY9W3j{bh)xq4aNgt*W$`)|0p1o%# zaLJPL$Q#U(&=G3*j*G-*L4by|Lvq!EnHon;2^j3Kf`u72D$+$-fxdK_77<5Lu<&EW zd9qyV--_rBENuof(JpEtI19Iuf!V>(Gw@Y_#7YDSG<#@z)yHY8Ydlo6?}1!~(?vVU zCH*VI_pB*@{LvrO{?ARq9;DvSdI`-dY8os_E;mRY! zBKgUosPDYC1jI4z#NS%cOupH!kA(+W#-0MTi8QhP+OL>@SrGLsf$gEWlpY!;XnK1Hmn zKj^*7iTyc1qGQ8mEap)R!s>XoxMAQKc)1l|!Ljv6JiY$m5;9lWVL}0e4l&WMV*8-> zG+rtzY~#}(9%itj{efi!cU+T|E~z|&`rrF954(Z!sK_9=)zR$$ufhNgj9GjjsMoF( zIRor!_hh|Nrw8=zvd=)EDBGrpJ^_pvhp%r;K?}Ky#~4QH()pfPE#&NI2Y&SP0lm00 zImmFub~kvi56c>iMZ4yz?FOPlS=)%V9k3l5j}MU$88tO zoCB)o$^<87D(>5UkR)fg!kHw+6{r>czhdzJ6!*6&ia;HqR;4itSQVxT=w1YSnwS+B zp@2=Ci8*tJpQfCNl%yc`P_tb^y~=bEC4huRlk6}_?PlzR~aAgl`) z`IP>enu_v@)Ps*xz=BUNUC@F{%yBRYNIm-jQ-+aM_hzUx@U6lCNnJ8v3P_PhYID4u z7@ts69@y8;5PEkY^#&+GV3Oig_pU5F?F`Bh#nHWUk!SXD;XP5!`K722NOJvLJpSg8 zqz{CvXIyG|V78kOR)c!BZhdZK#0ul-AA;5T$uDfWP9hUiKJkrUKtR@*u); z#(JcZwtU3D8St>l+ED`&{11e=m6tNN6fhr0mdN=xnVV1reQe%??+&q1%0AfN1B&3(&PWpe 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

+yNUs_=A{_%;DU~0d3Np0z- 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
I zruP88 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 diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/contestable.png b/packages/docs-site/src/assets/content/docs/core-concepts/contestable.png new file mode 100644 index 0000000000000000000000000000000000000000..00aebddb7d3d421e97a40f0e960e572c82296918 GIT binary patch literal 866650 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%0DA z_xt<){Qhy(b>)ildcN-GeLvQH6sF)+Ew9EZ$+))H>hAVq{m(Uv-~)gC!^>q5Qck&o zS#hau)Z5NqE$J!0A--%AoHeBA)kpGUIX1TZN~>PNGCB7$?5$$V_)mimhqlrcbYaBX zze4v8#mxk<+}QDzH*hqR+ew<#D|h`~9K*Er>UDL2R`}FqX@m3Fiw0Y{C;Pc6r64;4 zk*uK^4piVGr^Kg65JS@T2l(J|pc2{nUEJy54jn%aVW!)~8oWgy(Ldc-g~r49Z;KRE zPNIc1=bOh%kg@ta9)_j%s)BhJ{b;GHf|F!+d46ONwX0~uIyS$-)u)dB7J zJ&WO;ik+?sP}l|pV%b(4>&55=i-R%YYM8RKH9H1L!SCe>WMB}+l8!R^Do>M;3heQe zP{fXsC~YL!{wLF?+($a-=1!!?$Zwb8Mzj&tVy zQtF38%q&G#m!%UhD7BG=yi|Ki0!w`hc8w&c$7!z|MK6VlRXt|6-k(eJ&P+=Rptok^ zeLKz|v)%#g6qxlO)XN(=hn_J%TV1F5t0D9C-29)Gi09B$y&@4f8dlH^u+OSBAF#(} zwi>S0V|oTMjtNq)Tf<&;9#P|Y^18L1QFvIQyZ-3&x98K7ew`eToQRzl>oS}fMZ#l$ z6b&MkJbc6}Jl|vDq4@Y&tMq75Dx@6&)%ePRUbUId0>Qd)y8O`%~k}D`!tTC6M zxCX{lOZl@0w--P(FsKpb+@U=`5?@ydQ~WoCnT{@*`I%02jewm8c{7UJ-zmNwH)a0@ z4h>3_&p*G(&ETpU8*9U%^CuW7IA}!ft!~=|)v%|8`VIKXONORjA7tmib84BYf0D#N z`lGmy>hXW2ddTc&M3Y|9vp|n&YV%tNuLO*g<;IWEx7H9iNogoIF21cHwTh)Y!{;G< zeBIs;^Ohsd(Xbcx97H_3pL8U%#Nx8*$x@a+2pQezo06}gEz%2n^&a$^q^g+Q)*|&K zvHkvzOyy99xQvVnXdT+nfRLa9le0fE{l)7rcPR;4pHgB0m4Z$aNm zNs4wE82E*RBOedAAE57**1Xo+`=ddTQhe#sn|Cy6-e483y^73WS}=n}-nk&mhwY@! z&dQPH0KAdfEUyyQ7K{C$U}WnR5#rF3s;j8a%viyMuX(-cIv+m`$IqY)WkdC-YckF> zJYe%BnZTSU`lD(8)*Eru#Cac#t@}Z-J3~&%eCBFbuA3mTTrqKOC3ly7s8?zaYE{lU z-ta`WMZ}-zsqfzxhHqe$JMH^XZ|PF6FFXFP0U=nXO`o^04qT?b%X((`u`6ssIm1l4 z8{xhe@f^BJN^Ps}YQ3NauC|Ro7+jqe#yL^hF@7B{j{tu1#hOK1PpOTDd3jrUM9Eo8&}gp;#U zD|XcMV4_WV5-eQpr`UL-nG@R64~XpT%7v@^Sg3I%ZVpVMRn!Ty>LfM9(o2xfJqB^J zl*kw`QBv#unaRHM>6lHhi_UJn`(b_E!Is1X4^q{(k2+E?jc4KRhBonk>N1bYcF=i; z21x0YWJr{9QPl_Q+x>kohWNsfjNQAg7Y)wjW9sBW5G$ zmof(Rwuv$fD{ZtYAE+CYMIFp3x{GQHa!4mUL_NU|(hb;}O?D{bQuCZ23|ratRXd6z z8wCBH|2&o0noKN`0kIm@>dG!Y#idBszZIsUK=(Mt{%+sa3gr1nESTSx#14~%9Z6mn zDw#j1h-`&k5z*ybwGSU6#-iOeV#X3YDY&g3pXohGlG;zQhPZVvO1D+d#9qp%rSmK~ zj$rdO$?~5z=`q*x%Gpt?JGBJqs1g<}U-oFUEzb_RYuz_|U#W>amg9H^vb?)>tZkDH zN}=LL>3)|_7s{|oj0!{4;E zq+5lW=KK5Y(XEn?qWRxoRYy8{DO08YZ{i{7KK<|B(Yt4ySdX%4+AW5~Cb0a7_?@Hv zy04Tx{hwiLS19$H-H)nI+o`c$m}nPJNX@chNf}-U z`sj4qDeFezCzVtT2~|3c4<7xf6XxEBtsHm9{rZ`u*+q$uS8u!Xv~84+Ea1wh zi26(Di0Q?*tRZ_zSGBtFMycgrX9o50%Ifh#Krt?aW>d4?e1Xj$Nvpl5iW#BZ(Bgn` zqBB7e7tGF;yLjWYj&&8`*n3{r=MW9BrDTr;7gdqZJ(QS#YEiTVm2K>2E9TYQlX>Ba zwZP|)L`7PAlDiLg4rR2K=jOuui}#J7z#RhNS&z=FSp&sAu72fDiTFfr_&I2k5=7dB zDP{*?z^Zluz+*MXq5PUFe3s<(Ebgwm?GY8K&;IUu#6Th>+h^zb3x}Mp^a(9wLiZ18JxSy{8 zYsKu9pmLW{e3pwv;DM-GhfoFP@!sLx%6V572gXw7lkuY%$JX1DI@W-E#5^iDOq82r z@tjD3v80dFavqbvLvE$K#zP>gh9yjqk@x!ZM zhU+yCb`G<+)rIsseDVQ-4=sKq~Ea*LHn;T}GR z9cOqLvF^cPiBbj`1pnqb&1iY=Ij{YP>RYm zF<&!;#d45t`vhuT6IJ}8>s(5N7xDso-ofm}jz1U$%q~(fAAVg%lHKL_q|l-DRQ02q zk1&))WwMzM6E2`?S-LZ-4D2u5AYB z;%m|R#b-w^h4#i6(em$H>AlVPcElZn6mz{l6@LYSxR! zX7&1PHOIg6GjcKEh^*SSd#o)Jr`@s+Aw80imez5^vEN}1(WsmdB+<%a! zCRKmwCK;Aoc+h(Gn*%gvO8o#cH(4+LobfUWy8U97*`bM%C3@pyMA_A{gP|4Xeh0mC zFKn!qN*wegb^Cv+;#HlI3orPu`VpZ?rbtw`XnVF=udk$Uv)>fMiYUxv=^vR-kcv-U zq9j2YG7+Rvg}`?@q$9CLdhOx+hcI^7r+?NcpI7@zA=JVx9(0^H?pU2|X$vd>M@Wgg z`c|w|X@AS|@2=dTi?*>kN`Z8$HU!)R8j$TSgNtoRc_CBMAF+u7a>SljJ{hTr9S@xQ*E$~5drZv0Ke#u?mk2`;-)M@tbCVIX z%6C~9vKy()oS8}j?)8RO<`d4l5&tC870N@2aw6Pc;xlyNUzvL^`7Rwxt@qmvLqdR%>g5vC8{= z(K{aj-*-LcMvjI?$PqMlN>0pBTs8pRpvdR0kvg>t7KTN<4)>?Q&dQ_T4`-0nKz&Y#B7xqVqr9=)J;tyquO0u0?^P3@V ziV2xVztz%czuT1wwW+wi_m=F&>9rL=hnRFW>+&ZEmmqkmAlrEW#-;;89iP3cg|Z3e zqq>V!fVOUX;5I5bn`aKt8#W}!o^p}Mk9_}T*m}w5YdMENm0`@CP zI|G7Z=3P6OqM^^A1o0aQ+%wt_4D0zOu88966_G3#m8zBY;l<3!UD{^re$wjHV*9v2 z$ENl|%G_R!&9>TfV{Gl~c^OzwxsB$?I)5}VaKOC%&HH`5)bUzFnGj4*tfO;XWHg`p zuPN<_{T4KHX^oA3qL8qd=wpxl5reL95&>)fFW8AJ?l}6SOffcoya>4|#{$u=Mv_i1 z8rSw;A;=Qa3iotg3c}xoDCN=@n6UTIW_#iGVsIp;vG(fFT9Fe`(x0%LOt|xK8$Rpl zZv45dtNQ#JfipMI2NDu_|Fw4^kJ}lWf9$0>mpVcB4DmlHQTgE2y6<|sUsMoZtNHbb zY8y5nR(Y<@?+@lPHLhC~^}XnuZfT0>m+Iae@r6JvaaZITEYlL*-m=PXV81kcEg0iw z&r82}=8NAsGw{@$aP9ceDtz>qAS9C`5as=MMeD#ON&o({Xc1SK)EJ#7>cKMiom1Z? zg=bVm?}z+rKRia*&vE}BCx?LCiTAAFBK7nL!|i9`GF?eq+7#ZuL*SdTxhH6Da&uoT zBkS!0z#8tX+C10Df?0}HNx1FhyD!FU-z;HzP6DTRj5?m}4JF3jTaPPk4xa*5;x18! z5GJ&cv>h@DhICq_kta{-VXJwKgIp{de_m;clUSis0?N0<)nW!Fb0o9D!g; zLE#F_*Ewyc340w^hSzJ+HtHwK^~BSkVg0$Mx0vL1UNCuw^CJcESACl?@Hod_D!M%D zOTE+20m)C+ZFh*j(yitr;|fZ}aMdPsF4`i8?#xx7LMrl7n~|Ql8VQFoc5pgv_Y8Qm zpUcOO(-?BrW6z}@@RSfObPV^1BevNHne*_z6yy8oksLoVAzHY$e?}QA)<`@Ir&lU zaUKFV-7$Eaci7&9QwUH*9kzK(3ON25fzt1un(w8#ymB#wXzH>_bWdJj19%fEHKxZX`K zvm&E2^MRCHO^Oo~Za#_uK}U(uVBGtyU;Uy!0R7CLk}m+SbI+}#nnH|+5e8GOBDUs< zC)0p@bJi^M?iw#5z|timqM4H?8O|L82n0IGXXI{ioYA-TvNw-q8%A5jWm@4n$xh_% z^JliEW0~LZWI1G2C4AdS!;O!n0QUQeT{>N6zb&@JqAB&xCkfN`vfI=?M;~i5=AUIo z^5#eZ_jrbHRH#DYD#dnV>TdaJn)`m*80_F64|dy3DwzB*o#(#!P-_3FPfwhNp3~Im zF~;@gH~@Nd2%le-H?g*m>i9%MsJ0{!V7QgUllYSjcbW^d2Tl{!m-W{_M({k=U;cA7 z*Cj$*_<$N*lgAE*8uQt4|A&C=vxWrvau>0=Q>OlC7RBa})f|-YrXKp0=&|3I~LLtEjRVzK@c)bKD^)th6XJgK>SW}NYqGdT}+oh&K{x)PG z`Ue8iAlbrKbUkBXYvb63T*q32Z~D4>HZF?^{#CqdD@$m17m@whq-p^BwMs1(19%id zmrq@1hOylV5qaorVWfgz^oxtZXxM6qYg#m)`%RF_VLk54LBX^L+aZ|UNW74`UV#Jsy|o1zA(U)6Pvmw&+$5AddWE`)T-q$wV=o(u6y!ba<0rniM5zPTf$M6dB)gA-} z+)-WgW!I8^wZ>9w=<)kYtowIm8pt4%uDf099xyRl`SfjI!9;!96eAR{KJzJYA}@r* z_Dp-A@q)XL3je9$DL?3~pJPiHVr?i#4ys=%zu-_3jC|xhve@E#W#?YPqVqa*Zn_;m z9KX`y2Tt76&m^k)+Hjcl9!7MN)%!K6l&-!#7HFqNZ6fT&wIwFGDEJ)X&oCQP6O+>9 zruk2W6Ef1~=4~A83bW@vkAl%A`WV+aNpC;*{Tl~F;sOOknPK*VQv*lvk6;qyl$=C& zzJzy_Nt|aIsRw0*BEybMrr#EzdH$CAm`{2NAbpme?E3ebGx-J+JSwjK*2khENV3yN zy8BU&yM*KKmVZR5!Nd=J*MkAv(E#rK$)427%&6#Xy<(cQ*f;%LmM~`5P6{q)Ksy*c zW%<0CT=)#~$`o`>iWBvPJz1mwVQ%n5%k3p7142ro7W)gbOuxHt?ERvxxanvsKYt2= zUgxGo(qD&hZTB%l3??AV#E0S&bgdU3vj{$a)>EF;E$4>PrFpa^VgFNi{=eEiP(p$J zTn)`~o$RWmi*{#lWg+2w-DF^rWaz9X!^3hzx;=Leh=`yYFP}ovB6AO!Y3P%dsE zGxu2bm0qf)O1#N0Ja>-74$KwH!uG*GlA3j2e+TD5R7(&+|D{!gf2-jLJ)h=KzM$(_ zj4__8bwA&Tx}RTW1AsyCj0SOI1}49l0;!6Wu-<3Ct)lkbE~Sm@y?S5@R0a!QNKi0l zmprHEpCZQ3>EkM<;#Jy#jhxnhAJ9%IujmITngr2C05CN)%GC+(&K;$=-9i)3881yB zr^@p3gA!jQs0W9Qg6#fUqL59c?wNE)I9!81>j(zVx;j3z z;^vTqb+&(Bhjj(u0Z0AktzQAAv8Z;X^x`9GmV^S}56MOGjilvWXBEqigRK1VN#nP& zP2WQpD~^#MQ-D0KDab+rtc}rb`lZL8cN8Cs^~dkO;@NI2OsX@#WAGZ)qhs4VN^ZS( zrDn7jnrZfUf%eyj?w0UzpbJ|$G2yi6eB_|~ zpQa=*-q{_AODl%-(|c-=xXR?!zD@#bVw~LUza9S3sJJCQ|1_BXF)w?Kv-(ik@r2az z#5WjVX&mzYJ$rsCPB-rhSzwmqG{i6y{6PgZF1rZl`QV=nZx!}EG{Fx{aC|hn0dZ_^BXM4&bu&F}g1o{82Q{D6F^m4DxDABg2iYjWe4$CzwKB>o> z+R1npXUw8=90_+GkbcwuZAgKu4fD#0+meMoL(Mn{19COblZCYk z`{#x3O=z=&um<`)n`4G9`!wL-7*u<76rw0lfx$_T-Ldo;xQ?J9(xBbenXsA|{-foC0?kvehu z0ZrO3Ilc9duAi!2cTxV}nE;eyo{D(#LfWit6(Q|AkxGQ|M0bExuY(AEreP)!&wMSA z3vf3YvQBbCzn?LaS~{76s8H(k{ff3R;oG)st=`h}{nqEPBBLvaJlluT<)tV9BDvg{ zS%o6^GcvxE#kVH{_=(T~{^)0tbIGCqy4`n(HcG4L!G`0|?&leC(^cu{2MliI=U7x# zJ{u-Ha=o&F03qYw_q0r71ut4gO3WJ6`dt{yZ@fXa)@=Wf1!L#9T@WvEI^PL)5=vdP z)8uIdETS6qL~KpRonk;XsseJLT6;Mr_(hL4#(WAc?EVdQ6HvwW5(|HQ8CLP9UVNI* zKQp}i>n;ewC=fcI#wzRC?X6CgETQXn*}%xL|J6`=&bh4R zI+PCwE1H|f-Sufs*bV+o&`zaMlvCB}*P2*DTlA z`xL4udHdh(Qbw{1v)hfG>xDl)9Dduts zKc)LlXd6jHf~qix(!q;+6`^)Gugm#RN+3(GV!q}?)w`HNEVITg@=;XXJ9n}nbz<8V zOve&-5kFu<<&b&b8^9OW_AgV8OPXcDOrAay15cvmA2Qji0#4qf_;)$dD2T44J_5I# z%|J}m7_)7Ut|0$JVyDY$A1ra~64pPwRh0G5!~7qqvk;l;5HEL7GuoD+GZ1o#{ctAr zg0CFtG1gIi=|@I=ZctA9K5boi;l#Z6`=J*a(x!pobG&EPpC$!GRSVNhvUw-LQe3Y4 z#*PoauYS3Q^>dqiITPVG>@N3HsAqGf568~oU-Cm=8b(m3szOSq-}k)eS$Uiqn#9Xhx$6uR;nB%2PF(Kjm zow7Lg!R7$jQif=sDfb^3jXrd>R&ZriEV~hicSQ|-{uropx=f-UHLn{{2@}=aDk_Ju zjGh{Qm$IHD?eU}h z6-4=x%cZgrInCCGYxR^&ub>4cha`Iik)zEHVoF_};}aLS*T|P_|8S+L>aEm{#IKcn z6*)S~S1tLP^A-X_@j01E*jq{XFAOJ=K4xuuj?H(k&YxD@5;GZS z{y%_+D)O^**U`lZN)FSU$>Y=K4>Ia)PE4L*tkp~}bxEmzSLBn}rmRbtbChxf*#Pe= zg`8HyMdSRtLg!{9J#2KE6_7|qh1X}z!lhk19`uFE2Ep#l)vz>ilk}Xm4DMR8m>(y2 z#Eeu3IN2VP2%FOxxzl!wf?d7FYYqB5${^8RiLtpMK)muWB-k+hn zQL(eWGn~DmWg7pzdw9mRHBSFvO=Nr6LeWBE$EI~Zr(Dt{)*RHluaancd!LGS-bQKx zAEF>?hC0lQAv=k67>*M7QY%C9*S@`j^jfw-i{ydjgv*|Sv;Nnt&`}s-bPN81%@S@SQ%&R2|S|c<*vnY`I?s-3V$5JY3XIHxI+)Lnd zAJ03H_W!#eQiM6Mzwvz)IXEx&^$f%P<|dHAFFA9&b&WX__wvHK#h6aX%!J9dT zrH{ioPd9G>7-si6|M++ZH}YF&Ik zIsfNB$+Wq%Y`$|`NBJt{_g?@YAiMHnlkpG+;_bNVL;^5Ah%7jG(enAW6UE#>nqNgIhR%Qx z>qVA)692|OG>FT#*xu@Ap@)%ZxBXJq11JA;O5bu&{vDyrdJt`vBbzV!h3m%z5LR+1 zX7y(;Q?Pzf+~%Z0>TPStOiCWGyg=6G2Qo8HPB)-+^p0uAoRRBm{Byfs-;y_jLBjcm;b2*lTQ_;v$gxDrg z)M;_9kS<@@M|s|fte2HiJyv#_^x~yRvk7boWT+qYoY;Lr=r9C47oJZ@Eg1rC`f>sM z(CkSN5;5@MA#+rj$PA!250z=VPFM54Xu9~@gPsP#H={SrY~MVzQdG>OoXJoufq*m> zY}=eH(_VYe>7$s$$|-o;t6@SCoc`i}YPW><}HfvO@hc|2o3FG#f@k=v;7@`FXZJd>lwqT)&o#;=rE?#A#Xx^L7 z(@u&10FvJGE(%F!(=VJ_ikWm8#S-reeegndZ7L;7t7~JjtM9+>n{GdSo_qBzZJEL7 zA^q5HFzjuYb{-}u7pWIU+3fG$qm<}Oj+f=ht2sA)xX~(H;o3Km`(vDR115^Tob6`J z)}vBSQTEh;Rcm20Eo)y{nS$K!_Xs6=3N;>a{p%z9wfwnwUW*R8!0DzAEuHBm!&kX*#4f&hHX~4O<8}rO&u$an{(QJnMFC38G#(M>5%_- z&{hRQUfPX|htiJ$GDMpsnk~Ax1Q{~;-Y>%f5pWHE?(w7G%EZEm@7WaC9`j(VabgYeh;Yc0qE$$%6T<5 z{CZLEFV5ATqbKd0_RbASV((EwTMij0sXn8YmqMn z$|rE%lTzw%wX$OQ#B*oF9f#;J#J{z|j-H4z0vCho4iamTvG0_7vmP0TH*@Sa!gx+taL;|G;#5OmO#)8pjl4{ih2#BitpL*t2jM% zxPal{C#$76E%1o7JGik&@yDG93>NBgK*T}b*3tTT}W(Ka(^D|4ZD7!a7^UV{m@?Bv-zk_RJ{sH#1)!gixQAr6Dxd&#pn!y znIBD+N1H%7XMu>^#Y+n)QL*QLZ^SIW$)CM??tM<6bb6j5-DL3F{z3Lz?Mm1bpp95( z++oNiZqGlbswg)0j=GF#!3}sl=ZBN4UA`T6sA&BWsFlfAMQ=POx8vr&H^Y-?>8URXZ(eM@ytPTg= zOMZHPLUYjO?~DnV>ee3qLHij6lwDJ)6(}DmDhN7U zPWk>@V4gx^{JommTBrZ(=v~2cjtz2pc_#NjPiG#AN8c;;(~5ZN7{Y-2?5?-Pbi`c?FJtk6zo~---Zw+x9J64J1zP|n! zq41b|)|(Vq8zM%HE}{rHJbF&!hColvoEzYBTjpyV}vxd;L&6>}@`(&CtzL}S2UmmD+fmh5i3Ho&ATGD1{+{&xDTtN(JmY zP!G3*;f!~7ATwefxxFwipREZ-r-*HmGfv93IY}a7WlPy$^)w~{KV4_#hvm;x?Gk*0 zw#q|HBW?3};lgE;J_<$OWg@tXdyx1yeLlo=-9!2V%GtNE9!O!V+$>&TJCc!3J)gj5 z-4;UPG{9}d>;Ckh9*_``wpZo_`P0!B{k6t!pmnB~U{p}7z)4)FVTgg=RPieBgMcNY z;vk|!ow|}D&;wLvr5h0W-O|x9 z*6R%%F)+pVJXycN0{e%D?byui#y4?Puz0wF5T!|3>iMHPAK>3`??-(CxS*-mAaDV-e~II=yg zdmZ9Z6|I$dwRtXicwA^>;R52*a}QL~CZS%@3wVj5xIJchgy5(;+vj@XvoG4z*EIR{ zQFE+V5A&_t8nx!&8oP-A*T((nWEHO0(x06WS%EcW8uat>+^?NQTw%hBI)RZ&j$7B+ z_8&hvLH3zWkeAULI?46J)HE^S!mhWkyYyLUtmS9g_D7^%YohV=%VkgWp{!Y5G10;C zf>m(7GOvQRV|Ttt3XGmaL4j;$HGw?gBKhs0!G@5#-B0VtKenpwS?Jwc=6hgJ4>Gcz|?5QogAT8 zB$L>ut+LJpKF(g?p4GU+o;Wwf>+Uqd-t``nL~y|TsMf9c{Gkf~&s(wD*PK60?7(+n z?FbWgkB|PQyUfi24g29I6i@b0HSg^%%n}8{&3_y{Uy3v&RMH80D6OScaMLcheTZ2n z=#=G^kT_heo=dLSLeSpnN__Y|%sSuWfsc>k%QU0%v*x*KI&p zXlDQDdQtEYw2$l(9=?XAumm2Pb2aR8Q%4O%Y0g0F~ocQlzz)%bB)9=PYbBA z(vT%>+oz@x{HK^Tkl#6ly@OYdxsPT$Mr6}J_`<)O)a!vlGX}_{1~a=Kh+1y0<&maM2>>p{6$9~mA6vTGz1tsJKu1ZhLkgZ$o?1gaF75c1LcrgkH{bE%1W~uR45LUjuBZp(&EjX#L{#^os2X zmXja6&ANNADsDQ5y>Y%5Ve4aHVu+fqp;lzHXB@g>&YY6=PA#>?>`? zSWPj8R;-J|o3UZTJUOSgp?=MHrVkUeP|lHH$IyV-hGjafT>Ep#9`=mME7@+Ym1b^Js^LjYsrzZ9yXofUK0wk&meoul9dD%0FG ziQP^GnC#H(o=Jk{-lEIb%QxF)@Hk0txWVl9@vLHJpHkz#(UWiyd(p7!Ki6`_ovxQ6 zp6W;h0j=8+vM8mrC7}AvOO<8ZS1?I_Chvg%VFD*s$tXUjo`vv1hV8HrY5E7nlU7cu z8imZz%;P9Gu0WL3reVZ$_9NUr&|p;|~jyUkRK;U{j5DMtoUnJa(Zvj@I*1=HrHRrgO-y};qLlAi&cA6DSF%E>57 z0(jR9K5M=Zjo3*xUMJr^aOv&0)RUr4Z<0-Z)tDa2Jz31YbW;zj**08L^DYr%S2q0l z>upqKXe?}vmNm#jztao9k4`#<0Euwd^NU$U#N~aWs_2509zOcK>k?B|S*izL(EC6y z8@Tcs+wF91gN5}wdQ&X$azvb}Y4^#=vOjSS?sz}>`Ub%J(#j61qu*tmE5^JS+Pygz z%*oVaGEuVjbz59fCD*`&}|X zqKFSD?29Sk{c-*fD06G?VB~~3du0B^l#l}l25))2M{yK4j{(;ESa@as7^fixSF55` zTE$cSPnw3llZ28^aXT42P7B>?T`pgRZ3+5WVWw_6II(14(|;B0GYsU)Dy@FZ8e6&!LRW ziqKcgnlcFusJvtCGWlc&Q<#UgC3e5{`3Oe#VEXBTtn!x6!+)dTZAB72Pu zXcGIz_icbRc0Vm?&zp_KsGe13{r>iyQ7E%V-P4*&VA60$0@fKXrzqR-Y1W4;=BzJxqtKOc{jQtBC3$c?X!p>2Re%EqDsH_hGRklh0 zmGR0294r_0bvuO4r7EV6`hvu|U+m)m$exWi>E5*OoewC3?ZiZsYBQA(2f^zk8&n#K zdX6|Zf5=8PX7*%JC+hvKes>D>99w23Q~=xy?PzY(MxGBppL| zJ|VGW3bI+k1FohO3wWmje{{R>C97^#VTH#80yuJDfDn$EG)wzfZ=I#;)JsbjaKL@}; zV3ky)^dxg66+cK#5uT5p&uq-*xd-K+#j^Or+(uN3JI($$r9sW+UMP2J{N;AKQ7y&L)t0)+IIibOUZ69DL8&X zhS(;+eHWQ3YnCl$=;>}VS?j2c$i{F?pBB)CE~VObba+TNy;yTmxf{RLFt?@etXYr; z$`f=`_t4++P>vvJ(WhXt%x*uB;pndJY4cPIJRK2-&}B)&dm?HzN8`Q$h- zg-){xXGZL;qRB(lAFQV*1?4w{+N!B{-Bzq>p_dR9dZ{WI$eI6d@@HRYzD57_6*PRo zOm#v8qF12uYQ59+7Do#4AF4=UwBG8i!>3fq&+$>dl_0r$F?_sTtVqOg?J4i`r&m6S z_GY+Ey4()Xqql{u0*)((C1Iq$+WieT+Zh5ai(wq6>ly>7f((9(dHZ=Y+UQQcS1IA@ zq*g7lIitA;*Fm4*TU}&>gUpM&Ir+t6okP zdh~rHHSK!w;H}s&3tir_r#Ax+KGGBNqCq-@U+)gaAC^ZdZGKF2P6iVlB&0+=+Jzl= zZj-+7wSPky8*E2V!YUo3OuPJ=|4-!BO5wr5-+*%;*8hz&P_Lb-=TCpeyieQKwEEr^AakMH>>Ah{O_QqXwm&0THvzdDi9^dV zSrW>v%|o<*(}NDiX>pDQ4&`Mx1v1K&tv+jo>OIsUqBE<25wd~PN9>5;|?&at^yWB_1Z;Tqy4O-*RH_O-&jAX>A|W-`iS!iMuT1wkFB zHH;r@Xd{JqWl9d-vemo%=1Omwv-jEcS@X9$JexLuiy=0c^|o$@IDlbdV7FHVI&?rQ z7hN5C%~|O+gaE`q5D!NKCqtflVMl#x&(^3irSnpCj+hNX%42G)KeU`eEF4+(AkxU_PsSq=X}OUZ@cLF~4&! zDS56|XkK~;8M#=~t56xQ(rGJq=?51j!Qz^Hdm+0(hS~nfo=TPa5Yd@0Q7Th<0P^KYa%Oe0 zbX2lnW+Bsswzv&wp8a(JcH|&5+>#p^`4xNrOItXZ@lkorBcJe*%eRy~Dgm@J&#Bm- z&x_Z>;$kfGWtFAMVXpj0do`1(Ril_pSBLlYU(On5npjh3s7rC3wTRfaVn~hm2-+J# zCHD@0RwH-q%p0X}8EnQj>OPgu7d563oBFD~P^Q-H;(eX=;EK{itR|B{EC0UeCtvYP z2!{S2)U%BU+veX4Y)|!2%9#gb=~i448BA848UH=G4`dbTZ?+20)pk4ke%XIoH*N-l z(#$S}u-aDa<_oX;1oZ4w7N!%otyf;aYK;N|66~|nW;K4B$p!?0%rh>bHqIk$&a=)l3b0e3HO z5Z)$6#;YK`Op>Tp3;w^hKs_F?l42`wz~BgiDU?G0!99esqPDd(w3wT zDgtl)WC9zbH-+wYg`aGuNwHl?;{5iW1dm{y#MnNe*wpt3herPMzorw6VM` z!P2^fokZ!y!Xq%=O#{GTf9_(|n-bdc*$1Ik7;`e!)p}q$U%}8XyaD3h5yVd{gJqxl z`@UnUX+S+AV(<{CLSd-(E;&!f+I#-`{O0y|D>(0wy>QYZ!3%^87Bvz(??03jp_Rpg^t#glVurw(Bvzwx%k|$^f(1af_oUs+8TQ<7 zGG!8X<~ny}?YC>*Nw7fW?Xy`u);$pFEH2Y>=Y`H-#N}a&46Rb>v&E5FaZ~lQ`{n1K zR{eCYYJ5PeYrJ{53tE4<`7~(T-^6t|?l{$6)BDhwhuj~I@ebEkoT~z5uBkIQ#@ctU z#hJp)AUFcoT;RZ)pYxen6a<&jD7({JGZ%h#4F0qY)T{g&aU)0+jK$T(% z3~@_NaesRcI0UNZWV{z_iz9Qdb_ZDkFR|VE2K8B3`2ww4V5?MVha_`GBa03BaSZC7o(8#0e`;^oI`|p^K zU#kAdkf-Onk8K1i6YfAE>2KfN6EyctW3Y$G%iwi;YDlnl`qj z$i!|chPI@%lGb`!h_x|eIiTm zEme%Vo|DN2lGRc~HbBMsK$_`WS6;vH92<*W!gfQ5SEULH&aPA_uEQ`%FlgX$?3lo_ z0q}oHt!H%IR>GqvT~r=c%T*2WoBu}2?rYymxAg`2gx2e-ARWSCx{d)YKd9;j(l5Tf zbR&c84~Cr!uNhIgRBa!+@uk48eCE@D zHdb{xr4h5Z-h5fwC3hM5NrF{p#19q=h~Fv;M8_Y;y||muh;n{82NJ+#wq7`LO%Em4 z&#nlaJIkpejbnqHuxp+XowynJKMbtJ7yuddcE1lkG1Y-q9he>`Y(S^SwxQXaLmdH^}eIs4oyLx=EqPQPyW)ND|fxIWlxB?=B zrvuXzVv7cMuUz$R(Rwh_prrTcVL}ed9Ow3r5E(`^4#ObPcPzHQZZnooDnB!ypZrsy zgK)EG9El@z>fJ+xz?N7gXUEK^?nv?&J5%3ea*IV?&}rw5y>FB}n<2K~T#Z||QZmRB zyIar6p=w%#gwbRqyUnY_-^zSP&d)`enT;6YUf_`i+u&5+rxvzj&C~2+}lHC4vg-?vZTE2=8wZugIn6td$y;IkC?({ zin;1ddI_=pB#7*GI)xXL@pH3XE>tw~t?!n6PsJ&vJ4N=9s_|+eHfHB1%A8!g3*t;R z8^q>>EgP>F%S$>1Hx!KAv|kYIcG(E~fT2o%#<~q)e`)3lMbE?k0Zp^{05n}rVtuox zeW!1O)T~Y7`@|7k6;JdC(tiZlD3}ygO}%94V0DLszx3#Vs#w}e-_lKvtS>8*H}{P6 z3FcW7syOdagq~><++(*u2wV7be?BX4_{Btw0QZ6y!>dTwO|M>)Pg-@w z3@;Hsogznyrgxdb#M9k&!n=W(Kc{2w$>ErEzF|@HY){AyGNp!*OACQ)>7Pyjt)(#h zEA4F8W)W}mRvuQ}oU?O)WGg0-!VSs#IgotZ;gbR`nrk1=dh89EjYfF#09+_NynXeU ziEGZwIx5}ch-q^vdE@~+Xz7GkC>Z6l5c%(Zev0$H^TOAjh&ob~?s=as-j^!#PNM}o3#x0e{D8sUs|Btcvj;r~9|HpL{4N+90Eve8z zdmf=EO&@{$C35J2i7(5oeS<-%~VYIE}+%7YuW1Np`l^U+Iahz+pkFuCAjkk<7 zX_s57Xcphkd=u>b50noo>^DA~t*}H6Yf$IvQ_-(VEoOv%`4YM1;l`{a;;Fr=TFX4n znjYILia1~wn6>Z^%eHIiJ{V|VxJ|{bdH#IV1FAeMxMn-}X5gZu`)uaP#X9JA>JmP# zlGcVQFyF-~hFN~5{p?k}%xQsipYB<^aa{F6I0~ zO6c9;M}@T=$i+Z;VDf>kvr*w|Uupf=WM-0Are(PAj&8;% z)1`Kkei@SHJ#PYh%@@#Vw$*|9c^x!iFUYY zfeL$8b;6j9g7O*)uDv8wOqKR5OF-Vo*Xs9B?6jH%6)9a(Ea@X_gm|7d?E{s{4YnyI&MyWFkF58q8)Qu6c1ScnWJl^uUbewEsH}DKMSSh=$ZOTvPkOUkkio9s-r81BHc<2W)&m0I%wU=~+vGloX#+pDD^GAF%^ z?ze8TIJZ{S7K-|}Z0=N~=YC|NUQoGubKqMtY~A|hZt}(k8Qw#MBPg6bVp8WWTJMIL zV0`}p^3jO$VYRlV`ss|P=51@xrFnx2+xNZvDejdgBf5^?1>E5sRjz?x3MHVdQtpgt zWf;vs=LUSZF{}~5XJm}|l?eE$-^>dfq`>bv6<0|P{H_g&bLtPyq8QBmh_a_*q3=#4!g>B4rFmjWwH z_a?=@6`R}8ci%T!{>#2s!^bs^YVfhrWa?am62J|sRf2x1pW9||2!rpCM!*sO%!|Z* z;StgTp2||SfKY$jt!7Rc=vF{JE@o)HJUv!+Tj3fpMN?Hafr2d1H&@jV@I<11Bdx9ukbZ@T9d$;s1IIH-7{|x!OUr{P;O`BmaS24X8H1Hoj5Pju}pJw>&P6Z7b zd*TLF3rGcAv_F*+{k4V0W6~2(>;C+nyK!dZq({UpdN6B`>yVzIJV@zak08(Ja`nKr=r2vIr6_@GbNOs#y=6ACk3CFlGL~o9t%n&F%;?l74?` z&-)919n78xYVV<9IcmW0NrIPsyKN_sm5}lnn|xR=_w&Ej7%h!;fv5!wfwDlzqJ5 zEP0)!=-i$AR~nlYPWb(YU2{+X`P-Qj0x=YsV=t1F!8iJ6FfBqvc4L8fkV0Z-T3#J= z;rz&36oS#}^)I0uhWua&qT@@;Zr#tMq?XdazPJl7?J)qnj_tF>kl5Ri@c=$V$v($n z6NWx2dM9XLxL3suJ_KJ5qEzDGC=psr%%A#ika8cb2MU{qWuVEBWGe)8xW!%_1Lf}t zW{PEFWjnF^PFP(foZ+@U#3&oZofZ`Sdu}Awg%4oqNQ*l|JLvOW{Xxe_FEv748Sruj z<>^-t(g)KxAdy3RuA%>k{(cCAcF=;@U#b0l!}c96icY6n1xY zxW4(L9_2d`2EVnYKAnN3;rpZ=GYK-Rn1nkXIj)(sX{olr#s8}dCnqa+4Uqzwv^%Ir zjA1@IdvS?$3oQ4{?#d^Ltc{aNN&%ArBCIb`qNMA28l|%i*HPDBU>@`)ZGW5xDC*n0 z-R*%8yxyfeN#YFj1XsQMk^~Ywv2F{So>aI=vNF&fh z1DS;c)VQ1JoIie~>p01cIL0YpI48AA*Y!XnaV zO?>)cZ0EGEgV8evfgR)nL-^>99*ipZyp#XXp~Ii{#ge-eu$QTncEx+9bOI<} z$K^oEtiud;179#w#g0!q*2&8tpv)~+csK9ewC}OuB<4*;h&_tURk&?fU&KLvZJeLM zm*o>wzN!z4_m^Y3*7&|rew%(t?8=4OFAFTvc;ruH8G#zs$jI84JdNTb+9sP)g#A*z zf84R!`>?l6iM##X2kQFgEQY$%^^3a~NYB)OVFx~m{=f!FnqDU*G zpj<{6uAs)upMSJY^$A5ik0$4*kgI3O5)uFrpn`Y5VeLx$TXxH8lZa{Cy|v6y`-n8U zgS!9e>l<8qqg?&|WQfv+G1qm7F07coIoxvIX{E53$R&51o|@?(1Fh8Xbk6lUX)>Er z(cYAi8Grbw?+>cz^%D};5F;jZ|2Ytd-}}jGPyyRgWDW!*i2tvP&KTyNbjyT6z?l0; zf86%D;69Wva4v{H07K4J%?v})l(nHmiUxIo5i~T6B4aiTBY7oh*RU<8tcDIQCYl9k zR9xwxQgTcJC9~kXjieWB9;1);$L$rA{0X;cHYq1T4VA+S`p&OSvUU))jL9DAlGmTN z7c8j@i1$lTHsARDjh-CpU=L9l1?l@P88Jx;2l}bsjHgi^lS0A_vi(7vA+TkxcMQMl zkQ5%b=pk%NLpJELt->Th$TYC7T9Y?CMdm~qY8c!TfIkugX8a!xJ&CPI)@`{q^`P0%dXCK zx^PvkHzHtHJ4wUk;Of9aPNbZf4GH>SH%S+|M!`W=kzdrfCoCmDI*#&T77o)?*y7N+ zp#aNV+UNg~SlVxqKqAB12}fK{qp)U9Xe8JJzWfDE@z$ay4pIFgtxXu(Ohzg^7GxUXY+{L;<+QZ$x);+qyh}~2q z+f5AB>=$_uM8Zkoi z<-u&S-%eZ>b_Yn}iJ(rhV-6kxQBlwz9gZqA27=|x@$VYW_Shv&%D;fJnx*uQN)Z&k zjaCJrl$x(s8W+nYGcEcp%4a;~kwo_0qNX8PsIPfstrl6BZM#cUpDo_l7Nh67q5&Oj zfqq81K`qpWK_Z{_oWD$5JA@;CUi+3Cr>W`Rl2s#70Ud`09!Vd0MIs8*Au_oPtn7S$ z=xhx;wXHV-$&V3F`^yFM;ZN}kpI9rDz;@9}?F?P}o^+k8&lz&C=#)xOu;S&~S6{xV z386gnlZvFop~nrDlDqPCsP|U4RJLa7H%pd}WEIPcoTV-+I7vQgAH>Mq0cQ-*tWr)d z)icN~&>56UB5S-gCELLPZobY(7MAyd5!O)^N!eEtMiry+3;{S*y}wwPcNRr}dA}DxBs~C7Y%luJxTHQ;XeCJ-E*@Z(G+vI*z^X ziM;>WRpM?qNnWQYfyqueYLpz=vCpmqJ?VFL#rm1Ed@xbd*gQfzcu1QbY<}jaxI3e*uT+ z7dvJ4F7g6%JbmP@0$Akki4rMSUHONVj=MX(^7eet;<$- zUQj@Yg%w8f3{7_K;}7>(J~ssw^Q?CJAXzWE(!5DAxfL*1@9EgI9@!HY8-UFXvKSu^ zkklbrr<@{0St#7D#wq{LDe{l&HIwQdBcf`v;`YU*w5^*(7ID$`7Gz zvAIpDa>bhW3dmZ(pQ;edlhM=Z>It1DCCAj`{j%Me&L~TgpLq{$bF(uywznknPgMFo zFqo193efvQJhfTcnLo$#nTUZS={ek5VdzO|5sLbu-mQ5g4yY>!1BZBM15Ky!&HAu5 zYF<4?I*wCtg^73w7x^QYXS7Y4%8#SuvAHrQO)Bji9$Dtn@c8X%1hC09H7$|Q>%P9cv`-+g=G4CtJ5 zn1@v)o!$ce&&#&~OMWUCizkqc@+hBp7aOWWe6v^uEWnMv#l_xs|75^~N0Uq= zSd9tG?S){7WE%Q*kd!gBC~NJYK=L=2kkfm`tU7HOxvpw+BEefyNuE_Ttvmwf$nI<2 zXL3w+^Z3S7#TLIVee)EwhHj|NQsI5tdSvn-jw=#SMczGWY9tK*+36o>)O7MES?H>^ zG>fnW(g|+(WkKi$$}9eip#HlWv!saYO=cvKN%qE^$4M~G-5l9fq>bD^i4du2-U2<$ zbb$rZiy>=TakFQnDace|Iw0z|I63NLi^wJ;QB;tBK#geC!5|u5bGNf&s7KSzWBa~e zCzD1r3T@*N{Yc|g(x1Uj8{_Yfo8C@ZQ{!%60mG$xy=1e#1(46;6#Og8Snb^JmdN_- zI>3m%4jPMHGg0Ds+L3i3WPnV|{Eo;P&ofWmok*l5uHzM|pwe5wK=7JG>AF5aE>eA$ z+e*MEBNm)FPs>*%aU%yp^)kV3y)ZT|6rua~K5#nj>fp`| zYC-w9fbq({q4GRT=ru!Z=TZmZHSsPBa3T^t-uf`Nw2VLEwk|IS-FP9dL{eO7@gT9* zePzg6x*lnZ9bA{X1*Z4=FNgIl`hF|R8#>J5&E#v)C(iqk6bwQh0DO%-jdqh5MPF_< zMuBtOVzb8QVn>dzAJcWv3Kq$Cg9aGU(isd`EqU-CmCB_BNmLG|yD1~f5^$Lu(U7_8 z6rENeSHk_Rq!Y{uMhk=mfj#QE01PkiOCai7!=Vk4;m77O4v$Ca&$gOCLh;0Wh!Unm zfSea!V0rKRoj%lmp(fDegNZ=rsiAPk2^exj@~q%8U_nqL6&;J%bE&~H3q-e07~ByQ zCar7=0)p2Wt3@13u{z`vgVhzQfj8-e*Hk51&=wACi?fuYOZ7Aw;>qfUMUl7HPcAQA zB`JHLI`@kfCAxU%k=R!B%GnQ+yL`0Za(R>=`Kjz8NaBun+@O~%(1T3Tv=FxlD()pI z4)cT9PHLny#G4#>gF!$oXt5dU|2s)*8(^jeE0W?DCb>On{aHj>8Dl%$O&8KF*NYIt zGz>0D{>?co%Sy_Q3!xq_f@!=a>Y`L z)=PB^0;=5eY)#bl@;?za3r&4AZz^H9zSv3{xUc=p$?$+8^*qg+@i@@3=~qbYLD+6O zc;X7wT~e8DSL0<$>E+0>m6HuNaG^?M@TnO$)1M|f=jCJrQY4rrh?t-ujR%?=Vu;P7 ze$(Bh^itKN;87B3!*J~h)C0ssVKMt%dT~eB`3hhaAicND;Sjh6j@@7RteeEo;}M72 z^o99JjHrOEBh{6YZwt16E)inbM}Fo23XlY-X(97KSyn)SJx=vYIOa)X35iYura?_% zo0Tr&i?YD+tZEsBA`-qOJ<$9enK^W5N zZPVsub6lVn9GO+guCqTC%&#c08TQ7RM}>s)(Y(1XqeTCe&oZ=uEK7)=&lq;y3OfZEUK&z2Z#|i3Pl9E$qPRngD~;6kXFj-pyG+S)Nuc-3e!Cpb;Xjk>skk9TY2-=jv#E27b$jJH zdK4dVWg;mF>L?!MaEmPVEgP@bvVi5VCqYMi(^~bPIhwINz_n?8D{ug4V{WF1jPxr#Kddc}kaq#) zs%83Y`aFz2LdQ_A_gkAclTTUH5btCaeuXSF;o3Wt0*m3*2VQ$qT1hG479~>Mx@_i_ z~8#ba12h>ySHwM|vc zo-@>w8EDV8*6i^8v4@xJ(l6894Cq5d14k5%DYFCp<$X8EYBK@R?&{@g_$G_ouyYn> zWwmTkoQOz)xpg0DqPKz(#oY94s!(B7K0^1X=`o*GxEeX3T^9igY!}TtLNxWw>wOj? zub&)DH)bNrBL$@!4J>bTGVWe@GD*1*7YWnOa#JtotSKy>cTrkr_-E*x@V$;M@>c(r ze(D$y`9re8JWX%%sF`>fCN9=f*T0Q(Cp(09k+A!$Nt66etikGuMQ&gAj$!t7Aqjxk zs^0nIzIqYZ-hku~*?Wewf>SNBh{gollQLUK;NoG(eNiQr2E6VyD=lIs4togHd6NGU za-vjRZ10pqyk0BAJ^9Xp;gNPpQ)9K74%jq|JD!z_CyI zA(4=PtlZ3w4-p&QGW2H1&E!t|Bf(DKj`v87+~jduF6n#4O7K0s-gkO?59s|JyzIW2 z7WL@l_VA1SzYGEmX8M`i3kWZRt)7Wu- z*V8XS7SJoVQJHN+Iz=FfoE01YM^cTOWv1Z$fqP=lLO4DksW*_rn0Iu+gZp3We& zA;cXG4~NMeG*P^wpm6$w4;?y0ez&0ZhWB@jAqG1^S`A#r)3UDboQ69BbzT2(6uOT2 z_QHw#RJ^zmb7C$WaVGf~#s?t7Gp!Jf*i47NyLZX0$gi7S8rZ1hcVSQ2@JEWznM9}AT*!Ytldxyu5pA{XfVPX1sliBcI< zN)&V+Ugy=wVJMM;XlWE=LU)-8%)d(Or}#JcUiSXHt%DeRhbYSqVy&ldkt0O#RS~0P zuJ^=&%C-~o%DE>++8GS4uvDyT%pE+y&Sb-}3^z8O492*S?MBu?n0prWORAg_+j%cm ziGxq|JxeT^udsp;^2c5g*&qLENNQa`i8MS;d1ZCSDUlr?rT7xpEyxvYi@Vqrb6?3U z$Pjh>zGq;x4Tt6iDmOef9I_zZ}lLnw1Fs zYrnKq?l`Gx+mXJWz{_A~c6XH^ne8$74+*iuG;oWUH*Tzj?#A`)FGw|D3Q9X3247bZ zaJ-2j0g}&_o0;4oVixsHW$B&OS2F~M4x~;o+!h}Vmbq7&J{UzTcx}OY(H^b&_2cFB zW3N<*F8NKFn}_MZkK?m?@Q>~-vTB^=d`Vqz%CcJxI+r+@#s#$9SSr@5{X0O{Aq(E+ zL*qr_ZgT#I2a#%v)jc8Ql(=<|4z4Rm>4Ex{y#60QC8G||_lD)Ke~gI@e)Ev(3cYW^ zt-6OrABMm~ zzES~IKjE$aJ`#{EB03h~o>C7!j;!3#r;yeQ9?7S#yP&P;wPfmJ;v2=1l`T*eIN?w30IdK-x|?1UKZTF}3( zZm$%jvdn`eYVA{!JY1|u&USNa?ZQgC4||_@)nih1^kB?U2KyG?{_?@Zmt-ok-U#Xr zR}!g0?!&X@)d@1hB|zper)j?*gM7&|xAkN;6w+y>tZoh*_$rNoi^;N(VfA6|+C>x> ztS=4X{{GGF@IN3)-UC=RJYyVOFMsi(VC4178%QS%@vUgOH$Mz~e)e4`%SINPfypT- zo^@u}x2`O5&;tFu?VkmGl_U;`D#P94pZE8jc<0ThL27r|g0iGR(6_#+eQp^cN?PYu zOH`Oz%|2sNsE<8{#7PZ)hm@rj3nL5)(YYK7?b?t3kwjJ{?k_c`S4J3aPm=mXh%2jO zMNCKmh4#BRs*Pt^u-ukcxhEgU<}P99Ux@@|y9?NuWo~(pg*wNSn+dW=AI>gFAKGrR z8${{t^#{1CrwvKk%qF1@Q0oYd$9b=L8=gH1En7SnyKc+h7M4yVua<)H7DL<#>oANn zDy*7#JQFi@bhZE44$ziHigS->HYpQJlq2)A*cLTG&jf?NZ+Jvr6V{m;3YKBwi+`TK zIjR@%B=|`4%gBAy;xX+!&Vv-#Dim#Ao8nQs!46}t#F!ES!8%r4Q>4Civb59K@|<&- zZHSvv=_EQRcG`1&%3wn^i?MGbU9#Vvz{>P7CDMCYz7TY~U}cVbKm zu4n#ry5}Lv$^*b1?X`aAsV@pK&>aRoA$EzUc~gA#b4-@2o@~D}D<>}vQcdT^I6O+W}g$$SObST43cp17MqI|lWI@INSovSY9=0qh} zP2B#YB*ALgi3MalKRTs4k^ng*-kL5fsC?oa*h^DSu;Tg0hW2gB73r3vr5k60&ARiqfa}j!vlJb+*taW%xS0PS4FWe(0t2sTPhFL0T zsHsTIvRwHrJ>_PT_qPi!9eLm!M!L-!2>i)0rn~%W6WuW%#>y#~k{)s22cVd6W7yM$n2d*(WJJx?fb|KFf>x6ClzUF|4k9xQYG> zyVdvKUS30aQKi`Pvj<+h+G&Z+iqLL`A7~x(!Z(%Vo0PhnCE&AszFFd?U$`4)hP$>+ zx;YS>2G|U8gN#NzV;%iFVy()$DxcyASzXJ|M1-mvfxJ!}x+}lhVLV~3nCEh&}j#Z+V3x?`?sp|NmfIp&nDYDb1e zNPO#p0FID&q;YjrhEN%!n}0sL%M;fqsefrQeK`|{&+DmtQkvN|Dbd&4u3OS5Z2eUY zKUK>4R17!SRN|mmx$S}i(tk4Y#`G)o%{Bk8wXS~xO&jIEKP9pMd0n)pS6@c0Q2e?H zN3;`C8GH#W<$X5J&gq-?H5I=c`r z-)^!vm=;w50db=HO2@znOpHtHW_judLYfoNPzUrA2>09F5PgPch|OFua7Hjl)udYMU2^3+FUK@VR2^ zl_;zKq}LNSnY9wrX6t3*t}YWUTQNZ>#D(XpH)p*?*c-={Y$oy&6bD)R;@mwMiYIC; zGb^~t?t5O^`PJyF@XLSG;iw^`S&-lRbLZUm{*(Vi6*abKYk#K?(!HWu0=pL9<<9p}Xrf%;$o`+ks}IM6zt8=`Sd9z?o_)vhpOhDaHbD9wkQcq zXOIkos4m5dAA(;Hg{7rW|IrwB zJEtgeE7WY}`I=K9MN#@E$LeGL4g&JksV2?cipBEDP94AfMCXOLiM=Cr{As0n)fw5N zdlyDAmln?TsfcWIRqU?M3+Yz$SscYBW<(1yjL)P6S;z;L^@x{o4SgP-bG*!ozz zPp?-nnGR}Q<%r&ip~8!4$VNdf0vXP>f82O-y{J6E{6Zw6YPx3So!b@2vAlYJj&^rB zV52r>B|2Sd>00k9n__q&a>ZWN*5~NnbHWksBlcVvPzPqdGD4+b=_;zTa498|Jx<^Rjg&Na<%uCmE$s>Fu22C* zS*iL_F@3fuT%*a7P*3rEZ?&m!qO*zZqxt!Y-qlH0L)+I?X%D61vTMdlpbj|x*JBWR zPz$M$d!&Q(Z{c#6(_$0SF#4P^?eW(Hqps2GHe&nX0i!WN%DcS*0xz=4dmy&(!VuLJiZn0429zke6_30bA&0d{Y>|vK1tn-Jz6s$9C>Pz{)2BzF zdwzk*8~%p*Z0ryE~y($w97cZzMR&u*KllC&t~& z0XR9z$2Ko|cS|+3|Ge|Si=Ni{H|^l``9xJrvr4KrET+$PTFPo>XLd{l)KuU*w&Amu zK6_>TL3ztt>e|))6lMJW+nLV~ZqmR#@-8PpB2+ERRxB0< z9YkKwYPK44!Q8%_&+P$UUf8g?IwqLtuez6f)l(DBeHRIXE}dqjFlM+w86kTUevN4h zILDr;SyA`Cnh$s0&7{uv{Qz$iQI@wfCyZKW ziMe|~T%B9um22Bar2s}WcWNDgbx0Wgt%5WBG!59z*R~fz1zXJ2+?bb7lJh$1;^DN~ zL~ujWj8KqL2{yFNjDD!p2RGf3YsQl-TQbk2y++9ePR}%Ek8Uz&G#&VWWi3GiAL-6+ zJ5Ke5#eVBANJ$-EvJUx7`DMCk8)r|N<#SETE{sBA>7Ut#L;&0p{xCU~o$3V0&BD_Q zQ)}R%T03@B)`*OS3qRye9!?k9+}5@wD>9f zt>fnd$%@lZ*c%#)~GIt&p1;A zf|{5fCUe-3b5U_j^(KyBRBBsL;hfkCj@Jy?Kv-% zu5|ggg11>?$&s&k|5{H}%(vmZl^DlM;O({*g1miXyRb^d0uvyYtsksjt!R~th7eQ zd}FzUX`3nps!aJr4`+oS0hk$>rrf4gLZwORnA{7yFZyLH@i2hIh=1;p#x9S#_(Ai_ zv?v1C9w+m&4qe-P%2zVlz`p>RH3{S9Itxp?!sWl^?UF5{I3$xN7#T1}R8^kwfGY8o z9a3+))|p=>dX}F(Z>X5_NN&Zm7;!F?&r3U2A5Z4I)Lazko2uQeR(;YqSBrw`@$nKf z^xxEp*Yi<9BGkX(ijUgTSJw^}{mO@ohjCgW;ia7L+O0 zu*fPNL0?RQNsiy94wh=7YgL{GPFR31rcNgmZqe6L5$&W%@N~GeT&~@EYQ(cycd@X> z@{xU3S!Rc)v5Zi4%C`{!S4z6}A-Y@13X*F+{!0cp_Jp3f<J;ib#E9HeHI{J7Drn;?`_SGAYxF|0Eaq522U{_mQ4_Z$j zF}($rLr>~qf9egwo20hBmgDHD5U3-&l=YqM@c`JoP|VJ*|-^woodda3rlZbZ6{ ziqu-&b_Mezr*{*1na`Ubx%}@K6mB@bwUomT;?=3%jWOY08nT@ zS?4X8c1d*zxY!8{!PtE`-uh5-oo-oMEf3*Zr={PY7xhDUvz5#xjzf)8E?>&oly5P{ zJ>Ig=EQoUR=B08-JcmD?U&lms(Au99ZmnPCYQ$S|#A*~x5UxSa%nDGjPgKohIrRk* zhDQL8SyD}?B;hh#_=gPUz5O*ZbyRKx7A*Y-l3MC1O@PUYZFsSk}x=D z#l#r#rJ+Vni?Xf-xjDI&&bjW2={Q0_n_va=FF@bCehebf)`#HcDm$X*mG;u=Bl)(@CA-28mtU8%=I=C-G6xqf%{K+ z(o@O^LDQJ$P+wW9dYSuDxj{myt?G1Y^sv(|p&oZT+#w9!M8jFl%WEz2TSwQ$(Z}Nt z3k0kE<2-Ts$rCa)mWg_AdgZfm4s(yiB;|_?yt+es3z@(NewO??_uu>x4vjjfZ4oS(2oB z$BUKj3K8|5!qV(;_wa)H%DGOrWrM!T>J<3iNLM|kSHSjZ;BuII8{Tp%5rZehrr<`- zI(Pucw|oSzNd^EbhjAc3O3c)$hjASVLKg+#?7%oudk0~k2f*_UTF zi^-KdE^wtFfz7F$M{x3)>B8ZnkB6Umr1wW{wne7x#=>0TzFxrR{7@qK%^Pk!AE}@t z*9MWRS9rmXJCcr;MkQ4XqO6l#Z&iRp7&(c6+KV^)eVa>o=s8R3N&lxBWlzQAlDp+9 zeRp~|Zqlf1rK@5at*S_N8-P@FHw%Xh`+m;CsZX4T9xH(tT~>+v-j>_6-pdjJ;eMHX z7NBBVDaE8Z=EvG1!%b_(gzfPGQBJYUq7Jd*WfO$nZOlDWC#;*!FAnU}{L>yI^U783 zhyw_9DNXsV{@?Xb!i$|HrK7=BTiD|=k-E^pLB5TRgxEHTK}LU}8)x%#Gf`V=e_q=& zez3n?aUx2Dd|U6I{lro+acB1P`H#zVZMn*Jf3m5q;S$$ydXPOP5XYHlpNOPm#6rc! zvVvpqtJfMNLM5Ur15QjtigaTq+(q7>gUj@J0NVA+s=L@W(p{)t;oi~0vxRtKGN<1h zhu_A~BZe_)__+0gKV;qVnyb0_sf#s&KKe{J2~v@JTA)%PgkCLbFAMoZF6wSBkd%~V zqU>GNlsTzE@$l3p3y@SG44a`pIAKu0fA5(DGuyRE$SbLrO&GdEC|?U9w`Q~F{X`a{ z_R@JTNL2RBb$jr1T4D%l7|4^QR5){iE1KZ3+QQV6WpTyv@|YvR*P+Y*Tpcj2eY=50 z=s~|lRt%?6y9CaJ-=%ifV!)f$i(WW9q(iT`JGz&F#q@Q^JDyPn4B(qmvG_RyRGqOJ zu2%hCBi?b$^7)Dak}3 z3R=;MTDI2yn6!7pd#Ix=pGuVoUB3#w!A0;ZXk&EqPX`9GYnr8A=lWaKM8t{cQU_{b zV%>3M@FnizwU0=O{4^EIT_;Oka9~8KD9T>rnKWKM+H_l~2Y08f#oxR0Z>4=R@qu(f3V@7Z*8okgvq4`Zx?^^IFjLyItoSU5B3`O-k%}U{1_&F_8vZj+=Mbgc zfqsRV+;cJSw~<^lgf#b{Kv()}SciPg5gt8^qP+Iy&o&sBLk^Jv<2)Qd!$2Sh4oWU5HFoy6oH*BECsQ1w_Kt)Z2G*qgo)HW1V@#V8PxMVEGYcaw*y2f z5NT7a3SDh_cn#W(cJwa*78TgKX1LOGX50UY!{$zHGN8g9TIG0kKh}zRrmkq;(jDW? zE=@*I9*%;0hBiO{-@gu`SNQvo{L+6ngZ%fM2pZS(OI;cmLCgrs`&NK-PHJe{5ZjsJ zE%brcm^Z)u6dJKAo(@)!+Xf+Z$APWq3apY1&dm6~n1Px}pnp-^BbKh}U^a45a6d0l z&BBR!-QA5TIY|ap0ROI?u6&`neQykE^K<{7XQKI#BEqYtGmN9RU^kIFG5GS4O(U736SQm{ zy^O$sY#!F;Uw4^Y%*x--Egi^|mfR4EjZ+Rn_fYlL+#OYmg&216?LL;5Nu}D|q=!-48JIZq+aP3-=`OE8r1Hu!* zo)F5zSRzbE$z&dMXE)};7z`^wf;n7@)=csLR^>B%n>S1p#&4(i%)HzlxmV#C{ih{u zD+eTlP~nd8fj%EA1kekH=&UpX?6&b}LnZ)6XwP*u2ec=_{O%8{I%e* z9M3Fqgr<^QHyF`#`pZiO~6OhmxB~O5jo<<$aOb@(zCRbV6hwR{tZP ztcboGzbs5_p&=jh8CsB?1NpBj{`nl4Y|zGG4D&e8ZGoP*n?3+waXYg$}d6s-@~_acEH!ikbw7cCqao9$F8ll|<&}KWNG?d^u>a_-i0s zWZn%XAEy6?Z5oY=Pk!+1gY4K*_qWXYaTheC-yY(hb1lO?F-8!6SMsz6@77Gyb|XV! zKf(Q7oz6@cn`ht-5UI>wYx8%IG_^ZGH6Nt-I_5ZFS_?Q=jR+Va)6u*%ztz9bD^|1< zuKD*w6Pz&NMfC!q0aODu?n(IqkR-eJa0u=hXpI_~_5X9Lk6TETaI1Fyx8c9t8UHfc z)7>sTieqtlUrqWe|D&gXkREF2DMs2?x(q2R=b(lMRSPe}DOMO85@QJPa&+~wFiX7= z!e|EqASJ%a&!jU3TiZKI`U>b9y0hWkB0puVmF_@{<)lV@9f z$sa(#O)oaLkZgv8QT}g8NjV{?zmh%<4YaMoCptT=j46r`pvp#=`FuH1ti9rTLcezq`sPeX$wAG9fHJo_2L&~l7L8D=Qb8a0I9U#(8hq^ zNu;jLXV=I4oxcMk-IbBFS#~6yS%+sW48n>>hT#MoPYgzC3J+HKXgt++hbfGGa=4w< z;n&YSOJI64wT&Iu?4O;GU8wA^ICOz`o`u=vTDNWXZ(&34ZfJn}1UO&TfDGQu?Dia{ z-If8Rnfn1=PyzwHj!g3iJy_H0*1)VIoP6=`Um_MBj6X;{k^d;jf-T75M#NNQa*qcD zx3n3iaH?wiLS>3XCq-G1o=3>XGoZQEf_7pIl^ix1EAA=c-Ykz?6qnw#%Ks=usIndG z_qqlFj0Wab)jygP5p0ih=$Fp4Z%VkRM(m`KD)Z7g=c4-Y=~d5m!+IE4tf2hT=!^yo z-%izjVHDp60~h3rV8~P=45QDCXjuDIuSlemZ8@;47cp%J>ip(C*wJO zb7|hO>EcqpCTEXlhe^l0`9KDjYxI{YR2U2yTF6MqQmki2&vnPZLAk(Sz!BYRZ{0eK zoU8ASOh{L}Wih(>l6H3=pxI5>`o6Wds1>gLGke!(R;B``Uk>Sd7+el!eubEz-jDeg zXGTA#A4$%e=*>76IbKF-l&u)z%v^`yh;{2z%4xLLzCnuS>lnHzhDS;BtG#1uhpk}y@A_V$!Z2W&vu%)f7E!%spS%H1$#`lPSpq)_1q$IX! zRYTgLVmljuvNxp3UcsQahwKu6e*ayY{=47Qs)XuY+Ei6(X3V9-`HxqGFhHSc$!7G4 zNthpSdF}TI*XYpJ8sTkt4&Tv7TWe}+>1vU=w@~M)t#zPRtcA+NEt`aI`+rxzR+s3? zc%kZ3`NwK9zhXGyI}EJwa?+gw$+`UC49kb-e^jXg$JET8dQ|4QKg%stHRMMVYHz5}Pdk6=dPuUDKIqBIcbtDzNa_!hr z61Ll>2F=TF+UQ)pe`Bg_w>r1{-}zvi7n}SPA3A6Y(2%+~745s$74W>{%KDgYtk-VQ zC5PxqQN=?ikIouRN5y;#-(1S6_Vf zo~^4|O52Jn^EkjL9zh(aU^$;}&MPpGkL`!uYZx|f{Rswi!2v@HsoLqv!2k|^5YWICX^=v<=~t#`WIj_c2d1|` zpjw*-G@MyEB*k8X&hE%L@JyJ$Il2_Qr=L%IK9An_$=mM_u$^L+75*RZIVuAD+-n5p zTwx6F4K6dAib*Ps*g5WahPUIbk)?-p^Y^b47%RNzY_lRRccM~_bSfJhjQoM#PIqz}k&+wBmqvQ?tf{075~CyCXK(j!UVgSPH`|Gc|=+0OX) zEEIz2z$dz>yRd^xLGH`!?U%{N0a25?HG=!UTVKx`i8sz*J#F6QR=G0cV`E1NQ1Zh1gIt^ zRGLM$8F&r#G|_As_2suKG0`qTp~Rk-Czx%!Y*J4f+IC#o-mx{(60=gdhgc* zF!QegQ!v3uykHVQ@TAISk1$t3YF$spq@%*>Pud&Mp~m`bvO~}zn0)-<^2vWFg%#fW ze&C&1Y~;8CkyjC-QDNu*T&Po_63E^l**ME>v+g2Bc$difWFj{*-+q~NqXfa2tSkW!4u%6@dAA_JF&L=Cah9D0;`~@RwhFoCfN{cfnXR-|yR5zroldxo6`S z7GKecBu(s6%LO=ho@w2%0oEQR)~bCB{wPWr)4Dg$20{$BuM4~oU%whgNSuBDssC&k zgc%_aphKlrue?m$_VVzpf9U};>KSey>D>7a28BNhMoNVpPc2;VkO}4h_}J1{s+j<2 zZ8SQ~xYc98F723EujYtmSmcOD3Tsm5q~lm-tdm#tI4^+qQ2way_+`q%HC5#Z*u6Xo zNEvqqe6hW##}+g0#(eS${NaP;z3$5ias0_5(qYqcY>vg+Qs9EU22zg!t zUO~8*V#LvC@Li_to#YF1ihBAt7nvwf{#318zRPt*`JucUg7l6qE>Pmz#XF=u!nTH} zTIZT)E0TCN4qdA@sKR>nmg@hoK?$vxOuy8&t9%r=v5~8RFv4gD_|kf}DRdh<5e3V@ zC4s^VMAY=fe4AFL^Cvi9fBlWt=(=Lu4L&Smz;atEOMs|FYsR_YEu*ZzdUG0Isr-#% za_P;{k8<1KK;#c|EvnvMY!?Hf_mEdmd8uxfu-C%OgdCZ9xiQ$u*rZR2?)>@`>-NOELrno{&cDYJ5*<1sVjJ17?gVU$>ab4Z+TM3d4I)@=xm&20vw&DqW6UpsdO7l zvSR{8X%{&5xui5AU7m>w_iN7n|nr+Vvk5Z<@!%zt!ROXE*P0?Y|NH|g3FeEW#j*$EH2YUpC5nx zAHuBCIe=(fE_lmwB;FN}_XOgFA8f%cGPu+}mw$Ke2n_=(J6wvtF_5Q+GU4y1!Faaq-`M`39G&efUpXwT+r^X_Ch;rM3i0Zx+;n&qmfp$C8(mVNy2Y5%->!Ox63>VdQh$KjeouY^<^39mXem!6<%*8HWDe)749_ zkhw=MAVMy4k1b9na<4}TI&)>})GdP^$r>rRX|#}fyJ^pReeTsmllq*qC3-UC<4fzI zYISe6xxCgjl~272Yb1VqP$VMdMnd55^z&`xrJ^P2GDcE9zx-2_Xhy%R@gIWR;CTTY zNUvNneh>|*$1Xo-^&A~$O6nbt5g?(4cH#bCsba748fs1_0fkH{_T>9gnP{&6gw}IV z5hXga|7$7`BD6T6{gw3{0-?&N=jZ1=)czk`*Bwvw z|NXP~C>cdYB}G;xD_r`B$VgU3Rzvp6UN@0Xg%&D8LsmwFi)^7JGLpTL?7i3Tywtso z@8{QF_i?-KeZSUuo%1};^E`TU_x|HQ$BBm~*k3F-r|Xl!9?1uYYyCQ4-Ww;J7`a6- z*x8C2;e!l}pDqxlQ3p(8jE*rk6JchsQm|_^7vx4NTtGA8#|JTr*x8Q57msYbtRC2l zfAg=O-+w>^G+*uxi8?M$_FkyF(g;TY5|9`Hst%m8RFzQaKZlKGetB@#wvfxK8pPdqj+C@n!Blp@&p1_cy2V z3}GsX?qv{_<=w*1LEJ^`DC@YDPzg*s{^y1n87EIu#HbQ}ZJBwp)vNfQL--F6K1s>Q zcH7^}p2XaFD>jEYal6AY^NQe{F}*$PLOr-UkKXUb#D)3)tH(u8LHKq_YPc+jWt}Q? zkKoq>BhM{O@m7JbRk($*qaBTFb#I=B|F1V*Z;Nb6=V!k)UU+#XL0zzYptt;bq)dw% zADFa8%Mk&n9DUAr4zAKeMTC_z-gi63%k^x_l}P-^2|ovil%CaLBdeT3f8n>0;cY$) z8cMN2_d&q04sI9Sc_Z=1uySh8Qqu{8f*0R4iA-=K_1I=X{MMrZ;~3}b@G6i(r4j$V zySO*wVb*W4J`x=NF`bDgx!2CxdltV?IKK}QCx}j67@O!*!Ih@(Cuk(>UMEh&FEJ}? zyzz!U(&mJ7$4!B@`Sm{LlfR7$KfO@R&E&A*T>o7Mf7SgqH1zphdqu7cH)R&SDw~qK z45+`)zY_BPm_lON*_V3tbA&-QQ|tFWGdQq>9}DSD-k$YK&-R8BoZI?XjO+LiMez!g zbIkuvGv*3fxn^TtRwCjte$&AIbtRC`{&~W|{{OixiJa>my)z=1p?VB>06)CW9}k4N zgPEsby?IFaufY%=mvot#P0UKW^%$@q{92tmT@*lME+nUD8{0pyQtbbD>k!;OIDd|; zw3$NN{`b4SYhg#%G-8Y0hG^t-2?yfW6ztygN9~n+sd+GQ@nku`5Y8NHhl;)TF(WUS zKwRqb>$z~uJ+f189?_;r;kO1W4IF|ZhnBa(`LY^*r---%WJ4cQ_y|9`PVU=<8<*Ex>7J#9{hCeukZT#MyS%JVJRSx=+JOwX zb#ENt0j@zyr-Ml58&HH*$bh&yus17Y!;XDYTEG1d`^5IZKgyTH*_j!?JxfZ+KFCu5 zsSW=zY#TCeRs{eM{qN69(!7C`jv3s0X0zWvNw(a#pORguZP6PdHPGQsb274u@7J}p zKin?%{9$;~%`MpRZE#pt%beUo3cK*j`$+KiTG`{JOIb=7U}gO8Dg4TNdwo>qbMN}4 za}DqR*UBfJ=z-o%^axt9s0yWnPTR+UHEbXjnSCl|bS)?1@`E5`Gss9GvtGh&NsLuz z7NHtxy3;I-U;YuQ2VOZ{4=lI-oP)S1Qc`ahWV-NgEWw%_?KTSe^YOR^CZQci5QFR@ zchu+uj2^WSC_o1`hxGfTASRIa#!9!nAq6=4uHTPDZ^1^x6AY53fUB(_GBwRl*xbNB z%Da^HyqR!rZ&N-9*tabPzX3?6S*kzEto5jM^}WaM&Y!cCMT&A68PF^ts9DcM=H;8| z_h!)Oh!&-LUeeA}x;!bVe{y_fb{Tkg!_K3dd#p_lj@L@);|L~80Z0+%G&@{|U}JM+ zabu*JCOGQ?dP@=fcKE|?yhkp>eaSr!|9F>@vHDEUCnYXA)abh$dNZ~f))p>wvCl)Z zQPf9g;YBMC+zrQrX6cl?Adyf84rhB1&zev9tZ%yu<~WS=_A^Yk+aia67FV24VvD%Duw^xk8!b+ z2>~nUZfA^yqd5-x&8WuQQ;uUNRq2dt%VlpgMaJ~5gf6G+?q=(`7ua5U8s|khwpfC z>Y-NCTUR;>*NIfi{k-s_1Ms5-t7PD+O>e7K&sSNys&?**0O4AM_cLee#+m9Z@TU)Z z5gg*9hDP|af*og8u9NYZ?;sES?EvS+Y`V* z4=H8`RFve|E(HMEnp=JH>+a)kP9g>D{!@xLsYqjD2G9) z8D&ZBG3ef04#?-Hgj*@;MV=)Cc^O_{ZQSbgM-E_LP(PQOw6S{2PjG_2tDr!d!}alh z++_94VC!7pij4f_pIZuG|7GF}LM+HPko!{{3nhvM^ve*b-qQ$J`3?w}P@zs)-75FHKdeGPqRa8m~NzKQk;>3tR4!>B-HSJXM@DAiPlV-s&?J{zfbv3f(M zqjzgU}kfJWu>)-6{H)10Bp6|;U>q4Cg0{GxPaS|X+?#QyANbi zm*DY+KD{(hmt)`#O+&1#P8y{y7j&=LNsMNc-$=We?#PZ^Ck>j5EcL)|*dJD-ewesb zxC8VMb3EI#2}e6l28Av&b@Lp@Q}I*u`XkhH8y?@;M>Ws>MocG5x#5dSw z(zX;pC-I<`b6$cKCA}fyT@trAW%4oGYtcrZgnNo5G(jzjB@GPqK@&5@9=7cZkSz>? z^Nt#WN|Lrhm+= z>>6X3fNg8>0Cd^pPr1{7E_t<7Wu(b>V9cYGjP=@L@WgclWJ}D}A5Td;RAeFxC|TiB zzt>Qh@9Z;$3~zh$hmUd7iw`fw>_A{$gpqO4hYNS9wo`!!@$Nea2qDefz`a*5+j;u> zA;Q6?+)LcLbm{Im!7$?emdz;{69N~sAS`Yk@5}x8JM71;!KIb#HW~84SX;*^NI2qv z!#^_I({5k9%Xj)->^0PaG|kB>ZxK>m^pGdeScKX-{qM&|8v#gRV$nCn8r(SWeg(4k z+vA%b-PUWjvQ>&-Z3Tt8JtwY7etYn&fj2MK3({#cr4cB>;ts8PQ__TYjci+CG@;41 z3t?L@7_m9A4t6faRkYp*@Yj*l-9=R|^M{jliqpnn({@?kd%Ql*P{mx;Kio+i!X#QZ zM-3d&O_%%r_U{vZmb}7ul?lT&^(X!oOLEP5$A8_Fg2K0pHXg1MpRW-&BKhMg^2bEc zJl{}@8B@t!XO|&=&0AV|_MT@bpL(=@-GG=eyIuwW?zZKP8giXpo#4PRA*glJrF(Mx z`uvNQd?r2Hv`aNvwsWrqyljv5xI@;h?&9UPDY$oc_%4=nu@F~!d3q)%yMaY5T#7KT zN}7a@mU7;ZG%`ysoTo;~w23?`x8Yq2RwI{Pi_naOvYvA{J3Td3_@WInua%+_N%Jji z;w_MnPe=gs17$x9wE+$!VTPQrrew<>C=jNGQaeAd`%p*|BmQV%L$`@gj3xFqfuQK- z1^`e-dqweG#Q3$!KmHb>J&CjS({^+coYJl~$CVC|FW5oap%+;6_Lh0!)LxK*Ste!Y z^RR~nD^sZvU37^v6ciYVNZwPI6P|3(4R?eZ4Um*aorg?GIf`Ld1!8JUR{K~L$A%hl zO{G9u*#=b&85yIQH9>o;Ws1mw9l5BT*5)>{YoX2B<|Fgtw)A6jDrB@R+h~o3y(s%D zLjOA%Ck;bl6$YL|?JGDRZ z3T9|7bj6?FwoDPt&`=K0#~mOCFq^bHEylR+sPF2cY-Cl-dW50fj!c1&g?F=I0dPl) zBP-r|z6zo}2+D=;&;ok&Ph5l_hW5F4%dhKJ8L|>D#6}5L;>dBpz;?WcAm-=!3I@#e z+%J@3a~qjDkn*oZ9V7qX+MiQO&VCKuj~y@(JmjBJk>d*u3j|3Ss+v6*B){I?9RbnT zOGXYo7xUZObRjRF@x}aRAT)5#P9zhJy8(8;tdn?SN%RVN9UT z{aDZ8q)EVU1KDsp0-8{UP6XHqL6E5y0OgN;9FX7U+4VB&Qv0&CSN3353VYQ^gHK{k zw86~V@bFytsjK#4E%cCD90kh~i0K#mtpBWzcc^%5);IQ)7)O)zxR`cx(@Qk9TOqMJ z^3=aS=}dyI@dekZ$L_t*@2_QW8Kuq5GaQZHt;{xR2)|t26)|e4cqD*!v~OqRe^Z};B(Gu^CKf^!Iw`l|>-tV59bIH`fC+iD+DrL`3gbd4B+;c`L_Ff2b=uiT) zEGZ#oXM?=2BXb|(aB1A+^j++oTeS2V02JYWEeKjecv>-yOmx<~7(kpX}Cvp@Dm03V}X<;kN9vP@KUgjw2r!R?1t5#V6h zC3R$j{PkJ7cwJ>FhO`$0RS5k_+LIlZ_I*Z>4&A9~G$zCAdA<-Ty+J8d>Is z#q^U)YcEs?M`XY7?Zl}qx<>$MHl@bei9R1E#6qzD03@b>FlzG2Bw*l5L8@W zTxhv923AKnc^`SXUREIx))ZS26YA;fFOf_d$6oE1iJF8!|H8eiTs8Z5-_cY6B!O!C zZxIsQ_Vwq8OzAKPY*nFM#54Q{tQMv_@qXkZ)n<)p$ zh2qIT;q6!XEVwTe*vAux0@l#gQIHKm<8=r=_vPk$b{S8X(~n4r&tm5{2xsGa%u>HAvewb#aYTxy)D_aPu(VyFr{N!f7$(qH% z=+q4C1y)`mD9Ba3oW1uA)M4|G*S?J_0P9rvz2U%_7u&BgqrxbKqP^w7s^nA$B;cz< zNgWB*^AOus)91>}ah*vNGT z^S6%CnTAH6-aJaxE|~)Mmq~3r?+nDy66E73F#5tHsb&_hyp!ixV_crOPL@cOlA0$yVI+F#Q0nPNC02dJsey%uoO*XC99 zT^IbJ|FJmG4g}PpBLuZe97WZVm_tXXBxE7CTn4-^!$iwa$#0a!z_Kg{4p*b0Bkj@9 zl-Mqy8WvuD_Yv51o4&~8T)Lmk$({8xILChK(sFRP5{H-BKClOv8}@Rl(+bJ1FZP#1 z=Gus|A+-q$yI2xYzJ=5IF-4r{pRjV7X!8(i0)>@E~8!OaMsAP37p+jO5k+N z?k8b5CQ^YJka#ha+B8^{dSpC=qe^$ErQ%OBhRpv= zU8$oU9%B8&Oc5CUVnk!)G}jzMW)uZWL0}T3H{pyF zp)d}~OkU#8aIr*hMhhkoSFe$?D?Qj)>)xPqR_(Qc_F` zB$5T$!h?TJ?hGjumY>ea{E@s%fZ81iUvd zQh~^{lO+ed*9?ThAW-N0XLJOImjTf#Lv-=7wy@mLPc=>U+(Tb{;6Pev-4f(~D53 zx`_!v@yL^|Z!aba=k~2zT*|1F$>FJU{)cn zfspz_)-}2HsW7wQrX?ET1{G zrl@Sd#dvf2Epu#vhZn$e?_D?Gm*IT4^*w+a4g1iT*~Jua9s7Yb;T#vI&mcEJK$s+w<)bXwUO z(u#CJ1XBiIbT((0&1Pr7A&UZ5P+gvcV-Sd_{Ft*jzK{*Bl6+AfR;pCM6U9xbSooDfWi-*^aRTZA?*H52lW zsu$_II#qQuxy$VOt}-YG*?!mbOCS=$b||MagE*ds)yP5KejP5QYY8!){1sC|*<(748=~AY5uGmu*Y}sg5o=D!$4PnFxOs2fkbA_~%>^n{XDMHXUY;o4@O6ja zm_{IJA#ak40#VbBCcWr~Bic-kY0*B-ej#o4IIZuf^JmPX-Vd1>N~mijq-imy6bW&_ ztbply>t>Mp^9<2#7um4ke({uWHkO%{{f0h8#w-uq#p2zWAExTaDR6$~?oZ8Ru^ox* zf-pF5)~t4=mHRVW;sT`Mu7TCg>*G%ty1@xa!O7g>H9;g`I`p+`4cBLz`L?7OmpmC+ zG#kG+se6#EB&yS#oqel=k#&2~T&jII+!_n_P{=*`c*2{nBK%>afKpXS2bA*7?+NYS zaVh$=Xb&!2SK?!vaNgIuy)b(Mq?}b-zJmKLu5Iw?$T=<(JyFV|%k%T#pcVd}#J(pU z67JCXIP@!TfUN|Z-s*ma7oYW`{IG2@Ks@W+2%5$ z)kh1QzM@-S?+l=1Uj~=iym7$i+KlBjJdXtn%oKseq=nNv#x`4cb(HYUW0=U(a zFwIY|Mm-RzJ2rDIfLjW;rCmBMvgErX+cSwS#$SC{W6a*DN|qi@eIix+M4oeV&KN|y z)D&Fa4yQ#?;Dyw#%E9H+brCwbpZV4&m-s(pPzV3S2=jWJ{LB|Q=P7n%k6OQv-UlUv7P?< zPBD_fC41oM)wUx~nyilvsm#lWpPZHlq6J{G2A9Zq#CPAaMrUc5zPyfXdhw&q-BEGkLw-};+ABbA!2cd#V_Hs7o zd6H07;|-`H+Y=4mHBa89%$bkUtQR%`frh)+K0Q<7D+nCqi*bKi=jcZfuRA|Bk=YF84r&l|i_8)k!MJZ3BFq@y@#O^CLF~ z4JCUdF8djcEkTN!eq)Mj>||IF!ioafR>zQ@}4yP^}g~RGvkmF&VP6N`89#nwlQbq%T1#rMCja}os z9{D+!Pm0H7u(qQ9>Ds2&ZLW|UqDGK*tbQOa87YHBePls=o?X&88eI_N2)0K%e>{7? zQ2Vxt)ET3pIj`=Oa}toAJ09O0nR2-u9BVe;mG?563Q@ zLOhz&bD|~rU8zl8r&mRT?YdwfD?E43rr$Elavl52qRwxx_U#qQqxuq4`01C4)@7~! zC}&t$*hZM&`YuG|EZhZD-pDfgKim_>YGYF<=wm=P_h}i?2S?M&E=Td+ri(U)nYi?r zqvTvXcdtI&BK>8M<80&mB9U|v%nUtn5saMJGE3_V`PN_EqZI->IWT3xz$rhebYwx@9p><0>61@U{!d017=QWo} zOT6wKwL_Jzl|AiR0w?M~ZT#Km6%LXLRkD=%i-{I|zDKX&8f*Qd_-w07glF`(Eh>VQS@3@olu@r!z=C^|VW zUc98%Y_SgdL87QMhUaYR>h0t7RH(M;Zl9A!s9YLK+61yCn%LdUnJPRWt7~vMJ_GuI z&lYV&1CXpJw?)M1YqgW2&g1oWe6iaH#^(L|wI)oc8ZcKY?^#Qac_=4bQT79yPlwol z4firWTRzbx*dLd>0Mxaf^l4Kd z)@ukQU7hm5McES7*=LnKkTa5ATqOQQ;#(e6UzLIXsdvar%(f=K>gs1B=i0jiyqiVA zi=T6g!Z{**z~i~88Y94bUoWYSmnMm4>SfkPY9&sO^E@TT$U`grYd2QwHeNot*7vfN zdu*>#(w5q2H7Up!3(&K63{jv0mj2lDt*5Cb_Nt5 zT}RF-fC+naDA=pGXud#Yh*v;}MIfxYL2Q55i6icVAipVi*4(?WvS)qKjdO)vkEI*# z5cpKT;?#yft1WO<>h?8zuL3H`Vtg-K=zV=J)ezUh2UoG8ahr|p+`Zv&!wSJo@gY#> z2?6rEK>9(hrbL;5sa7kNtR8074J7zD_qW1L0ZO(z_P!(h(dG+oJ}lcy7QNJCD8B~r z5f{op`jSXFTdCBruum8tTkHw&X%mO4uUW~oxwwY+37Z9AU_feE@}LZ5PLdTB2rbN= zRHaX*8djT*@I2>GN_O)u3e%px-pfO-@gnz2&TL`qY@SuyQIF}bv%G<8xScjhf}fos z6}VY(cky6afsVYgR=%gma;ktx9Xn+NIchSNu6)$GKiMToGi!S+0&-n4;1p zw#_mbuXiA^0f@$0*Fq61YWkw3Cisx0JEhxiW9_N4XuaHoEd*!0DL7D*r!H-bC!V`U z^9?S$^SKKi;0lj)a#gF-CJSdjvNsCJi^^3YstT`6Z2xehd!RrKA)bkLd3~4Zf;bkn_gJnSZ<|I7;vuDxe z3&GwOb(fGuR1`+NvXIhij^VXX5qc2zv{WFo9Hh@$Wm~Fx%C*`rK@jNxhAmR6ISOUU z6qbO$FriieUJ?yaav{}5+X3dL6+mpyXNAjf9=>?$QywbkRlF?9lQW1424bCGt!v50 zh@KI%H3Z~mT zC?P2^aQ_T7QT#i{q(L@^{Jt9kLGT~17iN)QU_orx0cKiBK-vr9Je8)7kUv`X(Fw`w^vXk6(T0#|GvYRE2~4-PZP znU%@GaqU7#6}nfFZ(N?mF;q%K3|l^1VIDzbn;Xf?CX8uUu~$d11}p?+x7FI zyTF>o@esHAhXrj0Jj6lj4MZr*4`7$dr0NexU$T_H0p8OwgDD=^;cF8(vXpD@;cyM*LBZcO{4@>>Zr2VWN$=^t^nAlM>!T*)XOWRk&7|w&2F#tKY>J)`7;9Nf{8}+Pyg3`cz)G z3bKpD$e7eQ9x<>loEtvyv@ct z&c5M}IU7gb2`$513J$&emY8*(t6Hv|_xJVSqD~l^P#rnVy|QmKB=_INWIVUPd`SjkzK5dwIN-j3n*mpNkQvNCwsDCd|5z)*x-c-c|+$%P$k( z9H*Cjo-u6aw3~b!uwgk>`V}8!_*TCDOJe}h$S$9TzEY^LKKI&u8fwaJOoyxP&!%>y zJ=U?vl`@?Mm6AMZYz5!~T>~~lc49DiR8lV?Bm(SBA=`E(ePcQOF1GQcWPHrv1B*}x z2)?fY*(GaXR@cy$8L`K@`p@&F`A2sluVU8BYy%R3lmoi%g71wi6pV(%B8mY4`|N(< zO6zs{T|0}WLhQ98mrU}e*%mH_StQX9eoALMwKfyG@g^~UQG5vjh#an8%zA-@B_I{6 z9$cD*NDyZ6eK>O`qh>EaacPj%montR4}^DceVY)0_c>6lUFU2!bz_ z!(!-Z+tKbry3sU5rJ~%k5Vi@Dj;?_Is1g4eG)w0bC^sUtq`+Eqxxgj%Shb!~4B|@(N&mL>RGJ0`9u}d}$H+$Pcaa{&pC}d(;By zZ=B2&8(@uc8!i+MM(CUWI|;#D5E$^iO_{?ES{S3POAyb|+JlrzuzV(}PjpJIn}O8a zIm(ETl$Vvwa)?DDJGde(0c>3w`MYZasvjX%J&HtY0=eJsP3>^bwl%Z}5u+}}q455+ zK9wspAN09#YvF$1@Z0W{u7xtaqUrF=(tO14L0(mvXcY(3Igf#Gg&n}1F^}c`%7#O7 zN7AdHM>2k<3ZUTbL5Z*cfPoKGR5AE1mY3lwxd#z7rlRKqTgNW0SG%S>KtYNBJt*X8+kTXDEKC`upDnl!WRAmCuR0dLeoEJG0S$0AgkLa{Ol7qLl*5Rw zEgPrWDo4d$uGJojK&3Z`tj8d#U%11NcCi?e&gK8|#jv5u+zf>CLBVzMaI!cA&kpdp zg>Mt~&4XRHF1Yrs48jG<-ZxzTjwLK=;7(JkO5NI8YQci6_3QO9F8z(}m&d(eku7hP zMA;YZKxBljvc7Z@qyT9iFzSu=2)I4S+hjt*}RcCM442-!rPP-m@ECE2B^QMDV1+w?=;(G=ZwMSM~6fJ&3M0@ytj|}Y7ue` zQBMIK!wWnnw0)0(1(L@m`odyd?@wLNc(ZxO+`@DI16@sxq@RFx~h;u-dH=YGzqh4U21-H*$6kul_Gcj{+X6UOyi^}J!9WZl1( zi|uf$aqfr`4ILooN%ws#YYafoCNUktAn#bki|?~}A9GgiC(pG9dEZ_HD1f?wM(lWJ znA|Oq2ZpJom9J7A1N(8*ZboC0cFk|>nGfkMY8Z)1uQU3GU{Vp)iTPga7Hl$U1DAUx z4f&y^D0bPe{iEs6r zcrleIZV8oxIL`HJ8Pa|UE5%K{LV?RGi>iqCpXV<-#!mv1Vjl-+Ue<{jQUdzEm&b`TFO zCFET?T+vJ@-NbK?L}OF1JG6+WKpobW?y6Wo?J|rT>`Y(mCqs!|nlSebK%cs4g^L!= z7a`|&+=vIDEmnF*ojE}23ye*6ish~tb}#EnAQcnDWv5I_%iF@L4b0#!&t+Nfw^#Ff zp8NL;v7I+2B)QR)CeT!vTsvjI*2$(knEjviyjWe9>aGo&fgCIL->;q@OM`V~VziXN z?O`dNkhJT-m036#9>Qfq5#sJmwjxp)F&!zjRlD?=)5LmUy{jhP?ZrO>=cpvoHZ=rD zwpSN@qF!XSU;=kxR)}Ce&^~5j5nzIJl#KeTIB5NC_>E`e3dJ;l0e?gDz+! zPjd@^(}DIcAL+I`7g* zIQyT6|FWj|2OZ;q;`|61yRdVXyhOy=)U-RaWbc1oDLGg>t&%nUe^ z&2+DibsONaAK}Fpxa&UxCwJ_aC+JV%PaOV5{S7FVv1{$uwaEgKrDkynFn=_2ZUdnw zb2QIRnx_ZXe!|EPY5hp|P6rn3D^0;y*4M`aKfzdPGXK|h!G9@4_GFn0veIt~^6^Xh z(~1*j!f7jVj>;is(9xdPfI@-{#GQzDvo6c98^ifBaou^O2wX@x&YVEBVq)7;Gp;p39@j0 z1H2>yDTJZKj2OGLa_TmRW6G1se~#&$O)BoaCwG z&p(2SZLldmLuus{M*mf`?eZ^XzUxw?i=p^m;f*TQ8xTe5MJ!*{?2{JwNAQ4O`gmOD zAt@!4qbvf|5O2r1q43xw-}?6yJ^pXtQ7m_0M+-G#3v)lzTT=e9dM?-!B%A{cd3HjI z^Kk~qvtRQA-Y^4@;uKhCjaaE%A~ExvMs9QG?BNmXQH`Vt18{?nD3@GIk-vR|06itD zK%mCI@7G1Ub1&EdZsoUx*#lO=_#do-%}L^B#Uip12e`GpkXRcP+<+7(waH3bOWFMc zXFMAT{-)GP_-($B7e$PgJdjtjeA7u=Z!H22ie!^+r{y z{mI(Iq=$%$93qJv2_-M}nndEOJKraX;Ex5?7k+w$$mtQ@9>kdux8^0(b+MmF;l_XH z$D?bW?g40B$ZH)gQvt7!&~La6iU=9f);#0hqJ@iw`n<}s{6N3G59W`$TnN8<02O_U z&0|U-ScTtSVC5MdCY%}Tb^a=|U*|yz5}EW+%<$v4Hn#{yng&EiHnmy=5B40dW8vgb z!yg2fIRB+f6!ghL_+#1jPYJcN?IF!a_^-A+gSOU8-O*jjwFJB$%_}yC35=@i@fW3} zAvC0gidbNX`R(Qk#?okC#d z#?rSCGAG})`7&XwA=}^rIkI7M|K*Q$Fa-~Ks)MZ|XV10yMaF?fI6Cgfm&Hek!scj^DC^Zw1e zp!4B^q;J%@%+~gZC=(Ac$oTX~DhI?F{5+$WNJ=OfF>bifNpShu&J#J;%X4mN#y>~C zGK}CRxuM=4BLJbo<(2gUzx3P>nwKfDL6nP8c9hQ)Kuv@Zd1Hre=gY@6lb*sE*#7ex z&oQabBaZ(Tv(`B~VMHf`w_J>tIY>R=Z8P3S`YwdkT97MH#h`nPaBafDnjr&KG!Co7 z&{Y1LxC&m%0K1P;JBCc`2@%j+;%3Oad(&pB^cnDf8gKwqxdM{X|4aITbQ;;Gp)+sl zx>p<|e*Y<0ojhQ1Nqt=RlF2=>|G^fl5ou<(iT_fmfO$A9l3`opnBkt z-5z`yc$AyF479mE$h5nSzK+J9`!wQjabr?WZFmRKQVvu&=GhMm{%M6jGNR;VYbemG zo{dWKft`{=2ipF_Yxwz9()V@#(~|HMjx6pe@jc4MV@ zg9fP`f=nRAX6+xO4Y+`l_do>TO)P7hydJg0cwA`{GjS^a?Njas**b7IoOn#!YYeS~P;NNQKSGfvo-0%p zanp;zv1A{?_f#7xf!rS>klsT@E;l@9Bykat>09{LFxXfXKW|}hSJvfwea5#()ylL4q4 zMbB76W(U;resX|!gP?y_QjGa>p)2Hwdr>DR9Qcjpkeu7zXU$74dx>jk_Pm@d--@W; zGOo#&cH9V%(K5&{wb&Qz4DSWj1ubHt1VGg^KoqhwuvBmm@tYRk z>lHP$2czU5Li(r>5CEKI0nf$)4<(SQ2`egMsy=PX&6LIw^~@4KS6F%$k%iHo(q=LI zJ3luvS_fkxP;MDgwKZP9S`TuRzwfI@n0Os}3rviy1DScr7sR7RN&v`h0qsm$MxoqT zQpTzoQDyPR;*#pq6@#-mpd5D{h>FK-0LL8q8Z==7>Hc0Nx#iR4HG+CbPniP%s))%E zlMN|Ua&DB9-?)GTIG{YD*;qZBtYXXHg!iDdS<%ur8fgEg_^u{%p+n_j@@+N~HxuZv zR}So=Gdy}08jxSM?gg=ZN>sW31$cDqhVIF)QPw$Q*qZ-9OJ|f_KET6B!&pJn{#^Lm zgrll`kGsKkJDPM)0?EC5YhNYTl}in*Q=9MmuRlMGst8cZj3x*W$Dc>G@1^JEMn^3 z0vg#1s3aW{5I9?KB3c4cBIQu6(GdJJnZF-pdA|VFrQ9Aei3*HnI;_nP4y4^}{{Z6A z9*BBZdMM2@s>&6lK97ohk?6dRGryeY-|td{GZ~S=u|4mE54w0EeeDk7&~zwOeL>F7 zw+1Bk>t#p|cd~H8NBE@G_ZgH-p_l0KFJsu=bjBg`sk_()L$H9U_?|d9a?PrRP_~1H zmv3ULPBJ7JoRkZM5EY&5)x1Runt>c(5Gs^R$vJ>>lvkiK9|oLq zU$Z>3`_u#=XFreT@Woh3ORD`R37e7*1b5|YW!Ni|37$K+5fDi5YW<2;e_kjaG}_b> zp()B;z(5Hs>12Du&Lz4++O@@5k3DC6MktAmHJ~V+6%Oy-@fm^wRU8*M*Hl zZt|nRTIme*)B}o?QL;B!wnsZ{qQ@&BRT61fG6fJ^bXs!K3Myx@o09>6I4``@q!cB> z{mznm%aU6$eAcal)^FJeVjL4zwHxfeG2j7(5?iJg`)O*srs=JpMd+wj^m0C!O9XgB(#-5`g6XM zFQhAth4FXl=9HUGl6`}mZ)V6M(#`F&h%==1y;)iU9Fns<4pwmk+WF%^q@zZ3|M-J> z(KiMBV?dcXP>GYdBCevet&hLL!xo5_?^C|}*6fmUu`Ko=e}ppNY~SOrnB+pPN7wiS zgtLCELeQjO?ZUgURj7o&YuJkFGwm)c=uJWu^K#9ho*9(&AosQ{Wc{|I-VccW+RQda z_FS1Q8V^Kxq9F~6fa!NJR$r!`T<6@0NV!4bdbaY!p&JLpo*RfP!8z2tiAiNjGk70C z(5&&t7?gAzPBp{(?wGh8aEaGy>Jn-rF(C3dEA?xlHjiq+9+aaPFqnc8L@uNX@m049 zRP1jXwyrUQab#GCyifwG9TSi(2rzq|jtnqsI^K_`_dw?Gb@4$GSuQ<=T`z5s&Zyy) z!i5f3NLV9&MCQPthdHnp>rxj}bK3ZGGgkyq<-mk+jei|j`96}OoGzN{bT#&=U!b@F zDof}Vm%+weE@_!}>xE2>+vy)%=S+{T&xi?u`T}sAzBP9diT4O#Z9^{RA`FQ?r7+k%tji;Ab238 zvmgL5b}@}o80W5!vMZw*P;@O}Gf)XxOUv>6wAppI_jb_BtxmdV z9bbSnV+$hI9(n!2il*jpoF963qQS17^(-={YPHQ4aVo%ekpiWQ$O&!sK|kLlqrvB#Wk(forp*$ zNU!3Z!q=F?R~wOZQvNjgbKi02SZmAy5&?6_)3ARD)G^9Nk}J670U#L|D2`WNK)bvg zamp*1^`AaR+S#a39C;o*ygsNVGW78{@Y?PMsntW|e9+ly&QgRZK46TEDV+NG- zt#%e0R(QJsX_`9=&;XPY<@b(DEgtfb6K)Nw8(Pypu`E##`&A>RpRLkYFtd91$+XW~{o#MAb~|v3HK>SJJUSO4$UE&?R1zssYX1 zG$p`NmT$UDP*gpjtC7>tcxxcFCiI$DJT6P&we85*TvvV+7~(3&~ED6%HK)< zO9gmywL#>nGK4+Si?szfQys%!fOv#B!8=h&X~*z>ok_rk8R=za>$MVgM$FfktRLDe zD?%JZkX{#M6qhy6xSSa)qyF)2N$q*L$GJ_uAEW{948&18cz-QKWg46QU+*0^<60p< z@b`Jr`Z|&gWnwqzza_VOc%;24?Zam z{G88r->84h`ld0U#NzIbLuo}@@KcotQK*LtDyNrz`8DqZFZ9U`+;sPl-+S}MDPsG6 zmE5VV0S@<+K*;}6aCYQLZ^AJ-Q%wz38Ld)bkk9=T-=C5zoVb}i`% zZl2l#KLMpGc?)#x^0&K(7)nVx4qwSj6@*Y&W{n ztdrM#I;{uwFzHB2Q(<-J&?!&NB7MYXO8ohlwHO{d%Qprmt=)uZ8K3Q9Ga{11N#NG4 z@PWQdJ_@SYqr;?ZcAniVXnM&Z39$u{xBz+oKBByL&Y;?lgtA_R9?Qk4 z%s>*K2`s{LtIC*B7V#T|4P9*dYM+=%>QDt!Cx`q-86FF#i6g46%gR2CGX=OH2EDdiEneEdPCX1IY$Nq{i6_X$ZD` z^Pa?>G6jVujS2TEX-n`M%!zy)c+-p&N7%8!#y7E;KHd-w)6%J3<0!h?PGjl7T%b=7 zoUQjJvaS0TCAA0t3?-AqZE@u*UsMPY?=h@*d!v7MZPu0FGMhhdAnf|~>V>?ygsWQc zNOAgru)n&QO-gy|42Hxe+Mgc3F&QoO;}XY)o)iQvjpET-ZV`3(X-8ryJS2fJ)yKj= zv)p#VM+j?=@h@22FJD>O#ESb7Js^W5CRFzyBh<9dvcr-ibZxLJj%`0XL{G}L&z7Jc(SiJ!M`GooI-;WQF6b;#IUN&P( z5*6cj4;YJ#Ng(xaGr0x3&QibB(mj_xi(f@`8n($7jbc5^_&1zrzOKk+%hecntKb2! zU&E;P#d>oYtvL7GfRBIYgkR`9!|J3Er%k-mC_Y&|kN_TM`{!KJ(+m56pDUFEadZan zt#t6UcOdO)>E(JMyBeA-{F>oSi}hnv`{My7)Y45+*!o?FXwN}6J)dg2pC660A?Cyh z7>4jO{MX+yqn-4=eKdV#LX3muw{OIc;+A2_;o$y#F2uy7Dtloi{s~XoPnv%c6Oa;R zb^ILu4+dDOb7f>4^v0KU38J>*lwaH9I&brN;J=D-e*%nCazrNy|7U-V1tSiEXXBLy zcliDorKLXXT)H!@ckn9+Jx0mjTqa6BLx75DsW+E_;_@5(oDv*kfU@>sy<-i1Jx=jm zfvrlavKxl6mpO@zG+!+)zjPqzQf_nTD*p5Dd0|5x)O&XypCSHZL-?}RZ?sOtZW$mP zSi<0byck2t7+Gt*-Sv9JcAoP(R|N1SsBzDT+hTSNxHe&&yu|4!t(3s%4xK7<>&n9 z?Jp2S6u|h9lap7v5i9*^d4Fs@%{`hv#o|Z5Mq0b(Yz_-e)+OdN-0%Bff0X~nqRi&R z=|4vJbLlm=!fD<)`C@lJ9be2X>hK=NSg@`Y5XZ96Xm`)fmKfiB^%!3OT0e+ZF|K}nbcW$t z-+!#e{yQZlB^b5Kvwoi)^#9}gMXa!^hp#UUoQ|z0f+yI22ae!2ofl7kf0j5dGMD)| zi&Oy+@ZNmNxGZoy9?!X5!H-f7Mmhi6p#DA*-(SMleq1h)!ZuLjhR(Jn>)&E4e zwdPV%6KFg2y4c~PiR*Pa4F!0)p|}asaoxw|)7={)XI{Kx+m9=tu_TqC^T)cO@MXHKC($WsaW%zq|tIC}bL(zk#=TDnE{b*8kCU-GNlM?>ih)6w1teNfC(@GEW07 zDL4;Ql6~^NDH$oUIU!^gifk3i&W!9)Rz_rx-~Fg_)VKHd-zjH&o^?O>xbExH z&N}uVM?oDOh0@eqbd5-hz%TV{@laqY1z`lW&RYA3BalQMgh|>vB2yp1104l510f<0 z2w^821)0a=;r}&8bQBQp%baPU&|&-|n%v>G>z7za1D-d6N7O9w4xl21F`v{uk@tf|qF5e-4o z2K(hj5?s%^)|ZH`&o2i7KSe!c#~u)EvV|TjIh5RyB_F!)Np-=y$ACx_R__fru-k=U zA5tI7#_d2*!_0Who>COrLmVQ}8}Y3)CK1c_V~YHU*K;}D z%e|z}P#qBP7?w&|Pii zB!R;b>Et)zpKm#zBUj-_rTpi1K?^BEIpg7ITKJAcxxX=zn=q2#M3LZsHsPnBR?k)Z zSp2t@!fpm*lDX05{;T2U#TW?0sQu; zXi!S@HfuL9JQ1)kLa;DyTAf?Z5ZuU{w~6ox=hSru6Mu9?07VhsAd2Wu#D)>a7PS*B zdt{*y(XcPB+Y-7f+9Ze!X(@lcAc!N7NdI{9Z)XU=m~fA7X)q`L+^>HflKydD=cW5x z{$EyaSgQ)kZ*Denh8%6+aF*l(G%Da;T`6#y@)JrA2l;M@anvw_OYkyjnzZ7+y9wK* zAKc#v$ZB@LJ08VP|1n9#r{aT{nd{U$P?9R&Z~V`o?M`Wu)>(-t7%6tDia+C87`XFA zFtNj{E^0c7)x@bHekWMR3q0N3%x!`fTYD|@ke-_K9kR$#sKCbI0Vh- z4EK_}^(2^t)Yp^50}qlaaD%H;bY=hBp-6mYHzC*zV|o}$(x-?&L7cjF6hZ8-7CA;J zrj)h$EkM+!aq3BLeqH;g>jnO0B65zeihNyl+2&38#|eQ8hFLz56LeL-g}X zw&JaJ)c1@ewBIK--(z3>aLj`9i-P@so?PHJTaYl595}^A90a-mzUuyR0g%o(@gsh) zRr8-~58VCjFT0p0OAOwe|4-9HsK9`KOr<~ed~1-wACHeu-|=oP$3g4!WfVCXfR z&Ay||)Il1AJciG=P1!6ikT8p#d}xZJ_1}|d!LY^DLu+Fp;o8Jo9BT^p*0H=(i+CD0 z)_hSJ%dNlG^x^@a%`(B32l|cuj&m{)CS+yY6H;y=&IUhIJ=K2mvV9=Oy#6(WDvVEi z6ji}+=IIB(&PROPZ!gq&!D8?ypH=*;UWHsyQa)eM;~S}&L7fZT$rLvRpX%}d$5ySc zBVQ=0bAPG+yDZy}eU!GNp00JD?iYS6fdyTum(t#gNg&V`D!3*hde*ii_N&6#5NITq#1Jcs6!8)%E9q@#8y_ zth{#FJYO17CLxorFeF*s(5{SM(G8s3sH~AT3)T+fv)CJMhckuoV<%9)tx)=*3Ax-~ zaO8G2?|w-9?sL?TscQ;)LviE3AC`VdgKVzTCA;r(1nJ9ve=(B;i_DcK)wZYp3^}>H z^V63D!9U+o??TR%H@g1Azb)R6iBe*&pF5HnDEA-h>#KuR=y0Osgi=}?vW!qU|G0G_$8sxTmhOkHWn*@WSt#aQ%58 z>Yj6EPsoI#PX&7Y9rJcz$%@bCtYy$TR_|>O8tfkaVL0C4=s%a zIBTE&W3S?Cw+?xarWU8{$Gm}@pz(FjlRd^n!;VBoTXF&1Q2T9Vd?B+f_hVA@3h5g+UL4w^-bB~>F>n^VJnRBmj||n|-)=)UemK$@$$EeP zX%47o{5*^5ik@DjBxNf|2HWhRr+kjY(R_GRIU$&T(-hV6E%rHB2fk|Rs!ju)>%^qp zkOO|?rD;Zp;wtF}oYk;vrW4I!qynL{A|Yu)b16&bs+v6MT^oZyGxpm-P`B^T+Ivuh zcoN_d_WsB}d`VWnP5c7%e_pftWS2=2d4#=~Y#Eo>@XLQ@EWsU^dGpZmty|GtR80uFo zx5hmry^j$Y4HK5Hb>spm|20r_3h@chNny4ADbYwz_UJdmP$TpgC>Kk7Zi0TTylmgec6+p;JPyR(oVHc`&V8LKTb@t&Rm(Ww$) zL>$kIFC;>vpYCHLE_RR-mOcBB)>EFJyB(j-Tt7ZGG7@-%_)x?hg*`+0xi%^SvDG~? zjN?{IuS?^$Fo3{@)vx4rTw7Zae1q9}xP>$XmxxyxHC&0G>Pkd!7Al)=Mrxgz2YMYy0yzNka<5L<5!83{ZwX0j~L?vt{R) z$=&u7CbBY8jCzUIl=z_XOh|3FfqQMfVg>-OrsN1ekvH(*Oap)`0x3C_C#TBUts`mA zwkC4Zm%)r<@4+_8Vf{F~WhMpt-A`>>oBIl*faK3#C&-~hUvBKIsY{0esm}$RJP9)e zJpouoh;zJ4psOZQe&M|uj;sP2cQvJf%B2BNPYs-5Xxo$v6FQIJq&NR@!#bbq0aB6l zEfW66sv{&1xB%|OU>HIE7MnBNgIkO|R#FXqE(j`)R^djP58h84S;>%Drct)zN zo})Vjo_bR0oD$N0PTJoBU@86$<~{Sj^QcEztFX2_19T?1Rz&sN2z;^;2oLe{b7>iD ziz2K>cOn@}#Kf5I|9o^4-ipBqFoq3)Xt@v?1zZsO<$%PY&7vh$cNp-KXN1zS&$WXl z=DBKT4zhPhHKg~s_WF3?lrme|D{pMJAN$FQQNVd9oqbwR?T??*-XaV;=y0Mu;7cqX zRTa?FedGjEOLM?csR3JwYS_JGOE&>nemWt8!2ezTBIY}7K8a_;9w_ay7rFI-8vxAq zKnIsFL?;jG1`S6ya|Zc?42%8O7p)1@s*ijqeHJ@>T9~-6?T4kTJYamg|6A+x9Xp2Z zU>&?H;>)d+4-UnWp704c#x6>avlY&0zSv5p+SbZuEw5+0T<1QUWe;s(R}!O-*x_)?<&s6u znL@6sl3!y1AN=J?pU9tu-g-xTYvH)Vu#nNh>BYs?;%LNiH3KME|4?s$7w#z&T6}Es zxgUX#(w>*^YV)lS8%2A5EG&Fc^BVuEXiY0LjGSM8;gwQqgcyr+>g-t`v*Ys@8y zyMUaOECikf-LN^}x|rbx-UpTa9v?QbBA&gAKok|>9Azlg1^|-qBEZwk9@8ESEV)Cj z=oX{cJ;$JS`OhRQKAPbp5TP}KTti?qaMTl(}YW(MSPq})HxCSO|}cu`2M4+N3X%&4n#vzK2S4`OheeRjcJyKjo| zpnKx7)b!NBD&a<_gt7IeFE_rPyZ6`K+WI4? zrd!(;Ox)*JSRhJov$%lZkLyd>DOhj)wVpcYUK_6wD3@ge?Oh_GPT&N(K=Zr&kA`Zu zJ`h4yDhw;X$q|5PPs2*fH98R7Fue)%n*)YXOJKz%A-hwQ5E+jbhh%3m5orVf6!(VE0>7BY|q7=DIlZ=eii9 z8{s;JH=kG;u<0Nlk5OpCAnOA;o@*yi_gCyY>qz`5(gxYT;{t%58i7{!Q6cZV6STUU zk9WK>2a*%ro+$(jMUXOv46dcO7PDh*g0}(?m@^yDk=v=bE2=B66tC(26VIJ~vJ6V% zi&}8m6}J>z|JBtYV8|CXpFX3$TXDnxsn;Se2EuWg>77{)<<%94b?+kJh8mgmEXC$8 z0w{9n+tGiH34nGz&*TmK^4J?OcEv2s)m^r$?ooG(j7%M^W=$&>@{X5y`FCp2UH>B{ z9omB*T8aYE$=Ps#6Sf1BQdUntwDVmqtw4MpSL2O_rz*JBrhH2Jfj72p7-mt;wkUK; z$`G)i&XP=e>otD@Qo8ws`Faquc#05MZmw`sfLK!V#Ezn3iRoxHX(Er)%xKEk$G3^S z>4TfD))3k6+b`knN#u0=_}5psI?Ta%odFpF)?JOLz#OFC19GA&3vJ%8VuJ}G(jI=f zCFjoUZ=M;o@85!`!^17*09AjuikW&Q6RYq-#^qJ?dJTv4o9IQoAU^j1O9tGY2WXhP zfFiB|_?IFmxr|^M&EeAGqv9@xW&`uu$Rlk+w*vZeK{!WDCG6l8(RrzKjnA-l)h|*k zq2{iQEty&eszBlz6}U9G`!~U3{ycns)Qk=@<{lEfroVX0ep}v-mBpzb0Zs{WXWv_h zi8AqPPPcs7n{CkPVE0nCeYy<+lnaF?-|kdvx&l%WobPkBh2hFLTmd)q^pC+oZOJfQ z?k348Bkq)J9pitQv`5c!-pFJ=9`mq-5wsZK0WqTu+(sA}yN`!wtamAdqrRCJB~uj2|DzZ~RO zxF>PYH*pGe2IWBqdU-q}9lt)1-L{Q7WVjeO10pyKW;J6B|BqNy{ZW{vAu&AYO93u4 zZTQK%&28nW#VZHjECbkAxBrN!=>6AxtDS+=GkKl>cr^6-_J_M~R$TI$=0IdDw=@{c z!I~%;$(qO`cB1q1(9g>*W`Zc4eOkxbvNSQ=M!<7o4lqrQ$nQ>Xwn?5Xbjrw1 zs!KELyn}UwAz@E}rx%ia>38$C!b6D5;J&KMMzjK*d+XJ}qH4p1P16vl%oSD(BvH0n zN*IqQyIR;TN?3(~`^Ouao@!P&sBVT+P54CVL++3G>Jv;|R+kqJf6>Q17M4Ba5fEHu7v}H zG!O1@O%3kzMPrCy$43Xlg%l=+LAg}1-Pmgzm8qN|*#Bwo3n+@fbDa6iO(vySEiq{!M6dt>Wc+Cc85j}==f{NvVcz_F}4$VJB@`@KnX z8&e;Myr?0i1c`oIjQE_UvHo$aBWSuGBA@u;D?2m)}*X}KJv6?!rAw?0svGS?Xzf^ucKIthQ|YJE>Z_Bg>Ayy z()c#L@LJft;aQJ81n70a?_Qh*&pwI85#5?s%?00{#*q8p!%0QU+^~v% zdk`PZ$jZt(^xn0K2=&=`7VHh06ABIm$jd(jqU(%v%YE|Q5CDV}BKa-`8qf|p5D&aq z3g||K`z=}H=#??gD8Oqyjna$pOeq&gW(gg<&19TzE9zC1ME`L} z9`A1H%}kk9MnN94*px^mB=86+O^kgXR`ZZ%Z(9a;c@KX{{wK>lXIMP9OZM z#&G7*pF6#Hi!dP2&0jQYR}l|(nWsO9DRR)ty93d^(&d}L6suW)JZW4_c(4fRdgZc) zCbXw|i!Z=$R}v;bPLiiy8E&Mdq)et@Y(D1Owr5u6tS?iR(@C1v_41Ih&vMgoiROYTO)_cnb6<)eM5IQvvM5$-RB5Zw~45JL) z7Y4zn+WZ8mip%&x8|Vo_R5;exJ3#*EPK^I+vwfeXzY zUEJZoU>Yv(=Is22y{q0K(=RAx^x*#E@Qr2&L&97tjUpN1LB~*M8)B7>M*R#nG$gRp zZz;$YvVp?xv(C0x9C2~VJhlbMY}>#4%Nv}5=FKPQzd?K72m6J=5J@@Kj790L9HSoO zx+3b#Mdhuz>(Kz=0#FonKNHe=!!-@>N!$k59Qfbk`G+%VDs?nUrl8AIJfRV>;;NyGZgDoJI7(Hj z_n&aP6QWnEJvqqUHzS|g%%zvjV56j=Z&VQ&s;y2#z-qKF z9Pa>4re_ced}Ma5A~;PpYU#3lYcStQNiN5WNJj|RK`uUe<=Qg}9Mj!17C;VW=kNuo zE{(Q)Z}bT!qX*BRP&Pr=*X)h?i`lt$jaEkLGiLaT{R@?4lD_!(GTbV0tr z1>b{$h<#>nt0HYCG0f$uCkKnNAM5Z-C4zE2xzgE=oO~;TI3eC=Qsm2sL;etyM(i%g z8mn{KxT28mfNL*}ZvE9UCt$+5OviPen~_csf%?JpENVIfYhwet<|Tk=FB@hK=K;)% zQzM;))`2C6eBB|jElHOu3okyr#2ebI|13)w^$Ypb{ls;T;rvu-@ zb2@whxM~G=uKarJ)*VE=>Thic@9 z7+AGA$7CT47v?#lqTb zIHA||?NL*z?r}a=5pt{kaE&7V5dDK`(B)wceGRor-qtO~(O(60WY1m)g;rC#e`s$> z%qIkv4D_lp;nSgy+MZeXLUuQFn8&Pw-jy7UyhyuYcKX9X!Adpp*0MP<^4I-KxnQ6Y zZxl^O^-H@6EptN$>)6tIter&{Aml~4xq?6`_QsiC4wRC#*(ES{v3Z zTw=b1ON^b+Sf2IU^P)e8HzwxU-I58XP+_Wj?-E0s-GOWT41}&dNnRex&|Nx#)n9_` zn7S}0K=t;Hhd6ToWTcgOHoVcJE&a(x~6ue6M330#4Jlv|VuHW=;+pj6cDcJG*j zXbN>Lv(MPYYnBnBP;>>HkVjVfSc*?R+^ePvWQ%padHk2}Xf+->+hThHelUwXX4COMBX0Me!0z-_5}-?Do9 zE;4&0MGwi-#LS)n!~s+$M4or4rSfW4-cGHwJKj4lN%Z%gb1CoXnD6hpHRwW$ zM_1hOXvtd*s2B3GxW0Bwz5t!r^(9d23+eive&Y!=SRLLE@rq);U+y@fUX=#Qf6Y~A zv8oa1U4B3*g__ybzu( z>MmgJ1xUPjy>`H3;moYAPZ&L~B6bE?%vXfzJ+c?rudX@0d+JQ}z0y4`oKg;F6rkg9 zwXFJ0v%|$#+HqtRUl-Go22#Gw0gL+SwS}0quxOBTt4z)-7Mp(qGBm-fz)hMkFS&Qs z&+O1PCL73p9WceOvrhVu9lm{fN)Mn|0-U3t1l5~vk9g0T%J>=lkvPE`yOMvH;LMb=)_e!2ONZ|#89a`=QiW=fZq zYpfMM)SuDuP>#GSLB5wyk*5!7aNbU5CBrES;!OQEeWA9u+^uMH5kpxaggdzsur?pS zC_W?+&O3n`HZ?JB+e2Q@0q;W9Edt0i^k{4@e37EB;Xi3Hu!du(XA@VfpxDcBND7)A zvq2F${yE0E{Nx-2b~l)t0&Zae*vvyM3ekJP-|q3|ubGg5(|SDru833LfsxbuL{G_jOOaJ41V6@_B%p zFb%8qA?r6^S;&$YEcFk0zJ^s&=y+_>#hkVGOXF)A$u(v-xYQwq5L|5Ec|G4<=o^cF zorS9vy9#ikI?T$jdL4gjS`f(Cz2uq)KGC`51Te=QHP*>`UBDw0Ur)ufX-U zsGLJw0W!x`YHELJ+3-EevnXL=|MjHU(j`n~upnfIGtOAMeELLX-6XloSBA?AG)<&v zLOUQ%98rDfVcdiK7s*b0O=-yDkIwGD$Uv430iRw?0yPI}vdt=~j_r999_4)@7f5F_ zH|0X(9lsl7Do?^SJVx)b+C2hgis@lcNg7;BW9>DlX64MPQ!-ivy^Y7iSAA`;U%1QZZl9@~UFkjY9eDB9e;<0zFdhRo!jj zRHv@wcdv*Xp3Vv_PQOC_2K;!MDdQ^+K6sj4<~PoB_phJYpGl&hzAZQdC%Pvg&Ipd} zUPLa1Gf0hQ>C9*a1VyjA0jwtvj(kLTcF zx1{>4Q6MsNK?RpVB>KBL9J4A&^T^QrNpL1%a>%R8EY9!T_al9O|AYEj+ssA|@8#-0 zCi{^dLU?M)4&kQ^L(<{K{Uc-gkX_Xk#Z`~Uo)^88Uv(H#;$vh1Bd*$A$~Lyunfbuk zs-=B+aN?nwe3<-vDIG4Z?TcD2a7{c>a~sjrebxgKqxZoXm}qj7m6iwGZp_m)ei2HChb-F z;=to>bN$karOz~8#x{+2`<&+LTkVB(Oxa9U%t~rz^0+naIgSN?-RyhkFs&dOxT+X2 z(xOFv57BT~-kx^yyq1(*D?NG{Uk}6(2E8Kd6^BW^UL~O|*%x@I9^CQBPu5&^Y4K@m zNXh8^uN|dLeZoU$rcGzjM%m79NXB2MBj0!R`H)31$a^&ce}tSRxAW>Q#VHZR(Qg&H zsMcAGcof&McASjw6oz)hrB(=&i!FKH*4->rPJ;IGGb1MT)B4iC1RC{F=E8Ojz2OA5 zP)tuc6qd}tH|x}`ri1!bTWTN!ro+thZ%n6FV&%!t&7%^Kn_?`@h1_Fb&j_oaoZ-UE zlLKz%AC3E2cTdCJZVlmPVFReaKA@!SLTN1ccMZAZv=>*|!W%P`V`QM!VYKI1 zIJJ;^xhk+?l6o{$YzY+t6thH(zz=9UTN$_pQ-6IM3ow2a1{0QJ3;Z2Akx_bGXHxx+ zGb=;{lw#YS#%)K6s|leRi$HwAR-j)^VCUe~x4456C!^b}ccqhSdEe5G?g-?J9{>6%Euc>MgXJ3} zNY^{@_Ss(cvhvuHHjo}TTxOBPSS$wB3F}#(wi>>V4k&B82C74{1827>l2s_;zuVS0 zu4$jIWb>k@WwJ!YKQTpvu(#mEmF3L&`fTtwtt)fBrf)@K+Ujr zu~zbp1 zjm79PQDzR(ynqC^>Cs3?$DKmt6%sB;%i~;i(~+(qI;q;21GvkeeY-mG8r!{G^xPFT zJ5yS1i=xfUT+v*iaD8s3W~73lSk(}c+qQ?aPaUjTmR zBQ!zjj^T1Hj?5Q0Dh4z$f=V{up+Fek-86f>%r}K$H|x=~1;)8eUDMHXm+_yxIj*04 zH?fZ3%D`G8bPRX46o1wHrQT#GX&EziezgeC*h9nBmnHYr73A=$VdS*|1=v4lP zO*K&Dl%q-ZZF_p}T*?aHq#e|YMIsBOV`5ktd%^TuX-|mlJQg2n?hfH?%|!VA3eQap z*%4}Dgc7pN9QTbnn+8u$&N->=!dD@MR80(za*vh!%l_Ez;pH!}54=^Esk*>64TEq( z+U3WeCx9})$R2{K1lF;~4=$DWepJBW)49%ztfrYCDm&bN_`Hwq2Na4W%yT~4$nE@k z!4M=VQKLS}*(3rHSb$K^1e*d11=wi}rP5VPEgb8RDc_Zi8{wC1 zKlT9iiAf82MZzZ(k5PJ+CG|p{qxzOX9h5HYKmP6g1eih~L`&ZuTN7h)sH!=O`Afh( zo-&}Jbw5v*CZ=ho5iad;H4n0v7PtJSmlW3=t3%n2+DtgN=6{Q51n!ruUYGbzipKET zNZsO@R%JNEM%E<8XQ6>yL(S@@2(_;wI{Gbyy{Shc7Z=!_Ru{gsHXj`j z#O+mpIxl7=q5H`D{{)?zN$YRmgZ3f15|{jz);-+Y{WT~CkH^%cv_dk@raUCU1F%;g0Fb(NeK9>t@r8s>q_v| zzZz;s8*aoO`JJOJZaoy-Cy&=)cgYk(Y^H)#yGQ+z(p^@`(DH57APY#?tDt)J-;)mf z9(D3dmeK&j$t)?N-Y&A$H+4*=sk?h+{KmiH-Q{DIG4pTtp2HMXoK0XbW{>+=VLAhP zDXz={dTzB)7JTgdeB3R+Qu9WyZ91qJ?!8(|znx(@T8$eLvkiz_1=ao&k;r)Q5jhae za~Qp(n7{13)i9&>Jcg}etbD;97WT8wm8z+Qg5KNgBQMKJ$o%v(#!EEPLlrz$?F%ybRzqOq~5F82CqnJ%} z!F}Cfpt;M>{*l*RnGbtYR*=g1PS2On{n82_-#FEdl0Z|xnM?X1Uu=hR2hc*iO|ZY+ z4d8ZxrzNlX_lI0!;Hf`~55!6NGc+rFf2#Hb6)jzQt|0M7V=IFVhT9OzK76}3mvd4A zwOD@*l040-CAL*U#Rs>w8tyMSI16ope8%R@S~}N056ifxQ(sS^Wz}W$lsZ?B%c2o& zvW#RnI~P{xifamSfg60(e*xqjWJh|kLjU^yjxXRWqC%@#K$;Ji#cyikRQ=?qT}x~^ zKE1O{XJEWpO34zB@>PdhbHVC2g7>YPmEJj+tS^gm^T+mqYRmqzu_{y)vP@oB0tUD% z;+3mCn-xx?Tma(6Iu|#$nRk<25@YGJsa=9)UlxJoiOoEx$^V;g=v|F*(V&~(&HKbx zUu3vlo6Ii+2Q}W>wV%B?KOSPrRNSk~dXY7t4NAHG{;xIU^aY&joe{mjvm6(jZhR;zNBr2K>VN3!P?w?tO%)0@>4n+e>a0kWwC08^mhJ9VU z@~LN`?C7#Hg;B?H-aWdI&kx`Pe{4@rn!}Z1Wqtm{kXi z{4IYKb03zu2&qy0{5A056D?|&;c}HPo4E6P7ub3TKxoCFg#OsgVsI8j3qftfq|$vx ztU~-2O4%YY8XvMN$`5_|418MrK1a?1`0p2lI^C93rH*|t`)pm*Ewe(RfO#MQc|>=Z>Uuav(>I%6UVVlr1{ z8r8F0SAoI9pMujmSBRlB-vjyJsG$z;!w6EUoN)u6$aGVV_GG41+jjy(7LHqIck=p0O|0j0w1#%Ws#Sx z^32xqUfY%aX?F4BI_ES>Y-LvX)cDp*GXLhko%jZo;j2`hQhj&$s5W~iaWEdu73+5# zT+-F;PA*oY6DYH!F^zK2mJpq=Y4tPi0BqL&(f)U9%t*TMus5?CRo@K(`K1Nq%_Atr zf^a+voL%Tst=_QeynS;SNv8Qsys;6)DJTF>U*pS9Rx%w{4xcW0{u7J+n#Y-jwnFHW z6@=zYfk-F&!gEx>{)>wUKUD5?zHM`D@_?dbC{G-1pGLc=VJTZ&jZ;S zp$wo9s=0I)W`gX!rW~`)|H;+vQHu5bNlMUvQr0tuJn2 zb9sMhCuEehCO&Tj5BP+w9gtuV#98=d!ww9|TM47Pe(xX)<+HLy?I*4g#n+>t7wpWw ztuNU}h4BnCI-Hgq3wPH7PGD{M%f9f(@CuBB5{Z^iPflP16iPI6&Q!~CiYIE5zcKN4 z3`r5u^e|#L>VbToMidIIr|x5x2lftwo3^k0Fv{Q$%XBZOE`A7b52_j1g|AS|ib4^9 zLq!DzKZE`vu&uRTtID|J`JGxc63Sfejd!Zj1nTava1L%)Jo>sh@lJOVHF-w$MZ?1V zXOk)X@5z1|=Kjv@MSVU*(A}c{aU3;$5dd*Ua7$@HdyD8$)lA~y(Nq~go-{xO_d=WO zyd;j&5X#I{A$ltbP`qXJ&G{hvmUf$1)f5t+e%KsJ7Awsp7s^yDu2_8S>uOrks$A;8 z&7|({m9x*6{p|c1ZIF~{e1Pi!-!MFG9hI!vjI>zpof8C2ayn@@0~3*$7fU!!uE^=u9>bYT8$v`2(+fPoR@Z_j6+I}1+wG@OY4Wmm zBzrt>RQrI$a?#My+p&a_KvmYGE{Fnt#POc4NlGJRHgZPFO6M5nbAhStN$3-sTt>1` zv5yTXZ7*Xvy837mG32SA6Q6t6k~wjo{+H zGcNM!T88?}J97VivV`Mwa@kfPp;Im(*_5HzUCE@FB~d}46?aOp`>QLx_39i?EjOJV zQw_P1eUbJml~TREd=04h)rr&U9jJmVw7pN!exxs^YZjE(6kGZZ#k6QB ze?J?$k?Wj4hoYr5AP<3PiI}4!y`bF-2?ELZAqsyTT1yVM)nI(2w@kXT9_>pOvT_D9 z5NTvLg%_7O=4gI+c7@>CwXo-tBfyjp|8+O$F<0&zKbk3j|X@Td>&u0Ln2 zEL1s+7e7|WKayW+t4oL_6nvcc2|#vGq&uITuOAqogsu-Lli@4&M%o-(Y>Zhw@AMJK zbVDgOBeuBYu!UD+c!kI=@gHq&XmcJGg&;9jnNZ zvA@I`r`3nyJM3pgYt=tVwq1T0t}^8@mJ}mk!vErv0=d1(XGl^VT|!oQU-Nqtl3esruNzOnY5hHf6HkxkaY8R8Yyyl0oD3h9sPhGPw^JpLgYCepVB}ZDm=pYEU?qoNR z{e}8fM|ZE5(z%P$c%~V0iF$M|)vZ;W*Q zkO?{RR6wdQQ*GIgr^RTwk7XD_fTW1B+)N`US0E2mgSam>wUSGKO@F>ya$!?-==&Rf zhg;s^#5)1#UCw0LG4gGo>R{I(cy`5;jEEBSRv(Sz>O|!>iH|&k6j~;q@gt1lR0Enq zE3Hs>Tpnyd8dmmzpJ_@9Xsb)nq&@bm+kNQ?(w%p9n3XSzSZK={b-Y^Y1CE-gqQUvZ zcV7@*8^N1LnjI!gsJc*T=ilzM(9(SAGU1_x86ZzZem>afJKk@620LsZq5=)ZZz?Rz)%5R^8GBY8!a!5`FE4Dnb9 z5mta)#hUyGn`AOnU%;*QohdZ?{37zt(vBxKj+{ik~rHRr)JM&9;d7{1b}FpZ{Yqyr||(u zDT!TNG{f6l{s{oTDuRH(G>cB><(Dm7y}eWy=>Jl1+5Bn_Y!Y z5ff=}1vGH}+MEB8lq9bZ$urQV;;A>iYjn9ev<5+EZjZ{d&p)mNmaTw>fT~+`OVYb2rys@ zIF32X=J$vsXTu8_8k%M!T~|Zd*f0wD+gmReK+>bV){xQ06_Athbgn%VakW**1ge#19Uw(Q&!Praum(J@3Q zojWEF6}hWUW5|@E#$epTXN(rlG1DLEm@@%l;gjI!^>eS~?x{bZ%FNfTOmA21!*O(w zL6nv3WAiWsgr^uTv$e8c^TDEO>pmAJew=c8ykk(}^)&6(Z8@R;<_9vCjy983Ouh2; z_S#1`o874JEgvE8TSd0=fZsPFO#TTmizlKwGV(f7Et8k>s}EMigWS)O?xb^PxkTEX zFg7ImnK$8x;pBFk`4CrG23J57Y7YsD8I;A%*Cv8f|1lAA0AdeqG3Qun1`MMnoCMO$ zUiOW+^|>u8xdMZ6E$)E-Ae?c5)u#9np0WAP<=PuX5BvUl34pG2(fj$Idx{U}Lo`M1 zKP~V`h8NHSd}AU+B0kb;@Tl|CA1w#oQUjl(cZH6Y+s0fuWFD-g{hr*HuU=}L@@-)Z z>%47zsiv~swk6b815Mb>mbK=Qs3mD_Z%@LPHC-oSM=MYLMQ|H_bea8Feyj(LedD%O zfZ|e1v0E&nOzN0$fnW3ukR&_qsWb$df(6cYHA~7|H+L(B`J9u@-Z6~Oz|v#S z-i$cj-Sp*0$>tl>a&&VFofWHRoXgovFPC~T4591{E=#PUI;;69=it*KL-DQ&Pyt7U z1#Vd_SDn|zAA;yUZg2H*i;Rm}wJl8Y0)A$NuI*vlK|8WE?3x0!TqU5?jZOEnJ3NiC z#vQLIE@mIR^$(vwo*C}j2mOPUY~n5~Zfhpmv#vfznS9(mE)_$@{jKF2F+PVTovd>X zh0HawYquo}9*>_xpod13lV;3%7Z8+8@kqJ7)sZ}nQD9_^!wMUq{kiPbpN_zy^135H zc>W=SouW4y-OtG>>8Al^t|O6T!MEdsB!^c#$jus^U2j?dY4k==%naOC&F6jejDLO-}{+k7=Dx$c_ zRDS=ffd|9r-jg0lipw+}T%L^`q<$a=RfmRw_Ydz$n2xsVrso=C;zSB2U;lg5Pi)$j zKi3A5h*h{WKc3?G)f4msNM>P-La-VC0A+X^0MFHE`RL=w>k9c^Cj{I2xYv@GS_~KL zuj>LKSIby%4Ckxs{!Ri3(l1hEn_D?1mJn$$&9P3X2W9FK_%_MoY_A0i!8FxXaW8&v&Mu&yq4A(1X@hic0 zlGD~0&KS6B1S=)lb^H3~a42gcrg^>ThK5huYd)u9XQl739K0*5bH!>1lHd6kGWWD^ zS6(BenmMQxR~6-m@s-0vX@}$}X}>KY6RWz(UslX874}qh!hJ43g=KShh4ma2yXE~F zM$q(JbABiLwiv$yZ$&>8;%F*)p$b8BH*7D8-n%Ig7^CJgM;2Q*)LFf<*pTFGTx=L5 z%zeUqyFtN{uJ$s=N<-&^^{zCBGwy?^%jhdJV7aYqTlwlYlkd`VQ-AM60`*=Zqv*1? z9ehV*Q}e{uZ5ab#e4FL{U|;1Dvucs{aYnwFH8}C70ExNW^F#rzx@|?=RS}^~61PH4 zBw9gGQlS&_AH%3YgZ$FHT9zyWq|+>j`^T^6CAFF5?!mQy9b|cdeb&_{*uVIe^s@@e z$E<^q-|vZtM;2DM-uT1Wx&@PVt@KI@Fni0$NHzfSV6jHPfJ2Utgx^(^NR% z#ukAdKLi1fQ8pPzm(E1Vqs;Ri;YbiO@z|UV^i#B1_aP1VBUhXoBf5fWmN_W4o$%S* z2EKaEHmkZ~U2yp_$vD=7Eiiva*s}@F_q{$U%mz~1dzIL%6*(SX9oPWo5|j6Y97=?0 zu(au-K8Vr;jv2Zl($$QR@H_;4I^4zL~{c;;$&k&W@jzz-$cVu>LZ=$jP@Sb;G=$33;HLCIMfUQGlB9@EJj+B5NfdT7^5JG~ppj=_oJuQ~M@V&+0QZ{%VZ9T#+1kub>&ETkmOSwD*ys3r)y+f_Y? zRpZ0;`cJqQ1h6^8shKpypVED1QQf7_d0yt+tGMkZE#32l{+l{Ozb=77JeyXJLyCvc zZK31K+l#=NZS#GjFrJ0=|N_5}o;t{J|BTQn0o`MX_MclXQpp{&8>EVhc00tRD_j9#ke!g;E+kuuQl zC|nQ6Q<97JAWC@ObDRiwSa1q?cLAdeN$qiihstb-hh;Cgd^gT@zt|FVo=0i70uXpp zoykF9TE2U9>606jrr3v=OS8|N=nJGlsI_I1)Br+YA_s>`?ARP+Et`C*?3<79ZMqSt z$UN*6&AUnZ*84|rdH8>M@_}|eHiT?iZO=FZHS5vaSI&qn*;l7Kg9jV{VU>^K$G4U( z$ln)A*}7JK7$K);AWOz##eMY(Mnp;UZ`ucWDC~nM(KyK`PsM)MY#V6`L&O_CARGM4M4Xpn)yO*qTPY%-Kv_Sl`hH)Xad1^J)a> z>w|Oz@YplSDlh`Mi1hsPxx&!EDu}ann~vy?dPR&sBQBpAI}j~=5f&)`HcDnAwRF?glATVgq?xaXBchwz&o6dLIl&NzLusM|M#Zl&?gE z*5tNMI1Jmd*Cdtz&B06@)8irM(KzeB(s>^=nD#(E%J z&N|J{HKupnGtjP;wk$%V%NPLL zzsfJ~`pcrn5mSKQKe+E9DDucgyq`zaD(1@^ z;%o=<$1>xjy`zv9PH+W)bd^rx=@W#0;OLT*i5A?5ZGjW}rKw$*!T>UxEknW8Z|h&=>)8RyUDl9n1}_uIKgCH0{FpZd)F-bjC&Z6`36!vH+Ey&Y zW)fhOd1?A9qYQMBZNam0%EzQbZEEbX|FSdDCgQK+V^`HE+;wPf{?W535QCU+*C{YK zZ*&Ag;V-(h%~x5o0TKkXRBYC8BYVMGLhKQDM5TL759psH|J6~4u@1naeZdOdXhy-Zo401XTD7m${38^iSU+ z6@A!3I}c&=AZ)15|M!92k1-Jj$rV>(_7^A7kctST7xrg+N;h+#MY2&6DYkK8NJ*j* zIufG_TL6O(6WduK%q%=&Cv;KAH5+6F=mmvD-475s^s`PL?;{hTcpeP8Z)jhtP`UgNLNRtP5I9k%W>(0M=kkZ)fOcw zY2l*?!Za)%vvAfY@bh|g1R2Lbtj1bmn7L1UDsiilrYGpQF?er+x9)O7nIMl`1*D^{ z0k}huDz6jn{ssh6rQC(~n#0n?AF#M`=$3R^*CGIhHc8nZ3~fJlMTr2Ar%9d`%_sT7 zhk*Bsvps01%qjDA;p=P=Z*G$1I0&uFR(ZpF$SR(sIZ*z1sD76EagP5bO+_Zt`IK?r z+q=ULW0o&NqGd5-2BbuAx-kc@oR)|{y=D(Pt$nclsCO{Lr}_KMX1dnzTD!f#3DN-b z!T#L92SA%QmI|M}Y;f;hQ#NN>pdp2g8DLN?6K&_A%NRFm?52f!av zgh$k5jUo}tL65lANB~7f-F85Uxiun;II0wGd*lk)La&KJB4OeH(5`@X!u07!e`Hh! zcU%ByXCrD4k$`ehHUP;I6`6J8^(n_}%zuQ%QW1#X9F#tUKRy@A2g>LtOz$LLc1#Li z(-I=lO81j5yfm#4-%asjZDA$c{(?(@rMY9~7}OEPRv^g*X~qJ$brRwNHTCv_i^{07k;^3T0g%i9Pb{?r6to!&nQ?z|&) zklM?Rzh7}CkB|;U(hh+bmvV_(g_QUpHh}E7jBxSbu5^w zye4V95SJVF*$0~QHLv`Nm|ft(2_7i3KJjsc#EpmExM)~1VAM_beEV-#*N?AYy+Ae{ zLm@LGOvTrjmZQUlQN@>l)On!WVyS zI?wXcD*Q5m_^V{oHq9cZf%WSwG!1wi8Fy9z5eiL}!&=G#UyMmB=*4FoYi(10QH{8E zox6Kvvm=y_>;3veq^bX(7ww4LoYMy;oS<4#=IFp-NP5h(1Z?xGME0(;Jh{ol?PPal?=XTukTLMBI;y=U_h?ZBJ1p{>Lw0#p;9)T}rL-$a~*cQp`ybTmR)9XyfDkQJ_PeM%>A3UZ+1=-zkJJ&*^&H!HrpN=f59g_nE9>VcL=NjNGrg>9-Swr>D0W za|5s86XiE<`MB!}PA{V_{7ZWK8Z#ILrRURX)^tB_#@|=SfG1|@(3iH+xThO#JC|sPBp4?lGMPBz52#f^2M2rL%FC1>#*kcl-r!@hui zNbPYKcWMWsovHs$zHlV5yCdH{_t5>{CUIlUXZ{7Zp@>x}3Q^Q9(8Y8%A0$bd(GN-D zlkL=4y1#!C82v9E#nPQg;Y%E{lyd)Z3hNE=$v1P7GiSN9z|W)~;)LT?D6W0+_re-K zSPFjn-{nt#KK>95-gR8O`2D5Tf&s-H%A))?Y#_4iJN4+^ar@OmeNeGM$eoDcSAhO+;0!PcH}`=?5o?Cwyio9=@j&5e!dB~S zAq#cf)g3X+|3jvLf(JIIkj;S5D;`lp7HT=SxMleN*_ZEB7Q%;ve_mevj*NkXlZVuQ zr&em!NxzCY8s(%A@%4#E9wCHTKU9YoLTaGi@pFJnZkqpwX$M7)>!WzQ%g!x?6)ZZPy&T5q-+K@GBD)Z(2J0Vtp_U1+1ihTiX zm{=yl1M%DNQ5|^z5fOY+=#$5kN5C-WU z*D=4Jep|~*Lf?^Edga(pKmBopR)MaWHDj9?H8&PNAdVN!e7Kmg%B+2c9j9XqzE$a0 z#Hr#=Z60}&!bg$#JQG^;u@)t{C&V}1cnDkVK``q2tD^bXp`?(Xe1rmXu+2!b(_hI4+dX*Mr0OjKJAiUrI1i9Vq=gy<la z)A5jY`0=xSwC2?Tdf``<|wFX<>bRZ>2kal)$tEa zJ72u?CO&V|2QQ_FmUew->MsVvDZh{Y&`anD!xh144g*R5 zv!ZSl0?0GrvZ2?+)qGbK&qn>+3EM_k7QDs)KZ(%%a5Bk9K+yOOL`-o{ifX`&t=2^$7g#Co6Y_2|Z*b1lEzz3ws3x{?0N=l6AN}$1 zMvFV!4**jPO6fMc-sbt~HJ7CezI3^8i~jcnQ5cJv%B)$=WbT})VHo~Tj>EO!3v8ju zB1`+1wDON2jK?!Uo(?s2ecVCu7tVQ)Al1Ic3xs!qJWSA+VTRPL|CLDST|W!H%D(qD z|5sl}Aa~t+-CbXvXtB9UOOR8n0QKur^HxP6oGKo~>#%7T1{m=%nKjRD=eQI9Vq=R2 zNJyHP<_g$uvy+hSqX$#DzEPW0Hr@sqGtGa72pK8B$A)<0qd^PNfa!3PR#l5=Vnpa< zmo}bEJYxo}h!&^z2}f1nZosdiI-1MP7-d;fpM2h+;ySDF>%Ym}eJ1kR!?GHW8HYO)crWT6Juvl9kHQnEzkEKXl2$Qz2Q zChmjPE7$3o1Qt4PLj7VU2iMT9Ut@c5`=<2~Hw%3L%yQVIhN2h0;(HT}lq)WM2X=KJ zjrt=iVQp(W6v8aCT4dL}-~A@mvAU0IaMG|%k>P^xtW||2gw5IrkZwKFEnS0Wu?Zvi zi&hc^2ehSw_7T&Rn+0Ll&Y-1{;~7Q&m0pTaSCv3K^PPR5Ps!ln$Jknc9P8tbh0m5& zT4{ubQ!!+tT*rliB*)fA#HDO}004Q=6C*wWw~6lRreAi_!Y$6e8Qllz2q`#Y{m^}c zu<^SfaN^(=VXf!X>9bMDk=|=Oq-k`=uTKFHEFf@p+6PFh{FF> zEcgFQryTfSV<{QEKgj`39bCpSjD5=A3I~agIY$1aKl0evjS~b7_>K*twn;n47e+zkL(>o{B_}YGB!Wh6<*j6N-uB?zwD5irK z8_BB(?08muwfqw?~Got zz<>;PW$HBL*BWW{=+O=BoWkxG?wOXHYeJAI1fUx+6k6BbZ$NAEpGqOvp-h}um(t1o zO-`4M&>hYP>0Gikp7kntxkLD4uzKVH~RN=bOT znO8WmwU)qr^+*2S*+dM3v9#^*GoS*cZCw)0rqaes*Ef3yl z^_`}53^CcYkAg%%Y=5r@>iM-e|RqdI;$=S29zaNDk7 zLOtZCH{HtNSL3ovCffS(hAR45h=UYBpdOWvcW=A_Iv+$DJ1VcRo$!xwv5?wQdy-7d zUjTX9v}2$`Vft>~9Kw8V?fdf+SYF#Nj;D@B3)tmk-4CdRyQK$A-_N zJsfU3XCiG)%%Fm0s&uj0Y?<`QV!n!pL8F?v;m?ik8(%#Dd`hKf_+*%Vj@R_?%Wm1r ze`YV++wV`@kl&5JW2@bX&Vx5anfbTBM)s@|ITlMdUvJ;MR)+KN=+kFQwl31u{s-_A zcKa>_QZ92Qhc?!=aWc63WK;I(%UMM^IYqK}gkdkNo`5(dFzxdGqjvv~T@rVAO;7y7 z4mQ7V+f)4`?$jT*{n)yKZY-#$dv!)U{`85Lk<%z=%&3xP|=Il_rLa*kla=VNxcY?s!bVPO*OC!B(;NY z*N;*x#1aSaPCaIR-{KRAOWO2dCK}f;KKAwOl4aa1ffAK?(|&xg@`N2SW!y1JPyy@j zfxoij3w?VZeQRHhwBmE`-yR_f*p~GJ1umTUY2k!DK_@JRPPl(-oFkCQ;tHgNyxfR- z0aCDJwktwW4uqIwfEK^3Q4hhISFp`*RPDy=9UmaAavrX#*xqp-YGw>5jdt(Ms>5ZS zKau9f#$F`8?M0|dMYH+t@d@0tDa3sS{1wo3b^AWr5iSkkRuV3Cggy!kD&=nj$@8Ws zK)H*|mej|Rv4;3fn|1)`ut3Q*(oaYHA4SCLSCg(-RqDNlMR~Fxv{!s}H%K*kyCq_W z@1NgFc}l41*AW2tgZBi@INv-lxIUI5WQ zsnRzh?TWibBJL#kDv6lFjqpZ?;MyzrZ_MvR5PyNbtY6&7n{T(;Z1EcoJ_ z3pJgi3zrvN(&mU7)D^dc2@dm28^;9Xi=Z?6c@Pj@#U1MM{jw|vc3}ir5Qi4(1W2+jFKZ3qc%T~;R-qji<`_p zt>C9`ZAH|Pln-KlIv{-YPPofEgvWC7IevGsj$5F6JbL)+S))Dw#SaNGlOiCfhZd$D=9`+O&u#2l9=Z%mxgWRwy8A!v4B>(v*&#f~1Idwp z$uKT5!bw~I|6Z>D1#bV2j1RK=DWekp&p*VoLdLG0W9zG@(5F(cJ3LoFt(8zi8PEhb zqE6P-!ImX8^fzyVmqMB%tx?qA_jU8honNL+6sIkE#od_TZGf;5vvOMPpSfXIS`4#*@XATC~s^GI8KguC%2lvZSIPTmnbH`!Jf! z0MKQlbzTsdp$|s`dZxxvf|Py*(BTve01SaMEj7-99RSL@wcb+mw+0bxgjQ2tOg;ED zc$XcIT^9B(e-0xe${qiR7N(~1o8mZJ3-xXoMn5mT&sqUyheNJnCeXY@@gG`f5))BY z-G;$G8H7lz2K*SG0CqPx>pJTULUo5(;LE3Alw-&(5+H7;2UyB>-~z!4>L{_bc!exR{Gpyl%dWAEr7cS?(I&3 z3SHkuaBpQMX1~0>{i|sA1*Yhggwl(SBybh1%}V@H4?Nfjr?;e0prvR+ymP1pXm zSmW|+6{g38QkH@2=)&YYB5Qz2NKqgGQA89Z+ zB#vA8yiOz;^qnO<*Xb2j!i=Ma>_OmgkwsY8!7$HuC~L>iW^o|iH=H)A9(Z1_-$4** zB!LvqaIEH`UAN6A4$KghD{v?RQbV-w==#`T?HVbyO2*>X5c)#*k8Nn`8*%TfbXlA^ zaGZ^lIwgDc+i*0(mg-|&gUQ_UKo50Y&EWapYMs#?%z#;(d%I3nNETp!b?RbZ9I7*F zIF9YOKj|dn8#Q*v1=Pie<~#&Ctm+g^A~zfk;)|mX{P;KT`k%qI1L|#_G^3p_E)tIf zE`81EY1iK6MXaLAMyd6OavV5?hfUEx+$_vQ&nO>4cGX(5_vC{u`0Hdn?*OI8#a^MX zB$fQ8*bHFXzs?;QK%`T_FkN!*`aN&N7=*eutx`01Nkwo@0GNO7T*~K30-wn_$ZT)E zSYTU^lLc$q1_kbp^3nnqp<5dTM>JTfAakJRrI8!i^5dW5@q59Zhg$CXqK=Cu+)>Rx zx;0X`+|P0#jigM9CRm2P(J(SbKWn|bWPNzenYu6pkbcw}j_N^s4d77iI`3cXlyOjO z{9PsgrC`92Vit4+xNfF$&MY>5J~Nol9ejA`*=x~y0A~own@df6^+@j25m{gve9~s6 z{uwX?1D)5Fx}p(WQAcA6-r%y6nK(e09ZBA;4O}dPK(%v3jNZ20Lb|+vMfzS+^9|2e zXbOLj2X%>NffNQOr2oz=!hx+GoH#}G^X33=_0&#ZjQvax*6;*T`>lTnV!

0<8Hr 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´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
tHe$;J*5N2Pt&zxCOp3&1Z;o&r$wFHB2 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 literal 0 HcmV?d00001 diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/proof-tiers.png b/packages/docs-site/src/assets/content/docs/core-concepts/proof-tiers.png new file mode 100644 index 0000000000000000000000000000000000000000..a0e5974dd0f9ae68c472c80b59e29c2a903d035d GIT binary patch literal 165241 zcmeFZcT`i`);_F=iWQJ5iYTZ^XmY566hTC(LJ~@7D$=|3k{~FeR6R(ME*Js{z4syp zlx`p(9YMN)bO`OYw)dXzci(s1BYyvV-xy~M3pLq$t-0oW=JPyrzqqTebmA!6(S7^& zow#%Rrq;fFN7VQ2J5Wk<2z;eEn*Sa6Z@-h4lKj4`*0WRKlbfcxcg)n(_QAl%H2d}k zSni{Segynw1AoDUK3+$VH^_0(;ehn{QY?l9aOqFBpCFdaW+M39*H zp5L}CRSe5;*`4XD)Mi4FXz0$%J>IvUiu%_dv_GNtTuU-vN!#P+{(7w|M`_eI&j03X zk5W_PJo|aqYJTsMi(KK4I)GB4Uv$Zi5B0hNg7>j^v5Hr8k%FZE@&5Iaoioy|tSa9IiC1&z2{#Bd*svQ5dh9(_5x(uTZ&~~Za zRJX6%FpH6Nv5L9w@u+MxR4TBEMt)^}sG8L;@MT9#5zReAhuVXd{Uwe>cm-veFtyyF zp%H#rP1$kqbBYp9MX*xj1e=J3n&4N7{|vnU`nEs!Mdqe&p^OAmL~^P|qS4kHFVr>*XH_gVY9q5yCvtB5-QNC>H>^SN z=4h*tS%}$2-V4O#_0cd~!#OWL>6K2nWoz6uj-y7ZW5xGs{g!t&=cD{nN1mPY`1Z(<(@`qJ9st2UMJS!Y*vy*%9S+@S{FTAm-0 zJ#qSvi?(^6E?fQ>u1z36sT^hS=#J1; z@@W=#uwxxOxVS&ZTjTW?oHhBamnT0ntxf%29NwE{SikEB=he=*-Dh8oMpb!x7;>Jm zEzo2WHd7UfE7+VX$9=5}z?~59znWP*==n47+oabF2ulWzM5d{l1GF~e?$04m{5J`d z^BH0`#)vRP&qi_#nL*?Ft3xNxM!V?!-m2$B9$VhdnG>W^BKyIGwg=KQQ%F^tbFr)7 z$_i$(%2Q>~6hs9%-nBQKPl9Pws{91&)$`ypOCFf%0D5hJCzUODYRk3Xv4K`vq|kYa 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 W%+?CLYV#NT=c0&|aN_wZxBd_FvP+Wy literal 0 HcmV?d00001 diff --git a/packages/docs-site/src/assets/content/docs/guides/verify-as-proxy.webp b/packages/docs-site/src/assets/content/docs/guides/verify-as-proxy.webp new file mode 100644 index 0000000000000000000000000000000000000000..35c03e48345096153989be205d2157bb0f766a36 GIT binary patch literal 267130 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 Xr+4iB8RlL1j6`he{QfY#M-0kTA?GLQy4SY0o?+ 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
r(clfSQvET)j>l;>SIP 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μ2X&#+ti>s9Y^74QD16u8*J+S%9?03fWiG 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 literal 0 HcmV?d00001 diff --git a/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config-hekla.webp b/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config-hekla.webp new file mode 100644 index 0000000000000000000000000000000000000000..4a8a0bc7fd2a7eb286b180569789555542d17f0b GIT binary patch literal 331187 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

5<((uTtq` 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

?r+4MR6Y*pKiO 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 @&6(3%cBWdZ5R%YM3F#)v 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 literal 0 HcmV?d00001 diff --git a/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config-mn.webp b/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config-mn.webp index ac172ffb6becd1af441adaa43089a8b327ad331b..74c2fcd1e4be2fda2a365bc77d1ed22f714618c7 100644 GIT binary patch literal 277469 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≦Lsd}_D1 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 z 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 literal 149029 zcmeFZXH-*NyEdw*pddw*A{|js5l{pP9Yj&2S?C?+odI?2(2`DI4 z=_J&I-a-fnNq`7^lXveu-uJQmI^&G-opJUbWdyR;Tyx#^x~_XZyRCDBk)Dfw-@bi} z8aJ=q-M8;h_`ZDygbve!Pj&{1#K3?1z3$$)y05U4XJOwyfqfd+RQ3EVmd5C+25ixk z-Ro}8pWLXquh!E3LW<$$opV=WN+O(r=@T{^(sDT9&5q&tZCEe9R+cxbOFWtd6iSc?tdTSK!YN-G1m^wNG3wKH?8w-Mbw4 zGV}j_`QKanfANOdit(fMi^4*7INARxxOtpyTuZl*?72(Gtb0NxDek_{-nMq|9%*XJzddzd!N0){EXxuC+Du?cdHzCB%JTS=%uWtLx^+HBZ+~j4V(`Ous z?+9J+^qP3f_UFZ&co3pDv9dH&I`c|X{0Q3;*rWBufqW}bFVeqX@IQW1i8_)&AKqkg zYY?LWea2(zkrnzEKgl4-@(kQUB2~q&!}nAU5n;$oVZ_SeyNR*@QZm8f>8>PmoH7Q~HyYw%6}D zVe6_d!x_KEUoifdZNapr{-;-y_K9I{u@$e2GrdrO8;Nf9C43bXi0#0sL?KL3+s4(a zzGij)B}s7d&`H>mwqi!9^%u@Rn#+;~O-bWK+8b7`sI79&d0?x+v89@X;zRoxxv$*p zcq3-_^*LJrdL>4U>E&@JOf($b#;lvdG*E%0f`RUpwT~U*$6ZRtu~Eu9 z{sB{wG6msif=eRVGUcN6BX1&Bk(}v7J%W_Oa+}|`asRiE{O3=yr>%IHpmxP!O^C!W z6ryMWSME7zs-N^?py>eZ(U_j}8xCd`q{V@mnRv@L+vE|6DIymOrpVIrip%ipRm$!T zrNQ6~A*F@@QfQWTqHw-pQN`62;2Uk=iS0*Wvhy_!TZ^LSOv>g{+8gVR{VB-~iXMt+ z+ItOoA6yRo3_J#f6qw$2FA($)f57$d3KV_8=KM^1Txp&iSejccp<-mZO(gZ3|2d3_ z<^x>)m`P$$!;T5q>GNE@&b8rc%!+!Q%DX=!x=ksli7;;4(JBvPV^)$pdC(@)rX>pI zQyW=eb?NXQ<5#WfCkPKyAWL#Z)cinxJlj5)=wkx;nCfSb!pBW6BNcHAecAFqhv_E< z3@zi*qm|^`HOd;vi}^*J{$O+5;zf(9}XYX(7xq%t9!TQRdBS5S9{&aUpf%D*L9x_9e zS7!N_cuT}Nhm-*OW_m_`rO~_s#*wnj#|F(cGRQi@aC!c!Gqk+WKrEOt=GPfI$|N^0 zkS~25Y-D6h4{yWfEO-8)FoVmm5%YtLWsW_k@?RNM`r+V)g;kT!jpph$XA?7>`m#PS zcfl=Cd4kBTEXm5Jz5k`4)!vsnUA4+Mdgv6pJ>%V!=a8I&|{L63Y5)2aB!m)_5;` zvhiCQ6f8oK-#JpBrTH===%Cl#c6YYd9)B?r8!fhOYOQwu1Ou+z3X*|@UB{d99ZX$- zm+Z{zdy-Mx)3Lf44qYh*7ZF>kc_h|-u;`;vbg5{xA6=wDhjR`dJBnogD4PxLY0Mndhxnv%h0(8kxa$7b z=baO3VMmX-gd8jLneYCbH?K7LR457CsL|=d@6{Bx`Ld zjy&!X{5kADW6{4i1D2xV2zg*4T@cU9#)Ma@Mw?6$DsgXo3B$7a=#O@q0V|*BO6#Bd zVFR)ib~dI$rj&lP3VqP8CTEH9l<7aIC|JptN`ZKM7!aOZ>r$@VI!JZlI&JCoUD{y7 z{KK_p1!ng^iUV<)ob`F#*daMCuH@vwzibFnWzv0cgsD-2XZgQsnU3lYW>B#Sq&+%~ z^h_kBb&LKepMp_Ye2HJ*K12Rn*{W{cSv)W=Ntxq>LXh~vA@D%@!deOAJUhT>+TS{)y!D1e{ka|q89U3u#gwSf*af=%?zz?mLrQ)G>g8`n{M(*l#y#(1k2d}AWKx5ft_v2Fh?K`@*z zFo#qL(o#FJ68rAhXdvAHv@gvfKb^GSOXCXiD%zKgeC7U^!%pY|<5%w?w13%Gi%<5m4 zv2^UlW7icxgjgpSJ|G(A-aR9Fx_>my$g9wTO^En?|jX zz(pP==l$>3)+$~v)Z=@kHn1wSsWcC302v@T(vY2EMY6o6h(e2G8n`Q|0kiIc&#Bq?h`-Q@O`9F7ypTv)^Fz!{-8~ThbN5VtN zKFYQ(@#fp9BJVCcM41JxehtvchX=Y<&#*gzq?o7lg;-B5H1qh%c5!RN74IOp1*^RmZm=*V9zDe|Ekgs0NkDBF41%ZS2ApXz4_ zJ(ApK>V`U#Ebm9w$K0}H^dr4@zro}2c&~mnNS)NrH!$7>u_k%o(TA%~==h zIexi$=%d|>{ycqAp@ade4X}n-P!Lm7)?P@|7t@S^Qshb({$7^W%k(I@_RZP~4^COn zjQ#@SJ~`dn@<)>^qc#U^qBq07$nhgTFb#wJBm$?BeJse(lO;ZQ1H7OQCrH`m>VvKn(BYT1@EHRu0V?{{Hhj}nu{-vPE2I5( zMYQsck$COW$4~VQh!#iORDNO2E%CaQt3z%L+d(b7R~{sc2Jddy7bOQS<{G$79bi_t z?Tr8tf(3pUR~N8$jo*82Y(0>~+3>wcQJpiYVz4`J7L+KQ+#iMhSP&jw;tGiXWmo34 z?$G%qr)I`*5~M*u4wMpO>kU7DykN`dOp?9V?*QtmlLHN)?v0Dpk<$PjuLB7$W>M!q z-|qBjt6j9n2+6*#>aWWDw67k;by~);TR_rmK%f?+2jgm+b-8@KTvo`Nih?ST9EG|v z-&c^&7J^=Dx_;@8jlw>fS_=Uo5C+d3Lqj3jkR^_@b0(0b%F|o>s=g=6n8sB(<=wAz z!-;d%K&=XF7LCAbiPl4!NEZ{`y2U=Ap3@!WjLB;#GEnqe>_4|I-ha{b0G@=$P?xiX z<c^Spa33y9{`rvwte!L>CJLO2 ztP?M4LkevCo19EE-M#+Ut%DV9itPRUcG#32BYwR%tZ67gZRgUZzg@f7?}*VvvCLqk zsdQ4LyHU%E0dt?pePYc}71v*S4c?F>`f$`hlSh8MS9sjpKj)i$G}U6`>pXmN-Z_rM ziPQQ`fzO;qZVhU2v2+0}<6StJ_pjIrOKbf@HYNv~!3R&k+8J#Ac7wx@82~yO{ignB%54J`E!5(U=R@fD+x4Rv2ViNwTQX&&jsfGgFmi6bca|P zojmaeQ~6goZ~@*vYQb+G{^!Q&@bn9Chx%g4vwz7zF(bf(t5HhdnErML4seGcYrETj z@o<64Lx;n?VDJRqzuiFs++nk^J?(G#)fGhhIr7#;`M=%4^5Eg{wI^|^f5Z`0_JxeH z3-ELjNY=i8yF)!-+vXTVL;sdotHol<-Tlc+L!NDC;-{;JXFB5ND)#;LrO>B=J>75S zEq?MZdnUj$%l9YDbMLeNcfK6*=t41^>U++ts`$ity&Qqd?gX$I4?#XU{#zPV2|1P^ z<@9Quh_l?o)%vn^<6oW8WKV!H*LLF&RBeL-BS8RDzS@KBD_qCU)A0ut>lIm;pEoGD z8PjS0=##~H6-ZsY_=Wf4_Z!b|#&Dm0eQD^P1&kn#&jCH(iweDsh3r&Y0IYxXC79%6 zmX)YWLc_Nvs-~i1KU{y&9>ps^UEIXf0g0{1f^1I5+N3B_d{bq;vdjR8)m!CZ<1|)N z&g1dr*xf=iS^PUpfw7P!Vl(rCQLzdZL3J^%cwpRoXcWMWo?qDvr?J;B0ru}AcTZ6HO5WCxc)mw}CGbjr7a!mx8Fw*gG{{dSnnQ%8-hu63Pf$~ZUYXP|Hn>_t| zuE_H2&%7`m3`oxb{e!V}d-hSAH}55R{Heen@KYPQd0~ zcgf|BSpCZJ1MEX{jSez{7nG4c-$2_wQ%_y?GPygCE3;Is@uvG9EkFrb3_DVhsTto6 zU`(4QIIp=*5~>bxBkiHgN>!ESa+pw+kmCY8;_jNAhkkvx#eNJAMk>B9KFJq5Hu=DW zF$kb58esR4&j;DXOl|^vNHVOOeB5jH+sjC9nOjX^jF~3o&K^3)pq5B)v=yu`OWSii zgwAAFR4?at!KKM%g`ka=ExXRn5c@vi*FcxWkKy>r4(upfp7NE5p!wb?0wc>@@k3)2G^jrdPc0JSh%9R_$O zjapyA4lsrPgjv|*c^=vXwB zQ{U<`TvkFe-J7YIsM~JU1)Rj8taC*^0}uqg={K175Ew>vTMkf?+JOvVX2CoAd&l+c zpwjM7FVTmJOT|qE=O^#!$XHodlbxm!KQ%r=R#&3_9LQara*uEZIcUIdo0g zH~+TIV);YhrJvc|Xi-i&cfqoL)L#x5Wh{Uaal^s0-`?H@)JKGkblpJ8r)6Jut`ksd z_yHz}$`v>41;E?29)4WjZUj4q&x-5ZQh~tmec91wFhY62tPFh1yPAYHwF7_|8hY9O zTMXdK`ZwfWEp0S0D;uGnwnXzwydzb~Fy@emH+X&YUcHwENU(1@ux!^abN#(tk1m?&?22pa}_Ql!rN3z zJm8RfhUTWCl`9_EjCCrkY2}N2bltZiNj?NN1;BJTL;%5t>~0XqEggHv{SW6g%1W0KRSUpQl5_im z!KzCD;tvVdZJ$3Z5Tg$)zQ9wG^Ecm{{`jeuSTDLIAPrl~=RrRo1tj?k@H@TCCzWQKEWAsh=IKoJQvZ72om~_va61xRVDfpBmYg{ zB*R6t-<{@__buBoA5oeQ9rvbg;fpc>Z`X-1ukk)cU?@-w486kmM%t=EhA~4r0<2@G z8-#v9{g0wvm3tbA?nzIqx>&%*Uq(MO{(a-w4}vf*pKDl@a`{!o+Z?m%k84Cg4!;48 z|8>*P&u$es@>!&5rLRSzyk8-Rs-G7HgSJT+(_jh1!X!u1gZEdT*bbLD{QwcL9T0&? zG=oTz`=bH-$t17NV}u?&78EDePkP9{ExdlVdJu<+-Zht}APn4-V!TN2&*=`J;X6ts9P!y!`ZB}i0=#Iy9>&p+@2%r2r>0xy{Tlmg;T+mvi z)Puq9P0H$2izXmA?B=`Q{{S7cQ7~rF5^iKV>ax(A>DheJ0TK?tKW$L*aQG!$qZS#L zs?#3j6ad8TN18?83h02R7X1&ovQlBo)jGHd-~#O~m1FEaoJC-PQF}#c>(z^lzo%wt z8j)o0SI6xwKs_o6P(yr(hspktd_xHbR_vm=o23=eq|vw{A(X zR8)c>U;&6QtDvBFyybUIM6;T%NXr3yc?MXCdm*m2!9YKnPjR?v5%N80kGuRRqykCe zy`ir9+kzCYjRSh?RcEq1U8g~4H((<=olj1Tr3B2Lte$yengQ4rN#NypI~V=;C|?dS zlj$XFmNs|3zS=X^Gc;YLUUNDsAr zP+4*qZ4;X`xJ>ilX)_;mI8}+0< z%jG;En1s1yT+4RcKn(Xg`MTm+H{CKExDNWK($>6CkHwcei3akiK>mW>?T-dL0Qmxl zQHoGhg4l17!dCSYla+Ko(x~JEo2zrTah_i8mvnp+K5%{h<%U0_ZAYAF{Km!u{v5WR zMPNzFvb%l3H~_V001cA?K2pkJC`DpQ@S#c&xWk4$&+irc;SGAn7h!wpHfIsdr=n&6 zKWhf?-`m&0i}TF|Nkx2S*7i5YEUsj5{E8$?BPO4T08vYTj7!7q1_ZnZXhHMzHKUZa z9Qh_IDsd;w_-SN82a=S|&{Xyt$Ys^VF<9f1Utm&xt1P=n$-5B5bx!~nFKu!(vk5%> zWFZLp48sdT9Di8#zdEHapqh-D`-=T-dH)3o|NrCy03s~NMuOrrr8JsX-atobbK1Z3 zzT0o1>c7kVzsHLIu8BPXj0lmzJTd+=oeHq+y*FA^cQop^mh!(|#B|mkQc}oJdi7W5 z-+%Bz$et99{YZ*nx#^(nIhtC%hwlFIo?eo_E%)NFr`%7Q$ASUbE!?*Nvm1+a&VMb)gCJ9N2vDv#{$w+4i8#q>{!ZwTBm)D_^hcH6U*5Zg(a`A#M18Vq3kJEt+}18?6=nS;Y}zQ<&6a@F!QYt2tNPZ zC94Z*)-3?d^)pR1n0odvQmdHmh~v$I&zEFzd}WTb_s;NKQMnIl_5WC-orgy^pZva!DAdo7B30W4r_9gY=+%ZX z;|Di4PpZO(GV)8QQ9?XeI63JTOhzC}CFz#68_N>q_8G=78J8U)9<+AogkaiC!(dcD;HB7JOqyjv#i{?;n477hRm!eJkM3fTz0n$ z8B9Aw$Jwc-yTr8kfNe3KK)&m;9J0aO;m`YsyR5PkzMCOf)5^=Yywuth#VK1+zWB zHR>L0Uxf?5L(DEd9;h6@1Sf63o-J+TYe7f^Z%ioQH7`*a@*gO6zq&PPRN3c>d+Y9B zDY5_ff4*bjeix5j%w#3 z`|Ne|Q2C|EVaz&LV_K8spc)9icJaaVEKFHYLjegi?l#Yg)S%buzUIe1be4A$StYIuA0SEg8%}*__ zIkV{#24m7YmRQibj0<=7rxfkK{L88j@2xuOI6XdhbpJDXPK|pL(7PyZkrQhSw&{;9 zxUC#NA#8`28=Go5Lf7QFk(Sr?;GhjTV2rJAhznC&;dH<(8QQ&l-?Qk@$wX{u7BxUy zTT#1N_xNNWQK;cOqEF(w)&&Awt4MiK4JYwsz@|5f$TUK@IFj-rH5{?CxLbDSdT;yv ztCKkcSX9w*CZa`f=P!|o~>eGHufq5v%g$blDG`A?|BWo>X}}Qgj>0Y13_& z*6W>mG;EY{By5`oN_8OlUUwZ{Y3F`!FT~{E|idY2Ls;u~H~A_bZW0OJgngSZO_1EnEC;;=vAU|DI?AAiz`c&~w-Wymr4m~BR|ZVehiiKni8*$#Z?wNc)ClbRVu z^{2$sXtWG;IWP|MBOLwvM>+$N9}Xrs$1mT6)M-}Bp8RL5efUhp=wiV@BY+dN*JCOn z6OMXk?YVx?n!6b>9PV?!*xoC#(PQ(GZSq}3$l`s%u7)P&O^3Gf0-w%qzz#8b0ZtLe+fVfZ*&S%1xceMUteFi*Qsd74ftbfk>4_q@F>< zwck;EKUHwAyJ@kPtV=OH;I_g;LP#<`%@w$Uda)L)+&J-5X7=bW1sAZ@_gD4ejE#y} z+2y#jI)=VV*nU^PxWobZisWLfiAs~rPWFrO>uooT{nS$ie}ri)3WmnSFUY=9dib5b z8=ekZfr ztLR1R9zTEmj(>{|Hw*Q9xqr`x+Oq4R7GC|j6zxaWmC2Rmsz&&b;vJ+l-n#dL;P1yTd<1xuQ-9SnAnQNn$@^hhm+Ip;=t>FIfle?b5~yc7<-+0Y2j4cM zhz~GTVwNA2E>G$mr6TX#{#vfsbsBoS|9R8S$Isqcu@4i%``^~D{czjc)>6A)iCMJ} zP!Mk}pOk?drkDPBtY)UA3rl!GroFcOhV9No9>1B9zzn0X^!&4}wput-pYyf8D=Zo` za>*|!TR$VTL={3^dvYYWUlnM+V(D8EdtEY8$2`}8Gp+o%W00+59x%Ns@{yGZ*5vEP zR<;12PI+L&lA5uITgR@2q3)y}%c9id0uPPNEnm_;U>LhPMm>#WXQp0=^dfepD4L2_ zPrvFOfh@)gYG4oW*odn@9=Lu@`Nb|a1z7aV->i$Ycpy4m0%cVdl}H;>@1tbWKB~oM zyw8o|(9d)HIEBvMiPPSte>X_1MOmVl*m!vD(t7a}QFb zh9C6>D7!<-2~mR!`YJppDq4=%pw?spZd)W#Pq&%XP0_)PUuCqEQ3JO-ZE(6Zmc1+( zqDA>G``iou2AJqsfh#U>>*$kgEF#+lG6BlPx@DkLEjtGLg?O2cRT=DxikGlVnJ*YB zTp=-pN%M@>xR^GpExbAyW<7w^cvM)0JU4mJZMkI1EZ=h9Jjd%N<>7~Gj{TfqLBx(UAV2vGPWW zvto|p#N$Q0bsWaD;=xP6+_def))~2^VgSl8Yn=5U%n(6&XgQyd0l#|trlVy8rd4Xt zI~re&D)(NW!C}Q(VfgY%yZB4f+A{$8qWtzJr1>=J3{XfN>jO~ z;RghX9gx0u7FXgBwPt{l3ecI7@vR6|pjw-e+hPr1fpd!~*%ZDgFD5GAP_7eD~1(<4Om5agpPRdrN_rmCV6fv{gqH$XM`;OA%rXd-- zYyV7AA%{bXeOWb?sH1@@CZpd?W#^f$exMO;@Vc&lJ}~-{;*C*|>Z2=%dkZZ{3}usH zDyp9oL~eK7A5zeI389A_%W@}0k{B;Y5-Nh-57~m*@Qz#kyZR& z6k8OO?F6J*F&wr#kZ+*TvDVpnkxLm-2jrIbq#zb${?AT`o0x%dgtYGG167Jyp@n@Y zrYsCU85^BvKc-J{8toDx!oHct6%>iQg$>Rc1JV@qVKIu^zKXb!jiJ8YHPRI{g=7nDy{MQp(a`?hEhvep%m}_wP<{&t)%pgjzT3 zlQ}!Dv1TROKyOJ=L%yQbLag~oKwovY!%Y2~OsPJwCClJ#eRVLH1?DF#$9biLHr!=* zf3B_7@%2OX{j^M0Pof>r>)?T}O=0h4&89ES9=@`pkbLajXK>)D61{j=i z(e~Qx{@y$i?!ZW36-HEptpZ0HCYU=kl0Pg{ z&E)4(WGVXUG-gt%nYcZ*eI~R`;&NRoOm&wrEpX6wptP2G!rfQ#lI*j?$}ZH<_Z+PBU}#Pkrc|;P_OpuzYuc1E z;}4$Hkj*u4!Mh=tt=4uFm%~jFVO2wU36$EbGzrO9f!E3zR%_W~C8U4m!L|!U<}Wu9 zdG1h>a1OcDBm_~qp-T~dF`4!Yf*T0Va83(kAhMfl>G>tvUpn+5kg+AVIHJ_;cFqLT z&0g9j>$yP?HPL(z;%4V2?{u)Omu^?>&xfZJuUMcQzWM7G;=Nqdqs^#;V0`T+7@Ep} zQI_-v61h81j^XH>4^=^;0PU1JGsuBu=Mw*VA+B=zCxT6HQ3yT)*ntn$kQ3l$~Yf^{0|)3P30v&G7(kFKD<$S>$(n;s1TwzLf(y63r= zYAZX$8?MUv5rlUQmmhYAvo;@T(K;{*u?ZY|G)$XNuniK$S?((jVgMs|3+!d4t;TNn zCE9Yw?&>Py!2ScYt@AzU$>$7!fFVmK`Q4?NfqcV`Bv~(8FpSb$Y^~Pwu+z3Mi;{~< zO-1oeHXjiPZT7N+y_0z1%|lrQ<*NqGB;<4P$d$ZdrID~@FOkiotMz`PVm5UY5aH>a zB~+o$s)!ZS)Z>`^3iA*YY7%N(%$Kd>;Ooz_eWj7~H5a-v)?13mMYYJpP>8yineix#WNVg_mg zS-CjO4be$aFkY^~i|?`iVWDK&`i;pKndY^=2BL>4_Pv2=mJNsxpWmT;7J9F{)~z;o z`#F!2qyt7^EoHcLETwcI{*18Kw`Pu$)~Vo!Vwc{ap){L~u~Hz}^+AlqtSglh2LLAV z)$imKqRpO}m277^XcpRN&8Ow?L%gGNFV%S1p7`Z)4~JCgH!V*zp11FNd^(Vc*p#hx zpe5%Jg*M7ye9d9xd6gHL_Jc2k&p?}Zjz?Jajnl>1%2ZwmVX#CEV9$bXb*o`b+56{n z?xgRD5F`N(Z01cu|Bn{H7U1)Dk;Csj?MCuv#zXU`a|L{h3~$F|6OOY>SX=;80&zA` zvg-64;!E5WL(B?gEfJCfTBN(U7Z53gbm&ZV*OZ8Ct>zWM}uJEW_oy{_{z=Sxn$(fx#Sl=U@5xcn%5*NvFcpkXM^>cghIP1HEne24^R4Isx6SMz z)PuLAGzAnLlj3?2eAFiK@gyi$$>rEsQ$!@Ge!aG#Y4~==roxe}QO(O)Bht$CoNL_o zx=xa@Kk$lL5FV0c!V*dclBB4q{tFy>_}F3k@G(?a(>|{=trv}_({A;j){hnbT&yV4 z$4JVhR+QC1&TNa)1EQDB@lfWZ@nKkRnlI<#`f3Zq^!o|s z_HVoOM0pI5DRnP05XS17T}I4=HQ!u#qaMj+9LALw34mz_k)`Oym}8 z)_oeNXPmzJ-*&{q(^6Apz87&lS{^F1p@myOh#kFW)JAF!j@4OPP98#r>?EUEoB8QB zKMMUxO!v@G01PouII;A&;^NQOa1uAm8xxfCVSRdYLtZ3qq4_zos+X@}`7lAKF>ht^ z;1{PRXIN)o@^Wh3NU&eH(cVY_n1_@RV(~UCzv4Oy(S32Ks4aw!?`$|PqDtR7&=VDC z&|rqV@8kAA6L_7eWmhQ`Bd%UMW86;>R06%z*bfCf3C#T6;0u_38L=w$0F6FsLg21Q z2HayWv3cii-nvqNuU8R9d3RHHZ=Nq1F2#vy*FZ5bzLypV#v>~wljQss&TDrn`y;#h6;`l63ZvlEI)%~^D% ze6~ixVriSm8+Q~t`VdM_%x_$2Cf8F?$iPX&PC$cguWXI7CSf(SnM5TXfQPH$9vQ=4 zxNMeiiK*3T{fyreV3R_;f>Z0pc5J^|;XG?ortqc4nZs5$R0>73wf zobD!x>rr#>=0eu~7aEQ>tSm6fvp%Sl#>Fdk?I-dv#i%hD5oK`J*=_l`VV_U`cG(9b zepka%du{whMhoeONY+XPn&YPd{ zW4Vkw7?v+c^8v>Qpz+~)`N9(Q>v{UQ`GQ%l%MS~>I|-g3&e=y~T33W&m$kd{_1jIH z@=e!DyI$(DUx)!wjkfo-_&s%O66AWP6XMPB3zbfN>a>hoQ^QLxV06_J(5$ArTU(Ex z8E78$8_yFvS4V8KiI&%ilASfezY{e$D$1PwIS%IYV>GIv5Ex9J7dZP9+oS2|Wd{Qjou0?Fffct8g;NmfbalHqxs6_g5RLp_!6d0zdB2>P$t2{(&4szNR^CR($0sy9xH-J zwpZ>+g?s`K4V)0$x-pMTB(K7MuC~ko&5dWHLEomMRX$R%tfg3Kno!ch=fyN&MFA9R zJ7+tbd3392|Bq&Tk#P}Jng9}iK`@$rgh9MY1=PONJR^YQ&3|q*a$_)2roWyLB|p>1 zu)BOPY1!+0!cNpWVGR>6XcCamoXRkacH6j9zu}pya5?aGo$Q2ir|V)iTjy{-1yH1M z67@gt`YxX^UK{iKu^t=D2}C%D(I z-!ZccIuf*()4sOL%ji=D9A=@tHrI0Aq{T_qyZo+JX z)-I5B4!W8{@DRsg-`4fgN83N>r(qDS15U2L$ZkV2w!_jNjTWayQgf;LA2X55FMftO)g=ed|Dj;~d6Nz%*V* zPT)ZMV1A*qNIs_EjV`-*Owk+h?+^<$14h&G>=ML6T4Gotml56dnI1cBYoX@$P;#@h-<%P7!WfxG-^roqXDyTUPE@S;#;gpUQx^QDEX#s{Z z8%eJvb?uGem5cl8+9A)PyAAlOvJ(|k@8~L@VP@W)@`rJQ$+6zD0ERgnf$BX{;o|w_ z*o_T~)YWCrQ%u#9&qaUygmYwSZwpkI;T{k#_DsdlKTFcDat6 zf|~#Ef<`y{b6@|t*vwrY&+7KR(lWAu*)SuJ^Ka;y|JnnR@TZ zzJ3b}sX!$SZW*5}=)GR;@%b}?rTK(~m5Sf?wC&g%1jV1?Tf?OAJ zq(atmzG}`ckP%xPu=_E9-`z19@29Og_lzpb)-N&0hug-770YfRwQsZe)#eY|2N|cg zurei%jxCVeoFQ6k^WHB${}UbfggwhrnRzYgQxk!WT)GMw_^JvW=P3NbXx509$;%Tb zpk98@YfD?f5{bUM#&Abd00Kygs}UKu6D!!=-Js}gUE!TwxZ|$$c+o8bgRymm zh6lr^=2FJK<=!6%A9KQo1LV@UOr{tm?bQ2a(WlO%k6ly`{d}TQxXxOi6INMEtTya~ z1zh4suWNUelvh1QP8Lgq(uEs-YvdZ-y=9%;gx>#&Yl~%!bc`|Mo{ch z;gs?npNU7&ncD*{$(S;V*AsfSX&{#K(8>r?eqlzivV zb^Z#!&6#)yo)3x7!oaB>cz$rV0H}w4ZPq4(FHP92UN{j3B8%)Ws;B*`=%jF4L`Mh_Ai19|7h{46B zv9c$jp;q$;`OX?UXp9Aln7UjL)(z?ifa|=wO0+9lW#YPz_G3k>rES zAugtd^^twZ1iy5%AJNL^LomS&2Jd8`i{Dg7Tpg*A_`+Hpi@=35c%obs?KkoPqExq! zWxP@qvFDhO9d@)@az1KA^6WqsP-&uZJKMzI4n~>Ln2Gmm6j#l7xR`^~&J-u9`(mx_ zv&j!^xf-F`R2~n$Pxf0%S2jPM(@A z)4uB2uJa=R;4(0&c<}a^7IXv228KWaGQ5HOa!)1a@U285Dz+(F;rt2@SG|)z=q)k! zOX+LA;W+Y(;g(9*u^M#49%LftJ#V#LT2bu39a&j$ezx)BJ?G^0-K15}ui7h0>A)ml zk=w$)>pj7-@0pcO)A4%8kbbB!GsX6#r?e01i&lXe07|-4F>-yL$waUK6ho!NE-#ax z105T=JvP%3>e=$OnMWW~fPci$>Xd0STwQ*324_wLHY=hQw*6>~0q?Q)uxmhXdj!BFBQ`XH&% zeikF@PEF-rqrd*eWnhc=qbrflsCG~=AuJi39^}P$eh$?Jz%)nwY3H~HrS{(o^6bVy zyYHqr>asfd)f2Rh;q@|Mqkau$-V?aX1_>TjwM-FdwJAHJTN$FA<0072&K9abso4hNsrPZ#1dR z*i6&Cd&I?4iCBY%OcYg|4pf*Zes;eGemJ~u(?jZ?Is}!+4=o{eL7SfWd7VY6nN0Cg z4}5gLa*q!eoyk>?qPKkYP4)t(Z`UQKfs8g?aL>5K^2}VWql-R2r@}}EX}N++@1$|Y zNRB)`q_g5_LaPu{rO9!}`GrcS9O|AtSHh{Bcx)iLb3QUpaJ5p@ustU`%tRR2gOV;qdUd&-13K=wsp#!Q z;!mL1J1%Icq@xC^Klg}6!V`7SWUa1)61;avkj3A+H!y}H*1 zC1ya$AUn-`V2~*0dq)9>TWMyV*GGCq!d7vf#4$fv=GD^Z9&F>5dzES^tzDAlh!OBW za~*lq9d%|qs?u0Jymr*HV_(2>wL|jMQurL`P*uw)?l0KI_J;pE@mQD}K=C{W*y1}t z`BGqTavA$|8R{7vV!LG*);9O7O>wzCe#&5S3&rdm0pwzGcsEJi*xhmeqBF~8sJX*X z&DiPEE;mJjY~U_T74qQYG`&8THYJ5Z5O*gIo!;t=5&QgH0=SQ;Cl$!{K@dtjEgo{DDpotwzwIsXy&D zDDeg%CTfU$y-mSco;NJKPZE!MHwPw>3h3&bW{M2Xfs<{%%9R6M?mmP3cU{hC1>K80 z-qD2?C=;pE=onK`zj9)c!4GG5ZuVJlJVx}7sjXd&WVv$W*n{+PXhZDXGn(x$!};IM zZGf4f?~9iT-WS#Ho#KU4fIDn2_eFCAoiZ6PFS%g|#(?JSnn)l?Y?WBbt0k#d5W=PVN*69& z_*8CrdGmw7BEjMArDat7D7<02IoihAGj({XI&`9n*pfyu>$Mu>Wq}3vjHfuf>Wa!4 zzd}e*or29Fsc-9Bym1#hq(E2eaALx}UtWO<#90ow*T;Tg0C!HTz*^(vd3@=jhYnjc zJ}Qy24$~O7=0MT9;yjG~uYXxx(qHuqm-Xd(n$V&_B z%gL8)!gvDbEeDDaglm%#1o#?lxkw2`^ZyX`)lpHm-@bs-DTs7POCt?ZN-EurgwiEF zz|bk7q|$u9KaUH*jI1y~*=g9YIa(R^`lclbLM%0~#DUl60HPZ$MGWQlfrjT3ERP<`0uH*O8{ z8n5zIj0*FW^2HO+59#ZYu{f@OVr=90$yWQC)Kq@8UG-jay3kRbqwCHSO)-%-4AXe+ z74eK>MdV4!)ZU7%xSXp{Jox7swycJFch1R^J<5g9Xplu+ig3q>J)^TMjP_~X}Z7g%8)rth`ixPoE>X|ki!}O@4ipw;Qk>n(2JptbnZ)y zYb{%po>HIdFr!HDS`J?%R;$p$6htykwFEC+Lwg4HMTr0T!Rem^5g_dcfDpdjs|VF5 z7K)(RLREL=U_qiWcc}MCIAwGW@aWfu7|~eoHaK1y3Q`CgzvEHY-*8ED?dg6Fzf8>N zk+AOYc#2)ojTgL`C`>)+ zN!&x{GY^?yx{kzo>Yh=gOJM%~!DNKU&epKTduo9O!7Zt)TzT{mjjfTXHH;)ziPkGt z?C*Pg*JunaTQyhDT!$WGT4dXx@2rooRU4^NAHGW4{$&2e92)-R0H^nB zm(KWnVw^o?(k{5TjH;DZiRzP7>uJB9u+yLO^EMUc1~2i>iO`XoOZa(E1F9e_!}i_? zAnPqyPP_Z(Ib64s^A^_;Pzmpl;kwQSPjB%d(Kw2_#cWJeI>`UFEasRAfAX^>vo=|U zWE1#JWlqX4D?7M0J*G%>qEa}krLb(1f>g+M3Uz` z?{F2-pHtHb8`4qrK&3d_L%xDI$;+<+wIqee0zd;xRHr* z6z-YlOAGs=3D9ua%ok>AZc<@wn7Mr{)T*bhDLeGtE82e4|G@_&VyWWjUSV2s)b3wH zZnqpbQ}%k(?W`lc{q&D}P&HS!4bP}}FmaO44$$RO=%Jj;Hp zN^DPJi-!LIfvK~|THfrrq^FS#vponn^wkPj$O&*8o?EZ&JoI1oSMyo=28mgkuC*S1 zSB~~e9);wg2=k>u-4!{$(_R1^LzM*;FuG#z zw4|EA%x`o=R=8tC&Nmao(HvMAby5jz=rH#Qez({P`9DK|LbA-j%<$$N%ZUz8CB=%`*~7;)KqnIUO>lY)E|( zrbcP(w9xR|=XDlfI-k{^VBk~s10{0V%AF_brR`clOo`;5k-qWY?$0Xo%*el9HPSu$ z#N<-jcl3<@m!wzPYfd)KQ{5F72?gz<%yQQSxOT#_z(DFf^OdYC!OZjp%em9`XdHsI zQ$hkrrSI^^@`$yWt-;C^VKL|k8HH;H6W{g}&DqSub^CWnb4x%d&$=zVzjAcox>fd% z+9w@E)UUhYqW{KR8{M9~4)iPlnhL2ddOe+`rC+o~5Mdo~^yT4`QC_~vJbzql?1CaW4vUWiBR}7z0!=dVu*R@I;6eKWr^_o zET2Ny2AOxTb>~;yz#)3mOR0Ib{0lSSGoT5AuQV9Q)a9c7+Ie`u-$beBEXQp+K)CIu zN;vXcjnshQRV>|ESjhIgO7KciJy!Eg4m@e#Z2ANccuxPOBfy(69(t$U_`kmx5z{jA zcF${f@dd(UN%+wxVQRdR=do9Au&QibUsm!*|J9g@w%*cCo_9&cn-zK886g49V3`Sv z%4ZhL6b@@-twyqW%YSnLY>C#}FgiY*0dy$wt+h}JFsD=c{Pa!PIVli<#@0*9m}{mr zHM1`3?H5X*@mv04(>~kNDIkx2>1J9Cib!T~5#7 z(9a+1a3prJULsz<=zv!(8M62$?rIB1EX6dI3H{M%$m z%g%QxhZ=o9rG*O01SQk@%C7-$jb|(61Dfs6!}>e992~DVJ5C3OH^yFZdxEphDdP@g z9wN5h+tm}LsDE4Fb}l*olZGL1Ylcn#a3y|ZRU`MFvv0p;}y+iAyB9J=oO$0nI$6dC>941u{ zXZ4G`FVQW?K;d7JMp5MFMEoto6$AB`qfJ`{q-|iwQRSJA7{a?_O_4}&4uXfy+?%4SItf{#P%@qGzgfF~Oq* z*a&Q3z{_6q?|&Sj|D{T|YR(A2RU2t>nH$$B;XQ`vp3h@% zx1N=8a*n(r#={JwKzKP1Vj_*^>HBG=*ytOEEsqoT>G`jksf0vygl;KP+JxQWwApV1 zq7b_~KG&P2wD6^Xju`5{jr_?U85Mp45P)TYOkjrmM=-7Z3{HtoDA( zunfneU;wVO8f7PbO{W}%3_4eRL+Qe5(GQ;xx8zRxYbNS4xT0Bf(0lfY|M~hVm3z__ z@Y}pU^O`?j_PEL%L@o74<{ams2sW-Or87$tQoVh#2+A$6ECxdoo_ELPwY32Frr6RLd+g0myK=H@$1| zKQY}l`<3eL1{}XF?p%e%SKL;1I3_F5(Q@ZyL4SgQexYUXY|1P<;&+8A6utmo2TuM8 z&K)L?4M{t^M_Gq>2&{LmBu^3BWlXM zb`Luuws`tK=0o}lX>}0?^p_QwAx%BB&N>!jD0;&y@LDINFTk1o7Z!cMK?sy|mB76; z;Aj-hdPv;sAn8s^e&@Actp4RWEI}5zH-{V%rztu-Lw;3&J57E<@V0UpHS_~ZRa$QX zn%fhe_9WaPsi_$SI^NB!RAE>Qj{2G(-}2(rLWoEaewgYQROLk>pg9?wOzKk3YBDmPIO!al_C|81={8PYNYy9I;GJ=FS7;U+se_uq=rF*Vd zX(~|~7V5h@ninx%VPX^~Qqx?f-}G{G=rbeXycCmVwl5~($3E+8oeA0>-|GVE%$ALE z^))WRLs_0e1{OJ_{*fzbhm$|Omdcaq0B1Z^URp28i~D(zKBPbg zg9C7n>dr2KYXhwKzHNT8!o`VPD~nk2DW+Dfp_~y7cM%bfi}|Mtlzy3!=n;XDOacde z!wc~a$y!_2Hl$}B+RvPmrmfPh)TI}NdzNciJv7b0;^f87M1?JW{zPM9LAxcg7K68~ za{mc%hOfCn0^^Gm;0-UZaBIAtTb1jo5G7bSz zB)S^nz%0cUtob)3rb<&!fv+zjUAz|w187O{3twxq{a4RikCS4KW_o`JkWZ2z!KJLR z`CC}yJwSYEx2?Hr9`;_+;L|9sXk2P|!yQYGV5ZSEPv?u1b77XQSvY>cw2xV7HVxjA zFFf=3_|@8RhTUC2Kx?Px+qUDiuCr${NHUB=(&H^KKrsOGHTbDw1#V2(6# zuq^156>Pa+PJ>dxQkZEx)y!Ew?|)W*tN*xATz~*qEjQR);{1-#a%X`sf`2{b`0n76 zE8ll&=&AKN=ayi3)&Asue6)pc?bg+AVY5NGawE|I0C;Vc?~L3rYwx^UvKvxCI0+8f z6L!p`D=F}1=GIouu_*C65Uxv1F5H`vu!dg>96@1UBFa($6M@69&93Hh=It6((11Vj z^71omX+9Z-INZweYR79n;a;O{Ke)8*q&@#on-i%2V)>4=oMv&??Xm0Q7uDk|RwnnQ zJF9*G89idD5`aD+dfdNr+%w!E62QN2|KYa1U?90^yam<0z%Iko=Ow2mc?~~?H6Px4 z%dGf;i9V887CXUBH9>|*Ms|Q+6qDJSh>1-`TIMMhJNru_rI$l&heNa4**jtr3lmov zZa;4OOa%L=;%i%0%XZE?%qp|&vr3%<|8ko&j{pkh=Jn06)U7%&r?LepDSbZU~-j2k-$jBtJ-8n##XRg$PH-I$j ze(aZ!YO1M9jjlNteZtZ0K}C3!T8>&Oc+GJ17#6dHho$IOt?`zlxE<`F@$LG*p(Nw zpK_Im#~`GZ=C}6SoGk>8wifUsVFOZ_ilssjdjg%p-4t>}C{Ia*i+L;YTfGiQ{UHLy zbouu8vCz!+@~_?D@v1GI1IC_}&L3*QI*KkLF`wzg+}XMwb<)(Lm7#ES;#B?P$Mup< z=Ocn2UgJy;`3!Vn9k*vwwl7n;B^EyNwQ=OC>uDqXBz?xds;=i^hr&i)K7Yw$V-fA3 z`k9kY0ze8Dlt<_(L?rfzjnoiXeKfqVAEpvJ1=O56BPuCF-~6_@DY z!c7l{Yc?6VJROKPVr4QtxlHHCvyW~~3gfvkUHArOAh4342|T%zMN!b$wwwHtW_oyKC0*9TN~++M2En$gD4 ziKnr|#LM#Mby}dg-P1m2H=X1HjLI_EYj<7v;Sc1JR(YDBg^slm_EH`t4;cl)kM}Y2 z*#G0kf!i3Ugi0ksZ8b%t@?4BY7e=(Zn*VA%SMHVJH_uo_ytA2KGfCTvEwO?6Xn4}4 z_IliZF0d2X435{ezp2tRpAfidvQ{dp)A)VfF|P=mta>YrT6e!SNv=T@daX9w;wx;@ z;hAg-Z4!|H{tDHSzZIx>0tHHmt)M70ygTfkhuOW zpc0XvwnTBi*Bll!ZH{poohF0|>AV|aP2DSfn|3VI5Xrt2sbo|IQ0D%4!sX4fwd~y_ zVQ15+8Wdw(Qts7g0Y|94m_n>23Xev&>oV3@1P(%0q#yhK2v8 z{3rkr{zZ~~qNuAG>w|tnEjmbo;u)>YVyh@c7zEIO2?EQRLEG7i7YdLThzhFz zxU6jr55?$gu^U;Mgnfa{)Hi3d5)DSrujzZ^xF!AV*Ey@8UHQIs%0|krO*D`pgFc{`QmU+1(y z*$g;4#TSFjunKX0h`bBq&R>9_=Ym~D`a#nctz|Z(x2)_dMEaEquN2e93z^(HYSDM( zSEu)S5T=%KWZW5ryHn2UDZk(veW%;crkr;4FfXAGstV#%G+?lk-l#QTy7gEuQNs6J z9gHH>((jvuo%G{94`-Pfe7_w|%aC!KkUFl~AzhIO4+w~K$oPv%hzxz1#I_QgVydx* z(uC5?rkI2Afzo}rbn47^84#IV5_-)u70DxR5?NyPyI^m|)}M^;A{F2DS$sDuKn)2O zNelIHMGvr_PVGMihw$j-`&8TCY4xY7=_wWFAIqFZKA0yx_Mg>g9zv& z9QIC8-*ZkHDX6iZBmp@aF2nJ13&;B>+td{U{=EL@1j`X>M-yN5BTr=?zEyAXzQk$M ztYJd_{W01vWW%ortBJ${qVCB&RBAZ6yR>S0jmtwm$38R*r|jKwHy${yq!Fwkn+Tfr4pYtIBxg9Vso7R z(0?^Vgy`4H zRd!R$q(O!EM(E?U1mBGlT3mz4OS?ds!g^BfJ!xK0NCbsm5MSj|tCC5J`TF7q25h@po95S>PkA5iLBu3&;z@jHVeYFVDo_H~W*hX=hKG|v=u79l;hgtv1s z6#RV&B3O9Y&wLW@+`tU0Udt@=qqxbhv(@QcmFu)oA}`hm(TeW*F;ve0v$y-|7@bMz z=dAp1hdmgob^P0}?eJsCB{M)K>dN?V3Rn8kWSB}Ybdk?mf?_2)nWI=~tuI%CK`#QI zZoBi%gqyf>U0FtqUGWDo6-vX76{=KIC|s~i*=oHt8yU2X7aH`ffIm7FTZ=_4_hS#^ zaJZPqj`~)`g0U_&VhY0)6ZOH*NJDws*)ma`V%^N0$qJc> z&D!@~(oR)rSlW%1g~9k?Gm&EKpEAYX5XW9H)l>i#V}@>p@wV~;2Wnw?mMPEnwdn;P zHGy9!lRkQQ4>k*z*ROvo_RHuI%>C72`0N+eN_&qUE`(=-gewV%!MhFAMt9y0`e z=CoU{N_BRtvElV@C#2Vo{m{Iz0+v- z`RO~f*Lu4n)lo6(y-_S zTYWW5f0+f!$55`7YS=K`@u`E3~-BMa0~F z!_?q^%tfFmM21FuwG&0jIX|r(7Om>q)q0ocZJN!vOaC1MFAqP^X*5?Z^9zbXBGW7L zI)B*An#o;ftwBa)4PY?URUv5&Z^Bo%hU2KqGS5Y2o!<^+dAQGB#f-b9#E6p4z z{4;{?EKhi`i0#HP+NR97=_zno^;#7pj(xnMKSJwt4WViKBZSt5S_XzD`%ovcq0BF- z?|)2dO9x~WgF;2M>$~3pfwt>6BrWbfsAjL?@<;fAMf}9W36FG)dcwUkkfEuR%5CdGa=|FTVQsO z=Ok>!$qhwi*m#dJ-m|!Byz^#YYY<(L+o0qjvszZShv=`i68QVjcTaQMt%~(vc~HK^ zmYNFNCFu2E1$L9>x<3nmJB6i7WB2#?%_L)#V>T`%-~|T$SBgJUq%VHTLN2_>sc>8G zcT&JPz-4wTpAhK#_@YBAU)X~FHdyY}Hi)Gz@}sSLrO>GVLe9C2*dv>PqH)sUnNniN|Anc`4P&?8k5Bvq1_Pq>tnn zud$+LwBHAYy^<^h15(pa6y@iruSUddJs4=&e@fBM?^hX0ZwtRBYBSFLdI3k&n`uOx z?;CsYnf>|;+yh8Q+dg5weh2t*CTHh|OFW(5IIGxg)TM~?4Qts^Uf4=1J-4mh(Hk_`_NpADCzGNQzV^OMEB9AM&49&M|NR#*#JTAvxklwFgpL+i~=uv`)={KP!2 zs_4C744u@Xt+4L_8bq zGKUV)XcAjsDysy)3_l!Y3^(H zIbi|HLG~0!)YlJkgm45FtIQb%Z68)Y8X*bVRxdMH!x(CmfSl%ls@&W+zH6ENdV}|! zl@-3}$Ud;nJ%!ASxnDNGxfyEAn_Snj11t>!r_nei20n?6MmuZgKJz(=>IV+aZF1Q> zCdwz9L$2lME<&I|8jSnCggBHwSgpw_@2lv# zAyFdah&4TgyF(XSJ;WCR4i|=K8sfiv!oY(-wKlb!`yZ2_5TL*O*-DfFp3){1CQ z@Dezw!)Gfgw?OCeour=|8xuryu2)@;2P z91r*){vd-^hB|h*ZrfpCNjdP-O4U9=-~Xoo0G^k3XFmF}%g1h>up2x>G6BkAwLb-W zbKlftCvxf2+%|Ru(F{@X7+1e(T{WBnG(=qG!QZRty!gmVu>WySbF_?n|$;v!pdtt6R|2>WASiA1CWV~|d!;e_pNyZ@>+g-I#* z#bNE1TrUXn5-yszuOyayqF0X5N*sH(bB3ytCeXEQcl5zryM2DwB4C{Ok)dj~WC$=T z-*MNdQhyBTfJe9kC*|H9ukpwg)g&SAZlQa;S0Jj?edi^Q;U5aE74w#ca+>TJ#2J<5 zV9M`p^oJ!yyK&pAGU@REk{_->%BN=sUH| zw1q{%*3tJ^%a~EJ&TOtvwub&p>$X@|f^0-;QXSVO>%CcKVapqyze zDLs*170f7J0*J>rYFWfSmg&!&X%vHcH!A5e`ER+v%EK(WO6$M503~Km{X$qlN{BXoz&V7^Bu&qo)SZ4a_ROxQ0MfSGywIHoxj{=!rGo-yZ;dk}SjXGY$;d>%w90 z!ckRLZplBZ^Ttg(HTfgM2?%2g5$ZZ$Y%fqfx@`v~{%xw1sthEEkU}~%2llvfHE4v$ ztkENc)v}%q6K&LyDLY43!*K6o$!Rz~80RD7 zF_AAf5)xL;b6M#Y@Vvgy`0TTwr5HZtv{_vb>vG^nb_WBnJi0fxY>!81CCET@em_!Q z_c8nC_3kick+JAE(x43L*UJUY!hd4ZZ=gqFA9U~uXqZ=c7n1X9SL_D8#FXYjsS zH0vLwpHTRA7|{G+uf2M!7cmbE_QZ3?&T_LD1!ZVKEQDVC;^7Scr2m)mp!+G_1NR51 z>X+qyq$ij5Mt7%rtQ(9WgF?<1+~2P2(I6xhrGL3h%TN5jJIkAUa_%Ay$71*#N!WOU zlHKwj(6mwZRIx%H2AMW7)g?s?Of~au6}(qyHn9vr z6T_I$TzUMRrt6QWFe0T3FuO!IheSZ1hrO3gIL%i}kEZoK)v(5s2sSX$2l5-+&0iF& zg~IG@a`zB$lHCvVMb6oTSdtxVPt9qTnWSqtFUH$I0A~`Pr9A5La!*Oh;~x2uS7Eq6 z#`w#UvBXA#csftOHqWF=^SSi|J#=n)tDviFWUU23~-@8yI`$@NE{=TilTePnQe%<8O&FTwG;Z&FOF*!wv zKE?nQ?>)O&hE?&{tGBx;zlX>#RLl~gOXxu_XwVvLCxY8&>P9~kKC3sXx7z>=B`V<} zw^VL{0Mqrd9Qu;0Kem4|+M+P<2HTZ~2^J>h0%lNlN#+aLOdp)?FesY|o^B&00iA<) z@^T~q#VitN0 z=b7f%-Hjw=`NCn2GO1QFloVuIMLe}A!=qMtiP0oyTx{5Eh3%iWs!2S{<9i1D#fSU%U6L0|ICCQ=)ULpX z+IuMog%xsOZ%HL@gvoOA8KMV-MmowG8D`vsR_L&2}lhlRaL2_qGm;i!jD`9=^02z$|68s|^99!tnloI7pI)PI{w7K>XD$Jl&@k{6Sy>69HydQB$V`Q(&4Qj)8kXu?V^{pUN1Z|P| zWrDK4VVP-tLbJy(k+s|6x zgD4{I8~I#;z>*xWEY#VV&QGsSvZsh-{qsiXSyw znLrxOz3OJ?$ubI$o$;s&;}%sCR%Q3S7wUiCla|7wj34Yz1lO9B**p;QSq;7L85>tC zHrk4FzrJwQlYo`>oIibI$}IZ^O{iOeN}YO{Xk!hE1SV@b=$ydmjT)coY5z9ihet~I zD$HzM0#6RMnogj*>^T=aIVS z9L{=`N{(~&h3>Xm;)qVYW=MTxK;@2an?G>0o^1@eSm61aCdqU84U%;f{NmA>>35&+ z6ceZo?HJP>^wH#!KOx652EuzMFKBwKkb%1_pNi+A`}@757Cb~utLN=cf6yspvH&(o z9#HrHxTN|x5UD;n_)GMJ&3Z^7X82_wwC-d3f{Zm0&sP`cLLlp}PW$M~m~D-4oA{bY zcXa0Kvn4E5MhG<+=+9}~pY%a-u< zfrOFH8zj~;Mz&wi&&R+YDQk}HN`|3<5Yo1V_9gNW@Kz_#DK!nDh0vE)6MA=aM?ZfQ z6V>}J@r#)N=|Lv%fQO&CkBuD!t%d^ptaS{*LWTu>IluKLDw#lLVF~K z4twUZ9C%dRcdZjYu9E&uY_v~^=qYSbYZxmB2Gi)Vg;$vLy#>w+U)d*0v^F^nEV^Fk zd!oQVNQsf64OAVq8Re`$$%f3AnJyvLc_3b(y6eXTz^ zkxgM|A=}#7^`1yp%$JnrL$2v96lwEwT`3paL2vW7*)rsFkm76EB*ruoE=Gm;e86D1 zY`+lkIsST-5T1#(d}S7pSpa%#trX7BPZZ*)L1GY3R4R(sylVu^(EsL*a`xn#3G?XQ z2K3&Y=8&vWmVE>vd4B`3jIc49iM2?EboaY&|3WaRLR-Y%c3||=`Skd#E{c3SQ3N#@ z=8wvoWPkg$tFEoVjFDtXv)2yF&a{C95|H}q*#?a<%PK}-r8(3S#1A@nxB`+&i9 zl}Wo=lX+_E>|J|RD2lpv9ubdOJ7*a$0qrxk3RD<_olaO{!McU*$0UbcT@5uvro~fz z5{5w3wCm_J0hMz2>7QZsSi|~apsJl5ZBsPFRI^HoPG0=#)uPavdFKB#sFeP9+v~OM zMArKs+Fe%A@?T{K9kgE2R;N;|&ouc>h+sBNzE7R{XaNMJKR`-?eMIh?$z>!20R{LwEri)QRNm;D zbD{6SZ&_f4r4hQksTG@IxrU$8Hg?qed`7xAD9Cv1AKK zyjuTEJmqv)d6R+KxIdQvzG^j4;oZSJpXqS3yyY;^hi?oithGzXV15^*)cM1A3s88hZT!UL?o?j&)lp5!8zb!9 z{rF~vo|U5fweWwvsWLdQ24c{06V!u#Tc8%TSBx45Edb$nY9mB3fmQYRmWGQw#qx8j zD6@NwQjGQ32yP$Ks}zAD={dp#IdQX7Y#NkEvR~N>WJB2`qtTTq{;>zc8Q(`|S#pU+ z8v)<&0rWeYWuMAd0NVEk+iD8W^~;YFl7y9Ht9_Ys3@oZ-RPKPnm5J!%&dYY-GJcti z9lrFlO(h5zJO#28-u5GSNNMCO$J%7%vxi z<@b`xP|`3nfn2WXlb1=G9$P!RFS7)S*Mc}uUHyX0MKLRp@s%f)6@s&p6Oz|M0K*ow z>o8S1RNfMX<%g3^Cz(CGSQr+fM9&Q9@EF(%^`^y;EsVJ2Q6724A%U9dxMYfyziLff zdrIA~5Oh)b!$ssqaD(<=Q3xjvqWcl(L>ef3H!0FjX4mCe{_3!?LZ0Tzg3L1 z>Ao?dYGm3)$f%kSp7DDdVQrB{(O@`jr%gB1he3dM(wCXqx6$U50uIWchGNxi@n$m8 z==yZ^<)lwoX{=)QuRt&C!|@SX-Qh3hFx5$fBtck%!FIDR9o3hF7c zJMN5ip2I{Yp4#~FZS?JosKj3M2+};93nWR0$rK z%`V;sbVYRQ<}-i5qVy&HPwet~j6BR^@8+Ub|cKbIHd;@$Js0!w>gV zKGjhd)!J|9%QK^&*xeQI1sToUcpcnIo5OyiqN#C7l=jfFekE^g4<)8$_Ox z>9bbz@5kHHx&~R8(oVjkrh>upW3eAuRIniiG16V#=K?R<$%1q21>iMG_d4p+mJ1D+ z9)7XU%baKQmqg5HToL}M)VmcL#-6jL+Znjr=IL|c!t0;>A+X<8M#4pZQ+4=5z-bSr zKe!g^ZtnT4xfw4a?@z4JzrH&9Y_F+A_t0PEqT|EVB2w*`YV<7l-ZM7^zE|FRgBE96 zMffop!sMVInI9rqZA#ZM#yc{#$?rq+GYnmY1s0C9ooz&QTxw8pcu~37R_v51CS+t$ zW;rIn{aT+OfhYw{mFoWKiqQul0yAe8(QiZ=+lN4;aY_=H~sd)gxA1&?0}D z)cjj5kbQ`CFQV;+w2 zqO?hDbc}8bJv+Dzd$DNUbb;mZ++%^rl>vV#<2T2 zCkK0WdvpYnAY{U5#LGE{F1M6xYTQ{x{ey6JZc)p0t816@d%jtRqLXO6P434tYn&_< zQ)^Dn-m`nZMrETdD{2-lsx8S06i%e0BZL4lAtQSb{I6YlSs)j6!(Vs&doPuD5=!-GVnaFrT3JYqYxbbhDTU%Q9z+252~7Ea%`<=yi?Av!YRttFk zVjBf4kz5cBCotz^F>w-XUSlz08W9$1z9(_o9EegG(IQlYs;NVj6N+k{#aFL&sY>`el;8KLVeq)@I zPY{V3s**h(Q4js#7QH)*9EzET1AcMD&lGN@fLr9ZqQ!b6VY}I{O4DmBJ6Fsrn&Nc} z;)w*u!V`m}NM^OParCV)fvY}h4$Ku z)_hPWZHC+1Q*2fmr>M{B`vkkEPLl(7;wzrNMz)`emzrnw2z^{di1ry!iN3p!Pw|v# z@~^oF^@Js_He-0tm-W@3|5_}}AA;g1qmvPBIa+z9v8- zS1(pEPN;hnH>MAL`SWIr<&}`#SWyt;ME|H|vG-q#zX>s_LxS9s=%$?p@RQ^~ee^8T zj~nLu6yt8|@EVzlDO{Xz)ZT(3T^~YOw}R_E3f@W^#Hm=`j@a5->#Pm!sl%!7P=CWH znuXTVu`rK`BT6;bp3W5Qc%Q%&7|FH37KDNTlP33mB;gM9QqI95<|3{;`MD43TMAKHe20mZuZZWe z3v)KZrF2%Y4a4*>hn8Wewcc&>W2`{L!V4j|#ivxvk^+{TLu>yvGCrr-QhF+yCa1~< z)2M4u6P}5Z6cF^RgpMZrzWJZL=j8xX)IYb=0l@jP2*}f(Q>C+snaEbI8?cBx#3w%q zRz~4|N<4+Jcj4G>c3Q>dT^*+1eCQ(JHkF6VOdl_A=D)NdM!bMXJzj?{8ca^53u)b@ zVN6h6QDC6$2*O>L^qS>r%hy?nB zTI1_hO-6u#8ywNxRYx#aYkoq9Wt6$P^JMSrSS8>I@o&*H$l|uYPnY>w2Zd0YYvvIS znByxczWp1So3u*3laN5+Uiiib7OWyxj~5G#fqbNFs207<#9GNe3GoIYqbTGvlN__^ z(sgrDhux=@_V_9u^b{Bkmoren4u}9$A0>b;=7OHvop}d0&5fLQ&m)dWJ=DwjLzby0 zgG}J`!!Rl?s~^-VH?!{!T(`;mW$m4bPHiFyeKADCe^aaEh{K*0+haj=FEedt;zP?u z_oB$?Q+W8@uZXlBx{hRh8ft;+_Sh7}Ta&!`?K16|y4pe8vvM(&lY05%6JUi4P83-Bkmp;7KHo1ZxK7oLo zGR*cXz9Ols32R44emead{8mP3`8tQZPbo{lmQ!lR=JBIb5w~+{!6KswKpw$_@CBe! zO1=|dewn1G%$Vj67t4ER((s@L(O!C0ezgPH4wgLizX7C#ySZ5v4#K)~fX9F+oOClH z*e%yrFCBr~JbcaI1u~wM&Zq=(0EsBdDLkH<5d|6MW(_FRwWoj$sMQxkk@;8~i+#(c zML{S~gp)jl$*Z5cR?a_b$3StyQ1O(mTlDh*_^YF{3_+=CdWBX$jR@QLm%gwEx%oO z8Na5QP2Zzfr#HWv?BX3NPK}lR@Vj?3PvK43iu#6gn>DXrdjel!l7z%I%>vGa#!C=1^$@$V=b6?u!;nh*s5#xb zIWcWty>pv?9Xx1i3jbJ?9L#>!X4$DXXm*DOCfa~#r2o$4d2tV66!+q(_Yx8FaH?%L9V{1qQe0bZ1S;14M z_$=*8RmY{_BM(JPMJ}io@x*pO#0;y}{aS2w1lr!K)cYu*giak$WYL|LC!`?ITsAWJ?`7uuwIJ@)wEbbceJwDy4KI-QA5K-5}i{2+~M*cXul#D7on_ z>8?%ly`FRL%suCL?>Dn&gc)a;z4uz{{m1kCo?qW5lb+ElX5wWIG!{6-=1%6BvkayF z@!dW^?66_IJVXea^5PV{RUe4j=jls_9zVsZ6iJIh7o8Q$%@8uC-kFb#2|eA5x&gL) zS;dO%8v)|^Pw1S66vbZEKA;4cFBU21U?Xkpc$fRPP4ql$rv2v~77d4N_B!X8CI^lt zk{~CgXmo!d~{(f(wB&hi8dZT3r@}f>}%624fzMHOf zi2$o?KaqIoG3aUt6^kXAE2-7(_(<;N(&><0yhx!Mn?$x}|B-YZWY@*-d|9&DUGT!)yW>VP_EJBY zrm{O97+-h+sC-u;;8aWi>W&5YU-clN7dY*@#2UalEDS7AtA0@<@!|h0K55fnxZSYDjSt5!U7qxw^Tx3QwD(~)U zFNW~4{dT5;TJ8$Rm&AUe;y>L1-bLEq-?NNYuTf`o*-q~vh1tGQw_9v}8Mi8J!H5(J zbx%$tHpE6uVls(aTqwoq;DciSt)SOKEfp=?sO* z0$!iytBr#kTTeodW=q};r|}KA`hc_KVyp+V&9|q$x~WW~^0`iHv%yuvOtH@ZbAq6c z=V{a7`9xXfum)cj?sOqP-&A(9(qA)p zvDGIE=&ua20@CK^U`)uW*X(tlR322VyLQZev&`>EbnQT>Lorng!vCcI0i=OUazF*8 ze37y5s~qnbP*KRUa0LZ=R%MX2{M8yIT&9sslu)YE;rak#$!;Un3vJYCXeu%6ijI`V z49d0~yOlrrjaghGjpJAq435H%+xF7-OT>pyC)w1Y#E~TR66&H2hAl{(Mnpd4x=m4g zlO-GTaX_?$VvVi6dFy7gA|a2r5C8=H$kt!484Sj!q;atSIzwGnyI}!JAZzFDxT^@P zi=MNR%3DqqGEG&gDzbN6j>-=uaWz5EM;?HB;)5$H>*8O337`3=a_jg)Uzr=j-}Jtr z0%%)Pr5>vDZElLiyGv<|xR<+kY#qrghS?PDE83Bull`*(d-L}$;!<BOy-3OQ&%}pDv?qWYHrk9btP}c0>{1U?6 zhm9TV(qb`;Q4mBeW=zia=_?r4i+~o43#`=wRf-hkwd+0>{7!i{u(zBaODs-GV08zp zM?wa(ZUDTM=9y0NUF7$X7-T#$=A-F3n}hL?3^&vKbW9OcQY`$Cu9DYID#EoCo!v>GdOY8Vl|fRXL~%HqVHY-f)+71%ZdCPNeZ6?!G{Y~@O;QnzWesNGy7<%mAj`3h>1aTHU0&| zSw|)KtU(#*x}Y)NX>T8zMU#jjcBxA_?T`5q<}l%Yc513WPUy-VElfwyv%H} zSovb!x(b1rV+R2wvsnYv?Q4BtPCdsfC(q)=tU&`e|hG$xqI z0al;+=$4=PHX_|~^&`!2%4rZFZeD1#EBGi+JkL((+WBy`pyjUxwU-dEc%4`LXN5C% z$slVxuOjtggk_LytC%haRflvh4WG1U+RK#rH2hx>3O`bOh_IL~paA546G=bsdK8o`)2ztuLnWL5KEK>ORAe+rp{!)e ze|j(tfRZ2)r#eQs#dSY1*$dz)OT3YkmoKHXljP`QUdi(gy1BUoVAh4eLIl3zT2S---)-I4b4jv>t~_hltVb!)l>) zx8Y-tfFd*pG@c=kdWMyZaxPU`NiT_;eHJu=X$%-n0+@jFvHb8<_N@inA!qBZ^e$_$ zTzHt@hF)pc+{Fu*N(?dq32_vB2lf5264a?G!|3}}AEhp1s{14+T?x?56Y5i0xq}sJ z!W-?kr%f22&Di-y)Si4PAQz*8_?OGxWp91PiWJqH6F{K#tYKE7;JOOP@c*v^@UWlop)b+mqDuNOu@-2u>+l!guT1N8^#an6F(h$AY;=CD z)5;cK+D1HEXvkd#8c=cI96}QSaeDAo=G_2;bbx%ZqP#-4r&&pHa+?OArbQHf`J!DE zcv)4?-r@t-5wFXEoMzPuma10M*6Y359R1`!VXckUab#&%Q?Do53=WBZs1ld~x&H-F zl!45+CZuXHWm~)xx8!#PnG_r*L=VLep}P=Sz28q`Yk3!YuW9wv5i!VRfN98WnB>cJ z=k4C>p$xvJ{l35wdlvnUEi_g%;jb!9cKQHzngppx^;bmbc>yUZIK`z?%EA=Hay9%< zrv$EyHBT7n#!_X5#njNZN?KSALT0^Sr|n_Mmh;UV@WA0iW)H=rPp6&w<1+gApJ^FSOOfSG{MK~jqW?h#X1u+%N!8~l1wHgP%Y7i zl`k^>^TcK%O_V{nf%fBnO@U#i+)5l?8TL$04sJj_}9zZ^G-{K)wvK>a+`P+m1{ixpeLK=fKaRqcn)Gwdb*0r23U;%ZG5ibhSia zHCM<%kNQJ zOVb^{D>!jn5K4q`C%BAr0M>`_@risN|7Q`r>Zcn}?LcIe0#oVFS)wX|V6=%*+>P9I zxX_igd^kUs?0|wiE)hk#i>x{ByFHQtAFY@oCmZE#Unr;6AfxWtGWj}z!4(hyPM(oER5sX72 z@Ep{9&BFSX2RzTB0c`phM#Z&z+IC*0g7>ml(TN2{WyPzC-skZ~r7Q@eIP|CCZ{y9d z*nW<+bDwk)?akC5-E=I+AH+;cKcPFJmD7vY=2!mIf*JoSxNy_=jjcuUz5nhmSiK!K z1YAYAr?{SCbwARssvt#RKp^GBjI8B%Z7g(oG#BIx=wRF4{MV~NozCq*)Aj)3tk%o( z<+Hx;?$3_rspWXft=9yGpn%#Oa2VG5q=)y^`|M|vKw(ETa27#+8Ll*wg+76~fQnXj zhj}vB;pN7bL?s?RmYvg+;W5WgKgl!b3#-MV-zo-%7ugAn)QPWZclLFgL3Z~c?iW2~ z!&7u(L7U>Ko0->_2Xpa-a$l~Iw};cBB_hcbyPh6N)GO7-)$y?pdL+L76$iXHwiU3_ zf)YSI3-?$^K4Xx{h<+A}`;!CY>d_O0ky@$A;Z}K6t}})wAq@<`!&bWgIMAFP!(6(7 zUy9wcrsU*k_OBWdRu>^Rpl63qu!3eRD_F$;r9XZ|lCQ$yiseSzR}cg`2BcvO(s4AE zo}e4fj~2XTAi(2vMO=k|hPYM8`6J<^2cWM9`-p(z8y-fYe)X^8kQF{V4#C0Wwwwn} z!-v!LEht$;JV6$Q_(UbJ%7j}f@}CAnK29b(CUC7pthb<@<7o<~D|E&_FOYY5igxbH_7s44P@2q#4A#<$imFGx$Ga+UYtZ!Uj-YD|x#FmvbwdkkO`p(t%V&?mlElCSbkcHyw~@d~ z(o>}i7!H(y($^%??5szE7QYpcEaq$CegaGbx2^%0r4Arqy(5jadld5pDd)TF6XU~G+Sq0rsjLMI6>TTqK67(cE&ul2cG5bjJ0a0mCrHb39I7Tki z9S0>tz$+1WVhB*tdJHyz&=q)_n`~F4n{a3evRjAJ*s3)#!d>gFXQG^da+xNw*{&9+ zM5&VW;r<-f(dXxwvDz-W8%=@wK+|gvaryOHlriwuWdMi3rBwp{5={EOLq^k z>UH2w(9=u#=NeKYz+$!9(1bZnv45&%*XVkINw-)da<6iidR#43A%k&16cch)v7%fB z{eUC(vKD*Xhk-X(na^^*9YMWPFGYn;kxsA!DI3;C_1CI#k9gqg@*IbpKnxfCPVW{e zyM~YQXm~0M0#~ye^;X~bv=cqaHe{^7DCoDU{CPE{w;>~Ja|=(ZfdjS`RAPfea1396 z%85PxScZ`(zP@7w!kDnNsJke6KRgj{SepJeleT;aPdVA zD|o7776UPFqvVLz=tZqaG;;=rHG%8VBF`i@$hFA^;&`@Ilvzv|yr?Ne$I^I;gQWxKJ(7J`c7PQ*y7@ou}{b#0ePb|8vOpG9`_*w^>ZtgNz z`^Zfy#OuWJ&tYsTobg&U##@*nIq6m#;jb8UtPO~ld*h%u-1v=SgqH=OcEsH?>~f61 z^|^Qnra_XEu#?tPrQfcbFbYiRdnBWBaA?B^0!6{(i4Z&E?RQ)%v7|S;FL8YFU+ay1 z5&WD~CKvcw@O*oeMewEJ`Bc&f|6ly-P#kTcSHGXy3 zaz$~dg@~9*>6e485g^-(F$1&+wR{V<({0Q;5$U{L8(m!s6^2v-84w zv-76h7t_I=xlFzea#Qacc%Hx0DC4v(`IO=5ayBZo(=apCZ^i3*;QmUNjxJSKV{8;D zSF9%b#e{jbd8SYQxS9|}b*@wzXU2X=06)bEfyDaT2DM6+Z^T@-3WTFs1r%4uMIQ#D zAs?dubHtO%YFS#%9g{g`@KC}c z3e#`=E1NDFEsbdOQ`OWt&w6|gyQ>Th^0Mx?GGLKE{;VT3pTX@I7{fhMR&RHQF;#jf z2&I#E(M4{z@dUD8@g@VEFzckM*3aa;?v(ORZ{XUMLA0$rIE9OkJy^xx?(YMqoRu0+ zkMRQTi>^!1^HyaplKiWF@3uww(QQm-TAUReiqK2PdViNg4IDhu=Jr@GQBP8+#8I}n zV6qJ{$@6_FE(<`b9}zaE7cE3rNj-G67D}DjTq~D(^`hhC{yc%LgU1q5^I@P^H~>!J zA^PsJD7Q~m2?+8d&EcypR$~<54_@i9u9JO*bI=C(kq;#JiI+R$LByOkJ1LWjk%=Ml za9f2srZ7f55TY0?0+hdSuJY$Q_+?$WZAam-ohP$oZ!KUdbS$svL;B!X?EtyN`xup@ zRWp(_(K>vqa3YTs_UV!;AdQf;Ql%ignqV-NIyCG)L+}ILaEidMso^B+X_Y9XT9VNL z&^9vdrQ+;8IGu34Qs#%7S4PAj6$=T+JLjkP+iPLx^@nwm``tShEj1(KmbjF}{ZN1t z?5Xu$w1@e|a2bA5sxIIiigrLhlAz;Ym)&4sL#6n@@7r-@`=8j8%#lB2d~T|7`On(@`GafME+qT&H(s{W(NG}>X1_IA|tE-Z#gauZj-7!LUDaLQBdrn?u zjUJqj0=!mnOYf8N*tm-JjZgndF6BY z$7*kakq++a@8}))AStI8+lATN_0-FPU#YJYy0y7M;d^Q~06F>j&v3Y3A;cWk5ZMqD z|C;hpi>~nvIuwS8GXrSlMc>(<^%bd31Vt59SfjW`tWxyPdPx3TjTI~7z@xZR@FRrm zgcIxmh6+IWwsy{AQF9r}O10iOj<-dWqE~v0AI?*U<6<7{P(R zm;qqx?c=5Jx%HI;i{d=4R|(GEUv%qjq+R#9a9pQ2CW|zzr(jD`I;FGOTAC4(VK_EoI)=dEB72LJgJoZKi{Dl`@7Sx56X7jWIGCPAV&QE+W!u@_X{7KESc9)N_S>(M{C7 zM(^AQ6AxWJ7H_bg#=}lA5Px#H@4*zp%Ze)_&#{OITN?d1QV7cWFO@LZLJuyf)oQ}y z@lhokVDB(``dZ>WhkHn=wN@LL!A$04T-&a1mR$U<8&wAEloE@zBvQTzfcO&^-tCJZ z^r|fQJE_0qI|Pid=jmz@#3{E6--GJC=WxKBJc`YcVk-<@6=yG{T+C{wM09_q0#|g> zdQ7QYx&cSK#sq=G5+`61B}OuE#oXO-cLFphcG09-c=4F7#c8Vkoer)(x1UL;crt0K5jBTG@edI6}^mw>(h-A#Vo;0 zC<*gwAN-Yo?JZiTKasgBAag1ha#&600_KogfbS9<9E%2)M`V(iRcz-Um7;1x+iNB% zq+Tobwnb3Z14xjKc*lyIbHdd7g-3mCGY6e~r3PXW!sG37)TS@J|cA5mVNv zW$?x-c3_k7c{ufMsIdT37ri@Do*Ia7cV{SbJ_cwZoo1uVX6Emsu|1(6c892$F<$Es zn6zinyD_0)s`*0(mH;;-0B1yrvX4qD6s@W;TYPE(Mzj z{DbTly)oINyjD6IZ&5goOBBgckJ6 zo8^X*(=7JBrS>8L^m(s6i7L!*Z{D**44> zO`e54lw*OJjkG_6A*{LI8Dks6R&5_gNPoT)5=FqAY~NlqMd64MYl_vmGZC$AkhDK` zXzf4-wE>hK2GznlJtQwa0Z2_2p#!?KDblw{7L_`e0R3uYzcpYT~z1LP6cDEs0R z+hFXezubCVuLngJ01gPLEq04BO3mCBX8qRZx?jMSspSAQoZz*@GbBlG6LpIMI0`Xa zuuVt;<1ZZRsN`pY&XV8hcdqgDC1efT-D8(M^V;8G-t0d9ryh+htNsaOk|(@1>kXuq zdZwrO659w0idCh~djtl>%=QFM`B&!N<@9V1vY??W09uK*dL$QeP7`)og>)^n5(%AB zYtOTiB8#E=-CT_R2j~`htcyI|spv{yxVX2MI_uXO+T!y-9bT!*{{>o#f}dT`s8~?i ztKSW|y6aq#1zXr0apFncdJAlUr~7j%*cC8nPro|zF5c+Qy8+gHi-Vom3m{qHbJcCM z6SdWCD!e)0ZW#$3e8P`Z>oQ5l6kY*C7v6^kU|fp%ilO8<(0E*|JHuRg&LC2~w-MnB z0Kd?z};PNj`P%)+mxmRrF#fB4{!vy(09lifnriQz1F%xwd{M_cZ zbmHG_dUjJ*Xv1#HI#fm4Fv6GlqF6Wm4}eb3S{5z~?fqhYFo;EGO)CBN`mc3DPjm%r zAiurQ4*w|k^!w6lccMT%fyJnKxy$?GD$nPK3E4wlR{*xUhmSr5`Njc8<}c$-OI=}C zK?JaPQk7l=(DbKSE~(eZdTAWyf&%I9=wIS| zI`Mz3cicc6htDcz(QbTCGrs`zQ!jVZ-h{1(m{%Csc&~9qh?oyzV%&R1%7&12+AP(r^10qr#LK5-z>C@}M`od{ro)?35zCCE zv?!@`d}wW$%+X&^g4zKmDzfhoxNj@fO5(~oJOwc*1m7cJ+~bu!@w)Cq+Ll@Y%xUmL z2Ih+?+f=+bByzx=)B7PCz*(U?K8Q=Nrw*JT3WUM^;xvvy(Hut9<K>LG{g zeDf)RwhxlSWj7jj`Hqa8;Dydqz46sRJJT8efuJwgWv^ZWW-ARjq;qvKzK`Q92BsYL z%jqZtZ!Eq_D5i%MOG4c&Z)!(HGYt9f9G-g4^$totmQeGdwnp0^U4|b3xTY=wZlOW@ z596w)AJ3l#{3e_K>(uFg{dRxMuzJ~r4MH3=kyhuu*AEMlk=cKSDYGQ!NQ!!1M(#`k zhjKW%&l^GkDCkN!ZFQ7gH&2Y&&CY1bX6}%+&XGk6X{$^t~i@9pyjdtxsUt?a;=lo>~>DB`kDkRfnRSfN+*v>>$h+ zMqn@HW&C+WyJmDkM4SQqxmkY*!p+{Y>l=Did{(Oqb% zD=UR}B@+`VO!qDHF1gT;;PjP*$NC_><-zP}f`Bf~-pu~FE6rTc9|Rj-tiG^b-&gmI z`!vYDkk5OwHu=`x#Sx|_GY=ui8$3$oGOQcJN*tJ7wi9jQBR_saU= z{cEw~!q>b>dA*bSBeTS`>&)^#+3Ji(ku7`}eht=5a41QDuGmcHzC%?@VveBP2MnYc zMONyi&&wh)Z!ZeCRy^Mk{Di{wR)2~eB<|?04vq|qvY)Mf=>v3p{VjhXyd1@bqZVbk zoJ!yGQoEIoCsDETGUa=DU~D(~v2_W=-fe&c#;qSLC~m#GHVrJ37#wzglYgaeV(XmKwf{MP3E?UEoW_I}IC&|GY$CQIc0rl236N z-H!M>VYsBUSp2l-Mi4QmU`b$>qsaK+SJ?viFOpu*;MSY;5!U#l39sHbn=`O2QNhS- z$(jx&FskLg!H-M!SKLb&WH1ZI>-4GAY60%UC^B_43O(WSTC-pMap%2*5Vb-V#-u;O zd+e6QX1_Fk^gt`U-XbTXt*jgR-Gp2nEx#20W|amTfi~+%%IzTBy$z5m2)1d?9S*Tn z?2bR+2Uaxfi|Iw^*cs$!Ak$Ushyb>7ET(`LhP7LJ8RZ2Vy973*SCi^95}vsmHr*)jqhHti!pE1~`Vbp{mr;wZLF|Gb z=ebO=b(%NZ4%*;;p@n(8t742`;pqh-{8?W>`F?xyTxVn|XSg(JI6#!!y0PAR0#njV zltce1dE>DSD z6%+yQB9MWTlGru~NB>5IxJpV2Ss&0qVhNbiS;`Sm@L$nT$xOkU723`NCpd`l=1x?s zC`Z-u2B73ovd{EPxrt`5Z_>COb5E89{w^mz?Eot)VafZD@C%8)vjhfZsujpH;jdEC zViTp-XW<&(kaujLi|oyWI|)jPp*kX%FaoI@JBy!N=r{E)X}&rsjKPX~IxJLv&lkb6 zfd*A1KbsEWoe0(OV_YxDGdz3y;9JvyIaSk6wHb6Zb=4Zl?5jL-61?1CodmO09q+$g z_lU+mO#7P$XH@aAnu@odssDA%6;uRa;qn2J!Z>b6OhI` z5-Sv?eD~?l;@6hFDA^LZfG5_ybq5TK(e!aB2IO1W41-zeB-O3zWlO^nZk05x*m`-k z;@+PZbqKv@=|c^vxw^J-k16b90clpDlrPJ94e?KIzB|Vw8XL7C)0BRqNLIzNn4Z~3 zVh*BG3BqWIWRg&#@ST|wNE+qW79vir5PJ5|-*~v9XgJrEq#!a%3Zys#H=aEbrRsH` zt+h#cNRx0aW)jz`GZge9{N+}NAuz{3qdw%y7*^}<){w?bB8!w;~14>gvV_3&Ak9QTr z3B3tx4tP&%=ySnq4pQHndH*%F_3wZ)a3B)c>HKbm^BVHpGryd|6vWj5*q@L^h&AtQ z1Y%q=W&8mjz{E$X3)dU{wnjfG7jWI9$>8=)$Dvh_(|%{3Bk8o|5H~k>-0t?{%@jTN zbA#Ot1P^)1yijD%6#r6QLS1)M3wx3!t7m%`b(`i>M!asm=4^u91r!eGZ8N@J_HBf| z+v?Gqnh&vNd})NRBBQTv)+KyIvL&!XU-TT84|&XX)=xl(KKixi?z_eSSiT5$zta&N zH>irh$frg$SrT&wy#%IbEhf;>^a)c5>1@p9K?qsi-A9kVmPPvR z`M!}-7DY9`0p9xd_D|}=)c^sOtiN&BcF3cR`tcnr?>vl2!!fHNNAjw}2Hh|`DMqW?!Bbf;hbsaR#(By=m3&gH z2!X4th=^iv4kr=tiPhf;(C$QV@PolyDEpBTr`tF6UgS_naQoFA$MB087eBT8k9R2@ zS%$Tmn`QD(bSFef9T$O}bjfDV!Y&((l7@7lvEySPb|!L-)DzvkD;cqVrfvkma=wTGCnegqzC#}uJB&m2_E=fFJaP+?q>_c z&hR+RYLr}8Kn(+W4lr@L()v68VG})hih$#En1z2e^-~cSuRanD-~VVxT~m$G_nDT6 z@=FUWo0@TcW+TR8zj$>CEf6xZMp&@-hr~LsjhKTdK?-xm)+mksc;jU1dBk2V%9%9xvGuEx6G&@%l!-&DZ9v{53H=G0? zwkVRe83E;k@8#p)H}HS$iWg8o_wwzeq*@2;C^yTZHS<}rwe+%sC@7;4!&3;>kW7BS zkTuxjPS(O^8&KVSXAn9mGN}9Vys<`EX)SH=Z7*s#lI3oa&1*rbj~yd8TV{cI2$K5}yEr7qE|X`c2N|AQS4i&hDJMFgG6^eB?f2;=;YbXOAk z_*Kas-pcrTtvzlS{2TR#+LqCaFgr&B7DIIJ09=BR{n)|6UQ-e5-aQ}7I?jjo+YY61 z>eQYskGUSWKiE#tM4E zLCh}i-A#wsF?6wI&~6N zwnh%G6MtElP7%)0c`hT0hB>tXsaOU0j=U2=--H-1^13hK^VO!+jBAQwfkl)!e&dH~;2ALY`v9v^&ZJ!C!(MxxEimIX%B; zP}?P~jRQQUO0|Q4mU>Gr2zMf6F82Q~vq6jd0O9MTR8zH*YN*Gxt|Dn6Gwqu&VBVx- z-Nx50UQnGCqule?x)eu$*SOM17hF`!o0-)YEDy&9Sq#cGV~VON3#TBRxS_ zI$A4Rq2{h?MXIy}R_$&V--nTU;uo)vDi(~m4|L?Aw7xx__c(a-2bwX%!SWOat_ptF zFZEM}4D}RF2cOHN?<1e`vmL6>I#sQDFE2>gdsVz-pjvQIcsMfF?y}qf2-+U< zbna=urk8|m;rZvYsR=xr9I(ot2Vxu4ojenN_4Qf8`&i0(I+O_lv|lYZ!+++NJ6vp` zcCFr<478pdq_jinv=>F2o=;jmf9reyP!F+Zr!KbgSTh7Fw@WN^eAwDTZ|ai{?{Cq{ zLMVu$${vEyiLQ7hua}P75x=XbZno^&l*QIKA~gG2$IkpXiZ;v|zbeR@f%x2x6(FGY zjxye&XZNyfep3I!>1nXzvx~B%*X;kO-IN$NT`pgOg71 zrfqO7FXrc-r-!GAz_k-ULuc~X|5>U9JiS2pPrVwNJS_!;rNw8Mo*?x z#qpkzK2$y0Hjf}X405R?&8kl>GCG}bW(SMfV!@x8e8)qLSL0Tik&Pd60wupzNJRW< z3C`%U%=9k?{9l(u!a~KlEW6X}KuHz{a=e>^sU||3uUnblb2}(Y9&_Q%6@6+b58r{5 zz!GC`;hF2NN7Eur`(;6RgA9X@J_&CmF=U)Z1&r;Pu*tk@HCb9)yi+XFTHPpG)w7M% z%%#cnDxaoH;$0d%Ikr{in^p=FhEpK`YxX`8`{J#zVKcfEr$Cp@Q3j=Oc^6)ZVH1We z$Ur&idXd8wP2&El+aVbf>0jTza3G@*YG_^vu85ILH1Pw7okDKcfIL2RnUkk($7$>1 zOXK3a5XDLPV)`cB^mhT3DMN5L4)#mOf*7=!m|gQvRcJFxsoQJp88_)qPjw2`O_>h| zryiNkyglX}1_tToRi_=(zES6MD-SoG;+HATtUjh0{SM*vXwSy2x;}(%u6!y>xWA2< z;xCvfQL!JREUAMU7`J{c-luEqBc8JObVS>^>nW03IV`wDrLuJI9dvO_FEa;S7)=#{ z682to%kx8JUs)XU{p9U9%BZG#dDVM>xsjJ_(i*Sm_#0_znsr$$LBU|Duv?$oG7ztW zO;?4OGlAfpxs1$4e@kY;TG>-*1H#pWnVBGlXI z3KB;}Swr*tRZYwV28)Ihhfy$m9cgglA6cvnoKYXtn z-W*vV_Pc&^43jiH_s4H~VrzJ1#D_e|&qYq)MwZYY~1+E6$YHwt0o05kvF-Nm7Zl(tV3G_P>8tR%oz7 zjxd1@bK z&TzQt-ItI$)%;K6L*HuG>mieBC#k+cJkAxxn$Es<)~C1%ht_B+LIeRA8_nW!^9YXV zTweKkE5iqz_UC#9zPDd&I@;doux})&=HK{0Z(R4?mu$3JOi?@E*st4N$vC|_#3SM?i&n#!Qy2C!=fxz_dMz)L?NE^L6 zG{SKI?Zt-WfD=lu=p(`Fc4Tr%5It+8FgU32efRRL`WI^->hlj_p40D*-@uukenzit zH&?VKzAO@Cy5x0p!uJjo^W_!qXsr;C(|10+@~M?H;Y{P#e#_^Um^)Qg;J(B=S8MVO zkG4okMI(`h!=6rBKJ^vsh$-P~$+nCzAH^V6XFenYD!X>`sY7GYaXx$5HEK*<)%ksh zA}u4Wc(_J|${X26`=reS8|k6n3H1-qq)lGe+(P?f5;P^b*I|_BGhRn7)2J09p6EYm^{<^X%Fjr{JO*Jiq_h`Dk;Y3SEm2=@CU!b;hf-xzBCo?4PGTy ztU+xyMqq2IS<1a%#}4EAol3hv&QOOXHRokNcOJ==``HcWc5kNQkb9Wb)fMSe&9L<5 zmF&qk=r9+yblv?G%XvYH45b8{EwKsq?4_1nY_0G6oEg0b123p<(TwZBO=6kS?%LW7W=heZ3aX5n>TQBDBH{;o=2A9Y71B9{0 zz1kv>YH|7QTIIj!rP6u>$9B8uvJshRZkcgDn)JCRl#e`>vdU$E3T^*; zJJH-s=KX_P+|$aF%wVCsO1+8roS*#)`ChfTf|o+v)jVIWe6D!8`)K@9A*CD~rx1~h z(Qg(kk0{+<-K}t&*BxQld`MAZl7tRTdyU< zWs9TT@*}()y|tQEgIEF13(Jw{3a#2wxMZQLi@kXb(c05M1GA9zD-wIz?PYx6im$3I z^zqhOTISNP`VSozQc6?GHTDP2=0{Iyp5y!HIT|aHpEyNsn~q~=g7PT0f0hY#9p4~i z`O-bGbTZ_kN?;&$M3_`bI&y#dWF!6GZ&aF9(Qau{a_$}C7oU1qUw_x+56sjrua;c9 z5$|f1UwJ(-%p^0XxHIWIOu;WD^LQXRh=vH@ZT&XxZ0(}7e&~9-6XF5V5b9)R?OGbF4;tYaFnw#Yb2YU8^;!g% zravYuz2kKlbrhCZP);yD@$a<*+ofO$FT8R?_!UKQvz$q?I+TTS6e%QwU&(C(#g8M*`{lhdWZ{H0`M)JTM^V;iedZFM+gIq%YatDVE*1ui zJLQNc-oCZ#7qv+LzSH55zI2PCC^o@qYhUjJax2;X7!Dgg<3*!_4SR4(r%bhh( zx^ur<>Bf;%Gi0+?6DLSv+{C_`G|!{h;H)o%+uE-vyzmiRB5K+{EflM7d*kUm;~Ngy?p(*!nG`2KOi&2{L>w*qTxdBLMBJ6 z%Fyz<{OOV+nY~OeUZJ00M!J5vPitmQQ+1TRI%9}nVhW1%xccqPIJPZc@W(0UJR#_R z%L42T(|UWBzLpjh5TiD|t?j&wGdR-NYgshx5_$55Inma6duU5KKHq(#zqqiWl9+*Z zTOaGxV|QyUQf zJKnZzCQ)0{W|_va!Ag2bAXV1)W8&sVNzcdDi~^1zL}c$;<n12V?e--y>_fMSXcwgpS`Fujc&+vC6)l`WP zM1AU#?ezUQ<^!nJY}kjcVI>gQm_k+pH7zu%#AG;WEbL#*uZ(jFX@gSAQD?@srzHn|O(z*PCjYI` zWGpUUr;+>VHS$CCQf9BawWO`4^-Kpa7~3!D7;jges8XBU|KOX68WDsgyEhm}DtbmH zd0R+Icij+J&bEHbFQAbffhfv;H}sSKxIGf*I;kAj`p!yOQaQKkV?4d=mT{=|5@Lhp z7<%AQUIVnCK;`=0g)#NCoxXJv^-g;JkEVpU*5@_Y*C7&a%Zvr`sY8WK3+1OSc-&%+ zVh|ap+FC;`pWOoN%-_;XI#OGpldEr*+Ds{lOHF;15=z0Wz0@l01cXb??ltB7cQ$1! z+5<-lqbB5&{7Sei+oR?^=7$R z$>#2xEiYpyZJoNJ7ivME$Gx1q8v*?j%HTh@_QK~UzgkT33PiQvS<$-VY1 zvX^{fsT1EBz)8E-k%P{yfduC5**!OUvoO;F_jr4Z=9mp=Rw+ zc(-VO^=RV3{|)EJAe@ggQ1wd5zQrLhI)QZH1w7S8qc#tO#8IqnyWL)+V9i|wAj>o` z6&(w_GF>*l*rBFbsb0!7m<~|Bnypi^;fUZCO%ON;JmImXd?|2cUrpmUF%fkz|4KRg z_t!$I;oPHvs=%L5u>|QS1Uz%ulk?g3YY29(3hREboi+jhruq%KxEc`ObBXp#)->NKg;bsUcw4Rq$t5Q}Ci-f-2YSgX&>u8L+bl1ch zL*heSS-)zx9W70tQ1&=<*63rkf((Oek1pLR5$P)H$nvlkQntgAp$QeAmJ5TWb_n>q zlU88OeES6PeG<^fjwN#eU}b ztu8~gS-CSq&Rj|A{+6r2&(+SY@A;j@w}oI~2l`w&(_?lHd=mJ7k>Wj6H|%1GfUmhz zTP;2a4jQ)xRTk&8hDRTMI^o#$!VGoBgqE7*zM@6O_Iwn0nf^gwZ6Gc>OHN>5C;>uE zYp3_c%yJTgD`eR^w#A}<5pQ$*e9u=#I^d!5-_(@kGKfvrtM@=zLxY00>58h0+=s$l ze3|TV<{XFkCYf*2x15@bP$rt&;OBOeK~*zPo%{I))QMiwEz&U7h+!vs>c3dSU`RT1 zYfHeMnVQc^q+wu@n_ygDHqMDYID_KbghbWY7Fcf*TI8kib=NOSTfBv9ZgTpJ%UP%L zsXI1ZJvT~1X_}eM)^fRjlIksgm@PnE^GvY(dx4fzk7gOk>HWq5nF#KdS~cGb^r$9@ zo}60vvfBlvxP?+=e&hCYhO=|CJdD7f9p5CFws7*zwzi6TIxcsooUc>Zqa2}JQcTRB zSk{s<(+B&MPk+f|_J1*x-qiDaf8kRG|6Z)vf-?W+0V z$U?(7W4k2yjq^r&dYnoER~%q2OiuK-w#zb?E!R+tiaeWb9Gv@kBpy$D-H?q+(Db+XWwVeIQ^%z;xBxq6JP$?p7r!T6`irO_zrnVpJ2Ap9TUYh zZ)8>8Ab6!ni}FZ0DQahe+G|K*aNRqb9hdSsNU2H_LyBHGa39D{Q2*aWF4D}QZUB2gHdG1S|d#XjZgg58e`TTqJIkt)N2{g39F6Hr-U)gVk zZX=zmW-6JqIQX=m>w9TxB8`73BIX~*`TS(oBX787-oG?wvW1G)abeCUT?N~Z+oVPKJ0Rh(!^9xgc9;>+gJy(J#2ao3)X# z@~y_h%+Iol24V}GH^pQXLJGFVy1SkF4-#F5ooVkykh8vTr|p){c)Nnu^<=PVTlRD_ z^QvLTWW{MfW??Bpi#(guJ)@k6tKW%rQ;=H?jc;et_eIAI0p1QyR%ZDN|Fx98dfXM~ zoho6^;hIJv=eo4nX89#9w?j@Mm)uIYoQ%oL+~@N)2p3xyJhE$4lD<)i z{n^iqP0K-+NFn7}9(^@sTY{4^^5li&Ce~vbWgTXjT9O3Yrr`AW}1`9UKBl5e2*B*`ywmj*g6AjrD&!5IB{DchU7Iw;E3* z32%NSrM>h+&MeO17X4Xy`F!go{O1AzhpD7Tor{uQajj3A=47du+VL(aWt3=h|N8J9 z&R0%6%#gVJk-*3Y)yuIqkZyHvj6O0^Z^Q=qK2$6eGvVw>NHjGmJo-WG?uwZ zGM4&6aRyXP-#s&?9AZ4;YneN|^^3wUFY|twGmf!M- zAKsi$aZG%nitu)lRj8-3(*?E8JZ(qWp4|3qz_$Py{dmEAgwM)9@BOKI?d41F^2!>ZYIXo>TTOm*x8U_H?I>&QmHot`=rk=GvMD zWiVeA3130+veX@n%m@<(1y42@N}bK9iicxaOd=-AXuI|kPG+8HBbsg!duQGhR9#Gx z#`7E0D4s5UFgXvQ6UT^~294_}Y*J_{%Bs=U3-O-O123ePE_Xj`1)Uby>eLzsGYf3e z=M}B~&X(!umo$@E@9p`#xYrnyktIi4b0U=QJQa}V&pgrGSYJ_ycj;Fvs_82~eGY_Yf--bn8!E6gE?2u$GS=U3e1#+U zEET&BweNh@=;+2TbvGM+zWMNk#3do@%OLL95&(prPW@*-AKQ&uY=!WaPhZgw=5I^C zTV%sR{=Y$>2G?F%I#}d7J$Q!s>0(7R+vR&U|HV}Z3EoErm@uBKj7&Ioima0C2llD8 zzRxGv_Tj$_))oEE%n5ZJ2e?@_D{h}Ibx6TcO%O;B6YBMSVy=D!3=dcYlRov7O(9{y zobw6BBUK;mki%ottCEjRt?yy2T-d3Saoqczf3p5_q+(3p&V4&e&n+@T*XMl&&al)i z+)A^GBe&|jY(QE(7&C=?2GMf{rR5^_au1g#`juai?FT}C+RRtpw4oDi3;7GT(OEF~ zF}*zhb3T{onBr14bY|`pFX<@w_$zO;uhv^KtX&nL6uIDR5)Dwta8a{8F zw+JXp@#PaJ#O!+2Y|3UmBxtB#h3qBvuN$8qnv#3whvK>5$epACT{TLEu}4Z>Q%P|B zxhHPeN-um90)tEF_eA7jL31K;Djh-R)lR6g>kJ)U+=-FkonyP4eLZg95pn-5do zpR()T740kNWRDU&>@RgfL67kl?c&?B?$M$FX4Evad{a)W(M1O=RrIOWW#jGI$EnAY z%oF?$MiXw70}T_d=~0~dPV+U>NU;uZWbU@ z`3xC`5IjGA7GESx&5j%TnHCXh4y*TRpH-9Kn!;WGN?vF894FhRl(tfNsNq3T><%qo z0XB)3i&FN&{sKe=NWukJbAw{3<`Pn>bb;0cgi6=)_I{L0*FAN^Y8pC;(TK6$S$9A`Q7$#A<0RLXgN;u4coPAWLCA;o zNic>Ac?~UlYX!ddh2&5uel8hR*lz`H_7+o$+jR7dH#=I+q+K&nr*rz!>dbNct<#^7lAIQcK4uTrZBsXfEH#tZT>KwaYGb9~m zTreN4f6M%`Gy6`gWAcgZ{`8LcH*u+*MsHQpioGc(>OgHb7c<%9yIKI$L6}OEBVA}| z@Kxq{xkWDPk(O34X4J)?n-!VJDFW)vT_qvkI70Qdk}!LZp94a+Sts}g#RF?Q-z=gR z>xl>njYy8bdG_xB0XiAfCgfnBQ@$c(I$;NHZl=+H?+k1xc=-5ImhZ;gP{Z%ajl#`+ zS_os)(0g?`pHgaN-ig)~iw4c2au_BM1oi2nZN0K44BDAZ7C~H;ix7IIo#Odyv6!a9 zoN}WT6e9vKqk5gK-l#O87i=+LJn1HLT1By@-8PwE$lk_*q$W{0V_LA*xJJb8>@`}c z_K~?~zu-9vgJrdEjrDv4UYkjDspaWUm41Z1=@?k`2-QoXd_NF_YSx8JMo)~}0~LTR z(N0x%bvJq!G$sJ8P)!Lk;`JbVoS)_E>&u+lYc1$KQCU03gB4gtgh}YTbzCjlT-R`j za@FZ~2to;YgiV=QPmt&CLXT?k^QO1iJKBYb5;R$U` z@OwZDRLe%zDp>1eLoZ`!1z&Y(lxn=xuVG^3bAszgV#3w3ENdLQIA&R|XJ z;KGq3R}y5p^?kc5^N_WiY+l?7Nad<%SJoc{;e|c1^49bHiA|eJSfoX(t?w!4D0Itj z_D?KKcSLda~ zLvV2m`&JC)D&Gk`ysLxYeBN8HlR1XI1gRZ$y$a^%{@d^87OGNJ_ItI@%J9N!w58Px zN)z@#CdfDG;dZh&%+)VEj-oFhj%~W$)P zdFi+=g_kZZMSQyujW$y|-HmbpRCDF+jr5DRn*$-pI8m8o) zk~~lK)Qi&EWw_A!vb1`_Hy8Se^E$8(DW9B2xw7fH@`8Tl-2e)$is}Ave^Clv z&&Q45s-;4@6rtH9Lw#CxH(-8j6DP=hp=zI)C|$U1WWeQj6~{;RDs{6m{_)F^RX=# zb-U8s-Vbde!*L65_>Bbv#F7tJuST@ZuxTt1r;*V`@?SL>#X`jWTh}}n@nWyzA&F8T zR}i=5rdn~7ltkiwxl^^0XxA7CjLdR;LqB{lDQbX68Ak}H$@A^J_^w{0r>aY~CWr79 z6)~I)lZqelyK!n-B3IUws6R@ZVW4FlUEYRNzSuyxO4d&`ZAW$*T`L~5kDyU z2%N@q_OM^zS#{kmAZvPyX+|?3@{#swo%OzENH}*)^A7kFoFju0X^S*ULMwDbe_j=> zDYcG3sc~7cIq-=H3-$0S6xZo@o@P~1YBGa%$28NvHJp(#>TDh!1=u$l@^SH~sfy3X zy^l=X7oK+TovgJPFCD6udXGCRmzqaXeAk_GN+;uo{s@^_hw-_*9SXqG?GnS-;^lAZ7absS@OCEml=9m3+vKWvWkY zsStf{A#IHm1C??vm4-^=m8j!fvYi~$&LLA~SDK#^0kgc7e~y(n*|*P=zf(RhHo(=c z8JIr0&P9fw&h6D!jE@15l?l_-;c#ERyFWH;%}i2!sUzz2axY5A+ML2qL)()ptmnId;!@>;;|?_OoV$> zS%RK)X^ia?lo`B=P;nxrXp9`MD|iCPH%tNTBKBrXq;{VJ zT>*ee^u9QgkW^Jr)=`zCnU9T^N5+2-@$Shhj4L*3d`WKVRi;pvmjC|A&aLLvjVI{I z@PjRtjCGPT$slOFqF9Jc^!B$6%$X@DGnKmL6PLUx>5TK%(PHenJy(*ROJsG|_kz$4 zew8lJYl!w`rLu1btqA%BAp54H$l>#`y;{8n#K?YmH8j0^Ifw2pQv?L{A;Q$2ED7=$ z(TIaS_UFjDEPW4m%AdbG-M_s~4K3}zUPSNAu(IVp_L6pT%viqMqgh!e`;}(sE#YhF zEbmw;eN!xu}&=sXBBlKXOHUxCmFFuIc&3EWb}ZUIRQ=l@v~PLhhmA z$WivKmQ75AW`aqpK}*_oTX7T{sp*!?q!0U;FBiT)l`(X_)?S`f{erS)kD6;s|H_v+WO1X$dt z`=!MFQtZhF1l-3}?`_klGxvOc-mO-anl5-05S&&}8*TuT0 zC&Nnri8QkgXa0**QOp-gsVAc{7CyicBcwD|(q{5CO>+RBXS6Y>;K}?TtrC;FYdN7^ zHc53$-{Zl+$=o@%tjEcY`b-0~{MIWcBZyon9tmQkn!WB&YCEnH#4*JWRJF# z+Ux^L)IC#EY2~F3U_0GF|6|O8%*RYPo{uX*N~O z@2Sf0+Sn%dvV4I{YY~6`yf&7|es_|o zG&bHO)JN&Ca25apRn&T;lZluF)Ynw zeob;JCw->=-j^r?Iwu>=Q1RyplaCJQqV$y+yCmM?LJhvH2lGjP(yi5zCS;BJ75)Tj zITEXNxy$5?Ij+zvX_)=vWx*6h4Qm5^W+InNw~|0cf24$l-pKxho zzF@Vr)H5tpC}o+?Q~fPrpQbTkbt)MhZvkHl@>4{Z=A^1Rs|*F`lo$lLGb7+cTV@AxcN_e{kO0OIIN`tEoZwHL#+_*vs$6%-ai;| zUQkdjbt{R!I?s-_ouse$$SeIAlX#KgrUq@0Ppn6H$uoZvZ;a&Ipp0~e`7Vjn`R)@b zX(=Ut8#pSRn|O*5H}txYn0HtjYM$!U~9b{BPoB)p_ki~NVL$JPf{w5VGiaT7B$ z8R<^>s9#4k-#r&mm6`Z@yhmth8AH80{gITc979ngBtpE-jO2TJ%(#ADlPpsP&FOJZ zSdO0}h}sX8njlz(F4sDL8-MskV!SN@E&{m7Iy(4`!(4>#vC@|p4x(+e;uy#mld|Tt zpnbHxtN))IHthm;ywv1Fx!s)LzUbZQIiB<7&nqM9`Z0-ivoT7fq&m(cs?UwuV9nmD z@KB(w`MN^WpoZOcnwvIu>u^lpw<|_nkKsd@EebK==e(&PnW#iiRdooE}iojl~4 zp#e=2xKh%N*6Las^zC`-c~5{^)PE2e$N_Cvt8GnK-$d4tn%4TG2upi zLbnX>fmiEb0~_B_Ld3Nv<4^CE7fMZ@EW?Y|F%GE}md?U$*$^>x#67z{om)wEomIMN$x|Dm8@yY0t_yI8gk%9 zq4HQ?U!ST^ckK(yVMzjJ4T=gAm;3l&Y&6aFqYl$Mf zJ^V=4F^=uf3w18(*F`Us-)V*EBuEfN(uWCK&#`ip{-v<8>D>J*UIVX8sL*XM#8ABRW7J4P-5WBO_&3d2RPSP76GAuIMFMJx z_lsaRZiq%z-bYKDr-PkRgII?yulm*Xdq#;lbWW*iygj8hJgPH5tv0;wEm}RHhjDWH zZr>i3F6+AY%3A}Y^Tz#4fgtw?($i1;oGV?h+_1-RYIVUe2Fy4tb-46Duthbc8QA5j zrt{d4L*9yb?ln}s-5yucs zPjT|nZk8GNyS#?u1B4SJOTFdx32wMW!TXqsyBl9!hZ2}5Ic_897!H6^W_mE`=M$+k zMjSVQoxeq4f7yc3`Sv%A zE!c}A4t1HV16`r)S&2I$;{px|zUk?FLsiu1XY#G;9y`2|%QRAUv!ai8nbSw*G%7x`>Y!v?ejgi%Gb%FQXw zQoSonRk(qEI?_;S2s14$?cs!3Dr$N>(6nR(ZVaEm+~aS_`e9LjI_s&h3j~N!wjK@# zxP?oug2^~t6`?Vzq@j_M{(dZ9lUl$N9{p4P-B($=W&ONNv6K@* zh`G%7Sv^si8P!UfS<%=C3`|qCtV1MTIN~bIq(2QnlQi{gGXIeV@pJjX62`Vnp!v9n zjfAq^W@5EE({Ode`RVo+RxP2P_fuZ98Jmyt>4q95gS#6$cP;TDVbhbe zMg=}t)>o_Bm1`R47o#EYUJt|5R+}(r6Q`1%nn3(oMhGr3CrJ-$x})VQhw7x}Qtf|b z%$tafK#Y=SEy;;0_C6&M>MGDfH{Lq>5rEtS6s3AhYJjeG%`~v@DYai{$+=MgNs{~e z*I*hZCSFv`RW5_(djmX%EHIt6t*yFm2D`XVx20PSJD%9(z^n*xa-Uzu zqqn@cEBHLtrDQ)d@O|Pj-?X=MEd`y?^cl- zwKr8rUz3J{>TKLNA_hQy4Nd4HQr_1`TxkF1IsRwrzL!0s}L z<4UoR+B;2C$Hfr3hbjFhWBNs-pFp-*Emx0U(%6d0C+p6$g|KJBVWC@ZTr7b48Xv(2 zj-w%=xB%J)F&>j{buhuOaYkJzVG4P=6dhOPlG`-&NMEwYzSx&8?&FfSCY2mw7agCi zj8y64S!h7i2e>3(I1i$zW>@f`#+Te>riN7wYy+13X2UiSxL@c8`3FMq5|iOGBusjK z<1)P++$BjWO?x>Sa2y)~uZu4_-Xr)*`lQE?F^_B#&T8?3aR;IWqW;$cDqKMa$k5Yn zV9+wc3;F5^)PIrnjs}EonNz(ELv-E_i76N9HRQMyM^>MVYO~Dg=^6sTjkxG&Jijxm zSRivI4OUZr#BTKx<`;J3pc9Vzh=Wa!GSfc9Sgc|v;V6OMGUv5hg}81=>aX3w#ZBg$ z{YLHSlHW$Pm!+>ZJ4mKIhwPWdHS1g>8WrVCXdo>XBS>QNePHwUaNkVuSBMvEfX~Rh zL1R?&I3W*I7rH$nFJ=Kr`FVb3&eyFxl52_ z=KM5?2C`5h7w{dcin`6*yfRC%tqFL z!gpb5P7cgJXF)}thgNji2gru6fOE#VumzrnsIR3FM7C+!9JnBqFz&}{!|1=Vab=4f za7MDp2>l}%5Z*)HO=J2e-XjzzdAr4z^2Si!d-6Ryi$U;=mFJw#&UHSwfAPsA)8(0b zWTt$&!6%gAG^O2=aiRDvm!t9U(=ZSB)7)FLpZ%}l><4&7%eE!Q`g&N8li-KhrR^&$oJg!x;WwVl@{K#b_Q_3XIB&xR){*^p2`AL0#+BIHcJaX6qZCG7h z1$_oKulb+|zF>EOzZ-uAxFR zzVU*|X}sY99+PHVvGh7kIb9l1rtBJIe5_Wor*$^(zr-`aayDM1%v6nq**~fsgZl(j zqBCI!3#j-U!MM<-dcN`K8IHfPB=1zPe&kV@ggC9S%hYu3T3UeORCK;$JnppIK5BC< zGNAV<7)PX$qxVv?Xh4ccT)+G?ipOG46)}(+~ zFd5OUcXJ3FV@(ecx<395Yvg^qPC=Js?+^6gglV$^I*T<^{=&-H32ENEHX(8GPx6G-$h;Gruq=%saFp5*6~k|j8v;ux1nYb*HwZ$uEA;4! zOg*pD7Lyv16YbaOxF61tXM0kD<1Dq=M)*4o@Gd(n|K0|weumWr8pq9ZBux;~#>g;8 zGxmy6iLRL`{QEiA8`8$!A#>Zdu-*9Dy3!(HI`&&ClZLi(T2$4j{j(EEV&8`@1Ft2e z6PI50PLy=R9i$feD?hMtGiYjRj;;U^YfYslY(*d#{k;&_BCP!a23U$5<#ZVVoNa-q zxUb2>A9F?lgEhg|z9Bh}gpAL~61!IGF9g7t#uSJF;ddN%{!0o!Mg@v6;jng0lDFZH z>I^k<)Vq?Q!q>dzAH`WB=%Kw;{D@q~iLi5Cv2UB^W?>L$c`3QDkP;)o!VB3zW1^uR zCY*__jzg_)pgV24SWjuJWIKc>YwAI;+hscuykW$QVYacsn%t;?&>v;j5F9jz!1Ie!>AJ7R)igukz{MUP0CDVKVxr5RlD7xS#wU z(UR9s1JQ^Loe76ejPfDA;}!fTOA9-h(g4fj-$^n=B`7=oFk?eRons3^lIvBxj9ZGM z<4Ihu`{N3qj;74K8~CA~PTR$iIS2iGqfVO@aR9N!-cw2 zMh@-x>OYamz0!Qhp1*-jdu$bqRseEaQ_uTE^`uO`BQ`FMaG{RRX;pS(v_RXu5<7!Z zb_>CQ$lppV8e|AEz}SR3$OCw_(K0Yd70i`?5iaMqK+cqgV;b9LCmWHd<oytUbv5ei*>NR1uD|% znU%D==JwvO$|Fqbbz4Qp5;lmpnWD@&#s@cA` zH?cNi@h8Htm(*`5@yI>azZ%xUYHTemzLUHi6p2kO)t11{BLo>|_!F+!#YLlY_>|q< z_I{XpdqtPt1wi1_J2wk=L2F5bkr3g01a>0fPr}46t>dY2xQ1AAsyBzf$H5-w32)QY zwo_pv<4^Z;J`A~fF-D};?1+nLys}y)w0Z)CRj&`&(&EJWdH1`l!f50I@r4J2F${N+ z8Wem)>jXSTJ}A|%;qfPr8tkgXb0%D>r1%WlhMe}AFKRTc8J{=WKS57tvu>`>ucv?1 zS*wEo`{Sa0yZtKtKj+C53s9`*8g)Nu^fOD|GgD{@dSk^al2nN9ySPFHKhDtfM77fHaoJR5+pIP(S2+k%G!3V<9OIEqPFLcdSeFoO|Q>3q|xw#>r(9a zZN#^TP)pnAXf4RzMz=~7a9;dz)-UY}#}Q&gE_LL+WlLPPM6rgub!^v@O$u+P+{lf% z*)bBC6;oY>l!z|F_jE5CgIAg_R%Ad^^7*03-oFON2DSNO9thMq>COT78&;qi5ewXr zB!>Npy;@M|=Tm(bIX5M@9qe^BrbTM&U<>)BgqX3m)=y$0SZSOHe%U1l&#gtJ9hRjUqmZFvZPb z59^XVH_!6qRy1tvy9^<1n8?*H+R^1VB4RpWxZ==}BUC{2Ty_kY^092jx9EFV=H@QF zo(@!_8^TGwp1bw7aQ=buKNR&Fnb<;T4Hgb3TKfVt@{Q2H2B#GTxIfC%1_g{; z5zyoWG`nwP#z~8d2T|jXOWq|tzkn?8N>?8GqzDBkderET(sb24wcMtwD=&P*E07n{ z>ldBiz$l` zlPp}X)CNBh=^fNtD^5dUjE%oG_mgZ=-lKC9O&f8ZZqr0rc+W?z)6k~YRKj@aMA+Urw;k7?~{kBGzHCQ|OX)~`!q^Ze@U++84X403)Aat*ASgBhGvKN1$2E0^>` z-E3~1b9f-fKc^P_7+>9^VzH(sVAadd$MHDbWeFyA(dbQI%>w=U`}02_{za${5b|`x zUKUXwx-I{VR1G4h156FJ(0y1Ny;}p%kjZ?S)iS`cCAH2tW(?g=6L>GF@8iH?-X&6C zP)?Rp`o+Kmj28G?UEdicj~WPf!q%x5-1q8f$uV zW#v_VkvnRDPyMln5*C(>KeQsz`_M3yd?D94+24L-lC^3=nWT{H@~7&*_T38Vd*p^R z(TO}xS;pn|TcZUrt`2u>v(s9?pUsn8Qu=2wL`jO!dx$y3MWVQWT7TaO-Dg4hmX+!p zYTAbKL`wIJ3A|@iCVzGw`N~E-!zf3`U2-uNkrY8cMX+ z+niiRbq9rBb0B2xqidsGb095PRt`~#I#gfmFsT2ll=pX%V!wMg$F%D+cCvNr^YXq2 zI`|~K@PS5EU$l+1^)i<6AJh%T#-oce@0H2ld5^l z6u0b)m-h>Hk_q&GJ+kmQICi7sV?Dv~-yb&HKE;msNvxpF%ophcJLoszvU?C*WPlJt zkm;H&^i3R8JXQB&?YaMjEXolXp(Gufam<>^7L@iz|9iTAFlJGPo5A=Bt;c=WcWpZW z6Ri}Bx(%}XkD`}Z!S|q7z0603D5cN-d-r?byRY*6)t>OP6m6EGZ~iq6)d(#Zd9zgW z2wcHZtXW3#jH zxwA*IKig5BW_C!P9G+jdBkShL>&o-M6D)<{#_`MV);ir*$@oKicjsU5LYVwPM*4?? z^qT?4V8A0h=>Nlkrv>2-`rD_!$EfSfAmtDndF-=a?FGgKjq($0&!sFP)a!E~mBV`y z2&U-YH>-;QZ#EN}8u0l)&pP}DAq3}r#m^5yi%RqtqsuDo72p@cGzgO(C|1uDhT^Fl zlN|L72#97}C@x9={T0PMKMiIY3PdX< z?q=-#{|*=E-6%;JL@1upX2pZOGB$hg_f2x5!E>m0+bm@K`S)C2zhVL$y!Uw*ADwRQ zZm-CR>UQ1ut10ogRsIsq;Tr7p-xJW+^8c5>V0}Wam`+_O;fA9U`?%oLn^U(j@o9!h|7+&FKUElfLXB9r7of&wf&BS^eU#t>u5NRx|EUHjenf1cNnRo!TB(NorCKO#5%iSWiX(}H ze7s(#5Z~B-c*4i`zu6}WW}oekevv*21RWP#|BY=RNA5@dFSCpDS&qq#Yd{ zPc(_t!60H2-eo>0ooBk8{~b~qMd!PC&g5f#5ni!`(s^M!Zkwr*Z33M)!S5`}zO>^{5c^ zil&Vct{&6?zB7AKa=voP_H&%R&qQqyhxh6ivnYbQv4ukHabX8=KLP*vp;mt3|32LR z`>Iq3ctK1)9H3bUR0}c}kqbMh;X706K4%Nap{*ls5qZCV30`ho4O)H5$`EtAS0MoT- zApI`|()K%&&~a4LjMnAT<4NG00_w%^ozYElxB2@u`z`2J^x^wGdX?5+%FTyFl~q() zxlBJOBHk6pt}jp3Z9GmkX+P5`V2-53;7T;hQM_z74C`25Xk#~1`0s0`fEgJ_rwf<+ zPh3!BL3IA21~hY+VFoIZEnd|d;oB_j_$NRYWhKMKG#I`Ln51;;rZt@f=Hw_<(p#^1#aA`=%_Z!w;}+V(OU*~s^*>n2WrRdx4@|S*Vk9UZ5SF4JTK0cB20jl352QXu$w7{ zD5BJMhWC8H_l6pzfHAQw+M~jvvoeA!(JITJ23x_{aM1DO*PV%z`02D$1V12)Hl0wq z_T2>cn;($!6-o8FZjV#W`CJyr#78vD-zAm zu=zq-y$rN`uKu?b(}aT1`45`r^na&P9<9f%|26y;1xylgF=NrI6GmX49nI^!*(PLw zv1`~8hIl`Fttj%S(EH0sq{v@P0p4PvS45d4YV(EbPBq>1*3N#Bq9K z@A79&#st1oA7<1467K!k(aFi=Y=43AAgO`Gsh6EG3cIECE;S`4CN9Bhi&a8=)_7)g z4jewH1ycpRYo+spU}GRTV2T`P=9+c;rsI2k!kMz#7J`cunFmJ@IlOCm1mziLRKYg+ z`cG+vz?=ipXZ6^r{yrP9+XZGEaiBuXFlTl4@fM_{p?PE4Nb^GWy)tD=0?{ez-j>m%4MvgyZ#dk-wIdI3)1dxn{*2y_MT z|0|zfVTLp~RUXsYg91lhpn++LMENuAN?AQ{PU#%Xb0pNZd5ozhU*EaLJWnLIIbMOm zLH}ZT+2Et=Sx386vUBI77y_FWqCI;J|kjroGCJp zMg5q%n2=%f;O3V3Z=<PD59myh!mJ!LuAyuKsWsOY$Cr|E%rW-N#ux%8VU0-k8;ua_8r5$Q*q1?&x4I+WLHx{PZv{0N4xX-3J7Pj&uh7^NJc7ixnl`_^pRzd~}=l=WqZ-fHs^!Zz*4=M)__t#IHdw zbX&itZ--JVm+%7hg&6dnzWooR6i5@c!-B=m(|BWG0Ocl};&s?1Y^>+D@ZKLW6flxl zugNci0^|1SgQ{;qjm=%q;64zn_EMS9e7iX;1Ly4@iJr6|eaN~3nPmB>(cU}~Uv{lE{Ss5_Ve z3`!$Ti9a5S?S4~5gr74t+8NmV=P zZ`ZLYf#L%DEHJ6Fbw>S)X_Tj3zI%IfD&$OhT@wQuRW(b3h;|9W(dX=;SJXz_l6U*l z$SaKOo8mb)Nkamf^gtnwMm~!5O@D#rDP$4!s0opzVWgBHjYRF5?b05q@p;en5V{l; zUY+p#H9`SdhiY*$^k;txd1+|aIcyH`w;YN{@(;5A^jXhKHg_re>$R4U5};_n5?*{D z=%(DP0$fd;XqD(LKm$kpZ(x1|MiIKxnA+8Pjz|4aC$y9B*e7c!~oP zK|KEOHqd^$(c81>d+rvtBLF#%a|$)P@M`C&AKmZA^KsVY_)3yaDHlm5SmeApj4JT* zF--zedMD+(%|o#082G~L>-lLBfbMt8)M@hrtT2lk!^g?M0~;br57mIq_yF@rzdFC{ zmy_>VxIavOo5E|mW47IQYu3_hJ@!INS;VAo?p;H81BS zKs0tajf3}@DX>+;s~&8xfciHuS0Hnn58M3dcKN0Ha+oLe*_u zaBVr>abHFFUcCzGfbj}~78P1fPR?{*Dm;KHZM+F+F7`m(GZvURj#wUnR#Wi?`H$vO zD8>7Ta3+`s8HZ^Ys7Ch`<(4|Xo3|!F8HP>gs~4r|99R(8@*14!*s5>S7`X#%hWAy@EaTaS4hqDFTi{ zKih@~5of?8|CRgkD8T7W>|IX1!?>hr(E!Fs4skILo|PZ#(fT=EVvmkc09 zRl5Q1KT3RlXf*RQm>ibel^E~D+CblqHD^#08&pL%DgC4+4DkT1C5|Eb1Ymg7tlH_f zzvXg2s{3KP&v~C}s%}Gq;@1E;eFhukM2E7&Tw#_$7%k|m_1F-@i%F{@cX1@@3xZLs zEc;;fh2TfTIGi(4Q8<3A?CCF^z4zbCz0>zIL4tY|4a`4JQ0fJYoQ%WHH4u6|$|it%`oPkENgmgS$iyZ)5G)o4)n)Wl48U4kdKrup}m6 zz}|*n?5XxTt;I-UNgV?uosC0&M;CW<5ib__yi4m8{>7~!kX8>G4;;ba2JO}WJuL{K^SAn=CYrN-m&3wI7q9*xbQh-k*+Pz>zps+k zbeYV<9_I)Krff3xdgg zs+*&Pr*IAWv5)47tq7ZBzbZ@YZF0uap?g9ZiKr1qn6ags?y6)15RA~A!9#kO4)9nu zrtWAZi+Ic_jlt!(Ea?ua$KQfFCVmh<*94ib8YmF$am%r;W)&d9dmHDl&nb6(z<#DS zH>Tqhez+@Maw)sS!TnecA7byh^swOkl7r~g z=wI&HFO&wr6e%1WvhB|@FxY&K@{UZaTD!(*oX zN#Cv6lF+E|AtgCIpcS)-iYEZi6Ok^^1jR?5tR9;&nHk$aW(YW-z!v2B51>p3Q=l}o zoSRozS{O%%&U$Mhdry>#`Kf`b(bJ*2rH_2knIi6ZXY)onWy16A?og389NR+Mk(F9( z6++BsV9z3ix43 zq@k98hZv#Q^$tyjLiPES+n4@=LtLS$BM&y?=Q`cE4XO+rrd;a<48*&aJdv=ZlF$&% zj`)yuAl}K*(XYumb0^^&aP0m)O3ezSmiK?@Jz?5A2#8~cnJxZ@2D?NZzil=dR9eQ8xOVg7xcr1a8cew~BO|BtMR2`^h+fpMPB| zF=H{r=>+7lMHadQlktlu-UQqVq$w=>CF4l9qgrnbB!Vt!Ln(~rjD-X<1gV9Y{0U`J z;c;Kc{z101iwQ;bkuDS>6wYkF$$a;&jD059`%@^-*A%wrXQA3{7(VN)OQ;RniYgS? zz43MTP*@Hf48TDh0OauB!cYOvUZE890XZ$J)e%me|ET{(GL?(oZ^<>H-mJZa=1_yU z85zf50=(^sOH9c*P-pB35eU1|a%CXJH}4zCNN_#2)%4GvW5wKmDMTkXXTv$$tg+L- zxy^^IANAk&L4w*H+d(;{D_%y2;r}*KaCI3MAK4LwjZ<;F5+6;V?UOv_*?GL5^Pqz% z;^$P@P1mj!+7rC66*Gq!S++x|q~MCm7}k0*4*MAc{&fI&IYsTubg`cziB2?$e;b{j zHcM*JqqqgICS5{vV^x4H+Hfs<*mUqhg}VXWOW?y`o>WAgYNF}*WY`%}u9vz%Tj}mM z7x*RBdSaZnvZ(#cpZ(c_NN{j)fM;**>i%H}cFl0Q*2E)D%7vDq{}Vq4VexZ)ZfW*^ z@sn{u`r*%TZ$-#Q)IVx9H2putZVzxKp5fl0;Gz?uH3^^{yX-xeMwe{hy3zSQ&qg-E zPW7v5f2;XfgDG)!rVSiKHB$5J3mp@!npEw;z(9l+|2W#7k>377L6%4HWBbo;F;0<% z3ZCuL)L#1%zm3B}D$6*K>R}nROxRWcqW$^_wePhm8IMH{;>+iwiae2;2HqNRJcF#y z=$Ohgj3O|Q@b3ZWLcO5#a;J(|81iSS=T zrE>$!1(|uM@IrSO?IljLuT)wcT(mIEv^pXyb~W^83GQhE*xZfHqj zi5k?HMT-lB_!&QZ*2ya!o-T=_PaCRPUZ3n|AG&H?N$E#|uBuL~D-~23vmV5B3=}4U z5pOI4Cr+Flg_;jk04aMpl43`rC}4h)jjg;d(A0j z-^fTTWRjMvGhLh*8q=w(gx!FwdeTQ93r6%!YdP=KV?sh`Uu?ney>y#Q;m0WO98sG5 zBuo0+#Ih=TRFBOee^~U&Mlo(wlO_s>lnZ(cS?@#_hPLVM5YfLLG~6@XeT3|apSmMI zwr~Ft*cMgKKm)a5OHR30sI=#xSgT<-p0Dg;VrEvI?=eHWx(N%#3OgO|jv94MkG+8O z^-InAJYMu^1{#lU<}{iX3>qr>EvmCnOUA$|T;`pmR~*Or6N|{N$MFb4t@m>mf7~5> z76uq1=cpsVe0N0+h_~H_vVFl@nIV*hqsLAE|K*KHfoA`XYJPs5 zp9pT&E(&fwB={Bg5?@Mrq>0@=txR@g}(16Mc&XdW!rb4tqm`y=)6|NL4MQz1w~?-nVE#nQz;%V?{k{^x7c?R&IMtP zl@jV7VuY}Mw$6#o^pA{33)(z~@K#`~`=h>*c6>s}UG=V>%ppQFL=Ty6NT<%~<0+-^ zf&E_tLwxP&6+-`1lgkdvshq_ioc{OI)hK{Ix|OYmE?T*Luvpnmi(F ze@liVXvFNYXOzkPeE-AvpY-rwOBN$U*jgd`tawi@_9z>1&KhuA(b8zeb7 z0OE*>gq_?;`iiBGQ75@cj2PR3r|`H_kX797UmAlZ0T85}`6?gX+49bq9M`>h-1rH@ z_r^mlhWiS*uAptV%a zaxY4JZ>71#RP{%VF{-L)441FOtv(KvUJkx_lVvZrcW{TiPR2A*evLb@FXF&W@9ZGW zak4SM(_*Xl-+B^610B3%ufkmvg{m0BZYdHg>^q`eB^gyfM)*4;XVsH1IngjTH(sBE zIc?=S613{qBON zd)Q@|sagP^OX@VP+IlKvrq19Mv*cQekr#!_i5^eU@+n{TwR@F#7w_oCGB`bLio&0}1@vU1MBt;ucaVfJ?W(^Icb`v+s z{zQG0a|H9ZZA>BZXZ8Y=#os<6lmOJ};X(+{R%r2DK_$duNV%=LAIFdauM-AfMwBMk zol~-Px3KeW9pu+I60_@k4$IOo`L;8u{;EFCMRrqYnScDW3dMZcIReh>mIQ3oNva|82KpCJP|?3q{tv}Li}7J;o2B|x?&8J`pn6JB zjfAhoO?c?8&j4JQI&LCr;;7(3`nMQ%lk?92(0)TjG#T-Ml!!+OI5;Qxv_M{5+~uiIPBX(Zu4Qx9oLtg46?N-+9dxt&qER$L6JYrGULaGeXZvqc6%ZMh!9xmA zdDz^k090(zK;u>q=!==M^$zf_R!sgQqF4X1H*L~cpH#HodTg4w@Dk`1nt~R8!I8=T zvi=T0td!fYQry|2b68;46`@PG(_dxCB-%fxjL;-ZmeiNjG)yrXz{Bty!?yymuskCyTKw6w7z)Qe z+7~NJouOYB+XIb%N0kYqeajC=`3C|0f62l*X&CPfKVk@b_#AlD{{bZQ-WO|ct9z+D z)!X`bolrg1gq~tg3_7)G+~dg4U^wzdi~Wmx92us6m}`ck$bvoFK)m?g{1?-uj$o@G zfE^56UmSgP;Bm1f4!wB6Jc9UlYXPAT73?!c^z9$sr>0@B)U=i~6CL&+pmA+riCGFV z9V5o*x1p~dwX6BSt|)4qQ=sbl%M2fY_fPRyqW)e$k%G7xuf_H$Ir8szXxwYLf=zlQ z3J=F;Q~>mkTs{SOG5^e8xX9^O90j5Yw z$YooOV@{O#R+j$LzqXda+# z`+zla{X=Dculz`k^Gg&ML=?IuKe^b*R&4dTQSXL1r(jyf4;R(h>BMdbde#hYPIsTj9&w{44IIct?|NxvODVUoT)?O327~1SG9*0d1cAQ*QeOF#QbH{Nw18-@+otXa3B)F8OV*VT;RmZYHe{ zF#c7bDhMxo4=Ia?h*$;qRNM>D78KwYlC>sd>5?=61h~CEQWo6I350TU*W|Ni{D%4~ zNP*=xHd0JsE#f&^k^YyrJOn>gH_cV9tbyjuO0{WFA;SXXbrP_WK z&IJb2l8Sn{NnV+okHNzBR$aF4eb_#sQ!!lTcwbgL(Y|B_Te+Mjd~k23>CO30fc6Yh z3<|%h-42!=m5#xHWOTv9KKil)nD4U^vFI0YeD15wwRnG)S4=y<{9vOQ__H4ms08G?hlBiR83P;m`X2z=pEfBV^bTODW7eU6XLzyI{kYx_-U z%j6O7Zwa%xk%8VW{$PWU6cP565?{s$E;c=v; zfqjLE7M?B?1A(}13*@5I8tipth?>(lbGDF)e_8;rW_j_Q5R3P+v3%q>*M;ke4cOB~^SzsAkH$h;q8@&U3xs)5h&G1(P3U>4wQ#ydjS zG%!!r%`$9>u+RhEfD`<YtlH7XdR%Dhe@(k-qy~sFJChgD7p6~Zj)i08LV=w;85}x9CXnvvE zC!jThOaD~8=n~|y=`|ywPpagxl@l&SwhG@5f|=*(&H?}itXbtjv``bbXDo`4kDDk^ z&X&yAJ$0@e6+9Vz&el@+@dhEhpT}U&K+nXlNW8DsAC@@qs9yBM6nF zNuiM>V%N3MC&uyeyZ`+t$a(P(~gpn0*qX;3#vYmZ1rJbXS(wn z$NrCxfgWZLlj+=M^INXQqM?^ti1AD!un!@9jpJci_nKz=U_&8Tn#mJPQzUe^Rlu2v z1!rd2xR@vycHSj(sQxaO%&{$11AA=3_ig~C8Qq?KYMt^;DBY^+rQ!y?jo3@+jamEa z04<_f^apTT=|H}g;dO;kMxp|jeXOy?#`k6+2W0+$fEO0z_BOhU+`L-*Bg6F&)Ziv!#78hd*R3m1lD{P8kb3sXVdf>=n9jlKky<6lxowO4y3B zf{X&GeX0gJF&;$-N6WO&tqeACwMX%NaFfh2gFpmzxdlpyVd2CNQfLeU47*J`s65%7 zfE8+T0HQHT+JM>*cP(oNSoEI&(g+a3NNy>|WkpnB*qB*pa9G(+b|;334V6B~EbfFC z$NkCcSi#v^1!H9icuv(cJ;41oL<*YtI3EGslyS=BRh>I zxWKFxjSfR^BK5>GZxE!ZyEse?3z55jx&l!#sZ%t4{0)5JxoYzz9|VL==h8Ed6>aOX zINc1MJ9A$(`eVX&rJP?w1pi4tq%x@FMeTXR(YZl zb`l6LhtUtZZ@e>~uD2y03!Dw%FcWovy9GH0*E!}-K4^n4&BoS#xyM?vrq!4kI9!~r z+0%IcVv8<_EyTpibr0`O+X*7LAcEOefqL$B`Ipm|Iu|&;=YdNL?8|-rKb6Hq4w;5O z$*TJSseU9FaS7&)R z7Dy*5(8JU1K94a|zswbX1+LO6g+xeT;Zu38UPBbm&%pZ;uJ`_hGgWPFHSdhu-se40 zCtzxpmASo~Xib0TGF_yQ9B0AEIR~~-Dn2@@MJdTFchbnDBcHyzePA#W+KFUj8qdkf z!2X~gKd#YmQ=C0E2KL!IUqyeRxMry2F@iO!`Zg_RRKmM6s61NdD>nAl>%&RQZICjB zNGC4A5r&#+>brlW6)dENvUHsmfRZ`5L#@n%F0=$Gn*{^zZc{NagK(sXUO{#jp8cC5 zV3*X380c#Vk#ylp3Lr`q1X@Avgh17pRm)&EBS#Sm=L+gc4FNT1kysxoK|0e;!}8F= z1!l#vO?dq>1UBJj2#71RNVFJAyT^_JQ~vW*#fGaqsFU5}=Om@B(-1G|j^t_;jy3(H zQ|r~-US4@*G6jwr!H=nK8Dc#XAgG*Fe=d#H3eYnd(}SPgujw#HD<`EPaRngLl2_u< z2d!qzfLcs7@!4Fqm7g}c5a~XI*W~wF>k0OgW?+E!6gyuGv>@4j;wwS~ z;KRg`c>7_T%T+(-U1a!{K6w;n;h(W$w{FWrNC^|U(AK38a;{6oL!NSWAIq)Y_)hux zDa+~Sq<0Gii#~3!14xx(C4YCJZ{fnPNn%Uc=fT4;3Z>mqa9fNrJx2-11$wipiLU4T zNwN~^ozK|3fX7!|)i$pw@YOQQ<);N7>+n>`FQK%?G^W?6H_Dy24b?X#1~&tz2Jgf* zjBf;%)_xO={$C zr$B#a1G?(Odo)bS2$()jA!Jg%Nd<}137RXMk9@>RKo6O_dfS7Zk3 zY*4up7IQQILstg_0+=?q%WX_)_nt|3tVZN4&;UR@?s^R0mWvk66*6h8-7CIC3J6}h zE8Kjip`*||Gj!uW1w7)7(kAb-muHaYeMdN$Lz!8+$ekOAr|7Igf(&a4PPJmN+F zB!mxJ6IB1E0CB;%PKVV3dP>J7k_1i&0n@MoB{ZWWGLb~s%|1k-deR%l?`xE|UPXLq zxLxK@A|r+lh@8zP$}I++(2!K6=HQ?f15;x;I@+%Z302fzA@F3*XFzKDN@J)yOwVzwz;y+LRz8)3gKq4n31 z>jZ9N`KM~qayP&}{KMn?(jN&$n(KRof!Glcj}raR8y9*N>K(XeKxtl7ZPJg|NiD{y zT^|C9do zU_E};M*&Eh|TI!5-3CQU~YqjCT_Yiq)F z1WDWaEYr&kQ@Tv%Du^^I(7xWEe#dPdqZHLWW}RgFdAnM1-pY94Eziu!4bMzi$@Y1= zq%^Pf_@Kvz(b@xA`5?`KpK%_w{mE9s%6d6XLAu7fx<{_K1v!I!yP)09cqVADrW&ss zF&8Hgz+)s*ELHhKa5W)&wwMHc7c_N92SUKMmm%lq^3*u$>2B!(b|7mu&J9SSgCk$9 zt4Qy*dD?Kw zvE`6=`0e-~(IF=y7pj;lt$Mt2YHXH6+9$Mes+9PUf!$X$kH4{C{N(2&WS=!01Q3@w zHb9hFlzNyaZX}zJXg2lizjaAyId4BpNE!+r{Pax-)Lt^rPX1-KNmSr9eC*W{`CI%1 ziBn3`fDkdxyU!CB$Ar!`s!5hNa1tKY;G(jIMaIK)iT(pSuY-{||Jge$5pkgQYh}b{ zSorXqXH`f01MS(e5TiSORzY06p?IOhn~J8b;)l@89|<{&3VNvjjg~`}*uA>hR?mTQ z;|FUp8~!e7LYBi95$5ZX9e^AO3WG*u)`3fTO?+rt4&v39K_2WX`&z-H$Kku*KAi$D ze6@n*I5{4Pkuc_U(aN=k;NYt-RsN{P07>VEB1(yDJ(^-Z1LAk{S1VhW*6}XXYaKM# zSx^TDPa&lzZoRJoiBcuwJ`A*s>zhwPtRrNh88SSqdR)QByzd?^zy z3_z#N5&&uqQ=N~#IOn67)YEmDGDX4(mJ*mJXV=0h6>*ud{S@WOzhJH-tC@{J(mbQ5 zeij$);^o*-pU?&t(Jitl?=GyO`X|tX0%8?Xf^eTCMxrJm2x7jDlaEtir@?Y`U%%As zDhib(E5Y{^2J|y{oc|<>z>uZ5G?mUhjcjWfD z=^PX~#y5F4QqgLZ4}ztgTT=7(H&mdQVizn5Y0$2Ye;FqVT$rFpGj4qc)yak~uN-OtM>M@PZ5GXL z*#4!EH2bPeCK=Cm>Z7GNTZkF^vU={+Wn>0sRyzzjzCowZm2Az#=kM`&*Hp6AIO_fi z0c{n9s!(^T;`O=HZ~jYIO5(OD(Z!W;S2T(bI%{(r zWG}lHqvcGKD>hWud|n3g{fUe^d5_3B|I^CGh5f%$Z=A%E) z{@mw!gTBLGN-T^0e7zvshvfyamF#_X0iYfTh%QL*1y*-KUZwT#@+Z-bsQkgx?Ua=# zB8IduaeH$OYLe$Y=!%^DllAC4&TFp8IWiqnUbv-=&hPhWBfJq-Fbl4^{}TS&CEaDY z6u_m=#^8+1RJ2?Uczoq*ah}loq`)PFN``7KR((Ru{}vGVLk}bADl^1yGWf1bX262l zge*U?K_EvO{mJf_to#IdAQ%PlVl)`y3kvhHwWpi8+tU(A=zuhL{>`E!g}37SyX4`! zh_~J-%p34@!s-=3Tz$I^z-3;jv=(eZyt3@oto#x{Bo+$AwWe&T}horXsAqor|fhT`)H zABK?lPztTX*S@};2{I6+MZ@h9?tHY##6eqWwAfhpL9V2RKs!67%u z#0%0Q>HwxT7U)O{{nv#k7=5st~GZsWGf5R};u8F-Ng`J4_t@SW_XUjV^71KuB zSiPhhwa->=x53XOI4md?#i`G!AjxHo_Gn)uIBJ8V9p@Cu#G7vhKB-Gr?=0Lv&Rg#3 z!V5Zz1(<=MGF9Aii&4FkoZR_0tZ1K@ixv2d*Md_9(WNZ?&&$-CbD!OmoJmyGr>V^d znQJx{^oaN_+RMI-y4t|mgZnA>BjU+^(5ZK}V5K|g?etvf2{cSxDjaw>>F0fP7d2mbr?$rg&dl*U z5u%8^()ILTHwM#;`)!HkT4jRj1>;5!4fzg2ze6}bt-SrDyn&<`bucT*uWo~@6{WSl%xaWgivuxG|y2P(Y4Rv zNj&>>9>Ju_`Sz3Lc{}#w`H<^%%J@erVNPL7bhSALzpqSKvVB2~EQk}aU;5N^mwI_| zX^3pp<(%cu7T&m_QGY{YaLeA*I`y<0fskkxVHT-a0ydGgk%%<*1meJ!)W6ch5LTvP z@{ir20{$K`uw@kANlb}*Q|Jcz1{rG7LSJ0i01)eRped64bwj(pC1c@8@=1ficokCH z6MkmLi{(q(JR^Mo0&}OMC(;Z4fHo^&3HA$ghSl`!e-(d|7Y6jp20yN8#%VP5x-JZV zJcLrNa=ah`iGU8Fm|mD$cHf(wU};u#`|*J?Q%z;EZI$0vOJn^x{vDVIl99FOFP52<+e6=GN*B%uAX{?lA{56>P%4QSZz5!syCKEnj>3oG%_B$#+0jmI)U z$!KkcQ+)A)MK=XK5)IXmPM#L^zytW=WU|^F6r&W_j~!0FUaZZoXtM|n8O@(9V;KU&sCfw(<@rSYrk(YQ=|o@$Nh#0DZ%sI=dUg!%;eYzoLlTz zR?%8|TM`JUU#fp;iDip;F6X4)drRUy<^UpuH6cqXZ5FNk%>#TJA=EzuuBjwZdsWMA zjKoH_0L3i*VM}qLJLlb%DNnPWxEYoBXg$}LJ3<@v_qP(#kB?JGMdP!jS1(sg*-&t( zGOHK`y9Abk@L3xPSz>9Y1np7j)jOAyqp53;23@R-TB#IHI4tR$wTSyv`u>Bbwh8kT zlQa^G4pwOS9YmLekO&NEWa{5wHlr!&!qtua07NUppq5Ur5q}JU3klCzNz`noakl@$ zHYPGeJnJ>yUctpcZd-VrKZH~06XX%#+$=g_y>%tp z^A~tR-TK;sZK=h0R#>^Dtp25XX5Er|`_n$=!JB%wmPw4Inr!RR?pys;`zl-w&wn>z zL?{fMHY`fHKO0oEDz8^LzJ+WpL3V9KI|?nm#~7s-U|M7vCmMl{)z^i;sN7d^OP0TY zwuqPt3Sx4VL1f&}2Cv7;!mp)1GTEL>XVPy;YOq03SX+lB{!wHfDw!eNv*b%u5mqEx)J*@+!5SU1mV3#I`y&VS+3Zj3Zt@c z!*G7e!p|ROL zkD*tFJCVCx=-%sA3R@1Mtk!Al_|Cd7@LLA|;y)LRVR`be4(*~*iCN{Cuau>9R{!94 z9Ezpt=V${6uV_8xZ9ljxL1TlHrgCrkoLj-#YOEFzghwlcquThgHlEpG;wl z-q|~@XO1I3VUv;2D0;o$`2ub$AjtGt8aYes%B7+ebpoo|G?J6wE11hsV?!eD!ao7H zzmy&P&`Aopx9u1*Nzm0slNao;M_n$PsFg?$my7%UR-joT2MM6WW zsNG+bUqAQii=%xpw*5%HKq!ER+ zHSN&p7iDHMI$m#auzhrZQB5yd{Jd}k=RPaViKU`2R$nj zowaGKMudKsmYS-JN~8x*WYJDEW*O5awO>@jvm{(g*x=oS6*GB0lc=Bg>-31)#f+m@e$#(5FxVeH#> zJyE2{UN^swrh2-j-(TBIl67NSv$_B2W9W8t08k#aJe}xoA_zEB zB^YOlFRpQq(qD#)3;v<|%Io80)EiB19*#tiW|=@yr3Nv98002kN#a!F2k5i|KA?#uh8sA(s7XjBeQD4@{sDnHr33BOXz9nMW_;K z1Pi`@zGzt2j5|zBYU7VKgi?7}DXRKcBKCT?dE-=yY+;TPH} z6ikvhx9IsP+aUSAYiXD5_i9Y+w05eIEufu&I~(usfXjNoT?_usJq#rY4SR+@Iv^|? zTmENg0a3Z8hr z*AVKCKTYS<^-l|6oLmjsA#4QsyFT_j2BlxEm5+_|W}?W51S$Vhw|t8dnMfkRnUZMu zwQKG=zI~PKe;a-P4P47>wPa+GcRM}_3;yJSSX+)iAz6a!Jzg-=*H9G_;7?>=q4{v& zWef1Vo+gPV@lA=aJc@0gUQ2dnXs3eW%a?nJ4FXn1+fIA5yfB$o>^#tj2MZ3{0SyjK zVog@f*Ma;sFe+EIlqbnFM#VC*bP80=e!vp;IJOAn4Z!GYfgzYZr&j?;7_9SgV{u84 zXef?}tz@umxrBp;59q~*OoxX#DOIYt0s4^AWW<%$Xcc zPDXuT8;SKPDylWXr*k%Qda~cAgXFuL+D__S6oocb-9#x3c1*e1MOdaEd6oZ%o&gO< zWJx~f9X}@CkNfR$HA85_vp0T1^`O7q7}+DM??ZeugT-~>Ky^Cp5q9^8SV(X;|JgD< zDs#Up=EU`+K~U7w<&D<9yOk7T{Cwis1iP^E5w;QJ+ScI}gT9^Swfp6UgKzjogZph{ z6uEIbz4kta;)3%&5g+`6;~rfygFOdtq^tMtkg|O!|1MzFK!X}C4*;bz`+!*Q`CVA@p9OW+aCE%F>eEFS^$sdN zeRTkmit&8$I2q7WW%&E@PEf&NIkDj6CA?o^SMXisu8PHI_Z0*ujOE5880%^CM;HQ* z-`D<=RwZSFQaB<|mA{{Wg$+Id>vcb`;r%B_!9GDM@?-A(S`X0z2z0%&yh6nLXo%me z;GIiEzAKQ!qynC#rsbLD(ceN4N(Yg}{_3Ja4t4|_?32XZVPXQ|af$bT87fqNE-CQN z(%9rEDTcvh3)@}5q*|;3&XMz-kaKY$_xHHJFJlb$zfSg_+ul751pXuJRWpCrn7Laf z6>}K#W&XCD6&a?HKAKs$9S42Z7h*zNTR|rqQ%*jtzk(o@pRixUvTH2+AEbB;zVIwI zS>gWILV(??2rsws{yPDx7Y>+9@Fgty7y>g4R0Fa`Kft~(=Nk6YZmmDy-hWr84EU~2 zJ01Ckw*nsLNl1RV;NOQRrr8G& z3n{kV&9@PCTY`V0$RLP6~G7I%UR^{_Z)+oJ-h(h=y3@ zzCkV3s_Foa!NYrbM>p*4R>i45>6Tsuw-oI4a)A~`eBj|5v_Y?-$SJRP zR=*ooVz>bn`I2WHMi}r|kC#3hk_fy(@&{e#(_sPV`Y8KP?VsC;)>~81s)*4IaMIw= zemAmWx!;X@u;aCtqKoRGS=h;=*Se+6S-BZ zoGt2Xc1^bV7?oA8X%wbKUZ?(ZE{oU?_MYJ_SmbnoTh8P4wq6X`ZA*aJaJHsC0K>&- z5()$BD%4;>R(-dwJS1Qp_)|ZQOW#E@8fx(Oji=VrwU+DP&gIc-dcz64*xtM7&JBpt zW1HXKV+Cyk7e&7dU+vI??Vk+>B(6ts4;S9FTO$6u#mNM~N|B!< ze>=W^GAe%oN3GUAGb3L6Me!q`?wY|d@ID!1G12p$(gB7*K9ELby&G0|RAvH>q14Yj znaG!ESrsXBzJG3pzz_t3M=OOp&tTHC3>fcfOkxM7N@{~ou=cXRfA}9qVT!zX-vT30 zaE(=h8Z#Z{f>o01Yw$ST*5=CI1X8Os;2cb2P)tb$p1D*Y(Mdu?X)gZ*-tc6jk%MH1 zOdfE)nSGjb`Fch9puhF|Q}VQnqm2z-eQYqg>fG?j#3jWdtcTTS*B@QL*=PzHjUd&) zpnBW-sfTv(lnl2p>A^%DXs~Gp0_CT@W}~3KC8L}|zPmjtj+%rFPSVGAjk5b-LMaP2 z=`PYNAh=lNr6~Z^u@0iZpk5JnN-CFW#FX1g^!xY)kY6GjHS-yj)s07l)#57)f6oN! z(mKwlmwQJ*f5itT9jNtydBKPBiVKRATJ{EXLD=>Rz@ z*4NDiuyIB_y=*#+wWN9xw8}D$aqI*bb&U+B5D4g39lHYu=~@AuM(}&F3_q`>=;UV+ zTe|=u6JrWW4RkrRQP1Po$D*rZMI_pbsfAKb2OxxAZ+?es6pl0mhL)rX>;z*FrvoM6 zxBOLA^2yV|I7Ay0@#FLk?JQMjj&A2fOZ0+4VN=fgh8n@wLg{mS1A z5ijrG1)9ZmFl}T|gY|O0)q7EN8)zgi!1l1&(NTfE?|6#))qFQU;1R6fekzDU9L~NU znflIEV&2!=g2J?@u&`3JAG~~Ctv&IUVc!on|uP(idn{02h_Ta4b&m0917g$EhuF>GQ>;FVHVJ$w6iyG4K z1ww3Y7BzfUMOktBOe1BL4csJ$nQ8< zr8|(q6Kg%?@lyxmFQBv;0x~R%)($#Ea&iMsAVO8vxr%P+%h!)RS~9zC=0B`EwD*2~ z24s<6XI{##+AHm-o&3}3(fGnbT5Out{pLV`>3(-*PWuhjO@ZR1NFzxC-LTuwDCUD| zAu)`1YjWMo`uv@X6^zGfh$=a35yBHQS|9KQUQ5$IelpC$2EDP=cJ-4+k*K*|Xsuj9 z^^3F@#m*CQN+ojUgQyj;PL_03m>>S>ZR#GCrDHKaKsz=71C(e zH|cFF{NZxz+FcWFKmorF0$Rln3aeSb?=luFCz_vykiX^t7men2TOhIuCmXB~Pe*MU4X!WKa-c_XM3OBVV$V3PRTQ?+k=BYt+a2O#vl z?eZi^uF!dspqfW8VpbGyhLt#wgV_5s3)R-<+y-uaRC(_RUJA_2A;MA>IcAuM5 z!ZMxRV4xuLc`LysE+?Mw5Elm~{eiW3a^lxDV^9%ZuGmI_qDw0#T<*rpQuWg~MshNQ zku3n>@}HI=Y0k^SN48xe*}z=DRZ?255dF;mWa9x;CqQx=c@n2H6sLl#-fJ9k2!Wr) zk#p=*m$M|EBn9_OR}R-Hz0!|9`WS%@KVuRm7gc%lCyTVSR9#$Fn+=O`sN@8)0hfqk zeB@D&m0;t9QqJETfGc`z8^i|7;(QhawCmC5%4y)*V$!(a2^Qcmy4@xeQ$fRTCVyv( zSiB0Rg$cf=KtTX~*oV(Cc{xuy8h|)_5M))9zb%Kzdg8yl#sr2Mg=Egdd4E4_9R5js zhpsnxRDh`4CP==ck3gRE1eU{4&W@Gb-Ni|Q;GF)k^9L#@MkylCqy$JF(;pi2TX17- z)I}5yfnGoU&0C`;hQcq>$XEHCOy>s=K**^%8ewcmQ0{0j>Vb7li4i{RE0mYZ0L?Fn zY9fWc6a6NTg@3Cck^Yz|Y7aDC<18iKnu5;wdu5}X{(Mx?jE7YK8v3L>h-770=$@T$%qzEQybYcgUy1fi1Vt(3t=O6n#R2gXjg^ea}TdL(*X!D@&oE zUx!OO5+Z}NDJT3_jBWX1{KC()ww}kEhGV0^$}&eB{?B2De^po=zu8c1UE z8T>l^G8e!LFb<`D+x4AL`b&(4bi!MX-nH69c`UjU5)w zh<#7k@4}fWOcH58^zhfTqv%)U_8`q&;K&+6Cbx-G9?MG#-tJyV64R2-S=NEEMR?k| ziy+P)l^RtFNz9z%CpHvK@{s{y#Rpo_tVjV~L+2iS%`Ky;${sRn6U?_F$buBarM88W ztYf;crUgzwak3%&-=s;R5@y7N*S4&HmcO)f{O<<=)_>mWdswQA5)1x!Sj*8!j>t}g zD-UNGrf>l~1Z8T7&LZ=(g|DQ3aQ?@HN{gPB&Nu$jx-2YAbi1;15Oj7;tG60=Y|(h8 zE3qE1oOVX?f$fweZsXP|oI$qmddS>9w}R&r(rds@6{2l>R@S4ffSx=2Osy;MlJ914 zmddbCArWgldn{S>uYIm}?0mm&(ovs$?pyM52^hG`6+jIk2upb>#<%{-BSC3I6AHR4 z8`X?|vYi<>t9yJF_8c#tlp9?lfl(r-v~fK>C5nw_w(hrA{})((3p2a($?GR{OerH1 zxvmLLq^3;(X2^0wK~hxMfRiYZh)4&UE z;;aKOUPHr@OZ`9;$YaNZ5Iw;#EG|5K$HE>TT9prbV1|bV!E__5Cwue0WM_LY#{6>% zJ}5(@Vh3A{2{QGxGCnw~IUl(GWusRAe^Q;|mzo?r2OggUl{m>c=ol2_6fM+G&V^0K zO4%nWX88k}af}rJ=_Xdtz(dtwq)|B-H*JPk#wj~Mb?Zg<%pCHCb>Ozk09E?z!_EkdQW_c;8j*dhAwq~2sGHN-Qr;*%DaR_Gd_QpPt?zWA z5w+)C{g^s-oX14BxIM?tLryOd@Y8odz%=r4IGwy>=S|_;ib-N9SW>rw728^%{ zfO$(R*~)?*P8BsRZHEH|$BdO%SKLdDFPxDx8Y+|MBlTbMR=)Ylq^S) zdeNBBB+Mq>PTV^HS7HHa-t`) zNPW<}8R&Ywl1!p5oEBB)K(ftWI$@E}MAl5(($JG-f(8s+TA%q$S1v7XwX}v-?-Y z4hj2QpR=Ih0(VrWItp1_9AwAAGk`bb4Hch_R&vo=b(uY(q$w+k1OhTx@cGiy55x?&i=M%7&o5r_=ps zdcV&4J$*nO6(b60#4_cYz9mW5;H`g<6cZbWyo!+(FYjS)p$Kv3e#6lU2=Y?$ZvlY> zVQyMxnwXwgV8F1{grg<^6+MOFpdyfX-lvManD^I({#8*tFrh5 zG&Ch#(x-G0gAJ%SEV`s}R$iLg=6#xSTEz0wjeFKQtXv|*^U$15bAEPC9bLVoE|7~A zFtkOImUe<#n1VO_ka+FQbXy0!8a1X=_H-rIYmWV4e}QNCOOuBOr60Yw-Q8032)JqW z(hovSwT?h1M8QipU`>DFZeVd9j`GeM)2G8t{i^-SPX`Y)$LgCV6fq^$b}9DJ=;vyj?Q;!Uq^L12S~t1bITvaPHGU>C~)A+|7ab z)B*{P6CN$hk-ZBqR*UtI^EdflVmGs2II zzMx;1C1DWsG+^=RcNBkuOC4Ztn$xbxHSa`Fi?QBq;rgNJV3Zheh?^_~)%HF4JPT?E$3Eiwx%Tw`bE=WmX(o{|1?K@N1 zdh@goc3OM{^!wpdP3Y;BAodc1+|&_C#bFeuV648 zR!a{Vms8#4vpLu_Dolcdylw=Yaauk(d~0Na5&C^}eJ`{3F~ha~5MM&dLC?&QVw*;* zYmi~XiU~iyX+hiRsQ2PEXki&NvT;q?928tY#aCX^`~tj} zJ$zEyNn5(4=6W=1Q*RCP_)#C0iez4XQ#L~We;9kquqwN@3s-O6Df(>F!dx8|jdcZlpm%y1S%Hy7pW?`hNS@KK4%!MedmQjO!ZX910g=hKHDq<~(l%9s$rI(4xSANfCmFu77NkXDf~rtXQA@VU8SpAjCEReA@qou(>boI0l) zRXmrNb;w*7|GhzD@FV`^`StpH-KufrA6zkRQ45#+QpZP#vd{cH<=-S~1_pU>lLy){ zd`0;;dFSK6wj(IJ+lv1cLi>okg?g6{Lzqq|mofb;!Jhw%iEzM`X%WouR17>$!{^QZ zUe{1^$V&IQ>&HdG$62@zkg{vSs3Ze>s2sG1ffU)zN)d_whR&TFdZ4=zjh%_$Wpx_i z;7(Sc^_EkGX3!VgY7Qj7hz?j*4!?<n+EB-&s|&Hln-6TmY1|;p61Z&zmJbgHH4rD3>)r z#-VXVjx{1GkA5Azr`-Y(gQ~`MUa&lyCb}6(RJ+aHq{+q`{4}DNi)r$&H5FzL*;-DD zO837{fIX~!Q@GY)^HN3Sfl_38c<-)eie@}KB3En@d9h}!c!RYC% zQYB}?GXayi3a!fxD9b)Fa0bCvy-P(qn))Usa)EJhgW;n!u}JX`^d7BXDcNy)+)zb( z9AU(^gE!K5NI6(Frm5D=uD8+=j4xWJEJMzTWParVyp3ooiMON*X`Zpk2f#f?m#m7> zX{IUg;rJHVV&lv{C^d(lzzsA+nkqh^K!3af&-|p3)M;9H%5F)22Qix-xmR3S+*!vk z4E_T2Dk_4{qu@m;Uf8CSI&6yqQD89!(_^O3rt!8VI^x=n&?nTqACZSvx>$fI^90z^ zmGP<1&~kuN{xg-7QmiAwPzq`f`>O!yp=#WGLs-ZCXboeh-R`l%)@;Qg{!Ut#2Wdfz z^{2{S?WIeMbS<}#^2#1u+KAii=*$qF0)_)=^fEV{W7dNXMO1~)Lc3yTIiW)6y_)mc z8qj^$h2VZJi*G#J{vMr#T_3kbs1ES$IE7aP?&Y5#w4{GxRLKGZoh^~S?UI+zPFL6A6zU`xP7|yv8l#(xqnJM5vnIe^j8`WGw z7DO!0$MMIx;L=j>^+ARljjRbjKGZxoN4`T){_2V2E$=3T4wX_X+V~E-7a=D>Tndd- zePTWT`s>O-H{-05(-q?Nc7%=1(~fD$R~S9_oXqHMLL&i`F1vxCs88ohDCl6gY+C5mQi5o;oMOU#; zP0rt0#GzU}x$u~|t0fg98>>TzU|%LOVA-<~@BA*%>`jH}+EvrKTsIFi6T4485C}~n z48Z`!>9LI>^q->^5qjrp)gtMHtZeSR$W-RvdXR(_z4o)u{}e{R5h#*>Gg|nyUAPhW zh==eIF-^*rNe@8qXrFwzT~EhQzT2*Po1>_GR6;I(P2az%1q#0fg*DZde|bI_p%0P# z+sT5}nw{3KxNtF@ptRGNT!zVp;^@W{+P4mE(#IFyVQNBrmHXRcn9rUnOw(_2q})zG zfe>%me!G_L2=Eb@U@c9hYe5E0P{FKz&SP-|Ig1UX)fuHcl8SB&^^lnIYcczEzqIF zH-D!MREW%x8Cz?|iE1~ACXDPsqe?~Lh>CoNTRH%W2i?VQak#pEf#_~SaNcsVdIj*k`>sgc&)XFAVMsT82YT91 z3Z1qO1O#3Qv2s`~@H|6V)E!!ZKNtrk&TLhww_^@MN*|q0?}6>IOyXq`0rV)M!z6Z( z@WCNZeXA@vAtExo!cqMa5%yKk^=jDckGYUTE3%7q8tH`hr1!T?cu`~HojI>hh0`wq zZ^oE*_r!$zxBj5=q}ro(Q<6prp{joY&F>4~;KJg89N4iEe+V+<*8RQYSl=?KynTKnMuw{m z#7y}lNDpFKA`L!N*e zN>VD)AEfX9NS3$3?r8Dj!2&N$05n*Fl5q{wAW$x?;gLeCkYCM*Ve)E>AYCLqJR3@C zN)}wWjzR8&6hZ1uLZ=Y;Oe@wv3`%Co%6v=I$r|{GArp5`7-IKIFsj-8Y?|iTi&gI! z$0wK;b(k-6Reh$&cNO66Z8M)>e#&HnTcg#k_JGAn$CVi`Ze-CKEm}uZ%$OFf6Ef7G z-xzpit|K5a5;9+gcsi2Cem(l>nD7loX9x&M89J2f8tJ5A=fYlc|NdQsOT-B&(f~Ee zs2Exz!9ldLok#UW*bI3RmtTcb;0WUttbUB4$LV&Q?yQmr)j&~ES+h>k%J}~(Hh>jl zR4B6#$A+J@Lf&E@)F~%sIR=!LeiHkf^Uu1Sde8u{#oy^YdD6DO|()ttS|JV;6iH|lF0QXi|vqbe!`G7(0}(d-UY zC^1xFit<8`Xw1n54u8FftZroQdNE+~V6^aRr2j`OveJ|ry22y;Q1^!-{FFr7W)pK5 zNP_0HoU{Uh18m>|-O4Ui!KPDYwd*sQS)e-6y-s>U4tgMZM8yqLd1Vv_bn)G3?X$E_v9qm z#EOqj8Ceghq5R3&!6N@rh~qE(WXrV{V5a$ypAh_0j58jOIk=5fQj0Q@m)4E!MDrC# zOh7;Ch$+nHPnje402bK{!*hge;|iPXTvw00^5cORBp?mhhoHfUgvs%BO^eFk!6YDv zL?7i@wcT{d+RB-{ynZWnVhi2ky>J;V(Rs@ivjt*(*&|#oA=hxWv(93|AA}$@kpj~* zMvJ!AKeNOzG+rt;Zb+seP5%F67j(QrQ;c839n)s-%%=B+2K-PvlDK+yDwvz z6f|K>J7vK{%q_qpXJ0+8l5OZ#gC4 z`n{hX1ej-Y?VV_2;QTV_3W$Fl$0yM%F{G`ojso5u`51SQvoT1!GRv6(8F0uU z1bv6;(`1?PP-f173sPx$X6|v;!uCJC}#uru`$lTzqku>%G)ADwGA7em)SiW$v$dwXepJ0{jG z;Pp9Ze$}WH+|nKMbwFwI)$79cupF0}-#2*qJlXNm^geck;hg+P?(+6#szSeFzVKQ_ z5sVX%<*q8A!*cm`>|70T@|cAlE`^|AEvk>@ExMh2rWzF{@X@q8ZRyT^=x?m)*L%0p zSLUH=WFTc3KjgI1CsZhyyE6N1Mhw96kj-C_?vw=wg#zx*)0l+aQOfjpF`>{lO>Vg) zEC{)Ub!#N`F#a0$3mM z@3zBnTG1c0H0vE7bT4EX7T++vf-!2 z9*|V_)s%Ixh~OAHk|a!&cH-vSj;=V6uOF=k#KUoJ^y@6K2er4ym(*)NCgQEOgzIWW zvMCevhx`#WXbYzaOnlgK_=f0l-@MC}F6TFMT0BXyNf3$p4ocnJN4Jr=BrT8qoG%`4 zE1NXa7B>EGW`gNWSZfQF{+=CIk+6LUAHfIlcs$>Tw~i^Si}9R}G8)G1^^reYsgXQp zEk=zBn%!oABaW||F_NbBTHRO=qTn$&sz>vsbaCnmFkld&G$8HpdzZR4KFK7hN9*}xJGOk5XQ`4HtUyReizlQEn zb4e}cYi{fTm4oacOvlG$l-94(1Sj*q5f=io@F3%XB*SwyzP^i*T!l~}2Zi|Cwdm!_ z&c-RJ9F!iL9(!@29+h3Xs79^TF0aB=v+I18Xe8?v;#)!ViVdgx<4;E1*eKU)_<~%r zQDSFOGfP~ZC=ZLLNs8s745en+wYU}{Y1@wyshw$t@QDX60`j=5dum$r;y35NXF|`= zX;VlHjrfjgNNnL6qGH-xm-2qgyjCs~pMqL?h&W93s`oN^21w*psM0K4cgK-xw6 zo77JtBNqyf4u>wod9&mkh_u-<)p4kUos|D;x>UB{`I?_VGg4VMC#A4+OW%v4sdEdi zz@BAWZKBVAD+kYBgQF|K75dMc{|>XHxZZCg+ig-alSI%yp_Jt+=H;k5C|Zd$+bx+g zO=jB_6h?PR>v6xtUfIQxSBr{3t)eUxi|L_M68hXj(o-j-=uxZ&Xnc}zSu=mkiDTTb zEolSQxZi(|CW9EJ!Xl>6%_aZutlTM_LEXE&^0|J$y7K*Z_~f#EpaUo)F0a!AYQ}2f z8mEEWBl*GcwC2AR=@Hn^f1D~b{5J!Q!?3M9h*UK&@Z{Xab= z92pdd>~t+q|2-=v@b4$8|NW&rAw65sDk}!`U}Os;@NFF zaGg6leWu!f=lTC%(#iVHk_7(6e$OM(QPZ8TGNal}BT8?dlgU3q`fw2Uo%{n58cgkk zW>mnY@b`v%VK?L(noIWg4Qzq3cnbQe^ANvPu8vEA$z1N|Ef(8sld&(N^&u~)Ag1_m zd-Lkr59}8+zy;4`#A!tTg_^w%fXU#h-#;t)@8ONXp7iK4&v`*!|0j?v;eXwDS8wud zL~`pzVGK0i5K`%A<_tIH?khxkllWq2`BBwPQt^L3`loCE!_AwO=kHY#K}@3wwU75| zjJ_9@CQ&VVTB%#rq?$Brrd2%@3en!=JMv2edZTKCgUxgfnd>td1u0QKfjx?hCXH*e zpQK{)3c5yUB$m%=ObuuDTUwgz6$Y7HJCNEdMvm5^WoDbs*>eF%DuB+mmUK$-Z!gzR z;4|#y{-5nbeiDjQ+Ij~t4ID6Gac>^eL85X0Z;)$p9$EUx}2ady^2nB+$D_DN8&A- zC6?Svlky(1@3kY(ddxTC-xoxVtUrwV%k<5gMrCt%er9&DTBe*Q2-_y4=iO*3{rga$ z@KrEq*o@A@&wqGxq>w(S_Y7&^X49chqDL>)lV@~Vw!tP1-Naq2CT|0fZkZ{A>hLGE z&F&d&Yt7>e7SPRCmIITifPgOP=}EBdYy;F9Y9li1{Sa-a<;xw}t4(jj{{Cdk zZ&+qcd)2u+XdE%8l;vn`KAoa@6+`TM7+jPGOreB>1k6hR8}2ZAR|!-8c;w#^0ftW! zp*Fiiabnq|_7f4U0CYABhv}SMvgDJW!bV0^b;H+no6@5mw|yS{>#VIfK(pq|*!%(O zGPc59{G|~Nj?wpg1*5H+#iTRP5PimGrM>#|?svoDG+*+^1Iw$%V@d7X_}K-mN)ur2NXLbmJ?ypyN{^U@sC)DEw9aMK(Ri9ftf zchuIFSL#nSBYhTscj)VFpneRb*`Onx+v&2CsN8bjWKzBykgG77>s*zXd${Ym&s1UA zFo3&vvR#xbQDbRRSRhRWf0E`tA>DFgdtEAo6h8yO968u@KPwkj-C7AXOPSLyH&4WG z=%uc{-!Ln+aN)anuWcOz?)djsp3$*Q_cYfSLW8&Fd&YF0Y3YXFZ!16{*Ia?ejGNHa zyu|eM?pi{O*aX+}GAGqI6pj5A?|yT`?q+`lyA6O&-p>s+_KY!teZ2qg zW@Z{^7m_J7Fz;ZT;?0*oi8zI?NayW{3jX|HBr ztYWZFJXEuUm#x3#IY65 z{!v^G_{KdJJUzL!cSKzV*w|j5g-llr)b3SZ=iI}WY{K3$r)f;0?M7nDu0L%2q14vv zWT8gMX3Jf=Lkx(f5cQQgm8l&Xm*_qH7*mXUq z%C`soMd@o{44KbMbKN8yEXSnlGw4s>zfN^6p~?(>ayNAij#*z-QL*)jtHuM;vA>RP zUgYbi$QG@A9}A?AXI`pHy-$RfrBH9AObIThV0)$qz9|=)_!UGwCHS{ zjJ8l1pyN8g3UWuslltop_*hQjGzw!ZsycCV2fW~NZ9;L+o*mB7q_aXz7?Qp=e%m@) z^3AoGtuDCgRYq#jZPW;k<-abT*<-7Gbd&vol5FRqn?GqCizdksa4kc)>~^(VORK1= zNey#pfAiXs)wuvBXh8zs{L5sX>6htz^D_yrHgH=mWh8ElZtu9$Y(uK_dT9DA4hG%V zp0KQ5?d)N@fKXSH^1G``={)5hD^lDiS34}2@s|(v80IY-hgtW3W-529&89K}^)d^{ zg#Dshsp_aTx_Wp0xm0iShh@#Yk-9~*vjs+t z5P_}ZM*k)@sIP!H`nzmwNg8bZ=rF#SFw%5NMX8qS!5cz-!Jo^utI}cz@s2ZE8|`qIsX$bO#*IN_kV&XahU!0BWFR( zf8&Q$0AjilKdt6@8Jfte*TD#x^v6^8;WSoMOpxd%CeS*_X;ebJU&hDjk6B4l&Lqk7iV_ln^-kWK+F^y5ihW>sKUYH-c9VMT?B;U?< zJzgqZnwQo`col-v#cCR3_L}P2qjRM*U}t|qr!EO)Ya4y!ynA3=`Q+|a=ErAtW=$@u z>g~c@lXO03Dq4fV&q*9Z1xFIpz(zyT{!Q`)I!H&%Z>=>EcNL{!~9V#UV-U;_kY7 zqA%Se>AvD!`;bPykKvqFX~SUUf^Hy>vGzh|{AUs?`2xmd&f$dhA2QLF^U@XL$`#jy zJ27tLJQ<dKdX zj@7tPLHy#6@8!=2cH;xK(0h=7TWDmYF%gH;M2rKqv`@ReoCvZK7VC`D?18u-tIJ9ghnG^G7vGCj%UW4MAZ%2{*P2B>e$R~%6qfsO z75c=n6tmM=bNwiDfg3I_o5`Y*7d;wITjBibI}xJbGmcgl?601&mD=ImL(-m{{08O$ z9T+gg*k`GLDy+IMzcvbNgPET ziNxJhsr#ES>G{WZgVEu<6H(Vhz*|E^_m#cv5w81LV&Zu}OBZ-t(c0`fW?#qL{SXvt zWO)x7f9ZG4?S*kmckWJ~2?PlHSTEwtsnIKIvbt0zy0syfQ@kIf({d?js)}Ua;JGPF zv-@(zx93SveO-7Hk#?xV9XJ zn2gnyCwi>M=9--E=dJ=9QnmuLErMLrp1L^dck^|z-XKPNQ`*jurmq9j?MmoCBc4v> zy*b!Mb~(z>_=-+;`cS|yX#QdF-inX?j>BeZZs+TrsZug7&p|yc_=3q=eX)j`dQE#J zkz7WnRWz2<6uVtwi>3kgv$70@P~448P>$PsTk5#(lBeAQR)w2Lih((rv{yeou6i?m zSGzmzna=E%cQaBd#Uv(+ZXyIU4xV4F@9M9Eo;25EF)Z)#ir^=1mv|VqR!?F2mM9}l5Z~srUbp|^m zyG|7u|2K+g?ZA1u7TYwB3MAzvI{gAoCsmgB!x7kbN|xfmgJ~{|XeqRM-IjHRiZMGo zCpxb5l2K#p$3N%`gl)4CteRqnDYd`wzQ8i7VY`!qX@x?QP^Evo5~8h#fERf)+{rJm{HUljopXF%-!u9j@}eOs1MNsKG4kU*X2=F zkeV24x?03iUp1d9Mf2)Fl*{5=OMLAYUCft9cqTTze zjruXctJbUJfDY%9a!yg3X46S<_E9Gvo~G?M9X*{flQH9|#L~M7<9@Rb&S%9nf0g)7kRTKTQd=h3cH<0?fo>h9(RaiE$ zRm%iTZ1BCr9d^DjvmjDVZQ1tnykqHcteow7(MF0#Cr-;0MDY>wPVsSr7Pr|cQ_jeQZ|U{T z?SXRS&H;%^=}81x?w(}>j)C#f$%3nxb|;WtZ45atm%{z~1$s>p#*ZIsb>GANcGt)tsT%hM7ix(W4hf$y(cE#{8!X$R4#90d$+4cys@ zlOYYyqwM@(4bHl=B`NGfVx(zU(jzzLc^}ko*Fn%5mrHpOQ_X*4EoGE} zPECq=yK^VIHMzg!E3;`gSZ-Lm&09Uv{qz+7Mdd3Y*M~?pK}SM*;8<_uBi6VAH*=a~ zM*a!1Y5YOwnr|Bbrs)c9&4Pj-B0 zZPQLO9rmK;PTX(zIqm*&TuDXjT)ySWgVk`EETaMD!WoF(L&P`82(u*4*{8wulpA0P zHd4=77l`#O4nZkO(fNJ3X>^pAo~yjtU`)YNye$8`mtu})pDbPh4$H$wZrh>mxUYxL z`ykcAKiM@LkvQn3iW|?3t@7#hlzy-)!H_ZfRIZk_;231bhaPnZvlz|~>x^lz{Dx_!ANEt^4jRTu>Ht*@(ne~XfttJ@X1R}C zz?po_f{a!vNCu5+m%f9c7Wp0l52i#nk+D)C1K|;t!v+=--*BRl{2k*-gf}JB41|N= z3`tDJQKXXvrjoN$#t{l4ay^s~ewohP2?Vq%*N$%V4f7x0#V*U-j;52(hPa6j*E+Az zy{`C%q3FX);xUEEwA4sBM~;rtHktqCyYxjn zN#SE;*MJg^x%a#ukDRIGUC%`DiTp|l!z%WIv?jsc@~DS`BC0zUPV6P3ydwipu;;(H z``VP|es-UvUfxznbMyv1y5F1Ru2S-D#8V{P)mz2cv6!>F&xoj*F9XdWR!YN@?Mh!f7`1_D1_z;WI00 zU!RkPq`NU6zpELV1iQDY0EqVCAopB z^IBATmI+7s|Ky%fcqQ1Vk^$38P%AKW>A_NxXIH3`&GpiLm$2cMC%>K^3%O6v-U4Cn zSoIVi~K3&A4@Ag)BVeeNZ z?eqBWhCO!aoL7;C z`-~ULF?r%)?;7X0 zQT~@a^r=&qJ7=lf%jM{H3DYV0OmyU~Oq3@zj-kO;NmVw6LK?x8R83ZS0$MR`%`a*f z0YTu+S9MXXEYn-((xxxxDAi0(vA}VV0nM~5?Iv=%u((Fixu0H>*J~?jc(b}v4RIYT zSjOsI#-TI+BAxaek8ag-E<3o&$vPN+byqxUY?`vbT+Mm(d(~ES)3QY{=dK$;>OyI= zy692Ln&^JZ^^Gq%I)ZZjT2vGtizRVWnltrr`58v*&Cu$`?kv0^_fwR;#N7&&5a9_S zz>@wa0EWW9MK{Ah^422j8Z8B zPW{RK{jq(OBb5f=qNq0o@J=K(qBpGVln!)ARz1xZ4zULc^cUM4NZ5JIxsQ8m)o;#f z%25%vSZ}|ClG7ohEX#y0=7jzXAJfkA_>~#7ls(t+5J-{|gb<1;rrem@Yhp7j!(9(P zcZtFCA-&5}MeE%Va+s|QWeDN%mv}EqUc?IC!E|G!g+_kE_ofjVy!6pr0JP}T=cH70 zt8!Qb{2z&to5OOU?~^p*xSLU)mj=_nr5J)S4+NJuz;Twk&31yM#C@Xh1hCQeKYt(u z1^DG|5`rMIO|k7}-!fkwvza`(m)T)A8$T8pTg;Qrem#jj!3ocY5>%OAdJ+#Xd6Ysu zD)I0r)qD?6C@7rq9Y~q%-H%i2J)#NCRVHWnb_u%q<(^vijd|+Mh1Q<8 zpctOv&dzCW{lqcfdk?O6D+o*Oh)2F|PuIY5{ z(zv%8>hhh%MlCmA(%PLpdZ}U5W%(`mc8==Pk3+W74VHJHo*+ZMDdv>WRhye)6F|R0 zv-tSjU#_y7$n(+V) zh||-fXIYftT94^j z_;Qf1;J~X1&)4PwVIzgqr#{CkjEbzUB)<>SxF`b~HKC=rJtJ?4V z&c8B$xgxy@dV!a3l$T~F8=w{1QWJe<$#gj2i1BWLsP)jXSb$UU2m|Y|Bo!o2;MbtG z+Ml_fPq)M2O)0SI*vYV*M~X4Kd6uJ=d(4anlX_FjWHNL+c=M@ArQw-VY_uE-jkQ#j z17=1~E~(;2jh5}M&jTI47r?&9yP@u5h5bK z6xs+UG~vt+zOg@=mWN6gBJof`r+@2jUOe)rekoD>Zf}}libx`)Ck@% z&)I%A>LGe#BhU$0t!?RtCtt{~gzn0Kok0tDa7P=bg5a(7xvZwkxgaRwj(3J3=0(gQm!p+|f5k4|6+gQob+ zq4ad7kDzUDK}E3dWF~xy{bE3X#5G{QX8tU6?|TSNocKv_g(e*Y*<1Z-j^$Inf~YkL z(_0t?Q0bQLAZ)6VvYWt41mf`P9-o7+DD3)r@tyOmQ8Gzyn#Y3O(Bpf}9yal!xMT|> z3A)AmQ7crOFH&tCn@~ym3GG=>zyBU3fx6(%(LRe8OEv*<;|Fb9vt$8P(Nl_W#l%p# z9!fQm3xjM5PO=nnFEMf+pNH_`FWPEsfAQ)0eK+Gwx2`6cK7+hi0QEz{f%&LWX!$}W zy!%z5-6GAnoaTl`s9)ftUAT#%@QGQ=YboZ^je!B!vE1!U+%SR_6@h8dAGx0vzTng1 zE02-pnwN_p1oDR4E%mpbrYGT#(3jJ*V4pw zB6)9;=EXbCub3Ve);p!#pnuMcq*u1@(2kZXFh~R&7xSEjgW)> zD10LSb(-sLiu-Aar$Fm`VYpej`_G+yl?QdVm`=9D#{ZT+G$oMkl1y8Yd@_uNrGg4hHWJ zfH-()dR(q=1W|;Ek4jI+0oKMV;O@`AT=K;z{G_mEJt>noEue^p7_Uq^tK?}L#Wl*Oc0$)yb?CLn}PITFQtG~eW%@4BxFWR0UN4a|J;mo@KAsb;LJWSR+O~BzyQeww z$S?N9AqRbpzPB`~w7iS4Z?Nn0*Q*q|4TfQo^_3`De?RK%rzk3UBiU(IG*FkF0R4a) zEt8&zAcIYHUUn4A=9n7f$~T{00r^3d1e$xYKjmXi+Fw2@CGiG~e+EqD4pe2ZhOBo& z_E$l2XxZ1On6lTt1_z$kUlSen>+l`e%7;MRJ^2g-s_07jn7Rw)AXd$jfVy|DBHr}G z81V;9r%aRb1s9_>VpkFS;`H+noCzH+9&>AdQts){X2&Ye*44g9Y1@Tpxi^L9=DkOn zL^^^bfe!;^cljNYy^WI}(symsbS8t&&#-P#gQz^1XjYPKzFde3hD8BT1sa@{!)@k~i;YOly8WYEywQnM)%@+$}(5Yd@aGo?g zF>RDaX#ok18>)vp2F3(@;XA_Yv^#hBzt6xmS?V4D&U_!YbGBvr+ld zBaETnHEp`Oy!_s0uCSzV`bm%O&lgd)p8Vi4)Q-;-mPyufDA&1^Y^gQtahe*eKas8Y zILA3!tkd$i!G}_3JS8+r{(+DksDt5)Z)q;iz8Cl@Z~T3yROM(7L8@oQ;d-CItmuK@ zC(N3v_$h{6g2(d4fosil@ly2oT9Kv2P?wWxqF1dhsKyn;s%IxdkCG9B_PV~RC#GY( z&X>fjH%}1k>!g~2=f34$*^_+krxU z0`uk!4kq!m8Hkk%{mLIv&!4tLmJ~Va^S+FZ(P_Lg70vGS z_@BsYfzm*!UV!P7ZGw0`uU8XX@3|B8G!3D3)q*bKr~}|nnJzYybbl&8z&*2POuKyZ z`SC$JzKUj~bHY#1{P6re%pPno$AY;){L5wD{_N+6tM&LyAG%3Llt!1&(4;I z-nj>dM7!t@j!5^F6Ehq^Mv(gWx2n8D5UOz6|LWd9>rEoN>u%&lb8Au3!>`l;FXaN- z3npXP!IviOXe<-MQNM))L?mRQ&myCSm3ENd{ZD+x22&Y5^HnDrr-6vS7CWwU)60of zX4bH*%YnhA)IfetKcKvPsQ$#hXSc@$>@v5-LOAPJ?n-?!#O<|Qt5f(xcJAvC9ggMKXRu4IAW zuAB1xj-XFsABY1ysuZpo+cOhk%DRmZoad3OI>;h+i*BPEp2xwrd`8k==s0JoB{BVf zOXtMuaW_fC39^5m9{GqP7wyvUvZXdZW_#xP2s z=BcbU$q}ib#l~KZSoqmyau$Ro*iIs+d$qk^qbicNC@3oXli_6d7g1ToN%e>xy7K2b z5~R@=6Xxw`bbRP7PUR-=ID$h81BhO$t`4T&y)y?=TP@4En_NBbzpsz$uzRI1g+ezOSPa|7t+B@F+(WCC! z6cru&)iE@Z`Ikknn*Hufj}HdjCPUB39>5_9Jb;H@c)|y@7e7K$^l61LP5Pd{#Jhz- zH)ae<^y9kg=xnZjMIfN!az?t$)!Lka?K=Qu%@+d_SvBy7ZSI}{jzeX|;OinG^fGin z3~GYKJ5B)8Q{iL!BUOuuJeh07pmx!2sX!`9`T67#DjCsoWT{HaJ-?QEbz6tKi_MLg zX?E@xopY3DgZC?_G;!OLnDiRzKj0oRLlWPn)I{*%q-PB5P~!G((Q{-%a?PpA)f7l8 z(mm=UMr%Eqq!bVtZnkJPe=1^kz;_DX+*Dw>|1MIPt=>Pnr2?yuo8=T2IF8wh|0rK@ zEBgBFO#(LS)H8FIakRQCH-K4~ z0=Aod+sIG_V66)b4mMqC^=5awIMn+nMFOSe^3I-H-u@IvdkHC8hPX(pO;?6I>8WPY zV0)aUohHPfVEAU}{`WhLSGqp*S9=`i;tkAc$;IUXY_lJ-6vMqHr8q?s6t&j4?SK8G z&Ehhl_)h-5zzr`HkDI1t!gz2hyf59G!VJ#4)=X9S8NY`c{Zo8l*jt1Rd{Ws5HVJHS z-sG4OABv@Qb^4}aLpfyVHEVxbNS*@&%M?ibE>>t8Ji!dWxjY1cu|^;3U{QI@KVC*J zt1J6TF*c2z0bE@E9x&Z~0P(#7zbnF`#pxVR!1}-2biQDxf0(>duq?~HX8^oI?n%$r zEC8@j=NgbVwYcj_hd5V1HFp1e0AJ<*;C}e)Osu@oH+GzNReZ}34VPB0Li?U!sFwga z+`5$9oG#+IHqRS~0WdefOO!0HhH(!Dpb;n&Vo3v6r5=XLl zou|2My~u6=EIJ3!&BfT zuyTXSaOg0-yFi9I5|m!Sx!+Sd4K$`cRetYPbq*s$_HKmWGFD66UeA(5Q%?hY#?&!m zlL1;1Yp?55G@z%4m+(|6v?8Yp5l!&;GlCw#chY!qYP#kAR^5OI**JkX5zDN4)|{8x z$PI=2^9{4U7<>sfs!?V({y55IeC}7O4Gw#|KNwp+MnZJ~;LExC{_eUV9x#`bxd9RH z3xE)wX=vyLQ;j_S`oThoeR(Rx0sgg*05Y<{H3lQW=z1XE>V$^HRn=sDz>ieNw5lnS zyc@(}cz7snLTh6<-?v^wlHD-<_8Olf8-XWClyw2)^efg+mPQc%8}S(;VD6HF#997` z_G0!{0XEnV$05d3wm;}u-qXfk05W13puD|aZ35t|uIj6kVL4Ggm>2j!v9#r`9z?X| zljhsv@`EthiAs}qjw$SMqtq@hPVZq6)?+$K1azZLVDk}D-;0~7Fn(gq1Cf*<-J(VV z7f#mvAyQ_}gytQ3Vc`iN>t&%6NjfL~B7irPT8g(Ds!|K*+umrIL%>rFZFc_=hk#Xz z4=-_fvxYX=U$s>H-w^k%1Xn*A^@RxX785B8tE6t@+0J5%XIG@l9*9)8D{TVI7V7g- zQ$T;802#pfd$2+^rjyc@Sd}A!Tccj5h#N>Y zdv2_lVstcc#Zb3~8U6E(UrBGXoHf8D zKGW!Y0%Ue7;aB1zh2p+$jUDuX8@xTFyHnO8l$4?DjLG$Gx9!*Q|*L#_P#WsKzC~*zF z!Ix7?-{{darGZN;E=Zm9SNOY-jX(tmWrc&;p|oDDTY2f0unriv&=Y7l&v8(d)#3u* z-Gx3L2AQ{N6>Lfe;ah3LC%}ko2xhi4SD9o`XkYTi9by6%8D1?9>r6I-9;hoo{${lo zUNbpaB+!Uel)_Sj8~_?oC{NH8X^hj`e4iGrxSn5y4V_~B!5Xpl#Sg{_gU@Wmg3;8^ z!@uBztplyMD2wro573Qtfi1pNrK!@d<;p;T93+F#=%s=r$>lZDztdn9mH=Ui!&*vN zGgd7C?d*XiV<;h)-3tVpICPl-+*r5;K!W0z`q#BiYP)_t-I*L}VpLFCDP-)F_`N+| zL>i-OS&rTaTpyYcQTuU_!eoj_Xf5#Zwap9wxfbsHPC-6*s4M`mQGo59` zVf9cyHk;y6c=v;mxZU@^b@B#`;)I+B-sD*F>}AY8cCjnu*aS~X%k{h8Sk72iyzZ2P zQMm92ss!i3K_lUW#}0H!j#j%H8ubkCi0#J|6t1_!VnOTxBXh?RB8l72ddCB8gR75- z-rHneuC*?lcDR3TI)5Hg@35D|Dd4v}<39hC=BZUa;w6BL)N@*dw!Q+Swi;7_ z<7mR`de-kU0fGhxVul*PHq^Khx#H6;fh{BYGgcUk7{qlJCx&JufQ`d!wye*$AwFf- zx{vE3#9X%7p+)k3qW1ACuV9W(4Uk4GQ;zxh8C&5#nKd60_Gf|WXBX>4|Fi)2&>cvJ z6gCmSsC@u zy^k5gBekDiZZmWIc|Nop;A32O=uEUqr6x5#gykgn?a*g~8G)rHIF-FC3w+coPkPpg z-;gp88@u?x-k$f2Flqd&VucqYpZ@$ATye%e_%cekCqp8INXZZ99T%rTaUyLTd9GYv zY-cnt{B(bQb^=`33$D2D=x|5|G!b;Js$!9KJ=@-Y{>Lj3()3sTi>{|zrYv~>T^Jtx z_zU!taDQ7h<^GC#B-&;@5In$cvm%nr?N~w&5NXwID0B(r)U@EYyC5BstZy&(tNl0P zjF8u^ufu4JOwX>Y9sZ7eL)aD|j`08C>#d`zTBGh^^`a7jazJT8x)GFCq`SLOxO4~y zkdP3i5u{N<1f^TLl@94nr33*%q(R`fw%+@`cj)_l|J>mi_Z;>x~?rycWeF#c#(GI=QDSHajL=Ipw9g%#jkTJJmJ*rbry_&4lRi@`?GW&ySGHt zBzno=CqRWWBrEJ)A4<$gy@;!fy96rTyi=HI|Ag>MnGYeZtW0y8H2plcm2t4<9W}09 z8fge=3IF*SDi)s-?}BR=iUa@oiZfi#eyYyv>D8Z?w8Hl(If)n!cfcP>#c5Uk^&RT) zVYUw+O<76*`Bg_$kSW~Brz!rKe){N&p7N=P)yMQd{qqLT5`0=Od>rBMPip$A8`=Mx zap71Z3epBgJY_6-wpInf5b*a3t?Gl}e;mVUSSUvEuBYL<-eE~=D z&#mi2O0AqJyeeUQBm{n=q@>&#ASncE0)0(6lZusn+)0u5=9ovmz9!bD@2~%X+#;UV z3;th!E%Z{acg@L8dHrP%yQ5aJh>E*5X){S$`O;q|KBV>YBYxyXG|O{6!MYGZmlkgPPy zHqE+}#e>i2l&7wFfn)2IVOzFB?(%^)^Cn5b2hNQIVawqQB$a-7`PsouGv4Dz=6PJn zeGQTd)<0iqW*&wpr?yG%hmR*Slb8IgS7OZc|GDBUyghcI0qonFJR>=z{w+*Y$_!Y8 z=kas1Pb_oth`I&!@L4yFu3*qlMdm0}u*vBn)i5*|N3f}TE z`Drf4O{2G}Sk3!A@;E>5m(k@6s&CuH*^^+P^Qel;`=52G3#W>uOqxvqVC=y;whEBZ5u!SKNr|IRq}pS0xW3%`i48`^VDxpBn<6Y?Z_-+F5%Z23ya=9`9=n*Vihlw%^}{y&=4SsZPfcx8B~txtO^M zkF7i>#MG8T%ekw*cXLpyD7UUVr*}o};jdTrbFaqJ!CsX)w)DN{8z$SZa2<|T!%LYq z^NOC;5!xK=^ils-xxeaqxVk%%jiTbXldnHz)W^yshof{*?@SDS5PsmwSM*)uUu*Z* zvp~MA90Hq?$dwa~)fh-}w&4xzGi6P009!?TdrB|0Chb5{J%rC#|Wd$WNpPGLuN_7$W^r+k?4d;Rr6aIx?v znd64KWQ?-o^?#Sc|9p*#<#f{wVF*pa_1xB^F-w87!tuyC*(OSr7eegwoDSoEZ|EO{ zi%|%^aZ4WGKcs$X2_J4-SehzN7&I?k-~AJ2{(Ec6;;rbAQzK`7Mt72y1WB(#Yo>WIM!CqMd0UGGWOl z2to&vsO)mL+du_>9GN^A(RU0LMC=g?Pyco9jnGT~OPO|O_A!hn8;3k4_$YsW0fSob ze6X~xjM#e`td)8j!d^Mrnb-j&c>?@EBKbaDf!Z1Rt+7^Is4-CdJ_GChII8a$ki#;` zP|~#JCz6*kvCiys1-b>lrq9P-{271#^U{0{Bwy(^&s2TqyPnWHRBmc`xQO&=tG9>s zK*!b&j;8&zhDTbE;L>`^R-8O%(vv>IqHwdMf+$pdA<3JBqL;wY+d)O>qP0WKLq3JU^2ls(J^qa@3! zjtR*=BJg{E<+(Q#pfcew*P^rexoh*P++UdUG~q0Usri#OA9$sv1O8bQ|87^@7IF67+j4|L1h|!u2w5vK?O%PlIkwAw!NXiwKD-3?hb6vB-|g{NB2Tc<-w}n#?)Fu=S$%z~*b26d1DHh*9Jd9H#0Nk^)SW1^ z#UT|8y%zpVxPSL;*fm{hO8)=jk<3GWL;g($ojF7LnMNJ^OmNhw(}2Q_s%g_W17t-P z(<{UiI&}mQFbJgV0L%jNZZJVf;19CdUmhQ*n%Megm^4;__L>4dQ61zVw+_J#m*gmy zI7Cg6|7@%M`x1UCTpydUMsc|}DNJofQ>9zO%!L-}rQ-xJT^O@)xr{iaN>w)x8s5pi0-?{e$frFbqLUV@BU59-h z0eQE7mivhGYi$N2PH5a?;VjJgj;o*B!&Fr=jDEj^pE2sa2EA%3d926R7q7V<12E&h zcqJ^ZN!wPO_wKt#x%dP)S6Bxpx+geYnv|nS?2bo^KN;4YpCf;&7`|s~f4Ic?Bfxrr}!MhF<%o zf=jQSpbm9G&&#%pd!&TjpsK39BkE)4KuybW!?`*&K7jdWKkLZ!v;KzDEq66PdNek~-;)MTeKB(S&bM`JyH%XYVE5Mu5`WGE^!7j&@o0Iqa2+IA@@)Ix$n>3a zKyP>f&NK|{fy}P}{#hb6?x9z2kDK+pOtPBoz}57!*G6Al2f2Ovk@Nx(Y#%f9*pMLN z6cKqPfRscGw%z}foc|l!7lcna?DgcxPuuge?pE=(g1gHEAqzfs4b-4nU$y}f{h%PN zf*A`)(nuL9!f@Uup6bay9OBEgIpb-Kel$EQ> zlKL4~e}}|=k~B=J%f0YVs{T(rg*&i968zn+YSD}Vh!R1nAkBNO$oTV9N+!oMk~*h(||Np9e@N$ zYTC{q_dC|kki2@FTel#OH^)AT$@(#7?#LL>3B2MfAqw%w|7YM!AaQG4csps`dJEzB z2!49>SK=pk0Mm3%j*lGi+}VaFRso?88kY+<0Qf*Z*LQj|4R;v=8%$<9-@xjCXOn~gojg{9jE8Uzr#|So zvBSxH=j2DRZN-d#-$PJDD+XsM0sK*%p5Qmi_1OsTX?#!dj@&CCO$IRA{N0-74~Gmi zT!UGUepY(_2|dF6kaBlZ<3-)m38M^HezA#2n4k|d(~;A10$h%!Qi2o0U-J=qZEm}P zfzSk?7ew6Eu#A%CwCNo7K^pNbfZn6?DaGchZ7= zq>{GZil73~tfUbTC3%P5?zoni^I+VPL2xhHCoPHxXQMlbaht;fmh~_#}{m~4; zJE5Pyrb6Qh-Cs<@-K;Y7fo? zhlTfUH{ftQpCwOMOd_@2OYi!q3#Ki|*4bVj>YVR305r4s0gu@S;&Pu!A|sC(o)>C( zg{d^LMqX~^FQ#Ch>CR{`U|Q$p&(ZO~x76HBZ z(KI~YGRS%y+pj6B!Xu$;mRtP&E|tyT=DSjVXn23c59nM~Q%)a1l$>npb4m z<6ACk`iu02AoGKc++WTqm^5>rK4SIJA!!5eEhe>8`RXdny$?2Z#W^8-i$7tW|KvhG z2hgJ76CpRdQFTx?`9e$j6IkFBBhEUt>SNq@z>0DL7RhTnCB7L9!Ozc4PT~4QB6S;+ zp}_A+jSm+!C_LHs({$KKYDp$P;(ECZq6y32gOOhzrK~?j3TIL$+3-0x5CVP+25?$s zEMZTCnc;_LUGKyEquL0MJ2m^QdcErDP~oM3&3rP_L4q?7-AbVu_}&yxs}$h4#3CI- zjl(%t%)e{Ruf2NPy+Uf0>F1ivL<$<~Mdy3! ze?0bG*h8&N_sA`r@8jPvhJ3yT*;FIjW@UeTRNxF9en1r3gWGR>sUuV{06##kd~^vx zN`yHvo0?}j>@u~V7WJP0^VZm*$fnm!WiK#l0Vpf_+UdkbQ`f#1T)%%Z+E;iiq|qVH z(bkDKZoXrH2|nN>fHc>_4Eg+V|MNb7{^t}8lTU`jpCqUeu@l6l5Ew*INTi>b3)A~g;;dzUo!bt2~nXavN1{S)-QNM~MCM(F{ zzjXUdvI06`&MU)tHyKj2Frx$EhXlRrXZz!UQb796g$jUHn3>?okIgA+(C!_{1D7HR zy>E!ieJDA9|Mu>>_sImf?rD|OS&K=5QDhPDB%X6+t%!jmz1#!X-_==5>F?q3s8ObC zr15(|Q{=&b0&nGL45VlpSsZxmY;c|a?`bZ-KO{!VGo~DPE2^y${RhkBvER5o_Uy~6 zkkF=QnHCdV*6#v`-67ai8F+Wxm|8e^|so%QF02m!T;i^9dMj>UTL z4q63x-u{T(bF1$G7?o&N_Eb&!7;Bb&^m@qa2fBRk6>o2=BfV+cj%X&Bsm~b)_ZZVo z)?#^sm&UcEg0uFuRf+O{ECs7@;nLv7cyn7q!%hkESYk#MWo|eVK$}NQCH5sXwrEPF zGQ%=Q{SRZPiSm(_S1H$d{ts4H8Yx^Rix?-Z-bOva6KF&7LSA2R{2c6tws<_bVra5p zO=X1bbz|CcXUI;iJ!%$&PBqP-jZS}{{CznFOTY>Bp5FsJe@7Db9@(epL%H#w`Lb3; z9Mb2p9?I5G8ScAy=f_>>8azFyf^dc7&U#YdeU#G${p?Du1>-#1%jg^qYq35!cIE9e z&*PF3HixP+Jgh`BD800SAXbbdcZh)`;y+^(L>DW~eWCK>$;LBp?F_{vn^FXLsN%t<<_13c>>;YaBu6~Xmh4;s)cQ$x0ny(xF;(IgD#K4Y$1naj@7XA<uJ7xhm9^xV7XXz; zeXp8URjuzRzybWH4MYnPcMc3p4&i@LWFUUX@W5>mUzgEK-@*T+1X|}6WmVVgq20+4 zCMNoD??o+=q@A&;L0D=Gg*o*$&}fnx_2X z0c>7uA@8h*SDiPn7MY;cU>xsg=>cwZ zZo{0-Q_Gg;y`kRWJ72_ME1I!QqWR<8Bi|9ETY97C76CVO)qCWr(M57+3dyIc++LIa zZIGi}q3Bo#0vSkxtTv*~Yel%3I_|cZl*CBM(Hz2PM$6i4qYvj&pImTQ-}X1&xbLB2 zyzWi9#?DO4?0D9%r7I79g|UCr(O>5&HqLM(AzE;r)=Q9>9i-VJnAJ4V6|wunqBy$3Bu_t%1s& z%TViS6E;ikT_8Xt)IwAsS^py00=Z8dAA9LgysG7GN=W_eHu(%FD?PRsd#AEDr3r;* z18KPOjfhE7y`q_N6HaeLT2vpdRad)W$M~vYWoobmA!A=JYk_0IzTCWP6yvpE6^mKW zpXixfh2;d&0cK8lZMa?hto%=%J)YC#x5XhiO+%rRCv+(7(6677+(>^MZosOzK|q72 zW$I_o`g@EJ{&WKID50`7qfu&dMK0gQBL(WNFKb2LdsA3kQjO0xxG!gAV55Ju+ae|< zk_L?BP9bb%_Nft9eReNB#I(JgGkTfCtWtIfJhqbsK$sBZ ztvivo5IRWf832fF#h+d(&#ol1gd~kQWoTmu#0Gv|S5` z_TclH6G@V`b8LRzv|@B}phdd{;v_&%xIMWjODDAg6OF3h_Da_dfqoDc(#lBdobF+i z%$w(&Tcnwexcy?|O&3y5Y2&l-zqtH<#&1~VwWQAabS;iR+B2IV#{&q*EPTn^I-wsK zRm(P@4IOiBN7iF_;GE!Uq1deUy#F*fsH7&EO{qr+vx-z}`|;_sMsEG}`w_kX)U*oU z*}}=lj(xa4jV!%F+r7HV3FbZC3D(=8Eth`b}?umK?$Fadf00voZY8)574ZJ*4 z2#H6=v5l{25?-+2^%(9PsiOtP*mp7Mv`tpW<9rIw%B?qxAlb^`FUhoR7{$3Qx_%=e z#68k#Z54L(^=78M$WvL9_l)9;r%wPcPJCUVJywxoC ze#i7YpndjrqU*KHY<MF`KGsL>d7bTk3;txf4>BcDAs%p|J1H)Uay_M+w0gp2x-3hjLFqRPRH~)K z**d39>Ke#2b5z1@$;DYOJlNb-+gzgJU>>~DyzxykW9e6 zSQ%g60YzHS5i%xFZl`TIAZUbobP?7Z_F^)hgR#FFf8L`tLDfSX_KJ5$nLjqJyVG+l z-NK!nEsQ@@;K>>1ZT&sdK84W{1aT6pc}6+0FO`(j*mq)(S+Bj4Awo7S^mU0(G{-_T z;zYg!#W0_W`UWRRnBsrsg9t*{e#X)wJVcvicOnr7nWtR9%0#TCUwsApg_re9u zW=Fq9A-dsZ2S*7RiwkIu4t&he~cu3c7&G z$zmZIUcDNb=MHQeYSilt$sV&pg2&pSTFF>>t#9O4l(&>t&fpo$j}05>DlW4qc$E$N z+nvkAzI>-yT(nSj#Axkq(SQQBQRVma#!wuVx%d&ct;)`_?*6y3RssKiX&WqOKYpi9 zs{vNqmoe%o*4pbU=Ic%|pXfGvaSAu)=nf2kuHtqhv^J0hUsqH`8+C1gFnZ~7tbP^v z>RP4FjhGMlCm70zgBY^hpkFFCt!n$ic%}+X)Dz7Fi!VKOqD3GTB7`QhU0@DM*D`cV zvqpFGFOK@0zp9<$#wh=#>qa+UV^FT2Cb8djNbDB(qQlu7R6Y<^_LkY|5qaZx%Pf+B z_I(n%gGr}AkMBxQJ=#%@Rg0;-6dXR+dS+=vb^$87$$3%k%o5`KnWT3nr)m04S3hlP zM@-JjmpRfVm44XC-DYn-OL3CmWL^c;M4?BaaO~ znQ!W8mxUG%G_MxQrhff4(>Rb=Cu`f#7Ax93138C~?q=1C*9kHRzxL+UpwCqf5p1o3 zH9_G#iqwg@Z(D#o_xEmO;xy_oL<6X7)G~MesLj`)7A0t!(eK0bV}E}Ap;~2rhfC-P zPE*pnT~r1cXVOp6je-ky-?I$i=FtLzR5vqnCLehE|aw!}UaxM$#71 zm{;t0h<5TEzo={|zl$2+@ens8J8buPE=N3a?h#rd2ig#6(o|hM7e8i9$6e3H-I=9R z8OC{q;$L{w#UQ|t#NlyMXry$6fBsSIDf$TQ?x{M@Lrp&M$BBELD!F8*NMC=9R`Qh2 z9XL?C_4wJ-a90))qZO*GCc8#lUZ?v^EZQ#`#$@e`H=;uH=*~M#>agIeHcW$AbYg^r z{?a(do7%*Z_zcQ8W6YA5QIn;?5?ChqKio>LE=X(H1Q;nD7pFL*TI6dWg<89j(Z4QZ z?C$XcS`?)QFx9qZiuG-b=Wmw3r}xLLa4p%gurCMDEtwG%I;)A`b5y4CijKUU+}|LR z+Hc8sUNh+ESl%)AsGIArdB&IMkFxz8uRV2U9}=fHZStMjsHRLCMR_b=)C~=k09~-m z-ROtvc1j#qmwP(CZH;B7JjyhQQCd!Nmx-GeWM42F_IJ6r-}SzMF9eKerz9@ysg@P; z#Hi-_%~D3Iv7ApI-|ruVo8DeBPj+NIt)tlc2HS7)Cbc@_1y4u`E|XW!QWp(6cE)DK zpUmCswshNQCd#l}9+y59_39R2b`#L6xDhsxu8(RL%lHgJDoM{*Os09rp!cB7y9lRdG#&9wYFUCx@uX=t%S zAhuecmppoG0vs62@1+cnKxu^^)NVz?IaT0O;dtvQjtoI@>eEFa3`;$4G7Q^L)p{PH zpUJmM@o9t8DpZD8u__ByhI=P&On-9hbHO&H^xBLAoY9Yd(`_Q$tNB08cxy`MaeDM zb7DkQ!!gvf**Q)oA_*8)Q!KG!WP{wc<2M_>=;h)PG=9*Z8pWi!Ot18El}AY3l7i`g zR-XRBT72_L!S1;)cokU(%=k=w6EkL(u>W)8q7w94`7w>kCVL1N|jSIBcz1|`dSl*;BB zL#gL%X)movs{CMiX%5+Rw2BDWd}Ddb1*VJP{;j^0OH;mOQGnrY$eDa4WE0w&+~Pdkxc0 zirQ}tI0pVX%X&=%cvI_}V5U3^OvKo=flSr)0xbZvTZ=|G`jUKzKu=VSfno-79@Nf8kEuzXSq z-WlC^keg)+Vy&WXYjmV-H&lBKAMisqHTAF=-QLm1YVMelR+^m|-Fwkz$DmCxLrYRkY^b zAHd7!bVHQaDiR&+{6zetkWDfoS`_afi1MY0$6`iFELp>db zTh!?oOjz0Dce~?wls8i|d~Z<{w5~6Fi26i|ZO~!m2}ok80)K*LDi@-kawaaJw zfFYuu5u3@@>Rs0_Fhqbe#{A<)R;Znmg+a&AnqyzH%*xPx`lZAE#VVy_p?!bltlcQU ztQ@ljgZTdJbtv~BJ>V$5TQG>j5bf$>QISvUv5$HFjaqO^m^iYsQh{?xtDGMf{p!g8;p)sLOC2G!xEQ(Ntew)LdIf9NeKgVJgo`=2_o-_7S)ytaRy}bY$3{;&XT~ zLIhvYb?kS|m*CNkKfI>aP{I{*nPbLaSRjDMC~A*247F10XfUE-_dtWOhE5`Ue(vQ~ zUFz+IN-M>g9s$V+l3+^ZL_Z$>3m=KJOr zQIz*VBsG0BWv#0~_}-H-!E`fvAvHffXvinZG5JY_X}b zaQ--2J4$_@OPB7u%%z<)h0=L!JQgQ;|NXR$)>^TEf>dHcoNGl~PO~konM)Y!?86UH z5;45ls`E_<@{&ql)5dyQpq)to5|Z7eIu3p#@Rz(&X}RrAOqr7W(QT0;%3?*LVQ)0J zH0#B|P>Ut%-kh=7k3`g^=Al*>3%rh1T)zq%O1YqQwC|yfW{^XbVYUsKt>qe;d&Px< z!$B#b(3Hi11?#C$7475&PN#>RrmKD$SZ`2OIl8(RgQ?p!-IYj&>*if!@8*$V*Eto7 zMNp*h!>s`27QJA9>4+^X}nG*x048Z9!pAtWYa>!c>G_>eM2RpW{uIc0ET z@B!b~k^xnUt3&~fq1P{y(4^e@vHEvs)^Pja8UieiI&n@=%};CSD^@s|WrHpW=CA3s z|1_h2{qt|2VF7j&GPJibC->H3-YZ6!VI-C3YE<u8?9?cZd6R)pe88640%AavS%dwmjcB@VjbSVSah6h!Q(u2hDLwN2p_eMHnkDgxxmBv@5Ac+m@1I*BeKs5_#ev+ zGiBRZpmOQCJiS`mQ`Vl~Yl!6@%=pcAE50R}g_1`mFqSV%UK=Z5jHe5`mBU9V;X&5C zB+`~QYiN-(Ktv@ME_C6kyxGzl%oi>B)ji9_yx$AL(>7${>g8exh@EGcTo~_F;Qh$uhQQ%ZG!ISSP%p? zqZFei=Yn~Z=Y4q|%d4SIoHxZ&voMsV_Iite*P-a>+CFZvhVEL~oaZ%@f5PO zf3wVHFToj9okp;1gqombadXLHPWJT{rQ%7NIS!Z6p~^oW^REG^ee;=VGpY>!}I zM*mI$OYtAySccFJOs1opd<^poyb}X0-j&9Lvi9y(z`o3m0I-L<;q#we?g9uqG&Q=pO|AI6_+eRlqzd7*!w&(FVj7WiqBL!xPoVzJ^;VIy8KlE>A0 z1O7S&JRCfFAOO5XrZyIdo`3m+DOL(Rk`{h_+mO6b2GuuB%sIIz=R<&-#(XKpk6c= z|HbwHZ@UMY_(SY?AA!50*qfsukt=RnMd}y207!K?sM}4HfxTok%oAe^J|BkVlY}fE z1`e_({=Xf>KDsbpOuT5%rXTwy;EhEPlUlkqcq2OCX0(3R^#X8y2e^O8R^YKC>K*~*!a-d2w3t;Bh6_;os1 z|J@Bg--pjEEJt=nhdn4gi=gi_B7t-B{&WprPIkQeKCFYU$N^@;;q3f%d??8nSj%My zJ~x=b0!k-PE#-Qj9QV0xZNm7u+V{<6jLpTKa^SnZ5f}l|pEaO1_e;LKy0Zj$PYL3( zr$MP2w_gK4$O4WX@Gu`=k@#M!JOTvH7#gQ4w@wGUm0IF(0MU=@^`gz?kI z`%@DLI4vpnTUsU|XkofzhR%J6qGbq2+Rn3O1%TrcV4JJE)gWfbNSAKyR`5vR2y|Iy zrj^wGVE|=V>ROM>!w7Z@;J!k4;GFIj$Y*%z+R&W63dvF#bd(p#ParZVBr6>q0Bhc$ zKEbx^#g}R`XwfrvOhWbkI70FF9d+uAKcD{RS$hNLCjagc@XYE35HvB;GZA{JT6*vw zgA-U_#Xt~srW4e1cJ}y^7B>zicVtP5MYzGzj2h6`Zo>nGTtxk0iYe^&jyC9coxI$3 zLb_B*9^czZ*5#hxSuJctR5ILXt^@jg8)1>yLh*u7Tj@TFdjlc744MK}j%|Ldyl8Ed zA01u*-D#aZY9!x4rhZ>S_i*VeaGQrEjMTMm1yFNr$vw`&aLOC797umbEk@hBobE4M zUv53p9a;^IsJ@@#W(e_dvM0EknCoxp+3kwiV3x!i<8iYZ(2Od5S{8f=^okpa-;!xR z=QseCZVSGi>?qMbat)@Yne5&h!niQ15HsFo^O0e`~Mi5$ktej~lNL0Gaeo4!pJ89}A}Q7*snvX(w) z{AcfzLn8)q%yJ^MIgIMVo%M_yqAHoGD%lRFJzaY&5JZIB%yz-jhugBhZ? zLU9^w{Mi%b_t%A3W`3;IpLh+#W3sHVk32L6c4UUcnnh(aVsTq8VpK!>IV36cGX@eT?{P^~yy^FLghGz03MjJ1mtzrex0Hj*w+Q@}GTxaj;isj_KmEAJ*IKD?; z{I(({A~A1EM|CpLjye;#PYS^4lB=7cue)P6$+x&xi^MYl!xba4SvIH+6@Lu%9Ml~2 z%{@U$@!VbDbHnN*_y7TeT z!psg?(P@bY@_~#x+~CQNG*LAfsVMc)jFjV?sGy}bK)2IrknSK9V<4O)uFL_Ewxjx* zR*a%1?s*RVio(YxYP{I8*N&kl()<9DAg$*bk$kz6dRT#Vw6x3_dkBf>-f8a%OZ(`Z1lKA|wuk8~{y4PTXL%T- z4(|_XXgS+88pm;|Up9ZG(6KdIgTWEg#294I;iG|24N9q48A_Voat~`ah8nCjWe1P* z0wZQ#m~Feow%IIkFj;($dqn?+yY)}fkha48w*9P1W-(r-0^YBDz^Gko8iLxqIssp( zfS(<&bGsS{vXWEGEi^Lf-46`0Dp5`v=*nd?fBlj%Sv=jK3g(~`l!51$bACj;r5o`? zL5^KI5d;j0_K&So$xVXZ_{Cz_d46t4;6c-}yw;jis|hKv7nAJL!``k9wGX8s_0Q?K>Qo~T@^2Z%(aHqItwGEKh^NtsBW#-(&VDTjo_86Y&2BL~>T?RMZ zhFS#bUUHR=12EXD=HQKd58TvXbk(GD7vB^D8>>lkDYB+7l2WSBnF_T6^(p)jkGTu` z%j4NKj=H=Sw2}d7>ztnFn^! zm&(Vwm^>LaW_$s-r6iB#PyfpWAgYGY${eVN!f}@0llF8So1c&AR2s`k2}D{Fi>lGu zZoMFh{$AyA90uEoYb^#DmSQk&_~@HmI_57CX#U4Tnw5pjSc-nwjp(?S4lN`>&l==h zqgd>bZr%}#i#l~BrCxvkAZLd>LZ(Y<%dLW-J0)q45?jz*g-LyaF}mwnO^ZPIWE(R# zP?Y6o)^LwDG=6w3jrb{a&nKo~B(ACPCWFDpie8o?1M2#>j&x?(O@~M$=OF0*o6jG^ zF*zbOfyGxYvpU2bo}dvyQH6z%?X@wAF*V2s>?(aNKbv!L&w`qa*2!a~Syj|7Q$7>- z3g!Re|7iFTMrTEW&IZPGbN16YV1abI{Kh@0g(FKDo=iKfjVz4xanMy@k{c1Kx+ zyw^5v8nwr8xYWrWWqs_3t&{pL;jwh11XMvP)Cf`aGp%npVeqJOP0Dk3=?0>TVCoTu zq`l*i;rSlCJp31JuS{3Z>j+s+3D1M1Ju<5qCy<8BQBii=? zM;vV?_lZ@*kH0XOIDAumP46i3(^R?w8H1)3`@Jvm%pp9si2;*S!SvrQ(4v{G8t?3I z5arEYncar8)ts-Se*ZIBIbP)37j&te5z{$Z93!DEb=Hz{OxYmJl3{YAQpBR((cuu=V8_x#+-a($ zPGgqD2*;8n&6dcFUd}%5uq-^1ie*EKE=4on&fvTenj?Vs+N|eF`>DJe8m4y7+xYXX zGpRLG!&#*Ce$S8|2_r;oBB;InEfLy>lQXTXOo_@`7I~E6BOG37oTTU()0p1Zi7J&0 zbU*wya8TIJiQlERr(qg!G6j9o?!(03py~+~g(7W89FOiMnI6KI?p8=lrzQ1I@N2JS ziO_3EYPl?cRr`)OY$SQEi9pE-?=DuoUo4Sr^8qYxmaT7tUyCaV=O_Z-L+)+@nRNa` z7MaYE6|^ohy-43BbdkTJ)$L&p5gqDdh^AJ-jD0_xY=KkAOT>>VP;QIDF~FO*;U%MO zU`D?$APeQbx}IVZLzz>`V(unHWUU*1;IZVGs;VB4xSDw^ zZZg`j?^anX9ZO2)unj&4NItDmj+b0Y;hE=uWFI8#|GX8;qSqO_O+q7TP6{fqE6 zOy>WN3s3%9)yjL5_2!}$=S}q6L+gE@kP?#TJ$B^#8k7DfhC#&(&@y#kBjUG>^oQRp z>_s=0YvgFIm45TY@^Du-a)yXk)jHhx9q-dOZvHJrq5XO3!v1vYj`Nyk8P7Ds9}#0e zMs3fZ+K#{N5-=Vog4E=SUYRDba(SEyX@=X=qhC(%M81u={rmC-h zDl6@*)f{KctjG_4&t)lV`FuwW#&5DWH4=R}ZXXw5;$!vcN(C>6Utggij^uK|iMKf& zDpqbqtQFxjAdJs^VB^ca+smJH6CBhcGV?+|_w#KW_0EwrUu(SCJ!5a^&{uWp)>&>` z$A}|$rZ<1B%RZxg-IKM)RyiNZU%i=po4db?`R@TKiS<40i=K)#b5-FRG8YQUnSXVokDO@@$^K6h@9qnv830bfLs+8_r zt3jc0#)d4RLUEBk@vd^_!=i8wzluwAE+zS|c{Ai*nr#$v6g> zaiSAQx!5 zlPfdsQ3P7a5<@_&G5G9Q)=!E@lHou~)WMcjI~<8_(b&K}ySZJ!N4CJp5c56e@==7+ z>d=8VEIECmDy&i{sTKwE9^Sbcn%Z{Rl!8cCmt%u3x})XvWp}&rKN)4q1iu#ZJ+Ji1 zcQE24S1MW3{(?L;`(}eAvDz!fQ?@+xeY~teJjbQV75&6?)XgkUW5OSO*MgnFf!$%WS~|vbve>+5 za8AJrl;OrR6{yW?kRb_1dXaUR3f1(S9_KEGPeG*>?mjwXnDqRybh!`jDTS$kT4lf4 z<0>yymWIrWqJa!07oA22tvs#=M+z8sID)#-H?0krUsn*PSsy?gt;iQuQFiNJ$t_lN z3bsl115Az^{VE4A5O4Cz&4Dnbh74)~^)aEGs*RaB9c1cn(MF-8L9^y@;-SzA-_xfu zf-gJDaHfWXQ#Qzs(!MD5(Nx-Xo;k_&qPSyVe6W05Mm8de8$P&ufS$@{!@XpDT7Yh%zXH_u#2Oh;el9NLhvCT0gf2^y7W*k= z;9N!0k?-n)$4dO3>Tsc}hLoS(%Fp@0^;;kJw{m42kO$r~%Wv_7v4X$(B#%T= zUJ(Ze8K(!HTUfqA^Gut17lfPE6myQ}$MJaA20Z3RkAW%tdSCi(^xlHOB>I)?s139i zS`vv^wLj^X2tCob&n%~1L_0ILgPJW>G0;vCX7n+%Gpc7w)gKE^QfB%~cV!Hx5vAFz z{kWz(uitqZ=3gh1=lTd@#;&t|DMr~nzEY2W?SbdvPADFMIo6MkvX?h4BMG8P&v`cU zM#$|tn_tO)0h4^KwyV$8XF|`{7T|u;H1c#FQD1X27`e{E`%*9Q!L1nE3^HbvpN6iU zuC*mg4SvMRbA3+Us;t-BUy5^vp4pj6zl+<{`}h}tMlsbhue};DNv5_`=4Hl1uST^5 z@+IzA4g90T`oE*dRN)E8^xH;_+6=QgdDwmFML$&KCNeV-7ZR_)h|5b6MMck$pZFHV zw;-vZF3gxK?Yi@#2u;?xk%et^k)yJy0Tj~4YiUKUuQlLKy`PzzN1pTj&qa%o zer}P)j2zXJwlsu^(nt+6mC8(OFGsvHmUFDlq2FS1sRSCREF1a>2kqOe0S?5QpCoj#;>KU~ z#N|5zqJG0aV{ZO}*4LWNZbj+sjWeXLhhx1iQY2Wd-0-LS+^Lcud42UhhHnveaLPBb zD_77-QR7y(-Fyy!2a|JYH$t-{dPT=kI!ca$vh~yZCo~Z{ycApe^2}2f`~aQbnC>^1 zPva&sEEcWj$nH>S4Vbl0;T3kGp?12p5`-~@*}p6Q{3v(xDGayeh0+eAwwx7k#(pS$ z)TtWle{0&wd=EMtC?UK*@egEz)+FIxki2QrRjhc_gJLW?ko%}(dMVrxt6v&yp&Vuz zFI96i6se}2V9pKHQdAc0Ia%_^=c9o6W6KE=^3ZiOoh{%rX{m6+iTDGUpBQQMPpKok8(sFsz+i6!iRRW8Bg(AkPeCvc8cw9JiMGNY-pCvoDul z(&W2Ro6m^R#Y;FK)@nY^NnaYJw+E$d`-ILsNi>56PY~R={5t%HY4bfsxyd;4 zy6NWRlJ4?Rb^x@r!Iyr8EYja`lZj(oY?>0LlpY74%#6ysc)_xjnEA2 z%i>Ai<|&9Qq{dgFP9`tC_eI4v$oC+IHjqhAQ-yHDW4!QUa(#}&mx%SklC0Q7pACf> z4>Eqa7;Dy%LfN^fN2|?(LDRwM7BFo!%+#sF#uF?X&Um#2XMS$}qf+oG<;h2hd1K6a zLiXd1EfejvxqJS!*W{m#c4Dzz-B2Zete?FhZ;EAxk_QrKYpV%QlS1p#xcS6$rTuqk zW*u(-r#v?ruA-%0Mbzt6?QGoYNx>~$V&ab8v$8L!vWF`IEn8Mxivyf$Gq zjb7{+T2E@J;(Vom4^4sf#00|6WEuHj#`SgaAe`mSS_|GYt(%WA=HDm`+`L-(eFP>H zJu+C^4`;^XXbgCj`USEYy9mTuD=01YN_-4E7v--o#ZF$jTJsQ3&w0I!`)NymW;s zFrB*^aCJ!zIjUjTIKXRDpQDp17~^Oie$KeCL35IbH4=-C~i@!zvv@ySrIJB`w<}kMd(=c^&&f#*N=wV}cq_ zD~9U-7$7)C+J6|c_AscME)phTJ5H~nLY;*XM;E96b~sn8Sx%Z(^Gaso8wA+xF0!P# zk-U=d02MrlNjVV5w~b_1QnNAMEIz8KS^uxE>wu^F{r-r|ZbV8ErOd3#PDVu~BeF-4 zJ+k)}S)pW)jLIfubCJ<9%edyHOUT}?5&q})t#5tH?_aN1uTRGPJfG)tp7T8CocDRZ zPtcxBbeux9ygAM0dP3{!`v^BpDda2n(bu5NcVec;l-S3Xc^=a0!l`9Cm5#-CC!z6p zHiGvDo93@dX693Ps{rLDv)VR={(sHh*f4?m-BEas?Phq^B3UcUF~_vpqGYs3A9vtG zRo4;j*fbk)R`1UknvLrFM;zed!ZEfnDIOuXI?Su!9(kX?>MvFX9I+pi?rYS9aMXU2 zIJ}Xo)73c2KMyLMl<*xw8|QCp3;g!NLjN>1f5EYogj3G_eIReAVv7?>Tuye{msKLR zk%QC@?XZgDFk|s?|KXL>dp2EHefXE z*bkGyhL{`03G)$tvRaLD-7Cme^DkJ$;zLjmUf(ivTTJ{|ww z{of)|_I2n*WfGM9NBezwstevMjcbi`sg<(i@Qg42tH; zlUy3h>gymO;Fo0j2Y!G8_O1BCf0KQIA(+Bo1M3}J@w-vAvayyQpIsfEPuKA%Zb5FX zCSJUi?d8R~%>A-cNw}Zu+lpF3S&M*h|2d0}x6xu)ZF5MKp&Sq7dab_`w`k3IQ6aFe zzqHiosHH&*h=kFKPTxiWy~~}QSfNj2$klkR#PhwHpx7ANSNb9^=AKR0S-AJgwC@>) zzb16O!)+R@ScGkAtHYdJ3w%jhWL19o@c@wTvhS%*rHOH-jR6=@u1z}$paQf`) zFKOxX+<5;;;Lex#H@DcU)4FPj)hsH3{TlRu6R?=$=Fri9O(U zM%EU*^5-}l8f*XbUwA%e0OZ2j9rnrQH;UigD17+({j_p|9T9%oL z9JjVguY(>7{ae_6`%o^n%Q7Z~$hVyNU&E4Jmp^@~yc+gpSUFvWd?H0dz5AXP4Rz~-Nmd&rs-A4YULnV7#;xEq_588#x zZJrG&Yhlk&Zvs)y-tIYI98v~Kxnfg?HB9;%i3%G+5NQ0SmS69gT}hS~>ly>1y-mC2 zjby~Qzj8)jL$$}#B?si(1@l)MlU;8Ur~$ze%l}(&_~Vid;RE=5;7`)&7?Z}43h6;9 z&CBL%yQ~JKIuIeRZhrmLiV?-GbX%gHhF7>iWW-iiG62dPcEdp~z29t68Uj;6tlE{W z;bKOi74|`4q(l>=x14K_a93KiZf}EwNLV&5Sx^G~fLF%JGkpOFgRR__Nm}^?TFdN= zZV|Dy6npK4^RcJ93s9*bzLxE?JI)gz{fT;a zEWzp6IUvy?1rnW~q8QD}9}oR`Fp@~IfL$EQLcviFkB0h6q!JdDCjbpU!z{8RKEJAD za|xSZIktFTMQ6xsXu9p&VD1)=rU7;F@qtM8g9EjFo$?9&S$&E25yb<>$;kT11dV*7 zF55%8CR`;$7nWlE$t_!(c>3!mI`VoqrgnIw(dcOFor zc$jv|{Wws$dHhY~wi1drToBhpFKv-&C0l7Uc6Qx+kHsKsa@pg}+`%{Gv^{=u0yZz$ zW1QE;lS<2_*EVDM1V%qz)S(WlIpE{bQZ~Vo;5iaH`);&Vd`NS;?9S{5ZcPK_u=DMn z0ISuhJV*EDpoliIhh_gUddr8U1LfnIAxTd8bng?3b4eSLmp>cnYVZ)V{KbN)0&WuE z*FXsNMn&aqz)r#VlakK~R`mFW_?%B9`91ILJHeqNzQ*(-c5|e9v+o;-Tg>$7xIE_{ za$ouyJ2YF_=2`XS0M;(yu|i37?fu}Z3~er>2RA3?yqv7~H7xn3)PwdNI=i86CpYDc zMbpiWUp{Np<4a1N`yo3=^WIoX6V3xE9k_kALaF_^)n5iE1CG*&wynTke{gMKwCq@{ z-9ggpAeVB8D3y$%qOU658D3yfYp z502g~pesd>d8!UH*v4qZN==q+U0+8oj> zU#2x8cXC-b)Y6YL9O%rTcZ}W2&(%9?&hK2nb=Kg@i3tCiZ8P!Ns?rH36(x&?IY#%} z$_U|;BA)9py07l%X|b*fjznu&Y&dk6W54L5jGR#gdXh1B#u%J>igNO8-!;7XdJ9Bq zJS(w-WLw1pb_(WO*cz>S>2l;Ehk$G|1dmE0cmJPL`cG|d=fhcU5fDik@K@!o@?W6R z(RFKyHtB7b^B4obYY`Rm2?_?8&{r(x`Efpm3yH!4D`mi|eLJW;>6lByk#lB|y|dUM z%i)rK>7xUNcKh2rM)oB@cGTV?+kLplUrD|wf# zk=g`OCJee`n>BAz% zljA2A;DU!mt1QpuwBo@l2WrWW5fV#yuQ8&2#hpJxo0OAq_TFiTr{VH(D?4ePKj@fk zF-R%~Cs=mw`YmGnafu^Zv-V~?#+6#y6U#k!WTR$vmhf8e zq{YZuQyNJoQ^-_+EX5IaAY7IW6z7qKfW-zbiH4&X+b&d2U`R^^c5akuiu{ z^hvUarWB~$I+Krxu;K*tqhyKvmOBfGS_@1#DX_k)M;eplTaw5 z^J_EU^lWT1ZOc|E87=8goTA}nTv|a4f0Wpvf>Dbt5+KoD_+dLaJ-}u$3HnV>n) zO1@S-DnXGUR1$djgp|MjAt5*5q7Pd+F`-%a}w=T z&v7d4I*@+c+gtYYYy1w3 zgX4S(Lp!ou*(&b71PdW@^yE2~%KK-JHy!@{{o_9Fo0_+^P-}vO3u*Nw7^2T4b>NDe zh^Oz^f3sEuFOCCHs8%Cai2uPL@%Gh zXpSwY;ABD}1g>4bIiAy0MJ17Pm}od^B{lI9-vvvQ-ybH4Ch)5#eIkKG*Qd&^QH@V} zdX$S3kkCBFTNwrdmeGaWJplpd+f;v4c%octC2QUUAo_H5Uh0@NLNelqDA^&8HQLw zP%JMzO2f&{&OUqj(8o#0-dlk@i%ny;uKlOWMCa_%2wl zer%|!asa0G5syYD)se7=LYLJmn7t)#koz@CH*g-uY!^PZ%0IZ0^BTGVei{kE$pRpV z)~c}2YDpCC06yRuw^6c3Z6Z^rhqfkSwQoZYrz()lePO7X7q^DkJF;F8aq!tdZC_+O;@JTM+MGKqsA7xWGmwGaw1D0Q9HCwh4xtJ- zNU8SJ;(E9F&$Sp&22sZ%sM?&Y3Pbp_N(gED8;=PxA<(|)29?)iN`#bbB=|L=e&~=- zf^Ey=%tMzr17(^|{(6y=ft>TuSrqS>7)CFACOf(Sn?|j0{!^Bz8vwL=^#T~imenRm zC;N{^9chcz;_1180~^Rxspp)}Ltz*da805;}8;H9}hN{LWgh)aLP+3LaR z3yeT^!UQB={JljfP<~Q7GfuXhhgLZ+i~nY-i^`v&Ojcs>;eZyfV74R(@=VBMA|eh< zb>+kq1G3(%D?2JVgd;+O-P-C?+T~8OB69Vk$H02&oSsv&$`=8D+kNqF#2gNj?l?DS zIo1856e?G}z_66`c^$IY=R5`r^e*DKt@42V{ql*!4-6?0#$SaqDnfePw1`e_@R1dN zoE3KbWcU@sOF=+#Q-g_SV{&N2=7qiQZS2V&F6~j7I=o*NNpiE&+cBNvs|s&oF8jl2 z=m%n_Pal;}fquCX{WrmxM_1>DhI-2xa%Rw#-JU>Jm|m=`ZYT-x*O*Eo+YAnJn4vgc zTRi^;GI=GmSd7V$mr}!u4-+vH#s)%CGdp~=uP(C;VICmWyUtzV6Y{GYuqQcNIL%54pmchMR8$$tf~fp+L+*^W=?6fYj2SoEwv9ikC?ODpKIneyT$6fUqRb<#in{dIS0tfb&Km4u5 z%CiGU3#$A&IVk-|I}mh~pkWC+f{>T7{*|}yAK_uF5h;Z)6NHF6#%OUqt&bp8NqEEQ z_*{y@QE&3!tdzw2H85|Ps6i&8IcoCrSq3vlV36A@aY9fQN9|@Y(f(Zi^(H{*dw>!? zaidzKLBS{Y$s2$bj+&pr5pQozs?{uZb@yMDvdEZfilZkI}iV(Oy7F?B9uLh(P`T+ z`7A~oqa2}>6uUi`X&jlG)$j&N#M8+;-!eLGjmiqW=8e;IO{PXC!-5RX8EdY-y@BTM6n3B5S>eIEhc;otZA#cPlpt+pkoxrG0cCHJEeaeET< zFF?8*^ny)rSZLF6TcjhdF9#Un?}7lDf^*H*CKlI}5^*dI$MtSLRP8bFlE%nPx9`Jd zo|Q)v5S(^$yf}OAH5h^sFa}l4X}*rXC%~c$$X=WAg4?wOo1elxX;#*4-Z6|%?;Wgg z$f<(R->&wf9MZ&IN2SrQA@g%1{9B19F?&!$K9$=_91e0`b-sWgZnO6#U zwQhcGnm`j#aKaP!(JtJ|L@I%E8G(k*s2I-dGO)9qR7jRFyCW8dAzbyG$b_Wb% zVPzm0;JSVz6m(}!PU4BJ%g3K%AKkQ*w1tz-7wKg-TOV!z=JE=K)bsh;#7X7Vw^Gj& zj|Kg^58+Nw2G=Ai19#TmiHnSq9hjNy+R`ksn20q0cvo9I05#KF_^x+iQt&V$&lI*f zRaI5m;!8v=IP6TG`pY`(VzHa*a|Cj9AC9-3aBw#LW3d}{_Ub#;UVo6(4|BYfGiC)O>T>29uMDm>yWvz9R{>Vqb3A}vUnEkVKgdDuRr(o*K1q7B ziXqU@d#ppdQ0{2RdDF2Jwo4hm)|Y!b^R2AbA8c=JY9(LrP^u75+JgON(=P4MzuxKB z1A6br_xHthorW@q3Z$Kr%#}T;o4q{)aBT*sFI8?>O`r|5#MJrU@ThQ@8tWWZQRdA{ zs+&zmzaTq_mK$L=LD5&qouZ>r=X{_#;SXia%l0>tM!-nKhq2OO^niML5VR&XlZInf zk1#W>7T@e`tJ@klp6O^XrHk9w8-&ES7s46#6IG|uk_F0y9>Iwl>R$57Q^u@-*G<}} z%I-*<#w%B^&3B}J*Y8hno(i7n3|66QgEW>OYo1@uVkWfJS&kTdYN!im-KF#guxfw0 z;eW4gkNMRDm)e7@W+`O)N5$uRZ?-e3Dt{EYJ5UxFZXb%cva}ufb-K4uZp9QWR~d`0 z^l-SHF!sd~n8}Mk;_LoB<(VRtvS~yhu2r9`2+f6Z_N>3ofEwpEU%1Ek?X~AZ$StAz z8aVSf0?DP!fGk$EhheTjEGl)ao^kuOg7}tw8O@vI?Pb=@R;Oy}W5!VYTt&}$3QlZJ zaM>(CN2;)B_?Cd!Cg^?oSDMQd2qLjzEB!;;C>ra^1V;+aa~Xy*@OYy64}$-Fs9*8I ze6e>UjfwFbu4*tYAqV>cnd7af}Cd)*X>%CkRAai^x})B=BXc!!Fp zd)0HAo7irx?Bj#7=}GVU@N+fagPt;}Q%CLHK|C?kVdy#xBzar>7Q}!yJTr+Mr-|<~VfGGgPIx*JS zvgeIk6EiE>FQJYb8YekKcjc(H73Hh|Y%hdkPwHn?;txPv{^@C6TG|Qy^D~28$4y?w zn-Q2(5ar^SuH9OM1Y);vaKU;E(V$cJ9gsdLRcX%2ns7EbgIhuPP$w|y5Yhs)Wo`~yIKcv8}kVJ^+bMiRn0q7C%On`Vcr{71`kk*P{;># zs600%E=0JI^NSlE?UX6@K?56iv^;x|qVmJ+J@Zm6mEKjjT7A=F7?L>;EsSJ()&0|=_rM5euq0%~+BR$_3#hH}U z1AWJVB!emuQUP<&1J9=aKt15&IvSlwyZ6v#2!@uVc6k#dYqWvIBWll&(l}?|lmd;C zh_GV2ad})cWeFYMR2~QM%mbzYjg|`sSxg(v>1-PRx2Sy7KTZhQA$2@%x)0uAy2 zfQqVca&m?UbJbzaCDXux57gIzOUt73LlKePu1 z>N!Xxm7bK$#&+H93gNC`Gh)jUW?NS6$?_JB(rhHtRACnEN@w^qdvX0H*j#~WfIYoChHNjo)~F&xnMnj_9s-Y)aU93w(a}$Nm)p-~ zq4TrjKxBE$FUCA0-)wr4S8&D;_2S^zTQeMlG%92MD5ZHK99u-ib>{Zf7FTLum!i!- zdTe!)h4G79CEdZ++AL5$abLXZ_SuK{#0A_zR=N7(=z05;C)jl!or=zQesfxzP^WI& zSH>Xa+K_2W^C2Izv<%*&qjcojZvpg=GzL=v0W=+#!qFOK)S4K#>|N%31D%a*d* z@47O1a4AJB&jv(L(nab#kDNO7jmv&mB@Rb*IiB2pt!r;nBV2KZ+Ca>w>Ug)>=eJ zF`$jz9<{N2%p{=fft1_@vV7BWY9{*DBz`BU-y(~jPdd+@GOzml6w<-Tp?q@444ZdN z$+;g`ZS|X?x$MlaIOQd(%J51!h)(M}2ok*)Ifpx%mN+ly4@oW*nRette0f3bv2H1t zT--GYcj)F%-;9ckd?xs@TP;tg61A=ZQHw|D(|ddF%sfQsoc5ZDob7q}RGC${D;?br z?waHl?y%h;HqG1ha$*i*rJiK!s$VIvUstxLQ*@r=x_bv+t5(|LdZ>(v7fUSrEn4FF zN$YjQMU@3D`wSo_m7j(5G2_gs&d1J+i4#{C246Fzqlt8rwK6dKW-yZZ#UFLl?95zW zaSrwOP{q{0?ucwE((z)zwEz=s4`!yMJ=lmmpSBT5h%7novIa@MECFH12{X1fNazbshevBctTo_jC;0bj#Pc~vTop}wIY~HI^XCBh77nsyx z+?~mq@qb$TuXPQvH6BT3qF>`RKVU(AnhWj+U){x%`;oPfcrtn6Zc9ZXC6f@B$OCra zY7hYBMCQY(Obhna5VIuzqQi939faTUp5dwE)JXkjI*?H zqRoAf8xRjSI^3K^i6CAoFErcL7HnCpq5e_{2?k3@HMfcd>}SLUN=?06#tG1uXqhF>Mp$3Vi;f_n4vo{o;?u9Xx4O9#jSu(jv&0fp{-?qQY~_ReW%H_wnEp zzG6u^L!BByoi*@G-H{rycZ;19zv>77Ia*z2e|Yx;sUD44Z;%;j035+)AQj5p7!!DT zmm?T>5D5&~Gi6(;9Igg*gI~S>=94pa|KqKudHW8JHpPfOXZeyH|s3&+*>sl zRzmc(C4~~Hr1$=?0v~s(&pgl87f&wUIVS1M=u0C)gmD>rr-mr};Y)qo53zl<7P@I5 zJoKngOniG>pug^osOQ7&1L{bHm%M6klePTU2V(jEJC_m*BsW!6HPg-Zt2MP^hFxfK z34gk=-+eTE?R}`Xl%9WmoSDYH0H|y!i9F&_4$-II-8>{xdI-;yo2v`J53h{8BMUVB zHOcF&53?9AH`PQPYjW#~V`v&`%Bat)EXl_B_Y*IOwGuF2Jn@GeJ#-?N z@T)5)@k1*LlLuTB?2;e8F5nxrV>bNoLuv5K-!vMm$idn<8ewB z`qhP$iT@hgFKt|iXSXMg0L>$`Z$Vub&s6Tv`ofR$>h|mO zyWJe0@Egek5P9X`;P__G)u&VUl2$=zdMYYq_q~&ZCR;*7BhD0Sotqv(1UwLA;Pv2$GP$&(e>P5wN8^6f&v2M=fSl zhr#otDlpjf$0#MBlHs)LT*3#Dq(Ej7k5NQ+x6~r;rrV4TC?$0#jz?B_@aO7f`Ahjy Hw|)N)?|1_i diff --git a/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config.webp b/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config.webp deleted file mode 100644 index 68d286310e507e85f1559184ce2b61173fa86e31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150073 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 + +## Prerequisites + +- You have TAIKO or TTKOh depending on which network you are proving on +- You have enough ETH or holesky ETH for gas fees + +## Deploying a ProverSet + + + +1. **Clone the Taiko monorepo** + + The [Taiko monorepo](https://github.com/taikoxyz/taiko-mono) contains the scripts for deploying your `ProverSet`. Checkout the latest stable release. (Use `protocol-v1.9.0` for Hekla!) + + + + ```bash + git clone https://github.com/taikoxyz/taiko-mono.git + cd taiko-mono/packages/protocol + git checkout tags/{release-tag} + ``` + + + ```sh + git clone https://github.com/taikoxyz/taiko-mono.git + cd taiko-mono/packages/protocol && git config core.autocrlf false + git checkout tags/{release-tag} + ``` + + + +2. **Deploy the ProverSet** + + Set `ROLLUP_ADDRESS_MANAGER` to the address of the RollupAddressManager contract on the network you are deploying to. You can find these values in our network reference docs. + + Set `PROVER_SET_ADMIN` to the address of your **prover** EOA. You will be able to withdraw TAIKO/TTKOh from the contract to this address. + + Run the `DeployProverSet.s.sol` script with your **proposer's private key**. You can find the script [here](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/script/layer1/DeployProverSet.s.sol). + + ```bash + ROLLUP_ADDRESS_MANAGER={ADDRESS} PROVER_SET_ADMIN={ADDRESS} forge script --chain-id {CHAIN_ID} --rpc-url {YOUR_RPC_URL} --private-key {PRIVATE_KEY} --broadcast script/DeployProverSet.s.sol:DeployProverSet + ``` + + + + The script should print your implementation and proxy address with the log: + + ``` + Deployed ProverSet impl at address: 0x.... + Deployed ProverSet proxy at address: 0x.... + ``` + + Use proxy address for the following steps. + +3. **Verify the contract as a proxy on Etherscan** + + Navigate to the `proxyAddress` logged as output of the script above in Etherscan. + + In the `Contract` tab, you can find the `More options` section as follows: + + ![Verify as Proxy](~/assets/content/docs/guides/verify-as-proxy.webp) + + Select the `Is this a proxy?` option and follow the instructions. This should verify the contract as a proxy to your `ProverSet` implementation. + +4. **Write to the Proxy to `enableProver()`** + + If the above step was completed correctly, you should be able to see the `Write as Proxy` option in the `Contract` tab. + + Connect to Etherscan with the EOA you used to deploy the ProverSet and send two `enableProver()` transactions, enabling **both** your `proposer` and `prover` EOAs as provers. Set `isProver` as `true` for both transactions. You can set these as `false` if you want to disable these provers in the future. + + + + This will allow both EOAs to send transactions to your ProverSet implementation which will act as a proxy to TaikoL1. + +5. **Configure the contract as necessary** + + Manage the contract's allowance with [approveAllowance()](https://github.com/taikoxyz/taiko-mono/blob/protocol-v1.9.0/packages/protocol/contracts/layer1/provers/ProverSet.sol#L64). TaikoL1's contract allowance is by default set to `UINT256.MAX` in the init function. + +6. **Deposit your tokens and run your proposer + prover as usual!** + + If you've followed the instructions, send your TAIKO/TTKOh to the ProverSet proxy and begin running your prover and proposer as usual. If you've set up your allowance properly, there should be no need to use the `depositBond` function, as it deposits TTKOh from the ProverSet to TaikoL1. + + + + Ensure that you have set up the EOAs correctly to avoid problems. + + + + + +## Upgrading a ProverSet + +If you've already deployed a ProverSet but would like to upgrade it through the Proxy, this guide is for you! + + + +1. **Find your existing Proxy's address** + + This will be necessary for the following step. + +2. **Navigate to the taiko monorepo and checkout the release version of ProverSet you want to deploy.** + + ```bash + cd taiko-mono/packages/protocol + git checkout tags/{PROTOCOL_RELEASE_TAG} + ``` + +3. **Deploy the ProverSet contract from your prover EOA and call upgradeTo with the new implementation address on your original Proxy** + + Execute the following command, filling in the values in the curly braces appropriately. + + ```bash + forge create --private-key {YOUR_PRIVATE_KEY} --chain-id {CHAIN_ID} --rpc-url {YOUR_RPC_URL} contracts/layer1/provers/ProverSet.sol:ProverSet + ``` + + + + You should see logs like these: + + ``` + Deployer: 0x3e5c... + Deployed to: 0x9186... + Transaction hash: 0xf0ebb... + ``` + + Then, proceed to your original Proxy contract; access the `Write to Proxy` tab and scroll to the `upgradeTo()` function. + + Connect your EOA that you originally deployed the ProverSet from and call the function with your new `Deployed to:` address. + + Once the transaction succeeds, you have successfully upgraded your ProverSet. + + + +## FAQ + +### Where is my TTKOh/TAIKO? + + If you've managed to propose and prove some blocks, it's likely you're wondering where your tokens went after. + + It's not missing, it's just been deposited as bond in the TaikoL1 contract; you can withdraw it to the ProverSet contract with [withdrawBond()](https://github.com/taikoxyz/taiko-mono/blob/protocol-v1.9.0/packages/protocol/contracts/layer1/provers/ProverSet.sol#L136) manually. + +### How do I verify my ProverSet contract? + + Once you've deployed the contract, you should be able to find the contract address. You can do this on Etherscan manually or with forge! + + You will need foundry installed, and an Etherscan API key; you can get this by signing in on `etherscan.io` and navigating to your profile's `API Keys`. + Then, navigate to the `protocol` package in `taiko-mono` and execute the following command substituting values in curly braces as necessary. + + ```bash + forge verify-contract --chain-id {CHAIN_ID} --etherscan-api-key {GET-API-KEY-FROM-ETHERSCAN-FIRST} {PUT-CONTRACT-ADDRESS-HERE} contracts/layer1/provers/ProverSet.sol:ProverSet + ``` + + You should get a success message and your contract should now show up as verified on Etherscan! + + + If you run into any problems, please visit the [node troubleshooting page](/guides/node-operators/node-troubleshooting) for help. + If you run into an error that isn't yet listed, please reach out in our [Discord](https://discord.com/invite/taikoxyz)! + diff --git a/packages/docs-site/src/content/docs/guides/node-operators/enable-a-proposer.mdx b/packages/docs-site/src/content/docs/guides/node-operators/enable-a-proposer.mdx index c60f377f6a4..08352468df2 100644 --- a/packages/docs-site/src/content/docs/guides/node-operators/enable-a-proposer.mdx +++ b/packages/docs-site/src/content/docs/guides/node-operators/enable-a-proposer.mdx @@ -3,36 +3,42 @@ title: Enable a proposer description: This guide will you help you enable your Taiko node as a proposer. --- -import { Aside, Steps } from '@astrojs/starlight/components'; +import { Aside, Card, CardGrid, Steps} from '@astrojs/starlight/components'; + + ## Prerequisites - You are already running a Taiko node [with Docker](/guides/node-operators/run-a-taiko-node-with-docker) or [from source](/guides/node-operators/build-a-taiko-node-from-source). -- You are able to receive prover bonds from your own prover or from [a community marketplace](https://dojonode.xyz/tatami). - -{/*## Using `stn` - -1. Install [stn](https://github.com/d1onys1us/stn) if you haven't already. -2. Execute `stn config proposer` in your terminal and walk through the steps.*/} +- You have [set up a prover](/guides/node-operators/enable-a-prover) or [configured a ProverSet](/guides/node-operators/deploy-a-proverset) with a third-party partner. ## Using simple-taiko-node - Next, you will set the L1 node endpoints. If you are running a local L1 node, you cannot reference the L1 endpoints as `http://127.0.0.1:8545`, `ws://127.0.0.1:8546` and `http://127.0.0.1:5052` because that is local to inside the simple-taiko-node Docker networking. Instead you can try: diff --git a/packages/docs-site/src/content/docs/guides/node-operators/run-a-testnet-taiko-node-from-source.mdx b/packages/docs-site/src/content/docs/guides/node-operators/run-a-testnet-taiko-node-from-source.mdx index cdc07766408..489a027e929 100644 --- a/packages/docs-site/src/content/docs/guides/node-operators/run-a-testnet-taiko-node-from-source.mdx +++ b/packages/docs-site/src/content/docs/guides/node-operators/run-a-testnet-taiko-node-from-source.mdx @@ -5,7 +5,7 @@ description: This guide will help you start up a Testnet (Hekla) Taiko node. import { Aside, Card, Steps, Tabs, TabItem } from "@astrojs/starlight/components"; -This tutorial explains how to run an Taiko node for our testnet Hekla from source code. +This tutorial explains how to run a Taiko node for our testnet Hekla from source code. ## Building the Source Code diff --git a/packages/docs-site/src/content/docs/network-reference/differences-from-ethereum.md b/packages/docs-site/src/content/docs/network-reference/differences-from-ethereum.md index a5e5cec40e5..24065643beb 100644 --- a/packages/docs-site/src/content/docs/network-reference/differences-from-ethereum.md +++ b/packages/docs-site/src/content/docs/network-reference/differences-from-ethereum.md @@ -3,8 +3,8 @@ title: Differences from Ethereum description: Network reference page describing the differences between Taiko and Ethereum. --- -| Parameter | Ethereum (Holesky) | Taiko (Hekla) | Reasoning | -| ---------------- | ------------------ | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| Block gas limit | 30,000,000 gas | 15,000,000 gas | Circuit constraint limitation in PSE circuits; addressed by zkVM, chunking, etc. | -| Block gas target | 15,000,000 gas | 60,000,000 gas (per L1 block) | Assuming an L2 block time of ~3 seconds will have a ~15,000,000 gas target. | -| Block time | 12 seconds | ~3 seconds | Allow for greater throughput on L2 as it does not threaten the node decentralization the same as on the consensus layer. | +| Parameter | Ethereum | Taiko | Reasoning | +| ---------------- | -------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Block gas limit | 30,000,000 gas | 240,000,000 gas | Currently in Raiko, memory use scales linearly with block size both in the host (witness generation) and in the guest (memory use inside the VM/program being proven) so we set the block gas limit to 240m gas. | +| Block gas target | 15,000,000 gas | 60,000,000 gas (per L1 block) | Assuming an L2 block time of ~3 seconds will have a ~15,000,000 gas target. | +| Block time | 12 seconds | 12-20~ seconds | Currently, we are the only block proposer. Once we move to decentralized proposing / achieve preconfirmations, this value is expected to decrease. | diff --git a/packages/docs-site/src/content/docs/network-reference/mainnet-addresses.md b/packages/docs-site/src/content/docs/network-reference/mainnet-addresses.md index 8c6d4df8e0b..e98c0898edd 100644 --- a/packages/docs-site/src/content/docs/network-reference/mainnet-addresses.md +++ b/packages/docs-site/src/content/docs/network-reference/mainnet-addresses.md @@ -15,14 +15,15 @@ description: Network reference page describing various important addresses on Ta | ERC20Vault | `0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab` | v20.based.taiko.eth | | ERC721Vault | `0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa` | v721.based.taiko.eth | | ERC1155Vault | `0xaf145913EA4a56BE22E120ED9C24589659881702` | v1155.based.taiko.eth | -| BridgedERC20 | `0xcc5d488073FA918cBbd73B9A523F3858C4de7372` | N/A | -| BridgedERC721 | `0xc4096E9ff1526Bd1840B65e9f45695135aC12De7` | N/A | -| BridgedERC1155 | `0x39E4C1214e733639d059979079A151911e42791d` | N/A | +| BridgedERC20 | `0x65666141a541423606365123Ed280AB16a09A2e1` | N/A | +| BridgedERC721 | `0xC3310905E2BC9Cfb198695B75EF3e5B69C6A1Bf7` | N/A | +| BridgedERC1155 | `0x3c90963cFBa436400B0F9C46Aa9224cB379c2c40` | N/A | | Contract Name (Rollup-Specific) | Address | ENS | | ------------------------------- | -------------------------------------------- | -------------------------- | | TaikoL1 | `0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a` | based.taiko.eth | | RollupAddressManager | `0x579f40D0BE111b823962043702cabe6Aaa290780` | ram.based.taiko.eth | +| TierRouter | `0x8a4c692F12d3a9750E744A4CE24a1d351bE52E66` | N/A | | GuardianProver | `0xE3D777143Ea25A6E031d1e921F396750885f43aC` | guardians.based.taiko.eth | | GuardianProverMinority | `0x579A8d63a2Db646284CBFE31FE5082c9989E985c` | guardians1.based.taiko.eth | | AssignmentHook | `0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6` | N/A | @@ -33,7 +34,7 @@ description: Network reference page describing various important addresses on Ta | P256Verifier | `0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0` | N/A | | SigVerifyLib | `0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9` | N/A | | TokenUnlock | `0x035AFfC82612de31E9Db2259B9482D0Dd53B7819` | N/A | -| ProverSet | `0x34f2B21107AfE3584949c184A1E6236FFDAC4f6F` | N/A | +| ProverSet | `0x3022Ed0346CCE0c08268c8ad081458AfD95E8763` | N/A | | labprover | `0x68d30f47F19c07bCCEf4Ac7FAE2Dc12FCa3e0dC9` | labprover.taiko.eth | | labcontester | `0xa01d464ca3982DAa97B19fa7F8a232eB11A9DDb3` | labcontester.taiko.eth | @@ -74,10 +75,10 @@ The owner has the ability to upgrade the contracts. | Name | Address | | ------------ | -------------------------------------------- | -| Proposer #1 | `0x000000633b68f5d8d3a86593ebb815b4663bcbe0` | -| Prover #1 | `0x000000629FBCf27A347d1AEbA658435230D74a5f` | +| Proposer #1 | `0x000000629FBCf27A347d1AEbA658435230D74a5f` | +| Prover #1 | `0x000000633b68f5d8d3a86593ebb815b4663bcbe0` | | Contester #1 | `0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B` | ## Taiko Labs' bootnode addresses -Find the latest bootnodes here in [simple-taiko-node](https://github.com/taikoxyz/simple-taiko-node/blob/mainnet/.env.sample). +Find the latest bootnodes here in [simple-taiko-node](https://github.com/taikoxyz/simple-taiko-node/blob/v1.7.0/.env.sample). diff --git a/packages/docs-site/src/content/docs/network-reference/network-configuration.md b/packages/docs-site/src/content/docs/network-reference/network-configuration.md deleted file mode 100644 index 9dda021de32..00000000000 --- a/packages/docs-site/src/content/docs/network-reference/network-configuration.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Network configuration -description: The network configuration page describes many of the configuration details of the network. ---- - -## Tier configuration (Hekla) - -You can view the full `TierProviderV1` tier configuration [here](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/contracts/L1/tiers/TierProviderV1.sol): - -Here is a diagram of the proof tier configuration: - -![alpha 7 proof tiers](~/assets/content/docs/network-reference/proof-tier-config.webp) - -## Network configuration (Hekla) - -You can view the full network configuration by visiting the TaikoL1 contract on Etherscan [here](https://holesky.etherscan.io/address/0x79C9109b764609df928d16fC4a91e9081F7e87DB#readProxyContract). Then connect your wallet, and select "Read as Proxy". You can then see the config details for the network. - -## Tier configuration (Mainnet) - -![mainnet proof tiers](~/assets/content/docs/network-reference/proof-tier-config-mn.webp) - -## Network configuration (Mainnet) - -You can view the full network configuration by visiting the TaikoL1 contract on Etherscan [here](https://etherscan.io/address/0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a#readProxyContract). Then connect your wallet, and select "Read as Proxy". You can then see the config details for the network. diff --git a/packages/docs-site/src/content/docs/network-reference/network-configuration.mdx b/packages/docs-site/src/content/docs/network-reference/network-configuration.mdx new file mode 100644 index 00000000000..e615b575524 --- /dev/null +++ b/packages/docs-site/src/content/docs/network-reference/network-configuration.mdx @@ -0,0 +1,47 @@ +--- +title: Network configuration +description: The network configuration page describes many of the configuration details of the network. +--- + +import {Aside} from '@astrojs/starlight/components'; + +## Cooldown Window, Proving Window and Bonds + +This segment lists the cooldown windows and proving windows for every tier of proof in the Taiko protocol. + +The cooldown window describes how long after the proof has been provided that the block is verified. + +The proving window describes how long a prover has to provide a proof for a block after they have been assigned the block (i.e. a block has been proposed with them as the assigned prover). + +You can find all the corresponding values below in the [deployed TierProviderBase contract](https://etherscan.io/address/0x394E30d83d020469a1F8b16E89D7fD5FdB1935b0#code#F3#L1)! + +| Tier | Cooldown Window | Proving Window | Bond | +| ----------------- | --------------- | -------------- | --------- | +| Optimistic | 1440 minutes | 255 minutes | 75 TAIKO | +| SGX | 240 minutes | 300 minutes | 150 TAIKO | +| ZK | 240 minutes | 420 minutes | 225 TAIKO | +| SGX & ZK | 240 minutes | 420 minutes | 225 TAIKO | +| Guardian Minority | 240 minutes | 240 minutes | 225 TAIKO | +| Guardian | 240 minutes | 240 minutes | 0 TAIKO | + +## Tier configuration (Mainnet) + +You can view the full `MainnetTierRouter` tier configuration [here](https://etherscan.io/address/0x8a4c692F12d3a9750E744A4CE24a1d351bE52E66#code): + +![mainnet proof tiers](~/assets/content/docs/network-reference/proof-tier-config-mn.webp) + +If the function of the bonds is not clear to you, please find out more [here](/resources/terminology#bonding-related). + +## Network configuration (Mainnet) + +You can view the full network configuration by visiting the TaikoL1 contract on Etherscan [here](https://etherscan.io/address/0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a#readProxyContract). Then connect your wallet, and select "Read as Proxy". You can then see the config details for the network. + +## Tier configuration (Hekla) + +You can view the full post ontake fork `HeklaTierRouter` tier configuration [here](https://holesky.etherscan.io/address/0x6A666F2C56a6559dB0BD8866Bd0c0dDB9ec03c66#code): + +![hekla proof tiers](~/assets/content/docs/network-reference/proof-tier-config-hekla.webp) + +## Network configuration (Hekla) + +You can view the full network configuration by visiting the TaikoL1 contract on Etherscan [here](https://holesky.etherscan.io/address/0x79C9109b764609df928d16fC4a91e9081F7e87DB#readProxyContract). Then connect your wallet, and select "Read as Proxy". You can then see the config details for the network. diff --git a/packages/docs-site/src/content/docs/network-reference/rpc-configuration.md b/packages/docs-site/src/content/docs/network-reference/rpc-configuration.mdx similarity index 86% rename from packages/docs-site/src/content/docs/network-reference/rpc-configuration.md rename to packages/docs-site/src/content/docs/network-reference/rpc-configuration.mdx index c6bfcaca7f5..aff22a13f3e 100644 --- a/packages/docs-site/src/content/docs/network-reference/rpc-configuration.md +++ b/packages/docs-site/src/content/docs/network-reference/rpc-configuration.mdx @@ -3,8 +3,15 @@ title: RPC configuration description: Network reference page describing Ethereum and Taiko RPC configurations. --- +import {Aside} from '@astrojs/starlight/components'; + + Below are the RPCs maintained by Taiko Labs. You can find additional RPCs at [chainlist](https://chainlist.org). + + ## Ethereum (Holesky) | Name | Value | diff --git a/packages/docs-site/src/content/docs/network-reference/software-releases-and-deployments.md b/packages/docs-site/src/content/docs/network-reference/software-releases-and-deployments.md new file mode 100644 index 00000000000..f07a85dd624 --- /dev/null +++ b/packages/docs-site/src/content/docs/network-reference/software-releases-and-deployments.md @@ -0,0 +1,26 @@ +--- +title: Software releases and deployments +description: Reference page showing the latest Taiko software versions and deployments. +--- + +## Software releases + +It is **highly recommended** you use the latest software. You can find the latest versions here: + +| Package | Release notes | +| :------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| [protocol](https://github.com/taikoxyz/taiko-mono/tree/main/packages/protocol) | [![Github Release](https://img.shields.io/github/v/release/taikoxyz/taiko-mono?filter=protocol*&label=)](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/CHANGELOG.md) | +| [taiko-geth](https://github.com/taikoxyz/taiko-geth) | [![GitHub Release](https://img.shields.io/github/v/release/taikoxyz/taiko-geth?label=)](https://github.com/taikoxyz/taiko-geth/blob/taiko/CHANGELOG.md) | +| [taiko-client](https://github.com/taikoxyz/taiko-mono/tree/main/packages/taiko-client) | [![GitHub Release](https://img.shields.io/github/v/release/taikoxyz/taiko-mono?filter=taiko-client*&label=)](https://github.com/taikoxyz/taiko-mono/blob/main/packages/taiko-client/CHANGELOG.md) | +| [simple-taiko-node](https://github.com/taikoxyz/simple-taiko-node/tree/main) | [![Github Release](https://img.shields.io/github/v/release/taikoxyz/simple-taiko-node?label=)](https://github.com/taikoxyz/simple-taiko-node/blob/main/CHANGELOG.md) | +| [raiko](https://github.com/taikoxyz/raiko/tree/main) | [![Github Release](https://img.shields.io/github/v/release/taikoxyz/raiko?label=)](https://github.com/taikoxyz/raiko/blob/main/CHANGELOG.md) | + +## Mainnet deployment logs + +You can find the contract addresses of the latest smart contract deployments of the Taiko Protocol on Ethereum [here](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/deployments/mainnet-contract-logs-L1.md). + +You can find the smart contract addresses of L2 contracts for the Taiko Protocol on Mainnet [here](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/deployments/mainnet-contract-logs-L2.md). + +## Hekla deployment logs + +You can find the all L1 and L2 contract addresses of the latest smart contract deployments of the Taiko Protocol [here](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/deployments/hekla-contract-logs.md). diff --git a/packages/docs-site/src/content/docs/network-reference/testnet-addresses.md b/packages/docs-site/src/content/docs/network-reference/testnet-addresses.md index 6763a2cd3f5..6eaad487371 100644 --- a/packages/docs-site/src/content/docs/network-reference/testnet-addresses.md +++ b/packages/docs-site/src/content/docs/network-reference/testnet-addresses.md @@ -14,16 +14,28 @@ description: Network reference page describing various important addresses on Ta | ERC20Vault | `0x2259662ed5dE0E09943Abe701bc5f5a108eABBAa` | | ERC721Vault | `0x046b82D9010b534c716742BE98ac3FEf3f2EC99f` | | ERC1155Vault | `0x9Ae5945Ab34f6182F75E16B73e037421F341fEe3` | +| BridgedERC20 | `0xe3661857941E4A711fa6b4Fc080bC5c5948a70f1` | +| BridgedERC721 | `0xbD832CAf65c8a73609EFd62E2A4FCB1292e4c9C1` | +| BridgedERC1155 | `0x0B5B063dc89EcfCedf8aF570d82598F72a7dfF35` | | Contract Name (Rollup-Specific) | Address | | ------------------------------- | -------------------------------------------- | | TaikoL1 | `0x79C9109b764609df928d16fC4a91e9081F7e87DB` | | RollupAddressManager | `0x1F027871F286Cf4B7F898B21298E7B3e090a8403` | | GuardianProver | `0x92F195a8702da2104aE8E3E10779176E7C35d6BC` | +| GuardianMinority | `0x31d4d27da5c299d4b6CE19c869B8891C0002795d` | | AssignmentHook | `0x9e640a6aadf4f664CF467B795c31332f44AcBe6c` | +| TierProvider | `0x9AaBba3Ae6D4aC3F5487608Da81006454e7933d3` | +| TierRouter | `0x98d4FaD098526c4582063FA588C5e96229270366` | | SgxVerifier | `0x532EFBf6D62720D0B2a2Bb9d11066E8588cAE6D9` | +| Groth16Verifier | `0x5fd84014c62D5ea28D4533D5B1B48Ca44e571057` | +| Risc0Verifier | `0x4fEd801C5a876D4289e869cbEfA1E1A448b10714` | +| SP1Verifier | `0xFbE49f777E0078b3Fa0bae6de4794c88d6EA6DDD` | +| PlonkVerifier | `0xfb2d02219D065eBF3Aa8d2D1a1C52b1868EE7384` | | AutomataDcapAttestation | `0xC6cD3878Fc56F2b2BaB0769C580fc230A95e1398` | | PemCertChainLib | `0x08d7865e7F534d743Aba5874A9AD04bcB223a92E` | +| ProverSet | `0xD3f681bD6B49887A48cC9C9953720903967E9DC0` | +| ProverSetContester | `0x335103c4fa2F55451975082136F1478eCFeB84B9` | ## Taiko L2 (Hekla) contracts @@ -60,4 +72,4 @@ The owner has the ability to upgrade the contracts. ## Taiko Labs' bootnode addresses -Find the latest bootnodes here in [simple-taiko-node](https://github.com/taikoxyz/simple-taiko-node/blob/main/.env.sample). +Find the latest bootnodes here in [simple-taiko-node](https://github.com/taikoxyz/simple-taiko-node/blob/v1.7.0/.env.sample.hekla). diff --git a/packages/docs-site/src/content/docs/resources/developer-tools.mdx b/packages/docs-site/src/content/docs/resources/developer-tools.mdx index 69663291505..1e400817277 100644 --- a/packages/docs-site/src/content/docs/resources/developer-tools.mdx +++ b/packages/docs-site/src/content/docs/resources/developer-tools.mdx @@ -11,7 +11,12 @@ import { LinkCard, CardGrid } from "@astrojs/starlight/components"; + @@ -21,6 +26,41 @@ import { LinkCard, CardGrid } from "@astrojs/starlight/components"; + + +## Oracles + + + + + + +## Node Providers + + + + + +## Indexers + + + diff --git a/packages/docs-site/src/content/docs/resources/terminology.mdx b/packages/docs-site/src/content/docs/resources/terminology.mdx new file mode 100644 index 00000000000..3347e76ea8d --- /dev/null +++ b/packages/docs-site/src/content/docs/resources/terminology.mdx @@ -0,0 +1,22 @@ +--- +title: Terminology +description: Resource page detailing relevant rollup terminology that might need explaining. +--- + +This page is dedicated to explaining some terms relevant to the protocol that might be a bit hard to understand! + +## Bonding-related + +- **Liveness Bond**: The bond provided by a block's assigned prover, serving as a commitment to initially prove the first transition and to provide post-contest proofs within the corresponding proving window. + +- **Validity Bond**: The bond provided by the actual prover of a proof, signifying their commitment that the proof is indeed correct and that they are ready to withstand a contest. + +- **Contest Bond**: The bond provided by the contester. + +In layman's terms, the above terms relate to the protocol in the following manner: + +- A **Liveness Bond** is deposited when a prover gets assigned a block to prove (`proposeBlock` tx); when the block proof is provided within the proofWindow it gets debited to the prover. + +- A **Validity Bond** is deposited when a block proof is submitted (`proveBlock` tx), and the prover is ready to withstand a contest. If the proof gets verified (i.e. is not contested and is valid), the bond is returned to the prover. The prover can be different from the original assigned prover if the proof is outside the proofWindow, in which case the new prover has to provide the full validityBond amount. + +- A **Contest Bond** is someone putting up a bond to say that a block should be contested and a higher tier should handle this case. If the higher tier proof is incorrect then contestBond is forfeited. diff --git a/packages/docs-site/src/content/docs/start-here/contributing.md b/packages/docs-site/src/content/docs/start-here/contributing.md index 385d2898455..13d7d5b57b5 100644 --- a/packages/docs-site/src/content/docs/start-here/contributing.md +++ b/packages/docs-site/src/content/docs/start-here/contributing.md @@ -39,7 +39,7 @@ Before we can consider your contributions, please have a look at the following r - Any contribution must follow the standards documented in this file. - The scope must be larger than a simple rename, or typo fix. We kindly request that small, incremental updates be combined into more substantial pull requests. This approach will streamline our development and ensure focus on core improvements. -Specify the scope of your change with a [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/) in the PR title (for example, `feat(scope): description of feature`). This will be squashed and merged into the `main` branch. You can find the full list of allowed scopes [here](https://github.com/taikoxyz/taiko-mono/blob/main/.github/workflows/validate-pr-title.yml#L28). +Specify the scope of your change with a [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/) in the PR title (for example, `feat(scope): description of feature`). This will be squashed and merged into the `main` branch. You can find the full list of allowed scopes [here](https://github.com/taikoxyz/taiko-mono/blob/main/.github/workflows/repo--validate-pr-title.yml#L23). Because we squash all of the changes into a single commit, please try to keep the PR limited to the scope specified in the commit message. This commit message will end up in the automated changelog by checking which packages are affected by the commit. diff --git a/packages/docs-site/src/content/docs/core-concepts/block-states.mdx b/packages/docs-site/src/content/docs/taiko-protocol/block-states.mdx similarity index 74% rename from packages/docs-site/src/content/docs/core-concepts/block-states.mdx rename to packages/docs-site/src/content/docs/taiko-protocol/block-states.mdx index 1655172bd07..8ba4d50cefc 100644 --- a/packages/docs-site/src/content/docs/core-concepts/block-states.mdx +++ b/packages/docs-site/src/content/docs/taiko-protocol/block-states.mdx @@ -8,7 +8,7 @@ import { Code } from '@astrojs/starlight/components'; ## How can you determine when a Taiko block is `Safe` or `Finalized`? The `Safe` block state on Taiko is analogous to a `Safe` block state on Ethereum. -Every Taiko L2 block has a corresponding Ethereum L1 block as it's origin that can be queried through a [`taiko-geth API`](https://github.com/taikoxyz/taiko-geth/blob/caf87509fe0f53fc937a3f5cc26325a380a1744e/eth/taiko_api_backend.go#L50). +Every Taiko L2 block has a corresponding Ethereum L1 block as it's origin that can be queried through a [`taiko-geth API`](https://github.com/taikoxyz/taiko-geth/blob/v1.8.0/eth/taiko_api_backend.go#L50). When that Ethereum L1 block can be considered `Safe`, the corresponding Taiko L2 block can be considered to have reached the same block state. The `Finalized` block state is referred to as the [`Verified` block state](/core-concepts/multi-proofs#verified-blocks-and-parallel-proving) on Taiko. @@ -18,20 +18,20 @@ A Taiko block is `Finalized`/`Verified` when every state transition from genesis The above Taiko block with blockID `0x19a3c` would thus be considered `Safe` if the L1 block with the blockHash `0x419f..` reaches a `Safe` state. -The Taiko block with blockID `019a3c` would be `Finalized`/`Verified` if every state transition from genesis to the current block has a valid proof. +The Taiko block with blockID `0x19a3c` would be `Finalized`/`Verified` if every state transition from genesis to the current block has a valid proof. diff --git a/packages/docs-site/src/content/docs/core-concepts/bridging.md b/packages/docs-site/src/content/docs/taiko-protocol/bridging.md similarity index 61% rename from packages/docs-site/src/content/docs/core-concepts/bridging.md rename to packages/docs-site/src/content/docs/taiko-protocol/bridging.md index b6619138a2c..fe5926a6d67 100644 --- a/packages/docs-site/src/content/docs/core-concepts/bridging.md +++ b/packages/docs-site/src/content/docs/taiko-protocol/bridging.md @@ -19,10 +19,15 @@ The Taiko protocol's design, specifically its Ethereum-equivalence enables secur Taiko deploys two smart contracts which store the hashes of the other chain: -- TaikoL1 stores a blockNumber->blockHash mapping `l2Hashes` (deployed on Ethereum) -- TaikoL2 stores a blockNumber->blockHash mapping `l1Hashes` (deployed on Taiko) +- TaikoL1 stores the L2 world state root on L1 (deployed on Ethereum) +- TaikoL2 stores the L1 world state root on L2 (deployed on Taiko) -Every time an L2 block is created on Taiko, the hash of the enclosing block on L1 is stored in the TaikoL2 contract. And every time an L1 block is verified, the L2 hash is stored in the TaikoL1 contract (only the latest one, if multiple ones are verified at once). +Every time an L2 block is created on Taiko, the world state root of the enclosing block on L1 is stored in the [TaikoL2](https://github.com/taikoxyz/taiko-mono/blob/protocol-v1.9.0/packages/protocol/contracts/layer2/based/TaikoL2.sol#L145) contract using the `anchor` transaction. To ensure validity, it is part of the (previously the zk circuits, now SGX and ZK) proof data submitted with each block, so no fake L1 world state root can be synchronized to L2." + +The L2 world state root is stored in the TaikoL1 contract using the `syncChainData` function call in +[`LibVerifying`](https://github.com/taikoxyz/taiko-mono/blob/protocol-v1.9.0/packages/protocol/contracts/layer1/based/LibVerifying.sol#L179). + +Taiko by default synchronizes the world state roots cross-chain with the above mechanism. ### Merkle trees enable verifying values exist on the other chain @@ -30,26 +35,26 @@ Merkle trees are a data storage structure that allows a lot of data to be finger - The merkle root, this is the single "fingerprint" hash of the merkle tree - The value, this is the value we are checking is inside the merkle root -- A list of intermediate sibling hashes, these are the hashes that enable the verifier to re-calculate the merkle root +- A list of intermediate sibling hashes (sometimes called paths or proofs), these are the hashes that enable the verifier to re-calculate the merkle root -You can get the latest known merkle root stored on the destination chain by calling `getCrossChainBlockHash(0)` on the TaikoL1/TaikoL2 contract. You can get the value / message to verify and the sibling hashes for that latest known merkle root by asking for it with the standard RPC call `eth_getProof` on the "source chain". Then you just need to send them to be verified against that latest known block hash that is stored in a list on the "destination chain". +The `signalForChainData` function is used to store and retrieve chain data in the `SignalService` contract. This is a multi-purpose storage function, we can sync the state root or signal service storage roots as needed for each chain respectively. -A verifier will take the value (a leaf in the merkle tree) and the sibling hashes to re-calculate the merkle root. If the calculated merkle root matches the one that is stored in the destination chain's list of block hashes (the block hashes of the source chain), then we have proved that the message was sent on the source chain, assuming the source chain block hashes stored on the destination chain were correct. +A verifier will take the value (a leaf in the merkle tree) and the sibling hashes to re-calculate the merkle root. If the calculated merkle root matches the one that is stored in the destination chain’s list of block hashes (the block hashes of the source chain), then we have proved that the message was sent on the source chain, assuming the source chain block hashes stored on the destination chain were correct. ## The signal service -Taiko's signal service is a smart contract available on both L1 and L2, available for any dapp developer to use. It's what uses the previously mentioned merkle proofs to provide a service for secure cross-chain messaging. +Taiko's signal service is a smart contract available on both L1 and L2, for any dapp developer to use. It uses the previously mentioned merkle proofs to provide a service for secure cross-chain messaging. -You can store signals and check if a signal was sent from an address. It also exposes one more important function: `isSignalReceived`. +You can store signals and check if a signal was sent from an address. It also exposes an important function: `verifySignalReceived`. What does this function do? The first thing to understand is that the Taiko protocol maintains two important contracts: - `TaikoL1` - `TaikoL2` -These contracts both keep track of the block hashes on the **other chain**. So TaikoL1, which is deployed on Ethereum, has access to the latest block hashes on Taiko. And TaikoL2, which is deployed on Taiko, has access to the latest block hashes on Ethereum. +These contracts both keep track of the world state roots on the **other chain**. So TaikoL1, which is deployed on Ethereum, has access to the latest world state roots on Taiko. And TaikoL2, which is deployed on Taiko, has access to the latest world state roots on Ethereum. -So, `isSignalReceived` can prove on either chain that you sent a signal to the Signal Service on the other chain. A user or dapp can call `eth_getProof`(https://eips.ethereum.org/EIPS/eip-1186) which generates a merkle proof. +So, `verifySignalReceived` can prove on either chain that you sent a signal to the Signal Service on the other chain. A user or dapp can call `eth_getProof` which generates a merkle proof. You need to provide `eth_getProof` with: @@ -65,7 +70,7 @@ Let's walk through an example: 1. First, we can send a message on some source chain, and store it on the signal service. 2. Next, we call `eth_getProof`, which will give us a proof that we did indeed send a message on the source chain. -3. Finally, we call `isSignalReceived` on the destination chain's SignalService which essentially just verifies the merkle proof. `isSignalReceived` will look up the block hash you are asserting you had stored a message on the source chain (where you originally sent the message), and with the sibling hashes inside the merkle proof it will rebuild the merkle root, which verifies the signal was included in that merkle root—meaning it was sent. +3. Finally, we call `verifySignalReceived` on the destination chain's SignalService which essentially just verifies the merkle proof. `verifySignalReceived` will look up the block hash you are asserting you had stored a message on the source chain (where you originally sent the message), and with the sibling hashes inside the merkle proof it will rebuild the merkle root, which verifies the signal was included in that merkle root—meaning it was sent. And boom! We have sent a cross-chain message. If this is confusing, you can also find a simple dApp that was built during one of our workshops to demonstrate the fundamentals. You can find it [here](https://github.com/taikoxyz/MessageServiceShowCaseApp). @@ -75,8 +80,8 @@ The bridge is a set of smart contracts and a frontend web app that allow you to First, here is a flowchart of how our bridge dapp implementation works, which uses the signal service: -![bridging send message flowchart](~/assets/content/docs/core-concepts/bridging-send-message.excalidraw.png) \ -![bridging process message flowchart](~/assets/content/docs/core-concepts/bridging-process-message.excalidraw.png) +![bridging send message flowchart](~/assets/content/docs/taiko-protocol/bridging-source-chain.webp) +![bridging process message flowchart](~/assets/content/docs/taiko-protocol/bridging-dest-chain.webp) ### How does Ether bridging work? @@ -89,7 +94,7 @@ Taiko's bridge utilizes the Signal Service we described. Here is the general use With the current design there are 2 ways to bridge `Ether`: 1. `Ether` only case: The user interacts directly with the Bridge contract by calling `sendMessage` -2. `ERC-XXX` + `Ether` + case: The user interacts with the `ERCXXXVault` (ERC20, ERC721, ERC1155) because he/she wants to bridge over some tokens, but in case he/she fills the `message.value` field, also `Ether` will be bridged +2. `ERC-XXX` + `Ether` case: The user interacts with the `ERCXXXVault` (ERC20, ERC721, ERC1155) because they want to bridge over some tokens, but if they fill the `message.value` field, `Ether` will also be bridged ### How does ERC-20 (or ERC-721, ERC-1155) bridging work? @@ -100,18 +105,15 @@ ERC-20 tokens originate from a canonical chain. To send a token and bridge it to Here are the overall steps for transferring canonical ERC-20 (the overall process is identical for ERC-721, and ERC-1155 token types as well!) from a source chain to the destination chain: 1. A contract for the ERC-20 (or ERC-721, ERC-1155) must first be deployed on the destination chain (will be done automatically by the ERC20Vault if not already deployed) - 2. Call `sendToken` on the source chain ERC20Vault, this will **transfer** the amount by using the `safeTransferFrom` function on the canonical ERC-20 contract, on the source chain, to the ERC20Vault. - -3. The vault contract (via the Bridge) sends a message to the Signal Service (on the source chain), this message will contain some metadata related to the bridge request, but most importantly it includes the calldata for the `receiveToken` method. - -4. Process the message on the destination chain by submitting a merkle proof (generated from the source chain), proving that a message is included in the state of the source chain Signal Service. After verifying this occurred and doing some checks, it will attempt to invoke the `receiveToken` method encoded in the message. This will **mint** ERC-20 (or ERC-721, ERC-1155) on the BridgedERC20 contract to the `to` address on the destination chain! +3. The vault contract (via the Bridge) sends a message to the Signal Service (on the source chain), this message will contain some metadata related to the bridge request, but most importantly it includes the calldata for the `onMessageInvocation()` method. +4. Process the message on the destination chain by submitting a merkle proof (generated from the source chain), proving that a message is included in the state of the source chain Signal Service. After verifying this occurred and doing some checks, it will attempt to invoke the `onMessageInvocation()` method encoded in the message. This will **mint** ERC-20 (or ERC-721, ERC-1155) on the BridgedERC20 contract to the `to` address on the destination chain! #### Bridge from destination chain back to the canonical chain -Okay now let's do the reverse, how do we transfer a bridged token from a source chain to the destination chain? (Destination chain in this case is the canonical chain, where the original token lives.) +Okay now let’s do the reverse, how do we transfer a bridged token from a source chain to the destination chain? (Destination chain in this case is the canonical chain, where the original token lives.) 1. A contract for the ERC-20 (or ERC-721, ERC-1155) already exists on the canonical chain, so no need to deploy a new one. 2. Call `sendToken` on the source chain token vault contract, this will **burn** the ERC-20 on the BridgedERC20 contract. -3. The vault contract (via the Bridge) sends a message to the Signal Service (on the source chain), this message will contain some metadata related to the bridge request, but most importantly it includes the calldata for the `receiveToken` method. -4. Process the message on the destination chain by submitting a merkle proof (generated from the source chain), proving that a message is included in the state of the source chain Signal Service. After verifying this occurred and doing some checks, it will attempt to invoke the `receiveToken` method encoded in this message. This will **transfer** the amount from the destination chain TokenVault to the `to` address on the destination chain. +3. The vault contract (via the Bridge) sends a message to the Signal Service (on the source chain), this message will contain some metadata related to the bridge request, but most importantly it includes the calldata for the `onMessageInvocation()` method. +4. Process the message on the destination chain by submitting a merkle proof (generated from the source chain), proving that a message is included in the state of the source chain SignalService. After verifying this occurred and doing some checks, it will attempt to invoke the `onMessageInvocation()` method encoded in this message. This will transfer the amount from the destination chain TokenVault to the `to` address on the destination chain. diff --git a/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/sgxverifier-contract.md b/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/sgxverifier-contract.md new file mode 100644 index 00000000000..3f9c832fb4d --- /dev/null +++ b/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/sgxverifier-contract.md @@ -0,0 +1,108 @@ +--- +title: SGXVerifier +description: Taiko protocol page for "SGXVerifier.sol". +--- + +The `SGXVerifier` smart contract implements SGX (Software Guard Extensions) signature proof verification on-chain. This verification ensures integrity and security of rollup state transitions by validating SGX-generated signatures. It also enables management and tracking of SGX instances through registration and replacement. + +--- + +## Core Purpose + +1. **Instance Registry**: + +- Each SGX instance is uniquely identified by its Ethereum address (derived from an ECDSA public-private key pair generated in the SGX enclave). +- The registry ensures: + - Only valid instances are allowed. + - Instances are valid for a predefined duration (`INSTANCE_EXPIRY`). + +2. **Instance Lifecycle**: + +- **Addition**: SGX instances can be added via the `addInstances` function or the `registerInstance` method (following attestation verification). +- **Replacement**: Old SGX instances can be replaced with new ones to maintain security. +- **Deletion**: Instances can be removed using the `deleteInstances` function. + +--- + +## Key Functions + +### `addInstances` + +- **Purpose**: Adds new SGX instances to the registry. +- **Input**: + - `_instances`: Array of Ethereum addresses corresponding to the SGX instances. +- **Output**: Returns an array of assigned instance IDs. +- **Access Control**: Restricted to the owner. + +--- + +### `deleteInstances` + +- **Purpose**: Removes SGX instances from the registry. +- **Input**: + - `_ids`: Array of instance IDs to be removed. +- **Access Control**: Restricted to the owner or the `SGX_WATCHDOG` role. + +--- + +### `registerInstance` + +- **Purpose**: Registers an SGX instance by verifying its attestation off-chain and adding it to the registry. +- **Input**: + - `_attestation`: Parsed attestation quote containing SGX enclave report details. +- **Output**: Returns the assigned instance ID. +- **Access Control**: Open to external calls. + +--- + +### `verifyProof` + +- **Purpose**: Validates the SGX signature proof for a single block state transition. +- **Input**: + - `_ctx`: Context of the proof. + - `_tran`: Transition data. + - `_proof`: SGX signature proof. +- **Mechanism**: + - Validates the instance ID and signature. + - Ensures the SGX instance is valid and replaces it if needed. + +--- + +### `verifyBatchProof` + +- **Purpose**: Validates SGX signature proofs for multiple block state transitions in a batch. +- **Input**: + - `_ctxs`: Array of contexts for the batch. + - `_proof`: SGX batch signature proof. +- **Mechanism**: + - Verifies the signature against public inputs for all blocks. + - Replaces the SGX instance if necessary. + +--- + +## Key Events + +1. **`InstanceAdded`**: + +- Emitted when a new SGX instance is added or an old instance is replaced. +- Parameters: + - `id`: ID of the SGX instance. + - `instance`: Address of the new SGX instance. + - `replaced`: Address of the replaced instance (if any). + - `validSince`: Timestamp indicating when the instance became valid. + +2. **`InstanceDeleted`**: + +- Emitted when an SGX instance is removed from the registry. +- Parameters: + - `id`: ID of the SGX instance. + - `instance`: Address of the removed instance. + +--- + +## Constants + +1. **`INSTANCE_EXPIRY`**: Duration (365 days) for which an SGX instance remains valid. +2. **`INSTANCE_VALIDITY_DELAY`**: Delay before an SGX instance becomes valid after registration. + +--- diff --git a/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol1-contract.md b/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol1-contract.md new file mode 100644 index 00000000000..3f1472fdbee --- /dev/null +++ b/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol1-contract.md @@ -0,0 +1,143 @@ +--- +title: TaikoL1 +description: Taiko protocol page for "TaikoL1.sol". +--- + +[TaikoL1](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/contracts/layer1/based/TaikoL1.sol) is a smart contract that serves as the **base layer** of the Taiko protocol. It provides functionalities for **proposing, proving, and verifying blocks**, enabling the rollup's consensus and state transitions. The contract also supports **bond deposits and withdrawals** and manages state synchronization between L1 and L2. + +--- + +## Core Purpose + +1. **Block Lifecycle Management** + Manages the proposal, proof, and verification of Taiko blocks, ensuring consistent state transitions. + +2. **Cross-Layer Synchronization** + Ensures the synchronization of states between Layer 1 (L1) and Layer 2 (L2). + +3. **Bond Management** + Handles the deposit and withdrawal of bonds to incentivize proposers and ensure accountability. + +4. **Base Layer Scalability** + Enables the deployment on L2 to create L3 rollups, expanding Taiko's scalability. + +--- + +## Key Functions + +### `proposeBlockV2` + +- **Purpose:** + Proposes a single block for inclusion in the rollup. + +- **Parameters:** + + - `_params`: Encoded block parameters. + - `_txList`: Transactions to include in the block. + +- **Returns:** + `TaikoData.BlockMetadataV2` containing metadata of the proposed block. + +--- + +### `proposeBlocksV2` + +- **Purpose:** + Proposes multiple blocks in batch. + +- **Parameters:** + + - `_paramsArr`: Array of encoded block parameters. + - `_txListArr`: Arrays of transactions for each block. + +- **Returns:** + Array of `TaikoData.BlockMetadataV2` for all proposed blocks. + +--- + +### `proveBlock` + +- **Purpose:** + Proves the validity of a single block. + +- **Parameters:** + - `_blockId`: ID of the block to be proven. + - `_input`: Encoded proof data. + +--- + +### `proveBlocks` + +- **Purpose:** + Proves multiple blocks in a single call. + +- **Parameters:** + - `_blockIds`: IDs of the blocks to be proven. + - `_inputs`: Proofs for each block. + - `_batchProof`: Batch proof covering all blocks. + +--- + +### `verifyBlocks` + +- **Purpose:** + Verifies a batch of blocks after proofs are submitted. + +- **Parameters:** + - `_maxBlocksToVerify`: Maximum number of blocks to verify. + +--- + +### `depositBond` + +- **Purpose:** + Deposits a bond required for proposing blocks. + +- **Parameters:** + - `_amount`: Amount of bond to deposit. + +--- + +### `withdrawBond` + +- **Purpose:** + Withdraws bond deposits after successful proposals. + +- **Parameters:** + - `_amount`: Amount of bond to withdraw. + +--- + +### `getLastVerifiedBlock` + +- **Purpose:** + Retrieves the details of the most recently verified block. + +- **Returns:** + - `blockId_`: ID of the last verified block. + - `blockHash_`: Block hash of the verified block. + - `stateRoot_`: State root of the verified block. + - `verifiedAt_`: Timestamp when the block was verified. + +--- + +## Key Events + +1. **`StateVariablesUpdated`** + Signals updates to the state variables. + +--- + +## Important Data Structures + +1. **`state`**: + Tracks the rollup state, including blocks, bonds, and configurations. + +2. **`__gap`**: + Reserved storage for future upgrades. + +--- + +## Design Highlights + +--- diff --git a/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol2-contract.md b/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol2-contract.md new file mode 100644 index 00000000000..cac45ed4a95 --- /dev/null +++ b/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol2-contract.md @@ -0,0 +1,116 @@ +--- +title: TaikoL2 +description: Taiko protocol page for "TaikoL2.sol". +--- + +[TaikoL2](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/contracts/layer2/based/TaikoL2.sol) is a smart contract that handles cross-layer message verification and manages EIP-1559 gas pricing for Taiko operations. It is used to anchor the latest L1 block details to L2 for cross-layer communication, manage EIP-1559 parameters for gas pricing, and store verified L1 block information. + +--- + +## Core Purpose + +1. **Anchor:** + Due to Taiko's **based rollup** nature, each L2 block requires anchoring to the latest L1 block details. The first transaction of every block must perform this anchor, or all calls will revert with `L2_PUBLIC_INPUT_HASH_MISMATCH`. + +2. **Gas Pricing:** + The contract calculates **EIP-1559 base fee** and updates gas parameters dynamically for optimal gas pricing using key inputs such as `_parentGasUsed` and `_baseFeeConfig`. + +3. **State Synchronization:** + The contract ensures L2 remains in sync with L1 by storing verified block information and updating state data like block hashes and timestamps. + +4. **Bridging Support:** + It plays a crucial role in **L1-L2 bridging**, anchoring state roots to enable secure and efficient communication between layers. For more, visit the [Bridging page](/taiko-protocol/bridging). + +--- + +## Key Functions + +### `anchorV2` + +- **Purpose:** + Anchors the latest L1 block details to L2, enabling **cross-layer message verification**. + +- **Parameters:** + + - `_anchorBlockId`: The L1 block ID to anchor. + - `_anchorStateRoot`: State root of the specified L1 block. + - `_parentGasUsed`: Gas usage in the parent block. + - `_baseFeeConfig`: Configuration for base fee calculation. + +- **Mechanism:** + Verifies and updates the `publicInputHash`, calculates the base fee and gas excess using `getBasefeeV2`, and synchronizes chain data. + +--- + +### `getBasefeeV2` + +- **Purpose:** + Computes the **EIP-1559 base fee** and updates gas parameters like **gas excess** and **gas target**. + +- **Parameters:** + + - `_parentGasUsed`: Gas used in the parent block. + - `_baseFeeConfig`: Configuration for EIP-1559 calculations. + +- **Returns:** + + - `basefee_`: Calculated base fee per gas. + - `newGasTarget_`: Updated gas target. + - `newGasExcess_`: Updated gas excess. + +- **Technical Details:** + Uses `LibEIP1559.calc1559BaseFee` and `LibEIP1559.adjustExcess` for precise gas pricing dynamics. + +--- + +### `getBlockHash` + +- **Purpose:** + Fetches the block hash for a specified block ID. + +- **Technical Note:** + If the block ID is too old (not in the last 256 blocks), it uses an internal mapping (`_blockhashes`) to retrieve stored hashes. + +--- + +## Key Events + +1. **`Anchored`** + Emitted when L1 block details are successfully anchored to L2. + + **Parameters:** + + - `parentHash`: Hash of the parent block. + - `parentGasExcess`: Gas excess for base fee calculation. +

+ +2. **`EIP1559Update`** + Emitted when gas parameters (e.g., target, excess, base fee) are updated. + + **Parameters:** + + - `oldGasTarget`: Previous gas target. + - `newGasTarget`: Updated gas target. + - `oldGasExcess`: Previous gas excess. + - `newGasExcess`: Updated gas excess. + - `basefee`: Calculated base fee. + +--- + +## Important Data Structures + +### State Variables + +1. **`publicInputHash`**: + Validates the integrity of public inputs for block verification. + +2. **`parentGasExcess`**: + Tracks gas usage exceeding the target for dynamic base fee adjustment. + +3. **`lastSyncedBlock`**: + Stores the ID of the most recent L1 block synced with L2. + +4. **`l1ChainId`**: + Chain ID of the base layer (L1). + +--- diff --git a/packages/docs-site/src/content/docs/taiko-protocol/economics.md b/packages/docs-site/src/content/docs/taiko-protocol/economics.md new file mode 100644 index 00000000000..6f9187386c9 --- /dev/null +++ b/packages/docs-site/src/content/docs/taiko-protocol/economics.md @@ -0,0 +1,15 @@ +--- +title: Economics +description: Core concept page for "Economics". +--- + + +## taiko-economics + +Thanks to its based and multi-proof structure, Taiko has a unique economic cycle. + +This diagram illustrates Taiko's fee distribution mechanism. When users submit transactions on Taiko L2, they pay fees that are split into two components: a priority tip and a base fee. The priority tip goes to the L2 block proposer, who builds and proposes new blocks. The base fee is split between Taiko DAO Treasury (25%) and the L2 block proposer (75%). L2 block proposers have to pay two fees: L1 fee to the TaikoL1 contract on Ethereum to call `proposeBlock` function and a prover fee to the block prover. Block provers incur proof generation costs while proving the correctness of proposed blocks. + +For the current amount of the validity/contest bond on mainnet, please see [network configuration](/network-reference/network-configuration) page. + +![Economics](~/assets/content/docs/taiko-protocol/based-economics.png) diff --git a/packages/docs-site/src/content/docs/core-concepts/taiko-nodes.md b/packages/docs-site/src/content/docs/taiko-protocol/taiko-nodes.md similarity index 93% rename from packages/docs-site/src/content/docs/core-concepts/taiko-nodes.md rename to packages/docs-site/src/content/docs/taiko-protocol/taiko-nodes.md index 6a36216f0ec..1db1eb3b197 100644 --- a/packages/docs-site/src/content/docs/core-concepts/taiko-nodes.md +++ b/packages/docs-site/src/content/docs/taiko-protocol/taiko-nodes.md @@ -10,7 +10,7 @@ Taiko nodes are minimally modified Ethereum [execution clients](https://ethereum You can think of it like an Ethereum mainnet node, except replacing the consensus client with `taiko-client`. `taiko-client` then drives `taiko-geth` over the [Engine API](https://github.com/ethereum/execution-apis/tree/main/src/engine). This is a modular design that allows easily plugging in other execution clients. -![Taiko nodes diagram](~/assets/content/docs/core-concepts/taiko-nodes.png) +![Taiko nodes diagram](~/assets/content/docs/taiko-protocol/taiko-nodes.png) ## taiko-geth @@ -22,7 +22,7 @@ You can see all the changes made in the `taiko-geth` fork at [geth.taiko.xyz](ht ## taiko-client -The [taiko-client](https://github.com/taikoxyz/taiko-client) software replaces the consensus client piece of an Ethereum mainnet node. It connects to `taiko-geth`, and the compiled binary includes three sub-commands: +The [taiko-client](https://github.com/taikoxyz/taiko-mono/tree/main/packages/taiko-client) software replaces the consensus client piece of an Ethereum mainnet node. It connects to `taiko-geth`, and the compiled binary includes three sub-commands: ### `driver` @@ -89,7 +89,7 @@ If the proposed block has a **valid** or **invalid** `txList`, the `prover`: ## Taiko Node API -Using a Taiko node should feel the same as using any other L1 node, because we essentially re-use the L1 client and make a few backwards-compatible modifications. You can first read about the architecture of Taiko nodes [here](/core-concepts/taiko-nodes). +Using a Taiko node should feel the same as using any other L1 node, because we essentially re-use the L1 client and make a few backwards-compatible modifications. ### Differences from a Geth client diff --git a/packages/eventindexer/.gitignore b/packages/eventindexer/.gitignore index 9dbce223f63..af36bba2839 100644 --- a/packages/eventindexer/.gitignore +++ b/packages/eventindexer/.gitignore @@ -41,7 +41,8 @@ terraform.rc .idea -Bridge.json -TaikoL2.json -IHeaderSync.json -AssignmentHook.json \ No newline at end of file +# Ignore binary file +eventindexer + +# Ignore abi files +contracts/**/*.json diff --git a/packages/eventindexer/.golangci.yml b/packages/eventindexer/.golangci.yml index 4d07f36217d..f8f1767ce33 100644 --- a/packages/eventindexer/.golangci.yml +++ b/packages/eventindexer/.golangci.yml @@ -9,7 +9,7 @@ # ], output: - format: colored-line-number + formats: colored-line-number linters: enable: @@ -19,7 +19,6 @@ linters: - gocritic - gofmt # - revive - - gosec - gosimple - lll - unused diff --git a/packages/eventindexer/.l2.env b/packages/eventindexer/.l2.env index 983f2ac3069..c48d34537b3 100644 --- a/packages/eventindexer/.l2.env +++ b/packages/eventindexer/.l2.env @@ -1,15 +1,15 @@ HTTP_PORT=4009 METRICS_HTTP_PORT=6067 -DATABASE_USER= -DATABASE_PASSWORD= +DATABASE_USER=root +DATABASE_PASSWORD=root DATABASE_NAME=eventindexer DATABASE_HOST=localhost:3306 DATABASE_MAX_IDLE_CONNS=50 DATABASE_MAX_OPEN_CONNS=3000 DATABASE_CONN_MAX_LIFETIME_IN_MS=100000 -RPC_URL=wss://ws.katla.taiko.xyz +RPC_URL=wss://ws.mainnet.taiko.xyz CORS_ORIGINS=* BLOCK_BATCH_SIZE=50 CACHE_INTERVAL_IN_SECONDS=60 LAYER=l2 -INDEX_NFTS=true +INDEX_ERC20S=true diff --git a/packages/eventindexer/.swaggo b/packages/eventindexer/.swaggo new file mode 100644 index 00000000000..0b3f2a25004 --- /dev/null +++ b/packages/eventindexer/.swaggo @@ -0,0 +1,3 @@ +replace json.RawMessage string +replace sql.NullInt64 uint64 +replace sql.NullInt16 uint16 \ No newline at end of file diff --git a/packages/guardian-prover-health-check/GuardianProver.json b/packages/eventindexer/AssignmentHook.json similarity index 73% rename from packages/guardian-prover-health-check/GuardianProver.json rename to packages/eventindexer/AssignmentHook.json index 9e25400fb01..b7b29927cb6 100644 --- a/packages/guardian-prover-health-check/GuardianProver.json +++ b/packages/eventindexer/AssignmentHook.json @@ -1,4 +1,17 @@ [ + { + "type": "function", + "name": "MAX_GAS_PAYING_PROVER", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "acceptOwnership", @@ -21,186 +34,93 @@ }, { "type": "function", - "name": "approve", + "name": "hashAssignment", "inputs": [ { - "name": "_meta", + "name": "_assignment", "type": "tuple", - "internalType": "struct TaikoData.BlockMetadata", + "internalType": "struct AssignmentHook.ProverAssignment", "components": [ { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "coinbase", + "name": "feeToken", "type": "address", "internalType": "address" }, { - "name": "id", + "name": "expiry", "type": "uint64", "internalType": "uint64" }, { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "timestamp", + "name": "maxBlockId", "type": "uint64", "internalType": "uint64" }, { - "name": "l1Height", + "name": "maxProposedIn", "type": "uint64", "internalType": "uint64" }, { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" - }, - { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "internalType": "address" - } - ] - }, - { - "name": "_tran", - "type": "tuple", - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", + "name": "metaHash", "type": "bytes32", "internalType": "bytes32" }, { - "name": "blockHash", + "name": "parentMetaHash", "type": "bytes32", "internalType": "bytes32" }, { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" + "name": "tierFees", + "type": "tuple[]", + "internalType": "struct TaikoData.TierFee[]", + "components": [ + { + "name": "tier", + "type": "uint16", + "internalType": "uint16" + }, + { + "name": "fee", + "type": "uint128", + "internalType": "uint128" + } + ] }, { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "_proof", - "type": "tuple", - "internalType": "struct TaikoData.TierProof", - "components": [ - { - "name": "tier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "data", + "name": "signature", "type": "bytes", "internalType": "bytes" } ] - } - ], - "outputs": [ - { - "name": "approved_", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "enableTaikoTokenAllowance", - "inputs": [ + }, { - "name": "_enable", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "guardianIds", - "inputs": [ + "name": "_taikoL1Address", + "type": "address", + "internalType": "address" + }, { - "name": "guardian", + "name": "_blockProposer", "type": "address", "internalType": "address" - } - ], - "outputs": [ + }, { - "name": "id", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "guardians", - "inputs": [ + "name": "_assignedProver", + "type": "address", + "internalType": "address" + }, { - "name": "", - "type": "uint256", - "internalType": "uint256" + "name": "_blobHash", + "type": "bytes32", + "internalType": "bytes32" } ], "outputs": [ { "name": "", - "type": "address", - "internalType": "address" + "type": "bytes32", + "internalType": "bytes32" } ], "stateMutability": "view" @@ -249,25 +169,6 @@ "outputs": [], "stateMutability": "nonpayable" }, - { - "type": "function", - "name": "isApproved", - "inputs": [ - { - "name": "_hash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "lastUnpausedAt", @@ -283,29 +184,140 @@ }, { "type": "function", - "name": "minGuardians", - "inputs": [], - "outputs": [ + "name": "onBlockProposed", + "inputs": [ { - "name": "", - "type": "uint32", - "internalType": "uint32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "numGuardians", - "inputs": [], - "outputs": [ + "name": "_blk", + "type": "tuple", + "internalType": "struct TaikoData.Block", + "components": [ + { + "name": "metaHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "assignedProver", + "type": "address", + "internalType": "address" + }, + { + "name": "livenessBond", + "type": "uint96", + "internalType": "uint96" + }, + { + "name": "blockId", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "proposedAt", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "proposedIn", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nextTransitionId", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "verifiedTransitionId", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "name": "_meta", + "type": "tuple", + "internalType": "struct TaikoData.BlockMetadata", + "components": [ + { + "name": "l1Hash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "difficulty", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blobHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "extraData", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "depositsHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "coinbase", + "type": "address", + "internalType": "address" + }, + { + "name": "id", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "timestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "l1Height", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "minTier", + "type": "uint16", + "internalType": "uint16" + }, + { + "name": "blobUsed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "parentMetaHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "sender", + "type": "address", + "internalType": "address" + } + ] + }, { - "name": "", - "type": "uint256", - "internalType": "uint256" + "name": "_data", + "type": "bytes", + "internalType": "bytes" } ], - "stateMutability": "view" + "outputs": [], + "stateMutability": "payable" }, { "type": "function", @@ -426,24 +438,6 @@ ], "stateMutability": "view" }, - { - "type": "function", - "name": "setGuardians", - "inputs": [ - { - "name": "_newGuardians", - "type": "address[]", - "internalType": "address[]" - }, - { - "name": "_minGuardians", - "type": "uint8", - "internalType": "uint8" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, { "type": "function", "name": "transferOwnership", @@ -496,16 +490,60 @@ "stateMutability": "payable" }, { - "type": "function", - "name": "verifyProof", + "type": "event", + "name": "AdminChanged", + "inputs": [ + { + "name": "previousAdmin", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "newAdmin", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "BeaconUpgraded", + "inputs": [ + { + "name": "beacon", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "BlockAssigned", "inputs": [ { - "name": "_ctx", + "name": "assignedProver", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "meta", "type": "tuple", - "internalType": "struct IVerifier.Context", + "indexed": false, + "internalType": "struct TaikoData.BlockMetadata", "components": [ { - "name": "metaHash", + "name": "l1Hash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "difficulty", "type": "bytes32", "internalType": "bytes32" }, @@ -515,19 +553,44 @@ "internalType": "bytes32" }, { - "name": "prover", + "name": "extraData", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "depositsHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "coinbase", "type": "address", "internalType": "address" }, { - "name": "blockId", + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "isContesting", - "type": "bool", - "internalType": "bool" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "timestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "l1Height", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "minTier", + "type": "uint16", + "internalType": "uint16" }, { "name": "blobUsed", @@ -535,200 +598,95 @@ "internalType": "bool" }, { - "name": "msgSender", + "name": "parentMetaHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "sender", "type": "address", "internalType": "address" } ] }, { - "name": "", + "name": "assignment", "type": "tuple", - "internalType": "struct TaikoData.Transition", + "indexed": false, + "internalType": "struct AssignmentHook.ProverAssignment", "components": [ { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "feeToken", + "type": "address", + "internalType": "address" }, { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "expiry", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "maxBlockId", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "maxProposedIn", + "type": "uint64", + "internalType": "uint64" }, { - "name": "stateRoot", + "name": "metaHash", "type": "bytes32", "internalType": "bytes32" }, { - "name": "graffiti", + "name": "parentMetaHash", "type": "bytes32", "internalType": "bytes32" - } - ] - }, - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.TierProof", - "components": [ + }, { - "name": "tier", - "type": "uint16", - "internalType": "uint16" + "name": "tierFees", + "type": "tuple[]", + "internalType": "struct TaikoData.TierFee[]", + "components": [ + { + "name": "tier", + "type": "uint16", + "internalType": "uint16" + }, + { + "name": "fee", + "type": "uint128", + "internalType": "uint128" + } + ] }, { - "name": "data", + "name": "signature", "type": "bytes", "internalType": "bytes" } ] } ], - "outputs": [], - "stateMutability": "view" - }, - { - "type": "function", - "name": "version", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint32", - "internalType": "uint32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "withdrawTaikoToken", - "inputs": [ - { - "name": "_to", - "type": "address", - "internalType": "address" - }, - { - "name": "_amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" + "anonymous": false }, { "type": "event", - "name": "AdminChanged", + "name": "EtherPaymentFailed", "inputs": [ { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", + "name": "to", "type": "address", "indexed": false, "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Approved", - "inputs": [ - { - "name": "operationId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" }, { - "name": "approvalBits", + "name": "maxGas", "type": "uint256", "indexed": false, "internalType": "uint256" - }, - { - "name": "minGuardiansReached", - "type": "bool", - "indexed": false, - "internalType": "bool" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "GuardianApproval", - "inputs": [ - { - "name": "addr", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "blockHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "approved", - "type": "bool", - "indexed": false, - "internalType": "bool" - }, - { - "name": "proofData", - "type": "bytes", - "indexed": false, - "internalType": "bytes" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "GuardiansUpdated", - "inputs": [ - { - "name": "version", - "type": "uint32", - "indexed": false, - "internalType": "uint32" - }, - { - "name": "guardians", - "type": "address[]", - "indexed": false, - "internalType": "address[]" } ], "anonymous": false @@ -825,32 +783,27 @@ }, { "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "GP_INVALID_GUARDIAN", + "name": "ETH_TRANSFER_FAILED", "inputs": [] }, { "type": "error", - "name": "GP_INVALID_GUARDIAN_SET", + "name": "FUNC_NOT_IMPLEMENTED", "inputs": [] }, { "type": "error", - "name": "GP_INVALID_MIN_GUARDIANS", + "name": "HOOK_ASSIGNMENT_EXPIRED", "inputs": [] }, { "type": "error", - "name": "GV_PERMISSION_DENIED", + "name": "HOOK_ASSIGNMENT_INVALID_SIG", "inputs": [] }, { "type": "error", - "name": "GV_ZERO_ADDRESS", + "name": "HOOK_TIER_NOT_FOUND", "inputs": [] }, { diff --git a/packages/relayer/TaikoL1.json b/packages/eventindexer/Bridge.json similarity index 50% rename from packages/relayer/TaikoL1.json rename to packages/eventindexer/Bridge.json index d84c004bf37..3b85df5ac36 100644 --- a/packages/relayer/TaikoL1.json +++ b/packages/eventindexer/Bridge.json @@ -1,7 +1,42 @@ [ { - "type": "receive", - "stateMutability": "payable" + "type": "function", + "name": "GAS_OVERHEAD", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "GAS_RESERVE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "RELAYER_MAX_PROOF_BYTES", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" }, { "type": "function", @@ -25,59 +60,28 @@ }, { "type": "function", - "name": "getBlock", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - } - ], + "name": "context", + "inputs": [], "outputs": [ { - "name": "blk_", + "name": "ctx_", "type": "tuple", - "internalType": "struct TaikoData.Block", + "internalType": "struct IBridge.Context", "components": [ { - "name": "metaHash", + "name": "msgHash", "type": "bytes32", "internalType": "bytes32" }, { - "name": "assignedProver", + "name": "from", "type": "address", "internalType": "address" }, { - "name": "livenessBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "proposedAt", + "name": "srcChainId", "type": "uint64", "internalType": "uint64" - }, - { - "name": "proposedIn", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "nextTransitionId", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "verifiedTransitionId", - "type": "uint32", - "internalType": "uint32" } ] } @@ -86,282 +90,168 @@ }, { "type": "function", - "name": "getConfig", - "inputs": [], - "outputs": [ + "name": "failMessage", + "inputs": [ { - "name": "", + "name": "_message", "type": "tuple", - "internalType": "struct TaikoData.Config", + "internalType": "struct IBridge.Message", "components": [ { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockMaxProposals", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockRingBufferSize", + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "maxBlocksToVerifyPerProposal", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "blockMaxGasLimit", + "name": "gasLimit", "type": "uint32", "internalType": "uint32" }, { - "name": "livenessBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "blockSyncThreshold", - "type": "uint8", - "internalType": "uint8" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getStateVariables", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotA", - "components": [ - { - "name": "genesisHeight", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "genesisTimestamp", - "type": "uint64", - "internalType": "uint64" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "lastSyncedBlockId", + "name": "srcChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "lastSynecdAt", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotB", - "components": [ - { - "name": "numBlocks", - "type": "uint64", - "internalType": "uint64" + "name": "srcOwner", + "type": "address", + "internalType": "address" }, { - "name": "lastVerifiedBlockId", + "name": "destChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" - }, - { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" + "name": "destOwner", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" + "name": "to", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" + "name": "value", + "type": "uint256", + "internalType": "uint256" }, { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] } ], - "stateMutability": "view" + "outputs": [], + "stateMutability": "nonpayable" }, { "type": "function", - "name": "getTransition", + "name": "getMessageMinGasLimit", "inputs": [ { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, + "name": "dataLength", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ { - "name": "_tid", + "name": "", "type": "uint32", "internalType": "uint32" } ], - "outputs": [ + "stateMutability": "pure" + }, + { + "type": "function", + "name": "hashMessage", + "inputs": [ { - "name": "", + "name": "_message", "type": "tuple", - "internalType": "struct TaikoData.TransitionState", + "internalType": "struct IBridge.Message", "components": [ { - "name": "key", - "type": "bytes32", - "internalType": "bytes32" + "name": "id", + "type": "uint64", + "internalType": "uint64" }, { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "fee", + "type": "uint64", + "internalType": "uint64" }, { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "prover", + "name": "from", "type": "address", "internalType": "address" }, { - "name": "validityBond", - "type": "uint96", - "internalType": "uint96" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "contester", + "name": "srcOwner", "type": "address", "internalType": "address" }, { - "name": "contestBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "timestamp", + "name": "destChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "tier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reserved1", - "type": "uint8", - "internalType": "uint8" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getTransition", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_parentHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.TransitionState", - "components": [ - { - "name": "key", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "prover", + "name": "destOwner", "type": "address", "internalType": "address" }, { - "name": "validityBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "contester", + "name": "to", "type": "address", "internalType": "address" }, { - "name": "contestBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "tier", - "type": "uint16", - "internalType": "uint16" + "name": "value", + "type": "uint256", + "internalType": "uint256" }, { - "name": "__reserved1", - "type": "uint8", - "internalType": "uint8" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] } ], - "stateMutability": "view" + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "pure" }, { "type": "function", @@ -402,16 +292,6 @@ "name": "_addressManager", "type": "address", "internalType": "address" - }, - { - "name": "_genesisBlockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_toPause", - "type": "bool", - "internalType": "bool" } ], "outputs": [], @@ -426,24 +306,22 @@ }, { "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ + "name": "isDestChainEnabled", + "inputs": [ { - "name": "", + "name": "_chainId", "type": "uint64", "internalType": "uint64" } ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], "outputs": [ { - "name": "", + "name": "enabled_", + "type": "bool", + "internalType": "bool" + }, + { + "name": "destBridge_", "type": "address", "internalType": "address" } @@ -452,447 +330,502 @@ }, { "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "pauseProving", + "name": "isMessageFailed", "inputs": [ { - "name": "_pause", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ + "name": "_message", + "type": "tuple", + "internalType": "struct IBridge.Message", + "components": [ + { + "name": "id", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "fee", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "srcOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "destChainId", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "destOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + }, { - "name": "", - "type": "bool", - "internalType": "bool" + "name": "_proof", + "type": "bytes", + "internalType": "bytes" } ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], "outputs": [ { "name": "", - "type": "address", - "internalType": "address" + "type": "bool", + "internalType": "bool" } ], "stateMutability": "view" }, { "type": "function", - "name": "proposeBlock", + "name": "isMessageReceived", "inputs": [ { - "name": "_params", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "_txList", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "meta_", + "name": "_message", "type": "tuple", - "internalType": "struct TaikoData.BlockMetadata", + "internalType": "struct IBridge.Message", "components": [ { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" + "name": "id", + "type": "uint64", + "internalType": "uint64" }, { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" + "name": "fee", + "type": "uint64", + "internalType": "uint64" }, { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "coinbase", + "name": "srcOwner", "type": "address", "internalType": "address" }, { - "name": "id", + "name": "destChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" + "name": "destOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" }, { - "name": "timestamp", + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "_proof", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isMessageSent", + "inputs": [ + { + "name": "_message", + "type": "tuple", + "internalType": "struct IBridge.Message", + "components": [ + { + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "l1Height", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "sender", + "name": "srcOwner", "type": "address", "internalType": "address" - } - ] - }, - { - "name": "deposits_", - "type": "tuple[]", - "internalType": "struct TaikoData.EthDeposit[]", - "components": [ + }, + { + "name": "destChainId", + "type": "uint64", + "internalType": "uint64" + }, { - "name": "recipient", + "name": "destOwner", "type": "address", "internalType": "address" }, { - "name": "amount", - "type": "uint96", - "internalType": "uint96" + "name": "to", + "type": "address", + "internalType": "address" }, { - "name": "id", - "type": "uint64", - "internalType": "uint64" + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] } ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "proveBlock", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, + "outputs": [ { - "name": "_input", - "type": "bytes", - "internalType": "bytes" + "name": "", + "type": "bool", + "internalType": "bool" } ], - "outputs": [], - "stateMutability": "nonpayable" + "stateMutability": "view" }, { "type": "function", - "name": "proxiableUUID", + "name": "lastUnpausedAt", "inputs": [], "outputs": [ { "name": "", - "type": "bytes32", - "internalType": "bytes32" + "type": "uint64", + "internalType": "uint64" } ], "stateMutability": "view" }, { "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resetGenesisHash", + "name": "messageStatus", "inputs": [ { - "name": "_genesisBlockHash", + "name": "msgHash", "type": "bytes32", "internalType": "bytes32" } ], - "outputs": [], - "stateMutability": "nonpayable" + "outputs": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum IBridge.Status" + } + ], + "stateMutability": "view" }, { "type": "function", - "name": "resolve", - "inputs": [ + "name": "nextMessageId", + "inputs": [], + "outputs": [ { - "name": "_chainId", + "name": "", "type": "uint64", "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" } ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], "outputs": [ { "name": "", "type": "address", - "internalType": "address payable" + "internalType": "address" } ], "stateMutability": "view" }, { "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ { - "name": "_allowZeroAddress", + "name": "", "type": "bool", "internalType": "bool" } ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pendingOwner", + "inputs": [], "outputs": [ { "name": "", "type": "address", - "internalType": "address payable" + "internalType": "address" } ], "stateMutability": "view" }, { "type": "function", - "name": "slotA", - "inputs": [], - "outputs": [ + "name": "processMessage", + "inputs": [ { - "name": "", + "name": "_message", "type": "tuple", - "internalType": "struct TaikoData.SlotA", + "internalType": "struct IBridge.Message", "components": [ { - "name": "genesisHeight", + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "genesisTimestamp", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "lastSyncedBlockId", - "type": "uint64", - "internalType": "uint64" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "lastSynecdAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "slotB", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotB", - "components": [ + "name": "from", + "type": "address", + "internalType": "address" + }, { - "name": "numBlocks", + "name": "srcChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" + "name": "srcOwner", + "type": "address", + "internalType": "address" }, { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" + "name": "destChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" + "name": "destOwner", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" + "name": "to", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" + "name": "value", + "type": "uint256", + "internalType": "uint256" }, { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] + }, + { + "name": "_proof", + "type": "bytes", + "internalType": "bytes" } ], - "stateMutability": "view" + "outputs": [ + { + "name": "status_", + "type": "uint8", + "internalType": "enum IBridge.Status" + }, + { + "name": "reason_", + "type": "uint8", + "internalType": "enum IBridge.StatusReason" + } + ], + "stateMutability": "nonpayable" }, { "type": "function", - "name": "state", + "name": "proxiableUUID", "inputs": [], "outputs": [ { - "name": "__reserve1", + "name": "", "type": "bytes32", "internalType": "bytes32" - }, + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "recallMessage", + "inputs": [ { - "name": "slotA", + "name": "_message", "type": "tuple", - "internalType": "struct TaikoData.SlotA", + "internalType": "struct IBridge.Message", "components": [ { - "name": "genesisHeight", + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "genesisTimestamp", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "lastSyncedBlockId", - "type": "uint64", - "internalType": "uint64" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "lastSynecdAt", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "name": "slotB", - "type": "tuple", - "internalType": "struct TaikoData.SlotB", - "components": [ + "name": "from", + "type": "address", + "internalType": "address" + }, { - "name": "numBlocks", + "name": "srcChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" + "name": "srcOwner", + "type": "address", + "internalType": "address" }, { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" + "name": "destChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" + "name": "destOwner", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" + "name": "to", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" + "name": "value", + "type": "uint256", + "internalType": "uint256" }, { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ + }, { - "name": "newOwner", - "type": "address", - "internalType": "address" + "name": "_proof", + "type": "bytes", + "internalType": "bytes" } ], "outputs": [], @@ -900,147 +833,80 @@ }, { "type": "function", - "name": "unpause", + "name": "renounceOwnership", "inputs": [], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", - "name": "upgradeTo", + "name": "resolve", "inputs": [ { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ + "name": "_chainId", + "type": "uint64", + "internalType": "uint64" + }, { - "name": "newImplementation", - "type": "address", - "internalType": "address" + "name": "_name", + "type": "bytes32", + "internalType": "bytes32" }, { - "name": "data", - "type": "bytes", - "internalType": "bytes" + "name": "_allowZeroAddress", + "type": "bool", + "internalType": "bool" } ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "verifyBlocks", - "inputs": [ + "outputs": [ { - "name": "_maxBlocksToVerify", - "type": "uint64", - "internalType": "uint64" + "name": "", + "type": "address", + "internalType": "address payable" } ], - "outputs": [], - "stateMutability": "nonpayable" + "stateMutability": "view" }, { - "type": "event", - "name": "AdminChanged", + "type": "function", + "name": "resolve", "inputs": [ { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" + "name": "_name", + "type": "bytes32", + "internalType": "bytes32" }, { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" + "name": "_allowZeroAddress", + "type": "bool", + "internalType": "bool" } ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ + "outputs": [ { - "name": "beacon", + "name": "", "type": "address", - "indexed": true, - "internalType": "address" + "internalType": "address payable" } ], - "anonymous": false + "stateMutability": "view" }, { - "type": "event", - "name": "BlockProposed", + "type": "function", + "name": "retryMessage", "inputs": [ { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "assignedProver", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "livenessBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "meta", + "name": "_message", "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.BlockMetadata", + "internalType": "struct IBridge.Message", "components": [ { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "coinbase", - "type": "address", - "internalType": "address" + "name": "id", + "type": "uint64", + "internalType": "uint64" }, { - "name": "id", + "name": "fee", "type": "uint64", "internalType": "uint64" }, @@ -1050,309 +916,291 @@ "internalType": "uint32" }, { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "l1Height", + "name": "srcChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" + "name": "srcOwner", + "type": "address", + "internalType": "address" }, { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "destChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "sender", + "name": "destOwner", "type": "address", "internalType": "address" - } - ] - }, - { - "name": "depositsProcessed", - "type": "tuple[]", - "indexed": false, - "internalType": "struct TaikoData.EthDeposit[]", - "components": [ + }, { - "name": "recipient", + "name": "to", "type": "address", "internalType": "address" }, { - "name": "amount", - "type": "uint96", - "internalType": "uint96" + "name": "value", + "type": "uint256", + "internalType": "uint256" }, { - "name": "id", - "type": "uint64", - "internalType": "uint64" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] + }, + { + "name": "_isLastAttempt", + "type": "bool", + "internalType": "bool" } ], - "anonymous": false + "outputs": [], + "stateMutability": "nonpayable" }, { - "type": "event", - "name": "BlockProposed", + "type": "function", + "name": "selfDelegate", "inputs": [ { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "assignedProver", + "name": "_anyToken", "type": "address", - "indexed": true, "internalType": "address" - }, - { - "name": "livenessBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "sendMessage", + "inputs": [ { - "name": "meta", + "name": "_message", "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.BlockMetadata", + "internalType": "struct IBridge.Message", "components": [ { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" + "name": "id", + "type": "uint64", + "internalType": "uint64" }, { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" + "name": "fee", + "type": "uint64", + "internalType": "uint64" }, { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "coinbase", + "name": "srcOwner", "type": "address", "internalType": "address" }, { - "name": "id", + "name": "destChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" + "name": "destOwner", + "type": "address", + "internalType": "address" }, { - "name": "timestamp", + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [ + { + "name": "msgHash_", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "message_", + "type": "tuple", + "internalType": "struct IBridge.Message", + "components": [ + { + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "l1Height", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "sender", + "name": "srcOwner", "type": "address", "internalType": "address" - } - ] - }, - { - "name": "depositsProcessed", - "type": "tuple[]", - "indexed": false, - "internalType": "struct TaikoData.EthDeposit[]", - "components": [ + }, + { + "name": "destChainId", + "type": "uint64", + "internalType": "uint64" + }, { - "name": "recipient", + "name": "destOwner", "type": "address", "internalType": "address" }, { - "name": "amount", - "type": "uint96", - "internalType": "uint96" + "name": "to", + "type": "address", + "internalType": "address" }, { - "name": "id", - "type": "uint64", - "internalType": "uint64" + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] } ], - "anonymous": false + "stateMutability": "payable" }, { - "type": "event", - "name": "BlockVerified", + "type": "function", + "name": "signalForFailedMessage", "inputs": [ { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "prover", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "blockHash", + "name": "_msgHash", "type": "bytes32", - "indexed": false, "internalType": "bytes32" - }, + } + ], + "outputs": [ { - "name": "stateRoot", + "name": "", "type": "bytes32", - "indexed": false, "internalType": "bytes32" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" } ], - "anonymous": false + "stateMutability": "pure" }, { - "type": "event", - "name": "BlockVerified", + "type": "function", + "name": "transferOwnership", "inputs": [ { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "prover", + "name": "newOwner", "type": "address", - "indexed": true, "internalType": "address" - }, - { - "name": "blockHash", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" } ], - "anonymous": false + "outputs": [], + "stateMutability": "nonpayable" }, { - "type": "event", - "name": "Initialized", + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "upgradeTo", "inputs": [ { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" + "name": "newImplementation", + "type": "address", + "internalType": "address" } ], - "anonymous": false + "outputs": [], + "stateMutability": "nonpayable" }, { - "type": "event", - "name": "OwnershipTransferStarted", + "type": "function", + "name": "upgradeToAndCall", "inputs": [ { - "name": "previousOwner", + "name": "newImplementation", "type": "address", - "indexed": true, "internalType": "address" }, { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ], - "anonymous": false + "outputs": [], + "stateMutability": "payable" }, { "type": "event", - "name": "OwnershipTransferred", + "name": "AdminChanged", "inputs": [ { - "name": "previousOwner", + "name": "previousAdmin", "type": "address", - "indexed": true, + "indexed": false, "internalType": "address" }, { - "name": "newOwner", + "name": "newAdmin", "type": "address", - "indexed": true, + "indexed": false, "internalType": "address" } ], @@ -1360,12 +1208,12 @@ }, { "type": "event", - "name": "Paused", + "name": "BeaconUpgraded", "inputs": [ { - "name": "account", + "name": "beacon", "type": "address", - "indexed": false, + "indexed": true, "internalType": "address" } ], @@ -1373,74 +1221,115 @@ }, { "type": "event", - "name": "ProvingPaused", + "name": "Initialized", "inputs": [ { - "name": "paused", - "type": "bool", + "name": "version", + "type": "uint8", "indexed": false, - "internalType": "bool" + "internalType": "uint8" } ], "anonymous": false }, { "type": "event", - "name": "ProvingPaused", + "name": "MessageProcessed", "inputs": [ { - "name": "paused", - "type": "bool", - "indexed": false, - "internalType": "bool" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "StateVariablesUpdated", - "inputs": [ + "name": "msgHash", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, { - "name": "slotB", + "name": "message", "type": "tuple", "indexed": false, - "internalType": "struct TaikoData.SlotB", + "internalType": "struct IBridge.Message", "components": [ { - "name": "numBlocks", + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "lastVerifiedBlockId", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" + "name": "srcOwner", + "type": "address", + "internalType": "address" }, { - "name": "lastUnpausedAt", + "name": "destChainId", "type": "uint64", "internalType": "uint64" + }, + { + "name": "destOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "stats", + "type": "tuple", + "indexed": false, + "internalType": "struct Bridge.ProcessingStats", + "components": [ + { + "name": "gasUsedInFeeCalc", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "proofSize", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "numCacheOps", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "processedByRelayer", + "type": "bool", + "internalType": "bool" } ] } @@ -1449,48 +1338,74 @@ }, { "type": "event", - "name": "StateVariablesUpdated", + "name": "MessageSent", "inputs": [ { - "name": "slotB", + "name": "msgHash", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "message", "type": "tuple", "indexed": false, - "internalType": "struct TaikoData.SlotB", + "internalType": "struct IBridge.Message", "components": [ { - "name": "numBlocks", + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "lastVerifiedBlockId", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" + "name": "srcOwner", + "type": "address", + "internalType": "address" }, { - "name": "lastUnpausedAt", + "name": "destChainId", "type": "uint64", "internalType": "uint64" + }, + { + "name": "destOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] } @@ -1499,236 +1414,70 @@ }, { "type": "event", - "name": "TransitionContested", + "name": "MessageStatusChanged", "inputs": [ { - "name": "blockId", - "type": "uint256", + "name": "msgHash", + "type": "bytes32", "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "contester", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "contestBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" + "internalType": "bytes32" }, { - "name": "tier", - "type": "uint16", + "name": "status", + "type": "uint8", "indexed": false, - "internalType": "uint16" + "internalType": "enum IBridge.Status" } ], "anonymous": false }, { "type": "event", - "name": "TransitionContested", + "name": "OwnershipTransferStarted", "inputs": [ { - "name": "blockId", - "type": "uint256", + "name": "previousOwner", + "type": "address", "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] + "internalType": "address" }, { - "name": "contester", + "name": "newOwner", "type": "address", - "indexed": false, + "indexed": true, "internalType": "address" - }, - { - "name": "contestBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" } ], "anonymous": false }, { "type": "event", - "name": "TransitionProved", + "name": "OwnershipTransferred", "inputs": [ { - "name": "blockId", - "type": "uint256", + "name": "previousOwner", + "type": "address", "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] + "internalType": "address" }, { - "name": "prover", + "name": "newOwner", "type": "address", - "indexed": false, + "indexed": true, "internalType": "address" - }, - { - "name": "validityBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" } ], "anonymous": false }, { "type": "event", - "name": "TransitionProved", + "name": "Paused", "inputs": [ { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "prover", + "name": "account", "type": "address", "indexed": false, "internalType": "address" - }, - { - "name": "validityBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" } ], "anonymous": false @@ -1761,282 +1510,82 @@ }, { "type": "error", - "name": "ETH_TRANSFER_FAILED", - "inputs": [] - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_CONTESTED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_CONTESTED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_PROVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_PROVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOB_NOT_AVAILABLE", + "name": "B_INSUFFICIENT_GAS", "inputs": [] }, { "type": "error", - "name": "L1_BLOB_NOT_AVAILABLE", + "name": "B_INVALID_CHAINID", "inputs": [] }, { "type": "error", - "name": "L1_BLOB_NOT_FOUND", + "name": "B_INVALID_CONTEXT", "inputs": [] }, { "type": "error", - "name": "L1_BLOB_NOT_FOUND", + "name": "B_INVALID_FEE", "inputs": [] }, { "type": "error", - "name": "L1_BLOCK_MISMATCH", + "name": "B_INVALID_GAS_LIMIT", "inputs": [] }, { "type": "error", - "name": "L1_BLOCK_MISMATCH", + "name": "B_INVALID_STATUS", "inputs": [] }, { "type": "error", - "name": "L1_BLOCK_MISMATCH", + "name": "B_INVALID_VALUE", "inputs": [] }, { "type": "error", - "name": "L1_CANNOT_CONTEST", + "name": "B_MESSAGE_NOT_SENT", "inputs": [] }, { "type": "error", - "name": "L1_CANNOT_CONTEST", + "name": "B_OUT_OF_ETH_QUOTA", "inputs": [] }, { "type": "error", - "name": "L1_INVALID_BLOCK_ID", + "name": "B_PERMISSION_DENIED", "inputs": [] }, { "type": "error", - "name": "L1_INVALID_BLOCK_ID", + "name": "B_PROOF_TOO_LARGE", "inputs": [] }, { "type": "error", - "name": "L1_INVALID_BLOCK_ID", + "name": "B_RETRY_FAILED", "inputs": [] }, { "type": "error", - "name": "L1_INVALID_CONFIG", + "name": "B_SIGNAL_NOT_RECEIVED", "inputs": [] }, { "type": "error", - "name": "L1_INVALID_CONFIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_GENESIS_HASH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_GENESIS_HASH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_HOOK", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_HOOK", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PARAM", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_SIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_SIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TIER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TIER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TRANSITION", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TRANSITION", - "inputs": [] - }, - { - "type": "error", - "name": "L1_LIVENESS_BOND_NOT_RECEIVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_LIVENESS_BOND_NOT_RECEIVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_NOT_ASSIGNED_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_NOT_ASSIGNED_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_PROVING_PAUSED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_RECEIVE_DISABLED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_LATE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_LATE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_MANY_BLOCKS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_MANY_BLOCKS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_ID_ZERO", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_ID_ZERO", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNAUTHORIZED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNAUTHORIZED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNEXPECTED_PARENT", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNEXPECTED_PARENT", + "name": "ETH_TRANSFER_FAILED", "inputs": [] }, { "type": "error", - "name": "L1_UNEXPECTED_TRANSITION_ID", + "name": "FUNC_NOT_IMPLEMENTED", "inputs": [] }, { "type": "error", - "name": "L1_UNEXPECTED_TRANSITION_ID", + "name": "INVALID_PAUSE_STATUS", "inputs": [] }, { diff --git a/packages/eventindexer/ProverPool.json b/packages/eventindexer/ProverPool.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/packages/eventindexer/README.md b/packages/eventindexer/README.md index aabcf07dc91..f1284b51a16 100644 --- a/packages/eventindexer/README.md +++ b/packages/eventindexer/README.md @@ -1,4 +1,3 @@ -[![Golang](https://github.com/taikoxyz/taiko-mono/actions/workflows/golang.yml/badge.svg)](https://github.com/taikoxyz/taiko-mono/actions/workflows/golang.yml) [![Relayer](https://codecov.io/gh/taikoxyz/taiko-mono/branch/main/graph/badge.svg?token=E468X2PTJC&flag=relayer)](https://codecov.io/gh/taikoxyz/taiko-mono) # Indexer diff --git a/packages/eventindexer/SgxVerifier.json b/packages/eventindexer/SgxVerifier.json deleted file mode 100644 index d8975035755..00000000000 --- a/packages/eventindexer/SgxVerifier.json +++ /dev/null @@ -1,968 +0,0 @@ -[ - { - "type": "function", - "name": "INSTANCE_EXPIRY", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "INSTANCE_VALIDITY_DELAY", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addInstances", - "inputs": [ - { - "name": "_instances", - "type": "address[]", - "internalType": "address[]" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "addressRegistered", - "inputs": [ - { - "name": "instanceAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "alreadyAttested", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "deleteInstances", - "inputs": [ - { - "name": "_ids", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "instances", - "inputs": [ - { - "name": "instanceId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "validSince", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "nextInstanceId", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "registerInstance", - "inputs": [ - { - "name": "_attestation", - "type": "tuple", - "internalType": "struct V3Struct.ParsedV3QuoteStruct", - "components": [ - { - "name": "header", - "type": "tuple", - "internalType": "struct V3Struct.Header", - "components": [ - { - "name": "version", - "type": "bytes2", - "internalType": "bytes2" - }, - { - "name": "attestationKeyType", - "type": "bytes2", - "internalType": "bytes2" - }, - { - "name": "teeType", - "type": "bytes4", - "internalType": "bytes4" - }, - { - "name": "qeSvn", - "type": "bytes2", - "internalType": "bytes2" - }, - { - "name": "pceSvn", - "type": "bytes2", - "internalType": "bytes2" - }, - { - "name": "qeVendorId", - "type": "bytes16", - "internalType": "bytes16" - }, - { - "name": "userData", - "type": "bytes20", - "internalType": "bytes20" - } - ] - }, - { - "name": "localEnclaveReport", - "type": "tuple", - "internalType": "struct V3Struct.EnclaveReport", - "components": [ - { - "name": "cpuSvn", - "type": "bytes16", - "internalType": "bytes16" - }, - { - "name": "miscSelect", - "type": "bytes4", - "internalType": "bytes4" - }, - { - "name": "reserved1", - "type": "bytes28", - "internalType": "bytes28" - }, - { - "name": "attributes", - "type": "bytes16", - "internalType": "bytes16" - }, - { - "name": "mrEnclave", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "reserved2", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "mrSigner", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "reserved3", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "isvProdId", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "isvSvn", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "reserved4", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "reportData", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "v3AuthData", - "type": "tuple", - "internalType": "struct V3Struct.ECDSAQuoteV3AuthData", - "components": [ - { - "name": "ecdsa256BitSignature", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "ecdsaAttestationKey", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "pckSignedQeReport", - "type": "tuple", - "internalType": "struct V3Struct.EnclaveReport", - "components": [ - { - "name": "cpuSvn", - "type": "bytes16", - "internalType": "bytes16" - }, - { - "name": "miscSelect", - "type": "bytes4", - "internalType": "bytes4" - }, - { - "name": "reserved1", - "type": "bytes28", - "internalType": "bytes28" - }, - { - "name": "attributes", - "type": "bytes16", - "internalType": "bytes16" - }, - { - "name": "mrEnclave", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "reserved2", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "mrSigner", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "reserved3", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "isvProdId", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "isvSvn", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "reserved4", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "reportData", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "qeReportSignature", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "qeAuthData", - "type": "tuple", - "internalType": "struct V3Struct.QEAuthData", - "components": [ - { - "name": "parsedDataSize", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "certification", - "type": "tuple", - "internalType": "struct V3Struct.CertificationData", - "components": [ - { - "name": "certType", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "certDataSize", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "decodedCertDataArray", - "type": "bytes[3]", - "internalType": "bytes[3]" - } - ] - } - ] - } - ] - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "verifyProof", - "inputs": [ - { - "name": "_ctx", - "type": "tuple", - "internalType": "struct IVerifier.Context", - "components": [ - { - "name": "metaHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "prover", - "type": "address", - "internalType": "address" - }, - { - "name": "blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "isContesting", - "type": "bool", - "internalType": "bool" - }, - { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" - }, - { - "name": "msgSender", - "type": "address", - "internalType": "address" - } - ] - }, - { - "name": "_tran", - "type": "tuple", - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "_proof", - "type": "tuple", - "internalType": "struct TaikoData.TierProof", - "components": [ - { - "name": "tier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "InstanceAdded", - "inputs": [ - { - "name": "id", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "instance", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "replaced", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "validSince", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "InstanceDeleted", - "inputs": [ - { - "name": "id", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "instance", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "SGX_ALREADY_ATTESTED", - "inputs": [] - }, - { - "type": "error", - "name": "SGX_INVALID_ATTESTATION", - "inputs": [] - }, - { - "type": "error", - "name": "SGX_INVALID_INSTANCE", - "inputs": [] - }, - { - "type": "error", - "name": "SGX_INVALID_PROOF", - "inputs": [] - }, - { - "type": "error", - "name": "SGX_RA_NOT_SUPPORTED", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/eventindexer/Swap.json b/packages/eventindexer/Swap.json deleted file mode 100644 index 97a2bc659b3..00000000000 --- a/packages/eventindexer/Swap.json +++ /dev/null @@ -1,1032 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "_factory", - "type": "address" - }, - { - "internalType": "address", - "name": "_WETH", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "WETH", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "tokenA", - "type": "address" - }, - { - "internalType": "address", - "name": "tokenB", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amountADesired", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountBDesired", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountAMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountBMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "addLiquidity", - "outputs": [ - { - "internalType": "uint256", - "name": "amountA", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountB", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amountTokenDesired", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountTokenMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETHMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "addLiquidityETH", - "outputs": [ - { - "internalType": "uint256", - "name": "amountToken", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETH", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "factory", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOut", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reserveIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reserveOut", - "type": "uint256" - } - ], - "name": "getAmountIn", - "outputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reserveIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reserveOut", - "type": "uint256" - } - ], - "name": "getAmountOut", - "outputs": [ - { - "internalType": "uint256", - "name": "amountOut", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOut", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - } - ], - "name": "getAmountsIn", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - } - ], - "name": "getAmountsOut", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountA", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reserveA", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reserveB", - "type": "uint256" - } - ], - "name": "quote", - "outputs": [ - { - "internalType": "uint256", - "name": "amountB", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "tokenA", - "type": "address" - }, - { - "internalType": "address", - "name": "tokenB", - "type": "address" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountAMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountBMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "removeLiquidity", - "outputs": [ - { - "internalType": "uint256", - "name": "amountA", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountB", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountTokenMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETHMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "removeLiquidityETH", - "outputs": [ - { - "internalType": "uint256", - "name": "amountToken", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETH", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountTokenMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETHMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "removeLiquidityETHSupportingFeeOnTransferTokens", - "outputs": [ - { - "internalType": "uint256", - "name": "amountETH", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountTokenMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETHMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "approveMax", - "type": "bool" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "removeLiquidityETHWithPermit", - "outputs": [ - { - "internalType": "uint256", - "name": "amountToken", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETH", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountTokenMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETHMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "approveMax", - "type": "bool" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "removeLiquidityETHWithPermitSupportingFeeOnTransferTokens", - "outputs": [ - { - "internalType": "uint256", - "name": "amountETH", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "tokenA", - "type": "address" - }, - { - "internalType": "address", - "name": "tokenB", - "type": "address" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountAMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountBMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "approveMax", - "type": "bool" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "removeLiquidityWithPermit", - "outputs": [ - { - "internalType": "uint256", - "name": "amountA", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountB", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOut", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapETHForExactTokens", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapExactETHForTokens", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapExactETHForTokensSupportingFeeOnTransferTokens", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapExactTokensForETH", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapExactTokensForETHSupportingFeeOnTransferTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapExactTokensForTokens", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapExactTokensForTokensSupportingFeeOnTransferTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOut", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountInMax", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapTokensForExactETH", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOut", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountInMax", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapTokensForExactTokens", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "type": "event", - "name": "Swap", - "inputs": [ - { - "type": "address", - "name": "sender", - "indexed": true - }, - { - "type": "uint256", - "name": "amount0In", - "indexed": false - }, - { - "type": "uint256", - "name": "amount1In", - "indexed": false - }, - { - "type": "uint256", - "name": "amount0Out", - "indexed": false - }, - { - "type": "uint256", - "name": "amount1Out", - "indexed": false - }, - { - "type": "address", - "name": "to", - "indexed": true - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Mint", - "inputs": [ - { - "type": "address", - "name": "sender", - "indexed": true - }, - { - "type": "uint256", - "name": "amount0", - "indexed": false - }, - { - "type": "uint256", - "name": "amount1", - "indexed": false - } - ], - "anonymous": false - }, - { - "stateMutability": "payable", - "type": "receive" - } -] diff --git a/packages/eventindexer/TaikoL1.json b/packages/eventindexer/TaikoL1.json deleted file mode 100644 index d84c004bf37..00000000000 --- a/packages/eventindexer/TaikoL1.json +++ /dev/null @@ -1,2088 +0,0 @@ -[ - { - "type": "receive", - "stateMutability": "payable" - }, - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getBlock", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "blk_", - "type": "tuple", - "internalType": "struct TaikoData.Block", - "components": [ - { - "name": "metaHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "assignedProver", - "type": "address", - "internalType": "address" - }, - { - "name": "livenessBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "proposedAt", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "proposedIn", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "nextTransitionId", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "verifiedTransitionId", - "type": "uint32", - "internalType": "uint32" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getConfig", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.Config", - "components": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockMaxProposals", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockRingBufferSize", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "maxBlocksToVerifyPerProposal", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockMaxGasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "livenessBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "blockSyncThreshold", - "type": "uint8", - "internalType": "uint8" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getStateVariables", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotA", - "components": [ - { - "name": "genesisHeight", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "genesisTimestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastSyncedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastSynecdAt", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotB", - "components": [ - { - "name": "numBlocks", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" - }, - { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getTransition", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_tid", - "type": "uint32", - "internalType": "uint32" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.TransitionState", - "components": [ - { - "name": "key", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "prover", - "type": "address", - "internalType": "address" - }, - { - "name": "validityBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "contester", - "type": "address", - "internalType": "address" - }, - { - "name": "contestBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "tier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reserved1", - "type": "uint8", - "internalType": "uint8" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getTransition", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_parentHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.TransitionState", - "components": [ - { - "name": "key", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "prover", - "type": "address", - "internalType": "address" - }, - { - "name": "validityBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "contester", - "type": "address", - "internalType": "address" - }, - { - "name": "contestBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "tier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reserved1", - "type": "uint8", - "internalType": "uint8" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - }, - { - "name": "_genesisBlockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_toPause", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "init2", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "pauseProving", - "inputs": [ - { - "name": "_pause", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proposeBlock", - "inputs": [ - { - "name": "_params", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "_txList", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "meta_", - "type": "tuple", - "internalType": "struct TaikoData.BlockMetadata", - "components": [ - { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "coinbase", - "type": "address", - "internalType": "address" - }, - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "l1Height", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" - }, - { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "internalType": "address" - } - ] - }, - { - "name": "deposits_", - "type": "tuple[]", - "internalType": "struct TaikoData.EthDeposit[]", - "components": [ - { - "name": "recipient", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "proveBlock", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_input", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resetGenesisHash", - "inputs": [ - { - "name": "_genesisBlockHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "slotA", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotA", - "components": [ - { - "name": "genesisHeight", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "genesisTimestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastSyncedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastSynecdAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "slotB", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotB", - "components": [ - { - "name": "numBlocks", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" - }, - { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "state", - "inputs": [], - "outputs": [ - { - "name": "__reserve1", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "slotA", - "type": "tuple", - "internalType": "struct TaikoData.SlotA", - "components": [ - { - "name": "genesisHeight", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "genesisTimestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastSyncedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastSynecdAt", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "name": "slotB", - "type": "tuple", - "internalType": "struct TaikoData.SlotB", - "components": [ - { - "name": "numBlocks", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" - }, - { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "verifyBlocks", - "inputs": [ - { - "name": "_maxBlocksToVerify", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BlockProposed", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "assignedProver", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "livenessBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "meta", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.BlockMetadata", - "components": [ - { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "coinbase", - "type": "address", - "internalType": "address" - }, - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "l1Height", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" - }, - { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "internalType": "address" - } - ] - }, - { - "name": "depositsProcessed", - "type": "tuple[]", - "indexed": false, - "internalType": "struct TaikoData.EthDeposit[]", - "components": [ - { - "name": "recipient", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BlockProposed", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "assignedProver", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "livenessBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "meta", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.BlockMetadata", - "components": [ - { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "coinbase", - "type": "address", - "internalType": "address" - }, - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "l1Height", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" - }, - { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "internalType": "address" - } - ] - }, - { - "name": "depositsProcessed", - "type": "tuple[]", - "indexed": false, - "internalType": "struct TaikoData.EthDeposit[]", - "components": [ - { - "name": "recipient", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BlockVerified", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "prover", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "blockHash", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BlockVerified", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "prover", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "blockHash", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ProvingPaused", - "inputs": [ - { - "name": "paused", - "type": "bool", - "indexed": false, - "internalType": "bool" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ProvingPaused", - "inputs": [ - { - "name": "paused", - "type": "bool", - "indexed": false, - "internalType": "bool" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "StateVariablesUpdated", - "inputs": [ - { - "name": "slotB", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.SlotB", - "components": [ - { - "name": "numBlocks", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" - }, - { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "StateVariablesUpdated", - "inputs": [ - { - "name": "slotB", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.SlotB", - "components": [ - { - "name": "numBlocks", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" - }, - { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TransitionContested", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "contester", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "contestBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TransitionContested", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "contester", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "contestBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TransitionProved", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "prover", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "validityBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TransitionProved", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "prover", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "validityBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "ETH_TRANSFER_FAILED", - "inputs": [] - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_CONTESTED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_CONTESTED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_PROVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_PROVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOB_NOT_AVAILABLE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOB_NOT_AVAILABLE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOB_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOB_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOCK_MISMATCH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOCK_MISMATCH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOCK_MISMATCH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_CANNOT_CONTEST", - "inputs": [] - }, - { - "type": "error", - "name": "L1_CANNOT_CONTEST", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_BLOCK_ID", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_BLOCK_ID", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_BLOCK_ID", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_CONFIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_CONFIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_GENESIS_HASH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_GENESIS_HASH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_HOOK", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_HOOK", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PARAM", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_SIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_SIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TIER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TIER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TRANSITION", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TRANSITION", - "inputs": [] - }, - { - "type": "error", - "name": "L1_LIVENESS_BOND_NOT_RECEIVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_LIVENESS_BOND_NOT_RECEIVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_NOT_ASSIGNED_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_NOT_ASSIGNED_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_PROVING_PAUSED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_RECEIVE_DISABLED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_LATE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_LATE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_MANY_BLOCKS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_MANY_BLOCKS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_ID_ZERO", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_ID_ZERO", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNAUTHORIZED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNAUTHORIZED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNEXPECTED_PARENT", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNEXPECTED_PARENT", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNEXPECTED_TRANSITION_ID", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNEXPECTED_TRANSITION_ID", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/eventindexer/TaikoToken.json b/packages/eventindexer/TaikoToken.json deleted file mode 100644 index 8dad17e504a..00000000000 --- a/packages/eventindexer/TaikoToken.json +++ /dev/null @@ -1,1084 +0,0 @@ -[ - { - "type": "function", - "name": "CLOCK_MODE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "DOMAIN_SEPARATOR", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "allowance", - "inputs": [ - { - "name": "owner", - "type": "address", - "internalType": "address" - }, - { - "name": "spender", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "approve", - "inputs": [ - { - "name": "spender", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "balanceOf", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "checkpoints", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - }, - { - "name": "pos", - "type": "uint32", - "internalType": "uint32" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct ERC20VotesUpgradeable.Checkpoint", - "components": [ - { - "name": "fromBlock", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "votes", - "type": "uint224", - "internalType": "uint224" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "clock", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint48", - "internalType": "uint48" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "decimals", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint8", - "internalType": "uint8" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "decreaseAllowance", - "inputs": [ - { - "name": "spender", - "type": "address", - "internalType": "address" - }, - { - "name": "subtractedValue", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "delegate", - "inputs": [ - { - "name": "delegatee", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "delegateBySig", - "inputs": [ - { - "name": "delegatee", - "type": "address", - "internalType": "address" - }, - { - "name": "nonce", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "expiry", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "v", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "r", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "s", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "delegates", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "eip712Domain", - "inputs": [], - "outputs": [ - { - "name": "fields", - "type": "bytes1", - "internalType": "bytes1" - }, - { - "name": "name", - "type": "string", - "internalType": "string" - }, - { - "name": "version", - "type": "string", - "internalType": "string" - }, - { - "name": "chainId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "verifyingContract", - "type": "address", - "internalType": "address" - }, - { - "name": "salt", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "extensions", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getPastTotalSupply", - "inputs": [ - { - "name": "timepoint", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getPastVotes", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - }, - { - "name": "timepoint", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getVotes", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "increaseAllowance", - "inputs": [ - { - "name": "spender", - "type": "address", - "internalType": "address" - }, - { - "name": "addedValue", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_recipient", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "name", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "nonces", - "inputs": [ - { - "name": "owner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "numCheckpoints", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint32", - "internalType": "uint32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "permit", - "inputs": [ - { - "name": "owner", - "type": "address", - "internalType": "address" - }, - { - "name": "spender", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "deadline", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "v", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "r", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "s", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "symbol", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "totalSupply", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transfer", - "inputs": [ - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "transferFrom", - "inputs": [ - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Approval", - "inputs": [ - { - "name": "owner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "spender", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "DelegateChanged", - "inputs": [ - { - "name": "delegator", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "fromDelegate", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "toDelegate", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "DelegateVotesChanged", - "inputs": [ - { - "name": "delegate", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "previousBalance", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newBalance", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "EIP712DomainChanged", - "inputs": [], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Transfer", - "inputs": [ - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/eventindexer/api/api.go b/packages/eventindexer/api/api.go index 9fe005eca40..7e156b55572 100644 --- a/packages/eventindexer/api/api.go +++ b/packages/eventindexer/api/api.go @@ -9,12 +9,16 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/labstack/echo/v4" + "github.com/urfave/cli/v2" + + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/http" "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/repo" - "github.com/urfave/cli/v2" ) type API struct { + db db.DB + httpPort uint64 srv *http.Server @@ -67,23 +71,30 @@ func InitFromConfig(ctx context.Context, api *API, cfg *Config) error { return err } + erc20BalanceRepository, err := repo.NewERC20BalanceRepository(db) + if err != nil { + return err + } + ethClient, err := ethclient.Dial(cfg.RPCUrl) if err != nil { return err } srv, err := http.NewServer(http.NewServerOpts{ - EventRepo: eventRepository, - NFTBalanceRepo: nftBalanceRepository, - ChartRepo: chartRepository, - Echo: echo.New(), - CorsOrigins: cfg.CORSOrigins, - EthClient: ethClient, + EventRepo: eventRepository, + NFTBalanceRepo: nftBalanceRepository, + ERC20BalanceRepo: erc20BalanceRepository, + ChartRepo: chartRepository, + Echo: echo.New(), + CorsOrigins: cfg.CORSOrigins, + EthClient: ethClient, }) if err != nil { return err } + api.db = db api.srv = srv api.httpPort = cfg.HTTPPort @@ -94,4 +105,9 @@ func (api *API) Close(ctx context.Context) { if err := api.srv.Shutdown(ctx); err != nil { slog.Error("srv shutdown", "error", err) } + + // Close db connection. + if err := api.db.Close(); err != nil { + slog.Error("Failed to close db connection", "err", err) + } } diff --git a/packages/eventindexer/api/config.go b/packages/eventindexer/api/config.go index 430f12d37f9..b407f711cfe 100644 --- a/packages/eventindexer/api/config.go +++ b/packages/eventindexer/api/config.go @@ -1,21 +1,16 @@ package api import ( - "database/sql" "strings" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "github.com/urfave/cli/v2" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" -) -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} + "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" +) type Config struct { // db configs @@ -31,7 +26,7 @@ type Config struct { MetricsHTTPPort uint64 ETHClientTimeout uint64 CORSOrigins []string - OpenDBFunc func() (DB, error) + OpenDBFunc func() (db.DB, error) } // NewConfigFromCliContext creates a new config instance from command line flags. @@ -52,7 +47,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MetricsHTTPPort: c.Uint64(flags.MetricsHTTPPort.Name), CORSOrigins: cors, RPCUrl: c.String(flags.APIRPCUrl.Name), - OpenDBFunc: func() (DB, error) { + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -61,7 +56,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (db.DB, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/eventindexer/cmd/flags/common.go b/packages/eventindexer/cmd/flags/common.go index a9a1a258fd5..4b3f0056a47 100644 --- a/packages/eventindexer/cmd/flags/common.go +++ b/packages/eventindexer/cmd/flags/common.go @@ -5,10 +5,9 @@ import ( ) var ( - commonCategory = "COMMON" - indexerCategory = "INDEXER" - generatorCategory = "GENERATOR" - txmgrCategory = "TX_MANAGER" + commonCategory = "COMMON" + indexerCategory = "INDEXER" + txmgrCategory = "TX_MANAGER" ) var ( diff --git a/packages/eventindexer/cmd/flags/generator.go b/packages/eventindexer/cmd/flags/generator.go deleted file mode 100644 index 9f9f4988ee0..00000000000 --- a/packages/eventindexer/cmd/flags/generator.go +++ /dev/null @@ -1,24 +0,0 @@ -package flags - -import "github.com/urfave/cli/v2" - -var ( - GenesisDate = &cli.StringFlag{ - Name: "genesisDate", - Usage: "Genesis date to start generating data from, YYYY-MM-DD", - Required: true, - Category: generatorCategory, - EnvVars: []string{"GENESIS_DATE"}, - } - Regenerate = &cli.StringFlag{ - Name: "regenerate", - Usage: "True to delete all existing data and regenerate from genesis, false to not", - Required: false, - Category: generatorCategory, - EnvVars: []string{"REGENERATE"}, - } -) -var GeneratorFlags = MergeFlags(CommonFlags, []cli.Flag{ - GenesisDate, - Regenerate, -}) diff --git a/packages/eventindexer/cmd/flags/indexer.go b/packages/eventindexer/cmd/flags/indexer.go index 687ca449dbd..b41d929dd0a 100644 --- a/packages/eventindexer/cmd/flags/indexer.go +++ b/packages/eventindexer/cmd/flags/indexer.go @@ -37,13 +37,6 @@ var ( Category: indexerCategory, EnvVars: []string{"BRIDGE_ADDRESS"}, } - AssignmentHookAddress = &cli.StringFlag{ - Name: "assignmentHookAddress", - Usage: "Address of the AssignmentHook contract", - Required: false, - Category: indexerCategory, - EnvVars: []string{"ASSIGNMENT_HOOK_ADDRESS"}, - } BlockBatchSize = &cli.Uint64Flag{ Name: "blockBatchSize", Usage: "Block batch size when iterating through blocks", @@ -74,6 +67,20 @@ var ( Category: indexerCategory, EnvVars: []string{"INDEX_NFTS"}, } + IndexERC20s = &cli.BoolFlag{ + Name: "indexERC20s", + Usage: "Whether to index erc20 transfer events or not", + Required: false, + Category: indexerCategory, + EnvVars: []string{"INDEX_ERC20S"}, + } + OntakeForkHeight = &cli.Uint64Flag{ + Name: "ontakeForkHeight", + Usage: "Block number ontake fork height happened", + Value: 21134698, + Category: indexerCategory, + EnvVars: []string{"ONTAKE_FORK_HEIGHT"}, + } ) var IndexerFlags = MergeFlags(CommonFlags, []cli.Flag{ @@ -82,9 +89,10 @@ var IndexerFlags = MergeFlags(CommonFlags, []cli.Flag{ ETHClientTimeout, L1TaikoAddress, BridgeAddress, - AssignmentHookAddress, BlockBatchSize, SubscriptionBackoff, SyncMode, IndexNFTs, + IndexERC20s, + OntakeForkHeight, }) diff --git a/packages/eventindexer/cmd/main.go b/packages/eventindexer/cmd/main.go index fac9c636791..f8749ba109a 100644 --- a/packages/eventindexer/cmd/main.go +++ b/packages/eventindexer/cmd/main.go @@ -9,7 +9,6 @@ import ( "github.com/taikoxyz/taiko-mono/packages/eventindexer/api" "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/utils" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/generator" "github.com/taikoxyz/taiko-mono/packages/eventindexer/indexer" "github.com/urfave/cli/v2" ) @@ -51,13 +50,6 @@ func main() { Description: "Taiko indexer software", Action: utils.SubcommandAction(new(indexer.Indexer)), }, - { - Name: "generator", - Flags: flags.GeneratorFlags, - Usage: "Starts the generator software", - Description: "Taiko time-series data generator", - Action: utils.SubcommandAction(new(generator.Generator)), - }, } if err := app.Run(os.Args); err != nil { diff --git a/packages/eventindexer/contracts/assignmenthook/AssignmentHook.go b/packages/eventindexer/contracts/assignmenthook/AssignmentHook.go deleted file mode 100644 index 6c2c584dac2..00000000000 --- a/packages/eventindexer/contracts/assignmenthook/AssignmentHook.go +++ /dev/null @@ -1,2202 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package assignmenthook - -import ( - "errors" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// AssignmentHookProverAssignment is an auto generated low-level Go binding around an user-defined struct. -type AssignmentHookProverAssignment struct { - FeeToken common.Address - Expiry uint64 - MaxBlockId uint64 - MaxProposedIn uint64 - MetaHash [32]byte - ParentMetaHash [32]byte - TierFees []TaikoDataTierFee - Signature []byte -} - -// TaikoDataBlock is an auto generated low-level Go binding around an user-defined struct. -type TaikoDataBlock struct { - MetaHash [32]byte - AssignedProver common.Address - LivenessBond *big.Int - BlockId uint64 - ProposedAt uint64 - ProposedIn uint64 - NextTransitionId uint32 - VerifiedTransitionId uint32 -} - -// TaikoDataBlockMetadata is an auto generated low-level Go binding around an user-defined struct. -type TaikoDataBlockMetadata struct { - L1Hash [32]byte - Difficulty [32]byte - BlobHash [32]byte - ExtraData [32]byte - DepositsHash [32]byte - Coinbase common.Address - Id uint64 - GasLimit uint32 - Timestamp uint64 - L1Height uint64 - MinTier uint16 - BlobUsed bool - ParentMetaHash [32]byte - Sender common.Address -} - -// TaikoDataTierFee is an auto generated low-level Go binding around an user-defined struct. -type TaikoDataTierFee struct { - Tier uint16 - Fee *big.Int -} - -// AssignmentHookMetaData contains all meta data concerning the AssignmentHook contract. -var AssignmentHookMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hashAssignment\",\"inputs\":[{\"name\":\"_assignment\",\"type\":\"tuple\",\"internalType\":\"structAssignmentHook.ProverAssignment\",\"components\":[{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxProposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tierFees\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TierFee[]\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"fee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_taikoL1Address\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockProposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"inputs\":[{\"name\":\"_blk\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"_meta\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockAssigned\",\"inputs\":[{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"assignment\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structAssignmentHook.ProverAssignment\",\"components\":[{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxProposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tierFees\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TierFee[]\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"fee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"maxGas\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", -} - -// AssignmentHookABI is the input ABI used to generate the binding from. -// Deprecated: Use AssignmentHookMetaData.ABI instead. -var AssignmentHookABI = AssignmentHookMetaData.ABI - -// AssignmentHook is an auto generated Go binding around an Ethereum contract. -type AssignmentHook struct { - AssignmentHookCaller // Read-only binding to the contract - AssignmentHookTransactor // Write-only binding to the contract - AssignmentHookFilterer // Log filterer for contract events -} - -// AssignmentHookCaller is an auto generated read-only Go binding around an Ethereum contract. -type AssignmentHookCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// AssignmentHookTransactor is an auto generated write-only Go binding around an Ethereum contract. -type AssignmentHookTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// AssignmentHookFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type AssignmentHookFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// AssignmentHookSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type AssignmentHookSession struct { - Contract *AssignmentHook // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// AssignmentHookCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type AssignmentHookCallerSession struct { - Contract *AssignmentHookCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// AssignmentHookTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type AssignmentHookTransactorSession struct { - Contract *AssignmentHookTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// AssignmentHookRaw is an auto generated low-level Go binding around an Ethereum contract. -type AssignmentHookRaw struct { - Contract *AssignmentHook // Generic contract binding to access the raw methods on -} - -// AssignmentHookCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type AssignmentHookCallerRaw struct { - Contract *AssignmentHookCaller // Generic read-only contract binding to access the raw methods on -} - -// AssignmentHookTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type AssignmentHookTransactorRaw struct { - Contract *AssignmentHookTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewAssignmentHook creates a new instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHook(address common.Address, backend bind.ContractBackend) (*AssignmentHook, error) { - contract, err := bindAssignmentHook(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &AssignmentHook{AssignmentHookCaller: AssignmentHookCaller{contract: contract}, AssignmentHookTransactor: AssignmentHookTransactor{contract: contract}, AssignmentHookFilterer: AssignmentHookFilterer{contract: contract}}, nil -} - -// NewAssignmentHookCaller creates a new read-only instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHookCaller(address common.Address, caller bind.ContractCaller) (*AssignmentHookCaller, error) { - contract, err := bindAssignmentHook(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &AssignmentHookCaller{contract: contract}, nil -} - -// NewAssignmentHookTransactor creates a new write-only instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHookTransactor(address common.Address, transactor bind.ContractTransactor) (*AssignmentHookTransactor, error) { - contract, err := bindAssignmentHook(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &AssignmentHookTransactor{contract: contract}, nil -} - -// NewAssignmentHookFilterer creates a new log filterer instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHookFilterer(address common.Address, filterer bind.ContractFilterer) (*AssignmentHookFilterer, error) { - contract, err := bindAssignmentHook(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &AssignmentHookFilterer{contract: contract}, nil -} - -// bindAssignmentHook binds a generic wrapper to an already deployed contract. -func bindAssignmentHook(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := AssignmentHookMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_AssignmentHook *AssignmentHookRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _AssignmentHook.Contract.AssignmentHookCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_AssignmentHook *AssignmentHookRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.Contract.AssignmentHookTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_AssignmentHook *AssignmentHookRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _AssignmentHook.Contract.AssignmentHookTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_AssignmentHook *AssignmentHookCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _AssignmentHook.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_AssignmentHook *AssignmentHookTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_AssignmentHook *AssignmentHookTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _AssignmentHook.Contract.contract.Transact(opts, method, params...) -} - -// MAXGASPAYINGPROVER is a free data retrieval call binding the contract method 0x12925031. -// -// Solidity: function MAX_GAS_PAYING_PROVER() view returns(uint256) -func (_AssignmentHook *AssignmentHookCaller) MAXGASPAYINGPROVER(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "MAX_GAS_PAYING_PROVER") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// MAXGASPAYINGPROVER is a free data retrieval call binding the contract method 0x12925031. -// -// Solidity: function MAX_GAS_PAYING_PROVER() view returns(uint256) -func (_AssignmentHook *AssignmentHookSession) MAXGASPAYINGPROVER() (*big.Int, error) { - return _AssignmentHook.Contract.MAXGASPAYINGPROVER(&_AssignmentHook.CallOpts) -} - -// MAXGASPAYINGPROVER is a free data retrieval call binding the contract method 0x12925031. -// -// Solidity: function MAX_GAS_PAYING_PROVER() view returns(uint256) -func (_AssignmentHook *AssignmentHookCallerSession) MAXGASPAYINGPROVER() (*big.Int, error) { - return _AssignmentHook.Contract.MAXGASPAYINGPROVER(&_AssignmentHook.CallOpts) -} - -// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. -// -// Solidity: function addressManager() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) AddressManager(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "addressManager") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. -// -// Solidity: function addressManager() view returns(address) -func (_AssignmentHook *AssignmentHookSession) AddressManager() (common.Address, error) { - return _AssignmentHook.Contract.AddressManager(&_AssignmentHook.CallOpts) -} - -// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. -// -// Solidity: function addressManager() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) AddressManager() (common.Address, error) { - return _AssignmentHook.Contract.AddressManager(&_AssignmentHook.CallOpts) -} - -// HashAssignment is a free data retrieval call binding the contract method 0xaf3a0228. -// -// Solidity: function hashAssignment((address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) _assignment, address _taikoL1Address, address _blockProposer, address _assignedProver, bytes32 _blobHash) view returns(bytes32) -func (_AssignmentHook *AssignmentHookCaller) HashAssignment(opts *bind.CallOpts, _assignment AssignmentHookProverAssignment, _taikoL1Address common.Address, _blockProposer common.Address, _assignedProver common.Address, _blobHash [32]byte) ([32]byte, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "hashAssignment", _assignment, _taikoL1Address, _blockProposer, _assignedProver, _blobHash) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// HashAssignment is a free data retrieval call binding the contract method 0xaf3a0228. -// -// Solidity: function hashAssignment((address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) _assignment, address _taikoL1Address, address _blockProposer, address _assignedProver, bytes32 _blobHash) view returns(bytes32) -func (_AssignmentHook *AssignmentHookSession) HashAssignment(_assignment AssignmentHookProverAssignment, _taikoL1Address common.Address, _blockProposer common.Address, _assignedProver common.Address, _blobHash [32]byte) ([32]byte, error) { - return _AssignmentHook.Contract.HashAssignment(&_AssignmentHook.CallOpts, _assignment, _taikoL1Address, _blockProposer, _assignedProver, _blobHash) -} - -// HashAssignment is a free data retrieval call binding the contract method 0xaf3a0228. -// -// Solidity: function hashAssignment((address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) _assignment, address _taikoL1Address, address _blockProposer, address _assignedProver, bytes32 _blobHash) view returns(bytes32) -func (_AssignmentHook *AssignmentHookCallerSession) HashAssignment(_assignment AssignmentHookProverAssignment, _taikoL1Address common.Address, _blockProposer common.Address, _assignedProver common.Address, _blobHash [32]byte) ([32]byte, error) { - return _AssignmentHook.Contract.HashAssignment(&_AssignmentHook.CallOpts, _assignment, _taikoL1Address, _blockProposer, _assignedProver, _blobHash) -} - -// Impl is a free data retrieval call binding the contract method 0x8abf6077. -// -// Solidity: function impl() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Impl(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "impl") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Impl is a free data retrieval call binding the contract method 0x8abf6077. -// -// Solidity: function impl() view returns(address) -func (_AssignmentHook *AssignmentHookSession) Impl() (common.Address, error) { - return _AssignmentHook.Contract.Impl(&_AssignmentHook.CallOpts) -} - -// Impl is a free data retrieval call binding the contract method 0x8abf6077. -// -// Solidity: function impl() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Impl() (common.Address, error) { - return _AssignmentHook.Contract.Impl(&_AssignmentHook.CallOpts) -} - -// InNonReentrant is a free data retrieval call binding the contract method 0x3075db56. -// -// Solidity: function inNonReentrant() view returns(bool) -func (_AssignmentHook *AssignmentHookCaller) InNonReentrant(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "inNonReentrant") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// InNonReentrant is a free data retrieval call binding the contract method 0x3075db56. -// -// Solidity: function inNonReentrant() view returns(bool) -func (_AssignmentHook *AssignmentHookSession) InNonReentrant() (bool, error) { - return _AssignmentHook.Contract.InNonReentrant(&_AssignmentHook.CallOpts) -} - -// InNonReentrant is a free data retrieval call binding the contract method 0x3075db56. -// -// Solidity: function inNonReentrant() view returns(bool) -func (_AssignmentHook *AssignmentHookCallerSession) InNonReentrant() (bool, error) { - return _AssignmentHook.Contract.InNonReentrant(&_AssignmentHook.CallOpts) -} - -// LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. -// -// Solidity: function lastUnpausedAt() view returns(uint64) -func (_AssignmentHook *AssignmentHookCaller) LastUnpausedAt(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "lastUnpausedAt") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. -// -// Solidity: function lastUnpausedAt() view returns(uint64) -func (_AssignmentHook *AssignmentHookSession) LastUnpausedAt() (uint64, error) { - return _AssignmentHook.Contract.LastUnpausedAt(&_AssignmentHook.CallOpts) -} - -// LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. -// -// Solidity: function lastUnpausedAt() view returns(uint64) -func (_AssignmentHook *AssignmentHookCallerSession) LastUnpausedAt() (uint64, error) { - return _AssignmentHook.Contract.LastUnpausedAt(&_AssignmentHook.CallOpts) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Owner(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "owner") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_AssignmentHook *AssignmentHookSession) Owner() (common.Address, error) { - return _AssignmentHook.Contract.Owner(&_AssignmentHook.CallOpts) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Owner() (common.Address, error) { - return _AssignmentHook.Contract.Owner(&_AssignmentHook.CallOpts) -} - -// Paused is a free data retrieval call binding the contract method 0x5c975abb. -// -// Solidity: function paused() view returns(bool) -func (_AssignmentHook *AssignmentHookCaller) Paused(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "paused") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// Paused is a free data retrieval call binding the contract method 0x5c975abb. -// -// Solidity: function paused() view returns(bool) -func (_AssignmentHook *AssignmentHookSession) Paused() (bool, error) { - return _AssignmentHook.Contract.Paused(&_AssignmentHook.CallOpts) -} - -// Paused is a free data retrieval call binding the contract method 0x5c975abb. -// -// Solidity: function paused() view returns(bool) -func (_AssignmentHook *AssignmentHookCallerSession) Paused() (bool, error) { - return _AssignmentHook.Contract.Paused(&_AssignmentHook.CallOpts) -} - -// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. -// -// Solidity: function pendingOwner() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) PendingOwner(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "pendingOwner") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. -// -// Solidity: function pendingOwner() view returns(address) -func (_AssignmentHook *AssignmentHookSession) PendingOwner() (common.Address, error) { - return _AssignmentHook.Contract.PendingOwner(&_AssignmentHook.CallOpts) -} - -// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. -// -// Solidity: function pendingOwner() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) PendingOwner() (common.Address, error) { - return _AssignmentHook.Contract.PendingOwner(&_AssignmentHook.CallOpts) -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. -// -// Solidity: function proxiableUUID() view returns(bytes32) -func (_AssignmentHook *AssignmentHookCaller) ProxiableUUID(opts *bind.CallOpts) ([32]byte, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "proxiableUUID") - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. -// -// Solidity: function proxiableUUID() view returns(bytes32) -func (_AssignmentHook *AssignmentHookSession) ProxiableUUID() ([32]byte, error) { - return _AssignmentHook.Contract.ProxiableUUID(&_AssignmentHook.CallOpts) -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. -// -// Solidity: function proxiableUUID() view returns(bytes32) -func (_AssignmentHook *AssignmentHookCallerSession) ProxiableUUID() ([32]byte, error) { - return _AssignmentHook.Contract.ProxiableUUID(&_AssignmentHook.CallOpts) -} - -// Resolve is a free data retrieval call binding the contract method 0x3eb6b8cf. -// -// Solidity: function resolve(uint64 _chainId, bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Resolve(opts *bind.CallOpts, _chainId uint64, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "resolve", _chainId, _name, _allowZeroAddress) - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Resolve is a free data retrieval call binding the contract method 0x3eb6b8cf. -// -// Solidity: function resolve(uint64 _chainId, bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookSession) Resolve(_chainId uint64, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve(&_AssignmentHook.CallOpts, _chainId, _name, _allowZeroAddress) -} - -// Resolve is a free data retrieval call binding the contract method 0x3eb6b8cf. -// -// Solidity: function resolve(uint64 _chainId, bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Resolve(_chainId uint64, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve(&_AssignmentHook.CallOpts, _chainId, _name, _allowZeroAddress) -} - -// Resolve0 is a free data retrieval call binding the contract method 0xa86f9d9e. -// -// Solidity: function resolve(bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Resolve0(opts *bind.CallOpts, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "resolve0", _name, _allowZeroAddress) - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Resolve0 is a free data retrieval call binding the contract method 0xa86f9d9e. -// -// Solidity: function resolve(bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookSession) Resolve0(_name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve0(&_AssignmentHook.CallOpts, _name, _allowZeroAddress) -} - -// Resolve0 is a free data retrieval call binding the contract method 0xa86f9d9e. -// -// Solidity: function resolve(bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Resolve0(_name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve0(&_AssignmentHook.CallOpts, _name, _allowZeroAddress) -} - -// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. -// -// Solidity: function acceptOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "acceptOwnership") -} - -// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. -// -// Solidity: function acceptOwnership() returns() -func (_AssignmentHook *AssignmentHookSession) AcceptOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.AcceptOwnership(&_AssignmentHook.TransactOpts) -} - -// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. -// -// Solidity: function acceptOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) AcceptOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.AcceptOwnership(&_AssignmentHook.TransactOpts) -} - -// Init is a paid mutator transaction binding the contract method 0xf09a4016. -// -// Solidity: function init(address _owner, address _addressManager) returns() -func (_AssignmentHook *AssignmentHookTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "init", _owner, _addressManager) -} - -// Init is a paid mutator transaction binding the contract method 0xf09a4016. -// -// Solidity: function init(address _owner, address _addressManager) returns() -func (_AssignmentHook *AssignmentHookSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.Init(&_AssignmentHook.TransactOpts, _owner, _addressManager) -} - -// Init is a paid mutator transaction binding the contract method 0xf09a4016. -// -// Solidity: function init(address _owner, address _addressManager) returns() -func (_AssignmentHook *AssignmentHookTransactorSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.Init(&_AssignmentHook.TransactOpts, _owner, _addressManager) -} - -// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. -// -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() -func (_AssignmentHook *AssignmentHookTransactor) OnBlockProposed(opts *bind.TransactOpts, _blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "onBlockProposed", _blk, _meta, _data) -} - -// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. -// -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() -func (_AssignmentHook *AssignmentHookSession) OnBlockProposed(_blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.OnBlockProposed(&_AssignmentHook.TransactOpts, _blk, _meta, _data) -} - -// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. -// -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() -func (_AssignmentHook *AssignmentHookTransactorSession) OnBlockProposed(_blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.OnBlockProposed(&_AssignmentHook.TransactOpts, _blk, _meta, _data) -} - -// Pause is a paid mutator transaction binding the contract method 0x8456cb59. -// -// Solidity: function pause() returns() -func (_AssignmentHook *AssignmentHookTransactor) Pause(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "pause") -} - -// Pause is a paid mutator transaction binding the contract method 0x8456cb59. -// -// Solidity: function pause() returns() -func (_AssignmentHook *AssignmentHookSession) Pause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Pause(&_AssignmentHook.TransactOpts) -} - -// Pause is a paid mutator transaction binding the contract method 0x8456cb59. -// -// Solidity: function pause() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) Pause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Pause(&_AssignmentHook.TransactOpts) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "renounceOwnership") -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_AssignmentHook *AssignmentHookSession) RenounceOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.RenounceOwnership(&_AssignmentHook.TransactOpts) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) RenounceOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.RenounceOwnership(&_AssignmentHook.TransactOpts) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_AssignmentHook *AssignmentHookTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "transferOwnership", newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_AssignmentHook *AssignmentHookSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.TransferOwnership(&_AssignmentHook.TransactOpts, newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_AssignmentHook *AssignmentHookTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.TransferOwnership(&_AssignmentHook.TransactOpts, newOwner) -} - -// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. -// -// Solidity: function unpause() returns() -func (_AssignmentHook *AssignmentHookTransactor) Unpause(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "unpause") -} - -// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. -// -// Solidity: function unpause() returns() -func (_AssignmentHook *AssignmentHookSession) Unpause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Unpause(&_AssignmentHook.TransactOpts) -} - -// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. -// -// Solidity: function unpause() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) Unpause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Unpause(&_AssignmentHook.TransactOpts) -} - -// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. -// -// Solidity: function upgradeTo(address newImplementation) returns() -func (_AssignmentHook *AssignmentHookTransactor) UpgradeTo(opts *bind.TransactOpts, newImplementation common.Address) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "upgradeTo", newImplementation) -} - -// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. -// -// Solidity: function upgradeTo(address newImplementation) returns() -func (_AssignmentHook *AssignmentHookSession) UpgradeTo(newImplementation common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeTo(&_AssignmentHook.TransactOpts, newImplementation) -} - -// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. -// -// Solidity: function upgradeTo(address newImplementation) returns() -func (_AssignmentHook *AssignmentHookTransactorSession) UpgradeTo(newImplementation common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeTo(&_AssignmentHook.TransactOpts, newImplementation) -} - -// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. -// -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_AssignmentHook *AssignmentHookTransactor) UpgradeToAndCall(opts *bind.TransactOpts, newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "upgradeToAndCall", newImplementation, data) -} - -// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. -// -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_AssignmentHook *AssignmentHookSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeToAndCall(&_AssignmentHook.TransactOpts, newImplementation, data) -} - -// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. -// -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_AssignmentHook *AssignmentHookTransactorSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeToAndCall(&_AssignmentHook.TransactOpts, newImplementation, data) -} - -// AssignmentHookAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the AssignmentHook contract. -type AssignmentHookAdminChangedIterator struct { - Event *AssignmentHookAdminChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookAdminChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookAdminChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookAdminChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookAdminChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookAdminChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookAdminChanged represents a AdminChanged event raised by the AssignmentHook contract. -type AssignmentHookAdminChanged struct { - PreviousAdmin common.Address - NewAdmin common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterAdminChanged is a free log retrieval operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. -// -// Solidity: event AdminChanged(address previousAdmin, address newAdmin) -func (_AssignmentHook *AssignmentHookFilterer) FilterAdminChanged(opts *bind.FilterOpts) (*AssignmentHookAdminChangedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "AdminChanged") - if err != nil { - return nil, err - } - return &AssignmentHookAdminChangedIterator{contract: _AssignmentHook.contract, event: "AdminChanged", logs: logs, sub: sub}, nil -} - -// WatchAdminChanged is a free log subscription operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. -// -// Solidity: event AdminChanged(address previousAdmin, address newAdmin) -func (_AssignmentHook *AssignmentHookFilterer) WatchAdminChanged(opts *bind.WatchOpts, sink chan<- *AssignmentHookAdminChanged) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "AdminChanged") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookAdminChanged) - if err := _AssignmentHook.contract.UnpackLog(event, "AdminChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseAdminChanged is a log parse operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. -// -// Solidity: event AdminChanged(address previousAdmin, address newAdmin) -func (_AssignmentHook *AssignmentHookFilterer) ParseAdminChanged(log types.Log) (*AssignmentHookAdminChanged, error) { - event := new(AssignmentHookAdminChanged) - if err := _AssignmentHook.contract.UnpackLog(event, "AdminChanged", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookBeaconUpgradedIterator is returned from FilterBeaconUpgraded and is used to iterate over the raw logs and unpacked data for BeaconUpgraded events raised by the AssignmentHook contract. -type AssignmentHookBeaconUpgradedIterator struct { - Event *AssignmentHookBeaconUpgraded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookBeaconUpgradedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookBeaconUpgraded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookBeaconUpgraded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookBeaconUpgradedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookBeaconUpgradedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookBeaconUpgraded represents a BeaconUpgraded event raised by the AssignmentHook contract. -type AssignmentHookBeaconUpgraded struct { - Beacon common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBeaconUpgraded is a free log retrieval operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. -// -// Solidity: event BeaconUpgraded(address indexed beacon) -func (_AssignmentHook *AssignmentHookFilterer) FilterBeaconUpgraded(opts *bind.FilterOpts, beacon []common.Address) (*AssignmentHookBeaconUpgradedIterator, error) { - - var beaconRule []interface{} - for _, beaconItem := range beacon { - beaconRule = append(beaconRule, beaconItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "BeaconUpgraded", beaconRule) - if err != nil { - return nil, err - } - return &AssignmentHookBeaconUpgradedIterator{contract: _AssignmentHook.contract, event: "BeaconUpgraded", logs: logs, sub: sub}, nil -} - -// WatchBeaconUpgraded is a free log subscription operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. -// -// Solidity: event BeaconUpgraded(address indexed beacon) -func (_AssignmentHook *AssignmentHookFilterer) WatchBeaconUpgraded(opts *bind.WatchOpts, sink chan<- *AssignmentHookBeaconUpgraded, beacon []common.Address) (event.Subscription, error) { - - var beaconRule []interface{} - for _, beaconItem := range beacon { - beaconRule = append(beaconRule, beaconItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "BeaconUpgraded", beaconRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookBeaconUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "BeaconUpgraded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseBeaconUpgraded is a log parse operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. -// -// Solidity: event BeaconUpgraded(address indexed beacon) -func (_AssignmentHook *AssignmentHookFilterer) ParseBeaconUpgraded(log types.Log) (*AssignmentHookBeaconUpgraded, error) { - event := new(AssignmentHookBeaconUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "BeaconUpgraded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookBlockAssignedIterator is returned from FilterBlockAssigned and is used to iterate over the raw logs and unpacked data for BlockAssigned events raised by the AssignmentHook contract. -type AssignmentHookBlockAssignedIterator struct { - Event *AssignmentHookBlockAssigned // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookBlockAssignedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookBlockAssigned) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookBlockAssigned) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookBlockAssignedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookBlockAssignedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookBlockAssigned represents a BlockAssigned event raised by the AssignmentHook contract. -type AssignmentHookBlockAssigned struct { - AssignedProver common.Address - Meta TaikoDataBlockMetadata - Assignment AssignmentHookProverAssignment - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBlockAssigned is a free log retrieval operation binding the contract event 0x983b2c64d5e49fdb74b580110b1c64f6f6572b114331e9fee6b7531627eaf0b1. -// -// Solidity: event BlockAssigned(address indexed assignedProver, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) assignment) -func (_AssignmentHook *AssignmentHookFilterer) FilterBlockAssigned(opts *bind.FilterOpts, assignedProver []common.Address) (*AssignmentHookBlockAssignedIterator, error) { - - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "BlockAssigned", assignedProverRule) - if err != nil { - return nil, err - } - return &AssignmentHookBlockAssignedIterator{contract: _AssignmentHook.contract, event: "BlockAssigned", logs: logs, sub: sub}, nil -} - -// WatchBlockAssigned is a free log subscription operation binding the contract event 0x983b2c64d5e49fdb74b580110b1c64f6f6572b114331e9fee6b7531627eaf0b1. -// -// Solidity: event BlockAssigned(address indexed assignedProver, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) assignment) -func (_AssignmentHook *AssignmentHookFilterer) WatchBlockAssigned(opts *bind.WatchOpts, sink chan<- *AssignmentHookBlockAssigned, assignedProver []common.Address) (event.Subscription, error) { - - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "BlockAssigned", assignedProverRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookBlockAssigned) - if err := _AssignmentHook.contract.UnpackLog(event, "BlockAssigned", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseBlockAssigned is a log parse operation binding the contract event 0x983b2c64d5e49fdb74b580110b1c64f6f6572b114331e9fee6b7531627eaf0b1. -// -// Solidity: event BlockAssigned(address indexed assignedProver, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) assignment) -func (_AssignmentHook *AssignmentHookFilterer) ParseBlockAssigned(log types.Log) (*AssignmentHookBlockAssigned, error) { - event := new(AssignmentHookBlockAssigned) - if err := _AssignmentHook.contract.UnpackLog(event, "BlockAssigned", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookEtherPaymentFailedIterator is returned from FilterEtherPaymentFailed and is used to iterate over the raw logs and unpacked data for EtherPaymentFailed events raised by the AssignmentHook contract. -type AssignmentHookEtherPaymentFailedIterator struct { - Event *AssignmentHookEtherPaymentFailed // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookEtherPaymentFailedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookEtherPaymentFailed) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookEtherPaymentFailed) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookEtherPaymentFailedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookEtherPaymentFailedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookEtherPaymentFailed represents a EtherPaymentFailed event raised by the AssignmentHook contract. -type AssignmentHookEtherPaymentFailed struct { - To common.Address - MaxGas *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterEtherPaymentFailed is a free log retrieval operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. -// -// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) -func (_AssignmentHook *AssignmentHookFilterer) FilterEtherPaymentFailed(opts *bind.FilterOpts) (*AssignmentHookEtherPaymentFailedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "EtherPaymentFailed") - if err != nil { - return nil, err - } - return &AssignmentHookEtherPaymentFailedIterator{contract: _AssignmentHook.contract, event: "EtherPaymentFailed", logs: logs, sub: sub}, nil -} - -// WatchEtherPaymentFailed is a free log subscription operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. -// -// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) -func (_AssignmentHook *AssignmentHookFilterer) WatchEtherPaymentFailed(opts *bind.WatchOpts, sink chan<- *AssignmentHookEtherPaymentFailed) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "EtherPaymentFailed") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookEtherPaymentFailed) - if err := _AssignmentHook.contract.UnpackLog(event, "EtherPaymentFailed", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseEtherPaymentFailed is a log parse operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. -// -// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) -func (_AssignmentHook *AssignmentHookFilterer) ParseEtherPaymentFailed(log types.Log) (*AssignmentHookEtherPaymentFailed, error) { - event := new(AssignmentHookEtherPaymentFailed) - if err := _AssignmentHook.contract.UnpackLog(event, "EtherPaymentFailed", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the AssignmentHook contract. -type AssignmentHookInitializedIterator struct { - Event *AssignmentHookInitialized // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookInitializedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookInitialized represents a Initialized event raised by the AssignmentHook contract. -type AssignmentHookInitialized struct { - Version uint8 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_AssignmentHook *AssignmentHookFilterer) FilterInitialized(opts *bind.FilterOpts) (*AssignmentHookInitializedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return &AssignmentHookInitializedIterator{contract: _AssignmentHook.contract, event: "Initialized", logs: logs, sub: sub}, nil -} - -// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_AssignmentHook *AssignmentHookFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *AssignmentHookInitialized) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookInitialized) - if err := _AssignmentHook.contract.UnpackLog(event, "Initialized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_AssignmentHook *AssignmentHookFilterer) ParseInitialized(log types.Log) (*AssignmentHookInitialized, error) { - event := new(AssignmentHookInitialized) - if err := _AssignmentHook.contract.UnpackLog(event, "Initialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookOwnershipTransferStartedIterator is returned from FilterOwnershipTransferStarted and is used to iterate over the raw logs and unpacked data for OwnershipTransferStarted events raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferStartedIterator struct { - Event *AssignmentHookOwnershipTransferStarted // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookOwnershipTransferStartedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookOwnershipTransferStarted) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookOwnershipTransferStarted) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookOwnershipTransferStartedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookOwnershipTransferStartedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookOwnershipTransferStarted represents a OwnershipTransferStarted event raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferStarted struct { - PreviousOwner common.Address - NewOwner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterOwnershipTransferStarted is a free log retrieval operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. -// -// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) FilterOwnershipTransferStarted(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*AssignmentHookOwnershipTransferStartedIterator, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return &AssignmentHookOwnershipTransferStartedIterator{contract: _AssignmentHook.contract, event: "OwnershipTransferStarted", logs: logs, sub: sub}, nil -} - -// WatchOwnershipTransferStarted is a free log subscription operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. -// -// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) WatchOwnershipTransferStarted(opts *bind.WatchOpts, sink chan<- *AssignmentHookOwnershipTransferStarted, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookOwnershipTransferStarted) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseOwnershipTransferStarted is a log parse operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. -// -// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) ParseOwnershipTransferStarted(log types.Log) (*AssignmentHookOwnershipTransferStarted, error) { - event := new(AssignmentHookOwnershipTransferStarted) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferredIterator struct { - Event *AssignmentHookOwnershipTransferred // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookOwnershipTransferredIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookOwnershipTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookOwnershipTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookOwnershipTransferredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookOwnershipTransferredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookOwnershipTransferred represents a OwnershipTransferred event raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferred struct { - PreviousOwner common.Address - NewOwner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*AssignmentHookOwnershipTransferredIterator, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return &AssignmentHookOwnershipTransferredIterator{contract: _AssignmentHook.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil -} - -// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *AssignmentHookOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookOwnershipTransferred) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) ParseOwnershipTransferred(log types.Log) (*AssignmentHookOwnershipTransferred, error) { - event := new(AssignmentHookOwnershipTransferred) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the AssignmentHook contract. -type AssignmentHookPausedIterator struct { - Event *AssignmentHookPaused // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookPausedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookPaused) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookPaused) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookPausedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookPausedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookPaused represents a Paused event raised by the AssignmentHook contract. -type AssignmentHookPaused struct { - Account common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPaused is a free log retrieval operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. -// -// Solidity: event Paused(address account) -func (_AssignmentHook *AssignmentHookFilterer) FilterPaused(opts *bind.FilterOpts) (*AssignmentHookPausedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Paused") - if err != nil { - return nil, err - } - return &AssignmentHookPausedIterator{contract: _AssignmentHook.contract, event: "Paused", logs: logs, sub: sub}, nil -} - -// WatchPaused is a free log subscription operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. -// -// Solidity: event Paused(address account) -func (_AssignmentHook *AssignmentHookFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *AssignmentHookPaused) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Paused") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookPaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Paused", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParsePaused is a log parse operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. -// -// Solidity: event Paused(address account) -func (_AssignmentHook *AssignmentHookFilterer) ParsePaused(log types.Log) (*AssignmentHookPaused, error) { - event := new(AssignmentHookPaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Paused", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the AssignmentHook contract. -type AssignmentHookUnpausedIterator struct { - Event *AssignmentHookUnpaused // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookUnpausedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookUnpaused) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookUnpaused) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookUnpausedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookUnpausedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookUnpaused represents a Unpaused event raised by the AssignmentHook contract. -type AssignmentHookUnpaused struct { - Account common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterUnpaused is a free log retrieval operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. -// -// Solidity: event Unpaused(address account) -func (_AssignmentHook *AssignmentHookFilterer) FilterUnpaused(opts *bind.FilterOpts) (*AssignmentHookUnpausedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Unpaused") - if err != nil { - return nil, err - } - return &AssignmentHookUnpausedIterator{contract: _AssignmentHook.contract, event: "Unpaused", logs: logs, sub: sub}, nil -} - -// WatchUnpaused is a free log subscription operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. -// -// Solidity: event Unpaused(address account) -func (_AssignmentHook *AssignmentHookFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *AssignmentHookUnpaused) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Unpaused") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookUnpaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Unpaused", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseUnpaused is a log parse operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. -// -// Solidity: event Unpaused(address account) -func (_AssignmentHook *AssignmentHookFilterer) ParseUnpaused(log types.Log) (*AssignmentHookUnpaused, error) { - event := new(AssignmentHookUnpaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Unpaused", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the AssignmentHook contract. -type AssignmentHookUpgradedIterator struct { - Event *AssignmentHookUpgraded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookUpgradedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookUpgraded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookUpgraded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookUpgradedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookUpgradedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookUpgraded represents a Upgraded event raised by the AssignmentHook contract. -type AssignmentHookUpgraded struct { - Implementation common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_AssignmentHook *AssignmentHookFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*AssignmentHookUpgradedIterator, error) { - - var implementationRule []interface{} - for _, implementationItem := range implementation { - implementationRule = append(implementationRule, implementationItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Upgraded", implementationRule) - if err != nil { - return nil, err - } - return &AssignmentHookUpgradedIterator{contract: _AssignmentHook.contract, event: "Upgraded", logs: logs, sub: sub}, nil -} - -// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_AssignmentHook *AssignmentHookFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *AssignmentHookUpgraded, implementation []common.Address) (event.Subscription, error) { - - var implementationRule []interface{} - for _, implementationItem := range implementation { - implementationRule = append(implementationRule, implementationItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Upgraded", implementationRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "Upgraded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_AssignmentHook *AssignmentHookFilterer) ParseUpgraded(log types.Log) (*AssignmentHookUpgraded, error) { - event := new(AssignmentHookUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "Upgraded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/packages/eventindexer/contracts/bridge/Bridge.go b/packages/eventindexer/contracts/bridge/Bridge.go index 6e31225296b..d674263b28d 100644 --- a/packages/eventindexer/contracts/bridge/Bridge.go +++ b/packages/eventindexer/contracts/bridge/Bridge.go @@ -31,9 +31,10 @@ var ( // BridgeProcessingStats is an auto generated low-level Go binding around an user-defined struct. type BridgeProcessingStats struct { - GasUsedInFeeCalc uint32 - ProofSize uint32 - NumCacheOps uint32 + GasUsedInFeeCalc uint32 + ProofSize uint32 + NumCacheOps uint32 + ProcessedByRelayer bool } // IBridgeContext is an auto generated low-level Go binding around an user-defined struct. @@ -60,7 +61,7 @@ type IBridgeMessage struct { // BridgeMetaData contains all meta data concerning the Bridge contract. var BridgeMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"context\",\"inputs\":[],\"outputs\":[{\"name\":\"ctx_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Context\",\"components\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"inputs\":[{\"name\":\"dataLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"hashMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"enabled_\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"destBridge_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageSent\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageStatus\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextMessageId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"status_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"},{\"name\":\"reason_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.StatusReason\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recallMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"retryMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_isLastAttempt\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"selfDelegate\",\"inputs\":[{\"name\":\"_anyToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"msgHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"inputs\":[{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageProcessed\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"stats\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structBridge.ProcessingStats\",\"components\":[{\"name\":\"gasUsedInFeeCalc\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"proofSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numCacheOps\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageStatusChanged\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIBridge.Status\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"context\",\"inputs\":[],\"outputs\":[{\"name\":\"ctx_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Context\",\"components\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"inputs\":[{\"name\":\"dataLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"hashMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_sharedAddressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"enabled_\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"destBridge_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageSent\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageStatus\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextMessageId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"status_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"},{\"name\":\"reason_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.StatusReason\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recallMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"retryMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_isLastAttempt\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"selfDelegate\",\"inputs\":[{\"name\":\"_anyToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"msgHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"inputs\":[{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageProcessed\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"stats\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structBridge.ProcessingStats\",\"components\":[{\"name\":\"gasUsedInFeeCalc\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"proofSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numCacheOps\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"processedByRelayer\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageStatusChanged\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIBridge.Status\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // BridgeABI is the input ABI used to generate the binding from. @@ -271,6 +272,37 @@ func (_Bridge *BridgeCallerSession) GASRESERVE() (uint32, error) { return _Bridge.Contract.GASRESERVE(&_Bridge.CallOpts) } +// RELAYERMAXPROOFBYTES is a free data retrieval call binding the contract method 0x422770fa. +// +// Solidity: function RELAYER_MAX_PROOF_BYTES() view returns(uint256) +func (_Bridge *BridgeCaller) RELAYERMAXPROOFBYTES(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Bridge.contract.Call(opts, &out, "RELAYER_MAX_PROOF_BYTES") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// RELAYERMAXPROOFBYTES is a free data retrieval call binding the contract method 0x422770fa. +// +// Solidity: function RELAYER_MAX_PROOF_BYTES() view returns(uint256) +func (_Bridge *BridgeSession) RELAYERMAXPROOFBYTES() (*big.Int, error) { + return _Bridge.Contract.RELAYERMAXPROOFBYTES(&_Bridge.CallOpts) +} + +// RELAYERMAXPROOFBYTES is a free data retrieval call binding the contract method 0x422770fa. +// +// Solidity: function RELAYER_MAX_PROOF_BYTES() view returns(uint256) +func (_Bridge *BridgeCallerSession) RELAYERMAXPROOFBYTES() (*big.Int, error) { + return _Bridge.Contract.RELAYERMAXPROOFBYTES(&_Bridge.CallOpts) +} + // AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. // // Solidity: function addressManager() view returns(address) @@ -949,23 +981,23 @@ func (_Bridge *BridgeTransactorSession) FailMessage(_message IBridgeMessage) (*t // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_Bridge *BridgeTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _Bridge.contract.Transact(opts, "init", _owner, _addressManager) +// Solidity: function init(address _owner, address _sharedAddressManager) returns() +func (_Bridge *BridgeTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _sharedAddressManager common.Address) (*types.Transaction, error) { + return _Bridge.contract.Transact(opts, "init", _owner, _sharedAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_Bridge *BridgeSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _Bridge.Contract.Init(&_Bridge.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _sharedAddressManager) returns() +func (_Bridge *BridgeSession) Init(_owner common.Address, _sharedAddressManager common.Address) (*types.Transaction, error) { + return _Bridge.Contract.Init(&_Bridge.TransactOpts, _owner, _sharedAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_Bridge *BridgeTransactorSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _Bridge.Contract.Init(&_Bridge.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _sharedAddressManager) returns() +func (_Bridge *BridgeTransactorSession) Init(_owner common.Address, _sharedAddressManager common.Address) (*types.Transaction, error) { + return _Bridge.Contract.Init(&_Bridge.TransactOpts, _owner, _sharedAddressManager) } // Init2 is a paid mutator transaction binding the contract method 0x069489a2. @@ -1220,27 +1252,6 @@ func (_Bridge *BridgeTransactorSession) UpgradeToAndCall(newImplementation commo return _Bridge.Contract.UpgradeToAndCall(&_Bridge.TransactOpts, newImplementation, data) } -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_Bridge *BridgeTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Bridge.contract.RawTransact(opts, nil) // calldata is disallowed for receive function -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_Bridge *BridgeSession) Receive() (*types.Transaction, error) { - return _Bridge.Contract.Receive(&_Bridge.TransactOpts) -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_Bridge *BridgeTransactorSession) Receive() (*types.Transaction, error) { - return _Bridge.Contract.Receive(&_Bridge.TransactOpts) -} - // BridgeAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the Bridge contract. type BridgeAdminChangedIterator struct { Event *BridgeAdminChanged // Event containing the contract specifics and raw log @@ -1729,9 +1740,9 @@ type BridgeMessageProcessed struct { Raw types.Log // Blockchain specific contextual infos } -// FilterMessageProcessed is a free log retrieval operation binding the contract event 0xdaa934be05606f60ac49cd6e2ca4fbb3a5c15680dd3304880ea6abb590486e3d. +// FilterMessageProcessed is a free log retrieval operation binding the contract event 0x8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d. // -// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32) stats) +// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32,bool) stats) func (_Bridge *BridgeFilterer) FilterMessageProcessed(opts *bind.FilterOpts, msgHash [][32]byte) (*BridgeMessageProcessedIterator, error) { var msgHashRule []interface{} @@ -1746,9 +1757,9 @@ func (_Bridge *BridgeFilterer) FilterMessageProcessed(opts *bind.FilterOpts, msg return &BridgeMessageProcessedIterator{contract: _Bridge.contract, event: "MessageProcessed", logs: logs, sub: sub}, nil } -// WatchMessageProcessed is a free log subscription operation binding the contract event 0xdaa934be05606f60ac49cd6e2ca4fbb3a5c15680dd3304880ea6abb590486e3d. +// WatchMessageProcessed is a free log subscription operation binding the contract event 0x8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d. // -// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32) stats) +// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32,bool) stats) func (_Bridge *BridgeFilterer) WatchMessageProcessed(opts *bind.WatchOpts, sink chan<- *BridgeMessageProcessed, msgHash [][32]byte) (event.Subscription, error) { var msgHashRule []interface{} @@ -1788,9 +1799,9 @@ func (_Bridge *BridgeFilterer) WatchMessageProcessed(opts *bind.WatchOpts, sink }), nil } -// ParseMessageProcessed is a log parse operation binding the contract event 0xdaa934be05606f60ac49cd6e2ca4fbb3a5c15680dd3304880ea6abb590486e3d. +// ParseMessageProcessed is a log parse operation binding the contract event 0x8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d. // -// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32) stats) +// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32,bool) stats) func (_Bridge *BridgeFilterer) ParseMessageProcessed(log types.Log) (*BridgeMessageProcessed, error) { event := new(BridgeMessageProcessed) if err := _Bridge.contract.UnpackLog(event, "MessageProcessed", log); err != nil { diff --git a/packages/eventindexer/contracts/erc721/abi.go b/packages/eventindexer/contracts/erc721/abi.go new file mode 100644 index 00000000000..02523857c28 --- /dev/null +++ b/packages/eventindexer/contracts/erc721/abi.go @@ -0,0 +1,39 @@ +package erc721 + +var ( + ABI = `[ + { + "constant":true, + "inputs":[ + { + "name":"_tokenId", + "type":"uint256" + } + ], + "name":"tokenURI", + "outputs":[ + { + "name":"", + "type":"string" + } + ], + "payable":false, + "stateMutability":"view", + "type":"function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ]` +) diff --git a/packages/eventindexer/contracts/sgxverifier/SgxVerifier.go b/packages/eventindexer/contracts/sgxverifier/SgxVerifier.go index 1e63f0022d1..14b110d3450 100644 --- a/packages/eventindexer/contracts/sgxverifier/SgxVerifier.go +++ b/packages/eventindexer/contracts/sgxverifier/SgxVerifier.go @@ -40,6 +40,18 @@ type IVerifierContext struct { MsgSender common.Address } +// IVerifierContextV2 is an auto generated low-level Go binding around an user-defined struct. +type IVerifierContextV2 struct { + MetaHash [32]byte + BlobHash [32]byte + Prover common.Address + BlockId uint64 + IsContesting bool + BlobUsed bool + MsgSender common.Address + Tran TaikoDataTransition +} + // TaikoDataTierProof is an auto generated low-level Go binding around an user-defined struct. type TaikoDataTierProof struct { Tier uint16 @@ -113,7 +125,7 @@ type V3StructQEAuthData struct { // SgxVerifierMetaData contains all meta data concerning the SgxVerifier contract. var SgxVerifierMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addInstances\",\"inputs\":[{\"name\":\"_instances\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addressRegistered\",\"inputs\":[{\"name\":\"instanceAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"alreadyAttested\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteInstances\",\"inputs\":[{\"name\":\"_ids\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"instances\",\"inputs\":[{\"name\":\"instanceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerInstance\",\"inputs\":[{\"name\":\"_attestation\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ParsedV3QuoteStruct\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.Header\",\"components\":[{\"name\":\"version\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"attestationKeyType\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"teeType\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"qeSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"pceSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"qeVendorId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"userData\",\"type\":\"bytes20\",\"internalType\":\"bytes20\"}]},{\"name\":\"localEnclaveReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"v3AuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ECDSAQuoteV3AuthData\",\"components\":[{\"name\":\"ecdsa256BitSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"ecdsaAttestationKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"pckSignedQeReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"qeReportSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"qeAuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.QEAuthData\",\"components\":[{\"name\":\"parsedDataSize\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"certification\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.CertificationData\",\"components\":[{\"name\":\"certType\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"certDataSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"decodedCertDataArray\",\"type\":\"bytes[3]\",\"internalType\":\"bytes[3]\"}]}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyProof\",\"inputs\":[{\"name\":\"_ctx\",\"type\":\"tuple\",\"internalType\":\"structIVerifier.Context\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceAdded\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"replaced\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceDeleted\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addInstances\",\"inputs\":[{\"name\":\"_instances\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addressRegistered\",\"inputs\":[{\"name\":\"instanceAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"alreadyAttested\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteInstances\",\"inputs\":[{\"name\":\"_ids\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"instances\",\"inputs\":[{\"name\":\"instanceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerInstance\",\"inputs\":[{\"name\":\"_attestation\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ParsedV3QuoteStruct\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.Header\",\"components\":[{\"name\":\"version\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"attestationKeyType\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"teeType\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"qeSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"pceSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"qeVendorId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"userData\",\"type\":\"bytes20\",\"internalType\":\"bytes20\"}]},{\"name\":\"localEnclaveReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"v3AuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ECDSAQuoteV3AuthData\",\"components\":[{\"name\":\"ecdsa256BitSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"ecdsaAttestationKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"pckSignedQeReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"qeReportSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"qeAuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.QEAuthData\",\"components\":[{\"name\":\"parsedDataSize\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"certification\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.CertificationData\",\"components\":[{\"name\":\"certType\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"certDataSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"decodedCertDataArray\",\"type\":\"bytes[3]\",\"internalType\":\"bytes[3]\"}]}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBatchProof\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIVerifier.ContextV2[]\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyProof\",\"inputs\":[{\"name\":\"_ctx\",\"type\":\"tuple\",\"internalType\":\"structIVerifier.Context\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceAdded\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"replaced\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceDeleted\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // SgxVerifierABI is the input ABI used to generate the binding from. @@ -741,6 +753,35 @@ func (_SgxVerifier *SgxVerifierCallerSession) Resolve0(_name [32]byte, _allowZer return _SgxVerifier.Contract.Resolve0(&_SgxVerifier.CallOpts, _name, _allowZeroAddress) } +// VerifyBatchProof is a free data retrieval call binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] , (uint16,bytes) ) view returns() +func (_SgxVerifier *SgxVerifierCaller) VerifyBatchProof(opts *bind.CallOpts, arg0 []IVerifierContextV2, arg1 TaikoDataTierProof) error { + var out []interface{} + err := _SgxVerifier.contract.Call(opts, &out, "verifyBatchProof", arg0, arg1) + + if err != nil { + return err + } + + return err + +} + +// VerifyBatchProof is a free data retrieval call binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] , (uint16,bytes) ) view returns() +func (_SgxVerifier *SgxVerifierSession) VerifyBatchProof(arg0 []IVerifierContextV2, arg1 TaikoDataTierProof) error { + return _SgxVerifier.Contract.VerifyBatchProof(&_SgxVerifier.CallOpts, arg0, arg1) +} + +// VerifyBatchProof is a free data retrieval call binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] , (uint16,bytes) ) view returns() +func (_SgxVerifier *SgxVerifierCallerSession) VerifyBatchProof(arg0 []IVerifierContextV2, arg1 TaikoDataTierProof) error { + return _SgxVerifier.Contract.VerifyBatchProof(&_SgxVerifier.CallOpts, arg0, arg1) +} + // AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. // // Solidity: function acceptOwnership() returns() @@ -806,23 +847,23 @@ func (_SgxVerifier *SgxVerifierTransactorSession) DeleteInstances(_ids []*big.In // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_SgxVerifier *SgxVerifierTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _SgxVerifier.contract.Transact(opts, "init", _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_SgxVerifier *SgxVerifierTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _SgxVerifier.contract.Transact(opts, "init", _owner, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_SgxVerifier *SgxVerifierSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_SgxVerifier *SgxVerifierSession) Init(_owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_SgxVerifier *SgxVerifierTransactorSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_SgxVerifier *SgxVerifierTransactorSession) Init(_owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _rollupAddressManager) } // Pause is a paid mutator transaction binding the contract method 0x8456cb59. diff --git a/packages/eventindexer/contracts/taikol1/TaikoL1.go b/packages/eventindexer/contracts/taikol1/TaikoL1.go index 6aa08ced8a5..c0212e5e1f8 100644 --- a/packages/eventindexer/contracts/taikol1/TaikoL1.go +++ b/packages/eventindexer/contracts/taikol1/TaikoL1.go @@ -29,6 +29,15 @@ var ( _ = abi.ConvertType ) +// LibSharedDataBaseFeeConfig is an auto generated low-level Go binding around an user-defined struct. +type LibSharedDataBaseFeeConfig struct { + AdjustmentQuotient uint8 + SharingPctg uint8 + GasIssuancePerSecond uint32 + MinGasExcess uint64 + MaxGasIssuancePerBlock uint32 +} + // TaikoDataBlock is an auto generated low-level Go binding around an user-defined struct. type TaikoDataBlock struct { MetaHash [32]byte @@ -59,15 +68,55 @@ type TaikoDataBlockMetadata struct { Sender common.Address } +// TaikoDataBlockMetadataV2 is an auto generated low-level Go binding around an user-defined struct. +type TaikoDataBlockMetadataV2 struct { + AnchorBlockHash [32]byte + Difficulty [32]byte + BlobHash [32]byte + ExtraData [32]byte + Coinbase common.Address + Id uint64 + GasLimit uint32 + Timestamp uint64 + AnchorBlockId uint64 + MinTier uint16 + BlobUsed bool + ParentMetaHash [32]byte + Proposer common.Address + LivenessBond *big.Int + ProposedAt uint64 + ProposedIn uint64 + BlobTxListOffset uint32 + BlobTxListLength uint32 + BlobIndex uint8 + BaseFeeConfig LibSharedDataBaseFeeConfig +} + +// TaikoDataBlockV2 is an auto generated low-level Go binding around an user-defined struct. +type TaikoDataBlockV2 struct { + MetaHash [32]byte + AssignedProver common.Address + LivenessBond *big.Int + BlockId uint64 + ProposedAt uint64 + ProposedIn uint64 + NextTransitionId *big.Int + LivenessBondReturned bool + VerifiedTransitionId *big.Int +} + // TaikoDataConfig is an auto generated low-level Go binding around an user-defined struct. type TaikoDataConfig struct { - ChainId uint64 - BlockMaxProposals uint64 - BlockRingBufferSize uint64 - MaxBlocksToVerifyPerProposal uint64 - BlockMaxGasLimit uint32 - LivenessBond *big.Int - BlockSyncThreshold uint8 + ChainId uint64 + BlockMaxProposals uint64 + BlockRingBufferSize uint64 + MaxBlocksToVerify uint64 + BlockMaxGasLimit uint32 + LivenessBond *big.Int + StateRootSyncInternal uint8 + MaxAnchorHeightOffset uint64 + BaseFeeConfig LibSharedDataBaseFeeConfig + OntakeForkHeight uint64 } // TaikoDataEthDeposit is an auto generated low-level Go binding around an user-defined struct. @@ -120,7 +169,7 @@ type TaikoDataTransitionState struct { // TaikoL1MetaData contains all meta data concerning the TaikoL1 contract. var TaikoL1MetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerifyPerProposal\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockSyncThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_tid\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_toPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resetGenesisHash\",\"inputs\":[{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slotA\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slotB\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"inputs\":[{\"name\":\"_user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositBond\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockV2\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockV2\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"livenessBondReturned\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint24\",\"internalType\":\"uint24\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"stateRootSyncInternal\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"maxAnchorHeightOffset\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"ontakeForkHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"blockId_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"verifiedAt_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"blockId_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"verifiedAt_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_tid\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransitions\",\"inputs\":[{\"name\":\"_blockIds\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"_tids\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TransitionState[]\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransitions\",\"inputs\":[{\"name\":\"_blockIds\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"_parentHashes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TransitionState[]\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"prover_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_toPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proposeBlockV2\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proposeBlocksV2\",\"inputs\":[{\"name\":\"_paramsArr\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_txListArr\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[{\"name\":\"metaArr_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.BlockMetadataV2[]\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proveBlocks\",\"inputs\":[{\"name\":\"_blockIds\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"_inputs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_batchProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawBond\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerifiedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerifiedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondCredited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDebited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CalldataTxList\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"txList\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContestedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProvedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_FORK_ERROR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // TaikoL1ABI is the input ABI used to generate the binding from. @@ -300,6 +349,37 @@ func (_TaikoL1 *TaikoL1CallerSession) AddressManager() (common.Address, error) { return _TaikoL1.Contract.AddressManager(&_TaikoL1.CallOpts) } +// BondBalanceOf is a free data retrieval call binding the contract method 0xa9c2c835. +// +// Solidity: function bondBalanceOf(address _user) view returns(uint256) +func (_TaikoL1 *TaikoL1Caller) BondBalanceOf(opts *bind.CallOpts, _user common.Address) (*big.Int, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "bondBalanceOf", _user) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BondBalanceOf is a free data retrieval call binding the contract method 0xa9c2c835. +// +// Solidity: function bondBalanceOf(address _user) view returns(uint256) +func (_TaikoL1 *TaikoL1Session) BondBalanceOf(_user common.Address) (*big.Int, error) { + return _TaikoL1.Contract.BondBalanceOf(&_TaikoL1.CallOpts, _user) +} + +// BondBalanceOf is a free data retrieval call binding the contract method 0xa9c2c835. +// +// Solidity: function bondBalanceOf(address _user) view returns(uint256) +func (_TaikoL1 *TaikoL1CallerSession) BondBalanceOf(_user common.Address) (*big.Int, error) { + return _TaikoL1.Contract.BondBalanceOf(&_TaikoL1.CallOpts, _user) +} + // GetBlock is a free data retrieval call binding the contract method 0x5fa15e79. // // Solidity: function getBlock(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) blk_) @@ -331,9 +411,40 @@ func (_TaikoL1 *TaikoL1CallerSession) GetBlock(_blockId uint64) (TaikoDataBlock, return _TaikoL1.Contract.GetBlock(&_TaikoL1.CallOpts, _blockId) } +// GetBlockV2 is a free data retrieval call binding the contract method 0x3f0c544a. +// +// Solidity: function getBlockV2(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint24,bool,uint24) blk_) +func (_TaikoL1 *TaikoL1Caller) GetBlockV2(opts *bind.CallOpts, _blockId uint64) (TaikoDataBlockV2, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getBlockV2", _blockId) + + if err != nil { + return *new(TaikoDataBlockV2), err + } + + out0 := *abi.ConvertType(out[0], new(TaikoDataBlockV2)).(*TaikoDataBlockV2) + + return out0, err + +} + +// GetBlockV2 is a free data retrieval call binding the contract method 0x3f0c544a. +// +// Solidity: function getBlockV2(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint24,bool,uint24) blk_) +func (_TaikoL1 *TaikoL1Session) GetBlockV2(_blockId uint64) (TaikoDataBlockV2, error) { + return _TaikoL1.Contract.GetBlockV2(&_TaikoL1.CallOpts, _blockId) +} + +// GetBlockV2 is a free data retrieval call binding the contract method 0x3f0c544a. +// +// Solidity: function getBlockV2(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint24,bool,uint24) blk_) +func (_TaikoL1 *TaikoL1CallerSession) GetBlockV2(_blockId uint64) (TaikoDataBlockV2, error) { + return _TaikoL1.Contract.GetBlockV2(&_TaikoL1.CallOpts, _blockId) +} + // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,uint64,(uint8,uint8,uint32,uint64,uint32),uint64)) func (_TaikoL1 *TaikoL1Caller) GetConfig(opts *bind.CallOpts) (TaikoDataConfig, error) { var out []interface{} err := _TaikoL1.contract.Call(opts, &out, "getConfig") @@ -350,18 +461,128 @@ func (_TaikoL1 *TaikoL1Caller) GetConfig(opts *bind.CallOpts) (TaikoDataConfig, // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,uint64,(uint8,uint8,uint32,uint64,uint32),uint64)) func (_TaikoL1 *TaikoL1Session) GetConfig() (TaikoDataConfig, error) { return _TaikoL1.Contract.GetConfig(&_TaikoL1.CallOpts) } // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,uint64,(uint8,uint8,uint32,uint64,uint32),uint64)) func (_TaikoL1 *TaikoL1CallerSession) GetConfig() (TaikoDataConfig, error) { return _TaikoL1.Contract.GetConfig(&_TaikoL1.CallOpts) } +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1 *TaikoL1Caller) GetLastSyncedBlock(opts *bind.CallOpts) (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getLastSyncedBlock") + + outstruct := new(struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 + }) + if err != nil { + return *outstruct, err + } + + outstruct.BlockId = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.BlockHash = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.StateRoot = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) + outstruct.VerifiedAt = *abi.ConvertType(out[3], new(uint64)).(*uint64) + + return *outstruct, err + +} + +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1 *TaikoL1Session) GetLastSyncedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1.Contract.GetLastSyncedBlock(&_TaikoL1.CallOpts) +} + +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1 *TaikoL1CallerSession) GetLastSyncedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1.Contract.GetLastSyncedBlock(&_TaikoL1.CallOpts) +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1 *TaikoL1Caller) GetLastVerifiedBlock(opts *bind.CallOpts) (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getLastVerifiedBlock") + + outstruct := new(struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 + }) + if err != nil { + return *outstruct, err + } + + outstruct.BlockId = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.BlockHash = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.StateRoot = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) + outstruct.VerifiedAt = *abi.ConvertType(out[3], new(uint64)).(*uint64) + + return *outstruct, err + +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1 *TaikoL1Session) GetLastVerifiedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1.Contract.GetLastVerifiedBlock(&_TaikoL1.CallOpts) +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1 *TaikoL1CallerSession) GetLastVerifiedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1.Contract.GetLastVerifiedBlock(&_TaikoL1.CallOpts) +} + // GetStateVariables is a free data retrieval call binding the contract method 0xdde89cf5. // // Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint8,uint16,uint32,uint64)) @@ -456,6 +677,99 @@ func (_TaikoL1 *TaikoL1CallerSession) GetTransition0(_blockId uint64, _parentHas return _TaikoL1.Contract.GetTransition0(&_TaikoL1.CallOpts, _blockId, _parentHash) } +// GetTransitions is a free data retrieval call binding the contract method 0xaf2ba709. +// +// Solidity: function getTransitions(uint64[] _blockIds, uint32[] _tids) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1 *TaikoL1Caller) GetTransitions(opts *bind.CallOpts, _blockIds []uint64, _tids []uint32) ([]TaikoDataTransitionState, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getTransitions", _blockIds, _tids) + + if err != nil { + return *new([]TaikoDataTransitionState), err + } + + out0 := *abi.ConvertType(out[0], new([]TaikoDataTransitionState)).(*[]TaikoDataTransitionState) + + return out0, err + +} + +// GetTransitions is a free data retrieval call binding the contract method 0xaf2ba709. +// +// Solidity: function getTransitions(uint64[] _blockIds, uint32[] _tids) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1 *TaikoL1Session) GetTransitions(_blockIds []uint64, _tids []uint32) ([]TaikoDataTransitionState, error) { + return _TaikoL1.Contract.GetTransitions(&_TaikoL1.CallOpts, _blockIds, _tids) +} + +// GetTransitions is a free data retrieval call binding the contract method 0xaf2ba709. +// +// Solidity: function getTransitions(uint64[] _blockIds, uint32[] _tids) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1 *TaikoL1CallerSession) GetTransitions(_blockIds []uint64, _tids []uint32) ([]TaikoDataTransitionState, error) { + return _TaikoL1.Contract.GetTransitions(&_TaikoL1.CallOpts, _blockIds, _tids) +} + +// GetTransitions0 is a free data retrieval call binding the contract method 0xb89c61bc. +// +// Solidity: function getTransitions(uint64[] _blockIds, bytes32[] _parentHashes) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1 *TaikoL1Caller) GetTransitions0(opts *bind.CallOpts, _blockIds []uint64, _parentHashes [][32]byte) ([]TaikoDataTransitionState, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getTransitions0", _blockIds, _parentHashes) + + if err != nil { + return *new([]TaikoDataTransitionState), err + } + + out0 := *abi.ConvertType(out[0], new([]TaikoDataTransitionState)).(*[]TaikoDataTransitionState) + + return out0, err + +} + +// GetTransitions0 is a free data retrieval call binding the contract method 0xb89c61bc. +// +// Solidity: function getTransitions(uint64[] _blockIds, bytes32[] _parentHashes) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1 *TaikoL1Session) GetTransitions0(_blockIds []uint64, _parentHashes [][32]byte) ([]TaikoDataTransitionState, error) { + return _TaikoL1.Contract.GetTransitions0(&_TaikoL1.CallOpts, _blockIds, _parentHashes) +} + +// GetTransitions0 is a free data retrieval call binding the contract method 0xb89c61bc. +// +// Solidity: function getTransitions(uint64[] _blockIds, bytes32[] _parentHashes) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1 *TaikoL1CallerSession) GetTransitions0(_blockIds []uint64, _parentHashes [][32]byte) ([]TaikoDataTransitionState, error) { + return _TaikoL1.Contract.GetTransitions0(&_TaikoL1.CallOpts, _blockIds, _parentHashes) +} + +// GetVerifiedBlockProver is a free data retrieval call binding the contract method 0x6074b8c1. +// +// Solidity: function getVerifiedBlockProver(uint64 _blockId) view returns(address prover_) +func (_TaikoL1 *TaikoL1Caller) GetVerifiedBlockProver(opts *bind.CallOpts, _blockId uint64) (common.Address, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getVerifiedBlockProver", _blockId) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetVerifiedBlockProver is a free data retrieval call binding the contract method 0x6074b8c1. +// +// Solidity: function getVerifiedBlockProver(uint64 _blockId) view returns(address prover_) +func (_TaikoL1 *TaikoL1Session) GetVerifiedBlockProver(_blockId uint64) (common.Address, error) { + return _TaikoL1.Contract.GetVerifiedBlockProver(&_TaikoL1.CallOpts, _blockId) +} + +// GetVerifiedBlockProver is a free data retrieval call binding the contract method 0x6074b8c1. +// +// Solidity: function getVerifiedBlockProver(uint64 _blockId) view returns(address prover_) +func (_TaikoL1 *TaikoL1CallerSession) GetVerifiedBlockProver(_blockId uint64) (common.Address, error) { + return _TaikoL1.Contract.GetVerifiedBlockProver(&_TaikoL1.CallOpts, _blockId) +} + // Impl is a free data retrieval call binding the contract method 0x8abf6077. // // Solidity: function impl() view returns(address) @@ -735,68 +1049,6 @@ func (_TaikoL1 *TaikoL1CallerSession) Resolve0(_name [32]byte, _allowZeroAddress return _TaikoL1.Contract.Resolve0(&_TaikoL1.CallOpts, _name, _allowZeroAddress) } -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1 *TaikoL1Caller) SlotA(opts *bind.CallOpts) (TaikoDataSlotA, error) { - var out []interface{} - err := _TaikoL1.contract.Call(opts, &out, "slotA") - - if err != nil { - return *new(TaikoDataSlotA), err - } - - out0 := *abi.ConvertType(out[0], new(TaikoDataSlotA)).(*TaikoDataSlotA) - - return out0, err - -} - -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1 *TaikoL1Session) SlotA() (TaikoDataSlotA, error) { - return _TaikoL1.Contract.SlotA(&_TaikoL1.CallOpts) -} - -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1 *TaikoL1CallerSession) SlotA() (TaikoDataSlotA, error) { - return _TaikoL1.Contract.SlotA(&_TaikoL1.CallOpts) -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1 *TaikoL1Caller) SlotB(opts *bind.CallOpts) (TaikoDataSlotB, error) { - var out []interface{} - err := _TaikoL1.contract.Call(opts, &out, "slotB") - - if err != nil { - return *new(TaikoDataSlotB), err - } - - out0 := *abi.ConvertType(out[0], new(TaikoDataSlotB)).(*TaikoDataSlotB) - - return out0, err - -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1 *TaikoL1Session) SlotB() (TaikoDataSlotB, error) { - return _TaikoL1.Contract.SlotB(&_TaikoL1.CallOpts) -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1 *TaikoL1CallerSession) SlotB() (TaikoDataSlotB, error) { - return _TaikoL1.Contract.SlotB(&_TaikoL1.CallOpts) -} - // State is a free data retrieval call binding the contract method 0xc19d93fb. // // Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) @@ -868,25 +1120,46 @@ func (_TaikoL1 *TaikoL1TransactorSession) AcceptOwnership() (*types.Transaction, return _TaikoL1.Contract.AcceptOwnership(&_TaikoL1.TransactOpts) } +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) returns() +func (_TaikoL1 *TaikoL1Transactor) DepositBond(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _TaikoL1.contract.Transact(opts, "depositBond", _amount) +} + +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) returns() +func (_TaikoL1 *TaikoL1Session) DepositBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1.Contract.DepositBond(&_TaikoL1.TransactOpts, _amount) +} + +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) returns() +func (_TaikoL1 *TaikoL1TransactorSession) DepositBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1.Contract.DepositBond(&_TaikoL1.TransactOpts, _amount) +} + // Init is a paid mutator transaction binding the contract method 0x29d1b62f. // -// Solidity: function init(address _owner, address _addressManager, bytes32 _genesisBlockHash, bool _toPause) returns() -func (_TaikoL1 *TaikoL1Transactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { - return _TaikoL1.contract.Transact(opts, "init", _owner, _addressManager, _genesisBlockHash, _toPause) +// Solidity: function init(address _owner, address _rollupAddressManager, bytes32 _genesisBlockHash, bool _toPause) returns() +func (_TaikoL1 *TaikoL1Transactor) Init(opts *bind.TransactOpts, _owner common.Address, _rollupAddressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { + return _TaikoL1.contract.Transact(opts, "init", _owner, _rollupAddressManager, _genesisBlockHash, _toPause) } // Init is a paid mutator transaction binding the contract method 0x29d1b62f. // -// Solidity: function init(address _owner, address _addressManager, bytes32 _genesisBlockHash, bool _toPause) returns() -func (_TaikoL1 *TaikoL1Session) Init(_owner common.Address, _addressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { - return _TaikoL1.Contract.Init(&_TaikoL1.TransactOpts, _owner, _addressManager, _genesisBlockHash, _toPause) +// Solidity: function init(address _owner, address _rollupAddressManager, bytes32 _genesisBlockHash, bool _toPause) returns() +func (_TaikoL1 *TaikoL1Session) Init(_owner common.Address, _rollupAddressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { + return _TaikoL1.Contract.Init(&_TaikoL1.TransactOpts, _owner, _rollupAddressManager, _genesisBlockHash, _toPause) } // Init is a paid mutator transaction binding the contract method 0x29d1b62f. // -// Solidity: function init(address _owner, address _addressManager, bytes32 _genesisBlockHash, bool _toPause) returns() -func (_TaikoL1 *TaikoL1TransactorSession) Init(_owner common.Address, _addressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { - return _TaikoL1.Contract.Init(&_TaikoL1.TransactOpts, _owner, _addressManager, _genesisBlockHash, _toPause) +// Solidity: function init(address _owner, address _rollupAddressManager, bytes32 _genesisBlockHash, bool _toPause) returns() +func (_TaikoL1 *TaikoL1TransactorSession) Init(_owner common.Address, _rollupAddressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { + return _TaikoL1.Contract.Init(&_TaikoL1.TransactOpts, _owner, _rollupAddressManager, _genesisBlockHash, _toPause) } // Init2 is a paid mutator transaction binding the contract method 0x069489a2. @@ -973,6 +1246,48 @@ func (_TaikoL1 *TaikoL1TransactorSession) ProposeBlock(_params []byte, _txList [ return _TaikoL1.Contract.ProposeBlock(&_TaikoL1.TransactOpts, _params, _txList) } +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta_) +func (_TaikoL1 *TaikoL1Transactor) ProposeBlockV2(opts *bind.TransactOpts, _params []byte, _txList []byte) (*types.Transaction, error) { + return _TaikoL1.contract.Transact(opts, "proposeBlockV2", _params, _txList) +} + +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta_) +func (_TaikoL1 *TaikoL1Session) ProposeBlockV2(_params []byte, _txList []byte) (*types.Transaction, error) { + return _TaikoL1.Contract.ProposeBlockV2(&_TaikoL1.TransactOpts, _params, _txList) +} + +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta_) +func (_TaikoL1 *TaikoL1TransactorSession) ProposeBlockV2(_params []byte, _txList []byte) (*types.Transaction, error) { + return _TaikoL1.Contract.ProposeBlockV2(&_TaikoL1.TransactOpts, _params, _txList) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32))[] metaArr_) +func (_TaikoL1 *TaikoL1Transactor) ProposeBlocksV2(opts *bind.TransactOpts, _paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _TaikoL1.contract.Transact(opts, "proposeBlocksV2", _paramsArr, _txListArr) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32))[] metaArr_) +func (_TaikoL1 *TaikoL1Session) ProposeBlocksV2(_paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _TaikoL1.Contract.ProposeBlocksV2(&_TaikoL1.TransactOpts, _paramsArr, _txListArr) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32))[] metaArr_) +func (_TaikoL1 *TaikoL1TransactorSession) ProposeBlocksV2(_paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _TaikoL1.Contract.ProposeBlocksV2(&_TaikoL1.TransactOpts, _paramsArr, _txListArr) +} + // ProveBlock is a paid mutator transaction binding the contract method 0x10d008bd. // // Solidity: function proveBlock(uint64 _blockId, bytes _input) returns() @@ -994,6 +1309,27 @@ func (_TaikoL1 *TaikoL1TransactorSession) ProveBlock(_blockId uint64, _input []b return _TaikoL1.Contract.ProveBlock(&_TaikoL1.TransactOpts, _blockId, _input) } +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockIds, bytes[] _inputs, bytes _batchProof) returns() +func (_TaikoL1 *TaikoL1Transactor) ProveBlocks(opts *bind.TransactOpts, _blockIds []uint64, _inputs [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _TaikoL1.contract.Transact(opts, "proveBlocks", _blockIds, _inputs, _batchProof) +} + +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockIds, bytes[] _inputs, bytes _batchProof) returns() +func (_TaikoL1 *TaikoL1Session) ProveBlocks(_blockIds []uint64, _inputs [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _TaikoL1.Contract.ProveBlocks(&_TaikoL1.TransactOpts, _blockIds, _inputs, _batchProof) +} + +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockIds, bytes[] _inputs, bytes _batchProof) returns() +func (_TaikoL1 *TaikoL1TransactorSession) ProveBlocks(_blockIds []uint64, _inputs [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _TaikoL1.Contract.ProveBlocks(&_TaikoL1.TransactOpts, _blockIds, _inputs, _batchProof) +} + // RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. // // Solidity: function renounceOwnership() returns() @@ -1015,27 +1351,6 @@ func (_TaikoL1 *TaikoL1TransactorSession) RenounceOwnership() (*types.Transactio return _TaikoL1.Contract.RenounceOwnership(&_TaikoL1.TransactOpts) } -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1 *TaikoL1Transactor) ResetGenesisHash(opts *bind.TransactOpts, _genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1.contract.Transact(opts, "resetGenesisHash", _genesisBlockHash) -} - -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1 *TaikoL1Session) ResetGenesisHash(_genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1.Contract.ResetGenesisHash(&_TaikoL1.TransactOpts, _genesisBlockHash) -} - -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1 *TaikoL1TransactorSession) ResetGenesisHash(_genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1.Contract.ResetGenesisHash(&_TaikoL1.TransactOpts, _genesisBlockHash) -} - // TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. // // Solidity: function transferOwnership(address newOwner) returns() @@ -1141,25 +1456,25 @@ func (_TaikoL1 *TaikoL1TransactorSession) VerifyBlocks(_maxBlocksToVerify uint64 return _TaikoL1.Contract.VerifyBlocks(&_TaikoL1.TransactOpts, _maxBlocksToVerify) } -// Receive is a paid mutator transaction binding the contract receive function. +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. // -// Solidity: receive() payable returns() -func (_TaikoL1 *TaikoL1Transactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _TaikoL1.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_TaikoL1 *TaikoL1Transactor) WithdrawBond(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _TaikoL1.contract.Transact(opts, "withdrawBond", _amount) } -// Receive is a paid mutator transaction binding the contract receive function. +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. // -// Solidity: receive() payable returns() -func (_TaikoL1 *TaikoL1Session) Receive() (*types.Transaction, error) { - return _TaikoL1.Contract.Receive(&_TaikoL1.TransactOpts) +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_TaikoL1 *TaikoL1Session) WithdrawBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1.Contract.WithdrawBond(&_TaikoL1.TransactOpts, _amount) } -// Receive is a paid mutator transaction binding the contract receive function. +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. // -// Solidity: receive() payable returns() -func (_TaikoL1 *TaikoL1TransactorSession) Receive() (*types.Transaction, error) { - return _TaikoL1.Contract.Receive(&_TaikoL1.TransactOpts) +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_TaikoL1 *TaikoL1TransactorSession) WithdrawBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1.Contract.WithdrawBond(&_TaikoL1.TransactOpts, _amount) } // TaikoL1AdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the TaikoL1 contract. @@ -1520,40 +1835,807 @@ type TaikoL1BlockProposed struct { // FilterBlockProposed is a free log retrieval operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1 *TaikoL1Filterer) FilterBlockProposed(opts *bind.FilterOpts, blockId []*big.Int, assignedProver []common.Address) (*TaikoL1BlockProposedIterator, error) { +// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) +func (_TaikoL1 *TaikoL1Filterer) FilterBlockProposed(opts *bind.FilterOpts, blockId []*big.Int, assignedProver []common.Address) (*TaikoL1BlockProposedIterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var assignedProverRule []interface{} + for _, assignedProverItem := range assignedProver { + assignedProverRule = append(assignedProverRule, assignedProverItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockProposed", blockIdRule, assignedProverRule) + if err != nil { + return nil, err + } + return &TaikoL1BlockProposedIterator{contract: _TaikoL1.contract, event: "BlockProposed", logs: logs, sub: sub}, nil +} + +// WatchBlockProposed is a free log subscription operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// +// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) +func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockProposed, blockId []*big.Int, assignedProver []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var assignedProverRule []interface{} + for _, assignedProverItem := range assignedProver { + assignedProverRule = append(assignedProverRule, assignedProverItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockProposed", blockIdRule, assignedProverRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1BlockProposed) + if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBlockProposed is a log parse operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// +// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) +func (_TaikoL1 *TaikoL1Filterer) ParseBlockProposed(log types.Log) (*TaikoL1BlockProposed, error) { + event := new(TaikoL1BlockProposed) + if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1BlockProposedV2Iterator is returned from FilterBlockProposedV2 and is used to iterate over the raw logs and unpacked data for BlockProposedV2 events raised by the TaikoL1 contract. +type TaikoL1BlockProposedV2Iterator struct { + Event *TaikoL1BlockProposedV2 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1BlockProposedV2Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1BlockProposedV2) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1BlockProposedV2) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1BlockProposedV2Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1BlockProposedV2Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1BlockProposedV2 represents a BlockProposedV2 event raised by the TaikoL1 contract. +type TaikoL1BlockProposedV2 struct { + BlockId *big.Int + Meta TaikoDataBlockMetadataV2 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockProposedV2 is a free log retrieval operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1 *TaikoL1Filterer) FilterBlockProposedV2(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1BlockProposedV2Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockProposedV2", blockIdRule) + if err != nil { + return nil, err + } + return &TaikoL1BlockProposedV2Iterator{contract: _TaikoL1.contract, event: "BlockProposedV2", logs: logs, sub: sub}, nil +} + +// WatchBlockProposedV2 is a free log subscription operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockProposedV2, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockProposedV2", blockIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1BlockProposedV2) + if err := _TaikoL1.contract.UnpackLog(event, "BlockProposedV2", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBlockProposedV2 is a log parse operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1 *TaikoL1Filterer) ParseBlockProposedV2(log types.Log) (*TaikoL1BlockProposedV2, error) { + event := new(TaikoL1BlockProposedV2) + if err := _TaikoL1.contract.UnpackLog(event, "BlockProposedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1BlockVerifiedIterator is returned from FilterBlockVerified and is used to iterate over the raw logs and unpacked data for BlockVerified events raised by the TaikoL1 contract. +type TaikoL1BlockVerifiedIterator struct { + Event *TaikoL1BlockVerified // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1BlockVerifiedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1BlockVerified) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1BlockVerified) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1BlockVerifiedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1BlockVerifiedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1BlockVerified represents a BlockVerified event raised by the TaikoL1 contract. +type TaikoL1BlockVerified struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + StateRoot [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerified is a free log retrieval operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) FilterBlockVerified(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1BlockVerifiedIterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockVerified", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &TaikoL1BlockVerifiedIterator{contract: _TaikoL1.contract, event: "BlockVerified", logs: logs, sub: sub}, nil +} + +// WatchBlockVerified is a free log subscription operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockVerified, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockVerified", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1BlockVerified) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBlockVerified is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerified(log types.Log) (*TaikoL1BlockVerified, error) { + event := new(TaikoL1BlockVerified) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1BlockVerified0Iterator is returned from FilterBlockVerified0 and is used to iterate over the raw logs and unpacked data for BlockVerified0 events raised by the TaikoL1 contract. +type TaikoL1BlockVerified0Iterator struct { + Event *TaikoL1BlockVerified0 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1BlockVerified0Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1BlockVerified0) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1BlockVerified0) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1BlockVerified0Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1BlockVerified0Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1BlockVerified0 represents a BlockVerified0 event raised by the TaikoL1 contract. +type TaikoL1BlockVerified0 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + StateRoot [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerified0 is a free log retrieval operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) FilterBlockVerified0(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1BlockVerified0Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockVerified0", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &TaikoL1BlockVerified0Iterator{contract: _TaikoL1.contract, event: "BlockVerified0", logs: logs, sub: sub}, nil +} + +// WatchBlockVerified0 is a free log subscription operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified0(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockVerified0, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockVerified0", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1BlockVerified0) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified0", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBlockVerified0 is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerified0(log types.Log) (*TaikoL1BlockVerified0, error) { + event := new(TaikoL1BlockVerified0) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified0", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1BlockVerifiedV2Iterator is returned from FilterBlockVerifiedV2 and is used to iterate over the raw logs and unpacked data for BlockVerifiedV2 events raised by the TaikoL1 contract. +type TaikoL1BlockVerifiedV2Iterator struct { + Event *TaikoL1BlockVerifiedV2 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1BlockVerifiedV2Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1BlockVerifiedV2) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1BlockVerifiedV2) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1BlockVerifiedV2Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1BlockVerifiedV2Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1BlockVerifiedV2 represents a BlockVerifiedV2 event raised by the TaikoL1 contract. +type TaikoL1BlockVerifiedV2 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerifiedV2 is a free log retrieval operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) FilterBlockVerifiedV2(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1BlockVerifiedV2Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &TaikoL1BlockVerifiedV2Iterator{contract: _TaikoL1.contract, event: "BlockVerifiedV2", logs: logs, sub: sub}, nil +} + +// WatchBlockVerifiedV2 is a free log subscription operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerifiedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockVerifiedV2, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1BlockVerifiedV2) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerifiedV2", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBlockVerifiedV2 is a log parse operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerifiedV2(log types.Log) (*TaikoL1BlockVerifiedV2, error) { + event := new(TaikoL1BlockVerifiedV2) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerifiedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1BlockVerifiedV20Iterator is returned from FilterBlockVerifiedV20 and is used to iterate over the raw logs and unpacked data for BlockVerifiedV20 events raised by the TaikoL1 contract. +type TaikoL1BlockVerifiedV20Iterator struct { + Event *TaikoL1BlockVerifiedV20 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1BlockVerifiedV20Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1BlockVerifiedV20) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1BlockVerifiedV20) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1BlockVerifiedV20Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1BlockVerifiedV20Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1BlockVerifiedV20 represents a BlockVerifiedV20 event raised by the TaikoL1 contract. +type TaikoL1BlockVerifiedV20 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerifiedV20 is a free log retrieval operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) FilterBlockVerifiedV20(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1BlockVerifiedV20Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) } - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockProposed", blockIdRule, assignedProverRule) + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockVerifiedV20", blockIdRule, proverRule) if err != nil { return nil, err } - return &TaikoL1BlockProposedIterator{contract: _TaikoL1.contract, event: "BlockProposed", logs: logs, sub: sub}, nil + return &TaikoL1BlockVerifiedV20Iterator{contract: _TaikoL1.contract, event: "BlockVerifiedV20", logs: logs, sub: sub}, nil } -// WatchBlockProposed is a free log subscription operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// WatchBlockVerifiedV20 is a free log subscription operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockProposed, blockId []*big.Int, assignedProver []common.Address) (event.Subscription, error) { +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerifiedV20(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockVerifiedV20, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) } - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockProposed", blockIdRule, assignedProverRule) + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockVerifiedV20", blockIdRule, proverRule) if err != nil { return nil, err } @@ -1563,8 +2645,8 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed(opts *bind.WatchOpts, sink c select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1BlockProposed) - if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed", log); err != nil { + event := new(TaikoL1BlockVerifiedV20) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerifiedV20", log); err != nil { return err } event.Raw = log @@ -1585,21 +2667,21 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed(opts *bind.WatchOpts, sink c }), nil } -// ParseBlockProposed is a log parse operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// ParseBlockVerifiedV20 is a log parse operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1 *TaikoL1Filterer) ParseBlockProposed(log types.Log) (*TaikoL1BlockProposed, error) { - event := new(TaikoL1BlockProposed) - if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed", log); err != nil { +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerifiedV20(log types.Log) (*TaikoL1BlockVerifiedV20, error) { + event := new(TaikoL1BlockVerifiedV20) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerifiedV20", log); err != nil { return nil, err } event.Raw = log return event, nil } -// TaikoL1BlockProposed0Iterator is returned from FilterBlockProposed0 and is used to iterate over the raw logs and unpacked data for BlockProposed0 events raised by the TaikoL1 contract. -type TaikoL1BlockProposed0Iterator struct { - Event *TaikoL1BlockProposed0 // Event containing the contract specifics and raw log +// TaikoL1BondCreditedIterator is returned from FilterBondCredited and is used to iterate over the raw logs and unpacked data for BondCredited events raised by the TaikoL1 contract. +type TaikoL1BondCreditedIterator struct { + Event *TaikoL1BondCredited // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1613,7 +2695,7 @@ type TaikoL1BlockProposed0Iterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *TaikoL1BlockProposed0Iterator) Next() bool { +func (it *TaikoL1BondCreditedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1622,7 +2704,7 @@ func (it *TaikoL1BlockProposed0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1BlockProposed0) + it.Event = new(TaikoL1BondCredited) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1637,7 +2719,7 @@ func (it *TaikoL1BlockProposed0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1BlockProposed0) + it.Event = new(TaikoL1BondCredited) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1653,63 +2735,52 @@ func (it *TaikoL1BlockProposed0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1BlockProposed0Iterator) Error() error { +func (it *TaikoL1BondCreditedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1BlockProposed0Iterator) Close() error { +func (it *TaikoL1BondCreditedIterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1BlockProposed0 represents a BlockProposed0 event raised by the TaikoL1 contract. -type TaikoL1BlockProposed0 struct { - BlockId *big.Int - AssignedProver common.Address - LivenessBond *big.Int - Meta TaikoDataBlockMetadata - DepositsProcessed []TaikoDataEthDeposit - Raw types.Log // Blockchain specific contextual infos +// TaikoL1BondCredited represents a BondCredited event raised by the TaikoL1 contract. +type TaikoL1BondCredited struct { + User common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterBlockProposed0 is a free log retrieval operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// FilterBondCredited is a free log retrieval operation binding the contract event 0x6de6fe586196fa05b73b973026c5fda3968a2933989bff3a0b6bd57644fab606. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1 *TaikoL1Filterer) FilterBlockProposed0(opts *bind.FilterOpts, blockId []*big.Int, assignedProver []common.Address) (*TaikoL1BlockProposed0Iterator, error) { +// Solidity: event BondCredited(address indexed user, uint256 amount) +func (_TaikoL1 *TaikoL1Filterer) FilterBondCredited(opts *bind.FilterOpts, user []common.Address) (*TaikoL1BondCreditedIterator, error) { - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) } - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockProposed0", blockIdRule, assignedProverRule) + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BondCredited", userRule) if err != nil { return nil, err } - return &TaikoL1BlockProposed0Iterator{contract: _TaikoL1.contract, event: "BlockProposed0", logs: logs, sub: sub}, nil + return &TaikoL1BondCreditedIterator{contract: _TaikoL1.contract, event: "BondCredited", logs: logs, sub: sub}, nil } -// WatchBlockProposed0 is a free log subscription operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// WatchBondCredited is a free log subscription operation binding the contract event 0x6de6fe586196fa05b73b973026c5fda3968a2933989bff3a0b6bd57644fab606. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed0(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockProposed0, blockId []*big.Int, assignedProver []common.Address) (event.Subscription, error) { +// Solidity: event BondCredited(address indexed user, uint256 amount) +func (_TaikoL1 *TaikoL1Filterer) WatchBondCredited(opts *bind.WatchOpts, sink chan<- *TaikoL1BondCredited, user []common.Address) (event.Subscription, error) { - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) } - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockProposed0", blockIdRule, assignedProverRule) + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BondCredited", userRule) if err != nil { return nil, err } @@ -1719,8 +2790,8 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed0(opts *bind.WatchOpts, sink select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1BlockProposed0) - if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed0", log); err != nil { + event := new(TaikoL1BondCredited) + if err := _TaikoL1.contract.UnpackLog(event, "BondCredited", log); err != nil { return err } event.Raw = log @@ -1741,21 +2812,21 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed0(opts *bind.WatchOpts, sink }), nil } -// ParseBlockProposed0 is a log parse operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// ParseBondCredited is a log parse operation binding the contract event 0x6de6fe586196fa05b73b973026c5fda3968a2933989bff3a0b6bd57644fab606. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1 *TaikoL1Filterer) ParseBlockProposed0(log types.Log) (*TaikoL1BlockProposed0, error) { - event := new(TaikoL1BlockProposed0) - if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed0", log); err != nil { +// Solidity: event BondCredited(address indexed user, uint256 amount) +func (_TaikoL1 *TaikoL1Filterer) ParseBondCredited(log types.Log) (*TaikoL1BondCredited, error) { + event := new(TaikoL1BondCredited) + if err := _TaikoL1.contract.UnpackLog(event, "BondCredited", log); err != nil { return nil, err } event.Raw = log return event, nil } -// TaikoL1BlockVerifiedIterator is returned from FilterBlockVerified and is used to iterate over the raw logs and unpacked data for BlockVerified events raised by the TaikoL1 contract. -type TaikoL1BlockVerifiedIterator struct { - Event *TaikoL1BlockVerified // Event containing the contract specifics and raw log +// TaikoL1BondDebitedIterator is returned from FilterBondDebited and is used to iterate over the raw logs and unpacked data for BondDebited events raised by the TaikoL1 contract. +type TaikoL1BondDebitedIterator struct { + Event *TaikoL1BondDebited // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1769,7 +2840,7 @@ type TaikoL1BlockVerifiedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *TaikoL1BlockVerifiedIterator) Next() bool { +func (it *TaikoL1BondDebitedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1778,7 +2849,7 @@ func (it *TaikoL1BlockVerifiedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1BlockVerified) + it.Event = new(TaikoL1BondDebited) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1793,7 +2864,7 @@ func (it *TaikoL1BlockVerifiedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1BlockVerified) + it.Event = new(TaikoL1BondDebited) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1809,63 +2880,52 @@ func (it *TaikoL1BlockVerifiedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1BlockVerifiedIterator) Error() error { +func (it *TaikoL1BondDebitedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1BlockVerifiedIterator) Close() error { +func (it *TaikoL1BondDebitedIterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1BlockVerified represents a BlockVerified event raised by the TaikoL1 contract. -type TaikoL1BlockVerified struct { - BlockId *big.Int - Prover common.Address - BlockHash [32]byte - StateRoot [32]byte - Tier uint16 - Raw types.Log // Blockchain specific contextual infos +// TaikoL1BondDebited represents a BondDebited event raised by the TaikoL1 contract. +type TaikoL1BondDebited struct { + User common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterBlockVerified is a free log retrieval operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// FilterBondDebited is a free log retrieval operation binding the contract event 0x85f32beeaff2d0019a8d196f06790c9a652191759c46643311344fd38920423c. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) FilterBlockVerified(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1BlockVerifiedIterator, error) { +// Solidity: event BondDebited(address indexed user, uint256 amount) +func (_TaikoL1 *TaikoL1Filterer) FilterBondDebited(opts *bind.FilterOpts, user []common.Address) (*TaikoL1BondDebitedIterator, error) { - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) } - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockVerified", blockIdRule, proverRule) + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BondDebited", userRule) if err != nil { return nil, err } - return &TaikoL1BlockVerifiedIterator{contract: _TaikoL1.contract, event: "BlockVerified", logs: logs, sub: sub}, nil + return &TaikoL1BondDebitedIterator{contract: _TaikoL1.contract, event: "BondDebited", logs: logs, sub: sub}, nil } -// WatchBlockVerified is a free log subscription operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// WatchBondDebited is a free log subscription operation binding the contract event 0x85f32beeaff2d0019a8d196f06790c9a652191759c46643311344fd38920423c. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockVerified, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { +// Solidity: event BondDebited(address indexed user, uint256 amount) +func (_TaikoL1 *TaikoL1Filterer) WatchBondDebited(opts *bind.WatchOpts, sink chan<- *TaikoL1BondDebited, user []common.Address) (event.Subscription, error) { - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) } - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockVerified", blockIdRule, proverRule) + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BondDebited", userRule) if err != nil { return nil, err } @@ -1875,8 +2935,8 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified(opts *bind.WatchOpts, sink c select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1BlockVerified) - if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified", log); err != nil { + event := new(TaikoL1BondDebited) + if err := _TaikoL1.contract.UnpackLog(event, "BondDebited", log); err != nil { return err } event.Raw = log @@ -1897,21 +2957,21 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified(opts *bind.WatchOpts, sink c }), nil } -// ParseBlockVerified is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// ParseBondDebited is a log parse operation binding the contract event 0x85f32beeaff2d0019a8d196f06790c9a652191759c46643311344fd38920423c. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerified(log types.Log) (*TaikoL1BlockVerified, error) { - event := new(TaikoL1BlockVerified) - if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified", log); err != nil { +// Solidity: event BondDebited(address indexed user, uint256 amount) +func (_TaikoL1 *TaikoL1Filterer) ParseBondDebited(log types.Log) (*TaikoL1BondDebited, error) { + event := new(TaikoL1BondDebited) + if err := _TaikoL1.contract.UnpackLog(event, "BondDebited", log); err != nil { return nil, err } event.Raw = log return event, nil } -// TaikoL1BlockVerified0Iterator is returned from FilterBlockVerified0 and is used to iterate over the raw logs and unpacked data for BlockVerified0 events raised by the TaikoL1 contract. -type TaikoL1BlockVerified0Iterator struct { - Event *TaikoL1BlockVerified0 // Event containing the contract specifics and raw log +// TaikoL1CalldataTxListIterator is returned from FilterCalldataTxList and is used to iterate over the raw logs and unpacked data for CalldataTxList events raised by the TaikoL1 contract. +type TaikoL1CalldataTxListIterator struct { + Event *TaikoL1CalldataTxList // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1925,7 +2985,7 @@ type TaikoL1BlockVerified0Iterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *TaikoL1BlockVerified0Iterator) Next() bool { +func (it *TaikoL1CalldataTxListIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1934,7 +2994,7 @@ func (it *TaikoL1BlockVerified0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1BlockVerified0) + it.Event = new(TaikoL1CalldataTxList) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1949,7 +3009,7 @@ func (it *TaikoL1BlockVerified0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1BlockVerified0) + it.Event = new(TaikoL1CalldataTxList) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1965,63 +3025,52 @@ func (it *TaikoL1BlockVerified0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1BlockVerified0Iterator) Error() error { +func (it *TaikoL1CalldataTxListIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1BlockVerified0Iterator) Close() error { +func (it *TaikoL1CalldataTxListIterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1BlockVerified0 represents a BlockVerified0 event raised by the TaikoL1 contract. -type TaikoL1BlockVerified0 struct { - BlockId *big.Int - Prover common.Address - BlockHash [32]byte - StateRoot [32]byte - Tier uint16 - Raw types.Log // Blockchain specific contextual infos +// TaikoL1CalldataTxList represents a CalldataTxList event raised by the TaikoL1 contract. +type TaikoL1CalldataTxList struct { + BlockId *big.Int + TxList []byte + Raw types.Log // Blockchain specific contextual infos } -// FilterBlockVerified0 is a free log retrieval operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// FilterCalldataTxList is a free log retrieval operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) FilterBlockVerified0(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1BlockVerified0Iterator, error) { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) FilterCalldataTxList(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1CalldataTxListIterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockVerified0", blockIdRule, proverRule) + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "CalldataTxList", blockIdRule) if err != nil { return nil, err } - return &TaikoL1BlockVerified0Iterator{contract: _TaikoL1.contract, event: "BlockVerified0", logs: logs, sub: sub}, nil + return &TaikoL1CalldataTxListIterator{contract: _TaikoL1.contract, event: "CalldataTxList", logs: logs, sub: sub}, nil } -// WatchBlockVerified0 is a free log subscription operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// WatchCalldataTxList is a free log subscription operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified0(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockVerified0, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) WatchCalldataTxList(opts *bind.WatchOpts, sink chan<- *TaikoL1CalldataTxList, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockVerified0", blockIdRule, proverRule) + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "CalldataTxList", blockIdRule) if err != nil { return nil, err } @@ -2031,8 +3080,8 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified0(opts *bind.WatchOpts, sink select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1BlockVerified0) - if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified0", log); err != nil { + event := new(TaikoL1CalldataTxList) + if err := _TaikoL1.contract.UnpackLog(event, "CalldataTxList", log); err != nil { return err } event.Raw = log @@ -2053,12 +3102,12 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified0(opts *bind.WatchOpts, sink }), nil } -// ParseBlockVerified0 is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// ParseCalldataTxList is a log parse operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerified0(log types.Log) (*TaikoL1BlockVerified0, error) { - event := new(TaikoL1BlockVerified0) - if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified0", log); err != nil { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) ParseCalldataTxList(log types.Log) (*TaikoL1CalldataTxList, error) { + event := new(TaikoL1CalldataTxList) + if err := _TaikoL1.contract.UnpackLog(event, "CalldataTxList", log); err != nil { return nil, err } event.Raw = log @@ -3041,140 +4090,6 @@ func (_TaikoL1 *TaikoL1Filterer) ParseStateVariablesUpdated(log types.Log) (*Tai return event, nil } -// TaikoL1StateVariablesUpdated0Iterator is returned from FilterStateVariablesUpdated0 and is used to iterate over the raw logs and unpacked data for StateVariablesUpdated0 events raised by the TaikoL1 contract. -type TaikoL1StateVariablesUpdated0Iterator struct { - Event *TaikoL1StateVariablesUpdated0 // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *TaikoL1StateVariablesUpdated0Iterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(TaikoL1StateVariablesUpdated0) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(TaikoL1StateVariablesUpdated0) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1StateVariablesUpdated0Iterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *TaikoL1StateVariablesUpdated0Iterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// TaikoL1StateVariablesUpdated0 represents a StateVariablesUpdated0 event raised by the TaikoL1 contract. -type TaikoL1StateVariablesUpdated0 struct { - SlotB TaikoDataSlotB - Raw types.Log // Blockchain specific contextual infos -} - -// FilterStateVariablesUpdated0 is a free log retrieval operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1 *TaikoL1Filterer) FilterStateVariablesUpdated0(opts *bind.FilterOpts) (*TaikoL1StateVariablesUpdated0Iterator, error) { - - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "StateVariablesUpdated0") - if err != nil { - return nil, err - } - return &TaikoL1StateVariablesUpdated0Iterator{contract: _TaikoL1.contract, event: "StateVariablesUpdated0", logs: logs, sub: sub}, nil -} - -// WatchStateVariablesUpdated0 is a free log subscription operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1 *TaikoL1Filterer) WatchStateVariablesUpdated0(opts *bind.WatchOpts, sink chan<- *TaikoL1StateVariablesUpdated0) (event.Subscription, error) { - - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "StateVariablesUpdated0") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(TaikoL1StateVariablesUpdated0) - if err := _TaikoL1.contract.UnpackLog(event, "StateVariablesUpdated0", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseStateVariablesUpdated0 is a log parse operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1 *TaikoL1Filterer) ParseStateVariablesUpdated0(log types.Log) (*TaikoL1StateVariablesUpdated0, error) { - event := new(TaikoL1StateVariablesUpdated0) - if err := _TaikoL1.contract.UnpackLog(event, "StateVariablesUpdated0", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // TaikoL1TransitionContestedIterator is returned from FilterTransitionContested and is used to iterate over the raw logs and unpacked data for TransitionContested events raised by the TaikoL1 contract. type TaikoL1TransitionContestedIterator struct { Event *TaikoL1TransitionContested // Event containing the contract specifics and raw log @@ -3323,9 +4238,9 @@ func (_TaikoL1 *TaikoL1Filterer) ParseTransitionContested(log types.Log) (*Taiko return event, nil } -// TaikoL1TransitionContested0Iterator is returned from FilterTransitionContested0 and is used to iterate over the raw logs and unpacked data for TransitionContested0 events raised by the TaikoL1 contract. -type TaikoL1TransitionContested0Iterator struct { - Event *TaikoL1TransitionContested0 // Event containing the contract specifics and raw log +// TaikoL1TransitionContestedV2Iterator is returned from FilterTransitionContestedV2 and is used to iterate over the raw logs and unpacked data for TransitionContestedV2 events raised by the TaikoL1 contract. +type TaikoL1TransitionContestedV2Iterator struct { + Event *TaikoL1TransitionContestedV2 // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -3339,7 +4254,7 @@ type TaikoL1TransitionContested0Iterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *TaikoL1TransitionContested0Iterator) Next() bool { +func (it *TaikoL1TransitionContestedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3348,7 +4263,7 @@ func (it *TaikoL1TransitionContested0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1TransitionContested0) + it.Event = new(TaikoL1TransitionContestedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3363,7 +4278,7 @@ func (it *TaikoL1TransitionContested0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1TransitionContested0) + it.Event = new(TaikoL1TransitionContestedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3379,55 +4294,56 @@ func (it *TaikoL1TransitionContested0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1TransitionContested0Iterator) Error() error { +func (it *TaikoL1TransitionContestedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1TransitionContested0Iterator) Close() error { +func (it *TaikoL1TransitionContestedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1TransitionContested0 represents a TransitionContested0 event raised by the TaikoL1 contract. -type TaikoL1TransitionContested0 struct { +// TaikoL1TransitionContestedV2 represents a TransitionContestedV2 event raised by the TaikoL1 contract. +type TaikoL1TransitionContestedV2 struct { BlockId *big.Int Tran TaikoDataTransition Contester common.Address ContestBond *big.Int Tier uint16 + ProposedIn uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterTransitionContested0 is a free log retrieval operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// FilterTransitionContestedV2 is a free log retrieval operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) FilterTransitionContested0(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1TransitionContested0Iterator, error) { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1 *TaikoL1Filterer) FilterTransitionContestedV2(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1TransitionContestedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "TransitionContested0", blockIdRule) + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "TransitionContestedV2", blockIdRule) if err != nil { return nil, err } - return &TaikoL1TransitionContested0Iterator{contract: _TaikoL1.contract, event: "TransitionContested0", logs: logs, sub: sub}, nil + return &TaikoL1TransitionContestedV2Iterator{contract: _TaikoL1.contract, event: "TransitionContestedV2", logs: logs, sub: sub}, nil } -// WatchTransitionContested0 is a free log subscription operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// WatchTransitionContestedV2 is a free log subscription operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) WatchTransitionContested0(opts *bind.WatchOpts, sink chan<- *TaikoL1TransitionContested0, blockId []*big.Int) (event.Subscription, error) { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1 *TaikoL1Filterer) WatchTransitionContestedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1TransitionContestedV2, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "TransitionContested0", blockIdRule) + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "TransitionContestedV2", blockIdRule) if err != nil { return nil, err } @@ -3437,8 +4353,8 @@ func (_TaikoL1 *TaikoL1Filterer) WatchTransitionContested0(opts *bind.WatchOpts, select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1TransitionContested0) - if err := _TaikoL1.contract.UnpackLog(event, "TransitionContested0", log); err != nil { + event := new(TaikoL1TransitionContestedV2) + if err := _TaikoL1.contract.UnpackLog(event, "TransitionContestedV2", log); err != nil { return err } event.Raw = log @@ -3459,12 +4375,12 @@ func (_TaikoL1 *TaikoL1Filterer) WatchTransitionContested0(opts *bind.WatchOpts, }), nil } -// ParseTransitionContested0 is a log parse operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// ParseTransitionContestedV2 is a log parse operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) ParseTransitionContested0(log types.Log) (*TaikoL1TransitionContested0, error) { - event := new(TaikoL1TransitionContested0) - if err := _TaikoL1.contract.UnpackLog(event, "TransitionContested0", log); err != nil { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1 *TaikoL1Filterer) ParseTransitionContestedV2(log types.Log) (*TaikoL1TransitionContestedV2, error) { + event := new(TaikoL1TransitionContestedV2) + if err := _TaikoL1.contract.UnpackLog(event, "TransitionContestedV2", log); err != nil { return nil, err } event.Raw = log @@ -3619,9 +4535,9 @@ func (_TaikoL1 *TaikoL1Filterer) ParseTransitionProved(log types.Log) (*TaikoL1T return event, nil } -// TaikoL1TransitionProved0Iterator is returned from FilterTransitionProved0 and is used to iterate over the raw logs and unpacked data for TransitionProved0 events raised by the TaikoL1 contract. -type TaikoL1TransitionProved0Iterator struct { - Event *TaikoL1TransitionProved0 // Event containing the contract specifics and raw log +// TaikoL1TransitionProvedV2Iterator is returned from FilterTransitionProvedV2 and is used to iterate over the raw logs and unpacked data for TransitionProvedV2 events raised by the TaikoL1 contract. +type TaikoL1TransitionProvedV2Iterator struct { + Event *TaikoL1TransitionProvedV2 // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -3635,7 +4551,7 @@ type TaikoL1TransitionProved0Iterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *TaikoL1TransitionProved0Iterator) Next() bool { +func (it *TaikoL1TransitionProvedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3644,7 +4560,7 @@ func (it *TaikoL1TransitionProved0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1TransitionProved0) + it.Event = new(TaikoL1TransitionProvedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3659,7 +4575,7 @@ func (it *TaikoL1TransitionProved0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1TransitionProved0) + it.Event = new(TaikoL1TransitionProvedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3675,55 +4591,56 @@ func (it *TaikoL1TransitionProved0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1TransitionProved0Iterator) Error() error { +func (it *TaikoL1TransitionProvedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1TransitionProved0Iterator) Close() error { +func (it *TaikoL1TransitionProvedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1TransitionProved0 represents a TransitionProved0 event raised by the TaikoL1 contract. -type TaikoL1TransitionProved0 struct { +// TaikoL1TransitionProvedV2 represents a TransitionProvedV2 event raised by the TaikoL1 contract. +type TaikoL1TransitionProvedV2 struct { BlockId *big.Int Tran TaikoDataTransition Prover common.Address ValidityBond *big.Int Tier uint16 + ProposedIn uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterTransitionProved0 is a free log retrieval operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// FilterTransitionProvedV2 is a free log retrieval operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) FilterTransitionProved0(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1TransitionProved0Iterator, error) { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1 *TaikoL1Filterer) FilterTransitionProvedV2(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1TransitionProvedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "TransitionProved0", blockIdRule) + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "TransitionProvedV2", blockIdRule) if err != nil { return nil, err } - return &TaikoL1TransitionProved0Iterator{contract: _TaikoL1.contract, event: "TransitionProved0", logs: logs, sub: sub}, nil + return &TaikoL1TransitionProvedV2Iterator{contract: _TaikoL1.contract, event: "TransitionProvedV2", logs: logs, sub: sub}, nil } -// WatchTransitionProved0 is a free log subscription operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// WatchTransitionProvedV2 is a free log subscription operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) WatchTransitionProved0(opts *bind.WatchOpts, sink chan<- *TaikoL1TransitionProved0, blockId []*big.Int) (event.Subscription, error) { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1 *TaikoL1Filterer) WatchTransitionProvedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1TransitionProvedV2, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "TransitionProved0", blockIdRule) + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "TransitionProvedV2", blockIdRule) if err != nil { return nil, err } @@ -3733,8 +4650,8 @@ func (_TaikoL1 *TaikoL1Filterer) WatchTransitionProved0(opts *bind.WatchOpts, si select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1TransitionProved0) - if err := _TaikoL1.contract.UnpackLog(event, "TransitionProved0", log); err != nil { + event := new(TaikoL1TransitionProvedV2) + if err := _TaikoL1.contract.UnpackLog(event, "TransitionProvedV2", log); err != nil { return err } event.Raw = log @@ -3755,12 +4672,12 @@ func (_TaikoL1 *TaikoL1Filterer) WatchTransitionProved0(opts *bind.WatchOpts, si }), nil } -// ParseTransitionProved0 is a log parse operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// ParseTransitionProvedV2 is a log parse operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) ParseTransitionProved0(log types.Log) (*TaikoL1TransitionProved0, error) { - event := new(TaikoL1TransitionProved0) - if err := _TaikoL1.contract.UnpackLog(event, "TransitionProved0", log); err != nil { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1 *TaikoL1Filterer) ParseTransitionProvedV2(log types.Log) (*TaikoL1TransitionProvedV2, error) { + event := new(TaikoL1TransitionProvedV2) + if err := _TaikoL1.contract.UnpackLog(event, "TransitionProvedV2", log); err != nil { return nil, err } event.Raw = log diff --git a/packages/eventindexer/contracts/taikotoken/TaikoToken.go b/packages/eventindexer/contracts/taikotoken/TaikoToken.go index 86ab1292437..cd9c9694c8b 100644 --- a/packages/eventindexer/contracts/taikotoken/TaikoToken.go +++ b/packages/eventindexer/contracts/taikotoken/TaikoToken.go @@ -37,7 +37,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // TaikoTokenMetaData contains all meta data concerning the TaikoToken contract. var TaikoTokenMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"batchTransfer\",\"inputs\":[{\"name\":\"recipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // TaikoTokenABI is the input ABI used to generate the binding from. @@ -1002,7 +1002,7 @@ func (_TaikoToken *TaikoTokenCallerSession) Resolve0(_name [32]byte, _allowZeroA // Symbol is a free data retrieval call binding the contract method 0x95d89b41. // -// Solidity: function symbol() view returns(string) +// Solidity: function symbol() pure returns(string) func (_TaikoToken *TaikoTokenCaller) Symbol(opts *bind.CallOpts) (string, error) { var out []interface{} err := _TaikoToken.contract.Call(opts, &out, "symbol") @@ -1019,14 +1019,14 @@ func (_TaikoToken *TaikoTokenCaller) Symbol(opts *bind.CallOpts) (string, error) // Symbol is a free data retrieval call binding the contract method 0x95d89b41. // -// Solidity: function symbol() view returns(string) +// Solidity: function symbol() pure returns(string) func (_TaikoToken *TaikoTokenSession) Symbol() (string, error) { return _TaikoToken.Contract.Symbol(&_TaikoToken.CallOpts) } // Symbol is a free data retrieval call binding the contract method 0x95d89b41. // -// Solidity: function symbol() view returns(string) +// Solidity: function symbol() pure returns(string) func (_TaikoToken *TaikoTokenCallerSession) Symbol() (string, error) { return _TaikoToken.Contract.Symbol(&_TaikoToken.CallOpts) } @@ -1104,6 +1104,27 @@ func (_TaikoToken *TaikoTokenTransactorSession) Approve(spender common.Address, return _TaikoToken.Contract.Approve(&_TaikoToken.TransactOpts, spender, amount) } +// BatchTransfer is a paid mutator transaction binding the contract method 0x88d695b2. +// +// Solidity: function batchTransfer(address[] recipients, uint256[] amounts) returns(bool) +func (_TaikoToken *TaikoTokenTransactor) BatchTransfer(opts *bind.TransactOpts, recipients []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _TaikoToken.contract.Transact(opts, "batchTransfer", recipients, amounts) +} + +// BatchTransfer is a paid mutator transaction binding the contract method 0x88d695b2. +// +// Solidity: function batchTransfer(address[] recipients, uint256[] amounts) returns(bool) +func (_TaikoToken *TaikoTokenSession) BatchTransfer(recipients []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _TaikoToken.Contract.BatchTransfer(&_TaikoToken.TransactOpts, recipients, amounts) +} + +// BatchTransfer is a paid mutator transaction binding the contract method 0x88d695b2. +// +// Solidity: function batchTransfer(address[] recipients, uint256[] amounts) returns(bool) +func (_TaikoToken *TaikoTokenTransactorSession) BatchTransfer(recipients []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _TaikoToken.Contract.BatchTransfer(&_TaikoToken.TransactOpts, recipients, amounts) +} + // DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7. // // Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool) diff --git a/packages/eventindexer/db.go b/packages/eventindexer/db.go deleted file mode 100644 index 531c2b6f3ca..00000000000 --- a/packages/eventindexer/db.go +++ /dev/null @@ -1,25 +0,0 @@ -package eventindexer - -import ( - "database/sql" - - "github.com/cyberhorsey/errors" - "gorm.io/gorm" -) - -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") -) - -type DBConnectionOpts struct { - Name string - Password string - Host string - Database string - OpenFunc func(dsn string) (DB, error) -} - -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} diff --git a/packages/eventindexer/docs/docs.go b/packages/eventindexer/docs/docs.go index 950eaea61ed..abed8494ff4 100644 --- a/packages/eventindexer/docs/docs.go +++ b/packages/eventindexer/docs/docs.go @@ -17,7 +17,7 @@ const docTemplate = `{ }, "license": { "name": "MIT", - "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md" + "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE" }, "version": "{{.Version}}" }, @@ -53,6 +53,70 @@ const docTemplate = `{ } } }, + "/blockProposedBy": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Get block proposed by", + "operationId": "get-block-proposed-by", + "parameters": [ + { + "type": "string", + "description": "blockID to query", + "name": "blockID", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/eventindexer.Event" + } + } + } + } + } + }, + "/blockProvenBy": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Get block proven by", + "operationId": "get-block-proven-by", + "parameters": [ + { + "type": "string", + "description": "blockID to query", + "name": "blockID", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/eventindexer.Event" + } + } + } + } + } + }, "/chart/chartByTask": { "get": { "consumes": [ @@ -96,6 +160,42 @@ const docTemplate = `{ } } }, + "/erc20sByAddress": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Get erc20 balances by address and chain ID", + "operationId": "get-erc20-balances-by-address-and-chain-id", + "parameters": [ + { + "type": "string", + "description": "address to query", + "name": "address", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "chainID to query", + "name": "chainID", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/paginate.Page" + } + } + } + } + }, "/events": { "get": { "consumes": [ @@ -210,6 +310,17 @@ const docTemplate = `{ } }, "definitions": { + "decimal.NullDecimal": { + "type": "object", + "properties": { + "decimal": { + "type": "number" + }, + "valid": { + "type": "boolean" + } + } + }, "eventindexer.ChartItem": { "type": "object", "properties": { @@ -232,6 +343,65 @@ const docTemplate = `{ } } }, + "eventindexer.Event": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "amount": { + "$ref": "#/definitions/decimal.NullDecimal" + }, + "assignedProver": { + "type": "string" + }, + "blockID": { + "type": "integer" + }, + "chainID": { + "type": "integer" + }, + "contractAddress": { + "type": "string" + }, + "data": { + "type": "string" + }, + "emittedBlockID": { + "type": "integer" + }, + "event": { + "type": "string" + }, + "feeTokenAddress": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "proofReward": { + "$ref": "#/definitions/decimal.NullDecimal" + }, + "proposerReward": { + "$ref": "#/definitions/decimal.NullDecimal" + }, + "tier": { + "type": "integer" + }, + "to": { + "type": "string" + }, + "tokenID": { + "type": "integer" + }, + "transactedAt": { + "type": "string" + } + } + }, "eventindexer.UniqueProposersResponse": { "type": "object", "properties": { diff --git a/packages/eventindexer/docs/swagger.json b/packages/eventindexer/docs/swagger.json index 8927b8f6366..4f663dda8c8 100644 --- a/packages/eventindexer/docs/swagger.json +++ b/packages/eventindexer/docs/swagger.json @@ -10,7 +10,7 @@ }, "license": { "name": "MIT", - "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md" + "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE" }, "version": "1.0" }, @@ -41,6 +41,62 @@ } } }, + "/blockProposedBy": { + "get": { + "consumes": ["application/json"], + "produces": ["application/json"], + "summary": "Get block proposed by", + "operationId": "get-block-proposed-by", + "parameters": [ + { + "type": "string", + "description": "blockID to query", + "name": "blockID", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/eventindexer.Event" + } + } + } + } + } + }, + "/blockProvenBy": { + "get": { + "consumes": ["application/json"], + "produces": ["application/json"], + "summary": "Get block proven by", + "operationId": "get-block-proven-by", + "parameters": [ + { + "type": "string", + "description": "blockID to query", + "name": "blockID", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/eventindexer.Event" + } + } + } + } + } + }, "/chart/chartByTask": { "get": { "consumes": ["application/json"], @@ -80,6 +136,38 @@ } } }, + "/erc20sByAddress": { + "get": { + "consumes": ["application/json"], + "produces": ["application/json"], + "summary": "Get erc20 balances by address and chain ID", + "operationId": "get-erc20-balances-by-address-and-chain-id", + "parameters": [ + { + "type": "string", + "description": "address to query", + "name": "address", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "chainID to query", + "name": "chainID", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/paginate.Page" + } + } + } + } + }, "/events": { "get": { "consumes": ["application/json"], @@ -178,6 +266,17 @@ } }, "definitions": { + "decimal.NullDecimal": { + "type": "object", + "properties": { + "decimal": { + "type": "number" + }, + "valid": { + "type": "boolean" + } + } + }, "eventindexer.ChartItem": { "type": "object", "properties": { @@ -200,6 +299,65 @@ } } }, + "eventindexer.Event": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "amount": { + "$ref": "#/definitions/decimal.NullDecimal" + }, + "assignedProver": { + "type": "string" + }, + "blockID": { + "type": "integer" + }, + "chainID": { + "type": "integer" + }, + "contractAddress": { + "type": "string" + }, + "data": { + "type": "string" + }, + "emittedBlockID": { + "type": "integer" + }, + "event": { + "type": "string" + }, + "feeTokenAddress": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "proofReward": { + "$ref": "#/definitions/decimal.NullDecimal" + }, + "proposerReward": { + "$ref": "#/definitions/decimal.NullDecimal" + }, + "tier": { + "type": "integer" + }, + "to": { + "type": "string" + }, + "tokenID": { + "type": "integer" + }, + "transactedAt": { + "type": "string" + } + } + }, "eventindexer.UniqueProposersResponse": { "type": "object", "properties": { diff --git a/packages/eventindexer/docs/swagger.yaml b/packages/eventindexer/docs/swagger.yaml index a595892b8b2..14e7e96df6d 100644 --- a/packages/eventindexer/docs/swagger.yaml +++ b/packages/eventindexer/docs/swagger.yaml @@ -1,4 +1,11 @@ definitions: + decimal.NullDecimal: + properties: + decimal: + type: number + valid: + type: boolean + type: object eventindexer.ChartItem: properties: date: @@ -13,6 +20,45 @@ definitions: $ref: "#/definitions/eventindexer.ChartItem" type: array type: object + eventindexer.Event: + properties: + address: + type: string + amount: + $ref: "#/definitions/decimal.NullDecimal" + assignedProver: + type: string + blockID: + type: integer + chainID: + type: integer + contractAddress: + type: string + data: + type: string + emittedBlockID: + type: integer + event: + type: string + feeTokenAddress: + type: string + id: + type: integer + name: + type: string + proofReward: + $ref: "#/definitions/decimal.NullDecimal" + proposerReward: + $ref: "#/definitions/decimal.NullDecimal" + tier: + type: integer + to: + type: string + tokenID: + type: integer + transactedAt: + type: string + type: object eventindexer.UniqueProposersResponse: properties: address: @@ -77,7 +123,7 @@ info: url: https://community.taiko.xyz/ license: name: MIT - url: https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md + url: https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE termsOfService: http://swagger.io/terms/ title: Taiko Event Indexer API version: "1.0" @@ -101,6 +147,48 @@ paths: schema: $ref: "#/definitions/paginate.Page" summary: Get assigned blocks by prover address + /blockProposedBy: + get: + consumes: + - application/json + operationId: get-block-proposed-by + parameters: + - description: blockID to query + in: query + name: blockID + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: "#/definitions/eventindexer.Event" + type: array + summary: Get block proposed by + /blockProvenBy: + get: + consumes: + - application/json + operationId: get-block-proven-by + parameters: + - description: blockID to query + in: query + name: blockID + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: "#/definitions/eventindexer.Event" + type: array + summary: Get block proven by /chart/chartByTask: get: consumes: @@ -130,6 +218,30 @@ paths: schema: $ref: "#/definitions/eventindexer.ChartResponse" summary: Get time series data for displaying charts + /erc20sByAddress: + get: + consumes: + - application/json + operationId: get-erc20-balances-by-address-and-chain-id + parameters: + - description: address to query + in: query + name: address + required: true + type: string + - description: chainID to query + in: query + name: chainID + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: "#/definitions/paginate.Page" + summary: Get erc20 balances by address and chain ID /events: get: consumes: diff --git a/packages/eventindexer/erc20_balance.go b/packages/eventindexer/erc20_balance.go new file mode 100644 index 00000000000..64823464fcc --- /dev/null +++ b/packages/eventindexer/erc20_balance.go @@ -0,0 +1,57 @@ +package eventindexer + +import ( + "context" + "net/http" + + "github.com/morkid/paginate" +) + +type ERC20Metadata struct { + ID int `json:"id"` + ChainID int64 `json:"chainID"` + ContractAddress string `json:"contractAddress"` + Symbol string `json:"symbol"` + Decimals uint8 `json:"decimals"` +} + +// ERC20Balance +type ERC20Balance struct { + ID int `json:"id"` + ERC20MetadataID int64 `json:"erc20MetadataID"` + ChainID int64 `json:"chainID"` + Address string `json:"address"` + Amount string `json:"amount"` + ContractAddress string `json:"contractAddress"` + Metadata *ERC20Metadata `json:"metadata" gorm:"foreignKey:ERC20MetadataID"` +} + +type UpdateERC20BalanceOpts struct { + ERC20MetadataID int64 + ChainID int64 + Address string + ContractAddress string + Amount string +} + +// ERC20BalanceRepository is used to interact with nft balances in the store +type ERC20BalanceRepository interface { + IncreaseAndDecreaseBalancesInTx( + ctx context.Context, + increaseOpts UpdateERC20BalanceOpts, + decreaseOpts UpdateERC20BalanceOpts, + ) (increasedBalance *ERC20Balance, decreasedBalance *ERC20Balance, err error) + FindByAddress(ctx context.Context, + req *http.Request, + address string, + chainID string, + ) (paginate.Page, error) + FindMetadata(ctx context.Context, chainID int64, contractAddress string) (*ERC20Metadata, error) + CreateMetadata( + ctx context.Context, + chainID int64, + contractAddress string, + symbol string, + decimals uint8, + ) (int, error) +} diff --git a/packages/eventindexer/errors.go b/packages/eventindexer/errors.go index 73e8b651300..d85fc6c3d79 100644 --- a/packages/eventindexer/errors.go +++ b/packages/eventindexer/errors.go @@ -23,4 +23,5 @@ var ( ErrNoCORSOrigins = errors.Validation.NewWithKeyAndDetail("ERR_NO_CORS_ORIGINS", "CORS Origins are required") ErrNoRPCClient = errors.Validation.NewWithKeyAndDetail("ERR_NO_RPC_CLIENT", "RPCClient is required") ErrInvalidMode = errors.Validation.NewWithKeyAndDetail("ERR_INVALID_MODE", "Mode not supported") + ErrInvalidURL = errors.Validation.NewWithKeyAndDetail("ERR_INVALID_URL", "The provided URL is invalid or unreachable") ) diff --git a/packages/eventindexer/event.go b/packages/eventindexer/event.go index 27e95b78044..fdda18b7c66 100644 --- a/packages/eventindexer/event.go +++ b/packages/eventindexer/event.go @@ -114,8 +114,11 @@ type EventRepository interface { req *http.Request, address string, ) (paginate.Page, error) - DeleteAllAfterBlockID(blockID uint64, srcChainID uint64) error + DeleteAllAfterBlockID(ctx context.Context, blockID uint64, srcChainID uint64) error FindLatestBlockID( + ctx context.Context, srcChainID uint64, ) (uint64, error) + GetBlockProvenBy(ctx context.Context, blockID int) ([]*Event, error) + GetBlockProposedBy(ctx context.Context, blockID int) (*Event, error) } diff --git a/packages/eventindexer/generator/config.go b/packages/eventindexer/generator/config.go deleted file mode 100644 index 962d266a976..00000000000 --- a/packages/eventindexer/generator/config.go +++ /dev/null @@ -1,75 +0,0 @@ -package generator - -import ( - "database/sql" - "time" - - "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" - "github.com/urfave/cli/v2" - "gorm.io/driver/mysql" - "gorm.io/gorm" - "gorm.io/gorm/logger" -) - -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} - -type Config struct { - // db configs - DatabaseUsername string - DatabasePassword string - DatabaseName string - DatabaseHost string - DatabaseMaxIdleConns uint64 - DatabaseMaxOpenConns uint64 - DatabaseMaxConnLifetime uint64 - MetricsHTTPPort uint64 - GenesisDate time.Time - Regenerate bool - OpenDBFunc func() (DB, error) -} - -// NewConfigFromCliContext creates a new config instance from command line flags. -func NewConfigFromCliContext(c *cli.Context) (*Config, error) { - date, err := time.Parse("2006-01-02", c.String(flags.GenesisDate.Name)) - if err != nil { - return nil, err - } - - return &Config{ - DatabaseUsername: c.String(flags.DatabaseUsername.Name), - DatabasePassword: c.String(flags.DatabasePassword.Name), - DatabaseName: c.String(flags.DatabaseName.Name), - DatabaseHost: c.String(flags.DatabaseHost.Name), - DatabaseMaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), - DatabaseMaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), - DatabaseMaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - MetricsHTTPPort: c.Uint64(flags.MetricsHTTPPort.Name), - GenesisDate: date, - Regenerate: c.Bool(flags.Regenerate.Name), - OpenDBFunc: func() (DB, error) { - return db.OpenDBConnection(db.DBConnectionOpts{ - Name: c.String(flags.DatabaseUsername.Name), - Password: c.String(flags.DatabasePassword.Name), - Database: c.String(flags.DatabaseName.Name), - Host: c.String(flags.DatabaseHost.Name), - MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), - MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), - MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { - gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ - Logger: logger.Default.LogMode(logger.Silent), - }) - if err != nil { - return nil, err - } - - return db.New(gormDB), nil - }, - }) - }, - }, nil -} diff --git a/packages/eventindexer/generator/config_test.go b/packages/eventindexer/generator/config_test.go deleted file mode 100644 index 290e03421e0..00000000000 --- a/packages/eventindexer/generator/config_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package generator - -import ( - "context" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" - "github.com/urfave/cli/v2" -) - -func setupApp() *cli.App { - app := cli.NewApp() - app.Flags = flags.GeneratorFlags - app.Action = func(ctx *cli.Context) error { - _, err := NewConfigFromCliContext(ctx) - return err - } - - return app -} - -func TestNewConfigFromCliContext(t *testing.T) { - app := setupApp() - - app.Action = func(ctx *cli.Context) error { - c, err := NewConfigFromCliContext(ctx) - - assert.Nil(t, err) - assert.Equal(t, "dbuser", c.DatabaseUsername) - assert.Equal(t, "dbpass", c.DatabasePassword) - assert.Equal(t, "dbname", c.DatabaseName) - assert.Equal(t, "dbhost", c.DatabaseHost) - assert.Equal(t, true, c.Regenerate) - - wantTime, _ := time.Parse("2006-01-02", "2023-07-07") - assert.Equal(t, wantTime, c.GenesisDate) - - c.OpenDBFunc = func() (DB, error) { - return nil, nil - } - - assert.Nil(t, InitFromConfig(context.Background(), new(Generator), c)) - - return err - } - - assert.Nil(t, app.Run([]string{ - "TestNewConfigFromCliContext", - "--" + flags.DatabaseUsername.Name, "dbuser", - "--" + flags.DatabasePassword.Name, "dbpass", - "--" + flags.DatabaseHost.Name, "dbhost", - "--" + flags.DatabaseName.Name, "dbname", - "--" + flags.GenesisDate.Name, "2023-07-07", - "--" + flags.Regenerate.Name, "true", - })) -} diff --git a/packages/eventindexer/generator/generator.go b/packages/eventindexer/generator/generator.go deleted file mode 100644 index f5acd51a5c7..00000000000 --- a/packages/eventindexer/generator/generator.go +++ /dev/null @@ -1,652 +0,0 @@ -package generator - -import ( - "context" - "errors" - "log/slog" - "os" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/shopspring/decimal" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/tasks" - "github.com/urfave/cli/v2" - "gorm.io/gorm" -) - -var ( - ZeroAddress = common.HexToAddress("0x0000000000000000000000000000000000000000") -) - -// Generator is a subcommand which is intended to be run on an interval, like -// a cronjob, to parse the indexed data from the database, and generate -// time series data that can easily be displayed via charting libraries. -type Generator struct { - db DB - genesisDate time.Time - regenerate bool -} - -func (g *Generator) InitFromCli(ctx context.Context, c *cli.Context) error { - config, err := NewConfigFromCliContext(c) - if err != nil { - return err - } - - return InitFromConfig(ctx, g, config) -} - -func InitFromConfig(ctx context.Context, g *Generator, cfg *Config) error { - db, err := cfg.OpenDBFunc() - if err != nil { - return err - } - - g.db = db - g.genesisDate = cfg.GenesisDate - g.regenerate = cfg.Regenerate - - return nil -} - -func (g *Generator) Name() string { - return "generator" -} - -func (g *Generator) Start() error { - if g.regenerate { - slog.Info("regenerating, deleting existing data") - - if err := g.deleteTimeSeriesData(context.Background()); err != nil { - return err - } - } - - slog.Info("generating time series data") - - if err := g.generateTimeSeriesData(context.Background()); err != nil { - return err - } - - os.Exit(0) - - return nil -} - -func (g *Generator) Close(ctx context.Context) { - sqlDB, err := g.db.DB() - if err != nil { - slog.Error("error getting sqldb when closing generator", "err", err.Error()) - } - - if err := sqlDB.Close(); err != nil { - slog.Error("error closing sqlbd connection", "err", err.Error()) - } -} - -func (g *Generator) deleteTimeSeriesData(ctx context.Context) error { - deleteStmt := "DELETE FROM time_series_data;" - if err := g.db.GormDB().Exec(deleteStmt).Error; err != nil { - return err - } - - return nil -} - -// generateTimeSeriesData iterates over each task and generates time series data. -func (g *Generator) generateTimeSeriesData(ctx context.Context) error { - for _, task := range tasks.Tasks { - if err := g.generateByTask(ctx, task); err != nil { - slog.Error("error generating for task", "task", task, "error", err.Error()) - return err - } - } - - return nil -} - -// generateByTask generates time series data for each day in between the current date -// and the most recently generated time series data, for the given task. -func (g *Generator) generateByTask(ctx context.Context, task string) error { - slog.Info("generating for task", "task", task) - - startingDate, err := g.getStartingDateByTask(ctx, task) - if err != nil { - return err - } - - currentDate := g.getCurrentDate() - if startingDate.Compare(currentDate) == 0 { - slog.Info( - "data already generated up-to-date for task", - "task", task, - "date", startingDate.Format("2006-01-02"), - "currentDate", currentDate.Format("2006-01-02"), - ) - - return nil - } - - // Loop through each date from latestDate to currentDate - for d := startingDate; d.Before(currentDate); d = d.AddDate(0, 0, 1) { - slog.Info("Processing", "task", task, "date", d.Format("2006-01-02"), "currentDate", currentDate.Format("2006-01-02")) - - err := g.queryByTask(task, d) - if err != nil { - slog.Info("Query failed", "task", task, "date", d.Format("2006-01-02"), "error", err.Error()) - return err - } - - slog.Info("Processed", "task", task, "date", d.Format("2006-01-02")) - } - - return nil -} - -// getStartingDateByTask returns first required time series data, one after the latest date entry, -// or the genesis date. -func (g *Generator) getStartingDateByTask(ctx context.Context, task string) (time.Time, error) { - var latestDateString string - - var nextRequiredDate time.Time - - q := `SELECT date FROM time_series_data WHERE task = ? ORDER BY date DESC LIMIT 1;` - - err := g.db.GormDB().Raw(q, task).Scan(&latestDateString).Error - - slog.Info("latestDateString", "task", task, "date", latestDateString) - - if err != nil || latestDateString == "" { - nextRequiredDate = g.genesisDate - } else { - latestDate, err := time.Parse("2006-01-02", latestDateString) - if err != nil { - return time.Time{}, err - } - - nextRequiredDate = latestDate.AddDate(0, 0, 1) - } - - slog.Info("next required date for task", "task", task, "nextRequiredDate", nextRequiredDate.Format("2006-01-02")) - - return nextRequiredDate, nil -} - -// getCurrentDate returns the current date in YYYY-MM-DD format -func (g *Generator) getCurrentDate() time.Time { - // Get current date - currentTime := time.Now().UTC() - currentDate := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), 0, 0, 0, 0, time.UTC) - - return currentDate -} - -// nolint: funlen, gocognit -// queryByTask runs a database query which should return result data based on the -// task -func (g *Generator) queryByTask(task string, date time.Time) error { - dateString := date.Format("2006-01-02") - - var result decimal.Decimal - - var err error - - switch task { - case tasks.TotalTransitionProvedByTier: - var tiers []uint16 = make([]uint16, 0) - - query := "SELECT DISTINCT tier FROM events WHERE event = ? AND tier IS NOT NULL;" - - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionProved). - Scan(&tiers).Error - if err != nil { - return err - } - - slog.Info("tiers", "tiers", tiers) - - for _, tier := range tiers { - t := tier - - var dailyCountByTier decimal.NullDecimal - - // nolint: lll - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ? AND tier = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionProved, dateString, t). - Scan(&dailyCountByTier).Error - - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, &t) - if err != nil { - return err - } - - result := tsdResult.Decimal.Add(dailyCountByTier.Decimal) - - slog.Info("Query successful", - "task", task, - "date", dateString, - "result", result.String(), - "tier", t, - ) - - insertStmt := ` - INSERT INTO time_series_data(task, value, date, tier) - VALUES (?, ?, ?, ?)` - - err = g.db.GormDB().Exec(insertStmt, task, result, dateString, t).Error - if err != nil { - slog.Info("Insert failed", "task", task, "date", dateString, "error", err.Error()) - return err - } - } - - // return early for array processing data - return nil - case tasks.TransitionProvedByTierPerDay: - var tiers []uint16 = make([]uint16, 0) - - query := "SELECT DISTINCT tier FROM events WHERE event = ? AND tier IS NOT NULL;" - - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionProved). - Scan(&tiers).Error - if err != nil { - return err - } - - slog.Info("tiers", "tiers", tiers) - - for _, tier := range tiers { - t := tier - - var dailyCountByTier decimal.NullDecimal - - // nolint: lll - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ? AND tier = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionProved, dateString, t). - Scan(&dailyCountByTier).Error - - if err != nil { - return err - } - - slog.Info("Query successful", - "task", task, - "date", dateString, - "result", dailyCountByTier.Decimal.String(), - "tier", t, - ) - - insertStmt := ` - INSERT INTO time_series_data(task, value, date, tier) - VALUES (?, ?, ?, ?)` - - err = g.db.GormDB().Exec(insertStmt, task, result, dateString, t).Error - if err != nil { - slog.Info("Insert failed", "task", task, "date", dateString, "error", err.Error()) - return err - } - } - - // return early for array processing data - return nil - case tasks.TransitionContestedByTierPerDay: - var tiers []uint16 = make([]uint16, 0) - - query := "SELECT DISTINCT tier FROM events WHERE event = ? AND tier IS NOT NULL;" - - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionContested). - Scan(&tiers).Error - if err != nil { - return err - } - - slog.Info("tiers", "tiers", tiers) - - for _, tier := range tiers { - t := tier - - var dailyCountByTier decimal.NullDecimal - - // nolint: lll - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ? AND tier = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionContested, dateString, t). - Scan(&dailyCountByTier).Error - - if err != nil { - return err - } - - slog.Info("Query successful", - "task", task, - "date", dateString, - "result", dailyCountByTier.Decimal.String(), - "tier", t, - ) - - insertStmt := ` - INSERT INTO time_series_data(task, value, date, tier) - VALUES (?, ?, ?, ?)` - - err = g.db.GormDB().Exec(insertStmt, task, result, dateString, t).Error - if err != nil { - slog.Info("Insert failed", "task", task, "date", dateString, "error", err.Error()) - return err - } - } - - // return early for array processing data - return nil - case tasks.TotalTransitionContestedByTier: - var tiers []uint16 = make([]uint16, 0) - - query := "SELECT DISTINCT tier FROM events WHERE event = ? AND tier IS NOT NULL;" - - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionContested). - Scan(&tiers).Error - if err != nil { - return err - } - - slog.Info("tiers", "tiers", tiers) - - for _, tier := range tiers { - t := tier - - var dailyCountByTier decimal.NullDecimal - - // nolint: lll - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ? AND tier = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionContested, dateString, t). - Scan(&dailyCountByTier).Error - - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, &t) - if err != nil { - return err - } - - result := tsdResult.Decimal.Add(dailyCountByTier.Decimal) - - slog.Info("Query successful", - "task", task, - "date", dateString, - "result", result.String(), - "tier", t, - ) - - insertStmt := ` - INSERT INTO time_series_data(task, value, date, tier) - VALUES (?, ?, ?, ?)` - - err = g.db.GormDB().Exec(insertStmt, task, result, dateString, t).Error - if err != nil { - slog.Info("Insert failed", "task", task, "date", dateString, "error", err.Error()) - return err - } - } - - // return early for array processing data - return nil - case tasks.BridgeMessagesSentPerDay: - err = g.eventCount(task, date, eventindexer.EventNameMessageSent, &result) - case tasks.TotalBridgeMessagesSent: - var dailyMsgSentCount decimal.NullDecimal - - err = g.eventCount(task, date, eventindexer.EventNameMessageSent, &dailyMsgSentCount) - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyMsgSentCount.Decimal) - case tasks.ProposeBlockTxPerDay: - err = g.eventCount(task, date, eventindexer.EventNameBlockProposed, &result) - case tasks.TotalProposeBlockTx: - var dailyProposerCount decimal.NullDecimal - - err = g.eventCount(task, date, eventindexer.EventNameBlockProposed, &dailyProposerCount) - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyProposerCount.Decimal) - case tasks.UniqueProposersPerDay: - query := "SELECT COUNT(DISTINCT address) FROM events WHERE event = ? AND DATE(transacted_at) = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameBlockProposed, dateString). - Scan(&result).Error - case tasks.TotalUniqueProposers: - query := `SELECT COUNT(DISTINCT address) FROM events WHERE event = ?` - - err = g.db.GormDB().Raw( - query, - eventindexer.EventNameBlockProposed, - ).Scan(&result).Error - if err != nil { - return err - } - case tasks.UniqueProversPerDay: - query := "SELECT COUNT(DISTINCT address) FROM events WHERE event = ? AND DATE(transacted_at) = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionProved, dateString). - Scan(&result).Error - case tasks.TotalUniqueProvers: - query := `SELECT COUNT(DISTINCT address) FROM events WHERE event = ?` - - err = g.db.GormDB().Raw( - query, - eventindexer.EventNameTransitionProved, - ).Scan(&result).Error - if err != nil { - return err - } - case tasks.TransitionProvedTxPerDay: - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionProved, dateString). - Scan(&result).Error - case tasks.TotalTransitionProvedTx: - var dailyTransitionProvedCount decimal.NullDecimal - - query := `SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ?` - - err = g.db.GormDB().Raw( - query, - eventindexer.EventNameTransitionProved, - dateString, - ).Scan(&dailyTransitionProvedCount).Error - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyTransitionProvedCount.Decimal) - case tasks.TransitionContestedTxPerDay: - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionContested, dateString). - Scan(&result).Error - case tasks.TotalTransitionContestedTx: - var dailyTransitionContestedCount decimal.NullDecimal - - query := `SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ?` - - err = g.db.GormDB().Raw( - query, - eventindexer.EventNameTransitionContested, - dateString, - ).Scan(&dailyTransitionContestedCount).Error - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyTransitionContestedCount.Decimal) - case tasks.AccountsPerDay: - query := `SELECT COUNT(*) FROM accounts WHERE DATE(transacted_at) = ?` - err = g.db.GormDB().Raw(query, dateString).Scan(&result).Error - case tasks.TotalAccounts: - var dailyAccountsCount decimal.NullDecimal - - query := `SELECT COUNT(*) FROM accounts WHERE DATE(transacted_at) = ?` - - err = g.db.GormDB().Raw(query, dateString).Scan(&dailyAccountsCount).Error - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyAccountsCount.Decimal) - case tasks.TransactionsPerDay: - query := `SELECT COUNT(*) FROM transactions WHERE DATE(transacted_at) = ?` - err = g.db.GormDB().Raw(query, dateString).Scan(&result).Error - case tasks.TotalTransactions: - var dailyTxCount decimal.NullDecimal - - // get current days txs, get previous entry for the time series data, add them together. - - query := `SELECT COUNT(*) FROM transactions WHERE DATE(transacted_at) = ?` - - err = g.db.GormDB().Raw(query, dateString).Scan(&dailyTxCount).Error - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyTxCount.Decimal) - case tasks.ContractDeploymentsPerDay: - query := `SELECT COUNT(*) FROM transactions WHERE DATE(transacted_at) = ? AND contract_address != ?` - err = g.db.GormDB().Raw(query, dateString, ZeroAddress.Hex()).Scan(&result).Error - case tasks.TotalContractDeployments: - var dailyContractCount decimal.NullDecimal - - // get current days txs, get previous entry for the time series data, add them together. - query := `SELECT COUNT(*) FROM transactions WHERE DATE(transacted_at) = ? AND contract_address != ?` - - err = g.db.GormDB().Raw(query, dateString, ZeroAddress.Hex()).Scan(&dailyContractCount).Error - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyContractCount.Decimal) - default: - return errors.New("task not supported") - } - - if err != nil { - return err - } - - slog.Info("Query successful", "task", task, "date", dateString, "result", result.String()) - - insertStmt := ` - INSERT INTO time_series_data(task, value, date) - VALUES (?, ?, ?)` - - err = g.db.GormDB().Exec(insertStmt, task, result, dateString).Error - if err != nil { - slog.Info("Insert failed", "task", task, "date", dateString, "error", err.Error()) - return err - } - - return nil -} - -// previousDayTsdResultByTask returns the previous day's time series data, based on -// task and time passed in. -func (g *Generator) previousDayTsdResultByTask( - task string, - date time.Time, - feeTokenAddress *string, - tier *uint16, -) (decimal.NullDecimal, error) { - var tsdResult decimal.NullDecimal - - var tsdQuery string = `SELECT value FROM time_series_data WHERE task = ? AND date = ?` - - var q *gorm.DB = g.db.GormDB(). - Raw(tsdQuery, task, date.AddDate(0, 0, -1).Format("2006-01-02")) - - if feeTokenAddress != nil { - tsdQuery = `SELECT value FROM time_series_data WHERE task = ? AND date = ? AND fee_token_address = ?` - q = g.db.GormDB(). - Raw(tsdQuery, task, date.AddDate(0, 0, -1).Format("2006-01-02"), *feeTokenAddress) - } - - if tier != nil { - tsdQuery = `SELECT value FROM time_series_data WHERE task = ? AND date = ? AND tier = ?` - q = g.db.GormDB(). - Raw(tsdQuery, task, date.AddDate(0, 0, -1).Format("2006-01-02"), *tier) - } - - err := q. - Scan(&tsdResult).Error - if err != nil { - return tsdResult, err - } - - if !tsdResult.Valid { - return decimal.NullDecimal{ - Valid: true, - Decimal: decimal.Zero, - }, nil - } - - return tsdResult, nil -} - -// eventCount is a helper method to query the database for the count of a specific event -// based on the date. -func (g *Generator) eventCount(task string, date time.Time, event string, result interface{}) error { - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ?" - - return g.db.GormDB(). - Raw(query, event, date.Format("2006-01-02")). - Scan(result).Error -} diff --git a/packages/eventindexer/indexer/config.go b/packages/eventindexer/indexer/config.go index c5be80d17ae..122c45c59de 100644 --- a/packages/eventindexer/indexer/config.go +++ b/packages/eventindexer/indexer/config.go @@ -1,21 +1,15 @@ package indexer import ( - "database/sql" - "github.com/ethereum/go-ethereum/common" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "github.com/urfave/cli/v2" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" -) -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} + "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" +) type Config struct { // db configs @@ -31,13 +25,14 @@ type Config struct { ETHClientTimeout uint64 L1TaikoAddress common.Address BridgeAddress common.Address - AssignmentHookAddress common.Address BlockBatchSize uint64 SubscriptionBackoff uint64 SyncMode SyncMode IndexNFTs bool + IndexERC20s bool Layer string - OpenDBFunc func() (DB, error) + OntakeForkHeight uint64 + OpenDBFunc func() (db.DB, error) } // NewConfigFromCliContext creates a new config instance from command line flags. @@ -54,14 +49,15 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { ETHClientTimeout: c.Uint64(flags.ETHClientTimeout.Name), L1TaikoAddress: common.HexToAddress(c.String(flags.L1TaikoAddress.Name)), BridgeAddress: common.HexToAddress(c.String(flags.BridgeAddress.Name)), - AssignmentHookAddress: common.HexToAddress(c.String(flags.AssignmentHookAddress.Name)), BlockBatchSize: c.Uint64(flags.BlockBatchSize.Name), SubscriptionBackoff: c.Uint64(flags.SubscriptionBackoff.Name), RPCUrl: c.String(flags.IndexerRPCUrl.Name), SyncMode: SyncMode(c.String(flags.SyncMode.Name)), IndexNFTs: c.Bool(flags.IndexNFTs.Name), + IndexERC20s: c.Bool(flags.IndexERC20s.Name), Layer: c.String(flags.Layer.Name), - OpenDBFunc: func() (DB, error) { + OntakeForkHeight: c.Uint64(flags.OntakeForkHeight.Name), + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -70,7 +66,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (db.DB, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/eventindexer/indexer/config_test.go b/packages/eventindexer/indexer/config_test.go index a8e6ade2e30..7f7e41dc90d 100644 --- a/packages/eventindexer/indexer/config_test.go +++ b/packages/eventindexer/indexer/config_test.go @@ -13,7 +13,6 @@ var ( metricsHttpPort = "1001" l1TaikoAddress = "0x63FaC9201494f0bd17B9892B9fae4d52fe3BD377" bridgeAddress = "0x73FaC9201494f0bd17B9892B9fae4d52fe3BD377" - assignmentHookAddress = "0x83FaC9201494f0bd17B9892B9fae4d52fe3BD377" databaseMaxIdleConns = "10" databaseMaxOpenConns = "10" databaseMaxConnLifetime = "30" @@ -51,7 +50,6 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, uint64(1001), c.MetricsHTTPPort) assert.Equal(t, common.HexToAddress(l1TaikoAddress), c.L1TaikoAddress) assert.Equal(t, common.HexToAddress(bridgeAddress), c.BridgeAddress) - assert.Equal(t, common.HexToAddress(assignmentHookAddress), c.AssignmentHookAddress) assert.Equal(t, uint64(10), c.DatabaseMaxIdleConns) assert.Equal(t, uint64(10), c.DatabaseMaxOpenConns) assert.Equal(t, uint64(30), c.DatabaseMaxConnLifetime) @@ -77,7 +75,6 @@ func TestNewConfigFromCliContext(t *testing.T) { "--" + flags.DatabaseName.Name, "dbname", "--" + flags.L1TaikoAddress.Name, l1TaikoAddress, "--" + flags.BridgeAddress.Name, bridgeAddress, - "--" + flags.AssignmentHookAddress.Name, assignmentHookAddress, "--" + flags.MetricsHTTPPort.Name, metricsHttpPort, "--" + flags.DatabaseMaxIdleConns.Name, databaseMaxIdleConns, "--" + flags.DatabaseMaxOpenConns.Name, databaseMaxOpenConns, diff --git a/packages/eventindexer/indexer/filter.go b/packages/eventindexer/indexer/filter.go index 7f57ba342ad..6d457aed17a 100644 --- a/packages/eventindexer/indexer/filter.go +++ b/packages/eventindexer/indexer/filter.go @@ -101,16 +101,104 @@ func filterFunc( }) } - if i.assignmentHook != nil { + wg.Go(func() error { + if err := i.indexRawBlockData(ctx, chainID, filterOpts.Start, *filterOpts.End); err != nil { + return errors.Wrap(err, "i.indexRawBlockData") + } + + return nil + }) + + err := wg.Wait() + + if err != nil { + if errors.Is(err, context.Canceled) { + slog.Error("filter context cancelled") + return err + } + + return err + } + + return nil +} + +func filterFuncOntake( + ctx context.Context, + chainID *big.Int, + i *Indexer, + filterOpts *bind.FilterOpts, +) error { + wg, ctx := errgroup.WithContext(ctx) + + if i.taikol1 != nil { + wg.Go(func() error { + transitionProvedEvents, err := i.taikol1.FilterTransitionProvedV2(filterOpts, nil) + if err != nil { + return errors.Wrap(err, "i.taikol1.FilterTransitionProved") + } + + err = i.saveTransitionProvedEventsV2(ctx, chainID, transitionProvedEvents) + if err != nil { + return errors.Wrap(err, "i.saveTransitionProvedEvents") + } + + return nil + }) + wg.Go(func() error { - blocksAssigned, err := i.assignmentHook.FilterBlockAssigned(filterOpts, nil) + transitionContestedEvents, err := i.taikol1.FilterTransitionContestedV2(filterOpts, nil) if err != nil { - return errors.Wrap(err, "i.assignmentHook.FilterBlockAssigned") + return errors.Wrap(err, "i.taikol1.FilterTransitionContested") } - err = i.saveBlockAssignedEvents(ctx, chainID, blocksAssigned) + err = i.saveTransitionContestedEventsV2(ctx, chainID, transitionContestedEvents) if err != nil { - return errors.Wrap(err, "i.saveBlockAssignedEvents") + return errors.Wrap(err, "i.saveTransitionContestedEvents") + } + + return nil + }) + + wg.Go(func() error { + blockProposedEvents, err := i.taikol1.FilterBlockProposedV2(filterOpts, nil) + if err != nil { + return errors.Wrap(err, "i.taikol1.FilterBlockProposed") + } + + err = i.saveBlockProposedEventsV2(ctx, chainID, blockProposedEvents) + if err != nil { + return errors.Wrap(err, "i.saveBlockProposedEvents") + } + + return nil + }) + + wg.Go(func() error { + blockVerifiedEvents, err := i.taikol1.FilterBlockVerifiedV2(filterOpts, nil, nil) + if err != nil { + return errors.Wrap(err, "i.taikol1.FilterBlockVerified") + } + + err = i.saveBlockVerifiedEventsV2(ctx, chainID, blockVerifiedEvents) + if err != nil { + return errors.Wrap(err, "i.saveBlockVerifiedEvents") + } + + return nil + }) + } + + if i.bridge != nil { + wg.Go(func() error { + messagesSent, err := i.bridge.FilterMessageSent(filterOpts, nil) + if err != nil { + return errors.Wrap(err, "i.bridge.FilterMessageSent") + } + + err = i.saveMessageSentEvents(ctx, chainID, messagesSent) + if err != nil { + return errors.Wrap(err, "i.saveMessageSentEvents") } return nil @@ -141,7 +229,6 @@ func filterFunc( func (i *Indexer) filter( ctx context.Context, - filter FilterFunc, ) error { endBlockID, err := i.ethClient.BlockNumber(ctx) if err != nil { @@ -154,14 +241,35 @@ func (i *Indexer) filter( "batchSize", i.blockBatchSize, ) + if i.latestIndexedBlockNumber >= i.ontakeForkHeight { + i.isPostOntakeForkHeightReached = true + } + for j := i.latestIndexedBlockNumber + 1; j <= endBlockID; j += i.blockBatchSize { - end := i.latestIndexedBlockNumber + i.blockBatchSize + end := j + i.blockBatchSize - 1 + // if the end of the batch is greater than the latest block number, set end // to the latest block number if end > endBlockID { end = endBlockID } + if !i.isPostOntakeForkHeightReached && i.taikol1 != nil && i.ontakeForkHeight > i.latestIndexedBlockNumber && i.ontakeForkHeight < end { + slog.Info("ontake fork height reached", "height", i.ontakeForkHeight) + + i.isPostOntakeForkHeightReached = true + + end = i.ontakeForkHeight - 1 + + slog.Info("setting end block ID to ontakeForkHeight - 1", + "latestIndexedBlockNumber", + i.latestIndexedBlockNumber, + "ontakeForkHeight", i.ontakeForkHeight, + "endBlockID", end, + "isPostOntakeForkHeightReached", i.isPostOntakeForkHeightReached, + ) + } + slog.Info("block batch", "start", j, "end", end) filterOpts := &bind.FilterOpts{ @@ -170,6 +278,14 @@ func (i *Indexer) filter( Context: ctx, } + var filter FilterFunc + + if i.isPostOntakeForkHeightReached { + filter = filterFuncOntake + } else { + filter = filterFunc + } + if err := filter(ctx, new(big.Int).SetUint64(i.srcChainID), i, filterOpts); err != nil { return errors.Wrap(err, "filter") } diff --git a/packages/eventindexer/indexer/index_erc20_transfers.go b/packages/eventindexer/indexer/index_erc20_transfers.go new file mode 100644 index 00000000000..efe091b883c --- /dev/null +++ b/packages/eventindexer/indexer/index_erc20_transfers.go @@ -0,0 +1,263 @@ +package indexer + +import ( + "context" + "fmt" + "math/big" + "strings" + + "log/slog" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/pkg/errors" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "golang.org/x/sync/errgroup" +) + +// nolint: lll +const erc20ABI = `[{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"}]` + +// nolint: lll +const transferEventABI = `[{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]` + +// indexERc20Transfers indexes from a given starting block to a given end block and parses all event logs +// to find ERC20 transfer events and update balances +func (i *Indexer) indexERC20Transfers( + ctx context.Context, + chainID *big.Int, + logs []types.Log, +) error { + wg, ctx := errgroup.WithContext(ctx) + + for _, vLog := range logs { + l := vLog + + wg.Go(func() error { + if !i.isERC20Transfer(ctx, l) { + return nil + } + + if err := i.saveERC20Transfer(ctx, chainID, l); err != nil { + return err + } + + return nil + }) + } + + if err := wg.Wait(); err != nil { + return err + } + + return nil +} + +// isERC20Transfer determines whether a given log is a valid ERC20 transfer event +func (i *Indexer) isERC20Transfer(_ context.Context, vLog types.Log) bool { + // malformed event + if len(vLog.Topics) == 0 { + return false + } + + // the first topic is ALWAYS the hash of the event signature. + // this is how people are expected to look up which event is which. + if vLog.Topics[0].Hex() != logTransferSigHash.Hex() { + return false + } + + // erc20 transfer length will be 3, nft will be 4, only way to + // differentiate them + if len(vLog.Topics) != 3 { + return false + } + + return true +} + +// saveERC20Transfer updates the user's balances on the from and to of a ERC20 transfer event +func (i *Indexer) saveERC20Transfer(ctx context.Context, chainID *big.Int, vLog types.Log) error { + from := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[1].Bytes()[12:])) + + to := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[2].Bytes()[12:])) + + event := struct { + From common.Address + To common.Address + Value *big.Int + }{} + + // Parse the Transfer event ABI + parsedABI, err := abi.JSON(strings.NewReader(transferEventABI)) + if err != nil { + return errors.Wrap(err, "abi.JSON(strings.NewReader") + } + + err = parsedABI.UnpackIntoInterface(&event, "Transfer", vLog.Data) + if err != nil { + return errors.Wrap(err, "parsedABI.UnpackIntoInterface") + } + + amount := event.Value.String() + + slog.Info( + "erc20 transfer found", + "from", from, + "to", to, + "amount", event.Value.String(), + "contractAddress", vLog.Address.Hex(), + ) + + var pk int = 0 + + i.contractToMetadataMutex.Lock() + + md, ok := i.contractToMetadata[vLog.Address] + + i.contractToMetadataMutex.Unlock() + + if !ok { + md, err = i.erc20BalanceRepo.FindMetadata(ctx, chainID.Int64(), vLog.Address.Hex()) + if err != nil { + return errors.Wrap(err, "i.erc20BalanceRepo") + } + } + + if md != nil { + pk = md.ID + + i.contractToMetadataMutex.Lock() + + i.contractToMetadata[vLog.Address] = md + + i.contractToMetadataMutex.Unlock() + } + + if pk == 0 { + symbol, err := getERC20Symbol(ctx, i.ethClient, vLog.Address.Hex()) + if err != nil { + // some erc20 dont have symbol method properly, + // returns `invalid opcode`. + if strings.Contains(err.Error(), "invalid opcode") { + symbol = "ERC20" + } else { + return errors.Wrap(err, "getERC20Symbol") + } + } + + decimals, err := getERC20Decimals(ctx, i.ethClient, vLog.Address.Hex()) + if err != nil { + return errors.Wrap(err, "getERC20Decimals") + } + + pk, err = i.erc20BalanceRepo.CreateMetadata(ctx, chainID.Int64(), vLog.Address.Hex(), symbol, decimals) + if err != nil { + return errors.Wrap(err, "i.erc20BalanceRepo.CreateMetadata") + } + } + + // increment To address's balance + // decrement From address's balance + increaseOpts := eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: chainID.Int64(), + Address: to, + ContractAddress: vLog.Address.Hex(), + Amount: amount, + } + + decreaseOpts := eventindexer.UpdateERC20BalanceOpts{} + + // ignore zero address since that is usually the "mint" + if from != ZeroAddress.Hex() { + decreaseOpts = eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: chainID.Int64(), + Address: from, + ContractAddress: vLog.Address.Hex(), + Amount: amount, + } + } + + _, _, err = i.erc20BalanceRepo.IncreaseAndDecreaseBalancesInTx(ctx, increaseOpts, decreaseOpts) + if err != nil { + return errors.Wrap(err, "i.erc20BalanceRepo.IncreaseAndDecreaseBalancesInTx") + } + + return nil +} + +func getERC20Symbol(ctx context.Context, client *ethclient.Client, contractAddress string) (string, error) { + // Parse the contract address + address := common.HexToAddress(contractAddress) + + // Parse the ERC20 contract ABI + parsedABI, err := abi.JSON(strings.NewReader(erc20ABI)) + if err != nil { + return "", errors.Wrap(err, "abi.JSON") + } + + // Prepare the call message + callData, err := parsedABI.Pack("symbol") + if err != nil { + return "", errors.Wrap(err, "parsedABI.Pack") + } + + msg := ethereum.CallMsg{ + To: &address, + Data: callData, + } + + result, err := client.CallContract(ctx, msg, nil) + if err != nil { + return "", errors.Wrap(err, "client.CallContract") + } + + var symbol string + + err = parsedABI.UnpackIntoInterface(&symbol, "symbol", result) + if err != nil { + return "", errors.Wrap(err, "parsedABI.UnpackIntoInterface") + } + + return symbol, nil +} + +func getERC20Decimals(ctx context.Context, client *ethclient.Client, contractAddress string) (uint8, error) { + // Parse the contract address + address := common.HexToAddress(contractAddress) + + // Parse the ERC20 contract ABI + parsedABI, err := abi.JSON(strings.NewReader(erc20ABI)) + if err != nil { + return 0, err + } + + // Prepare the call message + callData, err := parsedABI.Pack("decimals") + if err != nil { + return 0, err + } + + msg := ethereum.CallMsg{ + To: &address, + Data: callData, + } + + result, err := client.CallContract(ctx, msg, nil) + if err != nil { + return 0, err + } + + var decimals uint8 + + err = parsedABI.UnpackIntoInterface(&decimals, "decimals", result) + if err != nil { + return 0, err + } + + return decimals, nil +} diff --git a/packages/eventindexer/indexer/index_nft_transfers.go b/packages/eventindexer/indexer/index_nft_transfers.go index f74295f7d7d..721323a2218 100644 --- a/packages/eventindexer/indexer/index_nft_transfers.go +++ b/packages/eventindexer/indexer/index_nft_transfers.go @@ -15,6 +15,7 @@ import ( "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/eventindexer" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/erc1155" + "golang.org/x/sync/errgroup" ) var ( @@ -33,21 +34,33 @@ func (i *Indexer) indexNFTTransfers( chainID *big.Int, logs []types.Log, ) error { + nftWg, ctx := errgroup.WithContext(ctx) + for _, vLog := range logs { - if !i.isERC721Transfer(ctx, vLog) && !i.isERC1155Transfer(ctx, vLog) { - continue - } + l := vLog - if err := i.saveNFTTransfer(ctx, chainID, vLog); err != nil { - return err - } + nftWg.Go(func() error { + if !i.isERC721Transfer(ctx, l) && !i.isERC1155Transfer(ctx, l) { + return nil + } + + if err := i.saveNFTTransfer(ctx, chainID, l); err != nil { + return errors.Wrap(err, "i.saveNFTTransfer") + } + + return nil + }) + } + + if err := nftWg.Wait(); err != nil { + return err } return nil } // isERC1155Transfer determines whether a given log is a valid ERC1155 transfer event -func (i *Indexer) isERC1155Transfer(ctx context.Context, vLog types.Log) bool { +func (i *Indexer) isERC1155Transfer(_ context.Context, vLog types.Log) bool { // malformed event if len(vLog.Topics) == 0 { return false @@ -64,7 +77,7 @@ func (i *Indexer) isERC1155Transfer(ctx context.Context, vLog types.Log) bool { } // isERC721Transfer determines whether a given log is a valid ERC721 transfer event -func (i *Indexer) isERC721Transfer(ctx context.Context, vLog types.Log) bool { +func (i *Indexer) isERC721Transfer(_ context.Context, vLog types.Log) bool { // malformed event if len(vLog.Topics) == 0 { return false @@ -102,9 +115,7 @@ func (i *Indexer) saveNFTTransfer(ctx context.Context, chainID *big.Int, vLog ty // saveERC721Transfer updates the user's balances on the from and to of a ERC721 transfer event func (i *Indexer) saveERC721Transfer(ctx context.Context, chainID *big.Int, vLog types.Log) error { from := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[1].Bytes()[12:])) - to := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[2].Bytes()[12:])) - tokenID := vLog.Topics[3].Big().Int64() slog.Info( @@ -151,7 +162,6 @@ func (i *Indexer) saveERC721Transfer(ctx context.Context, chainID *big.Int, vLog // the database and updates the user's balances func (i *Indexer) saveERC1155Transfer(ctx context.Context, chainID *big.Int, vLog types.Log) error { from := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[2].Bytes()[12:])) - to := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[3].Bytes()[12:])) slog.Info("erc1155 found") @@ -206,8 +216,6 @@ func (i *Indexer) saveERC1155Transfer(ctx context.Context, chainID *big.Int, vLo return err } } else if vLog.Topics[0].Hex() == transferBatchSignatureHash.Hex() { - slog.Info("erc1155 transfer batch") - type TransferBatchEvent struct { Operator common.Address From common.Address diff --git a/packages/eventindexer/indexer/index_raw_block_data.go b/packages/eventindexer/indexer/index_raw_block_data.go index 4438884f071..f37c0defbf7 100644 --- a/packages/eventindexer/indexer/index_raw_block_data.go +++ b/packages/eventindexer/indexer/index_raw_block_data.go @@ -24,7 +24,7 @@ func (i *Indexer) indexRawBlockData( // only index block/transaction data on L2 if i.layer == Layer2 { - for j := start; j < end; j++ { + for j := start; j <= end; j++ { id := j wg.Go(func() error { @@ -38,32 +38,45 @@ func (i *Indexer) indexRawBlockData( txs := block.Transactions() + txWg, ctx := errgroup.WithContext(ctx) + for _, tx := range txs { - slog.Info("transaction found", "hash", tx.Hash()) - receipt, err := i.ethClient.TransactionReceipt(ctx, tx.Hash()) - - if err != nil { - return err - } - - sender, err := i.ethClient.TransactionSender(ctx, tx, block.Hash(), receipt.TransactionIndex) - if err != nil { - return err - } - - if err := i.accountRepo.Save(ctx, sender, time.Unix(int64(block.Time()), 0)); err != nil { - return err - } - - if err := i.txRepo.Save(ctx, - tx, - sender, - block.Number(), - time.Unix(int64(block.Time()), 0), - receipt.ContractAddress, - ); err != nil { - return err - } + t := tx + + txWg.Go(func() error { + slog.Info("transaction found", "hash", t.Hash()) + + receipt, err := i.ethClient.TransactionReceipt(ctx, t.Hash()) + + if err != nil { + return errors.Wrap(err, "i.ethClient.TransactionReceipt") + } + + sender, err := i.ethClient.TransactionSender(ctx, t, block.Hash(), receipt.TransactionIndex) + if err != nil { + return errors.Wrap(err, "i.ethClient.TransactionSender") + } + + if err := i.accountRepo.Save(ctx, sender, time.Unix(int64(block.Time()), 0)); err != nil { + return errors.Wrap(err, "i.accountRepo.Save") + } + + if err := i.txRepo.Save(ctx, + t, + sender, + block.Number(), + time.Unix(int64(block.Time()), 0), + receipt.ContractAddress, + ); err != nil { + return errors.Wrap(err, "i.txRepo.Save") + } + + return nil + }) + } + + if err := txWg.Wait(); err != nil { + return err } return nil @@ -93,6 +106,16 @@ func (i *Indexer) indexRawBlockData( }) } + if i.indexERC20s { + wg.Go(func() error { + if err := i.indexERC20Transfers(ctx, chainID, logs); err != nil { + return errors.Wrap(err, "svc.indexERC20Transfers") + } + + return nil + }) + } + if err := wg.Wait(); err != nil { if errors.Is(err, context.Canceled) { slog.Error("index raw block data context cancelled") diff --git a/packages/eventindexer/indexer/indexer.go b/packages/eventindexer/indexer/indexer.go index 56d8a0cdb36..fe4a9562e26 100644 --- a/packages/eventindexer/indexer/indexer.go +++ b/packages/eventindexer/indexer/indexer.go @@ -9,12 +9,13 @@ import ( "github.com/cyberhorsey/errors" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" + "github.com/urfave/cli/v2" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/assignmenthook" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/bridge" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/taikol1" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/repo" - "github.com/urfave/cli/v2" ) var ( @@ -35,10 +36,13 @@ var ( ) type Indexer struct { - accountRepo eventindexer.AccountRepository - eventRepo eventindexer.EventRepository - nftBalanceRepo eventindexer.NFTBalanceRepository - txRepo eventindexer.TransactionRepository + db db.DB + + accountRepo eventindexer.AccountRepository + eventRepo eventindexer.EventRepository + nftBalanceRepo eventindexer.NFTBalanceRepository + erc20BalanceRepo eventindexer.ERC20BalanceRepository + txRepo eventindexer.TransactionRepository ethClient *ethclient.Client srcChainID uint64 @@ -48,12 +52,12 @@ type Indexer struct { blockBatchSize uint64 subscriptionBackoff time.Duration - taikol1 *taikol1.TaikoL1 - bridge *bridge.Bridge - assignmentHook *assignmenthook.AssignmentHook + taikol1 *taikol1.TaikoL1 + bridge *bridge.Bridge - indexNfts bool - layer string + indexNfts bool + indexERC20s bool + layer string wg *sync.WaitGroup ctx context.Context @@ -61,6 +65,12 @@ type Indexer struct { syncMode SyncMode blockSaveMutex *sync.Mutex + + contractToMetadata map[common.Address]*eventindexer.ERC20Metadata + contractToMetadataMutex *sync.Mutex + + ontakeForkHeight uint64 + isPostOntakeForkHeightReached bool } func (i *Indexer) Start() error { @@ -90,7 +100,7 @@ func (i *Indexer) eventLoop(ctx context.Context) { slog.Info("event loop context done") return case <-t.C: - if err := i.filter(ctx, filterFunc); err != nil { + if err := i.filter(ctx); err != nil { slog.Error("error filtering", "error", err) } } @@ -132,6 +142,11 @@ func InitFromConfig(ctx context.Context, i *Indexer, cfg *Config) error { return err } + erc20BalanceRepository, err := repo.NewERC20BalanceRepository(db) + if err != nil { + return err + } + txRepository, err := repo.NewTransactionRepository(db) if err != nil { return err @@ -169,21 +184,12 @@ func InitFromConfig(ctx context.Context, i *Indexer, cfg *Config) error { } } - var assignmentHookContract *assignmenthook.AssignmentHook - - if cfg.AssignmentHookAddress.Hex() != ZeroAddress.Hex() { - slog.Info("setting assignmentHookAddress", "addr", cfg.AssignmentHookAddress.Hex()) - - assignmentHookContract, err = assignmenthook.NewAssignmentHook(cfg.AssignmentHookAddress, ethClient) - if err != nil { - return errors.Wrap(err, "contracts.NewAssignmentHook") - } - } - + i.db = db i.blockSaveMutex = &sync.Mutex{} i.accountRepo = accountRepository i.eventRepo = eventRepository i.nftBalanceRepo = nftBalanceRepository + i.erc20BalanceRepo = erc20BalanceRepository i.txRepo = txRepository i.srcChainID = chainID.Uint64() @@ -191,18 +197,26 @@ func InitFromConfig(ctx context.Context, i *Indexer, cfg *Config) error { i.ethClient = ethClient i.taikol1 = taikoL1 i.bridge = bridgeContract - i.assignmentHook = assignmentHookContract i.blockBatchSize = cfg.BlockBatchSize i.subscriptionBackoff = time.Duration(cfg.SubscriptionBackoff) * time.Second i.wg = &sync.WaitGroup{} i.syncMode = cfg.SyncMode i.indexNfts = cfg.IndexNFTs + i.indexERC20s = cfg.IndexERC20s i.layer = cfg.Layer + i.contractToMetadata = make(map[common.Address]*eventindexer.ERC20Metadata, 0) + i.contractToMetadataMutex = &sync.Mutex{} + i.ontakeForkHeight = cfg.OntakeForkHeight return nil } func (i *Indexer) Close(ctx context.Context) { i.wg.Wait() + + // Close db connection. + if err := i.db.Close(); err != nil { + slog.Error("Failed to close db connection", "err", err) + } } diff --git a/packages/eventindexer/indexer/save_block_assigned_event.go b/packages/eventindexer/indexer/save_block_assigned_event.go deleted file mode 100644 index 9303bf9ab2e..00000000000 --- a/packages/eventindexer/indexer/save_block_assigned_event.go +++ /dev/null @@ -1,82 +0,0 @@ -package indexer - -import ( - "context" - "encoding/json" - "math/big" - "time" - - "log/slog" - - "github.com/pkg/errors" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/assignmenthook" -) - -func (i *Indexer) saveBlockAssignedEvents( - ctx context.Context, - chainID *big.Int, - events *assignmenthook.AssignmentHookBlockAssignedIterator, -) error { - if !events.Next() || events.Event == nil { - slog.Info("no blockAssigned events") - return nil - } - - for { - event := events.Event - - if err := i.saveBlockAssignedEvent(ctx, chainID, event); err != nil { - eventindexer.BlockAssignedEventsProcessedError.Inc() - - return errors.Wrap(err, "i.saveBlockAssignedEvent") - } - - if !events.Next() { - return nil - } - } -} - -func (i *Indexer) saveBlockAssignedEvent( - ctx context.Context, - chainID *big.Int, - event *assignmenthook.AssignmentHookBlockAssigned, -) error { - slog.Info("blockAssigned event", "prover", event.AssignedProver.Hex()) - - marshaled, err := json.Marshal(event) - if err != nil { - return errors.Wrap(err, "json.Marshal(event)") - } - - assignedProver := event.AssignedProver.Hex() - - block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) - if err != nil { - return errors.Wrap(err, "i.ethClient.BlockByNumber") - } - - feeToken := event.Assignment.FeeToken.Hex() - - _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ - Name: eventindexer.EventNameBlockAssigned, - Data: string(marshaled), - ChainID: chainID, - Event: eventindexer.EventNameBlockAssigned, - Address: "", - AssignedProver: &assignedProver, - TransactedAt: time.Unix(int64(block.Time()), 0).UTC(), - Amount: big.NewInt(0), - ProofReward: big.NewInt(0), - FeeTokenAddress: &feeToken, - EmittedBlockID: event.Raw.BlockNumber, - }) - if err != nil { - return errors.Wrap(err, "i.eventRepo.Save") - } - - eventindexer.BlockProposedEventsProcessed.Inc() - - return nil -} diff --git a/packages/eventindexer/indexer/save_block_proposed_event.go b/packages/eventindexer/indexer/save_block_proposed_event.go index 030a01ddc0d..86585a0c963 100644 --- a/packages/eventindexer/indexer/save_block_proposed_event.go +++ b/packages/eventindexer/indexer/save_block_proposed_event.go @@ -12,6 +12,7 @@ import ( "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/eventindexer" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/taikol1" + "golang.org/x/sync/errgroup" ) func (i *Indexer) saveBlockProposedEvents( @@ -24,29 +25,41 @@ func (i *Indexer) saveBlockProposedEvents( return nil } + wg, ctx := errgroup.WithContext(ctx) + for { event := events.Event - tx, _, err := i.ethClient.TransactionByHash(ctx, event.Raw.TxHash) - if err != nil { - return errors.Wrap(err, "i.ethClient.TransactionByHash") - } + wg.Go(func() error { + tx, _, err := i.ethClient.TransactionByHash(ctx, event.Raw.TxHash) + if err != nil { + return errors.Wrap(err, "i.ethClient.TransactionByHash") + } - sender, err := i.ethClient.TransactionSender(ctx, tx, event.Raw.BlockHash, event.Raw.TxIndex) - if err != nil { - return errors.Wrap(err, "i.ethClient.TransactionSender") - } + sender, err := i.ethClient.TransactionSender(ctx, tx, event.Raw.BlockHash, event.Raw.TxIndex) + if err != nil { + return errors.Wrap(err, "i.ethClient.TransactionSender") + } - if err := i.saveBlockProposedEvent(ctx, chainID, event, sender); err != nil { - eventindexer.BlockProposedEventsProcessedError.Inc() + if err := i.saveBlockProposedEvent(ctx, chainID, event, sender); err != nil { + eventindexer.BlockProposedEventsProcessedError.Inc() - return errors.Wrap(err, "i.saveBlockProposedEvent") - } + return errors.Wrap(err, "i.saveBlockProposedEvent") + } - if !events.Next() { return nil + }) + + if !events.Next() { + break } } + + if err := wg.Wait(); err != nil { + return err + } + + return nil } func (i *Indexer) saveBlockProposedEvent( @@ -90,3 +103,89 @@ func (i *Indexer) saveBlockProposedEvent( return nil } + +func (i *Indexer) saveBlockProposedEventsV2( + ctx context.Context, + chainID *big.Int, + events *taikol1.TaikoL1BlockProposedV2Iterator, +) error { + if !events.Next() || events.Event == nil { + slog.Info("no blockProposedV2 events") + return nil + } + + wg, ctx := errgroup.WithContext(ctx) + + for { + event := events.Event + + wg.Go(func() error { + tx, _, err := i.ethClient.TransactionByHash(ctx, event.Raw.TxHash) + if err != nil { + return errors.Wrap(err, "i.ethClient.TransactionByHash") + } + + sender, err := i.ethClient.TransactionSender(ctx, tx, event.Raw.BlockHash, event.Raw.TxIndex) + if err != nil { + return errors.Wrap(err, "i.ethClient.TransactionSender") + } + + if err := i.saveBlockProposedEventV2(ctx, chainID, event, sender); err != nil { + eventindexer.BlockProposedEventsProcessedError.Inc() + + return errors.Wrap(err, "i.saveBlockProposedEvent") + } + + return nil + }) + + if !events.Next() { + break + } + } + + if err := wg.Wait(); err != nil { + return err + } + + return nil +} + +func (i *Indexer) saveBlockProposedEventV2( + ctx context.Context, + chainID *big.Int, + event *taikol1.TaikoL1BlockProposedV2, + sender common.Address, +) error { + slog.Info("blockProposed", "proposer", sender.Hex()) + + marshaled, err := json.Marshal(event) + if err != nil { + return errors.Wrap(err, "json.Marshal(event)") + } + + blockID := event.BlockId.Int64() + + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + if err != nil { + return errors.Wrap(err, "i.ethClient.BlockByNumber") + } + + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameBlockProposed, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameBlockProposed, + Address: sender.Hex(), + BlockID: &blockID, + TransactedAt: time.Unix(int64(block.Time()), 0).UTC(), + EmittedBlockID: event.Raw.BlockNumber, + }) + if err != nil { + return errors.Wrap(err, "i.eventRepo.Save") + } + + eventindexer.BlockProposedEventsProcessed.Inc() + + return nil +} diff --git a/packages/eventindexer/indexer/save_block_verified_event.go b/packages/eventindexer/indexer/save_block_verified_event.go index 835794f4848..1edcb560c9c 100644 --- a/packages/eventindexer/indexer/save_block_verified_event.go +++ b/packages/eventindexer/indexer/save_block_verified_event.go @@ -11,6 +11,7 @@ import ( "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/eventindexer" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/taikol1" + "golang.org/x/sync/errgroup" ) func (i *Indexer) saveBlockVerifiedEvents( @@ -23,19 +24,31 @@ func (i *Indexer) saveBlockVerifiedEvents( return nil } + wg, ctx := errgroup.WithContext(ctx) + for { event := events.Event - if err := i.saveBlockVerifiedEvent(ctx, chainID, event); err != nil { - eventindexer.BlockVerifiedEventsProcessedError.Inc() + wg.Go(func() error { + if err := i.saveBlockVerifiedEvent(ctx, chainID, event); err != nil { + eventindexer.BlockVerifiedEventsProcessedError.Inc() - return errors.Wrap(err, "i.saveBlockVerifiedEvent") - } + return errors.Wrap(err, "i.saveBlockVerifiedEvent") + } - if !events.Next() { return nil + }) + + if !events.Next() { + break } } + + if err := wg.Wait(); err != nil { + return err + } + + return nil } func (i *Indexer) saveBlockVerifiedEvent( @@ -75,3 +88,78 @@ func (i *Indexer) saveBlockVerifiedEvent( return nil } + +func (i *Indexer) saveBlockVerifiedEventsV2( + ctx context.Context, + chainID *big.Int, + events *taikol1.TaikoL1BlockVerifiedV2Iterator, +) error { + if !events.Next() || events.Event == nil { + slog.Info("no BlockVerified events") + return nil + } + + wg, ctx := errgroup.WithContext(ctx) + + for { + event := events.Event + + wg.Go(func() error { + if err := i.saveBlockVerifiedEventV2(ctx, chainID, event); err != nil { + eventindexer.BlockVerifiedEventsProcessedError.Inc() + + return errors.Wrap(err, "i.saveBlockVerifiedEvent") + } + + return nil + }) + + if !events.Next() { + break + } + } + + if err := wg.Wait(); err != nil { + return err + } + + return nil +} + +func (i *Indexer) saveBlockVerifiedEventV2( + ctx context.Context, + chainID *big.Int, + event *taikol1.TaikoL1BlockVerifiedV2, +) error { + slog.Info("new blockVerified event", "blockID", event.BlockId.Int64()) + + marshaled, err := json.Marshal(event) + if err != nil { + return errors.Wrap(err, "json.Marshal(event)") + } + + blockID := event.BlockId.Int64() + + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + if err != nil { + return errors.Wrap(err, "i.ethClient.BlockByNumber") + } + + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameBlockVerified, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameBlockVerified, + Address: "", + BlockID: &blockID, + TransactedAt: time.Unix(int64(block.Time()), 0), + EmittedBlockID: event.Raw.BlockNumber, + }) + if err != nil { + return errors.Wrap(err, "i.eventRepo.Save") + } + + eventindexer.BlockVerifiedEventsProcessed.Inc() + + return nil +} diff --git a/packages/eventindexer/indexer/save_message_sent_event.go b/packages/eventindexer/indexer/save_message_sent_event.go index 84fc6f6260b..01d076f99f5 100644 --- a/packages/eventindexer/indexer/save_message_sent_event.go +++ b/packages/eventindexer/indexer/save_message_sent_event.go @@ -11,6 +11,7 @@ import ( "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/eventindexer" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/bridge" + "golang.org/x/sync/errgroup" ) func (i *Indexer) saveMessageSentEvents( @@ -20,24 +21,37 @@ func (i *Indexer) saveMessageSentEvents( ) error { if !events.Next() || events.Event == nil { slog.Info("no MessageSent events") + return nil } + wg, ctx := errgroup.WithContext(ctx) + for { event := events.Event - slog.Info("new messageSent event", "owner", event.Message.From.Hex()) + wg.Go(func() error { + slog.Info("new messageSent event", "owner", event.Message.From.Hex()) - if err := i.saveMessageSentEvent(ctx, chainID, event); err != nil { - eventindexer.MessageSentEventsProcessedError.Inc() + if err := i.saveMessageSentEvent(ctx, chainID, event); err != nil { + eventindexer.MessageSentEventsProcessedError.Inc() - return errors.Wrap(err, "i.saveMessageSentEvent") - } + return errors.Wrap(err, "i.saveMessageSentEvent") + } - if !events.Next() { return nil + }) + + if !events.Next() { + break } } + + if err := wg.Wait(); err != nil { + return err + } + + return nil } func (i *Indexer) saveMessageSentEvent( diff --git a/packages/eventindexer/indexer/save_transition_contested_event.go b/packages/eventindexer/indexer/save_transition_contested_event.go index fe2499e564e..a36c72c8ffc 100644 --- a/packages/eventindexer/indexer/save_transition_contested_event.go +++ b/packages/eventindexer/indexer/save_transition_contested_event.go @@ -81,3 +81,72 @@ func (i *Indexer) saveTransitionContestedEvent( return nil } + +func (i *Indexer) saveTransitionContestedEventsV2( + ctx context.Context, + chainID *big.Int, + events *taikol1.TaikoL1TransitionContestedV2Iterator, +) error { + if !events.Next() || events.Event == nil { + slog.Info("no transitionContested events") + return nil + } + + for { + event := events.Event + + if err := i.saveTransitionContestedEventV2(ctx, chainID, event); err != nil { + eventindexer.TransitionContestedEventsProcessedError.Inc() + + return errors.Wrap(err, "i.saveBlockProvenEvent") + } + + if !events.Next() { + return nil + } + } +} + +func (i *Indexer) saveTransitionContestedEventV2( + ctx context.Context, + chainID *big.Int, + event *taikol1.TaikoL1TransitionContestedV2, +) error { + slog.Info("transitionContested event found", + "blockID", event.BlockId.Int64(), + "contestBond", event.ContestBond.String(), + "contester", event.Contester.Hex(), + "tier", event.Tier, + ) + + marshaled, err := json.Marshal(event) + if err != nil { + return errors.Wrap(err, "json.Marshal(event)") + } + + blockID := event.BlockId.Int64() + + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + if err != nil { + return errors.Wrap(err, "i.ethClient.BlockByNumber") + } + + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameTransitionContested, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameTransitionContested, + Address: event.Contester.Hex(), + BlockID: &blockID, + TransactedAt: time.Unix(int64(block.Time()), 0), + Tier: &event.Tier, + EmittedBlockID: event.Raw.BlockNumber, + }) + if err != nil { + return errors.Wrap(err, "i.eventRepo.Save") + } + + eventindexer.TransitionContestedEventsProcessed.Inc() + + return nil +} diff --git a/packages/eventindexer/indexer/save_transition_proved_event.go b/packages/eventindexer/indexer/save_transition_proved_event.go index 212e67046d3..54f26caaa35 100644 --- a/packages/eventindexer/indexer/save_transition_proved_event.go +++ b/packages/eventindexer/indexer/save_transition_proved_event.go @@ -11,6 +11,7 @@ import ( "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/eventindexer" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/taikol1" + "golang.org/x/sync/errgroup" ) func (i *Indexer) saveTransitionProvedEvents( @@ -23,19 +24,31 @@ func (i *Indexer) saveTransitionProvedEvents( return nil } + wg, ctx := errgroup.WithContext(ctx) + for { event := events.Event - if err := i.saveTransitionProvedEvent(ctx, chainID, event); err != nil { - eventindexer.TransitionProvedEventsProcessedError.Inc() + wg.Go(func() error { + if err := i.saveTransitionProvedEvent(ctx, chainID, event); err != nil { + eventindexer.TransitionProvedEventsProcessedError.Inc() - return errors.Wrap(err, "i.saveBlockProvenEvent") - } + return errors.Wrap(err, "i.saveBlockProvenEvent") + } - if !events.Next() { return nil + }) + + if !events.Next() { + break } } + + if err := wg.Wait(); err != nil { + return err + } + + return nil } func (i *Indexer) saveTransitionProvedEvent( @@ -78,3 +91,81 @@ func (i *Indexer) saveTransitionProvedEvent( return nil } + +func (i *Indexer) saveTransitionProvedEventsV2( + ctx context.Context, + chainID *big.Int, + events *taikol1.TaikoL1TransitionProvedV2Iterator, +) error { + if !events.Next() || events.Event == nil { + slog.Info("no transitionProved events") + return nil + } + + wg, ctx := errgroup.WithContext(ctx) + + for { + event := events.Event + + wg.Go(func() error { + if err := i.saveTransitionProvedEventV2(ctx, chainID, event); err != nil { + eventindexer.TransitionProvedEventsProcessedError.Inc() + + return errors.Wrap(err, "i.saveBlockProvenEvent") + } + + return nil + }) + + if !events.Next() { + break + } + } + + if err := wg.Wait(); err != nil { + return err + } + + return nil +} + +func (i *Indexer) saveTransitionProvedEventV2( + ctx context.Context, + chainID *big.Int, + event *taikol1.TaikoL1TransitionProvedV2, +) error { + slog.Info("transitionProved event found", + "blockID", event.BlockId.Int64(), + "prover", event.Prover.Hex()) + + marshaled, err := json.Marshal(event) + if err != nil { + return errors.Wrap(err, "json.Marshal(event)") + } + + blockID := event.BlockId.Int64() + + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + if err != nil { + return errors.Wrap(err, "i.ethClient.BlockByNumber") + } + + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameTransitionProved, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameTransitionProved, + Address: event.Prover.Hex(), + BlockID: &blockID, + TransactedAt: time.Unix(int64(block.Time()), 0), + Tier: &event.Tier, + EmittedBlockID: event.Raw.BlockNumber, + }) + if err != nil { + return errors.Wrap(err, "i.eventRepo.Save") + } + + eventindexer.TransitionProvedEventsProcessed.Inc() + + return nil +} diff --git a/packages/eventindexer/indexer/set_initial_processing_block_height.go b/packages/eventindexer/indexer/set_initial_processing_block_height.go index 619fac1933e..cc8e47830a3 100644 --- a/packages/eventindexer/indexer/set_initial_processing_block_height.go +++ b/packages/eventindexer/indexer/set_initial_processing_block_height.go @@ -2,6 +2,7 @@ package indexer import ( "context" + "log/slog" "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/eventindexer" @@ -25,7 +26,7 @@ func (i *Indexer) setInitialIndexingBlockByMode( switch mode { case Sync: // get most recently processed block height from the DB - latest, err := i.eventRepo.FindLatestBlockID( + latest, err := i.eventRepo.FindLatestBlockID(ctx, i.srcChainID, ) if err != nil { @@ -41,6 +42,8 @@ func (i *Indexer) setInitialIndexingBlockByMode( return eventindexer.ErrInvalidMode } + slog.Info("startingBlock", "startingBlock", startingBlock) + i.latestIndexedBlockNumber = startingBlock return nil diff --git a/packages/eventindexer/migrations/20270906208840_create_erc20_metadata_table.sql b/packages/eventindexer/migrations/20270906208840_create_erc20_metadata_table.sql new file mode 100644 index 00000000000..a6042b2bc3d --- /dev/null +++ b/packages/eventindexer/migrations/20270906208840_create_erc20_metadata_table.sql @@ -0,0 +1,18 @@ +-- +goose Up +-- +goose StatementBegin +CREATE TABLE IF NOT EXISTS erc20_metadata ( + id int NOT NULL PRIMARY KEY AUTO_INCREMENT, + chain_id int NOT NULL, + symbol varchar(42) NOT NULL, + decimals int NOT NULL, + contract_address varchar(42) not null, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP , + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + UNIQUE KEY (id, chain_id) +); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +DROP TABLE erc20_metadata; +-- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20270906208841_create_erc20_balances_table.sql b/packages/eventindexer/migrations/20270906208841_create_erc20_balances_table.sql new file mode 100644 index 00000000000..fac836073cc --- /dev/null +++ b/packages/eventindexer/migrations/20270906208841_create_erc20_balances_table.sql @@ -0,0 +1,19 @@ +-- +goose Up +-- +goose StatementBegin +CREATE TABLE IF NOT EXISTS erc20_balances ( + id int NOT NULL PRIMARY KEY AUTO_INCREMENT, + erc20_metadata_id int NOT NULL, + chain_id int NOT NULL, + address VARCHAR(42) NOT NULL DEFAULT "", + amount VARCHAR(200) DEFAULT "0", + contract_address VARCHAR(42) NOT NULL DEFAULT "", + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP , + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (erc20_metadata_id, chain_id) REFERENCES erc20_metadata(id, chain_id) +); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +DROP TABLE erc20_balances; +-- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20270906208842_alter_erc20_balances_table_add_indexes.sql b/packages/eventindexer/migrations/20270906208842_alter_erc20_balances_table_add_indexes.sql new file mode 100644 index 00000000000..5489670cb15 --- /dev/null +++ b/packages/eventindexer/migrations/20270906208842_alter_erc20_balances_table_add_indexes.sql @@ -0,0 +1,10 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `erc20_balances` ADD INDEX `erc20_balance_chain_id_amount_address_index` (`chain_id`, `amount`, `address`); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +ALTER TABLE erc20_balances + DROP INDEX erc20_balance_chain_id_amount_address_index +-- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20270906208843_alter_erc20_metadata_table_add_indexes.sql b/packages/eventindexer/migrations/20270906208843_alter_erc20_metadata_table_add_indexes.sql new file mode 100644 index 00000000000..6071b0edb6d --- /dev/null +++ b/packages/eventindexer/migrations/20270906208843_alter_erc20_metadata_table_add_indexes.sql @@ -0,0 +1,10 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `erc20_metadata` ADD INDEX `erc20_balance_chain_id_contract_address_index` (`chain_id`, `contract_address`); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +ALTER TABLE erc20_metadata + DROP INDEX erc20_balance_chain_id_contract_address_index +-- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20270906208844_alter_events_table_add_block_id_event_index.sql b/packages/eventindexer/migrations/20270906208844_alter_events_table_add_block_id_event_index.sql new file mode 100644 index 00000000000..02903d315a1 --- /dev/null +++ b/packages/eventindexer/migrations/20270906208844_alter_events_table_add_block_id_event_index.sql @@ -0,0 +1,10 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `events` ADD INDEX `events_block_id_event_index` (`block_id`, `event`); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +ALTER TABLE events + DROP INDEX events_block_id_event_index +-- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20270906208852_alter_erc20_balances_addtl_indexes.sql b/packages/eventindexer/migrations/20270906208852_alter_erc20_balances_addtl_indexes.sql new file mode 100644 index 00000000000..b1de320be73 --- /dev/null +++ b/packages/eventindexer/migrations/20270906208852_alter_erc20_balances_addtl_indexes.sql @@ -0,0 +1,10 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `erc20_balances` ADD INDEX `erc20_balances_contract_address_address_chain_id_index` (`contract_address`, `address`, `chain_id`); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +ALTER TABLE erc20_balances DROP INDEX erc20_balances_contract_address_address_chain_id_index, + DROP INDEX erc20_balances_contract_address-- +goose StatementEnd +-- +goose StatementEnd \ No newline at end of file diff --git a/packages/eventindexer/pkg/db/db.go b/packages/eventindexer/pkg/db/db.go index 3b865643fb7..0fd3e6a7500 100644 --- a/packages/eventindexer/pkg/db/db.go +++ b/packages/eventindexer/pkg/db/db.go @@ -3,33 +3,48 @@ package db import ( "database/sql" "fmt" + "github.com/cyberhorsey/errors" "time" - "github.com/cyberhorsey/errors" "gorm.io/gorm" ) -type DB struct { +var ( + ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") +) + +type DB interface { + DB() (*sql.DB, error) + GormDB() *gorm.DB + Close() error +} + +type Database struct { gormdb *gorm.DB } -func (db *DB) DB() (*sql.DB, error) { +func (db *Database) DB() (*sql.DB, error) { return db.gormdb.DB() } -func (db *DB) GormDB() *gorm.DB { +func (db *Database) GormDB() *gorm.DB { return db.gormdb } -func New(gormdb *gorm.DB) *DB { - return &DB{ - gormdb: gormdb, +func (db *Database) Close() error { + sqlDB, err := db.DB() + if err != nil { + return err } + + return sqlDB.Close() } -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") -) +func New(gormdb *gorm.DB) DB { + return &Database{ + gormdb: gormdb, + } +} type DBConnectionOpts struct { Name string @@ -39,10 +54,10 @@ type DBConnectionOpts struct { MaxIdleConns uint64 MaxOpenConns uint64 MaxConnLifetime uint64 - OpenFunc func(dsn string) (*DB, error) + OpenFunc func(dsn string) (DB, error) } -func OpenDBConnection(opts DBConnectionOpts) (*DB, error) { +func OpenDBConnection(opts DBConnectionOpts) (DB, error) { dsn := "" if opts.Password == "" { dsn = fmt.Sprintf( diff --git a/packages/eventindexer/pkg/flags/config.go b/packages/eventindexer/pkg/flags/config.go index e206f701dca..3211077a161 100644 --- a/packages/eventindexer/pkg/flags/config.go +++ b/packages/eventindexer/pkg/flags/config.go @@ -6,8 +6,9 @@ import ( "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" "github.com/urfave/cli/v2" + + "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" ) // InitTxmgrConfigsFromCli initializes the transaction manager configs from the command line flags. diff --git a/packages/eventindexer/pkg/http/get_block_proposed_by.go b/packages/eventindexer/pkg/http/get_block_proposed_by.go new file mode 100644 index 00000000000..30a3c44c325 --- /dev/null +++ b/packages/eventindexer/pkg/http/get_block_proposed_by.go @@ -0,0 +1,36 @@ +package http + +import ( + "net/http" + "strconv" + + "github.com/cyberhorsey/webutils" + "github.com/labstack/echo/v4" +) + +// GetBlockProposedBy +// +// returns events by address and name of the event +// +// @Summary Get block proposed by +// @ID get-block-proposed-by +// @Param blockID query string true "blockID to query" +// @Accept json +// @Produce json +// @Success 200 {object} []eventindexer.Event +// @Router /blockProposedBy [get] +func (srv *Server) GetBlockProposedBy(c echo.Context) error { + blockID, err := strconv.Atoi(c.QueryParam("blockID")) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + proposed, err := srv.eventRepo.GetBlockProposedBy(c.Request().Context(), + blockID, + ) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + return c.JSON(http.StatusOK, proposed) +} diff --git a/packages/eventindexer/pkg/http/get_block_proven_by.go b/packages/eventindexer/pkg/http/get_block_proven_by.go new file mode 100644 index 00000000000..3b4609af5c2 --- /dev/null +++ b/packages/eventindexer/pkg/http/get_block_proven_by.go @@ -0,0 +1,48 @@ +package http + +import ( + "net/http" + "strconv" + + "github.com/cyberhorsey/webutils" + "github.com/labstack/echo/v4" +) + +// GetBlockProvenBy +// +// returns events by address and name of the event +// +// @Summary Get block proven by +// @ID get-block-proven-by +// @Param blockID query string true "blockID to query" +// @Accept json +// @Produce json +// @Success 200 {object} []eventindexer.Event +// @Router /blockProvenBy [get] +func (srv *Server) GetBlockProvenBy(c echo.Context) error { + blockID, err := strconv.Atoi(c.QueryParam("blockID")) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + events, err := srv.eventRepo.GetBlockProvenBy( + c.Request().Context(), + blockID, + ) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + proposed, err := srv.eventRepo.GetBlockProposedBy(c.Request().Context(), + blockID, + ) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + for _, event := range events { + event.AssignedProver = proposed.AssignedProver + } + + return c.JSON(http.StatusOK, events) +} diff --git a/packages/eventindexer/pkg/http/get_by_address_and_event_test.go b/packages/eventindexer/pkg/http/get_by_address_and_event_test.go index 8923252bd60..22d9ce8742b 100644 --- a/packages/eventindexer/pkg/http/get_by_address_and_event_test.go +++ b/packages/eventindexer/pkg/http/get_by_address_and_event_test.go @@ -16,7 +16,7 @@ import ( ) func Test_GetByAddressAndEvent(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() _, err := srv.eventRepo.Save(context.Background(), eventindexer.SaveEventOpts{ Name: "name", diff --git a/packages/eventindexer/pkg/http/get_count_by_address_and_event_test.go b/packages/eventindexer/pkg/http/get_count_by_address_and_event_test.go index 6a3d6819c62..23df67f30dc 100644 --- a/packages/eventindexer/pkg/http/get_count_by_address_and_event_test.go +++ b/packages/eventindexer/pkg/http/get_count_by_address_and_event_test.go @@ -16,7 +16,7 @@ import ( ) func Test_GetCountByAddressAndEvent(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() _, err := srv.eventRepo.Save(context.Background(), eventindexer.SaveEventOpts{ Name: "name", diff --git a/packages/eventindexer/pkg/http/get_erc20_balances_by_address_and_chain_id.go b/packages/eventindexer/pkg/http/get_erc20_balances_by_address_and_chain_id.go new file mode 100644 index 00000000000..b8cd8b2a879 --- /dev/null +++ b/packages/eventindexer/pkg/http/get_erc20_balances_by_address_and_chain_id.go @@ -0,0 +1,46 @@ +package http + +import ( + "net/http" + + "github.com/cyberhorsey/webutils" + "github.com/labstack/echo/v4" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" +) + +// GetERC20BalancesByAddressAndChainID +// +// returns erc20 balances by address and chain ID +// +// @Summary Get erc20 balances by address and chain ID +// @ID get-erc20-balances-by-address-and-chain-id +// @Param address query string true "address to query" +// @Param chainID query string true "chainID to query" +// @Accept json +// @Produce json +// @Success 200 {object} paginate.Page +// @Router /erc20sByAddress [get] +func (srv *Server) GetERC20BalancesByAddressAndChainID(c echo.Context) error { + page, err := srv.erc20BalanceRepo.FindByAddress( + c.Request().Context(), + c.Request(), + c.QueryParam("address"), + c.QueryParam("chainID"), + ) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + for i := range *page.Items.(*[]eventindexer.ERC20Balance) { + v := &(*page.Items.(*[]eventindexer.ERC20Balance))[i] + + md, err := srv.erc20BalanceRepo.FindMetadata(c.Request().Context(), v.ChainID, v.ContractAddress) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + v.Metadata = md + } + + return c.JSON(http.StatusOK, page) +} diff --git a/packages/eventindexer/pkg/http/get_unique_proposers_test.go b/packages/eventindexer/pkg/http/get_unique_proposers_test.go index bdfcfcb6dcc..fa2e867ae67 100644 --- a/packages/eventindexer/pkg/http/get_unique_proposers_test.go +++ b/packages/eventindexer/pkg/http/get_unique_proposers_test.go @@ -15,7 +15,7 @@ import ( ) func Test_GetUniqueProposers(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() _, err := srv.eventRepo.Save(context.Background(), eventindexer.SaveEventOpts{ Name: "name", diff --git a/packages/eventindexer/pkg/http/get_unique_provers_test.go b/packages/eventindexer/pkg/http/get_unique_provers_test.go index a8a586fe1a2..72353cc2f86 100644 --- a/packages/eventindexer/pkg/http/get_unique_provers_test.go +++ b/packages/eventindexer/pkg/http/get_unique_provers_test.go @@ -15,7 +15,7 @@ import ( ) func Test_GetUniqueProvers(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() _, err := srv.eventRepo.Save(context.Background(), eventindexer.SaveEventOpts{ Name: "name", diff --git a/packages/eventindexer/pkg/http/routes.go b/packages/eventindexer/pkg/http/routes.go index 090ef4b71e7..feb3b07a7b1 100644 --- a/packages/eventindexer/pkg/http/routes.go +++ b/packages/eventindexer/pkg/http/routes.go @@ -10,6 +10,9 @@ func (srv *Server) configureRoutes() { srv.echo.GET("/events", srv.GetByAddressAndEventName) srv.echo.GET("/assignedBlocks", srv.GetAssignedBlocksByProverAddress) srv.echo.GET("/nftsByAddress", srv.GetNFTBalancesByAddressAndChainID) + srv.echo.GET("/blockProvenBy", srv.GetBlockProvenBy) + srv.echo.GET("/blockProposedBy", srv.GetBlockProposedBy) + srv.echo.GET("/erc20ByAddress", srv.GetERC20BalancesByAddressAndChainID) galaxeAPI := srv.echo.Group("/api") diff --git a/packages/eventindexer/pkg/http/server.go b/packages/eventindexer/pkg/http/server.go index 7a49cc20a7c..707f3a8075d 100644 --- a/packages/eventindexer/pkg/http/server.go +++ b/packages/eventindexer/pkg/http/server.go @@ -23,25 +23,27 @@ import ( // @contact.email info@taiko.xyz // @license.name MIT -// @license.url https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md +// @license.url https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE // @host eventindexer.hekla.taiko.xyz // Server represents an eventindexer http server instance. type Server struct { - echo *echo.Echo - eventRepo eventindexer.EventRepository - nftBalanceRepo eventindexer.NFTBalanceRepository - chartRepo eventindexer.ChartRepository - cache *cache.Cache + echo *echo.Echo + eventRepo eventindexer.EventRepository + nftBalanceRepo eventindexer.NFTBalanceRepository + erc20BalanceRepo eventindexer.ERC20BalanceRepository + chartRepo eventindexer.ChartRepository + cache *cache.Cache } type NewServerOpts struct { - Echo *echo.Echo - EventRepo eventindexer.EventRepository - NFTBalanceRepo eventindexer.NFTBalanceRepository - ChartRepo eventindexer.ChartRepository - EthClient *ethclient.Client - CorsOrigins []string + Echo *echo.Echo + EventRepo eventindexer.EventRepository + NFTBalanceRepo eventindexer.NFTBalanceRepository + ERC20BalanceRepo eventindexer.ERC20BalanceRepository + ChartRepo eventindexer.ChartRepository + EthClient *ethclient.Client + CorsOrigins []string } func (opts NewServerOpts) Validate() error { @@ -53,10 +55,6 @@ func (opts NewServerOpts) Validate() error { return eventindexer.ErrNoEventRepository } - if opts.CorsOrigins == nil { - return eventindexer.ErrNoCORSOrigins - } - if opts.NFTBalanceRepo == nil { return eventindexer.ErrNoNFTBalanceRepository } @@ -72,11 +70,12 @@ func NewServer(opts NewServerOpts) (*Server, error) { cache := cache.New(5*time.Minute, 10*time.Minute) srv := &Server{ - echo: opts.Echo, - eventRepo: opts.EventRepo, - nftBalanceRepo: opts.NFTBalanceRepo, - chartRepo: opts.ChartRepo, - cache: cache, + echo: opts.Echo, + eventRepo: opts.EventRepo, + nftBalanceRepo: opts.NFTBalanceRepo, + erc20BalanceRepo: opts.ERC20BalanceRepo, + chartRepo: opts.ChartRepo, + cache: cache, } corsOrigins := opts.CorsOrigins diff --git a/packages/eventindexer/pkg/http/server_test.go b/packages/eventindexer/pkg/http/server_test.go index b62c9df8ffc..ea28c836bd4 100644 --- a/packages/eventindexer/pkg/http/server_test.go +++ b/packages/eventindexer/pkg/http/server_test.go @@ -16,14 +16,15 @@ import ( "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/repo" ) -func newTestServer(url string) *Server { +func newTestServer() *Server { _ = godotenv.Load("../.test.env") srv := &Server{ - cache: cache.New(5*time.Second, 6*time.Second), - echo: echo.New(), - eventRepo: mock.NewEventRepository(), - nftBalanceRepo: mock.NewNFTBalanceRepository(), + cache: cache.New(5*time.Second, 6*time.Second), + echo: echo.New(), + eventRepo: mock.NewEventRepository(), + nftBalanceRepo: mock.NewNFTBalanceRepository(), + erc20BalanceRepo: mock.NewERC20BalanceRepository(), } srv.configureMiddleware([]string{"*"}) @@ -41,10 +42,11 @@ func Test_NewServer(t *testing.T) { { "success", NewServerOpts{ - Echo: echo.New(), - EventRepo: &repo.EventRepository{}, - CorsOrigins: make([]string, 0), - NFTBalanceRepo: &repo.NFTBalanceRepository{}, + Echo: echo.New(), + EventRepo: &repo.EventRepository{}, + CorsOrigins: make([]string, 0), + NFTBalanceRepo: &repo.NFTBalanceRepository{}, + ERC20BalanceRepo: &repo.ERC20BalanceRepository{}, }, nil, }, @@ -66,15 +68,6 @@ func Test_NewServer(t *testing.T) { }, eventindexer.ErrNoEventRepository, }, - { - "noCorsOrigins", - NewServerOpts{ - Echo: echo.New(), - EventRepo: &repo.EventRepository{}, - NFTBalanceRepo: &repo.NFTBalanceRepository{}, - }, - eventindexer.ErrNoCORSOrigins, - }, { "noHttpFramework", NewServerOpts{ @@ -93,7 +86,7 @@ func Test_NewServer(t *testing.T) { } func Test_Health(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() req, _ := http.NewRequest(echo.GET, "/healthz", nil) rec := httptest.NewRecorder() @@ -106,7 +99,7 @@ func Test_Health(t *testing.T) { } func Test_Root(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() req, _ := http.NewRequest(echo.GET, "/", nil) rec := httptest.NewRecorder() @@ -119,7 +112,7 @@ func Test_Root(t *testing.T) { } func Test_StartShutdown(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() go func() { _ = srv.Start(":3928") diff --git a/packages/eventindexer/pkg/mock/erc20_balance_repository.go b/packages/eventindexer/pkg/mock/erc20_balance_repository.go new file mode 100644 index 00000000000..51a6e3702be --- /dev/null +++ b/packages/eventindexer/pkg/mock/erc20_balance_repository.go @@ -0,0 +1,61 @@ +package mock + +import ( + "context" + "net/http" + + "github.com/morkid/paginate" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" +) + +type ERC20BalanceRepository struct { + ERC20Balances []*eventindexer.ERC20Balance +} + +func NewERC20BalanceRepository() *ERC20BalanceRepository { + return &ERC20BalanceRepository{} +} + +func (r *ERC20BalanceRepository) IncreaseAndDecreaseBalancesInTx( + ctx context.Context, + increaseOpts eventindexer.UpdateERC20BalanceOpts, + decreaseOpts eventindexer.UpdateERC20BalanceOpts, +) (increasedBalance *eventindexer.ERC20Balance, decreasedBalance *eventindexer.ERC20Balance, err error) { + return nil, nil, nil +} + +func (r *ERC20BalanceRepository) FindByAddress(ctx context.Context, + req *http.Request, + address string, + chainID string, +) (paginate.Page, error) { + var balances []*eventindexer.ERC20Balance + + for _, b := range r.ERC20Balances { + if b.Address == address { + balances = append(balances, b) + } + } + + return paginate.Page{ + Items: balances, + }, nil +} + +func (r *ERC20BalanceRepository) FindMetadata( + ctx context.Context, + chainID int64, + contractAddress string, +) (*eventindexer.ERC20Metadata, error) { + return &eventindexer.ERC20Metadata{}, nil +} + +func (r *ERC20BalanceRepository) CreateMetadata( + ctx context.Context, + chainID int64, + contractAddress string, + symbol string, + decimals uint8, +) (int, error) { + return 1, nil +} diff --git a/packages/eventindexer/pkg/mock/event_repository.go b/packages/eventindexer/pkg/mock/event_repository.go index bd0847f9065..44a83bbbb1c 100644 --- a/packages/eventindexer/pkg/mock/event_repository.go +++ b/packages/eventindexer/pkg/mock/event_repository.go @@ -147,12 +147,13 @@ func (r *EventRepository) GetAssignedBlocksByProverAddress( } // DeleteAllAfterBlockID is used when a reorg is detected -func (r *EventRepository) DeleteAllAfterBlockID(blockID uint64, srcChainID uint64) error { +func (r *EventRepository) DeleteAllAfterBlockID(ctx context.Context, blockID uint64, srcChainID uint64) error { return nil } // GetLatestBlockID get latest block id func (r *EventRepository) FindLatestBlockID( + ctx context.Context, srcChainID uint64, ) (uint64, error) { if srcChainID == MockChainID.Uint64() { @@ -161,3 +162,25 @@ func (r *EventRepository) FindLatestBlockID( return 0, errors.New("invalid") } + +func (r *EventRepository) GetBlockProvenBy(ctx context.Context, blockID int) ([]*eventindexer.Event, error) { + var events []*eventindexer.Event + + for _, e := range r.events { + if int(e.BlockID.Int64) == blockID && e.Event == eventindexer.EventNameTransitionProved { + events = append(events, e) + } + } + + return events, nil +} + +func (r *EventRepository) GetBlockProposedBy(ctx context.Context, blockID int) (*eventindexer.Event, error) { + for _, e := range r.events { + if int(e.BlockID.Int64) == blockID && e.Event == eventindexer.EventNameBlockProposed { + return e, nil + } + } + + return nil, errors.New("not found") +} diff --git a/packages/eventindexer/pkg/repo/account.go b/packages/eventindexer/pkg/repo/account.go index a8cf37a4b78..ad7bcfdd7b8 100644 --- a/packages/eventindexer/pkg/repo/account.go +++ b/packages/eventindexer/pkg/repo/account.go @@ -2,6 +2,7 @@ package repo import ( "context" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "strings" "time" @@ -12,16 +13,16 @@ import ( ) type AccountRepository struct { - db eventindexer.DB + db db.DB } -func NewAccountRepository(db eventindexer.DB) (*AccountRepository, error) { - if db == nil { - return nil, eventindexer.ErrNoDB +func NewAccountRepository(dbHandler db.DB) (*AccountRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &AccountRepository{ - db: db, + db: dbHandler, }, nil } @@ -33,7 +34,7 @@ func (r *AccountRepository) Save( // only insert if address doesn't exist a := &eventindexer.Account{} - if err := r.db.GormDB().Where("address = ?", address.Hex()).First(a).Error; err != nil { + if err := r.db.GormDB().WithContext(ctx).Where("address = ?", address.Hex()).First(a).Error; err != nil { if err != gorm.ErrRecordNotFound { return err } diff --git a/packages/eventindexer/pkg/repo/account_test.go b/packages/eventindexer/pkg/repo/account_test.go index 4f148562b89..c0c76f5f262 100644 --- a/packages/eventindexer/pkg/repo/account_test.go +++ b/packages/eventindexer/pkg/repo/account_test.go @@ -14,18 +14,18 @@ import ( func Test_NewAccountRepository(t *testing.T) { tests := []struct { name string - db eventindexer.DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - eventindexer.ErrNoDB, + db.ErrNoDB, }, } diff --git a/packages/eventindexer/pkg/repo/chart.go b/packages/eventindexer/pkg/repo/chart.go index 18b83610561..1dcb765aaa0 100644 --- a/packages/eventindexer/pkg/repo/chart.go +++ b/packages/eventindexer/pkg/repo/chart.go @@ -2,6 +2,7 @@ package repo import ( "context" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/eventindexer" "golang.org/x/exp/slog" @@ -9,21 +10,21 @@ import ( ) type ChartRepository struct { - db eventindexer.DB + db db.DB } -func NewChartRepository(db eventindexer.DB) (*ChartRepository, error) { - if db == nil { - return nil, eventindexer.ErrNoDB +func NewChartRepository(dbHandler db.DB) (*ChartRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &ChartRepository{ - db: db, + db: dbHandler, }, nil } -func (r *ChartRepository) getDB() *gorm.DB { - return r.db.GormDB().Table("time_series_data") +func (r *ChartRepository) getDB(ctx context.Context) *gorm.DB { + return r.db.GormDB().WithContext(ctx).Table("time_series_data") } func (r *ChartRepository) Find( @@ -42,7 +43,7 @@ func (r *ChartRepository) Find( WHERE task = ? AND date BETWEEN ? AND ? ORDER BY date;` - tx = r.getDB().Raw(q, task, start, end) + tx = r.getDB(ctx).Raw(q, task, start, end) if feeTokenAddress != "" { q = `SELECT * FROM time_series_data @@ -50,14 +51,14 @@ func (r *ChartRepository) Find( AND fee_token_address = ? ORDER BY date;` - tx = r.getDB().Raw(q, task, start, end, feeTokenAddress) + tx = r.getDB(ctx).Raw(q, task, start, end, feeTokenAddress) } else if tier != "" { q = `SELECT * FROM time_series_data WHERE task = ? AND date BETWEEN ? AND ? AND tier = ? ORDER BY date;` - tx = r.getDB().Raw(q, task, start, end, tier) + tx = r.getDB(ctx).Raw(q, task, start, end, tier) } var tsd []*eventindexer.TimeSeriesData diff --git a/packages/eventindexer/pkg/repo/chart_test.go b/packages/eventindexer/pkg/repo/chart_test.go index 77b820f0666..e10b29ebb8e 100644 --- a/packages/eventindexer/pkg/repo/chart_test.go +++ b/packages/eventindexer/pkg/repo/chart_test.go @@ -5,25 +5,25 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" ) func Test_NewChartRepo(t *testing.T) { tests := []struct { name string - db eventindexer.DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - eventindexer.ErrNoDB, + db.ErrNoDB, }, } @@ -43,7 +43,7 @@ func Test_GetDB(t *testing.T) { chartRepo, err := NewChartRepository(db) assert.Equal(t, nil, err) - assert.NotNil(t, chartRepo.getDB()) + assert.NotNil(t, chartRepo.getDB(context.Background())) } func Test_Integration_FindChart(t *testing.T) { diff --git a/packages/eventindexer/pkg/repo/containers_test.go b/packages/eventindexer/pkg/repo/containers_test.go index d047a450ba2..7fd28bf6f77 100644 --- a/packages/eventindexer/pkg/repo/containers_test.go +++ b/packages/eventindexer/pkg/repo/containers_test.go @@ -6,13 +6,13 @@ import ( "testing" "github.com/pressly/goose/v3" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/wait" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" + + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" ) var ( @@ -21,10 +21,10 @@ var ( dbPassword = "password" ) -func testMysql(t *testing.T) (eventindexer.DB, func(), error) { +func testMysql(t *testing.T) (db.DB, func(), error) { req := testcontainers.ContainerRequest{ - Image: "mysql:8.0.33", - ExposedPorts: []string{"3306/tcp", "33060/tcp"}, + Image: "mysql:latest", + ExposedPorts: []string{"3306/tcp"}, Env: map[string]string{ "MYSQL_ROOT_PASSWORD": dbPassword, "MYSQL_DATABASE": dbName, @@ -51,11 +51,10 @@ func testMysql(t *testing.T) (eventindexer.DB, func(), error) { } host, _ := mysqlC.Host(ctx) - p, _ := mysqlC.MappedPort(ctx, "3306/tcp") - port := p.Int() + port, _ := mysqlC.MappedPort(ctx, "3306/tcp") dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?tls=skip-verify&parseTime=true&multiStatements=true", - dbUsername, dbPassword, host, port, dbName) + dbUsername, dbPassword, host, port.Int(), dbName) gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), diff --git a/packages/eventindexer/pkg/repo/erc20_balance.go b/packages/eventindexer/pkg/repo/erc20_balance.go new file mode 100644 index 00000000000..7dae67175c1 --- /dev/null +++ b/packages/eventindexer/pkg/repo/erc20_balance.go @@ -0,0 +1,234 @@ +package repo + +import ( + "context" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" + "math/big" + "net/http" + "strings" + "time" + + "github.com/morkid/paginate" + "github.com/pkg/errors" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "gorm.io/gorm" +) + +type ERC20BalanceRepository struct { + db db.DB +} + +func NewERC20BalanceRepository(dbHandler db.DB) (*ERC20BalanceRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB + } + + return &ERC20BalanceRepository{ + db: dbHandler, + }, nil +} + +func (r *ERC20BalanceRepository) increaseBalanceInDB( + db *gorm.DB, + opts eventindexer.UpdateERC20BalanceOpts, +) (*eventindexer.ERC20Balance, error) { + b := &eventindexer.ERC20Balance{ + ContractAddress: opts.ContractAddress, + Address: opts.Address, + ChainID: opts.ChainID, + ERC20MetadataID: opts.ERC20MetadataID, + Amount: "0", + } + + err := db. + Where("contract_address = ?", opts.ContractAddress). + Where("address = ?", opts.Address). + Where("chain_id = ?", opts.ChainID). + First(b). + Error + if err != nil { + // allow to be not found, it may be first time this user has this token + if err != gorm.ErrRecordNotFound { + return nil, errors.Wrap(err, "r.db.gormDB.First") + } + } + + amt, _ := new(big.Int).SetString(b.Amount, 10) + + optsAmt, _ := new(big.Int).SetString(opts.Amount, 10) + + b.Amount = new(big.Int).Add(amt, optsAmt).String() + + // update the row to reflect new balance + if err := db.Save(b).Error; err != nil { + return nil, errors.Wrap(err, "r.db.Save") + } + + return b, nil +} + +func (r *ERC20BalanceRepository) decreaseBalanceInDB( + db *gorm.DB, + opts eventindexer.UpdateERC20BalanceOpts, +) (*eventindexer.ERC20Balance, error) { + b := &eventindexer.ERC20Balance{ + ContractAddress: opts.ContractAddress, + Address: opts.Address, + ChainID: opts.ChainID, + ERC20MetadataID: opts.ERC20MetadataID, + } + + err := db. + Where("contract_address = ?", opts.ContractAddress). + Where("address = ?", opts.Address). + Where("chain_id = ?", opts.ChainID). + First(b). + Error + if err != nil { + if err != gorm.ErrRecordNotFound { + return nil, errors.Wrap(err, "r.db.gormDB.First") + } else { + // cant decrease a balance if user never had this balance, indexing issue + return nil, nil + } + } + + amt, _ := new(big.Int).SetString(b.Amount, 10) + + optsAmt, _ := new(big.Int).SetString(opts.Amount, 10) + + b.Amount = new(big.Int).Sub(amt, optsAmt).String() + + // we can just delete the row, this user has no more of this token + if b.Amount == "0" { + if err := db.Delete(b).Error; err != nil { + return nil, errors.Wrap(err, "r.db.Delete") + } + } else { + // update the row instead to reflect new balance + if err := db.Save(b).Error; err != nil { + return nil, errors.Wrap(err, "r.db.Save") + } + } + + return b, nil +} + +func (r *ERC20BalanceRepository) IncreaseAndDecreaseBalancesInTx( + ctx context.Context, + increaseOpts eventindexer.UpdateERC20BalanceOpts, + decreaseOpts eventindexer.UpdateERC20BalanceOpts, +) (increasedBalance *eventindexer.ERC20Balance, decreasedBalance *eventindexer.ERC20Balance, err error) { + retries := 10 + for retries > 0 { + err = r.db.GormDB().Transaction(func(tx *gorm.DB) (err error) { + increasedBalance, err = r.increaseBalanceInDB(tx.WithContext(ctx), increaseOpts) + if err != nil { + return err + } + + if decreaseOpts.Amount != "0" && decreaseOpts.Amount != "" { + decreasedBalance, err = r.decreaseBalanceInDB(tx.WithContext(ctx), decreaseOpts) + } + + return err + }) + + if err == nil { + break + } + + if strings.Contains(err.Error(), "Deadlock") { + retries-- + + time.Sleep(100 * time.Millisecond) // backoff before retrying + + continue + } + + return nil, nil, errors.Wrap(err, "r.db.Transaction") + } + + if err != nil { + return nil, nil, err + } + + return increasedBalance, decreasedBalance, nil +} + +func (r *ERC20BalanceRepository) FindByAddress(ctx context.Context, + req *http.Request, + address string, + chainID string, +) (paginate.Page, error) { + pg := paginate.New(&paginate.Config{ + DefaultSize: 100, + }) + + q := r.db.GormDB(). + Raw("SELECT * FROM erc20_balances WHERE address = ? AND chain_id = ? AND amount > 0", address, chainID) + + reqCtx := pg.With(q) + + page := reqCtx.Request(req).Response(&[]eventindexer.ERC20Balance{}) + + return page, nil +} + +func (r *ERC20BalanceRepository) FindMetadata( + ctx context.Context, + chainID int64, + contractAddress string, +) (*eventindexer.ERC20Metadata, error) { + md := eventindexer.ERC20Metadata{} + + result := r.db.GormDB().WithContext(ctx).Raw( + "SELECT * FROM erc20_metadata WHERE contract_address = ? AND chain_id = ?", + contractAddress, chainID, + ).Scan(&md) + + if result.Error != nil { + return nil, result.Error + } + + if result.RowsAffected == 0 { + return nil, nil + } + + return &md, nil +} + +func (r *ERC20BalanceRepository) CreateMetadata( + ctx context.Context, + chainID int64, + contractAddress string, + symbol string, + decimals uint8, +) (int, error) { + var id int + + // Start a transaction + tx := r.db.GormDB().WithContext(ctx).Begin() + + // Insert the new entry + result := tx.Exec( + "INSERT INTO erc20_metadata (chain_id, contract_address, symbol, decimals, created_at, updated_at) VALUES (?, ?, ?, ?, NOW(), NOW())", + chainID, contractAddress, symbol, decimals, + ) + + if result.Error != nil { + tx.Rollback() + return 0, result.Error + } + + // Retrieve the ID of the newly inserted entry + err := tx.Raw("SELECT LAST_INSERT_ID()").Scan(&id).Error + if err != nil { + tx.Rollback() + return 0, err + } + + tx.Commit() + + return id, nil +} diff --git a/packages/eventindexer/pkg/repo/erc20_balance_test.go b/packages/eventindexer/pkg/repo/erc20_balance_test.go new file mode 100644 index 00000000000..4a41f291dea --- /dev/null +++ b/packages/eventindexer/pkg/repo/erc20_balance_test.go @@ -0,0 +1,165 @@ +package repo + +import ( + "context" + "errors" + "net/http" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" +) + +func Test_NewERC20BalanceRepo(t *testing.T) { + tests := []struct { + name string + db db.DB + wantErr error + }{ + { + "success", + &db.Database{}, + nil, + }, + { + "noDb", + nil, + db.ErrNoDB, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := NewERC20BalanceRepository(tt.db) + if !errors.Is(err, tt.wantErr) { + t.Errorf("NewERC20BalanceRepository() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} + +func TestIntegration_ERC20Balance_Increase_And_Decrease(t *testing.T) { + db, close, err := testMysql(t) + assert.Equal(t, nil, err) + + defer close() + + ERC20BalanceRepo, err := NewERC20BalanceRepository(db) + assert.Equal(t, nil, err) + + pk, _ := ERC20BalanceRepo.CreateMetadata(context.Background(), 1, "0x123", "SYMBOL", 18) + + bal1, _, err := ERC20BalanceRepo.IncreaseAndDecreaseBalancesInTx(context.Background(), + eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: 1, + Address: "0x123", + ContractAddress: "0x123", + Amount: "1", + }, eventindexer.UpdateERC20BalanceOpts{}) + assert.Equal(t, nil, err) + assert.NotNil(t, bal1) + + bal2, _, err := ERC20BalanceRepo.IncreaseAndDecreaseBalancesInTx(context.Background(), + eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: 1, + Address: "0x123", + ContractAddress: "0x123456", + Amount: "2", + }, eventindexer.UpdateERC20BalanceOpts{}) + assert.Equal(t, nil, err) + assert.NotNil(t, bal2) + + tests := []struct { + name string + increaseOpts eventindexer.UpdateERC20BalanceOpts + decreaseOpts eventindexer.UpdateERC20BalanceOpts + wantErr error + }{ + { + "success", + eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: 1, + Address: "0x123", + ContractAddress: "0x123456789", + Amount: "1", + }, + eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: 1, + Address: "0x123", + ContractAddress: "0x123", + Amount: "1", + }, + nil, + }, + { + "one left", + eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: 1, + Address: "0x123", + ContractAddress: "0x123456789", + Amount: "1", + }, + eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: 1, + Address: "0x123", + ContractAddress: "0x123456", + Amount: "1", + }, + nil, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, _, err := ERC20BalanceRepo.IncreaseAndDecreaseBalancesInTx(context.Background(), tt.increaseOpts, tt.decreaseOpts) + assert.Equal(t, tt.wantErr, err) + }) + } +} + +// TODO: fix this test +func TestIntegration_ERC20Balance_FindByAddress(t *testing.T) { + db, close, err := testMysql(t) + assert.Equal(t, nil, err) + + defer close() + + ERC20BalanceRepo, err := NewERC20BalanceRepository(db) + assert.Equal(t, nil, err) + + tests := []struct { + name string + address string + chainID string + wantErr error + }{ + { + "success", + "0x123", + "1", + nil, + }, + } + + get, err := http.NewRequest("GET", "", nil) + assert.Equal(t, nil, err) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := ERC20BalanceRepo.FindByAddress( + context.Background(), + get, + tt.address, + tt.chainID) + assert.Equal(t, tt.wantErr, err) + }) + } +} diff --git a/packages/eventindexer/pkg/repo/event.go b/packages/eventindexer/pkg/repo/event.go index c547a39806e..13f37b82d4b 100644 --- a/packages/eventindexer/pkg/repo/event.go +++ b/packages/eventindexer/pkg/repo/event.go @@ -8,22 +8,24 @@ import ( "github.com/morkid/paginate" "github.com/pkg/errors" "github.com/shopspring/decimal" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" "gorm.io/datatypes" "gorm.io/gorm" + + "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" ) type EventRepository struct { - db eventindexer.DB + db db.DB } -func NewEventRepository(db eventindexer.DB) (*EventRepository, error) { - if db == nil { - return nil, eventindexer.ErrNoDB +func NewEventRepository(dbHandler db.DB) (*EventRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &EventRepository{ - db: db, + db: dbHandler, }, nil } @@ -111,7 +113,7 @@ func (r *EventRepository) Save(ctx context.Context, opts eventindexer.SaveEventO e.FeeTokenAddress = *opts.FeeTokenAddress } - if err := r.db.GormDB().Create(e).Error; err != nil { + if err := r.db.GormDB().WithContext(ctx).Create(e).Error; err != nil { return nil, errors.Wrap(err, "r.db.Create") } @@ -124,7 +126,7 @@ func (r *EventRepository) FindByEventTypeAndBlockID( blockID int64) (*eventindexer.Event, error) { e := &eventindexer.Event{} - if err := r.db.GormDB(). + if err := r.db.GormDB().WithContext(ctx). Where("event = ?", eventType). Where("block_id = ?", blockID).First(e).Error; err != nil { if err == gorm.ErrRecordNotFound { @@ -143,7 +145,7 @@ func (r *EventRepository) Delete( ) error { e := &eventindexer.Event{} - return r.db.GormDB().Delete(e, id).Error + return r.db.GormDB().WithContext(ctx).Delete(e, id).Error } func (r *EventRepository) FindUniqueProvers( @@ -151,7 +153,7 @@ func (r *EventRepository) FindUniqueProvers( ) ([]eventindexer.UniqueProversResponse, error) { addrs := make([]eventindexer.UniqueProversResponse, 0) - if err := r.db.GormDB(). + if err := r.db.GormDB().WithContext(ctx). Raw("SELECT address, count(*) AS count FROM events WHERE event = ? GROUP BY address", eventindexer.EventNameTransitionProved). FirstOrInit(&addrs).Error; err != nil { @@ -166,7 +168,7 @@ func (r *EventRepository) FindUniqueProposers( ) ([]eventindexer.UniqueProposersResponse, error) { addrs := make([]eventindexer.UniqueProposersResponse, 0) - if err := r.db.GormDB(). + if err := r.db.GormDB().WithContext(ctx). Raw("SELECT address, count(*) AS count FROM events WHERE event = ? GROUP BY address", eventindexer.EventNameBlockProposed). FirstOrInit(&addrs).Error; err != nil { @@ -183,7 +185,7 @@ func (r *EventRepository) GetCountByAddressAndEventName( ) (int, error) { var count int - if err := r.db.GormDB(). + if err := r.db.GormDB().WithContext(ctx). Raw("SELECT count(*) AS count FROM events WHERE event = ? AND address = ?", event, address). FirstOrInit(&count).Error; err != nil { return 0, errors.Wrap(err, "r.db.FirstOrInit") @@ -202,7 +204,7 @@ func (r *EventRepository) GetByAddressAndEventName( DefaultSize: 100, }) - q := r.db.GormDB(). + q := r.db.GormDB().WithContext(ctx). Raw("SELECT * FROM events WHERE event = ? AND address = ?", event, address) reqCtx := pg.With(q) @@ -219,7 +221,7 @@ func (r *EventRepository) FirstByAddressAndEventName( ) (*eventindexer.Event, error) { e := &eventindexer.Event{} - if err := r.db.GormDB(). + if err := r.db.GormDB().WithContext(ctx). Where("address = ?", address). Where("event = ?", event). First(e).Error; err != nil { @@ -242,7 +244,7 @@ func (r *EventRepository) GetAssignedBlocksByProverAddress( DefaultSize: 100, }) - q := r.db.GormDB(). + q := r.db.GormDB().WithContext(ctx). Raw("SELECT * FROM events WHERE event = ? AND assigned_prover = ?", eventindexer.EventNameBlockProposed, address) reqCtx := pg.With(q) @@ -253,26 +255,53 @@ func (r *EventRepository) GetAssignedBlocksByProverAddress( } // DeleteAllAfterBlockID is used when a reorg is detected -func (r *EventRepository) DeleteAllAfterBlockID(blockID uint64, srcChainID uint64) error { +func (r *EventRepository) DeleteAllAfterBlockID(ctx context.Context, blockID uint64, srcChainID uint64) error { query := ` DELETE FROM events WHERE block_id >= ? AND chain_id = ?` - return r.db.GormDB().Table("events").Exec(query, blockID, srcChainID).Error + return r.db.GormDB().WithContext(ctx).Table("events").Exec(query, blockID, srcChainID).Error } // GetLatestBlockID get latest block id func (r *EventRepository) FindLatestBlockID( + ctx context.Context, srcChainID uint64, ) (uint64, error) { - q := `SELECT COALESCE(MAX(emitted_block_id), 0) + q := `SELECT COALESCE(MAX(emitted_block_id), 0) FROM events WHERE chain_id = ?` var b uint64 - if err := r.db.GormDB().Table("events").Raw(q, srcChainID).Scan(&b).Error; err != nil { + if err := r.db.GormDB().WithContext(ctx).Table("events").Raw(q, srcChainID).Scan(&b).Error; err != nil { return 0, err } return b, nil } + +func (r *EventRepository) GetBlockProvenBy(ctx context.Context, blockID int) ([]*eventindexer.Event, error) { + e := []*eventindexer.Event{} + + if err := r.db.GormDB().WithContext(ctx). + Where("block_id = ?", blockID). + Where("event = ?", eventindexer.EventNameTransitionProved). + Find(&e).Error; err != nil { + return nil, err + } + + return e, nil +} + +func (r *EventRepository) GetBlockProposedBy(ctx context.Context, blockID int) (*eventindexer.Event, error) { + e := &eventindexer.Event{} + + if err := r.db.GormDB().WithContext(ctx). + Where("block_id = ?", blockID). + Where("event = ?", eventindexer.EventNameBlockProposed). + First(&e).Error; err != nil { + return nil, err + } + + return e, nil +} diff --git a/packages/eventindexer/pkg/repo/interface.go b/packages/eventindexer/pkg/repo/interface.go new file mode 100644 index 00000000000..e0281bfd25d --- /dev/null +++ b/packages/eventindexer/pkg/repo/interface.go @@ -0,0 +1 @@ +package repo diff --git a/packages/eventindexer/pkg/repo/nft_balance.go b/packages/eventindexer/pkg/repo/nft_balance.go index ccd6df691b8..3c83174035c 100644 --- a/packages/eventindexer/pkg/repo/nft_balance.go +++ b/packages/eventindexer/pkg/repo/nft_balance.go @@ -3,6 +3,11 @@ package repo import ( "context" "net/http" + "strings" + "time" + + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" + "golang.org/x/exp/slog" "github.com/morkid/paginate" "github.com/pkg/errors" @@ -11,16 +16,16 @@ import ( ) type NFTBalanceRepository struct { - db eventindexer.DB + db db.DB } -func NewNFTBalanceRepository(db eventindexer.DB) (*NFTBalanceRepository, error) { - if db == nil { - return nil, eventindexer.ErrNoDB +func NewNFTBalanceRepository(dbHandler db.DB) (*NFTBalanceRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &NFTBalanceRepository{ - db: db, + db: dbHandler, }, nil } @@ -37,7 +42,7 @@ func (r *NFTBalanceRepository) increaseBalanceInDB( ChainID: opts.ChainID, } - err := db. + err := db.WithContext(ctx). Where("contract_address = ?", opts.ContractAddress). Where("token_id = ?", opts.TokenID). Where("address = ?", opts.Address). @@ -74,7 +79,7 @@ func (r *NFTBalanceRepository) decreaseBalanceInDB( ChainID: opts.ChainID, } - err := db. + err := db.WithContext(ctx). Where("contract_address = ?", opts.ContractAddress). Where("token_id = ?", opts.TokenID). Where("address = ?", opts.Address). @@ -112,22 +117,42 @@ func (r *NFTBalanceRepository) IncreaseAndDecreaseBalancesInTx( increaseOpts eventindexer.UpdateNFTBalanceOpts, decreaseOpts eventindexer.UpdateNFTBalanceOpts, ) (increasedBalance *eventindexer.NFTBalance, decreasedBalance *eventindexer.NFTBalance, err error) { - err = r.db.GormDB().Transaction(func(tx *gorm.DB) (err error) { - increasedBalance, err = r.increaseBalanceInDB(ctx, tx, increaseOpts) - if err != nil { + retries := 10 + for retries > 0 { + err = r.db.GormDB().Transaction(func(tx *gorm.DB) (err error) { + increasedBalance, err = r.increaseBalanceInDB(ctx, tx, increaseOpts) + if err != nil { + return err + } + + if decreaseOpts.Amount != 0 { + decreasedBalance, err = r.decreaseBalanceInDB(ctx, tx, decreaseOpts) + } + return err + }) + + if err == nil { + break } - if decreaseOpts.Amount != 0 { - decreasedBalance, err = r.decreaseBalanceInDB(ctx, tx, decreaseOpts) + if strings.Contains(err.Error(), "Deadlock") { + slog.Warn("database deadlock") + + retries-- + + time.Sleep(100 * time.Millisecond) // backoff before retrying + + continue } - return err - }) - if err != nil { return nil, nil, errors.Wrap(err, "r.db.Transaction") } + if err != nil { + return nil, nil, err + } + return increasedBalance, decreasedBalance, nil } diff --git a/packages/eventindexer/pkg/repo/nft_balance_test.go b/packages/eventindexer/pkg/repo/nft_balance_test.go index 86d04be8602..89d994a7cbd 100644 --- a/packages/eventindexer/pkg/repo/nft_balance_test.go +++ b/packages/eventindexer/pkg/repo/nft_balance_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" ) @@ -13,18 +14,18 @@ import ( func Test_NewNFTBalanceRepo(t *testing.T) { tests := []struct { name string - db eventindexer.DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - eventindexer.ErrNoDB, + db.ErrNoDB, }, } diff --git a/packages/eventindexer/pkg/repo/transaction.go b/packages/eventindexer/pkg/repo/transaction.go index 6e8f919ffca..edf0af8ce6f 100644 --- a/packages/eventindexer/pkg/repo/transaction.go +++ b/packages/eventindexer/pkg/repo/transaction.go @@ -10,7 +10,9 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/pkg/errors" "github.com/shopspring/decimal" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" ) var ( @@ -18,16 +20,16 @@ var ( ) type TransactionRepository struct { - db eventindexer.DB + db db.DB } -func NewTransactionRepository(db eventindexer.DB) (*TransactionRepository, error) { - if db == nil { - return nil, eventindexer.ErrNoDB +func NewTransactionRepository(dbHandler db.DB) (*TransactionRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &TransactionRepository{ - db: db, + db: dbHandler, }, nil } diff --git a/packages/eventindexer/pkg/repo/transaction_test.go b/packages/eventindexer/pkg/repo/transaction_test.go index 8f761c5e60b..ff79909c5a0 100644 --- a/packages/eventindexer/pkg/repo/transaction_test.go +++ b/packages/eventindexer/pkg/repo/transaction_test.go @@ -9,25 +9,25 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/assert" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" ) func Test_NewTransactionRepo(t *testing.T) { tests := []struct { name string - db eventindexer.DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - eventindexer.ErrNoDB, + db.ErrNoDB, }, } diff --git a/packages/eventindexer/pkg/tasks/tasks.go b/packages/eventindexer/pkg/tasks/tasks.go deleted file mode 100644 index 674d9e4aaf9..00000000000 --- a/packages/eventindexer/pkg/tasks/tasks.go +++ /dev/null @@ -1,51 +0,0 @@ -package tasks - -var ( - TotalTransactions = "total-transactions" - TransactionsPerDay = "transactions-per-day" - TotalAccounts = "total-accounts" - AccountsPerDay = "accounts-per-day" - UniqueProposersPerDay = "unique-proposers-per-day" - TotalUniqueProposers = "total-proposers" - UniqueProversPerDay = "unique-provers-per-day" - TotalUniqueProvers = "total-provers" - TotalContractDeployments = "total-contract-deployments" - ContractDeploymentsPerDay = "contract-deployments-per-day" - TransitionProvedTxPerDay = "transition-proved-tx-per-day" - TotalTransitionProvedTx = "total-transition-proved-tx" - TransitionContestedTxPerDay = "transition-contested-tx-per-day" - TotalTransitionContestedTx = "total-transition-contested-tx" - ProposeBlockTxPerDay = "propose-block-tx-per-day" - TotalProposeBlockTx = "total-propose-block-tx" - BridgeMessagesSentPerDay = "bridge-messages-sent-per-day" - TotalBridgeMessagesSent = "total-bridge-messages-sent" - TransitionProvedByTierPerDay = "transition-proved-by-tier-per-day" - TransitionContestedByTierPerDay = "transition-contested-by-tier-per-day" - TotalTransitionProvedByTier = "total-transition-proved-by-tier" - TotalTransitionContestedByTier = "total-transition-contested-by-tier" -) - -var Tasks = []string{ - TotalTransactions, - TransactionsPerDay, - TotalAccounts, - AccountsPerDay, - UniqueProposersPerDay, - TotalUniqueProposers, - UniqueProversPerDay, - TotalUniqueProvers, - TotalContractDeployments, - ContractDeploymentsPerDay, - TransitionProvedTxPerDay, - TotalTransitionProvedTx, - TransitionContestedTxPerDay, - TotalTransitionContestedTx, - ProposeBlockTxPerDay, - TotalProposeBlockTx, - BridgeMessagesSentPerDay, - TotalBridgeMessagesSent, - TotalTransitionProvedByTier, - TotalTransitionContestedByTier, - TransitionProvedByTierPerDay, - TransitionContestedByTierPerDay, -} diff --git a/packages/eventindexer/abigen.sh b/packages/eventindexer/scripts/abigen.sh similarity index 54% rename from packages/eventindexer/abigen.sh rename to packages/eventindexer/scripts/abigen.sh index 0f83c65c1e4..5addfeb0427 100755 --- a/packages/eventindexer/abigen.sh +++ b/packages/eventindexer/scripts/abigen.sh @@ -1,20 +1,20 @@ -#/bin/sh +#!/bin/bash if [ ! -d "../protocol/out" ]; then echo "ABI not generated in protocol package yet. Please run npm install && pnpm run compile in ../protocol" exit 1 fi -paths=("TaikoL1.sol" "Bridge.sol" "AssignmentHook.sol" "SgxVerifier.sol" "TaikoToken.sol") +paths=("layer1/TaikoL1.sol" "layer1/Bridge.sol" "layer1/SgxVerifier.sol" "layer1/TaikoToken.sol") -names=("TaikoL1" "Bridge" "AssignmentHook" "SgxVerifier" "TaikoToken") +names=("TaikoL1" "Bridge" "SgxVerifier" "TaikoToken") for (( i = 0; i < ${#paths[@]}; ++i )); do - jq .abi ../protocol/out/${paths[i]}/${names[i]}.json > ${names[i]}.json lower=$(echo "${names[i]}" | tr '[:upper:]' '[:lower:]') - abigen --abi ${names[i]}.json \ + jq .abi ../protocol/out/${paths[i]}/${names[i]}.json > contracts/$lower/${names[i]}.json + abigen --abi contracts/$lower/${names[i]}.json \ --pkg $lower \ --type ${names[i]} \ --out contracts/$lower/${names[i]}.go diff --git a/packages/eventindexer/scripts/swagger.sh b/packages/eventindexer/scripts/swagger.sh index 2ba0cac2c3a..079ca9dce5f 100755 --- a/packages/eventindexer/scripts/swagger.sh +++ b/packages/eventindexer/scripts/swagger.sh @@ -1,3 +1,3 @@ #/bin/sh -swag init -g server.go -d pkg/http --parseDependency \ No newline at end of file +swag init -g server.go -d pkg/http --parseDependency \ No newline at end of file diff --git a/packages/fork-diff/CHANGELOG.md b/packages/fork-diff/CHANGELOG.md index 90ea31bbcaa..8fa70caf30d 100644 --- a/packages/fork-diff/CHANGELOG.md +++ b/packages/fork-diff/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.6.1](https://github.com/taikoxyz/taiko-mono/compare/fork-diff-v0.6.0...fork-diff-v0.6.1) (2024-10-04) + + +### Documentation + +* **fork-diff:** update geth fork diff for upstream merge ([#18206](https://github.com/taikoxyz/taiko-mono/issues/18206)) ([cf303b6](https://github.com/taikoxyz/taiko-mono/commit/cf303b6ae2ab3588721fee2bc9d98ba2c20ecff9)) + ## [0.6.0](https://github.com/taikoxyz/taiko-mono/compare/fork-diff-v0.5.0...fork-diff-v0.6.0) (2024-06-06) diff --git a/packages/fork-diff/README.md b/packages/fork-diff/README.md index 184fe759e2e..28395f2a994 100644 --- a/packages/fork-diff/README.md +++ b/packages/fork-diff/README.md @@ -29,4 +29,4 @@ There is a workflow dispatch you can use to manually trigger a preview or produc > It is possible that state expiry might be unnecessary in a world where Verkle Tries succeed at their goals. -can anyone explain this like im 5. i dont even know what a verkle trie is outside of ppl saying merkle tries r annoying and these r better. +Can anyone explain this like I'm 5? I don't even know what a Verkle Trie is outside of people saying Merkle Tries are annoying and these are better. diff --git a/packages/fork-diff/package.json b/packages/fork-diff/package.json index d7b61745406..aa9d38bca23 100644 --- a/packages/fork-diff/package.json +++ b/packages/fork-diff/package.json @@ -1,4 +1,4 @@ { "name": "@taiko/fork-diff", - "version": "0.6.0" + "version": "0.6.1" } diff --git a/packages/fork-diff/version_config.json b/packages/fork-diff/version_config.json index a139e6be5af..226f60c33e6 100644 --- a/packages/fork-diff/version_config.json +++ b/packages/fork-diff/version_config.json @@ -1,3 +1,3 @@ { - "tagVersion": "v1.13.15" + "tagVersion": "v1.14.11" } diff --git a/packages/geth-rpc-gateway/.gitignore b/packages/geth-rpc-gateway/.gitignore new file mode 100644 index 00000000000..bea9f5fa1f3 --- /dev/null +++ b/packages/geth-rpc-gateway/.gitignore @@ -0,0 +1 @@ +geth-rpc-gateway \ No newline at end of file diff --git a/packages/geth-rpc-gateway/README.md b/packages/geth-rpc-gateway/README.md new file mode 100644 index 00000000000..2ae0fdc9bb1 --- /dev/null +++ b/packages/geth-rpc-gateway/README.md @@ -0,0 +1,73 @@ +# geth-rpc-gateway + +```sh +go build -o geth-rpc-gateway . +``` + +Build for Linux + +```sh +GOOS=linux GOARCH=amd64 go build -o geth-rpc-gateway . +``` + +## How to test + +### Example code + +``` +curl --location --request POST 'https://rpc.internal.taiko.xyz/' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "jsonrpc": "2.0", + "id": 4, + "method": "eth_blockNumber", + "params": [ + ] +}' +``` + +``` +'use strict' +const { ethers } = require('ethers'); + +// const provider = new ethers.providers.JsonRpcProvider("https://l1rpc.mainnet.taiko.xyz"); + +const provider = new ethers.providers.WebSocketProvider("wss://ws.internal.taiko.xyz"); + +async function main() { + console.log(await provider.getBlock("latest")); + process.exit(0); +} + +main().catch(console.error); +``` + +``` +curl -i -X POST \ + -H "Content-Type:application/json" \ + -d \ +'[ + {"id":92471,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x832ef3260c46288e9596d0ddb61c4c9d5965f7da8d076483d08ac2d4265a69b8"]}, + {"id":91112,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xbaac413b4cbf6a2f19ef3da2f103f8298042cbba2820fba020a322f9602f8e58"]}, + {"id":48734,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x7c649da4df9bea4552c05d4710a1ffb16fed5be81c11912aceb568a8212213d6"]}, + {"id":45180,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xb23f58cb6b5155f792fa96c63962c44efba5280a4eed76400eca477e04c7456c"]}, + {"id":95408,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xab7e06e9666ba0c270fe06e45fe604316049232c4479f975db0a0ec16b4f9b38"]}, + {"id":193,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xd453488f5e14cfb3ac1057e42c1e3eb74420759fe0331894c59f3108e1c813b0"]} +]' \ + 'https://rpc.hekla.taiko.xyz/' +``` + +``` +curl -i -X POST \ + -H "Content-Type:application/json" \ + -d \ +'[ + {"id":92471,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x832ef3260c46288e9596d0ddb61c4c9d5965f7da8d076483d08ac2d4265a69b8"]}, + {"id":91112,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xbaac413b4cbf6a2f19ef3da2f103f8298042cbba2820fba020a322f9602f8e58"]}, + {"id":48734,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x7c649da4df9bea4552c05d4710a1ffb16fed5be81c11912aceb568a8212213d6"]}, + {"id":45180,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xb23f58cb6b5155f792fa96c63962c44efba5280a4eed76400eca477e04c7456c"]}, + {"id":95408,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xab7e06e9666ba0c270fe06e45fe604316049232c4479f975db0a0ec16b4f9b38"]}, + {"id":193,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xd453488f5e14cfb3ac1057e42c1e3eb74420759fe0331894c59f3108e1c813b0"]} +]' \ + 'http://localhost:8080' +``` diff --git a/packages/geth-rpc-gateway/main.go b/packages/geth-rpc-gateway/main.go new file mode 100644 index 00000000000..3915d9ec7b9 --- /dev/null +++ b/packages/geth-rpc-gateway/main.go @@ -0,0 +1,314 @@ +package main + +import ( + "bytes" + "encoding/json" + "io" + "io/ioutil" + "log" + "net/http" + "net/url" + "os" + "strings" + + "github.com/gorilla/websocket" +) + +type JSONRPCRequest struct { + Method string `json:"method"` +} + +var ( + upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }} + methodsUsingPrimary map[string]bool + primaryURL *url.URL + secondaryURL *url.URL + webSocketURL *url.URL + enableDebugEndpoints bool +) + +func main() { + // Load the target URLs from environment variables + var err error + primaryURL, err = url.Parse(os.Getenv("TARGET_URL_PRIMARY")) + if err != nil || primaryURL == nil { + log.Fatalf("Failed to parse primary target URL: %v", err) + } + secondaryURL, err = url.Parse(os.Getenv("TARGET_URL_SECONDARY")) + if err != nil || secondaryURL == nil { + log.Fatalf("Failed to parse secondary target URL: %v", err) + } + webSocketURL, err = url.Parse(os.Getenv("WEBSOCKET_TARGET_URL")) + if err != nil || webSocketURL == nil { + log.Fatalf("Failed to parse WebSocket target URL: %v", err) + } + + methodsUsingPrimary = parsePrimaryMethods(os.Getenv("PRIMARY_METHODS")) + enableDebugEndpoints = os.Getenv("ENABLE_DEBUG_ENDPOINTS") == "true" + + http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { + log.Printf("/healthz Received request: Method=%s, Path=%s", r.Method, r.URL.Path) + w.WriteHeader(http.StatusOK) + w.Write([]byte("OK")) + }) + + // Determine if server should handle WebSocket or RPC based on environment variable + if os.Getenv("IS_WEBSOCKET") == "true" { + log.Println("Starting in WebSocket mode") + http.HandleFunc("/", rootWebSocketHandler) // WebSocket handler without CORS + } else { + log.Println("Starting in RPC mode") + http.Handle("/", enableCORS(http.HandlerFunc(rootHandler))) // HTTP handler with CORS middleware + } + + log.Fatal(http.ListenAndServe(":8080", nil)) +} + +// WebSocket handler for `/` path when in WebSocket mode +func rootWebSocketHandler(w http.ResponseWriter, r *http.Request) { + // Check for WebSocket Upgrade + if strings.ToLower(r.Header.Get("Upgrade")) == "websocket" { + log.Printf("WebSocket connection initiated...") + handleWebSocket(w, r, webSocketURL) + return + } + + w.WriteHeader(http.StatusOK) + w.Write([]byte("OK")) +} + +// CORS middleware to enable CORS headers +func enableCORS(next http.Handler) http.Handler { + log.Printf("enableCORS") + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + log.Printf("CORS middleware invoked for %s %s", r.Method, r.URL.Path) + + // Get the Origin header from the request + origin := r.Header.Get("Origin") + + // Set Access-Control-Allow-Origin only if the request has an Origin header + if origin != "" { + log.Printf("CORS middleware invoked for origin %s", origin) + w.Header().Del("Access-Control-Allow-Origin") // Clear any existing header + w.Header().Set("Access-Control-Allow-Origin", origin) + w.Header().Set("Vary", "Origin") // Ensure caching based on origin + } + + w.Header().Set("Access-Control-Allow-Methods", r.Method) + w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") + + w.WriteHeader(http.StatusOK) + + next.ServeHTTP(w, r) + }) +} + +func rootHandler(w http.ResponseWriter, r *http.Request) { + log.Printf("rootHandler...") + + // Check for WebSocket Upgrade + if strings.ToLower(r.Header.Get("Upgrade")) == "websocket" { + handleWebSocket(w, r, webSocketURL) + return + } + + // Handle HTTP requests + + bodyBytes, err := ioutil.ReadAll(r.Body) + + log.Printf("Handle HTTP requests...") + if err != nil { + log.Printf("Error") + + http.Error(w, "Failed to read request body", http.StatusBadRequest) + return + } + defer r.Body.Close() + + if len(bodyBytes) == 0 { + w.Write([]byte("OK")) + return + } + + // Determine the target URL and extract methods + usePrimaryURL, methods := shouldUsePrimaryURL(bodyBytes) + var targetURL *url.URL + if usePrimaryURL { + targetURL = primaryURL + log.Printf("HTTP request hitting TARGET_URL_PRIMARY") + } else { + targetURL = secondaryURL + log.Printf("HTTP request hitting TARGET_URL_SECONDARY") + } + + // Check each method for debug restrictions + for _, method := range methods { + if enableDebugEndpoints && isDebugMethod(method) && method != "debug_traceBlock" && method != "debug_traceBlockByNumber" { + http.Error(w, "Unsupported method", http.StatusBadRequest) + return + } + } + + // Forward the original JSON payload as-is to the target URL + forwardRequest(w, r, targetURL, bodyBytes) +} + +// Function to forward the request to the target URL +func forwardRequest(w http.ResponseWriter, r *http.Request, targetURL *url.URL, bodyBytes []byte) { + + proxyReq, err := http.NewRequest(r.Method, targetURL.String()+r.RequestURI, ioutil.NopCloser(bytes.NewReader(bodyBytes))) + if err != nil { + http.Error(w, "Failed to create request", http.StatusInternalServerError) + return + } + + // Copy headers from the original request, excluding Accept-Encoding + for name, values := range r.Header { + log.Printf("proxy req name %s", name) + if name == "Accept-Encoding" { + continue + } + for _, value := range values { + proxyReq.Header.Add(name, value) + } + } + + // Send the request to the target URL + resp, err := http.DefaultClient.Do(proxyReq) + if err != nil { + http.Error(w, "Failed to reach target server", http.StatusInternalServerError) + return + } + defer resp.Body.Close() + + // Log headers before setting them to diagnose any discrepancies + log.Printf("Received Content-Type from upstream: %s", resp.Header.Get("Content-Type")) + + // Prepare to copy headers from the response + for name, values := range resp.Header { + log.Printf("response name %s, value %s", name, values) + switch name { + case "Content-Length", "Transfer-Encoding", "Connection": + // Skip these headers + continue + default: + for _, value := range values { + w.Header().Add(name, value) + } + } + } + + // Explicitly set Content-Type if it's present in the response + if contentType := resp.Header.Get("Content-Type"); contentType != "" { + w.Header().Set("Content-Type", contentType) + } else { + w.Header().Set("Content-Type", "application/json") // default if not provided + } + log.Printf("Set Content-Type header: %s", w.Header().Get("Content-Type")) + + // Read the response body into a buffer to set Content-Type explicitly + var buf bytes.Buffer + if _, err := io.Copy(&buf, resp.Body); err != nil { + log.Printf("Error reading response body into buffer: %v", err) + http.Error(w, "Failed to read response body", http.StatusInternalServerError) + return + } + + // Write status code and ensure Content-Type is set + w.WriteHeader(resp.StatusCode) + log.Printf("Response status code: %d", resp.StatusCode) + log.Printf("Final Content-Type header: %s", w.Header().Get("Content-Type")) + + // Write the buffered body to the response + if _, err := io.Copy(w, &buf); err != nil { + log.Printf("Error copying buffer to response: %v", err) + } +} + +func isDebugMethod(method string) bool { + return len(method) >= 6 && method[:6] == "debug_" && method != "debug_traceBlock" +} + +// Parses the PRIMARY_METHODS environment variable and returns a map of methods using the primary URL +func parsePrimaryMethods(methods string) map[string]bool { + methodMap := make(map[string]bool) + for _, method := range strings.Split(methods, ",") { + method = strings.TrimSpace(method) + if method != "" { + methodMap[method] = true + } + } + return methodMap +} + +// Checks if any method should use the primary URL and returns all methods +func shouldUsePrimaryURL(bodyBytes []byte) (bool, []string) { + var singleRequest JSONRPCRequest + var multipleRequests []JSONRPCRequest + methods := []string{} + + // Try unmarshalling as a single request + if err := json.Unmarshal(bodyBytes, &singleRequest); err == nil { + methods = append(methods, singleRequest.Method) + return methodsUsingPrimary[singleRequest.Method], methods + } + + // Try unmarshalling as an array of requests + if err := json.Unmarshal(bodyBytes, &multipleRequests); err == nil { + usePrimary := false + for _, req := range multipleRequests { + methods = append(methods, req.Method) + if methodsUsingPrimary[req.Method] { + usePrimary = true + } + } + return usePrimary, methods + } + + log.Printf("Invalid JSON in request body: unable to parse as single or multiple requests") + return false, methods // Default to secondary URL if JSON is invalid +} + +func handleWebSocket(w http.ResponseWriter, r *http.Request, targetURL *url.URL) { + clientConn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Printf("Failed to upgrade connection: %v", err) + http.Error(w, "Failed to upgrade to WebSocket", http.StatusInternalServerError) + return + } + defer clientConn.Close() + + targetConn, _, err := websocket.DefaultDialer.Dial(targetURL.String(), nil) + if err != nil { + log.Printf("Failed to connect to target WebSocket server: %v", err) + http.Error(w, "Failed to connect to target WebSocket server", http.StatusInternalServerError) + return + } + defer targetConn.Close() + + go func() { + for { + messageType, message, err := clientConn.ReadMessage() + if err != nil { + log.Printf("Error reading message from client: %v", err) + return + } + if err := targetConn.WriteMessage(messageType, message); err != nil { + log.Printf("Error writing message to target server: %v", err) + return + } + } + }() + + for { + messageType, message, err := targetConn.ReadMessage() + if err != nil { + log.Printf("Error reading message from target server: %v", err) + return + } + if err := clientConn.WriteMessage(messageType, message); err != nil { + log.Printf("Error writing message to client: %v", err) + return + } + } +} diff --git a/packages/guardian-prover-health-check-ui/CHANGELOG.md b/packages/guardian-prover-health-check-ui/CHANGELOG.md index 5dc43b18c29..2a0e078f45f 100644 --- a/packages/guardian-prover-health-check-ui/CHANGELOG.md +++ b/packages/guardian-prover-health-check-ui/CHANGELOG.md @@ -1,5 +1,30 @@ # Changelog +## [0.2.0](https://github.com/taikoxyz/taiko-mono/compare/guardian-prover-health-check-ui-v0.1.0...guardian-prover-health-check-ui-v0.2.0) (2024-07-28) + + +### Features + +* **guardian-prover-health-check-ui:** better pseudonym handling ([#17177](https://github.com/taikoxyz/taiko-mono/issues/17177)) ([bc19b67](https://github.com/taikoxyz/taiko-mono/commit/bc19b677e0d8fb9816489fe3bd2a57ca2adbd1ee)) + + +### Chores + +* **guardian-prover-health-check-ui:** add new hekla guardian address ([#17767](https://github.com/taikoxyz/taiko-mono/issues/17767)) ([98a98ba](https://github.com/taikoxyz/taiko-mono/commit/98a98ba105fa7d29185d7bf35bbcfefd7b17d581)) +* **guardian-prover-health-check-ui:** update guardian addresses ([#17656](https://github.com/taikoxyz/taiko-mono/issues/17656)) ([e3a2862](https://github.com/taikoxyz/taiko-mono/commit/e3a28628c14a188aa44781f0b9919f365d5835cc)) +* **repo:** add lefthook rule for guardian ui ([#17178](https://github.com/taikoxyz/taiko-mono/issues/17178)) ([5878c29](https://github.com/taikoxyz/taiko-mono/commit/5878c291a30bf32a288628f6bdff8d7b592f3149)) + + +### Documentation + +* **guardian-prover-health-check-ui:** update README.md for Guardian prover health check UI ([#17053](https://github.com/taikoxyz/taiko-mono/issues/17053)) ([c7f3143](https://github.com/taikoxyz/taiko-mono/commit/c7f3143c763792806de2dffb09d35e756f4cb1e9)) + + +### Workflow + +* **guardian-prover-health-check-ui:** fix failing lint job ([#17122](https://github.com/taikoxyz/taiko-mono/issues/17122)) ([eb8fda3](https://github.com/taikoxyz/taiko-mono/commit/eb8fda30e9cd84097d51e4d88137eff11b102e7d)) +* **guardian-prover-health-check-ui:** fix lint ([#17143](https://github.com/taikoxyz/taiko-mono/issues/17143)) ([01fb4c2](https://github.com/taikoxyz/taiko-mono/commit/01fb4c2e4955c7a0389556c2f239e8d11c024c1d)) + ## [0.1.0](https://github.com/taikoxyz/taiko-mono/compare/guardian-prover-health-check-ui-v0.1.0...guardian-prover-health-check-ui-v0.1.0) (2024-02-20) ### Features diff --git a/packages/guardian-prover-health-check-ui/package.json b/packages/guardian-prover-health-check-ui/package.json index 6b478ad1741..538a9bd6246 100644 --- a/packages/guardian-prover-health-check-ui/package.json +++ b/packages/guardian-prover-health-check-ui/package.json @@ -1,6 +1,6 @@ { "name": "guardian-prover-health-check-ui", - "version": "0.1.0", + "version": "0.2.0", "private": true, "scripts": { "dev": "vite dev", @@ -18,7 +18,7 @@ "devDependencies": { "@playwright/test": "^1.43.1", "@sveltejs/adapter-auto": "^3.2.0", - "@sveltejs/kit": "^2.5.5", + "@sveltejs/kit": "^2.5.21", "@sveltejs/vite-plugin-svelte": "^3.1.0", "@tailwindcss/nesting": "0.0.0-insiders.565cd3e", "@typescript-eslint/eslint-plugin": "^7.4.0", diff --git a/packages/guardian-prover-health-check-ui/src/lib/dataFetcher.ts b/packages/guardian-prover-health-check-ui/src/lib/dataFetcher.ts index 563293a92bd..de575594dc7 100644 --- a/packages/guardian-prover-health-check-ui/src/lib/dataFetcher.ts +++ b/packages/guardian-prover-health-check-ui/src/lib/dataFetcher.ts @@ -144,6 +144,9 @@ async function fetchGuardians() { }; guardian.name = await getPseudonym(guardian.address); + if (!guardian.name) { + guardian.name = guardian.address; + } const [status, uptime, balance] = await Promise.all([ fetchLatestGuardianProverHealthCheckFromApi( diff --git a/packages/guardian-prover-health-check-ui/static/config/hekla/guardians.json b/packages/guardian-prover-health-check-ui/static/config/hekla/guardians.json index 048a779775b..2e684aa69f0 100644 --- a/packages/guardian-prover-health-check-ui/static/config/hekla/guardians.json +++ b/packages/guardian-prover-health-check-ui/static/config/hekla/guardians.json @@ -1,6 +1,7 @@ { "0x00000e8e432cA71aFac949095d421a63B742b735": "zephyr", "0x1833A8b4d40F0F5f8e9Be244A3dD4eD55c46d28B": "PokerPlayer1", + "0x0cAC6E2Fd10e92Bf798341Ad0A57b5Cb39DA8D0D": "goyangi", "0x93F2b140c0bB188f6585534240344A90f43f74bF": "wage slave", "0x52BF8B2574b324140a052130126f39dB2507C5DF": "Groot", "0xaeBb6E8A857C86Fc45dBc51551b8E8B7a5791ab3": "Lock", @@ -10,5 +11,6 @@ "0x0EFADbE8328a1a07bB3dDEC22F69F88aDB61B8b4": "Gooner", "0x55792e1F0a41D3af8B6d41DFdcf24651AA80fA1e": "Swift", "0xD32b63e3bc54403d5363525b99E51E628c7c195e": "Casper", - "0xBba27Bd59eFe4F169afBa7b80a641a4675AD1Ff7": "Crash" + "0xBba27Bd59eFe4F169afBa7b80a641a4675AD1Ff7": "Crash", + "0x1509F09637A1fB8C3e47e099d50514b9D9Af8157": "kimchi" } diff --git a/packages/guardian-prover-health-check-ui/static/config/mainnet/guardians.json b/packages/guardian-prover-health-check-ui/static/config/mainnet/guardians.json index a828adbffd5..981b9747c81 100644 --- a/packages/guardian-prover-health-check-ui/static/config/mainnet/guardians.json +++ b/packages/guardian-prover-health-check-ui/static/config/mainnet/guardians.json @@ -6,5 +6,6 @@ "0xC384B679c028787166b9B3725aC14A60da205861": "Casper", "0x1602958A85494cd9C3e0D6672BA0eE42b95B4200": "Swift", "0x5CfEb9a72256B1b49dc2C98b1b7b99d172D50B68": "Frost", - "0x1DB8Ac9f19AbdD60A6418383BfA56A4450aa80C6": "Lock" + "0x1DB8Ac9f19AbdD60A6418383BfA56A4450aa80C6": "Lock", + "0x31AA0BF5dC8A5843E6F7C6Df3eEc916731572c84": "Groot" } diff --git a/packages/guardian-prover-health-check/.default.env b/packages/guardian-prover-health-check/.default.env index c8b2ee5a5db..2109f29fa18 100644 --- a/packages/guardian-prover-health-check/.default.env +++ b/packages/guardian-prover-health-check/.default.env @@ -10,4 +10,4 @@ DATABASE_CONN_MAX_LIFETIME_IN_MS=100000 GUARDIAN_PROVER_CONTRACT_ADDRESS=0xDf8038e9f4535040D7421A89ead398b3A38366EC L1_RPC_URL=wss://l1ws.internal.taiko.xyz L2_RPC_URL=wss://ws.internal.taiko.xyz -INTERVAL=12s \ No newline at end of file +INTERVAL=12s diff --git a/packages/guardian-prover-health-check/.gitignore b/packages/guardian-prover-health-check/.gitignore index e3b802550a1..03615148338 100644 --- a/packages/guardian-prover-health-check/.gitignore +++ b/packages/guardian-prover-health-check/.gitignore @@ -40,6 +40,5 @@ terraform.rc .idea -Bridge.json -TaikoL2.json -IHeaderSync.json \ No newline at end of file +# Ignore abi files +bindings/**/*.json diff --git a/packages/guardian-prover-health-check/README.md b/packages/guardian-prover-health-check/README.md index 9bbbcf78c60..d0d4f0fb240 100644 --- a/packages/guardian-prover-health-check/README.md +++ b/packages/guardian-prover-health-check/README.md @@ -1,4 +1,3 @@ -[![Golang](https://github.com/taikoxyz/taiko-mono/actions/workflows/golang.yml/badge.svg)](https://github.com/taikoxyz/taiko-mono/actions/workflows/golang.yml) [![GuardianProverHealthCheck](https://codecov.io/gh/taikoxyz/taiko-mono/branch/main/graph/badge.svg?token=E468X2PTJC&flag=guardianproverhealthcheck)](https://codecov.io/gh/taikoxyz/taiko-mono) # Guardian Prover Health Check Service diff --git a/packages/guardian-prover-health-check/db.go b/packages/guardian-prover-health-check/db.go deleted file mode 100644 index 75263f6edaa..00000000000 --- a/packages/guardian-prover-health-check/db.go +++ /dev/null @@ -1,28 +0,0 @@ -package guardianproverhealthcheck - -import ( - "database/sql" - - "github.com/cyberhorsey/errors" - "gorm.io/gorm" -) - -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") -) - -type DBConnectionOpts struct { - Name string - Password string - Host string - Database string - MaxIdleConns uint64 - MaxOpenConns uint64 - MaxConnLifetime uint64 - OpenFunc func(dsn string) (DB, error) -} - -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} diff --git a/packages/guardian-prover-health-check/db/db.go b/packages/guardian-prover-health-check/db/db.go index e2d19c61ca0..a4c258c431f 100644 --- a/packages/guardian-prover-health-check/db/db.go +++ b/packages/guardian-prover-health-check/db/db.go @@ -9,27 +9,42 @@ import ( "gorm.io/gorm" ) -type DB struct { +var ( + ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "no db") +) + +type DB interface { + DB() (*sql.DB, error) + GormDB() *gorm.DB + Close() error +} + +type Database struct { gormdb *gorm.DB } -func (db *DB) DB() (*sql.DB, error) { +func (db *Database) DB() (*sql.DB, error) { return db.gormdb.DB() } -func (db *DB) GormDB() *gorm.DB { +func (db *Database) GormDB() *gorm.DB { return db.gormdb } -func New(gormdb *gorm.DB) *DB { - return &DB{ - gormdb: gormdb, +func (db *Database) Close() error { + sqldb, err := db.gormdb.DB() + if err != nil { + return err } + + return sqldb.Close() } -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") -) +func New(gormdb *gorm.DB) *Database { + return &Database{ + gormdb: gormdb, + } +} type DBConnectionOpts struct { Name string @@ -39,10 +54,10 @@ type DBConnectionOpts struct { MaxIdleConns uint64 MaxOpenConns uint64 MaxConnLifetime uint64 - OpenFunc func(dsn string) (*DB, error) + OpenFunc func(dsn string) (*Database, error) } -func OpenDBConnection(opts DBConnectionOpts) (*DB, error) { +func OpenDBConnection(opts DBConnectionOpts) (*Database, error) { dsn := "" if opts.Password == "" { dsn = fmt.Sprintf( diff --git a/packages/guardian-prover-health-check/healthcheck.go b/packages/guardian-prover-health-check/healthcheck.go index 913a0f3c66b..fb40633d936 100644 --- a/packages/guardian-prover-health-check/healthcheck.go +++ b/packages/guardian-prover-health-check/healthcheck.go @@ -45,6 +45,6 @@ type HealthCheckRepository interface { req *http.Request, address string, ) (*HealthCheck, error) - Save(opts SaveHealthCheckOpts) error + Save(ctx context.Context, opts *SaveHealthCheckOpts) error GetUptimeByGuardianProverAddress(ctx context.Context, address string) (float64, int, error) } diff --git a/packages/guardian-prover-health-check/healthchecker/config.go b/packages/guardian-prover-health-check/healthchecker/config.go index c16c2bbbdbf..30d80f85870 100644 --- a/packages/guardian-prover-health-check/healthchecker/config.go +++ b/packages/guardian-prover-health-check/healthchecker/config.go @@ -1,21 +1,16 @@ package healthchecker import ( - "database/sql" "strings" - "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" "github.com/urfave/cli/v2" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" -) -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" +) type Config struct { // db configs @@ -32,7 +27,7 @@ type Config struct { GuardianProverContractAddress string L1RPCUrl string L2RPCUrl string - OpenDBFunc func() (DB, error) + OpenDBFunc func() (db.DB, error) } // NewConfigFromCliContext creates a new config instance from command line flags. @@ -50,7 +45,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { L1RPCUrl: c.String(flags.L1RPCUrl.Name), L2RPCUrl: c.String(flags.L2RPCUrl.Name), HTTPPort: c.Uint64(flags.HTTPPort.Name), - OpenDBFunc: func() (DB, error) { + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -59,7 +54,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (*db.Database, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/guardian-prover-health-check/healthchecker/config_test.go b/packages/guardian-prover-health-check/healthchecker/config_test.go index b7455dcfd4e..faef03712ae 100644 --- a/packages/guardian-prover-health-check/healthchecker/config_test.go +++ b/packages/guardian-prover-health-check/healthchecker/config_test.go @@ -1,6 +1,7 @@ package healthchecker import ( + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" "testing" "github.com/stretchr/testify/assert" @@ -47,7 +48,7 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, uint64(30), c.DatabaseMaxConnLifetime) assert.Equal(t, uint64(1000), c.HTTPPort) - c.OpenDBFunc = func() (DB, error) { + c.OpenDBFunc = func() (db.DB, error) { return &mock.DB{}, nil } diff --git a/packages/guardian-prover-health-check/healthchecker/healthchecker.go b/packages/guardian-prover-health-check/healthchecker/healthchecker.go index 7c96144db0f..8f3f5827065 100644 --- a/packages/guardian-prover-health-check/healthchecker/healthchecker.go +++ b/packages/guardian-prover-health-check/healthchecker/healthchecker.go @@ -14,14 +14,18 @@ import ( "github.com/labstack/echo/v4" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" + "github.com/urfave/cli/v2" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/bindings/guardianprover" + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" hchttp "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/http" "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/repo" - "github.com/urfave/cli/v2" ) type HealthChecker struct { + db db.DB + ctx context.Context cancelCtx context.CancelFunc healthCheckRepo guardianproverhealthcheck.HealthCheckRepository @@ -42,6 +46,11 @@ func (h *HealthChecker) Close(ctx context.Context) { if err := h.httpSrv.Shutdown(ctx); err != nil { slog.Error("error encountered shutting down http server", "error", err) } + + // close db + if err := h.db.Close(); err != nil { + slog.Error("error encountered closing db", "error", err) + } } func (h *HealthChecker) InitFromCli(ctx context.Context, c *cli.Context) error { @@ -143,6 +152,7 @@ func InitFromConfig(ctx context.Context, h *HealthChecker, cfg *Config) (err err return err } + h.db = db h.guardianProvers = guardianProvers h.numGuardians = numGuardians.Uint64() h.healthCheckRepo = healthCheckRepo diff --git a/packages/guardian-prover-health-check/http/get_health_checks_by_guardian_prover_address_test.go b/packages/guardian-prover-health-check/http/get_health_checks_by_guardian_prover_address_test.go index 4ef5151700e..4822be86b01 100644 --- a/packages/guardian-prover-health-check/http/get_health_checks_by_guardian_prover_address_test.go +++ b/packages/guardian-prover-health-check/http/get_health_checks_by_guardian_prover_address_test.go @@ -1,6 +1,7 @@ package http import ( + "context" "fmt" "net/http" "net/http/httptest" @@ -9,13 +10,14 @@ import ( "github.com/cyberhorsey/webutils/testutils" "github.com/labstack/echo/v4" "github.com/stretchr/testify/assert" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" ) func Test_GetHealthChecksByGuardianProverID(t *testing.T) { srv := newTestServer("") - err := srv.healthCheckRepo.Save(guardianproverhealthcheck.SaveHealthCheckOpts{ + err := srv.healthCheckRepo.Save(context.Background(), &guardianproverhealthcheck.SaveHealthCheckOpts{ GuardianProverID: 1, Alive: true, ExpectedAddress: "0x123", diff --git a/packages/guardian-prover-health-check/http/get_health_checks_test.go b/packages/guardian-prover-health-check/http/get_health_checks_test.go index 0fdf5ea3a4b..39e377a8dbe 100644 --- a/packages/guardian-prover-health-check/http/get_health_checks_test.go +++ b/packages/guardian-prover-health-check/http/get_health_checks_test.go @@ -1,6 +1,7 @@ package http import ( + "context" "net/http" "net/http/httptest" "testing" @@ -8,13 +9,14 @@ import ( "github.com/cyberhorsey/webutils/testutils" "github.com/labstack/echo/v4" "github.com/stretchr/testify/assert" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" ) func Test_GetHealthChecks(t *testing.T) { srv := newTestServer("") - err := srv.healthCheckRepo.Save(guardianproverhealthcheck.SaveHealthCheckOpts{ + err := srv.healthCheckRepo.Save(context.Background(), &guardianproverhealthcheck.SaveHealthCheckOpts{ GuardianProverID: 1, Alive: true, ExpectedAddress: "0x123", diff --git a/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address.go b/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address.go index f6a0373c946..0f2a3a4de55 100644 --- a/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address.go +++ b/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address.go @@ -26,6 +26,7 @@ func (srv *Server) GetMostRecentSignedBlockByGuardianProverAddress(c echo.Contex } signedBlock, err := srv.signedBlockRepo.GetMostRecentByGuardianProverAddress( + c.Request().Context(), address, ) diff --git a/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address_test.go b/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address_test.go index 779b959b862..f793c7ba0ee 100644 --- a/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address_test.go +++ b/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address_test.go @@ -1,6 +1,7 @@ package http import ( + "context" "fmt" "net/http" "net/http/httptest" @@ -16,13 +17,15 @@ func Test_GetMostRecentSignedBlockByGuardianProverAddress(t *testing.T) { srv := newTestServer("") for i := 0; i < 10; i++ { - err := srv.signedBlockRepo.Save(guardianproverhealthcheck.SaveSignedBlockOpts{ - GuardianProverID: 1, - RecoveredAddress: "0x123", - BlockID: uint64(i), - BlockHash: "0x123", - Signature: "0x123", - }) + err := srv.signedBlockRepo.Save( + context.Background(), + &guardianproverhealthcheck.SaveSignedBlockOpts{ + GuardianProverID: 1, + RecoveredAddress: "0x123", + BlockID: uint64(i), + BlockHash: "0x123", + Signature: "0x123", + }) assert.Nil(t, err) } diff --git a/packages/guardian-prover-health-check/http/get_most_recent_startup_by_guardian_prover_address_test.go b/packages/guardian-prover-health-check/http/get_most_recent_startup_by_guardian_prover_address_test.go index a3a48b793b1..e2556c27fce 100644 --- a/packages/guardian-prover-health-check/http/get_most_recent_startup_by_guardian_prover_address_test.go +++ b/packages/guardian-prover-health-check/http/get_most_recent_startup_by_guardian_prover_address_test.go @@ -1,6 +1,7 @@ package http import ( + "context" "fmt" "net/http" "net/http/httptest" @@ -16,7 +17,7 @@ func Test_GetMostRecentStartupByGuardianProverAddress(t *testing.T) { srv := newTestServer("") for i := 0; i < 5; i++ { - err := srv.startupRepo.Save(guardianproverhealthcheck.SaveStartupOpts{ + err := srv.startupRepo.Save(context.Background(), &guardianproverhealthcheck.SaveStartupOpts{ GuardianProverID: 1, GuardianProverAddress: "0x123", Revision: "asdf", diff --git a/packages/guardian-prover-health-check/http/get_signed_blocks.go b/packages/guardian-prover-health-check/http/get_signed_blocks.go index 64112f6234b..be0c6ac0950 100644 --- a/packages/guardian-prover-health-check/http/get_signed_blocks.go +++ b/packages/guardian-prover-health-check/http/get_signed_blocks.go @@ -82,6 +82,7 @@ func (srv *Server) GetSignedBlocks(c echo.Context) error { } signedBlocks, err := srv.signedBlockRepo.GetByStartingBlockID( + c.Request().Context(), guardianproverhealthcheck.GetSignedBlocksByStartingBlockIDOpts{ StartingBlockID: start, }, diff --git a/packages/guardian-prover-health-check/http/get_startups_by_guardian_prover_address_test.go b/packages/guardian-prover-health-check/http/get_startups_by_guardian_prover_address_test.go index cdb86b4c230..a483ad94a7e 100644 --- a/packages/guardian-prover-health-check/http/get_startups_by_guardian_prover_address_test.go +++ b/packages/guardian-prover-health-check/http/get_startups_by_guardian_prover_address_test.go @@ -1,6 +1,7 @@ package http import ( + "context" "fmt" "net/http" "net/http/httptest" @@ -15,7 +16,7 @@ import ( func Test_GetStartupsByGuardianProverAddress(t *testing.T) { srv := newTestServer("") - err := srv.startupRepo.Save(guardianproverhealthcheck.SaveStartupOpts{ + err := srv.startupRepo.Save(context.Background(), &guardianproverhealthcheck.SaveStartupOpts{ GuardianProverID: 1, GuardianProverAddress: "0x123", Revision: "asdf", diff --git a/packages/guardian-prover-health-check/http/get_uptime_by_guardian_prover_address.go b/packages/guardian-prover-health-check/http/get_uptime_by_guardian_prover_address.go index 14ef653fcd7..037ce367117 100644 --- a/packages/guardian-prover-health-check/http/get_uptime_by_guardian_prover_address.go +++ b/packages/guardian-prover-health-check/http/get_uptime_by_guardian_prover_address.go @@ -16,8 +16,8 @@ type uptimeResponse struct { // // returns the stats // -// @Summary Get updatime by guardian prover address -// @ID get-updatime-by-guardian-prover-address +// @Summary Get uptime by guardian prover address +// @ID get-uptime-by-guardian-prover-address // @Accept json // @Produce json // @Success 200 {object} uptimeResponse diff --git a/packages/guardian-prover-health-check/http/post_health_check.go b/packages/guardian-prover-health-check/http/post_health_check.go index 860428007df..a89f7614c43 100644 --- a/packages/guardian-prover-health-check/http/post_health_check.go +++ b/packages/guardian-prover-health-check/http/post_health_check.go @@ -1,6 +1,7 @@ package http import ( + "context" "log/slog" "net/http" @@ -62,7 +63,7 @@ func (srv *Server) PostHealthCheck(c echo.Context) error { // expected address and recovered address will be the same until we have an auth // mechanism which will allow us to store health checks that ecrecover to an unexpected // address. - if err := srv.healthCheckRepo.Save(guardianproverhealthcheck.SaveHealthCheckOpts{ + if err := srv.healthCheckRepo.Save(context.Background(), &guardianproverhealthcheck.SaveHealthCheckOpts{ GuardianProverID: recoveredGuardianProver.ID.Uint64(), Alive: true, ExpectedAddress: recoveredGuardianProver.Address.Hex(), diff --git a/packages/guardian-prover-health-check/http/post_signed_block.go b/packages/guardian-prover-health-check/http/post_signed_block.go index a7898d6eb28..e39adc331cf 100644 --- a/packages/guardian-prover-health-check/http/post_signed_block.go +++ b/packages/guardian-prover-health-check/http/post_signed_block.go @@ -52,13 +52,15 @@ func (srv *Server) PostSignedBlock(c echo.Context) error { } // otherwise, we can store it in the database. - if err := srv.signedBlockRepo.Save(guardianproverhealthcheck.SaveSignedBlockOpts{ - GuardianProverID: recoveredGuardianProver.ID.Uint64(), - BlockID: req.BlockID, - BlockHash: req.BlockHash, - Signature: req.Signature, - RecoveredAddress: recoveredGuardianProver.Address.Hex(), - }); err != nil { + if err := srv.signedBlockRepo.Save( + c.Request().Context(), + &guardianproverhealthcheck.SaveSignedBlockOpts{ + GuardianProverID: recoveredGuardianProver.ID.Uint64(), + BlockID: req.BlockID, + BlockHash: req.BlockHash, + Signature: req.Signature, + RecoveredAddress: recoveredGuardianProver.Address.Hex(), + }); err != nil { // if its a duplicate entry, we just return empty response with // status 200 instead of an error. if strings.Contains(err.Error(), "Duplicate entry") { diff --git a/packages/guardian-prover-health-check/http/post_startup.go b/packages/guardian-prover-health-check/http/post_startup.go index c08785144c4..9c9a0d72de5 100644 --- a/packages/guardian-prover-health-check/http/post_startup.go +++ b/packages/guardian-prover-health-check/http/post_startup.go @@ -1,6 +1,7 @@ package http import ( + "context" "log/slog" "net/http" @@ -61,7 +62,7 @@ func (srv *Server) PostStartup(c echo.Context) error { // expected address and recovered address will be the same until we have an auth // mechanism which will allow us to store health checks that ecrecover to an unexpected // address. - if err := srv.startupRepo.Save(guardianproverhealthcheck.SaveStartupOpts{ + if err := srv.startupRepo.Save(context.Background(), &guardianproverhealthcheck.SaveStartupOpts{ GuardianProverID: recoveredGuardianProver.ID.Uint64(), GuardianVersion: req.GuardianVersion, L1NodeVersion: req.L1NodeVersion, diff --git a/packages/guardian-prover-health-check/http/server.go b/packages/guardian-prover-health-check/http/server.go index 36c6bbb455b..7f8947149d6 100644 --- a/packages/guardian-prover-health-check/http/server.go +++ b/packages/guardian-prover-health-check/http/server.go @@ -23,7 +23,7 @@ import ( // @license.name MIT // @host healthcheck.internal.taiko.xyz -// Server represents an guardian prover health check http server instance. +// Server represents a guardian prover health check http server instance. type Server struct { echo *echo.Echo ethClient *ethclient.Client diff --git a/packages/guardian-prover-health-check/mock/db.go b/packages/guardian-prover-health-check/mock/db.go index 00d2111641a..32a3477a5dd 100644 --- a/packages/guardian-prover-health-check/mock/db.go +++ b/packages/guardian-prover-health-check/mock/db.go @@ -16,3 +16,5 @@ func (db *DB) DB() (*sql.DB, error) { func (db *DB) GormDB() *gorm.DB { return &gorm.DB{} } + +func (db *DB) Close() error { return nil } diff --git a/packages/guardian-prover-health-check/mock/health_check_repo.go b/packages/guardian-prover-health-check/mock/health_check_repo.go index 3bd51186260..f6aca3aa853 100644 --- a/packages/guardian-prover-health-check/mock/health_check_repo.go +++ b/packages/guardian-prover-health-check/mock/health_check_repo.go @@ -44,7 +44,7 @@ func (h *HealthCheckRepo) Get( }, nil } -func (h *HealthCheckRepo) Save(opts guardianproverhealthcheck.SaveHealthCheckOpts) error { +func (h *HealthCheckRepo) Save(ctx context.Context, opts *guardianproverhealthcheck.SaveHealthCheckOpts) error { h.healthChecks = append(h.healthChecks, &guardianproverhealthcheck.HealthCheck{ GuardianProverID: opts.GuardianProverID, Alive: opts.Alive, diff --git a/packages/guardian-prover-health-check/mock/signed_block_repo.go b/packages/guardian-prover-health-check/mock/signed_block_repo.go index 1733db41a8c..f89d800ad62 100644 --- a/packages/guardian-prover-health-check/mock/signed_block_repo.go +++ b/packages/guardian-prover-health-check/mock/signed_block_repo.go @@ -1,6 +1,7 @@ package mock import ( + "context" "errors" guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" @@ -16,7 +17,7 @@ func NewSignedBlockRepository() *SignedBlockRepo { } } -func (r *SignedBlockRepo) Save(opts guardianproverhealthcheck.SaveSignedBlockOpts) error { +func (r *SignedBlockRepo) Save(ctx context.Context, opts *guardianproverhealthcheck.SaveSignedBlockOpts) error { r.signedBlocks = append(r.signedBlocks, &guardianproverhealthcheck.SignedBlock{ GuardianProverID: opts.GuardianProverID, BlockID: opts.BlockID, @@ -30,6 +31,7 @@ func (r *SignedBlockRepo) Save(opts guardianproverhealthcheck.SaveSignedBlockOpt } func (r *SignedBlockRepo) GetByStartingBlockID( + ctx context.Context, opts guardianproverhealthcheck.GetSignedBlocksByStartingBlockIDOpts, ) ([]*guardianproverhealthcheck.SignedBlock, error) { sb := make([]*guardianproverhealthcheck.SignedBlock, 0) @@ -44,6 +46,7 @@ func (r *SignedBlockRepo) GetByStartingBlockID( } func (r *SignedBlockRepo) GetMostRecentByGuardianProverAddress( + ctx context.Context, address string, ) (*guardianproverhealthcheck.SignedBlock, error) { var b *guardianproverhealthcheck.SignedBlock diff --git a/packages/guardian-prover-health-check/mock/startup_repo.go b/packages/guardian-prover-health-check/mock/startup_repo.go index 98115b77c20..8091779772d 100644 --- a/packages/guardian-prover-health-check/mock/startup_repo.go +++ b/packages/guardian-prover-health-check/mock/startup_repo.go @@ -51,7 +51,7 @@ func (r *StartupRepo) GetMostRecentByGuardianProverAddress( return s, nil } -func (h *StartupRepo) Save(opts guardianproverhealthcheck.SaveStartupOpts) error { +func (h *StartupRepo) Save(ctx context.Context, opts *guardianproverhealthcheck.SaveStartupOpts) error { h.startups = append(h.startups, &guardianproverhealthcheck.Startup{ GuardianProverID: opts.GuardianProverID, GuardianProverAddress: opts.GuardianProverAddress, diff --git a/packages/guardian-prover-health-check/repo/containers_test.go b/packages/guardian-prover-health-check/repo/containers_test.go index 935d18fa92c..4e86abe17a4 100644 --- a/packages/guardian-prover-health-check/repo/containers_test.go +++ b/packages/guardian-prover-health-check/repo/containers_test.go @@ -20,7 +20,7 @@ var ( dbPassword = "password" ) -func testMysql(t *testing.T) (DB, func(), error) { +func testMysql(t *testing.T) (db.DB, func(), error) { req := testcontainers.ContainerRequest{ Image: "mysql:latest", ExposedPorts: []string{"3306/tcp", "33060/tcp"}, diff --git a/packages/guardian-prover-health-check/repo/db.go b/packages/guardian-prover-health-check/repo/db.go deleted file mode 100644 index 1c8a35dbca3..00000000000 --- a/packages/guardian-prover-health-check/repo/db.go +++ /dev/null @@ -1,17 +0,0 @@ -package repo - -import ( - "database/sql" - - "github.com/cyberhorsey/errors" - "gorm.io/gorm" -) - -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "no db") -) - -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} diff --git a/packages/guardian-prover-health-check/repo/healthcheck.go b/packages/guardian-prover-health-check/repo/healthcheck.go index c8bb184a4d4..a4cdab5bc85 100644 --- a/packages/guardian-prover-health-check/repo/healthcheck.go +++ b/packages/guardian-prover-health-check/repo/healthcheck.go @@ -5,8 +5,10 @@ import ( "net/http" "github.com/morkid/paginate" - guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" "gorm.io/gorm" + + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" ) var ( @@ -14,21 +16,21 @@ var ( ) type HealthCheckRepository struct { - db DB + db db.DB } -func NewHealthCheckRepository(db DB) (*HealthCheckRepository, error) { - if db == nil { - return nil, ErrNoDB +func NewHealthCheckRepository(dbHandler db.DB) (*HealthCheckRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &HealthCheckRepository{ - db: db, + db: dbHandler, }, nil } -func (r *HealthCheckRepository) startQuery() *gorm.DB { - return r.db.GormDB().Table("health_checks") +func (r *HealthCheckRepository) startQuery(ctx context.Context) *gorm.DB { + return r.db.GormDB().WithContext(ctx).Table("health_checks") } func (r *HealthCheckRepository) Get( @@ -39,7 +41,7 @@ func (r *HealthCheckRepository) Get( DefaultSize: 100, }) - reqCtx := pg.With(r.startQuery()) + reqCtx := pg.With(r.startQuery(ctx)) page := reqCtx.Request(req).Response(&[]guardianproverhealthcheck.HealthCheck{}) @@ -55,7 +57,7 @@ func (r *HealthCheckRepository) GetByGuardianProverAddress( DefaultSize: 100, }) - reqCtx := pg.With(r.startQuery().Order("created_at desc"). + reqCtx := pg.With(r.startQuery(ctx).Order("created_at desc"). Where("recovered_address = ?", address)) page := reqCtx.Request(req).Response(&[]guardianproverhealthcheck.HealthCheck{}) @@ -70,7 +72,7 @@ func (r *HealthCheckRepository) GetMostRecentByGuardianProverAddress( ) (*guardianproverhealthcheck.HealthCheck, error) { hc := &guardianproverhealthcheck.HealthCheck{} - if err := r.startQuery().Order("created_at desc"). + if err := r.startQuery(ctx).Order("created_at desc"). Where("recovered_address = ?", address).Limit(1). Scan(hc).Error; err != nil { return nil, err @@ -79,7 +81,7 @@ func (r *HealthCheckRepository) GetMostRecentByGuardianProverAddress( return hc, nil } -func (r *HealthCheckRepository) Save(opts guardianproverhealthcheck.SaveHealthCheckOpts) error { +func (r *HealthCheckRepository) Save(ctx context.Context, opts *guardianproverhealthcheck.SaveHealthCheckOpts) error { b := &guardianproverhealthcheck.HealthCheck{ Alive: opts.Alive, ExpectedAddress: opts.ExpectedAddress, @@ -89,7 +91,7 @@ func (r *HealthCheckRepository) Save(opts guardianproverhealthcheck.SaveHealthCh LatestL1Block: opts.LatestL1Block, LatestL2Block: opts.LatestL2Block, } - if err := r.startQuery().Create(b).Error; err != nil { + if err := r.startQuery(ctx).Create(b).Error; err != nil { return err } @@ -102,12 +104,12 @@ func (r *HealthCheckRepository) GetUptimeByGuardianProverAddress( ) (float64, int, error) { var count int64 - var query string = `SELECT COUNT(*) - FROM health_checks + var query string = `SELECT COUNT(*) + FROM health_checks WHERE recovered_address = ? AND created_at > NOW() - INTERVAL 1 DAY` - if err := r.db.GormDB().Raw(query, address).Scan(&count).Error; err != nil { + if err := r.db.GormDB().WithContext(ctx).Raw(query, address).Scan(&count).Error; err != nil { return 0, 0, err } diff --git a/packages/guardian-prover-health-check/repo/healthcheck_test.go b/packages/guardian-prover-health-check/repo/healthcheck_test.go index 6b84e2a2663..fff747e3217 100644 --- a/packages/guardian-prover-health-check/repo/healthcheck_test.go +++ b/packages/guardian-prover-health-check/repo/healthcheck_test.go @@ -5,26 +5,27 @@ import ( "net/http" "testing" + "gopkg.in/go-playground/assert.v1" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" - "gopkg.in/go-playground/assert.v1" ) func Test_NewHealthCheckRepo(t *testing.T) { tests := []struct { name string - db DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - ErrNoDB, + db.ErrNoDB, }, } @@ -66,7 +67,7 @@ func TestIntegration_HealthCheck_Save(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err = healthCheckRepo.Save(tt.opts) + err = healthCheckRepo.Save(context.Background(), &tt.opts) assert.Equal(t, tt.wantErr, err) req, err := http.NewRequest(http.MethodGet, "/healtcheck", nil) @@ -90,7 +91,7 @@ func TestIntegration_HealthCheck_UptimeByGuardianProverId(t *testing.T) { assert.Equal(t, nil, err) - err = healthCheckRepo.Save(guardianproverhealthcheck.SaveHealthCheckOpts{ + err = healthCheckRepo.Save(context.Background(), &guardianproverhealthcheck.SaveHealthCheckOpts{ GuardianProverID: 1, Alive: true, ExpectedAddress: "0x123", @@ -102,7 +103,7 @@ func TestIntegration_HealthCheck_UptimeByGuardianProverId(t *testing.T) { assert.Equal(t, err, nil) - err = healthCheckRepo.Save(guardianproverhealthcheck.SaveHealthCheckOpts{ + err = healthCheckRepo.Save(context.Background(), &guardianproverhealthcheck.SaveHealthCheckOpts{ GuardianProverID: 1, Alive: true, ExpectedAddress: "0x123", diff --git a/packages/guardian-prover-health-check/repo/signed_block.go b/packages/guardian-prover-health-check/repo/signed_block.go index c5be413ee72..97e0b4ebaf6 100644 --- a/packages/guardian-prover-health-check/repo/signed_block.go +++ b/packages/guardian-prover-health-check/repo/signed_block.go @@ -1,29 +1,32 @@ package repo import ( - guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" + "context" "gorm.io/gorm" + + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" ) type SignedBlockRepository struct { - db DB + db db.DB } -func NewSignedBlockRepository(db DB) (*SignedBlockRepository, error) { - if db == nil { - return nil, ErrNoDB +func NewSignedBlockRepository(dbHandler db.DB) (*SignedBlockRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &SignedBlockRepository{ - db: db, + db: dbHandler, }, nil } -func (r *SignedBlockRepository) startQuery() *gorm.DB { - return r.db.GormDB().Table("signed_blocks") +func (r *SignedBlockRepository) startQuery(ctx context.Context) *gorm.DB { + return r.db.GormDB().WithContext(ctx).Table("signed_blocks") } -func (r *SignedBlockRepository) Save(opts guardianproverhealthcheck.SaveSignedBlockOpts) error { +func (r *SignedBlockRepository) Save(ctx context.Context, opts *guardianproverhealthcheck.SaveSignedBlockOpts) error { b := &guardianproverhealthcheck.SignedBlock{ GuardianProverID: opts.GuardianProverID, BlockID: opts.BlockID, @@ -31,7 +34,7 @@ func (r *SignedBlockRepository) Save(opts guardianproverhealthcheck.SaveSignedBl RecoveredAddress: opts.RecoveredAddress, Signature: opts.Signature, } - if err := r.startQuery().Create(b).Error; err != nil { + if err := r.startQuery(ctx).Create(b).Error; err != nil { return err } @@ -39,31 +42,32 @@ func (r *SignedBlockRepository) Save(opts guardianproverhealthcheck.SaveSignedBl } func (r *SignedBlockRepository) GetByStartingBlockID( + ctx context.Context, opts guardianproverhealthcheck.GetSignedBlocksByStartingBlockIDOpts, ) ([]*guardianproverhealthcheck.SignedBlock, error) { var sb []*guardianproverhealthcheck.SignedBlock - if err := r.startQuery().Where("block_id >= ?", opts.StartingBlockID).Find(&sb).Error; err != nil { + if err := r.startQuery(ctx).Where("block_id >= ?", opts.StartingBlockID).Find(&sb).Error; err != nil { return nil, err } return sb, nil } -func (r *SignedBlockRepository) GetMostRecentByGuardianProverAddress(address string) ( +func (r *SignedBlockRepository) GetMostRecentByGuardianProverAddress(ctx context.Context, address string) ( *guardianproverhealthcheck.SignedBlock, error) { q := `SELECT * FROM signed_blocks WHERE block_id = ( - SELECT MAX(block_id) - FROM signed_blocks + SELECT MAX(block_id) + FROM signed_blocks WHERE recovered_address = ? ) AND recovered_address = ?;` var b *guardianproverhealthcheck.SignedBlock - if err := r.startQuery().Raw(q, address, address).Scan(&b).Error; err != nil { + if err := r.startQuery(ctx).Raw(q, address, address).Scan(&b).Error; err != nil { return nil, err } diff --git a/packages/guardian-prover-health-check/repo/signed_block_test.go b/packages/guardian-prover-health-check/repo/signed_block_test.go index 2c94c50adc4..781699dda5c 100644 --- a/packages/guardian-prover-health-check/repo/signed_block_test.go +++ b/packages/guardian-prover-health-check/repo/signed_block_test.go @@ -1,28 +1,30 @@ package repo import ( + "context" "testing" + "gopkg.in/go-playground/assert.v1" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" - "gopkg.in/go-playground/assert.v1" ) func Test_NewSignedBlockRepo(t *testing.T) { tests := []struct { name string - db DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - ErrNoDB, + db.ErrNoDB, }, } @@ -62,7 +64,7 @@ func TestIntegration_SignedBlock_Save(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err = SignedBlockRepo.Save(tt.opts) + err = SignedBlockRepo.Save(context.Background(), &tt.opts) assert.Equal(t, tt.wantErr, err) }) } diff --git a/packages/guardian-prover-health-check/repo/startup.go b/packages/guardian-prover-health-check/repo/startup.go index 576a2ca3842..b7560761a93 100644 --- a/packages/guardian-prover-health-check/repo/startup.go +++ b/packages/guardian-prover-health-check/repo/startup.go @@ -5,26 +5,28 @@ import ( "net/http" "github.com/morkid/paginate" - guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" "gorm.io/gorm" + + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" ) type StartupRepository struct { - db DB + db db.DB } -func NewStartupRepository(db DB) (*StartupRepository, error) { - if db == nil { - return nil, ErrNoDB +func NewStartupRepository(dbHandler db.DB) (*StartupRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &StartupRepository{ - db: db, + db: dbHandler, }, nil } -func (r *StartupRepository) startQuery() *gorm.DB { - return r.db.GormDB().Table("startups") +func (r *StartupRepository) startQuery(ctx context.Context) *gorm.DB { + return r.db.GormDB().WithContext(ctx).Table("startups") } func (r *StartupRepository) GetByGuardianProverAddress( @@ -36,7 +38,7 @@ func (r *StartupRepository) GetByGuardianProverAddress( DefaultSize: 100, }) - reqCtx := pg.With(r.startQuery().Order("created_at desc"). + reqCtx := pg.With(r.startQuery(ctx).Order("created_at desc"). Where("guardian_prover_address = ?", address)) page := reqCtx.Request(req).Response(&[]guardianproverhealthcheck.Startup{}) @@ -50,7 +52,7 @@ func (r *StartupRepository) GetMostRecentByGuardianProverAddress( ) (*guardianproverhealthcheck.Startup, error) { s := &guardianproverhealthcheck.Startup{} - if err := r.startQuery().Order("created_at desc"). + if err := r.startQuery(ctx).Order("created_at desc"). Where("guardian_prover_address = ?", address).Limit(1). Scan(s).Error; err != nil { return nil, err @@ -59,7 +61,7 @@ func (r *StartupRepository) GetMostRecentByGuardianProverAddress( return s, nil } -func (r *StartupRepository) Save(opts guardianproverhealthcheck.SaveStartupOpts) error { +func (r *StartupRepository) Save(ctx context.Context, opts *guardianproverhealthcheck.SaveStartupOpts) error { b := &guardianproverhealthcheck.Startup{ GuardianProverAddress: opts.GuardianProverAddress, GuardianProverID: opts.GuardianProverID, @@ -68,7 +70,7 @@ func (r *StartupRepository) Save(opts guardianproverhealthcheck.SaveStartupOpts) L1NodeVersion: opts.L1NodeVersion, L2NodeVersion: opts.L2NodeVersion, } - if err := r.startQuery().Create(b).Error; err != nil { + if err := r.startQuery(ctx).Create(b).Error; err != nil { return err } diff --git a/packages/guardian-prover-health-check/repo/startup_test.go b/packages/guardian-prover-health-check/repo/startup_test.go index 7b83a842bbe..4c4bfae33bb 100644 --- a/packages/guardian-prover-health-check/repo/startup_test.go +++ b/packages/guardian-prover-health-check/repo/startup_test.go @@ -5,26 +5,27 @@ import ( "net/http" "testing" + "gopkg.in/go-playground/assert.v1" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" - "gopkg.in/go-playground/assert.v1" ) func Test_NewStartupRepo(t *testing.T) { tests := []struct { name string - db DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - ErrNoDB, + db.ErrNoDB, }, } @@ -63,7 +64,7 @@ func TestIntegration_Startup_Save(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err = startupRepo.Save(tt.opts) + err = startupRepo.Save(context.Background(), &tt.opts) assert.Equal(t, tt.wantErr, err) }) } @@ -78,7 +79,7 @@ func TestIntegration_Startup_GetByGuardianProverID(t *testing.T) { startupRepo, err := NewStartupRepository(db) assert.Equal(t, nil, err) - err = startupRepo.Save(guardianproverhealthcheck.SaveStartupOpts{ + err = startupRepo.Save(context.Background(), &guardianproverhealthcheck.SaveStartupOpts{ GuardianProverID: 1, GuardianProverAddress: "0x123", Revision: "asdf", @@ -89,7 +90,7 @@ func TestIntegration_Startup_GetByGuardianProverID(t *testing.T) { assert.Equal(t, nil, err) - err = startupRepo.Save(guardianproverhealthcheck.SaveStartupOpts{ + err = startupRepo.Save(context.Background(), &guardianproverhealthcheck.SaveStartupOpts{ GuardianProverID: 1, GuardianProverAddress: "0x123", Revision: "zxxc", diff --git a/packages/guardian-prover-health-check/scripts/abigen.sh b/packages/guardian-prover-health-check/scripts/abigen.sh index 206fba1c653..cbccd406812 100755 --- a/packages/guardian-prover-health-check/scripts/abigen.sh +++ b/packages/guardian-prover-health-check/scripts/abigen.sh @@ -1,4 +1,4 @@ -#/bin/sh +#!/bin/sh if [ ! -d "../protocol/out" ]; then echo "ABI not generated in protocol package yet. Please run npm install && npx hardhat compile in ../protocol" @@ -11,12 +11,12 @@ names=("GuardianProver") for (( i = 0; i < ${#paths[@]}; ++i )); do - jq .abi ../protocol/out/${paths[i]}/${names[i]}.json > ${names[i]}.json lower=$(echo "${names[i]}" | tr '[:upper:]' '[:lower:]') - abigen --abi ${names[i]}.json \ + jq .abi ../protocol/out/${paths[i]}/${names[i]}.json > bindings/$lower/${names[i]}.json + abigen --abi bindings/$lower/${names[i]}.json \ --pkg $lower \ --type ${names[i]} \ --out bindings/$lower/${names[i]}.go done -exit 0 \ No newline at end of file +exit 0 diff --git a/packages/guardian-prover-health-check/scripts/swagger.sh b/packages/guardian-prover-health-check/scripts/swagger.sh index b0b8dbb55e2..92cda8598af 100755 --- a/packages/guardian-prover-health-check/scripts/swagger.sh +++ b/packages/guardian-prover-health-check/scripts/swagger.sh @@ -1,3 +1,3 @@ -#/bin/sh +#!/bin/sh -swag init -g http/server.go --parseDependency \ No newline at end of file +swag init -g http/server.go --parseDependency diff --git a/packages/guardian-prover-health-check/signed_block.go b/packages/guardian-prover-health-check/signed_block.go index 3f040e74114..95eded73c1d 100644 --- a/packages/guardian-prover-health-check/signed_block.go +++ b/packages/guardian-prover-health-check/signed_block.go @@ -1,6 +1,7 @@ package guardianproverhealthcheck import ( + "context" "time" ) @@ -28,7 +29,7 @@ type GetSignedBlocksByStartingBlockIDOpts struct { // SignedBlockRepository defines database interaction methods to create and get // signed blocks submitted by guardian provers. type SignedBlockRepository interface { - Save(opts SaveSignedBlockOpts) error - GetByStartingBlockID(opts GetSignedBlocksByStartingBlockIDOpts) ([]*SignedBlock, error) - GetMostRecentByGuardianProverAddress(address string) (*SignedBlock, error) + Save(ctx context.Context, opts *SaveSignedBlockOpts) error + GetByStartingBlockID(ctx context.Context, opts GetSignedBlocksByStartingBlockIDOpts) ([]*SignedBlock, error) + GetMostRecentByGuardianProverAddress(ctx context.Context, address string) (*SignedBlock, error) } diff --git a/packages/guardian-prover-health-check/startup.go b/packages/guardian-prover-health-check/startup.go index 30e7db03377..831398421e1 100644 --- a/packages/guardian-prover-health-check/startup.go +++ b/packages/guardian-prover-health-check/startup.go @@ -45,5 +45,5 @@ type StartupRepository interface { ctx context.Context, address string, ) (*Startup, error) - Save(opts SaveStartupOpts) error + Save(ctx context.Context, opts *SaveStartupOpts) error } diff --git a/packages/monitors/.gitignore b/packages/monitors/.gitignore new file mode 100644 index 00000000000..86092cef1cb --- /dev/null +++ b/packages/monitors/.gitignore @@ -0,0 +1 @@ +.defender diff --git a/packages/monitors/README.md b/packages/monitors/README.md new file mode 100644 index 00000000000..43f6628df45 --- /dev/null +++ b/packages/monitors/README.md @@ -0,0 +1,3 @@ +# Monitors + +This package contains monitoring and alerting services for the Taiko protocol. It uses OpenZeppelin Defender for monitoring smart contracts and setting up automated alerts. diff --git a/packages/monitors/defender/mainnet/.defender/deployment-log.mystack.json b/packages/monitors/defender/mainnet/.defender/deployment-log.mystack.json new file mode 100644 index 00000000000..cf6a9a2b953 --- /dev/null +++ b/packages/monitors/defender/mainnet/.defender/deployment-log.mystack.json @@ -0,0 +1,9 @@ +{"stack":"mystack","timestamp":"2024-09-18T21:39:53.367Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[{"autotaskId":"9fc30210-b551-49df-9836-b50fb6d2aaed","actionId":"9fc30210-b551-49df-9836-b50fb6d2aaed","name":"SGXVerifier: VerifyProof failure Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":5,"type":"schedule"},"codeDigest":"pRCwGRE9kcevXfVaEyCq9VP+R/9tEZp4EwZEM8/9B4Y=","stackResourceId":"mystack.sgx-verifier-verify-proof-failure-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVAKQDUd+QsAAPkLAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCB2ZXJpZnlQcm9vZlNpZ25hdHVyZSA9ICJ2ZXJpZnlQcm9vZihhZGRyZXNzLGJ5dGVzMzIsYnl0ZXMzMikiOwpjb25zdCB2ZXJpZnlQcm9vZlNlbGVjdG9yID0gZXRoZXJzLnV0aWxzCiAgLmtlY2NhazI1NihldGhlcnMudXRpbHMudG9VdGY4Qnl0ZXModmVyaWZ5UHJvb2ZTaWduYXR1cmUpKQogIC5zdWJzdHJpbmcoMCwgMTApOwoKZnVuY3Rpb24gYWxlcnRPcmcobm90aWZpY2F0aW9uQ2xpZW50LCBtZXNzYWdlKSB7CiAgbm90aWZpY2F0aW9uQ2xpZW50LnNlbmQoewogICAgY2hhbm5lbEFsaWFzOiAiZGlzY29yZF9ibG9ja3MiLAogICAgc3ViamVjdDogIuKaoO+4jyBTR1hWZXJpZmllcjogdmVyaWZ5UHJvb2YgRmFpbHVyZSBBbGVydCIsCiAgICBtZXNzYWdlLAogIH0pOwp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnN0IGNsaWVudCA9IG5ldyBEZWZlbmRlcih7CiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICByZWxheWVyQXBpS2V5LAogICAgcmVsYXllckFwaVNlY3JldCwKICB9KTsKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIHJldHVybiBjdXJyZW50QmxvY2subnVtYmVyOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpIHsKICBjb25zdCBsYXRlc3RCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICBjb25zdCBwcmV2aW91c0Jsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2sobGF0ZXN0QmxvY2subnVtYmVyIC0gMTAwKTsKCiAgY29uc3QgdGltZURpZmYgPSBsYXRlc3RCbG9jay50aW1lc3RhbXAgLSBwcmV2aW91c0Jsb2NrLnRpbWVzdGFtcDsKICBjb25zdCBibG9ja0RpZmYgPSBsYXRlc3RCbG9jay5udW1iZXIgLSBwcmV2aW91c0Jsb2NrLm51bWJlcjsKCiAgY29uc3QgYmxvY2tUaW1lID0gdGltZURpZmYgLyBibG9ja0RpZmY7CiAgcmV0dXJuIGJsb2NrVGltZTsKfQoKYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlQmxvY2tSYW5nZShwcm92aWRlciwgaG91cnMgPSAyNCkgewogIGNvbnN0IGN1cnJlbnRCbG9ja051bWJlciA9IGF3YWl0IGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKTsKICBjb25zdCBibG9ja1RpbWVJblNlY29uZHMgPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpOwogIGNvbnN0IGJsb2Nrc0luVGltZUZyYW1lID0gTWF0aC5mbG9vcigoaG91cnMgKiA2MCAqIDYwKSAvIGJsb2NrVGltZUluU2Vjb25kcyk7CgogIGNvbnN0IGZyb21CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlciAtIGJsb2Nrc0luVGltZUZyYW1lOwogIGNvbnN0IHRvQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXI7CgogIGNvbnNvbGUubG9nKGBDYWxjdWxhdGVkIGJsb2NrIHJhbmdlOiBmcm9tICR7ZnJvbUJsb2NrfSB0byAke3RvQmxvY2t9YCk7CgogIHJldHVybiB7IGZyb21CbG9jaywgdG9CbG9jayB9Owp9Cgphc3luYyBmdW5jdGlvbiBtb25pdG9yVHJhbnNhY3Rpb25zKAogIHByb3ZpZGVyLAogIGNvbnRyYWN0QWRkcmVzcywKICBub3RpZmljYXRpb25DbGllbnQsCiAgaG91cnMsCikgewogIGNvbnN0IHsgZnJvbUJsb2NrLCB0b0Jsb2NrIH0gPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1JhbmdlKHByb3ZpZGVyLCBob3Vycyk7CgogIGNvbnN0IGxvZ3MgPSBhd2FpdCBwcm92aWRlci5nZXRMb2dzKHsKICAgIGZyb21CbG9jaywKICAgIHRvQmxvY2ssCiAgICBhZGRyZXNzOiBjb250cmFjdEFkZHJlc3MsCiAgfSk7CgogIGZvciAoY29uc3QgbG9nIG9mIGxvZ3MpIHsKICAgIGNvbnN0IHR4ID0gYXdhaXQgcHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb24obG9nLnRyYW5zYWN0aW9uSGFzaCk7CgogICAgaWYgKHR4LmRhdGEuc3RhcnRzV2l0aCh2ZXJpZnlQcm9vZlNlbGVjdG9yKSkgewogICAgICBjb25zdCB0eFJlY2VpcHQgPSBhd2FpdCBwcm92aWRlci5nZXRUcmFuc2FjdGlvblJlY2VpcHQoCiAgICAgICAgbG9nLnRyYW5zYWN0aW9uSGFzaCwKICAgICAgKTsKCiAgICAgIGlmICh0eFJlY2VpcHQgJiYgdHhSZWNlaXB0LnN0YXR1cyA9PT0gMCkgewogICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgCiAgICAgICAgICBBIGZhaWxlZCB2ZXJpZnlQcm9vZiB0cmFuc2FjdGlvbiB3YXMgZGV0ZWN0ZWQuCiAgICAgICAgICAtIENvbnRyYWN0IEFkZHJlc3M6ICR7bG9nLmFkZHJlc3N9CiAgICAgICAgICAtIFRyYW5zYWN0aW9uIEhhc2g6ICR7bG9nLnRyYW5zYWN0aW9uSGFzaH0KICAgICAgICAgIC0gQmxvY2sgTnVtYmVyOiAke3R4UmVjZWlwdC5ibG9ja051bWJlcn0KICAgICAgICBgOwogICAgICAgIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IGNvbnRyYWN0QWRkcmVzcyA9ICIweGIwZjMxODZGQzE5NjNmNzc0ZjUyZmY0NTVEQzg2YUVkRDBiMzFGODEiOwoKICBjb25zdCBwcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgYXdhaXQgbW9uaXRvclRyYW5zYWN0aW9ucyhwcm92aWRlciwgY29udHJhY3RBZGRyZXNzLCBub3RpZmljYXRpb25DbGllbnQsIDI0KTsKCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVAKQDUd+QsAAPkLAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAAAfDAAAAAA="},{"autotaskId":"f3e4b61d-acb1-4735-9600-4f78dc407fac","actionId":"f3e4b61d-acb1-4735-9600-4f78dc407fac","name":"TaikoL1: CalldataTxList Count","paused":false,"trigger":{"cron":null,"frequencyMinutes":1440,"type":"schedule"},"codeDigest":"YFe2ZhQm4yRXmMxU51MdCbiCEMWnSNqZJyNxQE6d6BY=","stackResourceId":"mystack.taiko-l-1-calldata-tx-list-count","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVC8yOSKFQ0AABUNAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMiLAogICAgICAgIG5hbWU6ICJ0eExpc3QiLAogICAgICAgIHR5cGU6ICJieXRlcyIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIkNhbGxkYXRhVHhMaXN0IiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfYmxvY2tzIiwKICAgIHN1YmplY3Q6ICLihLnvuI8gVGFpa29MMTogQ2FsbGRhdGFUeExpc3QgQ291bnQiLAogICAgbWVzc2FnZSwKICB9KTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgcmV0dXJuIGN1cnJlbnRCbG9jay5udW1iZXI7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcikgewogIGNvbnN0IGxhdGVzdEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIGNvbnN0IHByZXZpb3VzQmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jayhsYXRlc3RCbG9jay5udW1iZXIgLSAxMDApOwoKICBjb25zdCB0aW1lRGlmZiA9IGxhdGVzdEJsb2NrLnRpbWVzdGFtcCAtIHByZXZpb3VzQmxvY2sudGltZXN0YW1wOwogIGNvbnN0IGJsb2NrRGlmZiA9IGxhdGVzdEJsb2NrLm51bWJlciAtIHByZXZpb3VzQmxvY2subnVtYmVyOwoKICBjb25zdCBibG9ja1RpbWUgPSB0aW1lRGlmZiAvIGJsb2NrRGlmZjsKICByZXR1cm4gYmxvY2tUaW1lOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1JhbmdlKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrTnVtYmVyID0gYXdhaXQgZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpOwogIGNvbnN0IGJsb2NrVGltZUluU2Vjb25kcyA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcik7CiAgY29uc3QgYmxvY2tzSW4yNEhvdXJzID0gTWF0aC5mbG9vcigoMjQgKiA2MCAqIDYwKSAvIGJsb2NrVGltZUluU2Vjb25kcyk7IC8vIDI0IGhvdXJzIGluIHNlY29uZHMKCiAgY29uc3QgZnJvbUJsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyIC0gYmxvY2tzSW4yNEhvdXJzOwogIGNvbnN0IHRvQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXI7CgogIGNvbnNvbGUubG9nKGBDYWxjdWxhdGVkIGJsb2NrIHJhbmdlOiBmcm9tICR7ZnJvbUJsb2NrfSB0byAke3RvQmxvY2t9YCk7CgogIHJldHVybiB7IGZyb21CbG9jaywgdG9CbG9jayB9Owp9Cgphc3luYyBmdW5jdGlvbiBmZXRjaExvZ3NGcm9tTDEoCiAgZXZlbnROYW1lcywKICBmcm9tQmxvY2ssCiAgdG9CbG9jaywKICBhZGRyZXNzLAogIGFiaSwKICBwcm92aWRlciwKKSB7CiAgY29uc3QgaWZhY2UgPSBuZXcgZXRoZXJzLnV0aWxzLkludGVyZmFjZShhYmkpOwogIGNvbnN0IGV2ZW50VG9waWNzID0gZXZlbnROYW1lcy5tYXAoKGV2ZW50TmFtZSkgPT4KICAgIGlmYWNlLmdldEV2ZW50VG9waWMoZXZlbnROYW1lKSwKICApOwoKICBjb25zb2xlLmxvZyhgZXZlbnRUb3BpY3M6ICR7ZXZlbnRUb3BpY3N9YCk7CgogIHRyeSB7CiAgICBjb25zdCBsb2dzID0gYXdhaXQgcHJvdmlkZXIuZ2V0TG9ncyh7CiAgICAgIGFkZHJlc3MsCiAgICAgIGZyb21CbG9jaywKICAgICAgdG9CbG9jaywKICAgICAgdG9waWNzOiBbZXZlbnRUb3BpY3NdLAogICAgfSk7CiAgICBjb25zb2xlLmxvZyhgRmV0Y2hlZCBsb2dzOiAke2xvZ3MubGVuZ3RofWApOwogICAgcmV0dXJuIGxvZ3MubWFwKChsb2cpID0+IHsKICAgICAgY29uc3QgcGFyc2VkTG9nID0gaWZhY2UucGFyc2VMb2cobG9nKTsKICAgICAgY29uc29sZS5sb2coYFBhcnNlZCBsb2c6ICR7SlNPTi5zdHJpbmdpZnkocGFyc2VkTG9nKX1gKTsKICAgICAgcmV0dXJuIHBhcnNlZExvZzsKICAgIH0pOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBjb25zb2xlLmVycm9yKCJFcnJvciBmZXRjaGluZyBMMSBsb2dzOiIsIGVycm9yKTsKICAgIHJldHVybiBbXTsKICB9Cn0KCmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKGFwaUtleSwgYXBpU2VjcmV0LCByZWxheWVyQXBpS2V5LCByZWxheWVyQXBpU2VjcmV0KSB7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IHRhaWtvTDFQcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgY29uc3QgeyBmcm9tQmxvY2ssIHRvQmxvY2sgfSA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrUmFuZ2UodGFpa29MMVByb3ZpZGVyKTsKCiAgY29uc3QgbG9ncyA9IGF3YWl0IGZldGNoTG9nc0Zyb21MMSgKICAgIFsiQ2FsbGRhdGFUeExpc3QiXSwKICAgIGZyb21CbG9jaywKICAgIHRvQmxvY2ssCiAgICAiMHgwNmE5QWIyN2M3ZTIyNTVkZjE4MTVFNkNDMDE2OGQ3NzU1RmViMTlhIiwKICAgIEFCSSwKICAgIHRhaWtvTDFQcm92aWRlciwKICApOwoKICBpZiAobG9ncy5sZW5ndGggPiAwKSB7CiAgICBhbGVydE9yZygKICAgICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgICBgRGV0ZWN0ZWQgJHtsb2dzLmxlbmd0aH0gQ2FsbGRhdGFUeExpc3QgZXZlbnRzIGluIHRoZSBsYXN0IDI0IGhvdXJzIG9uIFRhaWtvTDEhYCwKICAgICk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBULzI5IoVDQAAFQ0AAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAADsNAAAAAA=="},{"autotaskId":"4dba76e1-18d4-4757-b8d3-4d3a8e866625","actionId":"4dba76e1-18d4-4757-b8d3-4d3a8e866625","name":"GuardianProver: ProvingAutoPauseEnabled Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"lTr+Hs0WWoe7JBOzEADRpJuTIzc2cvRze6fHvaX5zxE=","stackResourceId":"mystack.guardian-prover-proving-auto-pause-enabled-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVCluHKrdgwAAHYMAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJib29sIiwKICAgICAgICBuYW1lOiAiZW5hYmxlZCIsCiAgICAgICAgdHlwZTogImJvb2wiLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJQcm92aW5nQXV0b1BhdXNlRW5hYmxlZCIsCiAgICB0eXBlOiAiZXZlbnQiLAogIH0sCl07CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2NvbmZpZ3MiLAogICAgc3ViamVjdDogIuKaoO+4jyBHdWFyZGlhblByb3ZlcjogUHJvdmluZ0F1dG9QYXVzZUVuYWJsZWQgQWxlcnQiLAogICAgbWVzc2FnZSwKICB9KTsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJ0Z190YWlrb19ndWFyZGlhbnMiLAogICAgc3ViamVjdDogIuKaoO+4jyBHdWFyZGlhblByb3ZlcjogUHJvdmluZ0F1dG9QYXVzZUVuYWJsZWQgQWxlcnQiLAogICAgbWVzc2FnZSwKICB9KTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgcmV0dXJuIGN1cnJlbnRCbG9jay5udW1iZXI7Cn0KCmFzeW5jIGZ1bmN0aW9uIGZldGNoTG9nc0Zyb21MMSgKICBldmVudE5hbWUsCiAgZnJvbUJsb2NrLAogIHRvQmxvY2ssCiAgYWRkcmVzcywKICBhYmksCiAgcHJvdmlkZXIsCikgewogIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoYWJpKTsKICBjb25zdCBldmVudFRvcGljID0gaWZhY2UuZ2V0RXZlbnRUb3BpYyhldmVudE5hbWUpOwoKICB0cnkgewogICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICBhZGRyZXNzLAogICAgICBmcm9tQmxvY2ssCiAgICAgIHRvQmxvY2ssCiAgICAgIHRvcGljczogW2V2ZW50VG9waWNdLAogICAgfSk7CgogICAgcmV0dXJuIGxvZ3MubWFwKChsb2cpID0+CiAgICAgIGlmYWNlLmRlY29kZUV2ZW50TG9nKGV2ZW50TmFtZSwgbG9nLmRhdGEsIGxvZy50b3BpY3MpLAogICAgKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5lcnJvcihgRXJyb3IgZmV0Y2hpbmcgbG9ncyBmb3IgJHtldmVudE5hbWV9OmAsIGVycm9yKTsKICAgIHJldHVybiBbXTsKICB9Cn0KCmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKGFwaUtleSwgYXBpU2VjcmV0LCByZWxheWVyQXBpS2V5LCByZWxheWVyQXBpU2VjcmV0KSB7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcikgewogIGNvbnN0IGxhdGVzdEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIGNvbnN0IHByZXZpb3VzQmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jayhsYXRlc3RCbG9jay5udW1iZXIgLSAxMDApOwoKICBjb25zdCB0aW1lRGlmZiA9IGxhdGVzdEJsb2NrLnRpbWVzdGFtcCAtIHByZXZpb3VzQmxvY2sudGltZXN0YW1wOwogIGNvbnN0IGJsb2NrRGlmZiA9IGxhdGVzdEJsb2NrLm51bWJlciAtIHByZXZpb3VzQmxvY2subnVtYmVyOwoKICBjb25zdCBibG9ja1RpbWUgPSB0aW1lRGlmZiAvIGJsb2NrRGlmZjsKICByZXR1cm4gYmxvY2tUaW1lOwp9CgpleHBvcnRzLmhhbmRsZXIgPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQsIGNvbnRleHQpIHsKICBjb25zdCB7IG5vdGlmaWNhdGlvbkNsaWVudCB9ID0gY29udGV4dDsKICBjb25zdCB7IGFwaUtleSwgYXBpU2VjcmV0LCB0YWlrb0wxQXBpS2V5LCB0YWlrb0wxQXBpU2VjcmV0IH0gPSBldmVudC5zZWNyZXRzOwoKICBjb25zdCB0YWlrb0wxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGN1cnJlbnRCbG9ja051bWJlciA9IGF3YWl0IGdldExhdGVzdEJsb2NrTnVtYmVyKHRhaWtvTDFQcm92aWRlcik7CiAgY29uc3QgYmxvY2tUaW1lSW5TZWNvbmRzID0gYXdhaXQgY2FsY3VsYXRlQmxvY2tUaW1lKHRhaWtvTDFQcm92aWRlcik7CiAgY29uc3QgYmxvY2tzSW5GaXZlTWludXRlcyA9IE1hdGguZmxvb3IoKDUgKiA2MCkgLyBibG9ja1RpbWVJblNlY29uZHMpOwoKICBjb25zdCBmcm9tQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXIgLSBibG9ja3NJbkZpdmVNaW51dGVzOwogIGNvbnN0IHRvQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXI7CgogIGNvbnN0IGxvZ3MgPSBhd2FpdCBmZXRjaExvZ3NGcm9tTDEoCiAgICAiUHJvdmluZ0F1dG9QYXVzZUVuYWJsZWQiLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweEUzRDc3NzE0M0VhMjVBNkUwMzFkMWU5MjFGMzk2NzUwODg1ZjQzYUMiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGNvbnNvbGUubG9nKGBMb2dzIGZvdW5kOiAke2xvZ3MubGVuZ3RofWApOwoKICBpZiAobG9ncy5sZW5ndGggPiAwKSB7CiAgICBsb2dzLmZvckVhY2goKGxvZykgPT4gewogICAgICBjb25zdCBlbmFibGVkID0gbG9nLmVuYWJsZWQ7CiAgICAgIGNvbnN0IHN0YXR1cyA9IGVuYWJsZWQgPyAiRU5BQkxFRCIgOiAiRElTQUJMRUQiOwogICAgICBjb25zdCBtZXNzYWdlID0gYFByb3ZpbmcgQXV0by1QYXVzZSBoYXMgYmVlbiAke3N0YXR1c30uXG5cbkRldGFpbHM6XG4tIEVuYWJsZWQ6ICR7ZW5hYmxlZH1cbi0gQmxvY2sgTnVtYmVyOiAke2xvZy5ibG9ja051bWJlcn1gOwogICAgICBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIG1lc3NhZ2UpOwogICAgfSk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBUKW4cqt2DAAAdgwAAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAAJwMAAAAAA=="},{"autotaskId":"a91ec566-0083-40bc-9caf-9f006bb4ec12","actionId":"a91ec566-0083-40bc-9caf-9f006bb4ec12","name":"GuardianProver: ConflictingProofs Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"L3HJRJGQ2LLkEO+6zCIg5yh4GpFNvfNl/ZR4bft2EDU=","stackResourceId":"mystack.guardian-prover-conflicting-proofs-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVDcZineqA0AAKgNAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAiZ3VhcmRpYW4iLAogICAgICAgIHR5cGU6ICJhZGRyZXNzIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgIG5hbWU6ICJjdXJyZW50UHJvb2ZIYXNoIiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAibmV3UHJvb2ZIYXNoIiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJib29sIiwKICAgICAgICBuYW1lOiAicHJvdmluZ1BhdXNlZCIsCiAgICAgICAgdHlwZTogImJvb2wiLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJDb25mbGljdGluZ1Byb29mcyIsCiAgICB0eXBlOiAiZXZlbnQiLAogIH0sCl07CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2NvbmZpZ3MiLAogICAgc3ViamVjdDogIvCfmqggR3VhcmRpYW5Qcm92ZXI6IENvbmZsaWN0aW5nUHJvb2ZzIEFsZXJ0IiwKICAgIG1lc3NhZ2UsCiAgfSk7CgogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogInRnX3RhaWtvX2d1YXJkaWFucyIsCiAgICBzdWJqZWN0OiAi8J+aqCBHdWFyZGlhblByb3ZlcjogQ29uZmxpY3RpbmdQcm9vZnMgQWxlcnQiLAogICAgbWVzc2FnZSwKICB9KTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgcmV0dXJuIGN1cnJlbnRCbG9jay5udW1iZXI7Cn0KCmFzeW5jIGZ1bmN0aW9uIGZldGNoTG9nc0Zyb21MMSgKICBldmVudE5hbWUsCiAgZnJvbUJsb2NrLAogIHRvQmxvY2ssCiAgYWRkcmVzcywKICBhYmksCiAgcHJvdmlkZXIsCikgewogIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoYWJpKTsKICBjb25zdCBldmVudFRvcGljID0gaWZhY2UuZ2V0RXZlbnRUb3BpYyhldmVudE5hbWUpOwoKICB0cnkgewogICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICBhZGRyZXNzLAogICAgICBmcm9tQmxvY2ssCiAgICAgIHRvQmxvY2ssCiAgICAgIHRvcGljczogW2V2ZW50VG9waWNdLAogICAgfSk7CgogICAgcmV0dXJuIGxvZ3MubWFwKChsb2cpID0+CiAgICAgIGlmYWNlLmRlY29kZUV2ZW50TG9nKGV2ZW50TmFtZSwgbG9nLmRhdGEsIGxvZy50b3BpY3MpLAogICAgKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5lcnJvcihgRXJyb3IgZmV0Y2hpbmcgbG9ncyBmb3IgJHtldmVudE5hbWV9OmAsIGVycm9yKTsKICAgIHJldHVybiBbXTsKICB9Cn0KCmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKGFwaUtleSwgYXBpU2VjcmV0LCByZWxheWVyQXBpS2V5LCByZWxheWVyQXBpU2VjcmV0KSB7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcikgewogIGNvbnN0IGxhdGVzdEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIGNvbnN0IHByZXZpb3VzQmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jayhsYXRlc3RCbG9jay5udW1iZXIgLSAxMDApOwoKICBjb25zdCB0aW1lRGlmZiA9IGxhdGVzdEJsb2NrLnRpbWVzdGFtcCAtIHByZXZpb3VzQmxvY2sudGltZXN0YW1wOwogIGNvbnN0IGJsb2NrRGlmZiA9IGxhdGVzdEJsb2NrLm51bWJlciAtIHByZXZpb3VzQmxvY2subnVtYmVyOwoKICBjb25zdCBibG9ja1RpbWUgPSB0aW1lRGlmZiAvIGJsb2NrRGlmZjsKICByZXR1cm4gYmxvY2tUaW1lOwp9CgpleHBvcnRzLmhhbmRsZXIgPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQsIGNvbnRleHQpIHsKICBjb25zdCB7IG5vdGlmaWNhdGlvbkNsaWVudCB9ID0gY29udGV4dDsKICBjb25zdCB7IGFwaUtleSwgYXBpU2VjcmV0LCB0YWlrb0wxQXBpS2V5LCB0YWlrb0wxQXBpU2VjcmV0IH0gPSBldmVudC5zZWNyZXRzOwoKICBjb25zdCB0YWlrb0wxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGN1cnJlbnRCbG9ja051bWJlciA9IGF3YWl0IGdldExhdGVzdEJsb2NrTnVtYmVyKHRhaWtvTDFQcm92aWRlcik7CiAgY29uc3QgYmxvY2tUaW1lSW5TZWNvbmRzID0gYXdhaXQgY2FsY3VsYXRlQmxvY2tUaW1lKHRhaWtvTDFQcm92aWRlcik7CiAgY29uc3QgYmxvY2tzSW5GaXZlTWludXRlcyA9IE1hdGguZmxvb3IoKDUgKiA2MCkgLyBibG9ja1RpbWVJblNlY29uZHMpOwoKICBjb25zdCBmcm9tQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXIgLSBibG9ja3NJbkZpdmVNaW51dGVzOwogIGNvbnN0IHRvQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXI7CgogIGNvbnN0IGxvZ3MgPSBhd2FpdCBmZXRjaExvZ3NGcm9tTDEoCiAgICAiQ29uZmxpY3RpbmdQcm9vZnMiLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweEUzRDc3NzE0M0VhMjVBNkUwMzFkMWU5MjFGMzk2NzUwODg1ZjQzYUMiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGNvbnNvbGUubG9nKGBMb2dzIGZvdW5kOiAke2xvZ3MubGVuZ3RofWApOwoKICBpZiAobG9ncy5sZW5ndGggPiAwKSB7CiAgICBhbGVydE9yZygKICAgICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgICBgQ29uZmxpY3RpbmdQcm9vZnMgZXZlbnQgZGV0ZWN0ZWQhIERldGFpbHM6ICR7SlNPTi5zdHJpbmdpZnkobG9ncyl9YCwKICAgICk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBUNxmKd6oDQAAqA0AAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAAM4NAAAAAA=="},{"autotaskId":"9c132973-b8dc-4406-895c-a4ba343455cf","actionId":"9c132973-b8dc-4406-895c-a4ba343455cf","name":"GuardianProver: Approved Count","paused":false,"trigger":{"cron":null,"frequencyMinutes":15,"type":"schedule"},"codeDigest":"IgyqIUQKGTxW+magdh/AJeYpV0Z95FCzB2cNsfhTCvU=","stackResourceId":"mystack.guardian-prover-approved-count","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVAnSx6hWg0AAFoNAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAib3BlcmF0aW9uSWQiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQyNTYiLAogICAgICAgIG5hbWU6ICJhcHByb3ZhbEJpdHMiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogImJvb2wiLAogICAgICAgIG5hbWU6ICJtaW5HdWFyZGlhbnNSZWFjaGVkIiwKICAgICAgICB0eXBlOiAiYm9vbCIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIkFwcHJvdmVkIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfY29uZmlncyIsCiAgICBzdWJqZWN0OiAi4pqg77iPIEd1YXJkaWFuUHJvdmVyOiBBcHByb3ZlZCBDb3VudCIsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RCbG9ja051bWJlcihwcm92aWRlcikgewogIGNvbnN0IGN1cnJlbnRCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICByZXR1cm4gY3VycmVudEJsb2NrLm51bWJlcjsKfQoKYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlQmxvY2tUaW1lKHByb3ZpZGVyKSB7CiAgY29uc3QgbGF0ZXN0QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgY29uc3QgcHJldmlvdXNCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKGxhdGVzdEJsb2NrLm51bWJlciAtIDEwMCk7CgogIGNvbnN0IHRpbWVEaWZmID0gbGF0ZXN0QmxvY2sudGltZXN0YW1wIC0gcHJldmlvdXNCbG9jay50aW1lc3RhbXA7CiAgY29uc3QgYmxvY2tEaWZmID0gbGF0ZXN0QmxvY2subnVtYmVyIC0gcHJldmlvdXNCbG9jay5udW1iZXI7CgogIGNvbnN0IGJsb2NrVGltZSA9IHRpbWVEaWZmIC8gYmxvY2tEaWZmOwogIHJldHVybiBibG9ja1RpbWU7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUJsb2NrUmFuZ2UocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2tOdW1iZXIgPSBhd2FpdCBnZXRMYXRlc3RCbG9ja051bWJlcihwcm92aWRlcik7CiAgY29uc3QgYmxvY2tUaW1lSW5TZWNvbmRzID0gYXdhaXQgY2FsY3VsYXRlQmxvY2tUaW1lKHByb3ZpZGVyKTsKICBjb25zdCBibG9ja3NJbk9uZUhvdXIgPSBNYXRoLmZsb29yKCgxNiAqIDYwKSAvIGJsb2NrVGltZUluU2Vjb25kcyk7CgogIGNvbnN0IGZyb21CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlciAtIGJsb2Nrc0luT25lSG91cjsKICBjb25zdCB0b0Jsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyOwoKICBjb25zb2xlLmxvZyhgQ2FsY3VsYXRlZCBibG9jayByYW5nZTogZnJvbSAke2Zyb21CbG9ja30gdG8gJHt0b0Jsb2NrfWApOwoKICByZXR1cm4geyBmcm9tQmxvY2ssIHRvQmxvY2sgfTsKfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hMb2dzRnJvbUwxKAogIGV2ZW50TmFtZSwKICBmcm9tQmxvY2ssCiAgdG9CbG9jaywKICBhZGRyZXNzLAogIGFiaSwKICBwcm92aWRlciwKKSB7CiAgY29uc3QgaWZhY2UgPSBuZXcgZXRoZXJzLnV0aWxzLkludGVyZmFjZShhYmkpOwogIGNvbnN0IGV2ZW50VG9waWMgPSBpZmFjZS5nZXRFdmVudFRvcGljKGV2ZW50TmFtZSk7CiAgY29uc29sZS5sb2coYGV2ZW50VG9waWM6ICR7ZXZlbnRUb3BpY31gKTsKICB0cnkgewogICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICBhZGRyZXNzLAogICAgICBmcm9tQmxvY2ssCiAgICAgIHRvQmxvY2ssCiAgICAgIHRvcGljczogW2V2ZW50VG9waWNdLAogICAgfSk7CiAgICBjb25zb2xlLmxvZyhgRmV0Y2hlZCBsb2dzOiAke2xvZ3MubGVuZ3RofWApOwogICAgcmV0dXJuIGxvZ3MubWFwKChsb2cpID0+IHsKICAgICAgY29uc3QgcGFyc2VkTG9nID0gaWZhY2UucGFyc2VMb2cobG9nKTsKICAgICAgY29uc29sZS5sb2coYFBhcnNlZCBsb2c6ICR7SlNPTi5zdHJpbmdpZnkocGFyc2VkTG9nKX1gKTsKICAgICAgcmV0dXJuIHBhcnNlZExvZzsKICAgIH0pOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBjb25zb2xlLmVycm9yKCJFcnJvciBmZXRjaGluZyBMMSBsb2dzOiIsIGVycm9yKTsKICAgIHJldHVybiBbXTsKICB9Cn0KCmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKGFwaUtleSwgYXBpU2VjcmV0LCByZWxheWVyQXBpS2V5LCByZWxheWVyQXBpU2VjcmV0KSB7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IHRhaWtvTDFQcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgY29uc3QgeyBmcm9tQmxvY2ssIHRvQmxvY2sgfSA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrUmFuZ2UodGFpa29MMVByb3ZpZGVyKTsKCiAgY29uc3QgbG9ncyA9IGF3YWl0IGZldGNoTG9nc0Zyb21MMSgKICAgICJBcHByb3ZlZCIsCiAgICBmcm9tQmxvY2ssCiAgICB0b0Jsb2NrLAogICAgIjB4RTNENzc3MTQzRWEyNUE2RTAzMWQxZTkyMUYzOTY3NTA4ODVmNDNhQyIsCiAgICBBQkksCiAgICB0YWlrb0wxUHJvdmlkZXIsCiAgKTsKCiAgaWYgKGxvZ3MubGVuZ3RoID4gMCkgewogICAgYWxlcnRPcmcoCiAgICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgICAgYEB0YWlrb3xndWFyZGlhbnMgRGV0ZWN0ZWQgJHtsb2dzLmxlbmd0aH0gQXBwcm92ZWQgZXZlbnRzIGluIHRoZSBsYXN0IDE1IG1pbnMgb24gR3VhcmRpYW4hYCwKICAgICk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBUCdLHqFaDQAAWg0AAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAAIANAAAAAA=="},{"autotaskId":"5b216422-4a62-4c2c-8242-330fa74d6ef1","actionId":"5b216422-4a62-4c2c-8242-330fa74d6ef1","name":"GuardianProver: GuardiansUpdated Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"QDrbaB7HNvmMz0Yuifimr0hi+RP7kKbQKyOST8c2FZg=","stackResourceId":"mystack.guardian-prover-guardians-updated-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVCTA5CyKgwAACoMAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDMyIiwKICAgICAgICBuYW1lOiAidmVyc2lvbiIsCiAgICAgICAgdHlwZTogInVpbnQzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzW10iLAogICAgICAgIG5hbWU6ICJndWFyZGlhbnMiLAogICAgICAgIHR5cGU6ICJhZGRyZXNzW10iLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJHdWFyZGlhbnNVcGRhdGVkIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfY29uZmlncyIsCiAgICBzdWJqZWN0OiAi4pqg77iPIEd1YXJkaWFuUHJvdmVyOiBHdWFyZGlhbnNVcGRhdGVkIEFsZXJ0IiwKICAgIG1lc3NhZ2UsCiAgfSk7CgogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogInRnX3RhaWtvX2d1YXJkaWFucyIsCiAgICBzdWJqZWN0OiAi4pqg77iPIEd1YXJkaWFuUHJvdmVyOiBHdWFyZGlhbnNVcGRhdGVkIEFsZXJ0IiwKICAgIG1lc3NhZ2UsCiAgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIHJldHVybiBjdXJyZW50QmxvY2subnVtYmVyOwp9Cgphc3luYyBmdW5jdGlvbiBmZXRjaExvZ3NGcm9tTDEoCiAgZXZlbnROYW1lLAogIGZyb21CbG9jaywKICB0b0Jsb2NrLAogIGFkZHJlc3MsCiAgYWJpLAogIHByb3ZpZGVyLAopIHsKICBjb25zdCBpZmFjZSA9IG5ldyBldGhlcnMudXRpbHMuSW50ZXJmYWNlKGFiaSk7CiAgY29uc3QgZXZlbnRUb3BpYyA9IGlmYWNlLmdldEV2ZW50VG9waWMoZXZlbnROYW1lKTsKCiAgdHJ5IHsKICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCBwcm92aWRlci5nZXRMb2dzKHsKICAgICAgYWRkcmVzcywKICAgICAgZnJvbUJsb2NrLAogICAgICB0b0Jsb2NrLAogICAgICB0b3BpY3M6IFtldmVudFRvcGljXSwKICAgIH0pOwoKICAgIHJldHVybiBsb2dzLm1hcCgobG9nKSA9PgogICAgICBpZmFjZS5kZWNvZGVFdmVudExvZyhldmVudE5hbWUsIGxvZy5kYXRhLCBsb2cudG9waWNzKSwKICAgICk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGZldGNoaW5nIGxvZ3MgZm9yICR7ZXZlbnROYW1lfTpgLCBlcnJvcik7CiAgICByZXR1cm4gW107CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnN0IGNsaWVudCA9IG5ldyBEZWZlbmRlcih7CiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICByZWxheWVyQXBpS2V5LAogICAgcmVsYXllckFwaVNlY3JldCwKICB9KTsKCiAgcmV0dXJuIGNsaWVudC5yZWxheVNpZ25lci5nZXRQcm92aWRlcigpOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpIHsKICBjb25zdCBsYXRlc3RCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICBjb25zdCBwcmV2aW91c0Jsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2sobGF0ZXN0QmxvY2subnVtYmVyIC0gMTAwKTsKCiAgY29uc3QgdGltZURpZmYgPSBsYXRlc3RCbG9jay50aW1lc3RhbXAgLSBwcmV2aW91c0Jsb2NrLnRpbWVzdGFtcDsKICBjb25zdCBibG9ja0RpZmYgPSBsYXRlc3RCbG9jay5udW1iZXIgLSBwcmV2aW91c0Jsb2NrLm51bWJlcjsKCiAgY29uc3QgYmxvY2tUaW1lID0gdGltZURpZmYgLyBibG9ja0RpZmY7CiAgcmV0dXJuIGJsb2NrVGltZTsKfQoKZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgZnVuY3Rpb24gKGV2ZW50LCBjb250ZXh0KSB7CiAgY29uc3QgeyBub3RpZmljYXRpb25DbGllbnQgfSA9IGNvbnRleHQ7CiAgY29uc3QgeyBhcGlLZXksIGFwaVNlY3JldCwgdGFpa29MMUFwaUtleSwgdGFpa29MMUFwaVNlY3JldCB9ID0gZXZlbnQuc2VjcmV0czsKCiAgY29uc3QgdGFpa29MMVByb3ZpZGVyID0gY3JlYXRlUHJvdmlkZXIoCiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICB0YWlrb0wxQXBpS2V5LAogICAgdGFpa29MMUFwaVNlY3JldCwKICApOwoKICBjb25zdCBjdXJyZW50QmxvY2tOdW1iZXIgPSBhd2FpdCBnZXRMYXRlc3RCbG9ja051bWJlcih0YWlrb0wxUHJvdmlkZXIpOwogIGNvbnN0IGJsb2NrVGltZUluU2Vjb25kcyA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrVGltZSh0YWlrb0wxUHJvdmlkZXIpOwogIGNvbnN0IGJsb2Nrc0luRml2ZU1pbnV0ZXMgPSBNYXRoLmZsb29yKCg1ICogNjApIC8gYmxvY2tUaW1lSW5TZWNvbmRzKTsKCiAgY29uc3QgZnJvbUJsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyIC0gYmxvY2tzSW5GaXZlTWludXRlczsKICBjb25zdCB0b0Jsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyOwoKICBjb25zdCBsb2dzID0gYXdhaXQgZmV0Y2hMb2dzRnJvbUwxKAogICAgIkd1YXJkaWFuc1VwZGF0ZWQiLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweEUzRDc3NzE0M0VhMjVBNkUwMzFkMWU5MjFGMzk2NzUwODg1ZjQzYUMiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGNvbnNvbGUubG9nKGBMb2dzIGZvdW5kOiAke2xvZ3MubGVuZ3RofWApOwoKICBpZiAobG9ncy5sZW5ndGggPiAwKSB7CiAgICBhbGVydE9yZygKICAgICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgICBgR3VhcmRpYW5zVXBkYXRlZCBldmVudCBkZXRlY3RlZCEgRGV0YWlsczogJHtKU09OLnN0cmluZ2lmeShsb2dzKX1gLAogICAgKTsKICB9CgogIHJldHVybiB0cnVlOwp9OwpQSwECFAAKAAAAAAAAAEFQkwOQsioMAAAqDAAACAAAAAAAAAAAAAAAAAAAAAAAaW5kZXguanNQSwUGAAAAAAEAAQA2AAAAUAwAAAAA"},{"autotaskId":"f219a32c-98db-4c46-bbb4-dc279e65d128","actionId":"f219a32c-98db-4c46-bbb4-dc279e65d128","name":"TaikoL1: ProvingPaused Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"YNbpcd3g7dWyoKmrpCa8jkF3st/mY1uhaVd8RNpjwn0=","stackResourceId":"mystack.taiko-l-1-proving-paused-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVAU+JyO+goAAPoKAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAiYm9vbCIsCiAgICAgICAgbmFtZTogInBhdXNlZCIsCiAgICAgICAgdHlwZTogImJvb2wiLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJQcm92aW5nUGF1c2VkIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfY29uZmlncyIsCiAgICBzdWJqZWN0OiAi4pqg77iPIFRhaWtvTDE6IFByb3ZpbmdQYXVzZWQgQWxlcnQiLAogICAgbWVzc2FnZSwKICB9KTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgcmV0dXJuIGN1cnJlbnRCbG9jay5udW1iZXI7Cn0KCmFzeW5jIGZ1bmN0aW9uIGZldGNoTG9nc0Zyb21MMSgKICBldmVudE5hbWUsCiAgZnJvbUJsb2NrLAogIHRvQmxvY2ssCiAgYWRkcmVzcywKICBhYmksCiAgcHJvdmlkZXIsCikgewogIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoYWJpKTsKICBjb25zdCBldmVudFRvcGljID0gaWZhY2UuZ2V0RXZlbnRUb3BpYyhldmVudE5hbWUpOwoKICB0cnkgewogICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICBhZGRyZXNzLAogICAgICBmcm9tQmxvY2ssCiAgICAgIHRvQmxvY2ssCiAgICAgIHRvcGljczogW2V2ZW50VG9waWNdLAogICAgfSk7CgogICAgcmV0dXJuIGxvZ3MubWFwKChsb2cpID0+CiAgICAgIGlmYWNlLmRlY29kZUV2ZW50TG9nKGV2ZW50TmFtZSwgbG9nLmRhdGEsIGxvZy50b3BpY3MpLAogICAgKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5lcnJvcihgRXJyb3IgZmV0Y2hpbmcgbG9ncyBmb3IgJHtldmVudE5hbWV9OmAsIGVycm9yKTsKICAgIHJldHVybiBbXTsKICB9Cn0KCmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKGFwaUtleSwgYXBpU2VjcmV0LCByZWxheWVyQXBpS2V5LCByZWxheWVyQXBpU2VjcmV0KSB7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcikgewogIGNvbnN0IGxhdGVzdEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIGNvbnN0IHByZXZpb3VzQmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jayhsYXRlc3RCbG9jay5udW1iZXIgLSAxMDApOwoKICBjb25zdCB0aW1lRGlmZiA9IGxhdGVzdEJsb2NrLnRpbWVzdGFtcCAtIHByZXZpb3VzQmxvY2sudGltZXN0YW1wOwogIGNvbnN0IGJsb2NrRGlmZiA9IGxhdGVzdEJsb2NrLm51bWJlciAtIHByZXZpb3VzQmxvY2subnVtYmVyOwoKICBjb25zdCBibG9ja1RpbWUgPSB0aW1lRGlmZiAvIGJsb2NrRGlmZjsKICByZXR1cm4gYmxvY2tUaW1lOwp9CgpleHBvcnRzLmhhbmRsZXIgPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQsIGNvbnRleHQpIHsKICBjb25zdCB7IG5vdGlmaWNhdGlvbkNsaWVudCB9ID0gY29udGV4dDsKICBjb25zdCB7IGFwaUtleSwgYXBpU2VjcmV0LCB0YWlrb0wxQXBpS2V5LCB0YWlrb0wxQXBpU2VjcmV0IH0gPSBldmVudC5zZWNyZXRzOwoKICBjb25zdCB0YWlrb0wxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGN1cnJlbnRCbG9ja051bWJlciA9IGF3YWl0IGdldExhdGVzdEJsb2NrTnVtYmVyKHRhaWtvTDFQcm92aWRlcik7CiAgY29uc3QgYmxvY2tUaW1lSW5TZWNvbmRzID0gYXdhaXQgY2FsY3VsYXRlQmxvY2tUaW1lKHRhaWtvTDFQcm92aWRlcik7CiAgY29uc3QgYmxvY2tzSW5GaXZlTWludXRlcyA9IE1hdGguZmxvb3IoKDUgKiA2MCkgLyBibG9ja1RpbWVJblNlY29uZHMpOwoKICBjb25zdCBmcm9tQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXIgLSBibG9ja3NJbkZpdmVNaW51dGVzOwogIGNvbnN0IHRvQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXI7CgogIGNvbnN0IGxvZ3MgPSBhd2FpdCBmZXRjaExvZ3NGcm9tTDEoCiAgICAiUHJvdmluZ1BhdXNlZCIsCiAgICBmcm9tQmxvY2ssCiAgICB0b0Jsb2NrLAogICAgIjB4MDZhOUFiMjdjN2UyMjU1ZGYxODE1RTZDQzAxNjhkNzc1NUZlYjE5YSIsCiAgICBBQkksCiAgICB0YWlrb0wxUHJvdmlkZXIsCiAgKTsKCiAgY29uc29sZS5sb2coYExvZ3MgZm91bmQ6ICR7bG9ncy5sZW5ndGh9YCk7CgogIGlmIChsb2dzLmxlbmd0aCA+IDApIHsKICAgIGFsZXJ0T3JnKAogICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgIGBQcm92aW5nUGF1c2VkIGV2ZW50IGRldGVjdGVkISBEZXRhaWxzOiAke0pTT04uc3RyaW5naWZ5KGxvZ3MpfWAsCiAgICApOwogIH0KCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVAU+JyO+goAAPoKAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAAAgCwAAAAA="},{"autotaskId":"c79df8d7-deb4-45ea-ad3d-b808bf371405","actionId":"c79df8d7-deb4-45ea-ad3d-b808bf371405","name":"TaikoL1: TransitionContested Count","paused":false,"trigger":{"cron":null,"frequencyMinutes":60,"type":"schedule"},"codeDigest":"mp4o1olYw/ttX2O4d2ALDBqJeYOTaUFo67hiPxmMcmo=","stackResourceId":"mystack.taiko-l-1-transition-contested-count","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-05","encodedZippedCode":"UEsDBAoAAAAAAAAAQVA/+iecuBUAALgVAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgY29tcG9uZW50czogWwogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogInBhcmVudEhhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImJsb2NrSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAic3RhdGVSb290IiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJncmFmZml0aSIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJzdHJ1Y3QgVGFpa29EYXRhLlRyYW5zaXRpb24iLAogICAgICAgIG5hbWU6ICJ0cmFuIiwKICAgICAgICB0eXBlOiAidHVwbGUiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgbmFtZTogImNvbnRlc3RlciIsCiAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDk2IiwKICAgICAgICBuYW1lOiAiY29udGVzdEJvbmQiLAogICAgICAgIHR5cGU6ICJ1aW50OTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDE2IiwKICAgICAgICBuYW1lOiAidGllciIsCiAgICAgICAgdHlwZTogInVpbnQxNiIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIlRyYW5zaXRpb25Db250ZXN0ZWQiLAogICAgdHlwZTogImV2ZW50IiwKICB9LAogIHsKICAgIGFub255bW91czogZmFsc2UsCiAgICBpbnB1dHM6IFsKICAgICAgewogICAgICAgIGluZGV4ZWQ6IHRydWUsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDI1NiIsCiAgICAgICAgbmFtZTogImJsb2NrSWQiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGNvbXBvbmVudHM6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJwYXJlbnRIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJibG9ja0hhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogInN0YXRlUm9vdCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZ3JhZmZpdGkiLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAic3RydWN0IFRhaWtvRGF0YS5UcmFuc2l0aW9uIiwKICAgICAgICBuYW1lOiAidHJhbiIsCiAgICAgICAgdHlwZTogInR1cGxlIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogImFkZHJlc3MiLAogICAgICAgIG5hbWU6ICJjb250ZXN0ZXIiLAogICAgICAgIHR5cGU6ICJhZGRyZXNzIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQ5NiIsCiAgICAgICAgbmFtZTogImNvbnRlc3RCb25kIiwKICAgICAgICB0eXBlOiAidWludDk2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQxNiIsCiAgICAgICAgbmFtZTogInRpZXIiLAogICAgICAgIHR5cGU6ICJ1aW50MTYiLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJUcmFuc2l0aW9uQ29udGVzdGVkVjIiLAogICAgdHlwZTogImV2ZW50IiwKICB9LApdOwoKZnVuY3Rpb24gYWxlcnRPcmcobm90aWZpY2F0aW9uQ2xpZW50LCBtZXNzYWdlKSB7CiAgbm90aWZpY2F0aW9uQ2xpZW50LnNlbmQoewogICAgY2hhbm5lbEFsaWFzOiAiZGlzY29yZF9ibG9ja3MiLAogICAgc3ViamVjdDogIuKEue+4jyBUYWlrb0wxOiBUcmFuc2l0aW9uQ29udGVzdGVkIENvdW50IiwKICAgIG1lc3NhZ2UsCiAgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIHJldHVybiBjdXJyZW50QmxvY2subnVtYmVyOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpIHsKICBjb25zdCBsYXRlc3RCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICBjb25zdCBwcmV2aW91c0Jsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2sobGF0ZXN0QmxvY2subnVtYmVyIC0gMTAwKTsKCiAgY29uc3QgdGltZURpZmYgPSBsYXRlc3RCbG9jay50aW1lc3RhbXAgLSBwcmV2aW91c0Jsb2NrLnRpbWVzdGFtcDsKICBjb25zdCBibG9ja0RpZmYgPSBsYXRlc3RCbG9jay5udW1iZXIgLSBwcmV2aW91c0Jsb2NrLm51bWJlcjsKCiAgY29uc3QgYmxvY2tUaW1lID0gdGltZURpZmYgLyBibG9ja0RpZmY7CiAgcmV0dXJuIGJsb2NrVGltZTsKfQoKYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlQmxvY2tSYW5nZShwcm92aWRlcikgewogIGNvbnN0IGN1cnJlbnRCbG9ja051bWJlciA9IGF3YWl0IGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKTsKICBjb25zdCBibG9ja1RpbWVJblNlY29uZHMgPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpOwogIGNvbnN0IGJsb2Nrc0luT25lSG91ciA9IE1hdGguZmxvb3IoKDYwICogNjApIC8gYmxvY2tUaW1lSW5TZWNvbmRzKTsKCiAgY29uc3QgZnJvbUJsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyIC0gYmxvY2tzSW5PbmVIb3VyOwogIGNvbnN0IHRvQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXI7CgogIGNvbnNvbGUubG9nKGBDYWxjdWxhdGVkIGJsb2NrIHJhbmdlOiBmcm9tICR7ZnJvbUJsb2NrfSB0byAke3RvQmxvY2t9YCk7CgogIHJldHVybiB7IGZyb21CbG9jaywgdG9CbG9jayB9Owp9Cgphc3luYyBmdW5jdGlvbiBmZXRjaExvZ3NGcm9tTDEoCiAgZXZlbnROYW1lcywKICBmcm9tQmxvY2ssCiAgdG9CbG9jaywKICBhZGRyZXNzLAogIGFiaSwKICBwcm92aWRlciwKKSB7CiAgY29uc3QgaWZhY2UgPSBuZXcgZXRoZXJzLnV0aWxzLkludGVyZmFjZShhYmkpOwogIGNvbnN0IGV2ZW50VG9waWNzID0gZXZlbnROYW1lcy5tYXAoKGV2ZW50TmFtZSkgPT4KICAgIGlmYWNlLmdldEV2ZW50VG9waWMoZXZlbnROYW1lKSwKICApOwoKICBjb25zb2xlLmxvZyhgZXZlbnRUb3BpY3M6ICR7ZXZlbnRUb3BpY3N9YCk7CgogIHRyeSB7CiAgICBjb25zdCBsb2dzID0gYXdhaXQgcHJvdmlkZXIuZ2V0TG9ncyh7CiAgICAgIGFkZHJlc3MsCiAgICAgIGZyb21CbG9jaywKICAgICAgdG9CbG9jaywKICAgICAgdG9waWNzOiBbZXZlbnRUb3BpY3NdLAogICAgfSk7CiAgICBjb25zb2xlLmxvZyhgRmV0Y2hlZCBsb2dzOiAke2xvZ3MubGVuZ3RofWApOwogICAgcmV0dXJuIGxvZ3MubWFwKChsb2cpID0+IHsKICAgICAgY29uc3QgcGFyc2VkTG9nID0gaWZhY2UucGFyc2VMb2cobG9nKTsKICAgICAgY29uc29sZS5sb2coYFBhcnNlZCBsb2c6ICR7SlNPTi5zdHJpbmdpZnkocGFyc2VkTG9nKX1gKTsKICAgICAgcmV0dXJuIHBhcnNlZExvZzsKICAgIH0pOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBjb25zb2xlLmVycm9yKCJFcnJvciBmZXRjaGluZyBMMSBsb2dzOiIsIGVycm9yKTsKICAgIHJldHVybiBbXTsKICB9Cn0KCmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKGFwaUtleSwgYXBpU2VjcmV0LCByZWxheWVyQXBpS2V5LCByZWxheWVyQXBpU2VjcmV0KSB7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IHRhaWtvTDFQcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgY29uc3QgeyBmcm9tQmxvY2ssIHRvQmxvY2sgfSA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrUmFuZ2UodGFpa29MMVByb3ZpZGVyKTsKCiAgY29uc3QgbG9ncyA9IGF3YWl0IGZldGNoTG9nc0Zyb21MMSgKICAgIFsiVHJhbnNpdGlvbkNvbnRlc3RlZCIsICJUcmFuc2l0aW9uQ29udGVzdGVkVjIiXSwKICAgIGZyb21CbG9jaywKICAgIHRvQmxvY2ssCiAgICAiMHgwNmE5QWIyN2M3ZTIyNTVkZjE4MTVFNkNDMDE2OGQ3NzU1RmViMTlhIiwKICAgIEFCSSwKICAgIHRhaWtvTDFQcm92aWRlciwKICApOwoKICBpZiAobG9ncy5sZW5ndGggPiAwKSB7CiAgICBhbGVydE9yZygKICAgICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgICBgRGV0ZWN0ZWQgJHtsb2dzLmxlbmd0aH0gVHJhbnNpdGlvbkNvbnRlc3RlZCBhbmQgVHJhbnNpdGlvbkNvbnRlc3RlZFYyIGV2ZW50cyBpbiB0aGUgbGFzdCBob3VyIG9uIFRhaWtvTDEhYCwKICAgICk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBUD/6J5y4FQAAuBUAAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAAN4VAAAAAA=="},{"autotaskId":"06200461-ef64-409c-b027-0a0b54986791","actionId":"06200461-ef64-409c-b027-0a0b54986791","name":"TaikoL1: TransitionProved Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"0SM/4ykVO5o7umE96EUaGaOXy2AmZAOOcdjG1e46RUw=","stackResourceId":"mystack.taiko-l-1-transition-proved-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-05","encodedZippedCode":"UEsDBAoAAAAAAAAAQVCdRYy1ABQAAAAUAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgY29tcG9uZW50czogWwogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogInBhcmVudEhhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImJsb2NrSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAic3RhdGVSb290IiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJncmFmZml0aSIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJzdHJ1Y3QgVGFpa29EYXRhLlRyYW5zaXRpb24iLAogICAgICAgIG5hbWU6ICJ0cmFuIiwKICAgICAgICB0eXBlOiAidHVwbGUiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgbmFtZTogInByb3ZlciIsCiAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDk2IiwKICAgICAgICBuYW1lOiAidmFsaWRpdHlCb25kIiwKICAgICAgICB0eXBlOiAidWludDk2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQxNiIsCiAgICAgICAgbmFtZTogInRpZXIiLAogICAgICAgIHR5cGU6ICJ1aW50MTYiLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJUcmFuc2l0aW9uUHJvdmVkIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKICB7CiAgICBhbm9ueW1vdXM6IGZhbHNlLAogICAgaW5wdXRzOiBbCiAgICAgIHsKICAgICAgICBpbmRleGVkOiB0cnVlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQyNTYiLAogICAgICAgIG5hbWU6ICJibG9ja0lkIiwKICAgICAgICB0eXBlOiAidWludDI1NiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjb21wb25lbnRzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAicGFyZW50SGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiYmxvY2tIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJzdGF0ZVJvb3QiLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImdyYWZmaXRpIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInN0cnVjdCBUYWlrb0RhdGEuVHJhbnNpdGlvbiIsCiAgICAgICAgbmFtZTogInRyYW4iLAogICAgICAgIHR5cGU6ICJ0dXBsZSIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAicHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50OTYiLAogICAgICAgIG5hbWU6ICJ2YWxpZGl0eUJvbmQiLAogICAgICAgIHR5cGU6ICJ1aW50OTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDE2IiwKICAgICAgICBuYW1lOiAidGllciIsCiAgICAgICAgdHlwZTogInVpbnQxNiIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIlRyYW5zaXRpb25Qcm92ZWRWMiIsCiAgICB0eXBlOiAiZXZlbnQiLAogIH0sCl07CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2Jsb2NrcyIsCiAgICBzdWJqZWN0OiAi8J+aqCBUYWlrb0wxOiBUcmFuc2l0aW9uUHJvdmVkIEFsZXJ0IiwKICAgIG1lc3NhZ2UsCiAgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIHJldHVybiBjdXJyZW50QmxvY2subnVtYmVyOwp9Cgphc3luYyBmdW5jdGlvbiBmZXRjaExvZ3NGcm9tTDEoCiAgZXZlbnROYW1lcywKICBmcm9tQmxvY2ssCiAgdG9CbG9jaywKICBhZGRyZXNzLAogIGFiaSwKICBwcm92aWRlciwKKSB7CiAgY29uc3QgaWZhY2UgPSBuZXcgZXRoZXJzLnV0aWxzLkludGVyZmFjZShhYmkpOwogIGNvbnN0IGV2ZW50VG9waWNzID0gZXZlbnROYW1lcy5tYXAoKGV2ZW50TmFtZSkgPT4KICAgIGlmYWNlLmdldEV2ZW50VG9waWMoZXZlbnROYW1lKSwKICApOwoKICB0cnkgewogICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICBhZGRyZXNzLAogICAgICBmcm9tQmxvY2ssCiAgICAgIHRvQmxvY2ssCiAgICAgIHRvcGljczogW2V2ZW50VG9waWNzXSwKICAgIH0pOwogICAgY29uc29sZS5sb2coIlJhdyBsb2dzIGZldGNoZWQ6IiwgbG9ncyk7CiAgICByZXR1cm4gbG9ncy5tYXAoKGxvZykgPT4gaWZhY2UucGFyc2VMb2cobG9nKSk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGZldGNoaW5nIEwxIGxvZ3M6IiwgZXJyb3IpOwogICAgcmV0dXJuIFtdOwogIH0KfQoKZnVuY3Rpb24gY3JlYXRlUHJvdmlkZXIoYXBpS2V5LCBhcGlTZWNyZXQsIHJlbGF5ZXJBcGlLZXksIHJlbGF5ZXJBcGlTZWNyZXQpIHsKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgcmVsYXllckFwaUtleSwKICAgIHJlbGF5ZXJBcGlTZWNyZXQsCiAgfSk7CgogIHJldHVybiBjbGllbnQucmVsYXlTaWduZXIuZ2V0UHJvdmlkZXIoKTsKfQoKYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlQmxvY2tUaW1lKHByb3ZpZGVyKSB7CiAgY29uc3QgbGF0ZXN0QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgY29uc3QgcHJldmlvdXNCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKGxhdGVzdEJsb2NrLm51bWJlciAtIDEwMCk7CgogIGNvbnN0IHRpbWVEaWZmID0gbGF0ZXN0QmxvY2sudGltZXN0YW1wIC0gcHJldmlvdXNCbG9jay50aW1lc3RhbXA7CiAgY29uc3QgYmxvY2tEaWZmID0gbGF0ZXN0QmxvY2subnVtYmVyIC0gcHJldmlvdXNCbG9jay5udW1iZXI7CgogIGNvbnN0IGJsb2NrVGltZSA9IHRpbWVEaWZmIC8gYmxvY2tEaWZmOwogIHJldHVybiBibG9ja1RpbWU7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IHRhaWtvTDFQcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgY29uc3QgY3VycmVudEJsb2NrTnVtYmVyID0gYXdhaXQgZ2V0TGF0ZXN0QmxvY2tOdW1iZXIodGFpa29MMVByb3ZpZGVyKTsKICBjb25zdCBibG9ja1RpbWVJblNlY29uZHMgPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1RpbWUodGFpa29MMVByb3ZpZGVyKTsKICBjb25zdCBibG9ja3NJblRoaXJ0eU1pbnV0ZXMgPSBNYXRoLmZsb29yKCgzMCAqIDYwKSAvIGJsb2NrVGltZUluU2Vjb25kcyk7CgogIGNvbnN0IGZyb21CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlciAtIGJsb2Nrc0luVGhpcnR5TWludXRlczsKICBjb25zdCB0b0Jsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyOwoKICBjb25zdCBsb2dzID0gYXdhaXQgZmV0Y2hMb2dzRnJvbUwxKAogICAgWyJUcmFuc2l0aW9uUHJvdmVkIiwgIlRyYW5zaXRpb25Qcm92ZWRWMiJdLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweDA2YTlBYjI3YzdlMjI1NWRmMTgxNUU2Q0MwMTY4ZDc3NTVGZWIxOWEiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGlmIChsb2dzLmxlbmd0aCA9PT0gMCkgewogICAgYWxlcnRPcmcoCiAgICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgICAgYE5vIFRyYW5zaXRpb25Qcm92ZWQgZXZlbnQgZGV0ZWN0ZWQgaW4gdGhlIGxhc3QgMzAgbWlucyBvbiBUYWlrb0wxIWAsCiAgICApOwogIH0KCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVCdRYy1ABQAAAAUAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAAAmFAAAAAA="},{"autotaskId":"4390573f-1796-4c27-8933-7f157e77c2b4","actionId":"4390573f-1796-4c27-8933-7f157e77c2b4","name":"TaikoL1: BlockVerified Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"mqXqyfZDeb1WGdy+nxXiMlsgOop/LSMOh3pARcgugAc=","stackResourceId":"mystack.taiko-l-1-block-verified-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-05","encodedZippedCode":"UEsDBAoAAAAAAAAAQVBa57hUWxAAAFsQAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAicHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAiYmxvY2tIYXNoIiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAic3RhdGVSb290IiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MTYiLAogICAgICAgIG5hbWU6ICJ0aWVyIiwKICAgICAgICB0eXBlOiAidWludDE2IiwKICAgICAgfSwKICAgIF0sCiAgICBuYW1lOiAiQmxvY2tWZXJpZmllZCIsCiAgICB0eXBlOiAiZXZlbnQiLAogIH0sCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAicHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAiYmxvY2tIYXNoIiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAic3RhdGVSb290IiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MTYiLAogICAgICAgIG5hbWU6ICJ0aWVyIiwKICAgICAgICB0eXBlOiAidWludDE2IiwKICAgICAgfSwKICAgIF0sCiAgICBuYW1lOiAiQmxvY2tWZXJpZmllZFYyIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfYmxvY2tzIiwKICAgIHN1YmplY3Q6ICLwn5qoIFRhaWtvTDE6IEJsb2NrVmVyaWZpZWQgQWxlcnQiLAogICAgbWVzc2FnZSwKICB9KTsKCiAgbm90aWZpY2F0aW9uQ2xpZW50LnNlbmQoewogICAgY2hhbm5lbEFsaWFzOiAidGdfdGFpa29fZ3VhcmRpYW5zIiwKICAgIHN1YmplY3Q6ICLwn5qoIFRhaWtvTDE6IEJsb2NrVmVyaWZpZWQgQWxlcnQiLAogICAgbWVzc2FnZSwKICB9KTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgcmV0dXJuIGN1cnJlbnRCbG9jay5udW1iZXI7Cn0KCmFzeW5jIGZ1bmN0aW9uIGZldGNoTG9nc0Zyb21MMSgKICBldmVudE5hbWVzLAogIGZyb21CbG9jaywKICB0b0Jsb2NrLAogIGFkZHJlc3MsCiAgYWJpLAogIHByb3ZpZGVyLAopIHsKICBjb25zdCBpZmFjZSA9IG5ldyBldGhlcnMudXRpbHMuSW50ZXJmYWNlKGFiaSk7CiAgY29uc3QgZXZlbnRUb3BpY3MgPSBldmVudE5hbWVzLm1hcCgoZXZlbnROYW1lKSA9PgogICAgaWZhY2UuZ2V0RXZlbnRUb3BpYyhldmVudE5hbWUpLAogICk7CgogIGNvbnNvbGUubG9nKGBldmVudFRvcGljczogJHtldmVudFRvcGljc31gKTsKCiAgdHJ5IHsKICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCBwcm92aWRlci5nZXRMb2dzKHsKICAgICAgYWRkcmVzcywKICAgICAgZnJvbUJsb2NrLAogICAgICB0b0Jsb2NrLAogICAgICB0b3BpY3M6IFtldmVudFRvcGljc10sCiAgICB9KTsKCiAgICByZXR1cm4gbG9ncy5tYXAoKGxvZykgPT4gaWZhY2UucGFyc2VMb2cobG9nKSk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGZldGNoaW5nIEwxIGxvZ3M6IiwgZXJyb3IpOwogICAgcmV0dXJuIFtdOwogIH0KfQoKZnVuY3Rpb24gY3JlYXRlUHJvdmlkZXIoYXBpS2V5LCBhcGlTZWNyZXQsIHJlbGF5ZXJBcGlLZXksIHJlbGF5ZXJBcGlTZWNyZXQpIHsKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgcmVsYXllckFwaUtleSwKICAgIHJlbGF5ZXJBcGlTZWNyZXQsCiAgfSk7CgogIHJldHVybiBjbGllbnQucmVsYXlTaWduZXIuZ2V0UHJvdmlkZXIoKTsKfQoKYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlQmxvY2tUaW1lKHByb3ZpZGVyKSB7CiAgY29uc3QgbGF0ZXN0QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgY29uc3QgcHJldmlvdXNCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKGxhdGVzdEJsb2NrLm51bWJlciAtIDEwMCk7CgogIGNvbnN0IHRpbWVEaWZmID0gbGF0ZXN0QmxvY2sudGltZXN0YW1wIC0gcHJldmlvdXNCbG9jay50aW1lc3RhbXA7CiAgY29uc3QgYmxvY2tEaWZmID0gbGF0ZXN0QmxvY2subnVtYmVyIC0gcHJldmlvdXNCbG9jay5udW1iZXI7CgogIGNvbnN0IGJsb2NrVGltZSA9IHRpbWVEaWZmIC8gYmxvY2tEaWZmOwogIHJldHVybiBibG9ja1RpbWU7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IHRhaWtvTDFQcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgY29uc3QgY3VycmVudEJsb2NrTnVtYmVyID0gYXdhaXQgZ2V0TGF0ZXN0QmxvY2tOdW1iZXIodGFpa29MMVByb3ZpZGVyKTsKICBjb25zdCBibG9ja1RpbWVJblNlY29uZHMgPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1RpbWUodGFpa29MMVByb3ZpZGVyKTsKICBjb25zdCBibG9ja3NJbkZpdmVNaW51dGVzID0gTWF0aC5mbG9vcigoNSAqIDYwKSAvIGJsb2NrVGltZUluU2Vjb25kcyk7CgogIGNvbnN0IGZyb21CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlciAtIGJsb2Nrc0luRml2ZU1pbnV0ZXM7CiAgY29uc3QgdG9CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlcjsKCiAgY29uc3QgbG9ncyA9IGF3YWl0IGZldGNoTG9nc0Zyb21MMSgKICAgIFsiQmxvY2tWZXJpZmllZCIsICJCbG9ja1ZlcmlmaWVkVjIiXSwKICAgIGZyb21CbG9jaywKICAgIHRvQmxvY2ssCiAgICAiMHgwNmE5QWIyN2M3ZTIyNTVkZjE4MTVFNkNDMDE2OGQ3NzU1RmViMTlhIiwKICAgIEFCSSwKICAgIHRhaWtvTDFQcm92aWRlciwKICApOwoKICBpZiAobG9ncy5sZW5ndGggPT09IDApIHsKICAgIGFsZXJ0T3JnKAogICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgIGBAZGF2aWRjYWkgQHl1ZWE3NTgzIE5vIEJsb2NrVmVyaWZpZWQgZXZlbnQgZGV0ZWN0ZWQgaW4gdGhlIGxhc3QgMzAgbWlucyBpbiBUYWlrb0wxIWAsCiAgICApOwogIH0KCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVBa57hUWxAAAFsQAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAACBEAAAAAA="},{"autotaskId":"3cabb163-79fb-432c-a90a-c111b346a209","actionId":"3cabb163-79fb-432c-a90a-c111b346a209","name":"TaikoL1: BlockProposed Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"gJSTtL74IDa0ri990g/XL8plt4cMekIIJhdeceam+MY=","stackResourceId":"mystack.taiko-l-1-block-proposed-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-05","encodedZippedCode":"UEsDBAoAAAAAAAAAQVAcjdf6viEAAL4hAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAiYXNzaWduZWRQcm92ZXIiLAogICAgICAgIHR5cGU6ICJhZGRyZXNzIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQ5NiIsCiAgICAgICAgbmFtZTogImxpdmVuZXNzQm9uZCIsCiAgICAgICAgdHlwZTogInVpbnQ5NiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjb21wb25lbnRzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAibDFIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJkaWZmaWN1bHR5IiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJibG9iSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZXh0cmFEYXRhIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJkZXBvc2l0c0hhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICAgICAgbmFtZTogImNvaW5iYXNlIiwKICAgICAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDY0IiwKICAgICAgICAgICAgbmFtZTogImlkIiwKICAgICAgICAgICAgdHlwZTogInVpbnQ2NCIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MzIiLAogICAgICAgICAgICBuYW1lOiAiZ2FzTGltaXQiLAogICAgICAgICAgICB0eXBlOiAidWludDMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQ2NCIsCiAgICAgICAgICAgIG5hbWU6ICJ0aW1lc3RhbXAiLAogICAgICAgICAgICB0eXBlOiAidWludDY0IiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQ2NCIsCiAgICAgICAgICAgIG5hbWU6ICJsMUhlaWdodCIsCiAgICAgICAgICAgIHR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDE2IiwKICAgICAgICAgICAgbmFtZTogIm1pblRpZXIiLAogICAgICAgICAgICB0eXBlOiAidWludDE2IiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJvb2wiLAogICAgICAgICAgICBuYW1lOiAiYmxvYlVzZWQiLAogICAgICAgICAgICB0eXBlOiAiYm9vbCIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogInBhcmVudE1ldGFIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICAgIG5hbWU6ICJzZW5kZXIiLAogICAgICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAic3RydWN0IFRhaWtvRGF0YS5CbG9ja01ldGFkYXRhIiwKICAgICAgICBuYW1lOiAibWV0YSIsCiAgICAgICAgdHlwZTogInR1cGxlIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGNvbXBvbmVudHM6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICAgIG5hbWU6ICJyZWNpcGllbnQiLAogICAgICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50OTYiLAogICAgICAgICAgICBuYW1lOiAiYW1vdW50IiwKICAgICAgICAgICAgdHlwZTogInVpbnQ5NiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgICBuYW1lOiAiaWQiLAogICAgICAgICAgICB0eXBlOiAidWludDY0IiwKICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJzdHJ1Y3QgVGFpa29EYXRhLkV0aERlcG9zaXRbXSIsCiAgICAgICAgbmFtZTogImRlcG9zaXRzUHJvY2Vzc2VkIiwKICAgICAgICB0eXBlOiAidHVwbGVbXSIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIkJsb2NrUHJvcG9zZWQiLAogICAgdHlwZTogImV2ZW50IiwKICB9LAogIHsKICAgIGFub255bW91czogZmFsc2UsCiAgICBpbnB1dHM6IFsKICAgICAgewogICAgICAgIGluZGV4ZWQ6IHRydWUsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDI1NiIsCiAgICAgICAgbmFtZTogImJsb2NrSWQiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IHRydWUsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgbmFtZTogImFzc2lnbmVkUHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50OTYiLAogICAgICAgIG5hbWU6ICJsaXZlbmVzc0JvbmQiLAogICAgICAgIHR5cGU6ICJ1aW50OTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgY29tcG9uZW50czogWwogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImwxSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZGlmZmljdWx0eSIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiYmxvYkhhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImV4dHJhRGF0YSIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZGVwb3NpdHNIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICAgIG5hbWU6ICJjb2luYmFzZSIsCiAgICAgICAgICAgIHR5cGU6ICJhZGRyZXNzIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQ2NCIsCiAgICAgICAgICAgIG5hbWU6ICJpZCIsCiAgICAgICAgICAgIHR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDMyIiwKICAgICAgICAgICAgbmFtZTogImdhc0xpbWl0IiwKICAgICAgICAgICAgdHlwZTogInVpbnQzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgICBuYW1lOiAidGltZXN0YW1wIiwKICAgICAgICAgICAgdHlwZTogInVpbnQ2NCIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgICBuYW1lOiAibDFIZWlnaHQiLAogICAgICAgICAgICB0eXBlOiAidWludDY0IiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQxNiIsCiAgICAgICAgICAgIG5hbWU6ICJtaW5UaWVyIiwKICAgICAgICAgICAgdHlwZTogInVpbnQxNiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJib29sIiwKICAgICAgICAgICAgbmFtZTogImJsb2JVc2VkIiwKICAgICAgICAgICAgdHlwZTogImJvb2wiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJwYXJlbnRNZXRhSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImFkZHJlc3MiLAogICAgICAgICAgICBuYW1lOiAic2VuZGVyIiwKICAgICAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInN0cnVjdCBUYWlrb0RhdGEuQmxvY2tNZXRhZGF0YSIsCiAgICAgICAgbmFtZTogIm1ldGEiLAogICAgICAgIHR5cGU6ICJ0dXBsZSIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjb21wb25lbnRzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImFkZHJlc3MiLAogICAgICAgICAgICBuYW1lOiAicmVjaXBpZW50IiwKICAgICAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDk2IiwKICAgICAgICAgICAgbmFtZTogImFtb3VudCIsCiAgICAgICAgICAgIHR5cGU6ICJ1aW50OTYiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDY0IiwKICAgICAgICAgICAgbmFtZTogImlkIiwKICAgICAgICAgICAgdHlwZTogInVpbnQ2NCIsCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAic3RydWN0IFRhaWtvRGF0YS5FdGhEZXBvc2l0W10iLAogICAgICAgIG5hbWU6ICJkZXBvc2l0c1Byb2Nlc3NlZCIsCiAgICAgICAgdHlwZTogInR1cGxlW10iLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJCbG9ja1Byb3Bvc2VkVjIiLAogICAgdHlwZTogImV2ZW50IiwKICB9LApdOwoKZnVuY3Rpb24gYWxlcnRPcmcobm90aWZpY2F0aW9uQ2xpZW50LCBtZXNzYWdlKSB7CiAgbm90aWZpY2F0aW9uQ2xpZW50LnNlbmQoewogICAgY2hhbm5lbEFsaWFzOiAiZGlzY29yZF9ibG9ja3MiLAogICAgc3ViamVjdDogIvCfmqggVGFpa29MMTogQmxvY2tQcm9wb3NlZCBBbGVydCIsCiAgICBtZXNzYWdlLAogIH0pOwoKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJ0Z190YWlrb19ndWFyZGlhbnMiLAogICAgc3ViamVjdDogIvCfmqggVGFpa29MMTogQmxvY2tQcm9wb3NlZCBBbGVydCIsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RCbG9ja051bWJlcihwcm92aWRlcikgewogIGNvbnN0IGN1cnJlbnRCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICByZXR1cm4gY3VycmVudEJsb2NrLm51bWJlcjsKfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hMb2dzRnJvbUwxKAogIGV2ZW50TmFtZXMsCiAgZnJvbUJsb2NrLAogIHRvQmxvY2ssCiAgYWRkcmVzcywKICBhYmksCiAgcHJvdmlkZXIsCikgewogIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoYWJpKTsKCiAgY29uc3QgYWxsTG9ncyA9IFtdOwoKICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBldmVudE5hbWVzKSB7CiAgICBjb25zdCBldmVudFRvcGljID0gaWZhY2UuZ2V0RXZlbnRUb3BpYyhldmVudE5hbWUpOwoKICAgIHRyeSB7CiAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCBwcm92aWRlci5nZXRMb2dzKHsKICAgICAgICBhZGRyZXNzLAogICAgICAgIGZyb21CbG9jaywKICAgICAgICB0b0Jsb2NrLAogICAgICAgIHRvcGljczogW2V2ZW50VG9waWNdLAogICAgICB9KTsKCiAgICAgIGFsbExvZ3MucHVzaCgKICAgICAgICAuLi5sb2dzLm1hcCgobG9nKSA9PgogICAgICAgICAgaWZhY2UuZGVjb2RlRXZlbnRMb2coZXZlbnROYW1lLCBsb2cuZGF0YSwgbG9nLnRvcGljcyksCiAgICAgICAgKSwKICAgICAgKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGZldGNoaW5nIGxvZ3MgZm9yICR7ZXZlbnROYW1lfTpgLCBlcnJvcik7CiAgICB9CiAgfQoKICByZXR1cm4gYWxsTG9nczsKfQoKZnVuY3Rpb24gY3JlYXRlUHJvdmlkZXIoYXBpS2V5LCBhcGlTZWNyZXQsIHJlbGF5ZXJBcGlLZXksIHJlbGF5ZXJBcGlTZWNyZXQpIHsKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgcmVsYXllckFwaUtleSwKICAgIHJlbGF5ZXJBcGlTZWNyZXQsCiAgfSk7CgogIHJldHVybiBjbGllbnQucmVsYXlTaWduZXIuZ2V0UHJvdmlkZXIoKTsKfQoKYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlQmxvY2tUaW1lKHByb3ZpZGVyKSB7CiAgY29uc3QgbGF0ZXN0QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgY29uc3QgcHJldmlvdXNCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKGxhdGVzdEJsb2NrLm51bWJlciAtIDEwMCk7CgogIGNvbnN0IHRpbWVEaWZmID0gbGF0ZXN0QmxvY2sudGltZXN0YW1wIC0gcHJldmlvdXNCbG9jay50aW1lc3RhbXA7CiAgY29uc3QgYmxvY2tEaWZmID0gbGF0ZXN0QmxvY2subnVtYmVyIC0gcHJldmlvdXNCbG9jay5udW1iZXI7CgogIGNvbnN0IGJsb2NrVGltZSA9IHRpbWVEaWZmIC8gYmxvY2tEaWZmOwogIHJldHVybiBibG9ja1RpbWU7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IHRhaWtvTDFQcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgY29uc3QgY3VycmVudEJsb2NrTnVtYmVyID0gYXdhaXQgZ2V0TGF0ZXN0QmxvY2tOdW1iZXIodGFpa29MMVByb3ZpZGVyKTsKICBjb25zdCBibG9ja1RpbWVJblNlY29uZHMgPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1RpbWUodGFpa29MMVByb3ZpZGVyKTsKICBjb25zdCBibG9ja3NJbkZpdmVNaW51dGVzID0gTWF0aC5mbG9vcigoNSAqIDYwKSAvIGJsb2NrVGltZUluU2Vjb25kcyk7CgogIGNvbnN0IGZyb21CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlciAtIGJsb2Nrc0luRml2ZU1pbnV0ZXM7CiAgY29uc3QgdG9CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlcjsKCiAgY29uc3QgbG9ncyA9IGF3YWl0IGZldGNoTG9nc0Zyb21MMSgKICAgIFsiQmxvY2tQcm9wb3NlZCIsICJCbG9ja1Byb3Bvc2VkVjIiXSwKICAgIGZyb21CbG9jaywKICAgIHRvQmxvY2ssCiAgICAiMHgwNmE5QWIyN2M3ZTIyNTVkZjE4MTVFNkNDMDE2OGQ3NzU1RmViMTlhIiwKICAgIEFCSSwKICAgIHRhaWtvTDFQcm92aWRlciwKICApOwoKICBjb25zb2xlLmxvZyhgTG9ncyBmb3VuZDogJHtsb2dzLmxlbmd0aH1gKTsKCiAgaWYgKGxvZ3MubGVuZ3RoID09PSAwKSB7CiAgICBhbGVydE9yZygKICAgICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgICBgTm8gQmxvY2tQcm9wb3NlZCBldmVudCBkZXRlY3RlZCBpbiB0aGUgbGFzdCAxNSBtaW5zIG9uIFRhaWtvTDEhYCwKICAgICk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBUByN1/q+IQAAviEAAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAAOQhAAAAAA=="}]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-18T21:48:09.627Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-18T21:51:21.150Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[{"autotaskId":"86964fd3-3da8-4501-a572-cbf51045f861","actionId":"86964fd3-3da8-4501-a572-cbf51045f861","name":"ERC20Vault: Balance Drop Test","paused":false,"trigger":{"cron":null,"frequencyMinutes":15,"type":"schedule"},"codeDigest":"+Y75bpyOzEuCm0y95ZczKkySm4PgLyQQt6ASpaB08Lk=","stackResourceId":"mystack.erc-20-vault-balance-drop","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBFUkMyMF9BQkkgPSBbCiAgewogICAgY29uc3RhbnQ6IHRydWUsCiAgICBpbnB1dHM6IFt7IG5hbWU6ICJfb3duZXIiLCB0eXBlOiAiYWRkcmVzcyIgfV0sCiAgICBuYW1lOiAiYmFsYW5jZU9mIiwKICAgIG91dHB1dHM6IFt7IG5hbWU6ICJiYWxhbmNlIiwgdHlwZTogInVpbnQyNTYiIH1dLAogICAgcGF5YWJsZTogZmFsc2UsCiAgICBzdGF0ZU11dGFiaWxpdHk6ICJ2aWV3IiwKICAgIHR5cGU6ICJmdW5jdGlvbiIsCiAgfSwKXTsKCmFzeW5jIGZ1bmN0aW9uIGdldEVSQzIwQmFsYW5jZShwcm92aWRlciwgdG9rZW5BZGRyZXNzLCB2YXVsdEFkZHJlc3MpIHsKICBjb25zdCBjb250cmFjdCA9IG5ldyBldGhlcnMuQ29udHJhY3QodG9rZW5BZGRyZXNzLCBFUkMyMF9BQkksIHByb3ZpZGVyKTsKICByZXR1cm4gYXdhaXQgY29udHJhY3QuYmFsYW5jZU9mKHZhdWx0QWRkcmVzcyk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKSB7CiAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldEJhbGFuY2UodmF1bHRBZGRyZXNzKTsKfQoKYXN5bmMgZnVuY3Rpb24gbW9uaXRvclRva2VuQmFsYW5jZSgKICBwcm92aWRlciwKICB0b2tlbkFkZHJlc3MsCiAgdmF1bHRBZGRyZXNzLAogIHByZXZpb3VzQmFsYW5jZUtleSwKICBub3RpZmljYXRpb25DbGllbnQsCiAgc2VjcmV0cywKICBjbGllbnQsCiAgdG9rZW5OYW1lLAogIG5ldHdvcmtOYW1lLAopIHsKICBjb25zb2xlLmxvZyhgTW9uaXRvcmluZyAke3Rva2VuTmFtZX0gYmFsYW5jZSBvbiAke25ldHdvcmtOYW1lfWApOwogIGNvbnN0IHByZXZpb3VzQmFsYW5jZSA9IGV0aGVycy5CaWdOdW1iZXIuZnJvbSgKICAgIHNlY3JldHNbcHJldmlvdXNCYWxhbmNlS2V5XSB8fCAiMCIsCiAgKTsKICBjb25zb2xlLmxvZygKICAgIGBQcmV2aW91cyAke3Rva2VuTmFtZX0gQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoCiAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgbGV0IGN1cnJlbnRCYWxhbmNlOwogIGlmICh0b2tlbk5hbWUgPT09ICJFVEgiKSB7CiAgICBjdXJyZW50QmFsYW5jZSA9IGF3YWl0IGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKTsKICB9IGVsc2UgewogICAgY3VycmVudEJhbGFuY2UgPSBhd2FpdCBnZXRFUkMyMEJhbGFuY2UoCiAgICAgIHByb3ZpZGVyLAogICAgICB0b2tlbkFkZHJlc3MsCiAgICAgIHZhdWx0QWRkcmVzcywKICAgICk7CiAgfQogIGNvbnNvbGUubG9nKAogICAgYEN1cnJlbnQgJHt0b2tlbk5hbWV9IEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICBjdXJyZW50QmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgaWYgKCFwcmV2aW91c0JhbGFuY2UuaXNaZXJvKCkpIHsKICAgIGNvbnN0IGRyb3BQZXJjZW50YWdlID0gcHJldmlvdXNCYWxhbmNlCiAgICAgIC5zdWIoY3VycmVudEJhbGFuY2UpCiAgICAgIC5tdWwoMTAwKQogICAgICAuZGl2KHByZXZpb3VzQmFsYW5jZSkKICAgICAgLnRvTnVtYmVyKCk7CiAgICBjb25zb2xlLmxvZygKICAgICAgYENhbGN1bGF0ZWQgZHJvcCBwZXJjZW50YWdlIGZvciAke3Rva2VuTmFtZX06ICR7ZHJvcFBlcmNlbnRhZ2V9JWAsCiAgICApOwoKICAgIGlmIChkcm9wUGVyY2VudGFnZSA+PSA1KSB7CiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQWxlcnQ6ICR7dG9rZW5OYW1lfSBiYWxhbmNlIGhhcyBkcm9wcGVkIGJ5ICR7ZHJvcFBlcmNlbnRhZ2V9JSBvbiAke25ldHdvcmtOYW1lfS5cblByZXZpb3VzIEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgICAxOCwKICAgICAgKX1cbkN1cnJlbnQgQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoY3VycmVudEJhbGFuY2UsIDE4KX1gOwogICAgICBhbGVydE9yZygKICAgICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgICAgYOKaoO+4jyAke25ldHdvcmtOYW1lfTogJHt0b2tlbk5hbWV9IEJhbGFuY2UgRHJvcCBBbGVydGAsCiAgICAgICAgbWVzc2FnZSwKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKAogICAgICAgIGBObyBzaWduaWZpY2FudCAke3Rva2VuTmFtZX0gYmFsYW5jZSBkcm9wIGRldGVjdGVkIG9uICR7bmV0d29ya05hbWV9YCwKICAgICAgKTsKICAgIH0KICB9IGVsc2UgewogICAgY29uc29sZS5sb2coCiAgICAgIGBObyBwcmV2aW91cyAke3Rva2VuTmFtZX0gYmFsYW5jZSB0byBjb21wYXJlIG9uICR7bmV0d29ya05hbWV9YCwKICAgICk7CiAgfQoKICBhd2FpdCBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIHByZXZpb3VzQmFsYW5jZUtleSwgY3VycmVudEJhbGFuY2UpOwp9CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIHN1YmplY3QsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2JyaWRnaW5nIiwKICAgIHN1YmplY3QsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIGtleSwgbmV3QmFsYW5jZSkgewogIGNvbnNvbGUubG9nKAogICAgYFN0b3JpbmcgcHJldmlvdXMgYmFsYW5jZSB1bmRlciBrZXk6ICR7a2V5fSwgdmFsdWU6ICR7bmV3QmFsYW5jZS50b1N0cmluZygpfWAsCiAgKTsKICBjb25zdCBib2R5ID0gewogICAgZGVsZXRlczogW10sCiAgICBzZWNyZXRzOiB7CiAgICAgIFtrZXldOiBuZXdCYWxhbmNlLnRvU3RyaW5nKCksCiAgICB9LAogIH07CiAgYXdhaXQgY2xpZW50LmFjdGlvbi5jcmVhdGVTZWNyZXRzKGJvZHkpOwp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnNvbGUubG9nKGBDcmVhdGluZyBwcm92aWRlciB3aXRoIEFQSSBrZXlzYCk7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnNvbGUubG9nKGBTdGFydGluZyBiYWxhbmNlIG1vbml0b3JpbmcgZm9yIEwxYCk7CgogIGNvbnN0IGwxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGwxVmF1bHRBZGRyZXNzID0gIjB4OTk2MjgyY0ExMUU1REViNkI1RDEyMkNDM0I5QTFGY0FBRDQ0MTVBYiI7CgogIGNvbnN0IGwxVG9rZW5BZGRyZXNzZXMgPSB7CiAgICBFVEg6IG51bGwsCiAgICBUQUlLTzogZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoCiAgICAgICIweDEwZGVhNjc0NzhjNUY4QzVFMkQ5MGU1RTlCMjZkQmU2MGM1NGQ4MDAiLAogICAgKSwKICAgIFVTREM6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweEEwYjg2OTkxYzYyMThiMzZjMWQxOUQ0YTJlOUViMGNFMzYwNmVCNDgiKSwKICAgIFVTRFQ6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweGRBQzE3Rjk1OEQyZWU1MjNhMjIwNjIwNjk5NDU5N0MxM0Q4MzFlYzciKSwKICB9OwoKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgfSk7CgogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5FVEgsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfRVRIIiwKICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgIGV2ZW50LnNlY3JldHMsCiAgICBjbGllbnQsCiAgICAiRVRIIiwKICAgICJMMSIsCiAgKTsKICBhd2FpdCBtb25pdG9yVG9rZW5CYWxhbmNlKAogICAgbDFQcm92aWRlciwKICAgIGwxVG9rZW5BZGRyZXNzZXMuVEFJS08sCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVEFJS08iLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJUQUlLTyIsCiAgICAiTDEiLAogICk7CiAgYXdhaXQgbW9uaXRvclRva2VuQmFsYW5jZSgKICAgIGwxUHJvdmlkZXIsCiAgICBsMVRva2VuQWRkcmVzc2VzLlVTREMsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVVNEQyIsCiAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICBldmVudC5zZWNyZXRzLAogICAgY2xpZW50LAogICAgIlVTREMiLAogICAgIkwxIiwKICApOwogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5VU0RULAogICAgbDFWYXVsdEFkZHJlc3MsCiAgICAicHJldmlvdXNCYWxhbmNlX0wxX1VTRFQiLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJVU0RUIiwKICAgICJMMSIsCiAgKTsKCiAgY29uc29sZS5sb2coYEJhbGFuY2UgbW9uaXRvcmluZyBjb21wbGV0ZWRgKTsKCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAACWEwAAAAA="}]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-18T21:53:56.270Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[{"autotaskId":"86964fd3-3da8-4501-a572-cbf51045f861","actionId":"86964fd3-3da8-4501-a572-cbf51045f861","name":"ERC20Vault: Balance Drop","paused":false,"trigger":{"cron":null,"frequencyMinutes":15,"type":"schedule"},"codeDigest":"+Y75bpyOzEuCm0y95ZczKkySm4PgLyQQt6ASpaB08Lk=","stackResourceId":"mystack.erc-20-vault-balance-drop","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBFUkMyMF9BQkkgPSBbCiAgewogICAgY29uc3RhbnQ6IHRydWUsCiAgICBpbnB1dHM6IFt7IG5hbWU6ICJfb3duZXIiLCB0eXBlOiAiYWRkcmVzcyIgfV0sCiAgICBuYW1lOiAiYmFsYW5jZU9mIiwKICAgIG91dHB1dHM6IFt7IG5hbWU6ICJiYWxhbmNlIiwgdHlwZTogInVpbnQyNTYiIH1dLAogICAgcGF5YWJsZTogZmFsc2UsCiAgICBzdGF0ZU11dGFiaWxpdHk6ICJ2aWV3IiwKICAgIHR5cGU6ICJmdW5jdGlvbiIsCiAgfSwKXTsKCmFzeW5jIGZ1bmN0aW9uIGdldEVSQzIwQmFsYW5jZShwcm92aWRlciwgdG9rZW5BZGRyZXNzLCB2YXVsdEFkZHJlc3MpIHsKICBjb25zdCBjb250cmFjdCA9IG5ldyBldGhlcnMuQ29udHJhY3QodG9rZW5BZGRyZXNzLCBFUkMyMF9BQkksIHByb3ZpZGVyKTsKICByZXR1cm4gYXdhaXQgY29udHJhY3QuYmFsYW5jZU9mKHZhdWx0QWRkcmVzcyk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKSB7CiAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldEJhbGFuY2UodmF1bHRBZGRyZXNzKTsKfQoKYXN5bmMgZnVuY3Rpb24gbW9uaXRvclRva2VuQmFsYW5jZSgKICBwcm92aWRlciwKICB0b2tlbkFkZHJlc3MsCiAgdmF1bHRBZGRyZXNzLAogIHByZXZpb3VzQmFsYW5jZUtleSwKICBub3RpZmljYXRpb25DbGllbnQsCiAgc2VjcmV0cywKICBjbGllbnQsCiAgdG9rZW5OYW1lLAogIG5ldHdvcmtOYW1lLAopIHsKICBjb25zb2xlLmxvZyhgTW9uaXRvcmluZyAke3Rva2VuTmFtZX0gYmFsYW5jZSBvbiAke25ldHdvcmtOYW1lfWApOwogIGNvbnN0IHByZXZpb3VzQmFsYW5jZSA9IGV0aGVycy5CaWdOdW1iZXIuZnJvbSgKICAgIHNlY3JldHNbcHJldmlvdXNCYWxhbmNlS2V5XSB8fCAiMCIsCiAgKTsKICBjb25zb2xlLmxvZygKICAgIGBQcmV2aW91cyAke3Rva2VuTmFtZX0gQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoCiAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgbGV0IGN1cnJlbnRCYWxhbmNlOwogIGlmICh0b2tlbk5hbWUgPT09ICJFVEgiKSB7CiAgICBjdXJyZW50QmFsYW5jZSA9IGF3YWl0IGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKTsKICB9IGVsc2UgewogICAgY3VycmVudEJhbGFuY2UgPSBhd2FpdCBnZXRFUkMyMEJhbGFuY2UoCiAgICAgIHByb3ZpZGVyLAogICAgICB0b2tlbkFkZHJlc3MsCiAgICAgIHZhdWx0QWRkcmVzcywKICAgICk7CiAgfQogIGNvbnNvbGUubG9nKAogICAgYEN1cnJlbnQgJHt0b2tlbk5hbWV9IEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICBjdXJyZW50QmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgaWYgKCFwcmV2aW91c0JhbGFuY2UuaXNaZXJvKCkpIHsKICAgIGNvbnN0IGRyb3BQZXJjZW50YWdlID0gcHJldmlvdXNCYWxhbmNlCiAgICAgIC5zdWIoY3VycmVudEJhbGFuY2UpCiAgICAgIC5tdWwoMTAwKQogICAgICAuZGl2KHByZXZpb3VzQmFsYW5jZSkKICAgICAgLnRvTnVtYmVyKCk7CiAgICBjb25zb2xlLmxvZygKICAgICAgYENhbGN1bGF0ZWQgZHJvcCBwZXJjZW50YWdlIGZvciAke3Rva2VuTmFtZX06ICR7ZHJvcFBlcmNlbnRhZ2V9JWAsCiAgICApOwoKICAgIGlmIChkcm9wUGVyY2VudGFnZSA+PSA1KSB7CiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQWxlcnQ6ICR7dG9rZW5OYW1lfSBiYWxhbmNlIGhhcyBkcm9wcGVkIGJ5ICR7ZHJvcFBlcmNlbnRhZ2V9JSBvbiAke25ldHdvcmtOYW1lfS5cblByZXZpb3VzIEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgICAxOCwKICAgICAgKX1cbkN1cnJlbnQgQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoY3VycmVudEJhbGFuY2UsIDE4KX1gOwogICAgICBhbGVydE9yZygKICAgICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgICAgYOKaoO+4jyAke25ldHdvcmtOYW1lfTogJHt0b2tlbk5hbWV9IEJhbGFuY2UgRHJvcCBBbGVydGAsCiAgICAgICAgbWVzc2FnZSwKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKAogICAgICAgIGBObyBzaWduaWZpY2FudCAke3Rva2VuTmFtZX0gYmFsYW5jZSBkcm9wIGRldGVjdGVkIG9uICR7bmV0d29ya05hbWV9YCwKICAgICAgKTsKICAgIH0KICB9IGVsc2UgewogICAgY29uc29sZS5sb2coCiAgICAgIGBObyBwcmV2aW91cyAke3Rva2VuTmFtZX0gYmFsYW5jZSB0byBjb21wYXJlIG9uICR7bmV0d29ya05hbWV9YCwKICAgICk7CiAgfQoKICBhd2FpdCBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIHByZXZpb3VzQmFsYW5jZUtleSwgY3VycmVudEJhbGFuY2UpOwp9CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIHN1YmplY3QsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2JyaWRnaW5nIiwKICAgIHN1YmplY3QsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIGtleSwgbmV3QmFsYW5jZSkgewogIGNvbnNvbGUubG9nKAogICAgYFN0b3JpbmcgcHJldmlvdXMgYmFsYW5jZSB1bmRlciBrZXk6ICR7a2V5fSwgdmFsdWU6ICR7bmV3QmFsYW5jZS50b1N0cmluZygpfWAsCiAgKTsKICBjb25zdCBib2R5ID0gewogICAgZGVsZXRlczogW10sCiAgICBzZWNyZXRzOiB7CiAgICAgIFtrZXldOiBuZXdCYWxhbmNlLnRvU3RyaW5nKCksCiAgICB9LAogIH07CiAgYXdhaXQgY2xpZW50LmFjdGlvbi5jcmVhdGVTZWNyZXRzKGJvZHkpOwp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnNvbGUubG9nKGBDcmVhdGluZyBwcm92aWRlciB3aXRoIEFQSSBrZXlzYCk7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnNvbGUubG9nKGBTdGFydGluZyBiYWxhbmNlIG1vbml0b3JpbmcgZm9yIEwxYCk7CgogIGNvbnN0IGwxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGwxVmF1bHRBZGRyZXNzID0gIjB4OTk2MjgyY0ExMUU1REViNkI1RDEyMkNDM0I5QTFGY0FBRDQ0MTVBYiI7CgogIGNvbnN0IGwxVG9rZW5BZGRyZXNzZXMgPSB7CiAgICBFVEg6IG51bGwsCiAgICBUQUlLTzogZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoCiAgICAgICIweDEwZGVhNjc0NzhjNUY4QzVFMkQ5MGU1RTlCMjZkQmU2MGM1NGQ4MDAiLAogICAgKSwKICAgIFVTREM6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweEEwYjg2OTkxYzYyMThiMzZjMWQxOUQ0YTJlOUViMGNFMzYwNmVCNDgiKSwKICAgIFVTRFQ6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweGRBQzE3Rjk1OEQyZWU1MjNhMjIwNjIwNjk5NDU5N0MxM0Q4MzFlYzciKSwKICB9OwoKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgfSk7CgogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5FVEgsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfRVRIIiwKICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgIGV2ZW50LnNlY3JldHMsCiAgICBjbGllbnQsCiAgICAiRVRIIiwKICAgICJMMSIsCiAgKTsKICBhd2FpdCBtb25pdG9yVG9rZW5CYWxhbmNlKAogICAgbDFQcm92aWRlciwKICAgIGwxVG9rZW5BZGRyZXNzZXMuVEFJS08sCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVEFJS08iLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJUQUlLTyIsCiAgICAiTDEiLAogICk7CiAgYXdhaXQgbW9uaXRvclRva2VuQmFsYW5jZSgKICAgIGwxUHJvdmlkZXIsCiAgICBsMVRva2VuQWRkcmVzc2VzLlVTREMsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVVNEQyIsCiAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICBldmVudC5zZWNyZXRzLAogICAgY2xpZW50LAogICAgIlVTREMiLAogICAgIkwxIiwKICApOwogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5VU0RULAogICAgbDFWYXVsdEFkZHJlc3MsCiAgICAicHJldmlvdXNCYWxhbmNlX0wxX1VTRFQiLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJVU0RUIiwKICAgICJMMSIsCiAgKTsKCiAgY29uc29sZS5sb2coYEJhbGFuY2UgbW9uaXRvcmluZyBjb21wbGV0ZWRgKTsKCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAACWEwAAAAA="}]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-19T10:45:56.109Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[{"autotaskId":"86964fd3-3da8-4501-a572-cbf51045f861","actionId":"86964fd3-3da8-4501-a572-cbf51045f861","name":"ERC20Vault: Balance Drop Test","paused":false,"trigger":{"cron":null,"frequencyMinutes":15,"type":"schedule"},"codeDigest":"+Y75bpyOzEuCm0y95ZczKkySm4PgLyQQt6ASpaB08Lk=","stackResourceId":"mystack.erc-20-vault-balance-drop","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBFUkMyMF9BQkkgPSBbCiAgewogICAgY29uc3RhbnQ6IHRydWUsCiAgICBpbnB1dHM6IFt7IG5hbWU6ICJfb3duZXIiLCB0eXBlOiAiYWRkcmVzcyIgfV0sCiAgICBuYW1lOiAiYmFsYW5jZU9mIiwKICAgIG91dHB1dHM6IFt7IG5hbWU6ICJiYWxhbmNlIiwgdHlwZTogInVpbnQyNTYiIH1dLAogICAgcGF5YWJsZTogZmFsc2UsCiAgICBzdGF0ZU11dGFiaWxpdHk6ICJ2aWV3IiwKICAgIHR5cGU6ICJmdW5jdGlvbiIsCiAgfSwKXTsKCmFzeW5jIGZ1bmN0aW9uIGdldEVSQzIwQmFsYW5jZShwcm92aWRlciwgdG9rZW5BZGRyZXNzLCB2YXVsdEFkZHJlc3MpIHsKICBjb25zdCBjb250cmFjdCA9IG5ldyBldGhlcnMuQ29udHJhY3QodG9rZW5BZGRyZXNzLCBFUkMyMF9BQkksIHByb3ZpZGVyKTsKICByZXR1cm4gYXdhaXQgY29udHJhY3QuYmFsYW5jZU9mKHZhdWx0QWRkcmVzcyk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKSB7CiAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldEJhbGFuY2UodmF1bHRBZGRyZXNzKTsKfQoKYXN5bmMgZnVuY3Rpb24gbW9uaXRvclRva2VuQmFsYW5jZSgKICBwcm92aWRlciwKICB0b2tlbkFkZHJlc3MsCiAgdmF1bHRBZGRyZXNzLAogIHByZXZpb3VzQmFsYW5jZUtleSwKICBub3RpZmljYXRpb25DbGllbnQsCiAgc2VjcmV0cywKICBjbGllbnQsCiAgdG9rZW5OYW1lLAogIG5ldHdvcmtOYW1lLAopIHsKICBjb25zb2xlLmxvZyhgTW9uaXRvcmluZyAke3Rva2VuTmFtZX0gYmFsYW5jZSBvbiAke25ldHdvcmtOYW1lfWApOwogIGNvbnN0IHByZXZpb3VzQmFsYW5jZSA9IGV0aGVycy5CaWdOdW1iZXIuZnJvbSgKICAgIHNlY3JldHNbcHJldmlvdXNCYWxhbmNlS2V5XSB8fCAiMCIsCiAgKTsKICBjb25zb2xlLmxvZygKICAgIGBQcmV2aW91cyAke3Rva2VuTmFtZX0gQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoCiAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgbGV0IGN1cnJlbnRCYWxhbmNlOwogIGlmICh0b2tlbk5hbWUgPT09ICJFVEgiKSB7CiAgICBjdXJyZW50QmFsYW5jZSA9IGF3YWl0IGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKTsKICB9IGVsc2UgewogICAgY3VycmVudEJhbGFuY2UgPSBhd2FpdCBnZXRFUkMyMEJhbGFuY2UoCiAgICAgIHByb3ZpZGVyLAogICAgICB0b2tlbkFkZHJlc3MsCiAgICAgIHZhdWx0QWRkcmVzcywKICAgICk7CiAgfQogIGNvbnNvbGUubG9nKAogICAgYEN1cnJlbnQgJHt0b2tlbk5hbWV9IEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICBjdXJyZW50QmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgaWYgKCFwcmV2aW91c0JhbGFuY2UuaXNaZXJvKCkpIHsKICAgIGNvbnN0IGRyb3BQZXJjZW50YWdlID0gcHJldmlvdXNCYWxhbmNlCiAgICAgIC5zdWIoY3VycmVudEJhbGFuY2UpCiAgICAgIC5tdWwoMTAwKQogICAgICAuZGl2KHByZXZpb3VzQmFsYW5jZSkKICAgICAgLnRvTnVtYmVyKCk7CiAgICBjb25zb2xlLmxvZygKICAgICAgYENhbGN1bGF0ZWQgZHJvcCBwZXJjZW50YWdlIGZvciAke3Rva2VuTmFtZX06ICR7ZHJvcFBlcmNlbnRhZ2V9JWAsCiAgICApOwoKICAgIGlmIChkcm9wUGVyY2VudGFnZSA+PSA1KSB7CiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQWxlcnQ6ICR7dG9rZW5OYW1lfSBiYWxhbmNlIGhhcyBkcm9wcGVkIGJ5ICR7ZHJvcFBlcmNlbnRhZ2V9JSBvbiAke25ldHdvcmtOYW1lfS5cblByZXZpb3VzIEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgICAxOCwKICAgICAgKX1cbkN1cnJlbnQgQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoY3VycmVudEJhbGFuY2UsIDE4KX1gOwogICAgICBhbGVydE9yZygKICAgICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgICAgYOKaoO+4jyAke25ldHdvcmtOYW1lfTogJHt0b2tlbk5hbWV9IEJhbGFuY2UgRHJvcCBBbGVydGAsCiAgICAgICAgbWVzc2FnZSwKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKAogICAgICAgIGBObyBzaWduaWZpY2FudCAke3Rva2VuTmFtZX0gYmFsYW5jZSBkcm9wIGRldGVjdGVkIG9uICR7bmV0d29ya05hbWV9YCwKICAgICAgKTsKICAgIH0KICB9IGVsc2UgewogICAgY29uc29sZS5sb2coCiAgICAgIGBObyBwcmV2aW91cyAke3Rva2VuTmFtZX0gYmFsYW5jZSB0byBjb21wYXJlIG9uICR7bmV0d29ya05hbWV9YCwKICAgICk7CiAgfQoKICBhd2FpdCBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIHByZXZpb3VzQmFsYW5jZUtleSwgY3VycmVudEJhbGFuY2UpOwp9CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIHN1YmplY3QsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2JyaWRnaW5nIiwKICAgIHN1YmplY3QsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIGtleSwgbmV3QmFsYW5jZSkgewogIGNvbnNvbGUubG9nKAogICAgYFN0b3JpbmcgcHJldmlvdXMgYmFsYW5jZSB1bmRlciBrZXk6ICR7a2V5fSwgdmFsdWU6ICR7bmV3QmFsYW5jZS50b1N0cmluZygpfWAsCiAgKTsKICBjb25zdCBib2R5ID0gewogICAgZGVsZXRlczogW10sCiAgICBzZWNyZXRzOiB7CiAgICAgIFtrZXldOiBuZXdCYWxhbmNlLnRvU3RyaW5nKCksCiAgICB9LAogIH07CiAgYXdhaXQgY2xpZW50LmFjdGlvbi5jcmVhdGVTZWNyZXRzKGJvZHkpOwp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnNvbGUubG9nKGBDcmVhdGluZyBwcm92aWRlciB3aXRoIEFQSSBrZXlzYCk7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnNvbGUubG9nKGBTdGFydGluZyBiYWxhbmNlIG1vbml0b3JpbmcgZm9yIEwxYCk7CgogIGNvbnN0IGwxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGwxVmF1bHRBZGRyZXNzID0gIjB4OTk2MjgyY0ExMUU1REViNkI1RDEyMkNDM0I5QTFGY0FBRDQ0MTVBYiI7CgogIGNvbnN0IGwxVG9rZW5BZGRyZXNzZXMgPSB7CiAgICBFVEg6IG51bGwsCiAgICBUQUlLTzogZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoCiAgICAgICIweDEwZGVhNjc0NzhjNUY4QzVFMkQ5MGU1RTlCMjZkQmU2MGM1NGQ4MDAiLAogICAgKSwKICAgIFVTREM6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweEEwYjg2OTkxYzYyMThiMzZjMWQxOUQ0YTJlOUViMGNFMzYwNmVCNDgiKSwKICAgIFVTRFQ6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweGRBQzE3Rjk1OEQyZWU1MjNhMjIwNjIwNjk5NDU5N0MxM0Q4MzFlYzciKSwKICB9OwoKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgfSk7CgogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5FVEgsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfRVRIIiwKICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgIGV2ZW50LnNlY3JldHMsCiAgICBjbGllbnQsCiAgICAiRVRIIiwKICAgICJMMSIsCiAgKTsKICBhd2FpdCBtb25pdG9yVG9rZW5CYWxhbmNlKAogICAgbDFQcm92aWRlciwKICAgIGwxVG9rZW5BZGRyZXNzZXMuVEFJS08sCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVEFJS08iLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJUQUlLTyIsCiAgICAiTDEiLAogICk7CiAgYXdhaXQgbW9uaXRvclRva2VuQmFsYW5jZSgKICAgIGwxUHJvdmlkZXIsCiAgICBsMVRva2VuQWRkcmVzc2VzLlVTREMsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVVNEQyIsCiAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICBldmVudC5zZWNyZXRzLAogICAgY2xpZW50LAogICAgIlVTREMiLAogICAgIkwxIiwKICApOwogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5VU0RULAogICAgbDFWYXVsdEFkZHJlc3MsCiAgICAicHJldmlvdXNCYWxhbmNlX0wxX1VTRFQiLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJVU0RUIiwKICAgICJMMSIsCiAgKTsKCiAgY29uc29sZS5sb2coYEJhbGFuY2UgbW9uaXRvcmluZyBjb21wbGV0ZWRgKTsKCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAACWEwAAAAA="}]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[{"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","name":"discord_bridging","paused":false,"config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging"}]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-20T10:05:14.785Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[{"autotaskId":"4390573f-1796-4c27-8933-7f157e77c2b4","actionId":"4390573f-1796-4c27-8933-7f157e77c2b4","name":"TaikoL1: BlockVerified Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"KOTnS1Yf5tvLYRNPMJ0JnrGAv66lJy5ms0M9KHsmVZI=","stackResourceId":"mystack.taiko-l-1-block-verified-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-05","encodedZippedCode":"UEsDBAoAAAAAAAAAQVDHg6kMXRAAAF0QAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAicHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAiYmxvY2tIYXNoIiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAic3RhdGVSb290IiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MTYiLAogICAgICAgIG5hbWU6ICJ0aWVyIiwKICAgICAgICB0eXBlOiAidWludDE2IiwKICAgICAgfSwKICAgIF0sCiAgICBuYW1lOiAiQmxvY2tWZXJpZmllZCIsCiAgICB0eXBlOiAiZXZlbnQiLAogIH0sCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAicHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAiYmxvY2tIYXNoIiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAic3RhdGVSb290IiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MTYiLAogICAgICAgIG5hbWU6ICJ0aWVyIiwKICAgICAgICB0eXBlOiAidWludDE2IiwKICAgICAgfSwKICAgIF0sCiAgICBuYW1lOiAiQmxvY2tWZXJpZmllZFYyIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfYnJpZGdpbmciLAogICAgc3ViamVjdDogIvCfmqggVGFpa29MMTogQmxvY2tWZXJpZmllZCBBbGVydCIsCiAgICBtZXNzYWdlLAogIH0pOwoKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJ0Z190YWlrb19ndWFyZGlhbnMiLAogICAgc3ViamVjdDogIvCfmqggVGFpa29MMTogQmxvY2tWZXJpZmllZCBBbGVydCIsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RCbG9ja051bWJlcihwcm92aWRlcikgewogIGNvbnN0IGN1cnJlbnRCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICByZXR1cm4gY3VycmVudEJsb2NrLm51bWJlcjsKfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hMb2dzRnJvbUwxKAogIGV2ZW50TmFtZXMsCiAgZnJvbUJsb2NrLAogIHRvQmxvY2ssCiAgYWRkcmVzcywKICBhYmksCiAgcHJvdmlkZXIsCikgewogIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoYWJpKTsKICBjb25zdCBldmVudFRvcGljcyA9IGV2ZW50TmFtZXMubWFwKChldmVudE5hbWUpID0+CiAgICBpZmFjZS5nZXRFdmVudFRvcGljKGV2ZW50TmFtZSksCiAgKTsKCiAgY29uc29sZS5sb2coYGV2ZW50VG9waWNzOiAke2V2ZW50VG9waWNzfWApOwoKICB0cnkgewogICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICBhZGRyZXNzLAogICAgICBmcm9tQmxvY2ssCiAgICAgIHRvQmxvY2ssCiAgICAgIHRvcGljczogW2V2ZW50VG9waWNzXSwKICAgIH0pOwoKICAgIHJldHVybiBsb2dzLm1hcCgobG9nKSA9PiBpZmFjZS5wYXJzZUxvZyhsb2cpKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5lcnJvcigiRXJyb3IgZmV0Y2hpbmcgTDEgbG9nczoiLCBlcnJvcik7CiAgICByZXR1cm4gW107CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnN0IGNsaWVudCA9IG5ldyBEZWZlbmRlcih7CiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICByZWxheWVyQXBpS2V5LAogICAgcmVsYXllckFwaVNlY3JldCwKICB9KTsKCiAgcmV0dXJuIGNsaWVudC5yZWxheVNpZ25lci5nZXRQcm92aWRlcigpOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpIHsKICBjb25zdCBsYXRlc3RCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICBjb25zdCBwcmV2aW91c0Jsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2sobGF0ZXN0QmxvY2subnVtYmVyIC0gMTAwKTsKCiAgY29uc3QgdGltZURpZmYgPSBsYXRlc3RCbG9jay50aW1lc3RhbXAgLSBwcmV2aW91c0Jsb2NrLnRpbWVzdGFtcDsKICBjb25zdCBibG9ja0RpZmYgPSBsYXRlc3RCbG9jay5udW1iZXIgLSBwcmV2aW91c0Jsb2NrLm51bWJlcjsKCiAgY29uc3QgYmxvY2tUaW1lID0gdGltZURpZmYgLyBibG9ja0RpZmY7CiAgcmV0dXJuIGJsb2NrVGltZTsKfQoKZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgZnVuY3Rpb24gKGV2ZW50LCBjb250ZXh0KSB7CiAgY29uc3QgeyBub3RpZmljYXRpb25DbGllbnQgfSA9IGNvbnRleHQ7CiAgY29uc3QgeyBhcGlLZXksIGFwaVNlY3JldCwgdGFpa29MMUFwaUtleSwgdGFpa29MMUFwaVNlY3JldCB9ID0gZXZlbnQuc2VjcmV0czsKCiAgY29uc3QgdGFpa29MMVByb3ZpZGVyID0gY3JlYXRlUHJvdmlkZXIoCiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICB0YWlrb0wxQXBpS2V5LAogICAgdGFpa29MMUFwaVNlY3JldCwKICApOwoKICBjb25zdCBjdXJyZW50QmxvY2tOdW1iZXIgPSBhd2FpdCBnZXRMYXRlc3RCbG9ja051bWJlcih0YWlrb0wxUHJvdmlkZXIpOwogIGNvbnN0IGJsb2NrVGltZUluU2Vjb25kcyA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrVGltZSh0YWlrb0wxUHJvdmlkZXIpOwogIGNvbnN0IGJsb2Nrc0luRml2ZU1pbnV0ZXMgPSBNYXRoLmZsb29yKCg1ICogNjApIC8gYmxvY2tUaW1lSW5TZWNvbmRzKTsKCiAgY29uc3QgZnJvbUJsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyIC0gYmxvY2tzSW5GaXZlTWludXRlczsKICBjb25zdCB0b0Jsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyOwoKICBjb25zdCBsb2dzID0gYXdhaXQgZmV0Y2hMb2dzRnJvbUwxKAogICAgWyJCbG9ja1ZlcmlmaWVkIiwgIkJsb2NrVmVyaWZpZWRWMiJdLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweDA2YTlBYjI3YzdlMjI1NWRmMTgxNUU2Q0MwMTY4ZDc3NTVGZWIxOWEiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGlmIChsb2dzLmxlbmd0aCA9PT0gMCkgewogICAgYWxlcnRPcmcoCiAgICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgICAgYEBkYXZpZGNhaSBAeXVlYTc1ODMgTm8gQmxvY2tWZXJpZmllZCBldmVudCBkZXRlY3RlZCBpbiB0aGUgbGFzdCAzMCBtaW5zIGluIFRhaWtvTDEhYCwKICAgICk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBUMeDqQxdEAAAXRAAAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAAIMQAAAAAA=="}]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-20T10:34:25.843Z","monitors":{"removed":[],"created":[{"type":"BLOCK","network":"mainnet","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","subscriberId":"1bc1012e-54fc-4fbc-8971-54c5b2a5146e","monitorId":"1bc1012e-54fc-4fbc-8971-54c5b2a5146e","createdAt":"2024-09-20T10:36:31.684Z","name":"TaikoL1: ProvingPaused Alert","paused":false,"notifyConfig":{"notifications":[{"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"updatedAt":"2024-09-19T10:48:03.908Z","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","paused":false,"stackResourceId":"mystack.discord-bridging","type":"discord"}],"severityLevel":"HIGH","timeoutMs":60000,"messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ TaikoL1: ProvingPaused Alert"},"stackResourceId":"mystack.taiko-l-1-proving-paused-alert","skipABIValidation":false,"blockWatcherId":"mainnet-1","addressRules":[{"conditions":[],"addresses":["0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a"]}]},{"type":"BLOCK","network":"mainnet","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","subscriberId":"8e05b9b7-09d2-4b2e-b843-96a62f03c80a","monitorId":"8e05b9b7-09d2-4b2e-b843-96a62f03c80a","createdAt":"2024-09-20T10:36:35.701Z","name":"GuardianProver: GuardiansUpdated Alert","paused":false,"notifyConfig":{"notifications":[{"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"updatedAt":"2024-09-19T10:48:03.908Z","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","paused":false,"stackResourceId":"mystack.discord-bridging","type":"discord"}],"severityLevel":"MEDIUM","timeoutMs":60000,"messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ GuardianProver: GuardiansUpdated Alert"},"stackResourceId":"mystack.guardian-prover-guardians-updated-alert","skipABIValidation":false,"blockWatcherId":"mainnet-1","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}]},{"type":"BLOCK","network":"mainnet","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","subscriberId":"deb988aa-3550-4690-9f9b-b45486a45af0","monitorId":"deb988aa-3550-4690-9f9b-b45486a45af0","createdAt":"2024-09-20T10:36:39.801Z","name":"GuardianProver: ConflictingProofs Alert","paused":false,"notifyConfig":{"notifications":[{"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"updatedAt":"2024-09-19T10:48:03.908Z","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","paused":false,"stackResourceId":"mystack.discord-bridging","type":"discord"}],"severityLevel":"MEDIUM","timeoutMs":60000,"messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"🚨 GuardianProver: ConflictingProofs Alert"},"stackResourceId":"mystack.guardian-prover-conflicting-proofs-alert","skipABIValidation":false,"blockWatcherId":"mainnet-1","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}]},{"type":"BLOCK","network":"mainnet","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","subscriberId":"cf7ea759-183f-4761-96cc-ec6cf9052d3b","monitorId":"cf7ea759-183f-4761-96cc-ec6cf9052d3b","createdAt":"2024-09-20T10:36:44.961Z","name":"GuardianProver: ProvingAutoPauseEnabled Alert","paused":false,"notifyConfig":{"notifications":[{"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"updatedAt":"2024-09-19T10:48:03.908Z","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","paused":false,"stackResourceId":"mystack.discord-bridging","type":"discord"}],"severityLevel":"MEDIUM","timeoutMs":60000,"messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ GuardianProver: ProvingAutoPauseEnabled Alert"},"stackResourceId":"mystack.guardian-prover-proving-auto-pause-enabled-alert","skipABIValidation":false,"blockWatcherId":"mainnet-1","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}]}],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-20T11:03:25.435Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":false,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ TaikoL1: ProvingPaused Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a"]}],"createdAt":"2024-09-20T10:36:31.684Z","subscriberId":"1bc1012e-54fc-4fbc-8971-54c5b2a5146e","name":"TaikoL1: ProvingPaused Alert","network":"mainnet","monitorId":"1bc1012e-54fc-4fbc-8971-54c5b2a5146e","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-l-1-proving-paused-alert","type":"BLOCK"},{"skipABIValidation":false,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ GuardianProver: GuardiansUpdated Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}],"createdAt":"2024-09-20T10:36:35.701Z","subscriberId":"8e05b9b7-09d2-4b2e-b843-96a62f03c80a","name":"GuardianProver: GuardiansUpdated Alert","network":"mainnet","monitorId":"8e05b9b7-09d2-4b2e-b843-96a62f03c80a","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.guardian-prover-guardians-updated-alert","type":"BLOCK"},{"skipABIValidation":false,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"🚨 GuardianProver: ConflictingProofs Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}],"createdAt":"2024-09-20T10:36:39.801Z","subscriberId":"deb988aa-3550-4690-9f9b-b45486a45af0","name":"GuardianProver: ConflictingProofs Alert","network":"mainnet","monitorId":"deb988aa-3550-4690-9f9b-b45486a45af0","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.guardian-prover-conflicting-proofs-alert","type":"BLOCK"},{"skipABIValidation":false,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ GuardianProver: ProvingAutoPauseEnabled Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}],"createdAt":"2024-09-20T10:36:44.961Z","subscriberId":"cf7ea759-183f-4761-96cc-ec6cf9052d3b","name":"GuardianProver: ProvingAutoPauseEnabled Alert","network":"mainnet","monitorId":"cf7ea759-183f-4761-96cc-ec6cf9052d3b","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.guardian-prover-proving-auto-pause-enabled-alert","type":"BLOCK"},{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[{"autotaskId":"86964fd3-3da8-4501-a572-cbf51045f861","actionId":"86964fd3-3da8-4501-a572-cbf51045f861","name":"ERC20Vault: Balance Drop","paused":false,"trigger":{"cron":null,"frequencyMinutes":15,"type":"schedule"},"codeDigest":"+Y75bpyOzEuCm0y95ZczKkySm4PgLyQQt6ASpaB08Lk=","stackResourceId":"mystack.erc-20-vault-balance-drop","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBFUkMyMF9BQkkgPSBbCiAgewogICAgY29uc3RhbnQ6IHRydWUsCiAgICBpbnB1dHM6IFt7IG5hbWU6ICJfb3duZXIiLCB0eXBlOiAiYWRkcmVzcyIgfV0sCiAgICBuYW1lOiAiYmFsYW5jZU9mIiwKICAgIG91dHB1dHM6IFt7IG5hbWU6ICJiYWxhbmNlIiwgdHlwZTogInVpbnQyNTYiIH1dLAogICAgcGF5YWJsZTogZmFsc2UsCiAgICBzdGF0ZU11dGFiaWxpdHk6ICJ2aWV3IiwKICAgIHR5cGU6ICJmdW5jdGlvbiIsCiAgfSwKXTsKCmFzeW5jIGZ1bmN0aW9uIGdldEVSQzIwQmFsYW5jZShwcm92aWRlciwgdG9rZW5BZGRyZXNzLCB2YXVsdEFkZHJlc3MpIHsKICBjb25zdCBjb250cmFjdCA9IG5ldyBldGhlcnMuQ29udHJhY3QodG9rZW5BZGRyZXNzLCBFUkMyMF9BQkksIHByb3ZpZGVyKTsKICByZXR1cm4gYXdhaXQgY29udHJhY3QuYmFsYW5jZU9mKHZhdWx0QWRkcmVzcyk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKSB7CiAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldEJhbGFuY2UodmF1bHRBZGRyZXNzKTsKfQoKYXN5bmMgZnVuY3Rpb24gbW9uaXRvclRva2VuQmFsYW5jZSgKICBwcm92aWRlciwKICB0b2tlbkFkZHJlc3MsCiAgdmF1bHRBZGRyZXNzLAogIHByZXZpb3VzQmFsYW5jZUtleSwKICBub3RpZmljYXRpb25DbGllbnQsCiAgc2VjcmV0cywKICBjbGllbnQsCiAgdG9rZW5OYW1lLAogIG5ldHdvcmtOYW1lLAopIHsKICBjb25zb2xlLmxvZyhgTW9uaXRvcmluZyAke3Rva2VuTmFtZX0gYmFsYW5jZSBvbiAke25ldHdvcmtOYW1lfWApOwogIGNvbnN0IHByZXZpb3VzQmFsYW5jZSA9IGV0aGVycy5CaWdOdW1iZXIuZnJvbSgKICAgIHNlY3JldHNbcHJldmlvdXNCYWxhbmNlS2V5XSB8fCAiMCIsCiAgKTsKICBjb25zb2xlLmxvZygKICAgIGBQcmV2aW91cyAke3Rva2VuTmFtZX0gQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoCiAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgbGV0IGN1cnJlbnRCYWxhbmNlOwogIGlmICh0b2tlbk5hbWUgPT09ICJFVEgiKSB7CiAgICBjdXJyZW50QmFsYW5jZSA9IGF3YWl0IGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKTsKICB9IGVsc2UgewogICAgY3VycmVudEJhbGFuY2UgPSBhd2FpdCBnZXRFUkMyMEJhbGFuY2UoCiAgICAgIHByb3ZpZGVyLAogICAgICB0b2tlbkFkZHJlc3MsCiAgICAgIHZhdWx0QWRkcmVzcywKICAgICk7CiAgfQogIGNvbnNvbGUubG9nKAogICAgYEN1cnJlbnQgJHt0b2tlbk5hbWV9IEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICBjdXJyZW50QmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgaWYgKCFwcmV2aW91c0JhbGFuY2UuaXNaZXJvKCkpIHsKICAgIGNvbnN0IGRyb3BQZXJjZW50YWdlID0gcHJldmlvdXNCYWxhbmNlCiAgICAgIC5zdWIoY3VycmVudEJhbGFuY2UpCiAgICAgIC5tdWwoMTAwKQogICAgICAuZGl2KHByZXZpb3VzQmFsYW5jZSkKICAgICAgLnRvTnVtYmVyKCk7CiAgICBjb25zb2xlLmxvZygKICAgICAgYENhbGN1bGF0ZWQgZHJvcCBwZXJjZW50YWdlIGZvciAke3Rva2VuTmFtZX06ICR7ZHJvcFBlcmNlbnRhZ2V9JWAsCiAgICApOwoKICAgIGlmIChkcm9wUGVyY2VudGFnZSA+PSA1KSB7CiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQWxlcnQ6ICR7dG9rZW5OYW1lfSBiYWxhbmNlIGhhcyBkcm9wcGVkIGJ5ICR7ZHJvcFBlcmNlbnRhZ2V9JSBvbiAke25ldHdvcmtOYW1lfS5cblByZXZpb3VzIEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgICAxOCwKICAgICAgKX1cbkN1cnJlbnQgQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoY3VycmVudEJhbGFuY2UsIDE4KX1gOwogICAgICBhbGVydE9yZygKICAgICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgICAgYOKaoO+4jyAke25ldHdvcmtOYW1lfTogJHt0b2tlbk5hbWV9IEJhbGFuY2UgRHJvcCBBbGVydGAsCiAgICAgICAgbWVzc2FnZSwKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKAogICAgICAgIGBObyBzaWduaWZpY2FudCAke3Rva2VuTmFtZX0gYmFsYW5jZSBkcm9wIGRldGVjdGVkIG9uICR7bmV0d29ya05hbWV9YCwKICAgICAgKTsKICAgIH0KICB9IGVsc2UgewogICAgY29uc29sZS5sb2coCiAgICAgIGBObyBwcmV2aW91cyAke3Rva2VuTmFtZX0gYmFsYW5jZSB0byBjb21wYXJlIG9uICR7bmV0d29ya05hbWV9YCwKICAgICk7CiAgfQoKICBhd2FpdCBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIHByZXZpb3VzQmFsYW5jZUtleSwgY3VycmVudEJhbGFuY2UpOwp9CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIHN1YmplY3QsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2JyaWRnaW5nIiwKICAgIHN1YmplY3QsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIGtleSwgbmV3QmFsYW5jZSkgewogIGNvbnNvbGUubG9nKAogICAgYFN0b3JpbmcgcHJldmlvdXMgYmFsYW5jZSB1bmRlciBrZXk6ICR7a2V5fSwgdmFsdWU6ICR7bmV3QmFsYW5jZS50b1N0cmluZygpfWAsCiAgKTsKICBjb25zdCBib2R5ID0gewogICAgZGVsZXRlczogW10sCiAgICBzZWNyZXRzOiB7CiAgICAgIFtrZXldOiBuZXdCYWxhbmNlLnRvU3RyaW5nKCksCiAgICB9LAogIH07CiAgYXdhaXQgY2xpZW50LmFjdGlvbi5jcmVhdGVTZWNyZXRzKGJvZHkpOwp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnNvbGUubG9nKGBDcmVhdGluZyBwcm92aWRlciB3aXRoIEFQSSBrZXlzYCk7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnNvbGUubG9nKGBTdGFydGluZyBiYWxhbmNlIG1vbml0b3JpbmcgZm9yIEwxYCk7CgogIGNvbnN0IGwxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGwxVmF1bHRBZGRyZXNzID0gIjB4OTk2MjgyY0ExMUU1REViNkI1RDEyMkNDM0I5QTFGY0FBRDQ0MTVBYiI7CgogIGNvbnN0IGwxVG9rZW5BZGRyZXNzZXMgPSB7CiAgICBFVEg6IG51bGwsCiAgICBUQUlLTzogZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoCiAgICAgICIweDEwZGVhNjc0NzhjNUY4QzVFMkQ5MGU1RTlCMjZkQmU2MGM1NGQ4MDAiLAogICAgKSwKICAgIFVTREM6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweEEwYjg2OTkxYzYyMThiMzZjMWQxOUQ0YTJlOUViMGNFMzYwNmVCNDgiKSwKICAgIFVTRFQ6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweGRBQzE3Rjk1OEQyZWU1MjNhMjIwNjIwNjk5NDU5N0MxM0Q4MzFlYzciKSwKICB9OwoKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgfSk7CgogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5FVEgsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfRVRIIiwKICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgIGV2ZW50LnNlY3JldHMsCiAgICBjbGllbnQsCiAgICAiRVRIIiwKICAgICJMMSIsCiAgKTsKICBhd2FpdCBtb25pdG9yVG9rZW5CYWxhbmNlKAogICAgbDFQcm92aWRlciwKICAgIGwxVG9rZW5BZGRyZXNzZXMuVEFJS08sCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVEFJS08iLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJUQUlLTyIsCiAgICAiTDEiLAogICk7CiAgYXdhaXQgbW9uaXRvclRva2VuQmFsYW5jZSgKICAgIGwxUHJvdmlkZXIsCiAgICBsMVRva2VuQWRkcmVzc2VzLlVTREMsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVVNEQyIsCiAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICBldmVudC5zZWNyZXRzLAogICAgY2xpZW50LAogICAgIlVTREMiLAogICAgIkwxIiwKICApOwogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5VU0RULAogICAgbDFWYXVsdEFkZHJlc3MsCiAgICAicHJldmlvdXNCYWxhbmNlX0wxX1VTRFQiLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJVU0RUIiwKICAgICJMMSIsCiAgKTsKCiAgY29uc29sZS5sb2coYEJhbGFuY2UgbW9uaXRvcmluZyBjb21wbGV0ZWRgKTsKCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAACWEwAAAAA="},{"autotaskId":"9c132973-b8dc-4406-895c-a4ba343455cf","actionId":"9c132973-b8dc-4406-895c-a4ba343455cf","name":"GuardianProver: Approved Count","paused":false,"trigger":{"cron":null,"frequencyMinutes":15,"type":"schedule"},"codeDigest":"uAUUlOAM2ITq1/WSZHtl4SydkwiCxNgrhR21sTpxmfc=","stackResourceId":"mystack.guardian-prover-approved-count","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVCjgTWbWw0AAFsNAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAib3BlcmF0aW9uSWQiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQyNTYiLAogICAgICAgIG5hbWU6ICJhcHByb3ZhbEJpdHMiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogImJvb2wiLAogICAgICAgIG5hbWU6ICJtaW5HdWFyZGlhbnNSZWFjaGVkIiwKICAgICAgICB0eXBlOiAiYm9vbCIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIkFwcHJvdmVkIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfYnJpZGdpbmciLAogICAgc3ViamVjdDogIuKaoO+4jyBHdWFyZGlhblByb3ZlcjogQXBwcm92ZWQgQ291bnQiLAogICAgbWVzc2FnZSwKICB9KTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgcmV0dXJuIGN1cnJlbnRCbG9jay5udW1iZXI7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcikgewogIGNvbnN0IGxhdGVzdEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIGNvbnN0IHByZXZpb3VzQmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jayhsYXRlc3RCbG9jay5udW1iZXIgLSAxMDApOwoKICBjb25zdCB0aW1lRGlmZiA9IGxhdGVzdEJsb2NrLnRpbWVzdGFtcCAtIHByZXZpb3VzQmxvY2sudGltZXN0YW1wOwogIGNvbnN0IGJsb2NrRGlmZiA9IGxhdGVzdEJsb2NrLm51bWJlciAtIHByZXZpb3VzQmxvY2subnVtYmVyOwoKICBjb25zdCBibG9ja1RpbWUgPSB0aW1lRGlmZiAvIGJsb2NrRGlmZjsKICByZXR1cm4gYmxvY2tUaW1lOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1JhbmdlKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrTnVtYmVyID0gYXdhaXQgZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpOwogIGNvbnN0IGJsb2NrVGltZUluU2Vjb25kcyA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcik7CiAgY29uc3QgYmxvY2tzSW5PbmVIb3VyID0gTWF0aC5mbG9vcigoMTYgKiA2MCkgLyBibG9ja1RpbWVJblNlY29uZHMpOwoKICBjb25zdCBmcm9tQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXIgLSBibG9ja3NJbk9uZUhvdXI7CiAgY29uc3QgdG9CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlcjsKCiAgY29uc29sZS5sb2coYENhbGN1bGF0ZWQgYmxvY2sgcmFuZ2U6IGZyb20gJHtmcm9tQmxvY2t9IHRvICR7dG9CbG9ja31gKTsKCiAgcmV0dXJuIHsgZnJvbUJsb2NrLCB0b0Jsb2NrIH07Cn0KCmFzeW5jIGZ1bmN0aW9uIGZldGNoTG9nc0Zyb21MMSgKICBldmVudE5hbWUsCiAgZnJvbUJsb2NrLAogIHRvQmxvY2ssCiAgYWRkcmVzcywKICBhYmksCiAgcHJvdmlkZXIsCikgewogIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoYWJpKTsKICBjb25zdCBldmVudFRvcGljID0gaWZhY2UuZ2V0RXZlbnRUb3BpYyhldmVudE5hbWUpOwogIGNvbnNvbGUubG9nKGBldmVudFRvcGljOiAke2V2ZW50VG9waWN9YCk7CiAgdHJ5IHsKICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCBwcm92aWRlci5nZXRMb2dzKHsKICAgICAgYWRkcmVzcywKICAgICAgZnJvbUJsb2NrLAogICAgICB0b0Jsb2NrLAogICAgICB0b3BpY3M6IFtldmVudFRvcGljXSwKICAgIH0pOwogICAgY29uc29sZS5sb2coYEZldGNoZWQgbG9nczogJHtsb2dzLmxlbmd0aH1gKTsKICAgIHJldHVybiBsb2dzLm1hcCgobG9nKSA9PiB7CiAgICAgIGNvbnN0IHBhcnNlZExvZyA9IGlmYWNlLnBhcnNlTG9nKGxvZyk7CiAgICAgIGNvbnNvbGUubG9nKGBQYXJzZWQgbG9nOiAke0pTT04uc3RyaW5naWZ5KHBhcnNlZExvZyl9YCk7CiAgICAgIHJldHVybiBwYXJzZWRMb2c7CiAgICB9KTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5lcnJvcigiRXJyb3IgZmV0Y2hpbmcgTDEgbG9nczoiLCBlcnJvcik7CiAgICByZXR1cm4gW107CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnN0IGNsaWVudCA9IG5ldyBEZWZlbmRlcih7CiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICByZWxheWVyQXBpS2V5LAogICAgcmVsYXllckFwaVNlY3JldCwKICB9KTsKCiAgcmV0dXJuIGNsaWVudC5yZWxheVNpZ25lci5nZXRQcm92aWRlcigpOwp9CgpleHBvcnRzLmhhbmRsZXIgPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQsIGNvbnRleHQpIHsKICBjb25zdCB7IG5vdGlmaWNhdGlvbkNsaWVudCB9ID0gY29udGV4dDsKICBjb25zdCB7IGFwaUtleSwgYXBpU2VjcmV0LCB0YWlrb0wxQXBpS2V5LCB0YWlrb0wxQXBpU2VjcmV0IH0gPSBldmVudC5zZWNyZXRzOwoKICBjb25zdCB0YWlrb0wxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IHsgZnJvbUJsb2NrLCB0b0Jsb2NrIH0gPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1JhbmdlKHRhaWtvTDFQcm92aWRlcik7CgogIGNvbnN0IGxvZ3MgPSBhd2FpdCBmZXRjaExvZ3NGcm9tTDEoCiAgICAiQXBwcm92ZWQiLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweEUzRDc3NzE0M0VhMjVBNkUwMzFkMWU5MjFGMzk2NzUwODg1ZjQzYUMiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGlmIChsb2dzLmxlbmd0aCA+IDApIHsKICAgIGFsZXJ0T3JnKAogICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgIGBAdGFpa298Z3VhcmRpYW5zIERldGVjdGVkICR7bG9ncy5sZW5ndGh9IEFwcHJvdmVkIGV2ZW50cyBpbiB0aGUgbGFzdCAxNSBtaW5zIG9uIEd1YXJkaWFuIWAsCiAgICApOwogIH0KCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVCjgTWbWw0AAFsNAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAACBDQAAAAA="},{"autotaskId":"3cabb163-79fb-432c-a90a-c111b346a209","actionId":"3cabb163-79fb-432c-a90a-c111b346a209","name":"TaikoL1: BlockProposed Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"vJWyfL6uhkwr/JAecuiNP9OlAKXck8QKPr4RG7swqew=","stackResourceId":"mystack.taiko-l-1-block-proposed-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-05","encodedZippedCode":"UEsDBAoAAAAAAAAAQVDWZSrfwCEAAMAhAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAiYXNzaWduZWRQcm92ZXIiLAogICAgICAgIHR5cGU6ICJhZGRyZXNzIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQ5NiIsCiAgICAgICAgbmFtZTogImxpdmVuZXNzQm9uZCIsCiAgICAgICAgdHlwZTogInVpbnQ5NiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjb21wb25lbnRzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAibDFIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJkaWZmaWN1bHR5IiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJibG9iSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZXh0cmFEYXRhIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJkZXBvc2l0c0hhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICAgICAgbmFtZTogImNvaW5iYXNlIiwKICAgICAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDY0IiwKICAgICAgICAgICAgbmFtZTogImlkIiwKICAgICAgICAgICAgdHlwZTogInVpbnQ2NCIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MzIiLAogICAgICAgICAgICBuYW1lOiAiZ2FzTGltaXQiLAogICAgICAgICAgICB0eXBlOiAidWludDMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQ2NCIsCiAgICAgICAgICAgIG5hbWU6ICJ0aW1lc3RhbXAiLAogICAgICAgICAgICB0eXBlOiAidWludDY0IiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQ2NCIsCiAgICAgICAgICAgIG5hbWU6ICJsMUhlaWdodCIsCiAgICAgICAgICAgIHR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDE2IiwKICAgICAgICAgICAgbmFtZTogIm1pblRpZXIiLAogICAgICAgICAgICB0eXBlOiAidWludDE2IiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJvb2wiLAogICAgICAgICAgICBuYW1lOiAiYmxvYlVzZWQiLAogICAgICAgICAgICB0eXBlOiAiYm9vbCIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogInBhcmVudE1ldGFIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICAgIG5hbWU6ICJzZW5kZXIiLAogICAgICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAic3RydWN0IFRhaWtvRGF0YS5CbG9ja01ldGFkYXRhIiwKICAgICAgICBuYW1lOiAibWV0YSIsCiAgICAgICAgdHlwZTogInR1cGxlIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGNvbXBvbmVudHM6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICAgIG5hbWU6ICJyZWNpcGllbnQiLAogICAgICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50OTYiLAogICAgICAgICAgICBuYW1lOiAiYW1vdW50IiwKICAgICAgICAgICAgdHlwZTogInVpbnQ5NiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgICBuYW1lOiAiaWQiLAogICAgICAgICAgICB0eXBlOiAidWludDY0IiwKICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJzdHJ1Y3QgVGFpa29EYXRhLkV0aERlcG9zaXRbXSIsCiAgICAgICAgbmFtZTogImRlcG9zaXRzUHJvY2Vzc2VkIiwKICAgICAgICB0eXBlOiAidHVwbGVbXSIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIkJsb2NrUHJvcG9zZWQiLAogICAgdHlwZTogImV2ZW50IiwKICB9LAogIHsKICAgIGFub255bW91czogZmFsc2UsCiAgICBpbnB1dHM6IFsKICAgICAgewogICAgICAgIGluZGV4ZWQ6IHRydWUsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDI1NiIsCiAgICAgICAgbmFtZTogImJsb2NrSWQiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IHRydWUsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgbmFtZTogImFzc2lnbmVkUHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50OTYiLAogICAgICAgIG5hbWU6ICJsaXZlbmVzc0JvbmQiLAogICAgICAgIHR5cGU6ICJ1aW50OTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgY29tcG9uZW50czogWwogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImwxSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZGlmZmljdWx0eSIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiYmxvYkhhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImV4dHJhRGF0YSIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZGVwb3NpdHNIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICAgIG5hbWU6ICJjb2luYmFzZSIsCiAgICAgICAgICAgIHR5cGU6ICJhZGRyZXNzIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQ2NCIsCiAgICAgICAgICAgIG5hbWU6ICJpZCIsCiAgICAgICAgICAgIHR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDMyIiwKICAgICAgICAgICAgbmFtZTogImdhc0xpbWl0IiwKICAgICAgICAgICAgdHlwZTogInVpbnQzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgICBuYW1lOiAidGltZXN0YW1wIiwKICAgICAgICAgICAgdHlwZTogInVpbnQ2NCIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgICBuYW1lOiAibDFIZWlnaHQiLAogICAgICAgICAgICB0eXBlOiAidWludDY0IiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQxNiIsCiAgICAgICAgICAgIG5hbWU6ICJtaW5UaWVyIiwKICAgICAgICAgICAgdHlwZTogInVpbnQxNiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJib29sIiwKICAgICAgICAgICAgbmFtZTogImJsb2JVc2VkIiwKICAgICAgICAgICAgdHlwZTogImJvb2wiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJwYXJlbnRNZXRhSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImFkZHJlc3MiLAogICAgICAgICAgICBuYW1lOiAic2VuZGVyIiwKICAgICAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInN0cnVjdCBUYWlrb0RhdGEuQmxvY2tNZXRhZGF0YSIsCiAgICAgICAgbmFtZTogIm1ldGEiLAogICAgICAgIHR5cGU6ICJ0dXBsZSIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjb21wb25lbnRzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImFkZHJlc3MiLAogICAgICAgICAgICBuYW1lOiAicmVjaXBpZW50IiwKICAgICAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDk2IiwKICAgICAgICAgICAgbmFtZTogImFtb3VudCIsCiAgICAgICAgICAgIHR5cGU6ICJ1aW50OTYiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDY0IiwKICAgICAgICAgICAgbmFtZTogImlkIiwKICAgICAgICAgICAgdHlwZTogInVpbnQ2NCIsCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAic3RydWN0IFRhaWtvRGF0YS5FdGhEZXBvc2l0W10iLAogICAgICAgIG5hbWU6ICJkZXBvc2l0c1Byb2Nlc3NlZCIsCiAgICAgICAgdHlwZTogInR1cGxlW10iLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJCbG9ja1Byb3Bvc2VkVjIiLAogICAgdHlwZTogImV2ZW50IiwKICB9LApdOwoKZnVuY3Rpb24gYWxlcnRPcmcobm90aWZpY2F0aW9uQ2xpZW50LCBtZXNzYWdlKSB7CiAgbm90aWZpY2F0aW9uQ2xpZW50LnNlbmQoewogICAgY2hhbm5lbEFsaWFzOiAiZGlzY29yZF9icmlkZ2luZyIsCiAgICBzdWJqZWN0OiAi8J+aqCBUYWlrb0wxOiBCbG9ja1Byb3Bvc2VkIEFsZXJ0IiwKICAgIG1lc3NhZ2UsCiAgfSk7CgogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogInRnX3RhaWtvX2d1YXJkaWFucyIsCiAgICBzdWJqZWN0OiAi8J+aqCBUYWlrb0wxOiBCbG9ja1Byb3Bvc2VkIEFsZXJ0IiwKICAgIG1lc3NhZ2UsCiAgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIHJldHVybiBjdXJyZW50QmxvY2subnVtYmVyOwp9Cgphc3luYyBmdW5jdGlvbiBmZXRjaExvZ3NGcm9tTDEoCiAgZXZlbnROYW1lcywKICBmcm9tQmxvY2ssCiAgdG9CbG9jaywKICBhZGRyZXNzLAogIGFiaSwKICBwcm92aWRlciwKKSB7CiAgY29uc3QgaWZhY2UgPSBuZXcgZXRoZXJzLnV0aWxzLkludGVyZmFjZShhYmkpOwoKICBjb25zdCBhbGxMb2dzID0gW107CgogIGZvciAoY29uc3QgZXZlbnROYW1lIG9mIGV2ZW50TmFtZXMpIHsKICAgIGNvbnN0IGV2ZW50VG9waWMgPSBpZmFjZS5nZXRFdmVudFRvcGljKGV2ZW50TmFtZSk7CgogICAgdHJ5IHsKICAgICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICAgIGFkZHJlc3MsCiAgICAgICAgZnJvbUJsb2NrLAogICAgICAgIHRvQmxvY2ssCiAgICAgICAgdG9waWNzOiBbZXZlbnRUb3BpY10sCiAgICAgIH0pOwoKICAgICAgYWxsTG9ncy5wdXNoKAogICAgICAgIC4uLmxvZ3MubWFwKChsb2cpID0+CiAgICAgICAgICBpZmFjZS5kZWNvZGVFdmVudExvZyhldmVudE5hbWUsIGxvZy5kYXRhLCBsb2cudG9waWNzKSwKICAgICAgICApLAogICAgICApOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZmV0Y2hpbmcgbG9ncyBmb3IgJHtldmVudE5hbWV9OmAsIGVycm9yKTsKICAgIH0KICB9CgogIHJldHVybiBhbGxMb2dzOwp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnN0IGNsaWVudCA9IG5ldyBEZWZlbmRlcih7CiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICByZWxheWVyQXBpS2V5LAogICAgcmVsYXllckFwaVNlY3JldCwKICB9KTsKCiAgcmV0dXJuIGNsaWVudC5yZWxheVNpZ25lci5nZXRQcm92aWRlcigpOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpIHsKICBjb25zdCBsYXRlc3RCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICBjb25zdCBwcmV2aW91c0Jsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2sobGF0ZXN0QmxvY2subnVtYmVyIC0gMTAwKTsKCiAgY29uc3QgdGltZURpZmYgPSBsYXRlc3RCbG9jay50aW1lc3RhbXAgLSBwcmV2aW91c0Jsb2NrLnRpbWVzdGFtcDsKICBjb25zdCBibG9ja0RpZmYgPSBsYXRlc3RCbG9jay5udW1iZXIgLSBwcmV2aW91c0Jsb2NrLm51bWJlcjsKCiAgY29uc3QgYmxvY2tUaW1lID0gdGltZURpZmYgLyBibG9ja0RpZmY7CiAgcmV0dXJuIGJsb2NrVGltZTsKfQoKZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgZnVuY3Rpb24gKGV2ZW50LCBjb250ZXh0KSB7CiAgY29uc3QgeyBub3RpZmljYXRpb25DbGllbnQgfSA9IGNvbnRleHQ7CiAgY29uc3QgeyBhcGlLZXksIGFwaVNlY3JldCwgdGFpa29MMUFwaUtleSwgdGFpa29MMUFwaVNlY3JldCB9ID0gZXZlbnQuc2VjcmV0czsKCiAgY29uc3QgdGFpa29MMVByb3ZpZGVyID0gY3JlYXRlUHJvdmlkZXIoCiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICB0YWlrb0wxQXBpS2V5LAogICAgdGFpa29MMUFwaVNlY3JldCwKICApOwoKICBjb25zdCBjdXJyZW50QmxvY2tOdW1iZXIgPSBhd2FpdCBnZXRMYXRlc3RCbG9ja051bWJlcih0YWlrb0wxUHJvdmlkZXIpOwogIGNvbnN0IGJsb2NrVGltZUluU2Vjb25kcyA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrVGltZSh0YWlrb0wxUHJvdmlkZXIpOwogIGNvbnN0IGJsb2Nrc0luRml2ZU1pbnV0ZXMgPSBNYXRoLmZsb29yKCg1ICogNjApIC8gYmxvY2tUaW1lSW5TZWNvbmRzKTsKCiAgY29uc3QgZnJvbUJsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyIC0gYmxvY2tzSW5GaXZlTWludXRlczsKICBjb25zdCB0b0Jsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyOwoKICBjb25zdCBsb2dzID0gYXdhaXQgZmV0Y2hMb2dzRnJvbUwxKAogICAgWyJCbG9ja1Byb3Bvc2VkIiwgIkJsb2NrUHJvcG9zZWRWMiJdLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweDA2YTlBYjI3YzdlMjI1NWRmMTgxNUU2Q0MwMTY4ZDc3NTVGZWIxOWEiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGNvbnNvbGUubG9nKGBMb2dzIGZvdW5kOiAke2xvZ3MubGVuZ3RofWApOwoKICBpZiAobG9ncy5sZW5ndGggPT09IDApIHsKICAgIGFsZXJ0T3JnKAogICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgIGBObyBCbG9ja1Byb3Bvc2VkIGV2ZW50IGRldGVjdGVkIGluIHRoZSBsYXN0IDE1IG1pbnMgb24gVGFpa29MMSFgLAogICAgKTsKICB9CgogIHJldHVybiB0cnVlOwp9OwpQSwECFAAKAAAAAAAAAEFQ1mUq38AhAADAIQAACAAAAAAAAAAAAAAAAAAAAAAAaW5kZXguanNQSwUGAAAAAAEAAQA2AAAA5iEAAAAA"}]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-20T11:10:56.918Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":false,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ TaikoL1: ProvingPaused Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a"]}],"createdAt":"2024-09-20T10:36:31.684Z","subscriberId":"1bc1012e-54fc-4fbc-8971-54c5b2a5146e","name":"TaikoL1: ProvingPaused Alert","network":"mainnet","monitorId":"1bc1012e-54fc-4fbc-8971-54c5b2a5146e","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-l-1-proving-paused-alert","type":"BLOCK"},{"skipABIValidation":false,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ GuardianProver: GuardiansUpdated Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}],"createdAt":"2024-09-20T10:36:35.701Z","subscriberId":"8e05b9b7-09d2-4b2e-b843-96a62f03c80a","name":"GuardianProver: GuardiansUpdated Alert","network":"mainnet","monitorId":"8e05b9b7-09d2-4b2e-b843-96a62f03c80a","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.guardian-prover-guardians-updated-alert","type":"BLOCK"},{"skipABIValidation":false,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"🚨 GuardianProver: ConflictingProofs Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}],"createdAt":"2024-09-20T10:36:39.801Z","subscriberId":"deb988aa-3550-4690-9f9b-b45486a45af0","name":"GuardianProver: ConflictingProofs Alert","network":"mainnet","monitorId":"deb988aa-3550-4690-9f9b-b45486a45af0","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.guardian-prover-conflicting-proofs-alert","type":"BLOCK"},{"skipABIValidation":false,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ GuardianProver: ProvingAutoPauseEnabled Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}],"createdAt":"2024-09-20T10:36:44.961Z","subscriberId":"cf7ea759-183f-4761-96cc-ec6cf9052d3b","name":"GuardianProver: ProvingAutoPauseEnabled Alert","network":"mainnet","monitorId":"cf7ea759-183f-4761-96cc-ec6cf9052d3b","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.guardian-prover-proving-auto-pause-enabled-alert","type":"BLOCK"},{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} diff --git a/packages/monitors/defender/mainnet/.env.example b/packages/monitors/defender/mainnet/.env.example new file mode 100644 index 00000000000..dc8a45401c3 --- /dev/null +++ b/packages/monitors/defender/mainnet/.env.example @@ -0,0 +1,2 @@ +DEFENDER_API_SECRET= +DEFENDER_API_KEY= diff --git a/packages/monitors/defender/mainnet/README.md b/packages/monitors/defender/mainnet/README.md new file mode 100644 index 00000000000..b0c8dcde464 --- /dev/null +++ b/packages/monitors/defender/mainnet/README.md @@ -0,0 +1,236 @@ +# Defender as Code Serverless Plugin + +Defender as Code (DaC) is a Serverless Framework plugin for automated resource management and configuration as code. + +:warning: This plugin is under development and behavior might change. Handle with care. + +## Prerequisites + +Serverless Framework: https://www.serverless.com/framework/docs/getting-started/ + +## Installation + +You can initialise your Serverless project directly using our pre-configured template: + +``` +sls install --url https://github.com/OpenZeppelin/defender-as-code/tree/main/template -n my-service +``` + +Note: for the command above to work correctly you need access to this repo. + +Alternatively, you can install it directly into an existing project with: + +`yarn add @openzeppelin/defender-as-code` + +## Setup + +There are a few ways you can set up the `serverless.yml` configuration: + +- Create it from scratch; +- Use Defender's 2.0 Serverless export capability; +- Leverage the example [template](https://github.com/OpenZeppelin/defender-as-code/blob/main/template/serverless.yml) provided in the `defender-as-code` repository. + +If you already have resources such as contracts, notifications, relayers, actions, etc. in Defender 2.0, you can export a `serverless.yml` configuration file containing these resources from the manage → advanced page. + +NOTE: If you have previously deployed with `defender-as-code` to the same account and subsequently created new resources through the Defender 2.0 user interface, the export function will automatically assign a `stackResourceId` to the new resources based on the name of your latest deployment stack. If you have not deployed using `defender-as-code` before, a default stack name of `mystack` will be used. + +This plugin allows you to define Actions, Monitors, Notifications, Categories, Relayers, Contracts, Policies and Secrets declaratively from a `serverless.yml` and provision them via the CLI using `serverless deploy`. An example template below with an action, a relayer, a policy and a single relayer API key defined: + +```yaml +service: defender-serverless-template +configValidationMode: error +frameworkVersion: "3" + +provider: + name: defender + stage: ${opt:stage, 'dev'} + stackName: "mystack" + ssot: false + +defender: + key: "${env:TEAM_API_KEY}" + secret: "${env:TEAM_API_SECRET}" + +resources: + actions: + action-example-1: + name: "Hello world from serverless" + path: "./actions/hello-world" + relayer: ${self:resources.relayers.relayer-1} + trigger: + type: "schedule" + frequency: 1500 + paused: false + # optional - unencrypted and scoped to the individual action + environment-variables: + hello: "world!" + action-example-2: 2cbc3f58-d962-4be8-a158-1035be4b661c + + policies: + policy-1: + gas-price-cap: 1000 + whitelist-receivers: + - "0x0f06aB75c7DD497981b75CD82F6566e3a5CAd8f2" + eip1559-pricing: true + + relayers: + relayer-1: + name: "Test Relayer 1" + network: "sepolia" + min-balance: 1000 + policy: ${self:resources.policies.policy-1} + api-keys: + - key1 + +plugins: + - "@openzeppelin/defender-as-code" +``` + +This requires setting the `key` and `secret` under the `defender` property of the YAML file. We recommend using environment variables or a secure (gitignored) configuration file to retrieve these values. Modify the `serverless.yml` accordingly. + +Ensure the Defender Team API Keys are setup with all appropriate API capabilities. + +The `stackName` (e.g. mystack) is combined with the resource key (e.g. relayer-1) to uniquely identify each resource. This identifier is called the `stackResourceId` (e.g. mystack.relayer-1) and allows you to manage multiple deployments within the same Defender team. + +You may also reference existing Defender resources directly by their unique ID (e.g. `2cbc3f58-d962-4be8-a158-1035be4b661c`). These resources will not be managed by the plugin and will be ignored during the deploy process. However, you may reference them in other resources to update their configuration accordingly. + +A list of properties that support direct referencing: + +- `relayer` may reference a `relayerId` in Actions +- `action-trigger` may reference an `actionid` in Monitor +- `action-condition` may reference an `actionId` in Monitor +- `address-from-relayer` may reference a `relayerId` in Relayer +- `notify-config.channels` may reference multiple `notificationId` in Monitor +- `contracts` may be used over `addresses` and reference multiple `contractId` in Monitor + +The following is an example of how a direct reference to a Defender contract and relayer can be used in monitor and action respectively: + +```yaml +... +contracts: + contract-1: 'sepolia-0x62034459131329bE4349A9cc322B03c63806Aa11' # contractId of an existing resource in Defender + +relayers: + relayer-2: 'bcb659c6-7e11-4d37-a15b-0fa9f3d3442c' # relayerId of an existing relayer in Defender + +actions: + action-example-1: + name: 'Hello world from serverless' + path: './actions/hello-world' + relayer: ${self:resources.relayers.relayer-2} + trigger: + type: 'schedule' + frequency: 1500 + paused: false + +monitors: + block-example: + name: 'Block Example' + type: 'BLOCK' + network: 'sepolia' + risk-category: 'TECHNICAL' + # optional - either contracts OR addresses should be defined + contracts: + - ${self:resources.contracts.contract-1} + ... +... +``` + +### SSOT mode + +Under the `provider` property in the `serverless.yml` file, you can optionally add a `ssot` boolean. SSOT or Single Source of Truth, ensures that the state of your stack in Defender is perfectly in sync with the `serverless.yml` template. +This means that all Defender resources, that are not defined in your current template file, are removed from Defender, with the exception of Relayers, upon deployment. If SSOT is not defined in the template, it will default to `false`. + +Any resource removed from the `serverless.yml` file does _not_ get automatically deleted in order to prevent inadvertent resource deletion. For this behaviour to be anticipated, SSOT mode must be enabled. + +### Block Explorer Api Keys + +Exported serverless configurations with Block Explorer Api Keys will not contain the `key` field but instead a `key-hash` field which is a keccak256 hash of the key. This must be replaced with the actual `key` field (and `key-hash` removed) before deploying + +### Secrets (Action) + +Action secrets can be defined both globally and per stack. Secrets defined under `global` are not affected by changes to the `stackName` and will retain when redeployed under a new stack. Secrets defined under `stack` will be removed (on the condition that [SSOT mode](#SSOT-mode) is enabled) when the stack is redeployed under a new `stackName`. To reference secrets defined under `stack`, use the following format: `_`, for example `mystack_test`. + +```yaml +secrets: + # optional - global secrets are not affected by stackName changes + global: + foo: ${self:custom.config.secrets.foo} + hello: ${self:custom.config.secrets.hello} + # optional - stack secrets (formatted as _) + stack: + test: ${self:custom.config.secrets.test} +``` + +### Types and Schema validation + +We provide auto-generated documentation based on the JSON schemas: + +- [Defender Property](https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/docs/defender.md) +- [Provider Property](https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/docs/provider.md) +- [Resources Property](https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/docs/resources.md) + +More information on types can be found [here](https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/index.ts). Specifically, the types preceded with `Y` (e.g. YRelayer). For the schemas, you can check out the [docs-schema](https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/docs-schemas) folder. + +Additionally, an [example project](https://github.com/OpenZeppelin/defender-as-code/blob/main/examples/defender-test-project/serverless.yml) is available which provides majority of properties that can be defined in the `serverless.yml` file. + +## Commands + +### Deploy + +You can use `sls deploy` to deploy your current stack to Defender. + +The deploy takes in an optional `--stage` flag, which is defaulted to `dev` when installed from the template above. + +Moreover, the `serverless.yml` may contain an `ssot` property. More information can be found in the [SSOT mode](#SSOT-mode) section. + +This command will append a log entry in the `.defender` folder of the current working directory. Additionally, if any new relayer keys are created, these will be stored as JSON objects in the `.defender/relayer-keys` folder. + +> When installed from the template, we ensure the `.defender` folder is ignored from any git commits. However, when installing directly, make sure to add this folder it your `.gitignore` file. + +### Info + +You can use `sls info` to retrieve information on every resource defined in the `serverless.yml` file, including unique identifiers, and properties unique to each Defender component. + +### Remove + +You can use `sls remove` to remove all Defender resources defined in the `serverless.yml` file. + +> To avoid potential loss of funds, Relayers can only be deleted from the Defender UI directly. + +### Logs + +You can use `sls logs --function ` to retrieve the latest action logs for a given action identifier (e.g. mystack.action-example-1). This command will run continuously and retrieve logs every 2 seconds. + +### Invoke + +You can use `sls invoke --function ` to manually run an action, given its identifier (e.g. mystack.action-example-1). + +> Each command has a standard output to a JSON object. + +More information can be found on our documentation page [here](https://docs.openzeppelin.com/defender/dac) + +## Caveats + +Errors thrown during the `deploy` process, will not revert any prior changes. Common errors are: + +- Not having set the API key and secret +- Insufficient permissions for the API key +- Validation error of the `serverless.yml` file (see [Types and Schema validation](#Types-and-Schema-validation)) + +Usually, fixing the error and retrying the deploy should suffice as any existing resources will fall within the `update` clause of the deployment. However, if unsure, you can always call `sls remove` to remove the entire stack, and retry. + +Action secrets are encrypted key-value pairs and injected at runtime into the lambda environment. Secrets are scoped to all actions automatically. Alternatively, you may use environment-variables to define key-value pairs that are scoped to the individual action, and available at runtime through `process.env`. Note that these values are not encrypted. + +## Publish a new release + +```bash +npm login +git checkout main +git pull origin main +# increment version in package.json +npm publish +git add package.json +git commit -m 'v{version here}' +git push origin main +``` diff --git a/packages/monitors/defender/mainnet/actions/Bridge-MessageProcessed/index.js b/packages/monitors/defender/mainnet/actions/Bridge-MessageProcessed/index.js new file mode 100644 index 00000000000..06936f591c9 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/Bridge-MessageProcessed/index.js @@ -0,0 +1,312 @@ +const { Defender } = require("@openzeppelin/defender-sdk"); +const ethers = require("ethers"); + +const bridgeAbi = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "msgHash", + type: "bytes32", + }, + { + components: [ + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + { + internalType: "uint64", + name: "fee", + type: "uint64", + }, + { + internalType: "uint32", + name: "gasLimit", + type: "uint32", + }, + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "uint64", + name: "srcChainId", + type: "uint64", + }, + { + internalType: "address", + name: "srcOwner", + type: "address", + }, + { + internalType: "uint64", + name: "destChainId", + type: "uint64", + }, + { + internalType: "address", + name: "destOwner", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + indexed: false, + internalType: "struct IBridge.Message", + name: "message", + type: "tuple", + }, + { + components: [ + { + internalType: "uint32", + name: "gasUsedInFeeCalc", + type: "uint32", + }, + { + internalType: "uint32", + name: "proofSize", + type: "uint32", + }, + { + internalType: "uint32", + name: "numCacheOps", + type: "uint32", + }, + ], + indexed: false, + internalType: "struct Bridge.ProcessingStats", + name: "stats", + type: "tuple", + }, + ], + name: "MessageProcessed", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "msgHash", + type: "bytes32", + }, + { + components: [ + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + { + internalType: "uint64", + name: "fee", + type: "uint64", + }, + { + internalType: "uint32", + name: "gasLimit", + type: "uint32", + }, + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "uint64", + name: "srcChainId", + type: "uint64", + }, + { + internalType: "address", + name: "srcOwner", + type: "address", + }, + { + internalType: "uint64", + name: "destChainId", + type: "uint64", + }, + { + internalType: "address", + name: "destOwner", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + indexed: false, + internalType: "struct IBridge.Message", + name: "message", + type: "tuple", + }, + ], + name: "MessageSent", + type: "event", + }, +]; + +async function getLogsByTopic(notificationClient, l1provider, l2provider) { + const [ + processedMessagesL1, + processedMessagesL2, + sentMessagesL1, + sentMessagesL2, + ] = await Promise.all([ + fetchLogs( + "MessageProcessed", + 1000, + "0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC", + bridgeAbi, + l1provider, + ), + fetchLogs( + "MessageProcessed", + 1000, + "0x1670000000000000000000000000000000000001", + bridgeAbi, + l2provider, + ), + fetchLogs( + "MessageSent", + 1000, + "0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC", + bridgeAbi, + l1provider, + ), + fetchLogs( + "MessageSent", + 1000, + "0x1670000000000000000000000000000000000001", + bridgeAbi, + l2provider, + ), + ]); + + const unmatchedL1 = findUnmatchedMessages( + processedMessagesL1, + sentMessagesL2, + ); + const unmatchedL2 = findUnmatchedMessages( + processedMessagesL2, + sentMessagesL1, + ); + + if (unmatchedL1.length > 0 || unmatchedL2.length > 0) { + const missingCount = unmatchedL1.length + unmatchedL2.length; + alertOrg(notificationClient, missingCount); + } else { + console.log("All messages are matched."); + } +} + +async function fetchLogs(eventName, limit, address, abi, provider) { + const currentBlock = await provider.getBlock("latest"); + const fromBlock = currentBlock.number - limit; + + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock: currentBlock.number, + topics: [eventTopic], + }); + + return logs.map( + (log) => iface.decodeEventLog(eventName, log.data, log.topics).msgHash, + ); + } catch (error) { + console.error(`Error fetching ${eventName} logs:`, error); + return []; + } +} + +function findUnmatchedMessages(processedMessages, sentMessages) { + return processedMessages.filter((msgHash) => !sentMessages.includes(msgHash)); +} + +function alertOrg(notificationClient, missingCount) { + const outputMessage = `@cyberhorsey @soylent_ @xiaodino007 Bridge Health Alert! \nThere are ${missingCount} missing MessageSent events for the processed messages on the other chain.`; + + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "🚨 Bridge: MessageProcessed", + message: outputMessage, + }); +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + taikoL2ApiKey, + taikoL2ApiSecret, + } = event.secrets; + + const l1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + const l2Provider = createProvider( + apiKey, + apiSecret, + taikoL2ApiKey, + taikoL2ApiSecret, + ); + + await getLogsByTopic(notificationClient, l1Provider, l2Provider); + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/ER20Vault-BridgedTokenChanged/index.js b/packages/monitors/defender/mainnet/actions/ER20Vault-BridgedTokenChanged/index.js new file mode 100644 index 00000000000..ba04f4bcfb2 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/ER20Vault-BridgedTokenChanged/index.js @@ -0,0 +1,210 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "srcChainId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "ctoken", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "btokenOld", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "btokenNew", + type: "address", + }, + { + indexed: false, + internalType: "string", + name: "ctokenSymbol", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "ctokenName", + type: "string", + }, + { + indexed: false, + internalType: "uint8", + name: "ctokenDecimal", + type: "uint8", + }, + ], + name: "BridgedTokenChanged", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "⚠️ ER20Vault: BridgedTokenChanged Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogs( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, + networkName, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + + return logs.map((log) => { + const parsedLog = iface.decodeEventLog(eventName, log.data, log.topics); + return { ...parsedLog, network: networkName }; + }); + } catch (error) { + console.error( + `Error fetching logs for ${eventName} on ${networkName}:`, + error, + ); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +function calculateBlockRange( + currentBlockNumber, + blockTimeInSeconds, + minutes = 5, +) { + const blocksInGivenMinutes = Math.floor((minutes * 60) / blockTimeInSeconds); + const fromBlock = currentBlockNumber - blocksInGivenMinutes; + const toBlock = currentBlockNumber; + + return { fromBlock, toBlock }; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + taikoL2ApiKey, + taikoL2ApiSecret, + } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + const taikoL2Provider = createProvider( + apiKey, + apiSecret, + taikoL2ApiKey, + taikoL2ApiSecret, + ); + + const currentBlockNumberL1 = await getLatestBlockNumber(taikoL1Provider); + const currentBlockNumberL2 = await getLatestBlockNumber(taikoL2Provider); + + const blockTimeInSecondsL1 = await calculateBlockTime(taikoL1Provider); + const blockTimeInSecondsL2 = await calculateBlockTime(taikoL2Provider); + + const { fromBlock: fromBlockL1, toBlock: toBlockL1 } = calculateBlockRange( + currentBlockNumberL1, + blockTimeInSecondsL1, + ); + const { fromBlock: fromBlockL2, toBlock: toBlockL2 } = calculateBlockRange( + currentBlockNumberL2, + blockTimeInSecondsL2, + ); + + const logsL1 = await fetchLogs( + "BridgedTokenChanged", + fromBlockL1, + toBlockL1, + "0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab", + ABI, + taikoL1Provider, + "L1", + ); + const logsL2 = await fetchLogs( + "BridgedTokenChanged", + fromBlockL2, + toBlockL2, + "0x1670000000000000000000000000000000000002", + ABI, + taikoL2Provider, + "L2", + ); + + const logs = [...logsL1, ...logsL2]; + + if (logs.length > 0) { + const logDetails = logs + .map( + (log) => + `Network: ${log.network}, Token: ${log.ctoken}, Old Token: ${log.btokenOld}, New Token: ${log.btokenNew}`, + ) + .join("\n"); + alertOrg( + notificationClient, + `BridgedTokenChanged event detected!\nDetails:\n${logDetails}`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/ERC20Vault-BalanceDrop/index.js b/packages/monitors/defender/mainnet/actions/ERC20Vault-BalanceDrop/index.js new file mode 100644 index 00000000000..dd6920e4c23 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/ERC20Vault-BalanceDrop/index.js @@ -0,0 +1,210 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ERC20_ABI = [ + { + constant: true, + inputs: [{ name: "_owner", type: "address" }], + name: "balanceOf", + outputs: [{ name: "balance", type: "uint256" }], + payable: false, + stateMutability: "view", + type: "function", + }, +]; + +async function getERC20Balance(provider, tokenAddress, vaultAddress) { + const contract = new ethers.Contract(tokenAddress, ERC20_ABI, provider); + return await contract.balanceOf(vaultAddress); +} + +async function getNativeTokenBalance(provider, vaultAddress) { + return await provider.getBalance(vaultAddress); +} + +async function monitorTokenBalance( + provider, + tokenAddress, + vaultAddress, + previousBalanceKey, + notificationClient, + secrets, + client, + tokenName, + networkName, +) { + console.log(`Monitoring ${tokenName} balance on ${networkName}`); + const previousBalance = ethers.BigNumber.from( + secrets[previousBalanceKey] || "0", + ); + console.log( + `Previous ${tokenName} Balance: ${ethers.utils.formatUnits( + previousBalance, + 18, + )}`, + ); + + let currentBalance; + if (tokenName === "ETH") { + currentBalance = await getNativeTokenBalance(provider, vaultAddress); + } else { + currentBalance = await getERC20Balance( + provider, + tokenAddress, + vaultAddress, + ); + } + console.log( + `Current ${tokenName} Balance: ${ethers.utils.formatUnits( + currentBalance, + 18, + )}`, + ); + + if (!previousBalance.isZero()) { + const dropPercentage = previousBalance + .sub(currentBalance) + .mul(100) + .div(previousBalance) + .toNumber(); + console.log( + `Calculated drop percentage for ${tokenName}: ${dropPercentage}%`, + ); + + if (dropPercentage >= 5) { + const message = `Alert: ${tokenName} balance has dropped by ${dropPercentage}% on ${networkName}.\nPrevious Balance: ${ethers.utils.formatUnits( + previousBalance, + 18, + )}\nCurrent Balance: ${ethers.utils.formatUnits(currentBalance, 18)}`; + alertOrg( + notificationClient, + `⚠️ ${networkName}: ${tokenName} Balance Drop Alert`, + message, + ); + } else { + console.log( + `No significant ${tokenName} balance drop detected on ${networkName}`, + ); + } + } else { + console.log( + `No previous ${tokenName} balance to compare on ${networkName}`, + ); + } + + await storePreviousBalance(client, previousBalanceKey, currentBalance); +} + +function alertOrg(notificationClient, subject, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject, + message, + }); +} + +async function storePreviousBalance(client, key, newBalance) { + console.log( + `Storing previous balance under key: ${key}, value: ${newBalance.toString()}`, + ); + const body = { + deletes: [], + secrets: { + [key]: newBalance.toString(), + }, + }; + await client.action.createSecrets(body); +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + console.log(`Creating provider with API keys`); + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + console.log(`Starting balance monitoring for L1`); + + const l1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const l1VaultAddress = "0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab"; + + const l1TokenAddresses = { + ETH: null, + TAIKO: ethers.utils.getAddress( + "0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800", + ), + USDC: ethers.utils.getAddress("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"), + USDT: ethers.utils.getAddress("0xdAC17F958D2ee523a2206206994597C13D831ec7"), + }; + + const client = new Defender({ + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + }); + + await monitorTokenBalance( + l1Provider, + l1TokenAddresses.ETH, + l1VaultAddress, + "previousBalance_L1_ETH", + notificationClient, + event.secrets, + client, + "ETH", + "L1", + ); + await monitorTokenBalance( + l1Provider, + l1TokenAddresses.TAIKO, + l1VaultAddress, + "previousBalance_L1_TAIKO", + notificationClient, + event.secrets, + client, + "TAIKO", + "L1", + ); + await monitorTokenBalance( + l1Provider, + l1TokenAddresses.USDC, + l1VaultAddress, + "previousBalance_L1_USDC", + notificationClient, + event.secrets, + client, + "USDC", + "L1", + ); + await monitorTokenBalance( + l1Provider, + l1TokenAddresses.USDT, + l1VaultAddress, + "previousBalance_L1_USDT", + notificationClient, + event.secrets, + client, + "USDT", + "L1", + ); + + console.log(`Balance monitoring completed`); + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/GuardianProver-ApprovedCount/index.js b/packages/monitors/defender/mainnet/actions/GuardianProver-ApprovedCount/index.js new file mode 100644 index 00000000000..ae37c7da0ef --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/GuardianProver-ApprovedCount/index.js @@ -0,0 +1,140 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "operationId", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "approvalBits", + type: "uint256", + }, + { + indexed: false, + internalType: "bool", + name: "minGuardiansReached", + type: "bool", + }, + ], + name: "Approved", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "⚠️ GuardianProver: Approved Count", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +async function calculateBlockRange(provider) { + const currentBlockNumber = await getLatestBlockNumber(provider); + const blockTimeInSeconds = await calculateBlockTime(provider); + const blocksInOneHour = Math.floor((15 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInOneHour; + const toBlock = currentBlockNumber; + + console.log(`Calculated block range: from ${fromBlock} to ${toBlock}`); + + return { fromBlock, toBlock }; +} + +async function fetchLogsFromL1( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + console.log(`eventTopic: ${eventTopic}`); + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + console.log(`Fetched logs: ${logs.length}`); + return logs.map((log) => { + const parsedLog = iface.parseLog(log); + console.log(`Parsed log: ${JSON.stringify(parsedLog)}`); + return parsedLog; + }); + } catch (error) { + console.error("Error fetching L1 logs:", error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const { fromBlock, toBlock } = await calculateBlockRange(taikoL1Provider); + + const logs = await fetchLogsFromL1( + "Approved", + fromBlock, + toBlock, + "0xE3D777143Ea25A6E031d1e921F396750885f43aC", + ABI, + taikoL1Provider, + ); + + if (logs.length > 0) { + alertOrg( + notificationClient, + `@taiko|guardians Detected ${logs.length} Approved events in the last 15 mins on Guardian!`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/GuardianProver-ConflictingProofs/index.js b/packages/monitors/defender/mainnet/actions/GuardianProver-ConflictingProofs/index.js new file mode 100644 index 00000000000..bf9e9e00c8d --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/GuardianProver-ConflictingProofs/index.js @@ -0,0 +1,150 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "guardian", + type: "address", + }, + { + indexed: false, + internalType: "bytes32", + name: "currentProofHash", + type: "bytes32", + }, + { + indexed: false, + internalType: "bytes32", + name: "newProofHash", + type: "bytes32", + }, + { + indexed: false, + internalType: "bool", + name: "provingPaused", + type: "bool", + }, + ], + name: "ConflictingProofs", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "🚨 GuardianProver: ConflictingProofs Alert", + message, + }); + + notificationClient.send({ + channelAlias: "tg_taiko_guardians", + subject: "🚨 GuardianProver: ConflictingProofs Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + + return logs.map((log) => + iface.decodeEventLog(eventName, log.data, log.topics), + ); + } catch (error) { + console.error(`Error fetching logs for ${eventName}:`, error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInFiveMinutes = Math.floor((5 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInFiveMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + "ConflictingProofs", + fromBlock, + toBlock, + "0xE3D777143Ea25A6E031d1e921F396750885f43aC", + ABI, + taikoL1Provider, + ); + + console.log(`Logs found: ${logs.length}`); + + if (logs.length > 0) { + alertOrg( + notificationClient, + `ConflictingProofs event detected! Details: ${JSON.stringify(logs)}`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/GuardianProver-GuardiansUpdated/index.js b/packages/monitors/defender/mainnet/actions/GuardianProver-GuardiansUpdated/index.js new file mode 100644 index 00000000000..e6250747ec3 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/GuardianProver-GuardiansUpdated/index.js @@ -0,0 +1,132 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint32", + name: "version", + type: "uint32", + }, + { + indexed: false, + internalType: "address[]", + name: "guardians", + type: "address[]", + }, + ], + name: "GuardiansUpdated", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "⚠️ GuardianProver: GuardiansUpdated Alert", + message, + }); + + notificationClient.send({ + channelAlias: "tg_taiko_guardians", + subject: "⚠️ GuardianProver: GuardiansUpdated Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + + return logs.map((log) => + iface.decodeEventLog(eventName, log.data, log.topics), + ); + } catch (error) { + console.error(`Error fetching logs for ${eventName}:`, error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInFiveMinutes = Math.floor((5 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInFiveMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + "GuardiansUpdated", + fromBlock, + toBlock, + "0xE3D777143Ea25A6E031d1e921F396750885f43aC", + ABI, + taikoL1Provider, + ); + + console.log(`Logs found: ${logs.length}`); + + if (logs.length > 0) { + alertOrg( + notificationClient, + `GuardiansUpdated event detected! Details: ${JSON.stringify(logs)}`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/GuardianProver-ProvingAutoPauseEnabled/index.js b/packages/monitors/defender/mainnet/actions/GuardianProver-ProvingAutoPauseEnabled/index.js new file mode 100644 index 00000000000..80acbd46f5a --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/GuardianProver-ProvingAutoPauseEnabled/index.js @@ -0,0 +1,127 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bool", + name: "enabled", + type: "bool", + }, + ], + name: "ProvingAutoPauseEnabled", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "⚠️ GuardianProver: ProvingAutoPauseEnabled Alert", + message, + }); + notificationClient.send({ + channelAlias: "tg_taiko_guardians", + subject: "⚠️ GuardianProver: ProvingAutoPauseEnabled Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + + return logs.map((log) => + iface.decodeEventLog(eventName, log.data, log.topics), + ); + } catch (error) { + console.error(`Error fetching logs for ${eventName}:`, error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInFiveMinutes = Math.floor((5 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInFiveMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + "ProvingAutoPauseEnabled", + fromBlock, + toBlock, + "0xE3D777143Ea25A6E031d1e921F396750885f43aC", + ABI, + taikoL1Provider, + ); + + console.log(`Logs found: ${logs.length}`); + + if (logs.length > 0) { + logs.forEach((log) => { + const enabled = log.enabled; + const status = enabled ? "ENABLED" : "DISABLED"; + const message = `Proving Auto-Pause has been ${status}.\n\nDetails:\n- Enabled: ${enabled}\n- Block Number: ${log.blockNumber}`; + alertOrg(notificationClient, message); + }); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/SGXVerifier-verifyProofFailure/index.js b/packages/monitors/defender/mainnet/actions/SGXVerifier-verifyProofFailure/index.js new file mode 100644 index 00000000000..0403697f3e8 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/SGXVerifier-verifyProofFailure/index.js @@ -0,0 +1,107 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const verifyProofSignature = "verifyProof(address,bytes32,bytes32)"; +const verifyProofSelector = ethers.utils + .keccak256(ethers.utils.toUtf8Bytes(verifyProofSignature)) + .substring(0, 10); + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "⚠️ SGXVerifier: verifyProof Failure Alert", + message, + }); +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + return client.relaySigner.getProvider(); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +async function calculateBlockRange(provider, hours = 24) { + const currentBlockNumber = await getLatestBlockNumber(provider); + const blockTimeInSeconds = await calculateBlockTime(provider); + const blocksInTimeFrame = Math.floor((hours * 60 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInTimeFrame; + const toBlock = currentBlockNumber; + + console.log(`Calculated block range: from ${fromBlock} to ${toBlock}`); + + return { fromBlock, toBlock }; +} + +async function monitorTransactions( + provider, + contractAddress, + notificationClient, + hours, +) { + const { fromBlock, toBlock } = await calculateBlockRange(provider, hours); + + const logs = await provider.getLogs({ + fromBlock, + toBlock, + address: contractAddress, + }); + + for (const log of logs) { + const tx = await provider.getTransaction(log.transactionHash); + + if (tx.data.startsWith(verifyProofSelector)) { + const txReceipt = await provider.getTransactionReceipt( + log.transactionHash, + ); + + if (txReceipt && txReceipt.status === 0) { + const message = ` + A failed verifyProof transaction was detected. + - Contract Address: ${log.address} + - Transaction Hash: ${log.transactionHash} + - Block Number: ${txReceipt.blockNumber} + `; + alertOrg(notificationClient, message); + } + } + } +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const contractAddress = "0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"; + + const provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + await monitorTransactions(provider, contractAddress, notificationClient, 24); + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/TaikoL1-BlockProposed/index.js b/packages/monitors/defender/mainnet/actions/TaikoL1-BlockProposed/index.js new file mode 100644 index 00000000000..7ea49a7d858 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/TaikoL1-BlockProposed/index.js @@ -0,0 +1,373 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "assignedProver", + type: "address", + }, + { + indexed: false, + internalType: "uint96", + name: "livenessBond", + type: "uint96", + }, + { + components: [ + { + internalType: "bytes32", + name: "l1Hash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "difficulty", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "blobHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "extraData", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "depositsHash", + type: "bytes32", + }, + { + internalType: "address", + name: "coinbase", + type: "address", + }, + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + { + internalType: "uint32", + name: "gasLimit", + type: "uint32", + }, + { + internalType: "uint64", + name: "timestamp", + type: "uint64", + }, + { + internalType: "uint64", + name: "l1Height", + type: "uint64", + }, + { + internalType: "uint16", + name: "minTier", + type: "uint16", + }, + { + internalType: "bool", + name: "blobUsed", + type: "bool", + }, + { + internalType: "bytes32", + name: "parentMetaHash", + type: "bytes32", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + ], + indexed: false, + internalType: "struct TaikoData.BlockMetadata", + name: "meta", + type: "tuple", + }, + { + components: [ + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "uint96", + name: "amount", + type: "uint96", + }, + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + ], + indexed: false, + internalType: "struct TaikoData.EthDeposit[]", + name: "depositsProcessed", + type: "tuple[]", + }, + ], + name: "BlockProposed", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "assignedProver", + type: "address", + }, + { + indexed: false, + internalType: "uint96", + name: "livenessBond", + type: "uint96", + }, + { + components: [ + { + internalType: "bytes32", + name: "l1Hash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "difficulty", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "blobHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "extraData", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "depositsHash", + type: "bytes32", + }, + { + internalType: "address", + name: "coinbase", + type: "address", + }, + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + { + internalType: "uint32", + name: "gasLimit", + type: "uint32", + }, + { + internalType: "uint64", + name: "timestamp", + type: "uint64", + }, + { + internalType: "uint64", + name: "l1Height", + type: "uint64", + }, + { + internalType: "uint16", + name: "minTier", + type: "uint16", + }, + { + internalType: "bool", + name: "blobUsed", + type: "bool", + }, + { + internalType: "bytes32", + name: "parentMetaHash", + type: "bytes32", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + ], + indexed: false, + internalType: "struct TaikoData.BlockMetadata", + name: "meta", + type: "tuple", + }, + { + components: [ + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "uint96", + name: "amount", + type: "uint96", + }, + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + ], + indexed: false, + internalType: "struct TaikoData.EthDeposit[]", + name: "depositsProcessed", + type: "tuple[]", + }, + ], + name: "BlockProposedV2", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "🚨 TaikoL1: BlockProposed Alert", + message, + }); + + notificationClient.send({ + channelAlias: "tg_taiko_guardians", + subject: "🚨 TaikoL1: BlockProposed Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventNames, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + + const allLogs = []; + + for (const eventName of eventNames) { + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + + allLogs.push( + ...logs.map((log) => + iface.decodeEventLog(eventName, log.data, log.topics), + ), + ); + } catch (error) { + console.error(`Error fetching logs for ${eventName}:`, error); + } + } + + return allLogs; +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInFiveMinutes = Math.floor((15 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInFiveMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + ["BlockProposed", "BlockProposedV2"], + fromBlock, + toBlock, + "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a", + ABI, + taikoL1Provider, + ); + + console.log(`Logs found: ${logs.length}`); + + if (logs.length === 0) { + alertOrg( + notificationClient, + `No BlockProposed event detected in the last 15 mins on TaikoL1!`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/TaikoL1-BlockVerified/index.js b/packages/monitors/defender/mainnet/actions/TaikoL1-BlockVerified/index.js new file mode 100644 index 00000000000..fd3b74def30 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/TaikoL1-BlockVerified/index.js @@ -0,0 +1,187 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "prover", + type: "address", + }, + { + indexed: false, + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + indexed: false, + internalType: "bytes32", + name: "stateRoot", + type: "bytes32", + }, + { + indexed: false, + internalType: "uint16", + name: "tier", + type: "uint16", + }, + ], + name: "BlockVerified", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "prover", + type: "address", + }, + { + indexed: false, + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + indexed: false, + internalType: "bytes32", + name: "stateRoot", + type: "bytes32", + }, + { + indexed: false, + internalType: "uint16", + name: "tier", + type: "uint16", + }, + ], + name: "BlockVerifiedV2", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "🚨 TaikoL1: BlockVerified Alert", + message, + }); + + notificationClient.send({ + channelAlias: "tg_taiko_guardians", + subject: "🚨 TaikoL1: BlockVerified Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventNames, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopics = eventNames.map((eventName) => + iface.getEventTopic(eventName), + ); + + console.log(`eventTopics: ${eventTopics}`); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopics], + }); + + return logs.map((log) => iface.parseLog(log)); + } catch (error) { + console.error("Error fetching L1 logs:", error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInFiveMinutes = Math.floor((30 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInFiveMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + ["BlockVerified", "BlockVerifiedV2"], + fromBlock, + toBlock, + "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a", + ABI, + taikoL1Provider, + ); + + if (logs.length === 0) { + alertOrg( + notificationClient, + `@davidcai @yuea7583 No BlockVerified event detected in the last 30 mins in TaikoL1!`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/TaikoL1-CalldataTxListCount/index.js b/packages/monitors/defender/mainnet/actions/TaikoL1-CalldataTxListCount/index.js new file mode 100644 index 00000000000..2539f4e90bd --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/TaikoL1-CalldataTxListCount/index.js @@ -0,0 +1,138 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes", + name: "txList", + type: "bytes", + }, + ], + name: "CalldataTxList", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "ℹ️ TaikoL1: CalldataTxList Count", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +async function calculateBlockRange(provider) { + const currentBlockNumber = await getLatestBlockNumber(provider); + const blockTimeInSeconds = await calculateBlockTime(provider); + const blocksIn24Hours = Math.floor((24 * 60 * 60) / blockTimeInSeconds); // 24 hours in seconds + + const fromBlock = currentBlockNumber - blocksIn24Hours; + const toBlock = currentBlockNumber; + + console.log(`Calculated block range: from ${fromBlock} to ${toBlock}`); + + return { fromBlock, toBlock }; +} + +async function fetchLogsFromL1( + eventNames, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopics = eventNames.map((eventName) => + iface.getEventTopic(eventName), + ); + + console.log(`eventTopics: ${eventTopics}`); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopics], + }); + console.log(`Fetched logs: ${logs.length}`); + return logs.map((log) => { + const parsedLog = iface.parseLog(log); + console.log(`Parsed log: ${JSON.stringify(parsedLog)}`); + return parsedLog; + }); + } catch (error) { + console.error("Error fetching L1 logs:", error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const { fromBlock, toBlock } = await calculateBlockRange(taikoL1Provider); + + const logs = await fetchLogsFromL1( + ["CalldataTxList"], + fromBlock, + toBlock, + "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a", + ABI, + taikoL1Provider, + ); + + if (logs.length > 0) { + alertOrg( + notificationClient, + `Detected ${logs.length} CalldataTxList events in the last 24 hours on TaikoL1!`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/TaikoL1-ProvingPaused/index.js b/packages/monitors/defender/mainnet/actions/TaikoL1-ProvingPaused/index.js new file mode 100644 index 00000000000..9e52d04f3c8 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/TaikoL1-ProvingPaused/index.js @@ -0,0 +1,120 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bool", + name: "paused", + type: "bool", + }, + ], + name: "ProvingPaused", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "⚠️ TaikoL1: ProvingPaused Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + + return logs.map((log) => + iface.decodeEventLog(eventName, log.data, log.topics), + ); + } catch (error) { + console.error(`Error fetching logs for ${eventName}:`, error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInFiveMinutes = Math.floor((5 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInFiveMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + "ProvingPaused", + fromBlock, + toBlock, + "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a", + ABI, + taikoL1Provider, + ); + + console.log(`Logs found: ${logs.length}`); + + if (logs.length > 0) { + alertOrg( + notificationClient, + `ProvingPaused event detected! Details: ${JSON.stringify(logs)}`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/TaikoL1-TransitionContestedCount/index.js b/packages/monitors/defender/mainnet/actions/TaikoL1-TransitionContestedCount/index.js new file mode 100644 index 00000000000..8c47353c3a5 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/TaikoL1-TransitionContestedCount/index.js @@ -0,0 +1,237 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + components: [ + { + internalType: "bytes32", + name: "parentHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "stateRoot", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "graffiti", + type: "bytes32", + }, + ], + indexed: false, + internalType: "struct TaikoData.Transition", + name: "tran", + type: "tuple", + }, + { + indexed: false, + internalType: "address", + name: "contester", + type: "address", + }, + { + indexed: false, + internalType: "uint96", + name: "contestBond", + type: "uint96", + }, + { + indexed: false, + internalType: "uint16", + name: "tier", + type: "uint16", + }, + ], + name: "TransitionContested", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + components: [ + { + internalType: "bytes32", + name: "parentHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "stateRoot", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "graffiti", + type: "bytes32", + }, + ], + indexed: false, + internalType: "struct TaikoData.Transition", + name: "tran", + type: "tuple", + }, + { + indexed: false, + internalType: "address", + name: "contester", + type: "address", + }, + { + indexed: false, + internalType: "uint96", + name: "contestBond", + type: "uint96", + }, + { + indexed: false, + internalType: "uint16", + name: "tier", + type: "uint16", + }, + ], + name: "TransitionContestedV2", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "ℹ️ TaikoL1: TransitionContested Count", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +async function calculateBlockRange(provider) { + const currentBlockNumber = await getLatestBlockNumber(provider); + const blockTimeInSeconds = await calculateBlockTime(provider); + const blocksInOneHour = Math.floor((60 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInOneHour; + const toBlock = currentBlockNumber; + + console.log(`Calculated block range: from ${fromBlock} to ${toBlock}`); + + return { fromBlock, toBlock }; +} + +async function fetchLogsFromL1( + eventNames, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopics = eventNames.map((eventName) => + iface.getEventTopic(eventName), + ); + + console.log(`eventTopics: ${eventTopics}`); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopics], + }); + console.log(`Fetched logs: ${logs.length}`); + return logs.map((log) => { + const parsedLog = iface.parseLog(log); + console.log(`Parsed log: ${JSON.stringify(parsedLog)}`); + return parsedLog; + }); + } catch (error) { + console.error("Error fetching L1 logs:", error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const { fromBlock, toBlock } = await calculateBlockRange(taikoL1Provider); + + const logs = await fetchLogsFromL1( + ["TransitionContested", "TransitionContestedV2"], + fromBlock, + toBlock, + "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a", + ABI, + taikoL1Provider, + ); + + if (logs.length > 0) { + alertOrg( + notificationClient, + `Detected ${logs.length} TransitionContested and TransitionContestedV2 events in the last hour on TaikoL1!`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/TaikoL1-TransitionProved/index.js b/packages/monitors/defender/mainnet/actions/TaikoL1-TransitionProved/index.js new file mode 100644 index 00000000000..489d8a94542 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/TaikoL1-TransitionProved/index.js @@ -0,0 +1,223 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + components: [ + { + internalType: "bytes32", + name: "parentHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "stateRoot", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "graffiti", + type: "bytes32", + }, + ], + indexed: false, + internalType: "struct TaikoData.Transition", + name: "tran", + type: "tuple", + }, + { + indexed: false, + internalType: "address", + name: "prover", + type: "address", + }, + { + indexed: false, + internalType: "uint96", + name: "validityBond", + type: "uint96", + }, + { + indexed: false, + internalType: "uint16", + name: "tier", + type: "uint16", + }, + ], + name: "TransitionProved", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + components: [ + { + internalType: "bytes32", + name: "parentHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "stateRoot", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "graffiti", + type: "bytes32", + }, + ], + indexed: false, + internalType: "struct TaikoData.Transition", + name: "tran", + type: "tuple", + }, + { + indexed: false, + internalType: "address", + name: "prover", + type: "address", + }, + { + indexed: false, + internalType: "uint96", + name: "validityBond", + type: "uint96", + }, + { + indexed: false, + internalType: "uint16", + name: "tier", + type: "uint16", + }, + ], + name: "TransitionProvedV2", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "🚨 TaikoL1: TransitionProved Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventNames, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopics = eventNames.map((eventName) => + iface.getEventTopic(eventName), + ); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopics], + }); + console.log("Raw logs fetched:", logs); + return logs.map((log) => iface.parseLog(log)); + } catch (error) { + console.error("Error fetching L1 logs:", error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInThirtyMinutes = Math.floor((30 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInThirtyMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + ["TransitionProved", "TransitionProvedV2"], + fromBlock, + toBlock, + "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a", + ABI, + taikoL1Provider, + ); + + if (logs.length === 0) { + alertOrg( + notificationClient, + `No TransitionProved event detected in the last 30 mins on TaikoL1!`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/Vaults-BridgedTokenDeployed/index.js b/packages/monitors/defender/mainnet/actions/Vaults-BridgedTokenDeployed/index.js new file mode 100644 index 00000000000..53dcf85a248 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/Vaults-BridgedTokenDeployed/index.js @@ -0,0 +1,332 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABIs = { + ERC1155Vault: [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint64", + name: "chainId", + type: "uint64", + }, + { + indexed: true, + internalType: "address", + name: "ctoken", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "btoken", + type: "address", + }, + { + indexed: false, + internalType: "string", + name: "ctokenSymbol", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "ctokenName", + type: "string", + }, + ], + name: "BridgedTokenDeployed", + type: "event", + }, + ], + ERC721Vault: [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint64", + name: "chainId", + type: "uint64", + }, + { + indexed: true, + internalType: "address", + name: "ctoken", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "btoken", + type: "address", + }, + { + indexed: false, + internalType: "string", + name: "ctokenSymbol", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "ctokenName", + type: "string", + }, + ], + name: "BridgedTokenDeployed", + type: "event", + }, + ], + ERC20Vault: [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "srcChainId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "ctoken", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "btoken", + type: "address", + }, + { + indexed: false, + internalType: "string", + name: "ctokenSymbol", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "ctokenName", + type: "string", + }, + { + indexed: false, + internalType: "uint8", + name: "ctokenDecimal", + type: "uint8", + }, + ], + name: "BridgedTokenDeployed", + type: "event", + }, + ], +}; + +function alertOrg(notificationClient, subject, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: subject, + message: message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +async function calculateBlockRange(provider) { + const currentBlockNumber = await getLatestBlockNumber(provider); + const blockTimeInSeconds = await calculateBlockTime(provider); + const blocksIn24Hours = Math.floor((24 * 60 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksIn24Hours; + const toBlock = currentBlockNumber; + + console.log(`Calculated block range: from ${fromBlock} to ${toBlock}`); + + return { fromBlock, toBlock }; +} + +async function fetchLogs( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + console.log(`eventTopic: ${eventTopic}`); + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + console.log(`Fetched logs: ${logs.length}`); + return logs.map((log) => { + const parsedLog = iface.parseLog(log); + console.log(`Parsed log: ${JSON.stringify(parsedLog)}`); + return parsedLog; + }); + } catch (error) { + console.error("Error fetching logs:", error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function monitorEvent( + provider, + eventName, + fromBlock, + toBlock, + contractAddress, + abi, + subject, + notificationClient, +) { + const logs = await fetchLogs( + eventName, + fromBlock, + toBlock, + contractAddress, + abi, + provider, + ); + const eventCount = logs.length; + + if (eventCount > 0) { + const alertMessage = `ℹ️ Detected ${eventCount} ${subject} events on ${provider.network.name} in the last 24 hours!`; + alertOrg(notificationClient, subject, alertMessage); + } + + return; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + taikoL2ApiKey, + taikoL2ApiSecret, + } = event.secrets; + + const l1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + const l2Provider = createProvider( + apiKey, + apiSecret, + taikoL2ApiKey, + taikoL2ApiSecret, + ); + + const { fromBlock: l1FromBlock, toBlock: l1ToBlock } = + await calculateBlockRange(l1Provider); + const { fromBlock: l2FromBlock, toBlock: l2ToBlock } = + await calculateBlockRange(l2Provider); + + await monitorEvent( + l1Provider, + "BridgedTokenDeployed", + l1FromBlock, + l1ToBlock, + "0xaf145913EA4a56BE22E120ED9C24589659881702", // L1 + ABIs.ERC1155Vault, + " ERC1155Vault.BridgedTokenDeployed", + notificationClient, + ); + + await monitorEvent( + l2Provider, + "BridgedTokenDeployed", + l2FromBlock, + l2ToBlock, + "0x1670000000000000000000000000000000000004", // L2 + ABIs.ERC1155Vault, + " ERC1155Vault.BridgedTokenDeployed", + notificationClient, + ); + + await monitorEvent( + l1Provider, + "BridgedTokenDeployed", + l1FromBlock, + l1ToBlock, + "0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa", // L1 + ABIs.ERC721Vault, + " ERC721Vault.BridgedTokenDeployed", + notificationClient, + ); + + await monitorEvent( + l2Provider, + "BridgedTokenDeployed", + l2FromBlock, + l2ToBlock, + "0x1670000000000000000000000000000000000003", // L2 + ABIs.ERC721Vault, + " ERC721Vault.BridgedTokenDeployed", + notificationClient, + ); + + await monitorEvent( + l1Provider, + "BridgedTokenDeployed", + l1FromBlock, + l1ToBlock, + "0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab", // L1 + ABIs.ERC20Vault, + " ERC20Vault.BridgedTokenDeployed", + notificationClient, + ); + + await monitorEvent( + l2Provider, + "BridgedTokenDeployed", + l2FromBlock, + l2ToBlock, + "0x1670000000000000000000000000000000000002", // L2 + ABIs.ERC20Vault, + " ERC20Vault.BridgedTokenDeployed", + notificationClient, + ); + + return true; +}; diff --git a/packages/monitors/defender/mainnet/serverless.yml b/packages/monitors/defender/mainnet/serverless.yml new file mode 100644 index 00000000000..78cb450766a --- /dev/null +++ b/packages/monitors/defender/mainnet/serverless.yml @@ -0,0 +1,912 @@ +service: taiko-defender-as-code +configValidationMode: error +frameworkVersion: "3" + +useDotenv: true + +provider: + name: defender + stage: ${opt:stage, 'dev'} + stackName: mystack + ssot: false + +defender: + key: ${env:DEFENDER_API_KEY} + secret: ${env:DEFENDER_API_SECRET} + +resources: + actions: + erc-20-vault-balance-drop: + name: "ERC20Vault: Balance Drop" + trigger: + type: schedule + frequency: 15 + paused: false + path: ./actions/ERC20Vault-BalanceDrop + + sgx-verifier-verify-proof-failure-alert: + name: "SGXVerifier: VerifyProof failure Alert" + trigger: + type: schedule + frequency: 5 + paused: false + path: ./actions/SGXVerifier-verifyProofFailure + + vaults-bridged-token-deployed: + name: "Vaults: BridgedTokenDeployed" + trigger: + type: schedule + frequency: 1440 + paused: false + path: ./actions/Vaults-BridgedTokenDeployed + + er-20-vault-bridged-token-changed: + name: "ER20Vault : BridgedTokenChanged" + trigger: + type: schedule + frequency: 4 + paused: false + path: ./actions/ER20Vault-BridgedTokenChanged + + bridge-message-processed: + name: "Bridge: MessageProcessed" + trigger: + type: schedule + frequency: 15 + paused: false + path: ./actions/Bridge-MessageProcessed + + taiko-l-1-calldata-tx-list-count: + name: "TaikoL1: CalldataTxList Count" + trigger: + type: schedule + frequency: 1440 + paused: false + path: ./actions/TaikoL1-CalldataTxListCount + + guardian-prover-approved-count: + name: "GuardianProver: Approved Count" + trigger: + type: schedule + frequency: 15 + paused: false + path: ./actions/GuardianProver-ApprovedCount + + taiko-l-1-transition-contested-count: + name: "TaikoL1: TransitionContested Count" + trigger: + type: schedule + frequency: 60 + paused: false + path: ./actions/TaikoL1-TransitionContestedCount + + taiko-l-1-transition-proved-alert: + name: "TaikoL1: TransitionProved Alert" + trigger: + type: schedule + frequency: 4 + paused: false + path: ./actions/TaikoL1-TransitionProved + + taiko-l-1-block-verified-alert: + name: "TaikoL1: BlockVerified Alert" + trigger: + type: schedule + frequency: 4 + paused: false + path: ./actions/TaikoL1-BlockVerified + + taiko-l-1-block-proposed-alert: + name: "TaikoL1: BlockProposed Alert" + trigger: + type: schedule + frequency: 4 + paused: false + path: ./actions/TaikoL1-BlockProposed + + policies: + policy-ts: + eip1559-pricing: true + policy-rA: + eip1559-pricing: true + contracts: + pem-cert-chain-lib: + name: pem_cert_chain_lib + address: "0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169" + network: mainnet + taiko-l-1: + name: taikoL1 + address: "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a" + network: mainnet + erc-721-vault: + name: erc721_vault + address: "0x1670000000000000000000000000000000000003" + network: taikol2 + taiko-token: + name: taiko_token + address: "0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800" + network: mainnet + p-256-verifier: + name: p256_verifier + address: "0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0" + network: mainnet + tier-provider: + name: tierProvider + address: "0x33879cDF01121dc7bCe011b461e64d791aE931F2" + network: mainnet + bridged-erc-1155: + name: bridged_erc1155 + address: "0x39E4C1214e733639d059979079A151911e42791d" + network: mainnet + sig-verify-lib: + name: sig_verify_lib + address: "0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9" + network: mainnet + assignment-hook: + name: assignmentHook + address: "0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6" + network: mainnet + guardian-prover-minority: + name: guardian_prover_minority + address: "0x579A8d63a2Db646284CBFE31FE5082c9989E985c" + network: mainnet + rollup-address-manager: + name: rollup_address_manager + address: "0x1670000000000000000000000000000000010002" + network: taikol2 + automata-dcap-attestation: + name: automata_dcap_attestation + address: "0x8d7C954960a36a7596d7eA4945dDf891967ca8A3" + network: mainnet + erc-20-vault: + name: erc20_vault + address: "0x1670000000000000000000000000000000000002" + network: taikol2 + signal-service: + name: signal_service + address: "0x1670000000000000000000000000000000000005" + network: taikol2 + guardian-prover: + name: guardian_prover + address: "0xE3D777143Ea25A6E031d1e921F396750885f43aC" + network: mainnet + shared-address-manager: + name: shared_address_manager + address: "0x1670000000000000000000000000000000000006" + network: taikol2 + erc-1155-vault: + name: erc1155_vault + address: "0x1670000000000000000000000000000000000004" + network: taikol2 + tier-sgx: + name: tier_sgx + address: "0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81" + network: mainnet + bridged-erc-721: + name: bridged_erc721 + address: "0xc4096E9ff1526Bd1840B65e9f45695135aC12De7" + network: mainnet + bridged-erc-20: + name: bridged_erc20 + address: "0xcc5d488073FA918cBbd73B9A523F3858C4de7372" + network: mainnet + bridge: + name: bridge + address: "0x1670000000000000000000000000000000000001" + network: taikol2 + taiko-l-2: + name: taikoL2 + address: "0x1670000000000000000000000000000000010001" + network: taikol2 + relayers: + taiko-l-2-relayer: + name: TaikoL2Relayer + network: taikol2 + min-balance: "100000000000000000" + policy: ${self:resources.policies.policy-Qe} + api-keys: + - key-1 + taiko-l-1-relayer: + name: TaikoL1Relayer + network: mainnet + min-balance: "100000000000000000" + policy: ${self:resources.policies.policy-hk} + api-keys: + - key-1 + notifications: + discord-bridging: + type: discord + name: discord_bridging + config: + url: >- + https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s + paused: false + monitors: + taiko-l-1-prove-block-tx-failure: + name: "TaikoL1: proveBlock Tx Failure" + type: BLOCK + network: mainnet + addresses: + - "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a" + skip-abi-validation: true + paused: false + confirm-level: 6 + notify-config: + timeout: 0 + message: >- + **Defender Monitor {{ monitor.name }} Triggered an Alert at {{ + timestamp }}** + + + **Network:** {{ monitor.network }} + + + **Block Hash:** {{ blockHash }} + + + **Transaction Hash:** {{ transaction.transactionHash }} + + + **Explorer Link:** {{ transaction.link }} + + + **Match Reasons** + + + {{ matchReasonsFormatted }} + + + **Metadata** + + + {{ metadataFormatted }} + message-subject: "[Alert] OpenZeppelin Defender Monitor TaikoL1: proveBlock Tx Failure" + channels: + - ${self:resources.notifications.tg-taiko-guardians} + - ${self:resources.notifications.discord-bridging} + severity-level: HIGH + conditions: + event: + - expression: null + signature: >- + BlockProposed(uint256,address,uint96,(bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address),(address,uint96,uint64)[]) + function: + - expression: null + signature: proveBlock(uint64,bytes) + transaction: >- + (status == "failed") AND (from == + "0x000000629FBCf27A347d1AEbA658435230D74a5f" OR from == + "0x000000633b68f5d8d3a86593ebb815b4663bcbe0" OR from == + "0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B") + taiko-l-1-proposed-block-tx-failure: + name: "TaikoL1: ProposedBlock Tx Failure" + type: BLOCK + network: mainnet + addresses: + - "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a" + skip-abi-validation: true + paused: false + confirm-level: 1 + notify-config: + timeout: 0 + message: >- + **Defender Monitor {{ monitor.name }} Triggered an Alert at {{ + timestamp }}** + + + **Network:** {{ monitor.network }} + + + **Block Hash:** {{ blockHash }} + + + **Transaction Hash:** {{ transaction.transactionHash }} + + + **Explorer Link:** {{ transaction.link }} + + + **Match Reasons** + + + {{ matchReasonsFormatted }} + + + **Metadata** + + + {{ metadataFormatted }} + message-subject: >- + [Alert] OpenZeppelin Defender Monitor TaikoL1: ProposedBlock Tx + Failure + channels: + - ${self:resources.notifications.discord-bridging} + - ${self:resources.notifications.tg-taiko-guardians} + severity-level: HIGH + conditions: + event: + - expression: null + signature: >- + BlockProposed(uint256,address,uint96,(bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address),(address,uint96,uint64)[]) + function: + - expression: null + signature: proposeBlock(bytes,bytes) + transaction: >- + (status == "failed") AND (from == + "0x000000629FBCf27A347d1AEbA658435230D74a5f" OR from == + "0x000000633b68f5d8d3a86593ebb815b4663bcbe0" OR from == + "0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B") + guardian-prover-proving-auto-pause-enabled-alert: + name: "GuardianProver: ProvingAutoPauseEnabled" + type: BLOCK + network: mainnet + addresses: + - "0xE3D777143Ea25A6E031d1e921F396750885f43aC" + skip-abi-validation: false + paused: false + confirm-level: 6 + notify-config: + timeout: 60000 + message: >- + **Defender Monitor {{ monitor.name }} Triggered an Alert at {{ + timestamp }}** + + + **Network:** {{ monitor.network }} + + + **Block Hash:** {{ blockHash }} + + + **Transaction Hash:** {{ transaction.transactionHash }} + + + **Explorer Link:** {{ transaction.link }} + + + **Match Reasons** + + + {{ matchReasonsFormatted }} + + + **Metadata** + + + {{ metadataFormatted }} + message-subject: >- + [Alert] OpenZeppelin Defender Monitor GuardianProver: + ProvingAutoPauseEnabled + channels: + - ${self:resources.notifications.discord-bridging} + - ${self:resources.notifications.tg-taiko-guardians} + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: GuardiansUpdated(uint32,address[]) + guardian-prover-conflicting-proofs-alert: + name: "GuardianProver: ConflictingProofs Alert" + type: BLOCK + network: mainnet + addresses: + - "0xE3D777143Ea25A6E031d1e921F396750885f43aC" + skip-abi-validation: false + paused: false + confirm-level: 1 + notify-config: + timeout: 60000 + message: >- + **Defender Monitor {{ monitor.name }} Triggered an Alert at {{ + timestamp }}** + + + **Network:** {{ monitor.network }} + + + **Block Hash:** {{ blockHash }} + + + **Transaction Hash:** {{ transaction.transactionHash }} + + + **Explorer Link:** {{ transaction.link }} + + + **Match Reasons** + + + {{ matchReasonsFormatted }} + + + **Metadata** + + + {{ metadataFormatted }} + message-subject: >- + [Alert] OpenZeppelin Defender Monitor GuardianProver: + ConflictingProofs Alert + channels: + - ${self:resources.notifications.discord-bridging} + - ${self:resources.notifications.tg-taiko-guardians} + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: ConflictingProofs(uint256,address,bytes32,bytes32,bool) + guardian-prover-guardians-updated-alert: + name: "GuardianProver: GuardiansUpdated Alert" + type: BLOCK + network: mainnet + addresses: + - "0xE3D777143Ea25A6E031d1e921F396750885f43aC" + skip-abi-validation: false + paused: false + confirm-level: 1 + notify-config: + timeout: 60000 + message: >- + **Defender Monitor {{ monitor.name }} Triggered an Alert at {{ + timestamp }}** + + + **Network:** {{ monitor.network }} + + + **Block Hash:** {{ blockHash }} + + + **Transaction Hash:** {{ transaction.transactionHash }} + + + **Explorer Link:** {{ transaction.link }} + + + **Match Reasons** + + + {{ matchReasonsFormatted }} + + + **Metadata** + + + {{ metadataFormatted }} + message-subject: >- + [Alert] OpenZeppelin Defender Monitor GuardianProver: GuardiansUpdated + Alert + channels: + - ${self:resources.notifications.discord-bridging} + - ${self:resources.notifications.tg-taiko-guardians} + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: GuardiansUpdated(uint32,address[]) + taiko-l-1-proving-paused-alert: + name: "TaikoL1: ProvingPaused Alert" + type: BLOCK + network: mainnet + addresses: + - "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a" + skip-abi-validation: false + paused: false + confirm-level: 6 + notify-config: + timeout: 60000 + message: >- + **Defender Monitor {{ monitor.name }} Triggered an Alert at {{ + timestamp }}** + + + **Network:** {{ monitor.network }} + + + **Block Hash:** {{ blockHash }} + + + **Transaction Hash:** {{ transaction.transactionHash }} + + + **Explorer Link:** {{ transaction.link }} + + + **Match Reasons** + + + {{ matchReasonsFormatted }} + + + **Metadata** + + + {{ metadataFormatted }} + message-subject: "[Alert] OpenZeppelin Defender Monitor TaikoL1: ProvingPaused Alert" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: HIGH + conditions: + event: + - expression: null + signature: ProvingPaused(bool) + address-manager-l-2-address-set: + name: "Address Manager (L2): AddressSet" + type: BLOCK + network: taikol2 + addresses: + - "0x1670000000000000000000000000000000000006" + - "0x1670000000000000000000000000000000010002" + skip-abi-validation: false + paused: false + confirm-level: 1 + notify-config: + timeout: 60000 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + **Match Reasons** + + {{ matchReasonsFormatted }} + + **Metadata** + + {{ metadataFormatted }} + message-subject: "Defender Monitor: Address Manager (L2): AddressSet triggered" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: AddressSet(uint64,bytes32,address,address) + address-manager-l-1-address-set: + name: "Address Manager (L1): AddressSet" + type: BLOCK + network: mainnet + addresses: + - "0x579f40D0BE111b823962043702cabe6Aaa290780" + - "0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa" + skip-abi-validation: false + paused: true + confirm-level: 9007199254740991 + notify-config: + timeout: 60000 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + **Match Reasons** + + {{ matchReasonsFormatted }} + + **Metadata** + + {{ metadataFormatted }} + message-subject: "Defender Monitor: Address Manager (L1): AddressSet triggered" + channels: [] + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: AddressSet(uint64,bytes32,address,address) + taiko-l-2-pause-unpause: + name: "TaikoL2: Pause/Unpause" + type: BLOCK + network: taikol2 + addresses: + - "0xbd0999f42742ed29d3311fc5fb5c609be008e9e5" + - "0x1670000000000000000000000000000000000001" + - "0x1670000000000000000000000000000000000002" + - "0x1670000000000000000000000000000000000003" + - "0x1670000000000000000000000000000000000004" + - "0x1670000000000000000000000000000000000005" + - "0x1670000000000000000000000000000000000006" + - "0x1670000000000000000000000000000000010001" + - "0x1670000000000000000000000000000000010002" + skip-abi-validation: true + paused: false + confirm-level: 1 + notify-config: + timeout: 60000 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + **Match Reasons** + + {{ matchReasonsFormatted }} + + **Metadata** + + {{ metadataFormatted }} + message-subject: "Defender Monitor: TaikoL2: Pause/Unpause triggered" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: Paused(address) + - expression: null + signature: Unpaused(address) + taiko-l-1-pause-unpause: + name: "TaikoL1: Pause/Unpause" + type: BLOCK + network: mainnet + addresses: + - "0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169" + - "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a" + - "0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa" + - "0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800" + - "0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0" + - "0x33879cDF01121dc7bCe011b461e64d791aE931F2" + - "0x39E4C1214e733639d059979079A151911e42791d" + - "0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9" + - "0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6" + - "0x579A8d63a2Db646284CBFE31FE5082c9989E985c" + - "0x579f40D0BE111b823962043702cabe6Aaa290780" + - "0x67281b15aee4d6b805bc755e439abd524dd8da8d" + - "0x8d7C954960a36a7596d7eA4945dDf891967ca8A3" + - "0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab" + - "0x9e0a24964e5397B566c1ed39258e21aB5E35C77C" + - "0xE3D777143Ea25A6E031d1e921F396750885f43aC" + - "0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa" + - "0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e" + - "0xaf145913EA4a56BE22E120ED9C24589659881702" + - "0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81" + - "0xc4096E9ff1526Bd1840B65e9f45695135aC12De7" + - "0xcc5d488073FA918cBbd73B9A523F3858C4de7372" + - "0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC" + skip-abi-validation: true + paused: false + confirm-level: 6 + notify-config: + timeout: 60000 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + **Match Reasons** + + {{ matchReasonsFormatted }} + + **Metadata** + + {{ metadataFormatted }} + message-subject: "Defender Monitor: TaikoL1: Pause/Unpause triggered" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: Paused(address) + - expression: null + signature: Unpaused(address) + taiko-mainnet-sgx-prover: + name: Taiko Mainnet SGX Prover + type: BLOCK + network: mainnet + addresses: + - "0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81" + skip-abi-validation: false + paused: false + confirm-level: 1 + notify-config: + timeout: 0 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + {{ matchReasonsFormatted }} + message-subject: "Defender Monitor: Taiko Mainnet SGX Prover triggered" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: LOW + conditions: + event: + - expression: null + signature: InstanceAdded(uint256,address,address,uint256) + - expression: null + signature: InstanceDeleted(uint256,address) + function: + - expression: null + signature: >- + verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes)) + transaction: status == "failed" + taiko-mainnet-address-managers: + name: Taiko Mainnet Address Managers + type: BLOCK + network: mainnet + addresses: + - "0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa" + - "0x579f40D0BE111b823962043702cabe6Aaa290780" + skip-abi-validation: false + paused: false + confirm-level: 1 + notify-config: + timeout: 0 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + {{ matchReasonsFormatted }} + message-subject: "Defender Monitor: Taiko Mainnet Address Managers triggered" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: HIGH + conditions: + event: + - expression: null + signature: AddressSet(uint64,bytes32,address,address) + taiko-mainnet-essential-contracts: + name: Taiko Mainnet Essential Contracts + type: BLOCK + network: mainnet + addresses: + - "0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa" + - "0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800" + - "0x9e0a24964e5397B566c1ed39258e21aB5E35C77C" + - "0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC" + - "0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab" + - "0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa" + - "0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa" + - "0xaf145913EA4a56BE22E120ED9C24589659881702" + - "0x579f40D0BE111b823962043702cabe6Aaa290780" + - "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a" + - "0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6" + - "0x33879cDF01121dc7bCe011b461e64d791aE931F2" + - "0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81" + - "0x579A8d63a2Db646284CBFE31FE5082c9989E985c" + - "0xE3D777143Ea25A6E031d1e921F396750885f43aC" + - "0x8d7C954960a36a7596d7eA4945dDf891967ca8A3" + skip-abi-validation: false + paused: false + confirm-level: 1 + notify-config: + timeout: 0 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + {{ matchReasonsFormatted }} + message-subject: "Defender Monitor: Taiko Mainnet Essential Contracts triggered" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: HIGH + conditions: + event: + - expression: null + signature: AdminChanged(address,address) + - expression: null + signature: BeaconUpgraded(address) + - expression: null + signature: Initialized(uint8) + - expression: null + signature: OwnershipTransferStarted(address,address) + - expression: null + signature: OwnershipTransferred(address,address) + - expression: null + signature: Paused(address) + - expression: null + signature: Unpaused(address) + - expression: null + signature: Upgraded(address) + forked-networks: {} + private-networks: + taikol2: + name: taikol2 + rpc-url: https://rpc.mainnet.taiko.xyz + configuration: + symbol: ETH + eips: + isEIP1559: true + block-explorer-api-keys: {} +plugins: + - "@openzeppelin/defender-as-code" diff --git a/packages/monitors/package.json b/packages/monitors/package.json new file mode 100644 index 00000000000..fa01b245454 --- /dev/null +++ b/packages/monitors/package.json @@ -0,0 +1,16 @@ +{ + "name": "monitors", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@openzeppelin/defender-as-code": "^3.0.1", + "serverless": "4.4.3" + } +} diff --git a/packages/nfts/README.md b/packages/nfts/README.md index fa7c0c91fb8..af6f8cd3fe8 100644 --- a/packages/nfts/README.md +++ b/packages/nfts/README.md @@ -2,7 +2,7 @@ ## Setup -To run in localhost, first, start an Anvil node: +To run on localhost, first, start an Anvil node: ```shell $ pnpm node @@ -20,7 +20,7 @@ $ pnpm install # installs the workspace's dependencies ## Deploying the Taikoons -In order to deploy the token, the images for the NFTs must be placed under `data/original/`. The following script will re-size them and upload them to IPFS: +In order to deploy the token, the images for the NFTs must be placed under `data/original/`. The following script will resize them and upload them to IPFS: ```shell $ pnpm deploy:ipfs diff --git a/packages/nfts/contract_layout.md b/packages/nfts/contract_layout.md new file mode 100644 index 00000000000..01a91eacf3f --- /dev/null +++ b/packages/nfts/contract_layout.md @@ -0,0 +1,56 @@ +## MerkleWhitelist + +| Name | Type | Slot | Offset | Bytes | Contract | +| --------- | -------------------------- | ---- | ------ | ----- | ------------------------------------------------------ | +| root | bytes32 | 0 | 0 | 32 | contracts/snaefell/MerkleWhitelist.sol:MerkleWhitelist | +| minted | mapping(bytes32 => bool) | 1 | 0 | 32 | contracts/snaefell/MerkleWhitelist.sol:MerkleWhitelist | +| blacklist | contract IMinimalBlacklist | 2 | 0 | 20 | contracts/snaefell/MerkleWhitelist.sol:MerkleWhitelist | +| \_\_gap | uint256[48] | 3 | 0 | 1536 | contracts/snaefell/MerkleWhitelist.sol:MerkleWhitelist | + +## TaikoonToken + +| Name | Type | Slot | Offset | Bytes | Contract | +| ----------------- | -------------------------- | ---- | ------ | ----- | ----------------------------------------------- | +| root | bytes32 | 0 | 0 | 32 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | +| minted | mapping(bytes32 => bool) | 1 | 0 | 32 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | +| blacklist | contract IMinimalBlacklist | 2 | 0 | 20 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | +| \_\_gap | uint256[47] | 3 | 0 | 1504 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | +| \_totalSupply | uint256 | 50 | 0 | 32 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | +| \_baseURIExtended | string | 51 | 0 | 32 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | +| \_\_gap | uint256[47] | 52 | 0 | 1504 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | + +## SnaefellToken + +| Name | Type | Slot | Offset | Bytes | Contract | +| ----------------- | -------------------------- | ---- | ------ | ----- | -------------------------------------------------- | +| root | bytes32 | 0 | 0 | 32 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | +| minted | mapping(bytes32 => bool) | 1 | 0 | 32 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | +| blacklist | contract IMinimalBlacklist | 2 | 0 | 20 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | +| \_\_gap | uint256[48] | 3 | 0 | 1536 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | +| \_totalSupply | uint256 | 51 | 0 | 32 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | +| \_baseURIExtended | string | 52 | 0 | 32 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | +| \_\_gap | uint256[48] | 53 | 0 | 1536 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | + +## ECDSAWhitelist + +| Name | Type | Slot | Offset | Bytes | Contract | +| ---------- | -------------------------- | ---- | ------ | ----- | --------------------------------------------------------------- | +| mintSigner | address | 0 | 0 | 20 | contracts/trailblazers-badges/ECDSAWhitelist.sol:ECDSAWhitelist | +| minted | mapping(bytes32 => bool) | 1 | 0 | 32 | contracts/trailblazers-badges/ECDSAWhitelist.sol:ECDSAWhitelist | +| blacklist | contract IMinimalBlacklist | 2 | 0 | 20 | contracts/trailblazers-badges/ECDSAWhitelist.sol:ECDSAWhitelist | +| \_\_gap | uint256[47] | 3 | 0 | 1504 | contracts/trailblazers-badges/ECDSAWhitelist.sol:ECDSAWhitelist | + +## TrailblazersBadges + +| Name | Type | Slot | Offset | Bytes | Contract | +| ----------------- | ----------------------------------------------- | ---- | ------ | ----- | ----------------------------------------------------------------------- | +| mintSigner | address | 0 | 0 | 20 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| minted | mapping(bytes32 => bool) | 1 | 0 | 32 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| blacklist | contract IMinimalBlacklist | 2 | 0 | 20 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| \_\_gap | uint256[47] | 3 | 0 | 1504 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| \_baseURIExtended | string | 50 | 0 | 32 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| badges | mapping(uint256 => uint256) | 51 | 0 | 32 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| movements | mapping(address => uint256) | 52 | 0 | 32 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| userBadges | mapping(address => mapping(uint256 => uint256)) | 53 | 0 | 32 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| movementBadges | mapping(bytes32 => uint256[2]) | 54 | 0 | 32 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| \_\_gap | uint256[43] | 55 | 0 | 1376 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | diff --git a/packages/nfts/contracts/eventRegister/EventRegister.sol b/packages/nfts/contracts/eventRegister/EventRegister.sol new file mode 100644 index 00000000000..779bb94b543 --- /dev/null +++ b/packages/nfts/contracts/eventRegister/EventRegister.sol @@ -0,0 +1,282 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24.0; + +import { Ownable2StepUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import { AccessControlUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +/** + * @title EventRegister + * @notice A contract that allows authorized managers to create events, manage user registrations, + * and track user participation using role-based access control. + * @dev Utilizes OpenZeppelin's AccessControl for role management. The contract does not hold any + * Ether. + */ + +contract EventRegister is Ownable2StepUpgradeable, AccessControlUpgradeable { + /** + * @dev The role identifier for event managers. This role allows accounts to create events + * and manage registrations. + */ + bytes32 public constant EVENT_MANAGER_ROLE = keccak256("EVENT_MANAGER_ROLE"); + + /** + * @dev Represents an event with its associated details. + */ + struct Event { + ///< Unique identifier for the event. + uint256 id; + ///< Name of the event. + string name; + ///< Flag indicating whether the event exists. + bool exists; + ///< Flag indicating whether registrations are open for the event. + bool registrationOpen; + } + + /** + * @dev Mapping from event ID to Event details. + */ + mapping(uint256 eventId => Event eventData) public events; + + /** + * @dev Mapping from event ID to a mapping of user addresses to their registration status. + * Indicates whether a user has registered for a specific event. + */ + mapping(uint256 eventId => mapping(address registrant => bool isRegistered)) public isRegistered; + + /** + * @dev Emitted when a new event is created. + * @param id The unique identifier of the created event. + * @param name The name of the created event. + */ + event EventCreated(uint256 id, string name); + + /** + * @dev Emitted when a user registers for an event. + * @param registrant The address of the user who registered. + * @param eventId The unique identifier of the event for which the user registered. + */ + event Registered(address indexed registrant, uint256 eventId); + + /** + * @dev Emitted when a user unregisters for an event. + * @param registrant The address of the user who unregistered. + * @param eventId The unique identifier of the event for which the user unregistered. + */ + event Unregistered(address indexed registrant, uint256 eventId); + + /** + * @dev Emitted when registrations are opened for an event. + * @param eventId The unique identifier of the event whose registrations are opened. + */ + event RegistrationOpened(uint256 eventId); + + /** + * @dev Emitted when registrations are closed for an event. + * @param eventId The unique identifier of the event whose registrations are closed. + */ + event RegistrationClosed(uint256 eventId); + + /** + * @dev Counter for assigning unique event IDs. + */ + uint256 private nextEventId; + + /** + * @notice Contract initializer + * @dev Initializes the contract by granting the deployer the default admin role. + * The deployer is also granted the EVENT_MANAGER_ROLE. + * The deployer is set as the owner of the contract. + */ + function initialize() external initializer { + __Context_init(); + _grantRole(EVENT_MANAGER_ROLE, _msgSender()); + _transferOwnership(_msgSender()); + } + + /** + * @notice Initializes the contract by granting the deployer the default admin role. + * @dev The deployer of the contract is granted the DEFAULT_ADMIN_ROLE, allowing them to manage + * roles. + */ + constructor() { + _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); + } + + /** + * @notice Grants the EVENT_MANAGER_ROLE to a specified account. + * @dev Only accounts with the DEFAULT_ADMIN_ROLE can call this function. + * @param account The address to be granted the EVENT_MANAGER_ROLE. + * + * Requirements: + * + * - The caller must have the DEFAULT_ADMIN_ROLE. + */ + function grantEventManagerRole(address account) external onlyRole(DEFAULT_ADMIN_ROLE) { + grantRole(EVENT_MANAGER_ROLE, account); + } + + /** + * @notice Revokes the EVENT_MANAGER_ROLE from a specified account. + * @dev Only accounts with the DEFAULT_ADMIN_ROLE can call this function. + * @param account The address from which the EVENT_MANAGER_ROLE will be revoked. + * + * Requirements: + * + * - The caller must have the DEFAULT_ADMIN_ROLE. + */ + function revokeEventManagerRole(address account) external onlyRole(DEFAULT_ADMIN_ROLE) { + revokeRole(EVENT_MANAGER_ROLE, account); + } + + /** + * @notice Creates a new event with the given name. + * @dev Only accounts with the EVENT_MANAGER_ROLE can call this function. + * Emits EventCreated and RegistrationOpened events upon successful creation. + * @param _name The name of the event to be created. + * + * Requirements: + * + * - The caller must have the EVENT_MANAGER_ROLE. + */ + function createEvent(string memory _name) external onlyRole(EVENT_MANAGER_ROLE) { + uint256 eventId = nextEventId; + events[eventId] = Event({ id: eventId, name: _name, exists: true, registrationOpen: true }); + emit EventCreated(eventId, _name); + emit RegistrationOpened(eventId); // Emit event indicating registrations are open + nextEventId++; + } + + /** + * @notice Opens registrations for a specific event. + * @dev Only accounts with the EVENT_MANAGER_ROLE can call this function. + * Emits a RegistrationOpened event upon successful operation. + * @param _eventId The unique identifier of the event for which to open registrations. + * + * Requirements: + * + * - The event with `_eventId` must exist. + * - Registrations for the event must currently be closed. + * - The caller must have the EVENT_MANAGER_ROLE. + */ + function openRegistration(uint256 _eventId) external onlyRole(EVENT_MANAGER_ROLE) { + require(events[_eventId].exists, "Event not found"); + require(!events[_eventId].registrationOpen, "Already open"); + + events[_eventId].registrationOpen = true; + emit RegistrationOpened(_eventId); + } + + /** + * @notice Closes registrations for a specific event. + * @dev Only accounts with the EVENT_MANAGER_ROLE can call this function. + * Emits a RegistrationClosed event upon successful operation. + * @param _eventId The unique identifier of the event for which to close registrations. + * + * Requirements: + * + * - The event with `_eventId` must exist. + * - Registrations for the event must currently be open. + * - The caller must have the EVENT_MANAGER_ROLE. + */ + function closeRegistration(uint256 _eventId) external onlyRole(EVENT_MANAGER_ROLE) { + require(events[_eventId].exists, "Event not found"); + require(events[_eventId].registrationOpen, "Already closed"); + + events[_eventId].registrationOpen = false; + emit RegistrationClosed(_eventId); + } + + /** + * @notice Allows a user to register for a specific event. + * @dev Emits a Registered event upon successful registration. + * @param _eventId The unique identifier of the event to register for. + * + * Requirements: + * + * - The event with `_eventId` must exist. + * - Registrations for the event must be open. + * - The caller must not have already registered for the event. + */ + function register(uint256 _eventId) external { + Event memory currentEvent = events[_eventId]; + require(currentEvent.exists, "Event not found"); + require(currentEvent.registrationOpen, "Registrations closed"); + require(!isRegistered[_eventId][msg.sender], "Already registered"); + + isRegistered[_eventId][msg.sender] = true; + + emit Registered(msg.sender, _eventId); + } + + /** + * @notice Allows the event manager to unregister a user from a specific event. + * @dev Emits an Unregistered event upon successful un-registration. + * @param _eventId The unique identifier of the event to unregister from. + * @param _user The address of the user to unregister. + * + * Requirements: + * - The event with `_eventId` must exist. + * - Registrations for the event must be open. + * - The user must be registered for the event. + */ + function unregister(uint256 _eventId, address _user) external onlyRole(EVENT_MANAGER_ROLE) { + Event memory currentEvent = events[_eventId]; + require(currentEvent.exists, "Event not found"); + require(currentEvent.registrationOpen, "Registrations closed"); + require(isRegistered[_eventId][_user], "Not registered"); + + isRegistered[_eventId][_user] = false; + emit Unregistered(_user, _eventId); + } + + /** + * @notice Retrieves all event IDs for which a user has registered. + * @dev Iterates through all existing events to compile a list of registrations. + * @param _user The address of the user whose registrations are to be retrieved. + * @return An array of event IDs that the user has registered for. + * + */ + function getRegisteredEvents(address _user) external view returns (uint256[] memory) { + uint256[] memory temp = new uint256[](nextEventId); + uint256 count = 0; + + for (uint256 i = 0; i < nextEventId; i++) { + if (isRegistered[i][_user]) { + temp[count] = i; + count++; + } + } + + // Create a fixed-size array to return + uint256[] memory registeredEvents = new uint256[](count); + for (uint256 j = 0; j < count; j++) { + registeredEvents[j] = temp[j]; + } + + return registeredEvents; + } + + /** + * @notice Retrieves the details of a specific event. + * @dev Returns the event's ID, name, and registration status. + * @param _eventId The unique identifier of the event to retrieve. + * @return id The unique identifier of the event. + * @return name The name of the event. + * @return registrationOpen_ A boolean indicating whether registrations are open for the event. + * + * Requirements: + * + * - The event with `_eventId` must exist. + */ + function getEvent(uint256 _eventId) + external + view + returns (uint256 id, string memory name, bool registrationOpen_) + { + require(events[_eventId].exists, "Event not found"); + Event memory e = events[_eventId]; + return (e.id, e.name, e.registrationOpen); + } +} diff --git a/packages/nfts/contracts/galxe/RegisterGalxePoints.sol b/packages/nfts/contracts/galxe/RegisterGalxePoints.sol new file mode 100644 index 00000000000..c303158754a --- /dev/null +++ b/packages/nfts/contracts/galxe/RegisterGalxePoints.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +contract RegisterGalxePoints { + mapping(address => bool) public alreadyRegistered; + + event Registered(address registrant); + + function register() public { + require(!alreadyRegistered[msg.sender], "Address already registered"); + alreadyRegistered[msg.sender] = true; + emit Registered(msg.sender); + } +} diff --git a/packages/nfts/contracts/party-ticket/TaikoPartyTicket.sol b/packages/nfts/contracts/party-ticket/TaikoPartyTicket.sol new file mode 100644 index 00000000000..b0883734186 --- /dev/null +++ b/packages/nfts/contracts/party-ticket/TaikoPartyTicket.sol @@ -0,0 +1,298 @@ +// SPDX-License-Identifier: MIT +// Compatible with OpenZeppelin Contracts ^5.0.0 +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import { ERC721EnumerableUpgradeable } from + "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; +import { AccessControlUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import { PausableUpgradeable } from + "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { UUPSUpgradeable } from + "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import { Ownable2StepUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; + +/// @title TaikoPartyTicket +/// @dev ERC-721 KBW Raffle & Party Tickets +/// @custom:security-contact security@taiko.xyz +contract TaikoPartyTicket is + ERC721EnumerableUpgradeable, + PausableUpgradeable, + UUPSUpgradeable, + Ownable2StepUpgradeable, + AccessControlUpgradeable +{ + event BlacklistUpdated(address _blacklist); + + /// @notice Mint fee + uint256 public mintFee; + /// @notice Mint active flag + bool public mintActive; + /// @notice Token ID to winner mapping + mapping(uint256 tokenId => bool isWinner) public winners; + /// @notice Base URI required to interact with IPFS + string public baseURI; + /// @notice Winner base URI required to interact with IPFS + string public winnerBaseURI; + /// @notice Payout address + address public payoutAddress; + /// @notice Internal counter for token IDs + uint256 private _nextTokenId; + /// @notice Blackist address + IMinimalBlacklist public blacklist; + /// @notice Convenience array for winners + uint256[] public winnerIds; + /// @notice Gap for upgrade safety + uint256[42] private __gap; + + error INSUFFICIENT_MINT_FEE(); + error CANNOT_REVOKE_NON_WINNER(); + error ADDRESS_BLACKLISTED(); + + /// @notice Contract initializer + /// @param _payoutAddress The address to receive mint fees + /// @param _mintFee The fee to mint a ticket + /// @param _baseURI Base URI for the token metadata pre-raffle + /// @param _blacklistAddress The address of the blacklist contract + function initialize( + address _payoutAddress, + uint256 _mintFee, + string memory _baseURI, + IMinimalBlacklist _blacklistAddress + ) + external + initializer + { + __ERC721_init("TaikoPartyTicket", "TPT"); + __Context_init(); + mintFee = _mintFee; + baseURI = _baseURI; + payoutAddress = _payoutAddress; + blacklist = _blacklistAddress; + + _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); + + _transferOwnership(_msgSender()); + } + + /// @notice Modifier to check if an address is blacklisted + /// @param _address The address to check + modifier notBlacklisted(address _address) { + if (blacklist.isBlacklisted(_address)) revert ADDRESS_BLACKLISTED(); + _; + } + + /// @notice Update the blacklist address + /// @param _blacklist The new blacklist address + function updateBlacklist(IMinimalBlacklist _blacklist) external onlyRole(DEFAULT_ADMIN_ROLE) { + blacklist = _blacklist; + emit BlacklistUpdated(address(_blacklist)); + } + + /// @notice Get individual token's URI + /// @param tokenId The token ID + /// @return The token URI + function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { + if (winnerIds.length == 0) { + return string(abi.encodePacked(baseURI, "/raffle.json")); + } else if (winners[tokenId]) { + return string(abi.encodePacked(baseURI, "/winner.json")); + } else { + return string(abi.encodePacked(baseURI, "/loser.json")); + } + } + + /// @notice Checks if a tokenId is a winner + /// @param tokenId The token ID + /// @return Whether the token is a winner + function isWinner(uint256 tokenId) public view returns (bool) { + return winners[tokenId]; + } + + /// @notice Checks if an address is a winner + /// @param minter The address to check + /// @return Whether the address is a winner + function isWinner(address minter) public view returns (bool) { + for (uint256 i = 0; i < balanceOf(minter); i++) { + if (winners[tokenOfOwnerByIndex(minter, i)]) { + return true; + } + } + return false; + } + + /// @notice Set the winners + /// @param _winners The list of winning token ids + function setWinners(uint256[] calldata _winners) + external + whenPaused + onlyRole(DEFAULT_ADMIN_ROLE) + { + for (uint256 i = 0; i < _winners.length; i++) { + winners[_winners[i]] = true; + winnerIds.push(_winners[i]); + } + } + + /// @notice Set the base URI + /// @param _baseURI The new base URI + function setBaseURI(string memory _baseURI) external onlyRole(DEFAULT_ADMIN_ROLE) { + baseURI = _baseURI; + } + + /// @notice Set the winner base URI + /// @param _winnerBaseURI The new winner base URI + function setWinnerURI(string memory _winnerBaseURI) external onlyRole(DEFAULT_ADMIN_ROLE) { + winnerBaseURI = _winnerBaseURI; + } + + /// @notice Mint a raffle ticket + /// @dev Requires a fee to mint + /// @dev Requires the contract to not be paused + function mint() external payable whenNotPaused notBlacklisted(_msgSender()) { + if (msg.value < mintFee) revert INSUFFICIENT_MINT_FEE(); + uint256 tokenId = _nextTokenId++; + _safeMint(msg.sender, tokenId); + } + + /// @notice Mint multiple raffle tickets + /// @param amount The number of tickets to mint + /// @dev Requires a fee to mint + /// @dev Requires the contract to not be paused + function mint(uint256 amount) external payable whenNotPaused notBlacklisted(_msgSender()) { + if (msg.value < mintFee * amount) revert INSUFFICIENT_MINT_FEE(); + for (uint256 i = 0; i < amount; i++) { + uint256 tokenId = _nextTokenId++; + _safeMint(msg.sender, tokenId); + } + } + + /// @notice Mint a raffle ticket + /// @param to The address to mint to + /// @dev Requires the contract to not be paused + /// @dev Can only be called by the admin + function mint(address to) + public + whenNotPaused + onlyRole(DEFAULT_ADMIN_ROLE) + notBlacklisted(to) + { + uint256 tokenId = _nextTokenId++; + _safeMint(to, tokenId); + } + + /// @notice Mint a winner ticket + /// @param to The address to mint to + /// @dev Requires calling as an admin + function mintWinner(address to) public onlyRole(DEFAULT_ADMIN_ROLE) notBlacklisted(to) { + uint256 tokenId = _nextTokenId++; + winners[tokenId] = true; + _safeMint(to, tokenId); + } + + /// @notice Revoke a winner's status + /// @param tokenId The ID of the winner to revoke + function revokeWinner(uint256 tokenId) public onlyRole(DEFAULT_ADMIN_ROLE) { + winners[tokenId] = false; + + for (uint256 i = 0; i < winnerIds.length; i++) { + if (winnerIds[i] == tokenId) { + winnerIds[i] = winnerIds[winnerIds.length - 1]; + winnerIds.pop(); + break; + } + } + } + + /// @notice Revoke a winner's status + /// @param tokenIds The IDs of the winner to revoke + function revokeWinners(uint256[] calldata tokenIds) external onlyRole(DEFAULT_ADMIN_ROLE) { + for (uint256 i = 0; i < tokenIds.length; i++) { + revokeWinner(tokenIds[i]); + } + } + + /// @notice Revoke a winner and replace with a new winner + /// @param revokeId The ID of the winner to revoke + /// @param newWinnerId The ID of the new winner + function revokeAndReplaceWinner( + uint256 revokeId, + uint256 newWinnerId + ) + external + onlyRole(DEFAULT_ADMIN_ROLE) + { + if (!winners[revokeId]) revert CANNOT_REVOKE_NON_WINNER(); + revokeWinner(revokeId); + winners[newWinnerId] = true; + winnerIds.push(newWinnerId); + } + + /// @notice Pause the contract + /// @dev Can only be called by the admin + function pause() public onlyRole(DEFAULT_ADMIN_ROLE) { + _pause(); + } + + /// @notice Unpause the contract + /// @dev Can only be called by the admin + function unpause() public onlyRole(DEFAULT_ADMIN_ROLE) { + _unpause(); + } + + /// @notice Update the payout address + /// @param _payoutAddress The new payout address + function updatePayoutAddress(address _payoutAddress) external onlyRole(DEFAULT_ADMIN_ROLE) { + payoutAddress = _payoutAddress; + } + + /// @notice Withdraw the contract balance + /// @dev Can only be called by the admin + /// @dev Requires the contract to be paused + function payout() external whenPaused onlyRole(DEFAULT_ADMIN_ROLE) { + payable(payoutAddress).transfer(address(this).balance); + } + + /// @notice Get the winner token IDs + /// @return The winner token IDs + function getWinnerTokenIds() public view whenPaused returns (uint256[] memory) { + return winnerIds; + } + + /// @notice Get the winner addresses + /// @return _winners The winner addresses + function getWinners() public view whenPaused returns (address[] memory _winners) { + _winners = new address[](winnerIds.length); + for (uint256 i = 0; i < winnerIds.length; i++) { + _winners[i] = ownerOf(winnerIds[i]); + } + return _winners; + } + + /// @notice Get the winner addresses + /// @return bool if the winners have been set + function areWinnersSet() public view returns (bool) { + return winnerIds.length > 0; + } + + /// @notice supportsInterface implementation + /// @param interfaceId The interface ID + /// @return Whether the interface is supported + function supportsInterface(bytes4 interfaceId) + public + view + override(ERC721EnumerableUpgradeable, AccessControlUpgradeable) + returns (bool) + { + return super.supportsInterface(interfaceId); + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } +} diff --git a/packages/nfts/contracts/party-ticket/TaikoPartyTicketV2.sol b/packages/nfts/contracts/party-ticket/TaikoPartyTicketV2.sol new file mode 100644 index 00000000000..ac0d97b7473 --- /dev/null +++ b/packages/nfts/contracts/party-ticket/TaikoPartyTicketV2.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: MIT +// Compatible with OpenZeppelin Contracts ^5.0.0 +pragma solidity ^0.8.24; + +import { TaikoPartyTicket } from "./TaikoPartyTicket.sol"; + +/// @title TaikoPartyTicketV2 +/// @dev Upgrade to support Golden Ticket (winner of winners, singular) ticket +/// @custom:security-contact security@taiko.xyz +contract TaikoPartyTicketV2 is TaikoPartyTicket { + /// @notice Get the version of the contract + /// @return The version of the contract + function version() public pure returns (string memory) { + return "v2"; + } + + /// @notice Get individual token's URI + /// @param tokenId The token ID + /// @return The token URI + /// @dev re-implemented to support golden winner + function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { + if (winnerIds.length == 0) { + return string(abi.encodePacked(baseURI, "/raffle.json")); + } else if (winners[tokenId] && winnerIds[0] == tokenId) { + return string(abi.encodePacked(baseURI, "/golden-winner.json")); + } else if (winners[tokenId]) { + return string(abi.encodePacked(baseURI, "/winner.json")); + } else { + return string(abi.encodePacked(baseURI, "/loser.json")); + } + } + + /// @notice Checks if a tokenId is the golden winner + /// @param tokenId The token ID + /// @return True if the token is the golden winner + function isGoldenWinner(uint256 tokenId) public view returns (bool) { + return winners[tokenId] && winnerIds[0] == tokenId; + } + + /// @notice Checks if an account has a golden winner token + /// @param account The account address + /// @return True if the account has a golden winner + function isGoldenWinner(address account) public view returns (bool) { + for (uint256 i = 0; i < balanceOf(account); i++) { + if (isGoldenWinner(tokenOfOwnerByIndex(account, i))) { + return true; + } + } + return false; + } +} diff --git a/packages/nfts/contracts/profile/RegisterProfilePicture.sol b/packages/nfts/contracts/profile/RegisterProfilePicture.sol new file mode 100644 index 00000000000..c885339e9ab --- /dev/null +++ b/packages/nfts/contracts/profile/RegisterProfilePicture.sol @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import { UUPSUpgradeable } from + "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import { Ownable2StepUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; + +/// @title A store for trailblazer profile pictures +/// @author Bennett Yogn +/// @dev All function calls are currently implemented without side effects +contract RegisterProfilePicture is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable { + error InvalidNFTContract(address nftContract); + error NotTokenOwner(address nftContract, uint256 tokenId, address caller); + + /// @notice struct of nft contract address and token id + struct ProfilePicture { + address nftContract; + uint256 tokenId; + } + + /// @notice mapping of user id to profile picture + mapping(address user => ProfilePicture pfp) public profilePicture; + + event ProfilePictureSet( + address indexed user, address indexed nftContract, uint256 indexed tokenId + ); + + /// @notice Contract initializer + function initialize() public initializer { + _transferOwnership(_msgSender()); + } + + /// @notice Set the profile picture + /// @param nftContract The address of the nft to set as the profile picture + /// @param tokenId The tokenId of the nft to set as the profile picture + function setPFP(address nftContract, uint256 tokenId) external { + if (IERC721(nftContract).supportsInterface(type(IERC721).interfaceId)) { + // Check if the provided contract address is a valid ERC721 contract + if (IERC721(nftContract).ownerOf(tokenId) != _msgSender()) { + revert NotTokenOwner(nftContract, tokenId, _msgSender()); + } + } else if (IERC1155(nftContract).supportsInterface(type(IERC1155).interfaceId)) { + // Check if the provided contract address is a valid ERC1155 contract + if (IERC1155(nftContract).balanceOf(_msgSender(), tokenId) == 0) { + revert NotTokenOwner(nftContract, tokenId, _msgSender()); + } + } else { + // If the contract does not support ERC721 or ERC1155 interfaces + revert InvalidNFTContract(nftContract); + } + + // Set the PFP + profilePicture[_msgSender()] = ProfilePicture(nftContract, tokenId); + + emit ProfilePictureSet(_msgSender(), nftContract, tokenId); + } + + /// @notice Get the profile picture of a user + /// @param user The address of user + function getProfilePicture(address user) external view returns (string memory) { + ProfilePicture memory userProfilePicture = profilePicture[user]; + + if (IERC721(userProfilePicture.nftContract).supportsInterface(type(IERC721).interfaceId)) { + // ERC721 case: Check ownership before returning the URI + if (IERC721(userProfilePicture.nftContract).ownerOf(userProfilePicture.tokenId) != user) + { + revert NotTokenOwner( + userProfilePicture.nftContract, userProfilePicture.tokenId, user + ); + } + return ERC721(userProfilePicture.nftContract).tokenURI(userProfilePicture.tokenId); + } else if ( + IERC1155(userProfilePicture.nftContract).supportsInterface(type(IERC1155).interfaceId) + ) { + // ERC1155 case: Check ownership before returning the URI + if ( + IERC1155(userProfilePicture.nftContract).balanceOf(user, userProfilePicture.tokenId) + == 0 + ) { + revert NotTokenOwner( + userProfilePicture.nftContract, userProfilePicture.tokenId, user + ); + } + return ERC1155(userProfilePicture.nftContract).uri(userProfilePicture.tokenId); + } else { + // If the contract does not support ERC721 or ERC1155 interfaces + revert InvalidNFTContract(userProfilePicture.nftContract); + } + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } +} diff --git a/packages/nfts/contracts/snaefell/SnaefellToken.sol b/packages/nfts/contracts/snaefell/SnaefellToken.sol index d4f934789b6..fd51efa031d 100644 --- a/packages/nfts/contracts/snaefell/SnaefellToken.sol +++ b/packages/nfts/contracts/snaefell/SnaefellToken.sol @@ -122,4 +122,17 @@ contract SnaefellToken is ERC721EnumerableUpgradeable, MerkleWhitelist { } return super._update(to, tokenId, auth); } + + /// @notice Update the base URI + /// @param _rootURI The new base URI + /// @dev Only the owner can update the base URI + function updateBaseURI(string memory _rootURI) public onlyOwner { + _baseURIExtended = _rootURI; + } + + /// @notice Get the base URI + /// @return The base URI + function baseURI() public view returns (string memory) { + return _baseURIExtended; + } } diff --git a/packages/nfts/contracts/taikoon/TaikoonToken.sol b/packages/nfts/contracts/taikoon/TaikoonToken.sol index 6461800c796..dbe54650996 100644 --- a/packages/nfts/contracts/taikoon/TaikoonToken.sol +++ b/packages/nfts/contracts/taikoon/TaikoonToken.sol @@ -112,4 +112,19 @@ contract TaikoonToken is ERC721EnumerableUpgradeable, MerkleWhitelist { _mint(_to, tokenIds[i]); } } + + /// @dev V2 code additions + + /// @notice Update the base URI + /// @param _rootURI The new base URI + /// @dev Only the owner can update the base URI + function updateBaseURI(string memory _rootURI) public onlyOwner { + _baseURIExtended = _rootURI; + } + + /// @notice Get the base URI + /// @return The base URI + function baseURI() public view returns (string memory) { + return _baseURIExtended; + } } diff --git a/packages/nfts/contracts/trailblazers-airdrop/ERC20Airdrop.sol b/packages/nfts/contracts/trailblazers-airdrop/ERC20Airdrop.sol new file mode 100644 index 00000000000..0f25d27945e --- /dev/null +++ b/packages/nfts/contracts/trailblazers-airdrop/ERC20Airdrop.sol @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/governance/utils/IVotes.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@taiko/blacklist/IMinimalBlacklist.sol"; + +import "./MerkleClaimable.sol"; + +/// @title ERC20Airdrop +/// @notice Contract for managing Taiko token airdrop for eligible users. +/// @custom:security-contact security@taiko.xyz +contract ERC20Airdrop is MerkleClaimable, ReentrancyGuardUpgradeable, PausableUpgradeable { + using SafeERC20 for IERC20; + + /// @notice The address of the Taiko token contract. + IERC20 public token; + /// @notice Blackist address + IMinimalBlacklist public blacklist; + + /// @notice Event emitted when the blacklist is updated. + event BlacklistUpdated(address _blacklist); + + /// @notice Errors + error ADDRESS_BLACKLISTED(); + + uint256[48] private __gap; + + /// @notice Modifier to check if the address is not blacklisted. + /// @param _address The address to check. + modifier isNotBlacklisted(address _address) { + if (blacklist.isBlacklisted(_address)) revert ADDRESS_BLACKLISTED(); + _; + } + + /// @notice Initializes the contract. + /// @param _owner The owner of this contract. + /// @param _claimStart The start time of the claim period. + /// @param _claimEnd The end time of the claim period. + /// @param _merkleRoot The merkle root. + /// @param _token The address of the token contract. + function init( + address _owner, + uint64 _claimStart, + uint64 _claimEnd, + bytes32 _merkleRoot, + IERC20 _token, + address _blacklist + ) + external + initializer + { + __ReentrancyGuard_init(); + __Pausable_init(); + __MerkleClaimable_init(_claimStart, _claimEnd, _merkleRoot); + _transferOwnership(_owner == address(0) ? _msgSender() : _owner); + blacklist = IMinimalBlacklist(_blacklist); + token = _token; + } + + /// @notice Claims the airdrop for the user. + /// @param user The address of the user. + /// @param amount The amount of tokens to claim. + /// @param proof The merkle proof. + function claim( + address user, + uint256 amount, + bytes32[] calldata proof + ) + external + nonReentrant + isNotBlacklisted(user) + { + // Check if this can be claimed + _verifyClaim(abi.encode(user, amount), proof); + + // Transfer the tokens from contract + IERC20(token).transfer(user, amount); + } + + /// @notice Withdraw ERC20 tokens from the Vault + /// @param _token The ERC20 token address to withdraw + /// @dev Only the owner can execute this function + function withdrawERC20(IERC20 _token) external onlyOwner { + // If token address is address(0), use token + if (address(_token) == address(0)) { + _token = token; + } + // Transfer the tokens to owner + _token.transfer(owner(), _token.balanceOf(address(this))); + } + + /// @notice Update blacklist contract + /// @param _blacklist The new blacklist contract address + /// @dev Only the owner can execute this function + function updateBlacklist(address _blacklist) external onlyOwner { + blacklist = IMinimalBlacklist(_blacklist); + emit BlacklistUpdated(_blacklist); + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } +} diff --git a/packages/nfts/contracts/trailblazers-airdrop/MerkleClaimable.sol b/packages/nfts/contracts/trailblazers-airdrop/MerkleClaimable.sol new file mode 100644 index 00000000000..149bb99493e --- /dev/null +++ b/packages/nfts/contracts/trailblazers-airdrop/MerkleClaimable.sol @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; + +import { UUPSUpgradeable } from + "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import { Ownable2StepUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import { MerkleProof } from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; +import { ContextUpgradeable } from + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; + +/// @title MerkleClaimable +/// @notice Contract for managing Taiko token airdrop for eligible users +/// @custom:security-contact security@taiko.xyz +abstract contract MerkleClaimable is + ContextUpgradeable, + UUPSUpgradeable, + Ownable2StepUpgradeable +{ + /// @notice Mapping of hashes and their claim status + mapping(bytes32 hash => bool claimed) public isClaimed; + + /// @notice Merkle root of the tree + bytes32 public merkleRoot; + + /// @notice Unix timestamp for claim start + uint64 public claimStart; + + /// @notice Unix timestamp for claim end + uint64 public claimEnd; + + uint256[47] private __gap; + + /// @notice Event emitted when a claim is made + /// @param hash Hash of the claim + event Claimed(bytes32 hash); + + /// @notice Event emitted when config is changed + /// @param claimStart Unix timestamp for claim start + /// @param claimEnd Unix timestamp for claim end + /// @param merkleRoot Merkle root of the tree + event ConfigChanged(uint64 claimStart, uint64 claimEnd, bytes32 merkleRoot); + + /// @notice Errors + error CLAIM_NOT_ONGOING(); + error CLAIMED_ALREADY(); + error INVALID_PARAMS(); + error INVALID_PROOF(); + + /// @notice Modifier to check if the claim is ongoing + modifier ongoingClaim() { + if ( + merkleRoot == 0x0 || claimStart == 0 || claimEnd == 0 || claimStart > block.timestamp + || claimEnd < block.timestamp + ) revert CLAIM_NOT_ONGOING(); + _; + } + + /// @notice Set config parameters + /// @param _claimStart Unix timestamp for claim start + /// @param _claimEnd Unix timestamp for claim end + /// @param _merkleRoot Merkle root of the tree + function setConfig( + uint64 _claimStart, + uint64 _claimEnd, + bytes32 _merkleRoot + ) + external + onlyOwner + { + _setConfig(_claimStart, _claimEnd, _merkleRoot); + } + + /// @notice Initialize the contract + /// @param _claimStart Unix timestamp for claim start + /// @param _claimEnd Unix timestamp for claim end + /// @param _merkleRoot Merkle root of the tree + function __MerkleClaimable_init( + uint64 _claimStart, + uint64 _claimEnd, + bytes32 _merkleRoot + ) + internal + onlyInitializing + { + __Context_init(); + _setConfig(_claimStart, _claimEnd, _merkleRoot); + } + + /// @notice Verify an airdrop claim + /// @param data Data to be hashed + /// @param proof Merkle proof + function _verifyClaim(bytes memory data, bytes32[] calldata proof) internal ongoingClaim { + bytes32 hash = keccak256(abi.encode("CLAIM_TAIKO_AIRDROP", data)); + + if (isClaimed[hash]) revert CLAIMED_ALREADY(); + if (!_verifyMerkleProof(proof, merkleRoot, hash)) revert INVALID_PROOF(); + + isClaimed[hash] = true; + emit Claimed(hash); + } + + /// @notice Verify a Merkle proof + /// @param _proof Merkle proof + /// @param _merkleRoot Merkle root + /// @param _value Value to verify + /// @return Whether the proof is valid + function _verifyMerkleProof( + bytes32[] calldata _proof, + bytes32 _merkleRoot, + bytes32 _value + ) + internal + pure + virtual + returns (bool) + { + return MerkleProof.verify(_proof, _merkleRoot, _value); + } + + /// @notice Set config parameters + /// @param _claimStart Unix timestamp for claim start + /// @param _claimEnd Unix timestamp for claim end + /// @param _merkleRoot Merkle root of the tree + function _setConfig(uint64 _claimStart, uint64 _claimEnd, bytes32 _merkleRoot) private { + if (_claimStart > _claimEnd) revert INVALID_PARAMS(); + + claimStart = _claimStart; + claimEnd = _claimEnd; + merkleRoot = _merkleRoot; + emit ConfigChanged(_claimStart, _claimEnd, _merkleRoot); + } + + /// @notice Check if a claim has been made + /// @param user Address of the user + /// @param amount Amount of tokens claimed + /// @return Whether the claim has been made + function hasClaimed(address user, uint256 amount) external view returns (bool) { + bytes32 hash = keccak256(abi.encode("CLAIM_TAIKO_AIRDROP", (abi.encode(user, amount)))); + return isClaimed[hash]; + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } +} diff --git a/packages/nfts/contracts/trailblazers-badges/ECDSAWhitelist.sol b/packages/nfts/contracts/trailblazers-badges/ECDSAWhitelist.sol new file mode 100644 index 00000000000..cee54194521 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-badges/ECDSAWhitelist.sol @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UUPSUpgradeable } from + "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import { Ownable2StepUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import { ContextUpgradeable } from + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; + +/// @title ECDSAWhitelist +/// @dev Signature-driven mint whitelist +/// @custom:security-contact security@taiko.xyz +contract ECDSAWhitelist is ContextUpgradeable, UUPSUpgradeable, Ownable2StepUpgradeable { + event MintSignerUpdated(address _mintSigner); + event MintConsumed(address _minter, uint256 _tokenId); + event BlacklistUpdated(address _blacklist); + + error MINTS_EXCEEDED(); + error ADDRESS_BLACKLISTED(); + error ONLY_MINT_SIGNER(); + + /// @notice Mint signer address + address public mintSigner; + /// @notice Tracker for minted signatures + mapping(bytes32 signatureHash => bool hasMinted) public minted; + /// @notice Blackist address + IMinimalBlacklist public blacklist; + /// @notice Gap for upgrade safety + uint256[47] private __gap; + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /// @notice Modifier to restrict access to the mint signer + modifier onlyMintSigner() { + if (msg.sender != mintSigner) revert ONLY_MINT_SIGNER(); + _; + } + + /// @notice Update the blacklist address + /// @param _blacklist The new blacklist address + function updateBlacklist(IMinimalBlacklist _blacklist) external onlyOwner { + blacklist = _blacklist; + emit BlacklistUpdated(address(_blacklist)); + } + + /// @notice Update the mint signer address + /// @param _mintSigner The new mint signer address + function updateMintSigner(address _mintSigner) public onlyOwner { + mintSigner = _mintSigner; + emit MintSignerUpdated(_mintSigner); + } + + /// @notice Contract initializer + /// @param _owner Contract owner + /// @param _mintSigner Mint signer address + /// @param _blacklist Blacklist address + function initialize( + address _owner, + address _mintSigner, + IMinimalBlacklist _blacklist + ) + external + initializer + { + __ECDSAWhitelist_init(_owner, _mintSigner, _blacklist); + } + + /// @notice Generate a standardized hash for externally signing + /// @param _minter Address of the minter + /// @param _tokenId ID for the token to mint + function getHash(address _minter, uint256 _tokenId) public pure returns (bytes32) { + return keccak256(bytes.concat(keccak256(abi.encode(_minter, _tokenId)))); + } + + /// @notice Internal method to verify valid signatures + /// @param _signature Signature to verify + /// @param _minter Address of the minter + /// @param _tokenId ID for the token to mint + /// @return Whether the signature is valid + function _isSignatureValid( + bytes memory _signature, + address _minter, + uint256 _tokenId + ) + internal + view + returns (bool) + { + bytes32 _hash = getHash(_minter, _tokenId); + (address _recovered,,) = ECDSA.tryRecover(_hash, _signature); + + return _recovered == mintSigner; + } + + /// @notice Check if a wallet can mint + /// @param _signature Signature to verify + /// @param _minter Address of the minter + /// @param _tokenId ID for the token to mint + /// @return Whether the wallet can mint + function canMint( + bytes memory _signature, + address _minter, + uint256 _tokenId + ) + public + view + returns (bool) + { + if (blacklist.isBlacklisted(_minter)) revert ADDRESS_BLACKLISTED(); + if (minted[keccak256(_signature)]) return false; + return _isSignatureValid(_signature, _minter, _tokenId); + } + + /// @notice Internal initializer + /// @param _owner Contract owner + /// @param _mintSigner Mint signer address + /// @param _blacklist Blacklist address + function __ECDSAWhitelist_init( + address _owner, + address _mintSigner, + IMinimalBlacklist _blacklist + ) + internal + { + _transferOwnership(_owner == address(0) ? msg.sender : _owner); + __Context_init(); + mintSigner = _mintSigner; + blacklist = _blacklist; + } + + /// @notice Internal method to consume a mint + /// @param _signature Signature to verify + /// @param _minter Address of the minter + /// @param _tokenId ID for the token to mint + function _consumeMint(bytes memory _signature, address _minter, uint256 _tokenId) internal { + if (!canMint(_signature, _minter, _tokenId)) revert MINTS_EXCEEDED(); + minted[keccak256(_signature)] = true; + emit MintConsumed(_minter, _tokenId); + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } +} diff --git a/packages/nfts/contracts/trailblazers-badges/TrailblazersBadges.sol b/packages/nfts/contracts/trailblazers-badges/TrailblazersBadges.sol new file mode 100644 index 00000000000..7b55195d412 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-badges/TrailblazersBadges.sol @@ -0,0 +1,224 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { ERC721EnumerableUpgradeable } from + "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; +import { ECDSAWhitelist } from "./ECDSAWhitelist.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; + +contract TrailblazersBadges is ERC721EnumerableUpgradeable, ECDSAWhitelist { + /// @notice Movement IDs + uint256 public constant MOVEMENT_NEUTRAL = 0; + uint256 public constant MOVEMENT_BASED = 1; + uint256 public constant MOVEMENT_BOOSTED = 2; + /// @notice Badge IDs + uint256 public constant BADGE_RAVERS = 0; + uint256 public constant BADGE_ROBOTS = 1; + uint256 public constant BADGE_BOUNCERS = 2; + uint256 public constant BADGE_MASTERS = 3; + uint256 public constant BADGE_MONKS = 4; + uint256 public constant BADGE_DRUMMERS = 5; + uint256 public constant BADGE_ANDROIDS = 6; + uint256 public constant BADGE_SHINTO = 7; + + /// @notice Base URI required to interact with IPFS + string private _baseURIExtended; + /// @notice Token ID to badge ID mapping + mapping(uint256 _tokenId => uint256 _badgeId) public badges; + /// @notice Wallet-to-Movement mapping + mapping(address _user => uint256 _movement) public movements; + /// @notice Wallet to badge ID, token ID mapping + mapping(address _user => mapping(uint256 _badgeId => uint256 _tokenId)) public userBadges; + /// @notice Movement to badge ID, token ID mapping + mapping(bytes32 movementBadgeHash => uint256[2] movementBadge) public movementBadges; + /// @notice Gap for upgrade safety + uint256[43] private __gap; + + error MINTER_NOT_WHITELISTED(); + error INVALID_INPUT(); + error INVALID_BADGE_ID(); + error INVALID_MOVEMENT_ID(); + + event BadgeCreated(uint256 _tokenId, address _minter, uint256 _badgeId); + event MovementSet(address _user, uint256 _movementId); + event UriSet(string _uri); + + /// @notice Contract initializer + /// @param _owner Contract owner + /// @param _rootURI Base URI for the token metadata + /// @param _mintSigner The address that can authorize minting badges + /// @param _blacklistAddress The address of the blacklist contract + function initialize( + address _owner, + string memory _rootURI, + address _mintSigner, + IMinimalBlacklist _blacklistAddress + ) + external + initializer + { + __ERC721_init("Trailblazers Badges", "TBB"); + _baseURIExtended = _rootURI; + __ECDSAWhitelist_init(_owner, _mintSigner, _blacklistAddress); + } + + /// @notice Ensure update of userBadges on transfers + /// @param to The address to transfer to + /// @param tokenId The token id to transfer + /// @param auth The authorizer of the transfer + function _update( + address to, + uint256 tokenId, + address auth + ) + internal + virtual + override + returns (address) + { + userBadges[_ownerOf(tokenId)][badges[tokenId]] = 0; + userBadges[to][badges[tokenId]] = tokenId; + return super._update(to, tokenId, auth); + } + + /// @notice Update the base URI + /// @param _uri The new base URI + function setUri(string memory _uri) public onlyOwner { + _baseURIExtended = _uri; + emit UriSet(_uri); + } + + /// @notice Get the URI for a tokenId + /// @param _tokenId The badge ID + /// @return URI The URI for the badge + function tokenURI(uint256 _tokenId) public view override returns (string memory) { + uint256 movementId = movements[ownerOf(_tokenId)]; + uint256 badgeId = badges[_tokenId]; + return string( + abi.encodePacked( + _baseURIExtended, "/", Strings.toString(movementId), "/", Strings.toString(badgeId) + ) + ); + } + + /// @notice Mint a badge from the calling wallet + /// @param _signature The signature authorizing the mint + /// @param _badgeId The badge ID to mint + function mint(bytes memory _signature, uint256 _badgeId) public { + _mintBadgeTo(_signature, _msgSender(), _badgeId); + } + + /// @notice Mint a badge to a specific address + /// @param _signature The signature authorizing the mint + /// @param _minter The address to mint the badge to + /// @param _badgeId The badge ID to mint + /// @dev Admin only method + function mint(bytes memory _signature, address _minter, uint256 _badgeId) public onlyOwner { + _mintBadgeTo(_signature, _minter, _badgeId); + } + + /// @notice Internal method for badge minting + /// @param _signature The signature authorizing the mint + /// @param _minter The address to mint the badge to + /// @param _badgeId The badge ID to mint + function _mintBadgeTo(bytes memory _signature, address _minter, uint256 _badgeId) internal { + if (_badgeId > BADGE_SHINTO) revert INVALID_BADGE_ID(); + + _consumeMint(_signature, _minter, _badgeId); + + uint256 tokenId = totalSupply() + 1; + badges[tokenId] = _badgeId; + + _mint(_minter, tokenId); + + emit BadgeCreated(tokenId, _minter, _badgeId); + } + + /// @notice Sets movement for the calling wallet + /// @param _movementId The movement ID to set + function setMovement(uint256 _movementId) public { + _setMovement(_msgSender(), _movementId); + } + + /// @notice Sets movement for a specific address + /// @param _user The address to set the movement for + /// @param _movementId The movement ID to set + /// @dev Owner-only method + function setMovement(address _user, uint256 _movementId) public onlyOwner { + _setMovement(_user, _movementId); + } + + /// @notice Internal method for setting movement + /// @param _user The address to set the movement for + /// @param _movementId The movement ID to set + function _setMovement(address _user, uint256 _movementId) internal { + if (_movementId > MOVEMENT_BOOSTED) revert INVALID_MOVEMENT_ID(); + movements[_user] = _movementId; + emit MovementSet(_user, _movementId); + } + + /// @notice Retrieve a token ID given their owner and Badge ID + /// @param _user The address of the badge owner + /// @param _badgeId The badge ID + /// @return tokenId The token ID + function getTokenId(address _user, uint256 _badgeId) public view returns (uint256) { + return userBadges[_user][_badgeId]; + } + + /// @notice Retrieve boolean balance for each badge + /// @param _owner The addresses to check + /// @return balances The badges atomic balances + function badgeBalances(address _owner) public view returns (bool[] memory) { + bool[] memory balances = new bool[](8); + balances[0] = 0 != getTokenId(_owner, BADGE_RAVERS); + balances[1] = 0 != getTokenId(_owner, BADGE_ROBOTS); + balances[2] = 0 != getTokenId(_owner, BADGE_BOUNCERS); + balances[3] = 0 != getTokenId(_owner, BADGE_MASTERS); + balances[4] = 0 != getTokenId(_owner, BADGE_MONKS); + balances[5] = 0 != getTokenId(_owner, BADGE_DRUMMERS); + balances[6] = 0 != getTokenId(_owner, BADGE_ANDROIDS); + balances[7] = 0 != getTokenId(_owner, BADGE_SHINTO); + return balances; + } + + /// @notice v2 + + /// @notice Retrieve the base URI + function baseURI() public view returns (string memory) { + return _baseURIExtended; + } + + /// @notice Upgraded badgeBalances using tokenOfOwnerByIndex + /// @param _owner The addresses to check + /// @return balances The badges atomic balances + function badgeBalancesV2(address _owner) public view returns (bool[] memory balances) { + uint256 balance = balanceOf(_owner); + uint256[] memory tokenIds = new uint256[](balance); + for (uint256 i = 0; i < balance; i++) { + tokenIds[i] = tokenOfOwnerByIndex(_owner, i); + } + balances = new bool[](8); + + for (uint256 i = 0; i < balance; i++) { + uint256 badgeId = badges[tokenIds[i]]; + balances[badgeId] = true; + } + + return balances; + } + + /// @notice Return the total badge supply by badgeId + /// @return balances The amount of each badge id + function totalBadgeSupply() public view returns (uint256[] memory balances) { + uint256 totalSupply = totalSupply(); + balances = new uint256[](8); + + for (uint256 i = 1; i <= totalSupply; i++) { + uint256 badgeId = badges[i]; + balances[badgeId]++; + } + + return balances; + } +} diff --git a/packages/nfts/contracts/trailblazers-badges/TrailblazersBadgesV3.sol b/packages/nfts/contracts/trailblazers-badges/TrailblazersBadgesV3.sol new file mode 100644 index 00000000000..cae60cd6468 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-badges/TrailblazersBadgesV3.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "./TrailblazersBadges.sol"; + +contract TrailblazersBadgesV3 is TrailblazersBadges { + function version() external pure virtual returns (string memory) { + return "V3"; + } + + function _update( + address to, + uint256 tokenId, + address auth + ) + internal + virtual + override + returns (address) + { + if (blacklist.isBlacklisted(_msgSender())) revert ADDRESS_BLACKLISTED(); + return super._update(to, tokenId, auth); + } +} diff --git a/packages/nfts/contracts/trailblazers-season-2/BadgeRecruitment.sol b/packages/nfts/contracts/trailblazers-season-2/BadgeRecruitment.sol new file mode 100644 index 00000000000..44e93329add --- /dev/null +++ b/packages/nfts/contracts/trailblazers-season-2/BadgeRecruitment.sol @@ -0,0 +1,745 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol"; +import "../trailblazers-badges/ECDSAWhitelist.sol"; +import "@taiko/blacklist/IMinimalBlacklist.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/utils/ERC721HolderUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import "./TrailblazersS1BadgesV4.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "./TrailblazersBadgesS2.sol"; + +contract BadgeRecruitment is + UUPSUpgradeable, + Ownable2StepUpgradeable, + AccessControlUpgradeable, + ERC721HolderUpgradeable +{ + /// @notice Season 1 Badges ERC721 contract + TrailblazersBadgesV4 public s1Badges; + /// @notice badges role key + bytes32 public constant S1_BADGES_ROLE = keccak256("S1_BADGES_ROLE"); + /// @notice Season 2 Badges ERC1155 contract + TrailblazersBadgesS2 public s2Badges; + /// @notice Wallet authorized to sign as a source of randomness + address public randomSigner; + /// @notice Current recruitment cycle + uint256 public recruitmentCycleId; + + /// @notice Mapping of unique user-per-mint-per-cycle + mapping( + uint256 recruitmentCycle + => mapping( + address minter + => mapping( + uint256 s1BadgeId + => mapping(RecruitmentType recruitmentType => bool mintEnded) + ) + ) + ) public recruitmentCycleUniqueMints; + /// @notice User experience points + + mapping(address user => uint256 experience) public userExperience; + /// @notice Influence colors available + + enum InfluenceColor { + Undefined, // unused + Whale, // based, pink + Minnow // boosted, purple + + } + + /// @notice Recruitment types + enum RecruitmentType { + Undefined, + Claim, + Migration + } + /// @notice Hash types + enum HashType { + Undefined, + Start, + End, + Influence + } + + /// @notice Configuration struct + struct Config { + uint256 cooldownRecruitment; + uint256 cooldownInfluence; + uint256 influenceWeightPercent; + uint256 baseMaxInfluences; + uint256 maxInfluencesDivider; + uint256 defaultCycleDuration; + } + /// @notice Current config + + Config private config; + /// @notice Recruitment struct + + struct Recruitment { + uint256 recruitmentCycle; + address user; + uint256 s1BadgeId; + uint256 s1TokenId; + uint256 s2TokenId; + uint256 cooldownExpiration; + uint256 influenceExpiration; + uint256 whaleInfluences; + uint256 minnowInfluences; + } + /// @notice Recruitment Cycle struct + + struct RecruitmentCycle { + uint256 cycleId; + uint256 startTime; + uint256 endTime; + uint256[] s1BadgeIds; + } + + /// @notice Recruitment cycles + mapping(uint256 cycleId => RecruitmentCycle recruitmentCycle) public recruitmentCycles; + + /// @notice Recruitments per user + + mapping(address _user => Recruitment[] _recruitment) public recruitments; + /// @notice Gap for upgrade safety + uint256[43] private __gap; + /// @notice Errors + + error MAX_INFLUENCES_REACHED(); + error RECRUITMENT_NOT_STARTED(); + error RECRUITMENT_ALREADY_STARTED(); + error INFLUENCE_IN_PROGRESS(); + error RECRUITMENT_NOT_READY(); + error RECRUITMENT_NOT_ENABLED(); + error TOKEN_NOT_OWNED(); + error NOT_RANDOM_SIGNER(); + error ALREADY_MIGRATED_IN_CYCLE(); + error HASH_MISMATCH(); + error NOT_S1_CONTRACT(); + error EXP_TOO_LOW(); + error INVALID_INFLUENCE_COLOR(); + error CURRENT_CYCLE_NOT_OVER(); + /// @notice Events + + event RecruitmentCycleToggled( + uint256 indexed recruitmentCycleId, + uint256 indexed startTime, + uint256 indexed endTime, + uint256[] s1BadgeIds, + bool enabled + ); + + event RecruitmentUpdated( + uint256 indexed recruitmentCycle, + address indexed user, + uint256 s1BadgeId, + uint256 s1TokenId, + uint256 s2TokenId, + uint256 cooldownExpiration, + uint256 influenceExpiration, + uint256 whaleInfluences, + uint256 minnowInfluences + ); + + event RecruitmentComplete( + uint256 indexed recruitmentCycle, + address indexed user, + uint256 s1TokenId, + uint256 s2TokenId, + uint256 finalColor + ); + + /// @notice Check if the message sender has an active recruitment + modifier isMigrating() { + Recruitment memory recruitment_ = getActiveRecruitmentFor(_msgSender()); + if (recruitment_.cooldownExpiration == 0) { + revert RECRUITMENT_NOT_STARTED(); + } + _; + } + + /// @notice Reverts if sender is already migrating + modifier isNotMigrating(address _user) { + if ( + recruitments[_user].length > 0 + && recruitments[_user][recruitments[_user].length - 1].cooldownExpiration + > block.timestamp + ) { + revert RECRUITMENT_ALREADY_STARTED(); + } + _; + } + + /// @notice Reverts if recruitments aren't enabled for that badge + /// @param _s1BadgeId The badge ID + modifier recruitmentOpen(uint256 _s1BadgeId) { + RecruitmentCycle memory cycle_ = recruitmentCycles[recruitmentCycleId]; + + if (cycle_.startTime > block.timestamp || cycle_.endTime < block.timestamp) { + revert RECRUITMENT_NOT_ENABLED(); + } + + bool found_ = false; + + for (uint256 i = 0; i < cycle_.s1BadgeIds.length; i++) { + if (cycle_.s1BadgeIds[i] == _s1BadgeId) { + found_ = true; + break; + } + } + + if (!found_) { + revert RECRUITMENT_NOT_ENABLED(); + } + _; + } + + /// @notice Limits recruitments to one per user, badge and cycle + /// @param _s1BadgeId The badge ID + /// @param _minter The minter address + /// @param _recruitmentType The recruitment type + modifier hasntMigratedInCycle( + uint256 _s1BadgeId, + address _minter, + RecruitmentType _recruitmentType + ) { + // check that the minter hasn't used the recruitment within this cycle + if (recruitmentCycleUniqueMints[recruitmentCycleId][_minter][_s1BadgeId][_recruitmentType]) + { + revert ALREADY_MIGRATED_IN_CYCLE(); + } + _; + } + + /// @notice Contract initializer + /// @param _s1Badges The Season 1 Badges contract address + /// @param _s2Badges The Season 2 Badges contract address + /// @param _randomSigner The random signer address + /// @param _config The initial configuration + function initialize( + address _s1Badges, + address _s2Badges, + address _randomSigner, + Config memory _config + ) + external + initializer + { + _transferOwnership(_msgSender()); + __Context_init(); + _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); + s1Badges = TrailblazersBadgesV4(_s1Badges); + _grantRole(S1_BADGES_ROLE, _s1Badges); + s2Badges = TrailblazersBadgesS2(_s2Badges); + randomSigner = _randomSigner; + config = _config; + } + + /// @notice Upgrade configuration + /// @param _config The new configuration + function setConfig(Config memory _config) external onlyRole(DEFAULT_ADMIN_ROLE) { + config = _config; + } + + /// @notice Get the current configuration + /// @return The current configuration + function getConfig() external view returns (Config memory) { + return config; + } + + /// @notice Disable all current recruitments + /// @dev Bypasses the default date checks + function forceDisableRecruitments() internal onlyRole(DEFAULT_ADMIN_ROLE) { + recruitmentCycles[recruitmentCycleId].endTime = block.timestamp; + } + + /// @notice Enable recruitments for a set of badges + /// @param _startTime The start time of the recruitment cycle + /// @param _endTime The end time of the recruitment cycle + /// @param _s1BadgeIds The badge IDs to enable + function _enableRecruitments( + uint256 _startTime, + uint256 _endTime, + uint256[] calldata _s1BadgeIds + ) + internal + { + if ( + recruitmentCycleId > 0 + && recruitmentCycles[recruitmentCycleId].endTime > block.timestamp + ) { + revert CURRENT_CYCLE_NOT_OVER(); + } + // emit disabled badges + emit RecruitmentCycleToggled( + recruitmentCycleId, + recruitmentCycles[recruitmentCycleId].startTime, + recruitmentCycles[recruitmentCycleId].endTime, + recruitmentCycles[recruitmentCycleId].s1BadgeIds, + false + ); + + recruitmentCycleId++; + recruitmentCycles[recruitmentCycleId] = + RecruitmentCycle(recruitmentCycleId, _startTime, _endTime, _s1BadgeIds); + + // emit enabled badges + emit RecruitmentCycleToggled(recruitmentCycleId, _startTime, _endTime, _s1BadgeIds, true); + } + + /// @notice Enable recruitments for a set of badges + /// @param _s1BadgeIds The badge IDs to enable + /// @dev Can be called only by the contract owner/admin + function enableRecruitments(uint256[] calldata _s1BadgeIds) + external + onlyRole(DEFAULT_ADMIN_ROLE) + { + _enableRecruitments( + block.timestamp, block.timestamp + config.defaultCycleDuration, _s1BadgeIds + ); + } + + /// @notice Enable recruitments for a set of badges + /// @param _startTime The start time of the recruitment cycle + /// @param _endTime The end time of the recruitment cycle + /// @param _s1BadgeIds The badge IDs to enable + /// @dev Can be called only by the contract owner/admin + function enableRecruitments( + uint256 _startTime, + uint256 _endTime, + uint256[] calldata _s1BadgeIds + ) + external + onlyRole(DEFAULT_ADMIN_ROLE) + { + _enableRecruitments(_startTime, _endTime, _s1BadgeIds); + } + + /// @notice Get the current recruitment cycle + /// @return The current recruitment cycle + function getRecruitmentCycle(uint256 _cycleId) + external + view + returns (RecruitmentCycle memory) + { + return recruitmentCycles[_cycleId]; + } + + /// @notice Internal logic to start a recruitment + /// @param _user The user address + /// @param _s1BadgeId The badge ID + /// @param _s1TokenId The badge token ID + /// @param _recruitmentType The recruitment type + function _startRecruitment( + address _user, + uint256 _s1BadgeId, + uint256 _s1TokenId, + RecruitmentType _recruitmentType + ) + internal + virtual + { + Recruitment memory _recruitment = Recruitment( + recruitmentCycleId, // recruitmentCycle + _user, // user + _s1BadgeId, + _s1TokenId, + 0, // s2TokenId, unset + block.timestamp + config.cooldownRecruitment, // cooldownExpiration + 0, // influenceExpiration, unset + 0, // whaleInfluences + 0 // minnowInfluences + ); + + recruitments[_user].push(_recruitment); + recruitmentCycleUniqueMints[recruitmentCycleId][_user][_s1BadgeId][_recruitmentType] = true; + + emit RecruitmentUpdated( + _recruitment.recruitmentCycle, + _recruitment.user, + _recruitment.s1BadgeId, + _recruitment.s1TokenId, + _recruitment.s2TokenId, + _recruitment.cooldownExpiration, + _recruitment.influenceExpiration, + _recruitment.whaleInfluences, + _recruitment.minnowInfluences + ); + } + + /// @notice Start a recruitment for a badge using the user's experience points + /// @param _hash The hash to sign of the signature + /// @param _v The signature V field + /// @param _r The signature R field + /// @param _s The signature S field + /// @param _exp The user's experience points + function startRecruitment( + bytes32 _hash, + uint8 _v, + bytes32 _r, + bytes32 _s, + uint256 _exp + ) + external + virtual + isNotMigrating(_msgSender()) + { + bytes32 calculatedHash_ = generateClaimHash(HashType.Start, _msgSender(), _exp); + + if (calculatedHash_ != _hash) { + revert HASH_MISMATCH(); + } + + (address recovered_,,) = ECDSA.tryRecover(_hash, _v, _r, _s); + if (recovered_ != randomSigner) { + revert NOT_RANDOM_SIGNER(); + } + + if (_exp < userExperience[_msgSender()]) { + revert EXP_TOO_LOW(); + } + + userExperience[_msgSender()] = _exp; + + RecruitmentCycle memory cycle_ = recruitmentCycles[recruitmentCycleId]; + if (cycle_.startTime > block.timestamp || cycle_.endTime < block.timestamp) { + revert RECRUITMENT_NOT_ENABLED(); + } + uint256 randomSeed_ = randomFromSignature(_hash, _v, _r, _s); + uint256 s1BadgeId_ = cycle_.s1BadgeIds[randomSeed_ % cycle_.s1BadgeIds.length]; + + if ( + recruitmentCycleUniqueMints[recruitmentCycleId][_msgSender()][s1BadgeId_][RecruitmentType + .Claim] + ) { + revert ALREADY_MIGRATED_IN_CYCLE(); + } + + _startRecruitment(_msgSender(), s1BadgeId_, 0, RecruitmentType.Claim); + } + + /// @notice Start a recruitment for a badge using the user's experience points + /// @param _hash The hash to sign of the signature + /// @param _v The signature V field + /// @param _r The signature R field + /// @param _s The signature S field + /// @param _exp The user's experience points + /// @param _s1BadgeId The badge ID (s1) + function startRecruitment( + bytes32 _hash, + uint8 _v, + bytes32 _r, + bytes32 _s, + uint256 _exp, + uint256 _s1BadgeId + ) + external + virtual + isNotMigrating(_msgSender()) + recruitmentOpen(_s1BadgeId) + hasntMigratedInCycle(_s1BadgeId, _msgSender(), RecruitmentType.Claim) + { + bytes32 calculatedHash_ = generateClaimHash(HashType.Start, _msgSender(), _s1BadgeId); + + if (calculatedHash_ != _hash) { + revert HASH_MISMATCH(); + } + + (address recovered_,,) = ECDSA.tryRecover(_hash, _v, _r, _s); + if (recovered_ != randomSigner) { + revert NOT_RANDOM_SIGNER(); + } + + if (_exp < userExperience[_msgSender()]) { + revert EXP_TOO_LOW(); + } + + userExperience[_msgSender()] = _exp; + + _startRecruitment(_msgSender(), _s1BadgeId, 0, RecruitmentType.Claim); + } + + /// @notice Start a recruitment for a badge + /// @param _s1BadgeId The badge ID (s1) + /// @dev Not all badges are eligible for recruitment at the same time + /// @dev Defines a cooldown for the recruitment to be complete + /// @dev the cooldown is lesser the higher the Pass Tier + /// @dev Must be called from the s1 badges contract + function startRecruitment( + address _user, + uint256 _s1BadgeId + ) + external + virtual + onlyRole(S1_BADGES_ROLE) + recruitmentOpen(_s1BadgeId) + isNotMigrating(_user) + hasntMigratedInCycle(_s1BadgeId, _user, RecruitmentType.Migration) + { + uint256 s1TokenId_ = s1Badges.getTokenId(_user, _s1BadgeId); + + if (s1Badges.ownerOf(s1TokenId_) != _user) { + revert TOKEN_NOT_OWNED(); + } + _startRecruitment(_user, _s1BadgeId, s1TokenId_, RecruitmentType.Migration); + } + + /// @notice Get the active recruitment for a user + /// @param _user The user address + /// @return The active recruitment + function getActiveRecruitmentFor(address _user) public view returns (Recruitment memory) { + if (recruitments[_user].length == 0) { + revert RECRUITMENT_NOT_STARTED(); + } + return recruitments[_user][recruitments[_user].length - 1]; + } + + /// @notice Update a recruitment + /// @param _recruitment The updated recruitment + function _updateRecruitment(Recruitment memory _recruitment) internal virtual { + recruitments[_recruitment.user][recruitments[_recruitment.user].length - 1] = _recruitment; + + emit RecruitmentUpdated( + _recruitment.recruitmentCycle, + _recruitment.user, + _recruitment.s1BadgeId, + _recruitment.s1TokenId, + _recruitment.s2TokenId, + _recruitment.cooldownExpiration, + _recruitment.influenceExpiration, + _recruitment.whaleInfluences, + _recruitment.minnowInfluences + ); + } + + /// @notice Get the maximum number of influences for a given experience + /// @param _exp The user's experience points + function maxInfluences(uint256 _exp) public view virtual returns (uint256 value) { + value = 0; // _exp / config.maxInfluencesDivider; + value += config.baseMaxInfluences; + return value; + } + + /// @notice Influence (alter) the chances during a recruitment + /// @param _hash The hash to sign + /// @param _v signature V field + /// @param _r signature R field + /// @param _s signature S field + /// @param _influenceColor the influence's color + /// @dev Can be called only during an active recruitment + /// @dev Implements a cooldown before allowing to re-influence + /// @dev The max influence amount is determined by Pass Tier + function influenceRecruitment( + bytes32 _hash, + uint8 _v, + bytes32 _r, + bytes32 _s, + uint256 _exp, + InfluenceColor _influenceColor + ) + external + isMigrating + { + bytes32 calculatedHash_ = generateClaimHash(HashType.Influence, _msgSender(), _exp); + + if (calculatedHash_ != _hash) { + revert HASH_MISMATCH(); + } + + (address recovered_,,) = ECDSA.tryRecover(_hash, _v, _r, _s); + if (recovered_ != randomSigner) revert NOT_RANDOM_SIGNER(); + Recruitment memory recruitment_ = getActiveRecruitmentFor(_msgSender()); + + if ((recruitment_.whaleInfluences + recruitment_.minnowInfluences) >= maxInfluences(_exp)) { + revert MAX_INFLUENCES_REACHED(); + } + + if (recruitment_.influenceExpiration > block.timestamp) { + revert INFLUENCE_IN_PROGRESS(); + } + + // apply the influence, and reset the other + if (_influenceColor == InfluenceColor.Whale) { + recruitment_.whaleInfluences++; + recruitment_.minnowInfluences = 0; + } else if (_influenceColor == InfluenceColor.Minnow) { + recruitment_.minnowInfluences++; + recruitment_.whaleInfluences = 0; + } else { + revert INVALID_INFLUENCE_COLOR(); + } + + recruitment_.influenceExpiration = block.timestamp + config.cooldownInfluence; + + _updateRecruitment(recruitment_); + } + + /// @notice End a recruitment + /// @param _hash The hash to sign + /// @param _v signature V field + /// @param _r signature R field + /// @param _s signature S field + /// @param _exp The user's experience points + /// @dev Can be called only during an active recruitment, after the cooldown is over + /// @dev The final color is determined randomly, and affected by the influence amounts + function endRecruitment( + bytes32 _hash, + uint8 _v, + bytes32 _r, + bytes32 _s, + uint256 _exp + ) + external + isMigrating + { + Recruitment memory recruitment_ = getActiveRecruitmentFor(_msgSender()); + + if (recruitment_.influenceExpiration > block.timestamp) { + revert INFLUENCE_IN_PROGRESS(); + } + // check if the cooldown is over + if (recruitment_.cooldownExpiration > block.timestamp) { + revert RECRUITMENT_NOT_READY(); + } + // ensure the hash corresponds to the start time + bytes32 calculatedHash_ = generateClaimHash(HashType.End, _msgSender(), _exp); + + if (calculatedHash_ != _hash) { + revert HASH_MISMATCH(); + } + + uint256 randomSeed_ = randomFromSignature(_hash, _v, _r, _s); + + uint256 whaleWeight_ = 50 + recruitment_.whaleInfluences * config.influenceWeightPercent; + uint256 minnowWeight_ = 50 + recruitment_.minnowInfluences * config.influenceWeightPercent; + + uint256 totalWeight_ = whaleWeight_ + minnowWeight_; + + uint256 randomValue = randomSeed_ % totalWeight_; + + TrailblazersBadgesS2.MovementType finalColor_; + if (randomValue < minnowWeight_) { + finalColor_ = TrailblazersBadgesS2.MovementType.Minnow; + } else { + finalColor_ = TrailblazersBadgesS2.MovementType.Whale; + } + + uint256 s1BadgeId_ = recruitment_.s1BadgeId; + + // mint the badge + s2Badges.mint(_msgSender(), TrailblazersBadgesS2.BadgeType(s1BadgeId_), finalColor_); + uint256 s2TokenId_ = s2Badges.totalSupply(); + + recruitment_.s2TokenId = s2TokenId_; + recruitment_.cooldownExpiration = 0; + recruitment_.influenceExpiration = 0; + + _updateRecruitment(recruitment_); + + emit RecruitmentComplete( + recruitment_.recruitmentCycle, + recruitment_.user, + recruitment_.s1TokenId, + recruitment_.s2TokenId, + uint256(finalColor_) + ); + } + + /// @notice Generate a unique hash for each recruitment uniquely + /// @param _user The user address + /// @param _exp The users experience points + /// @return _hash The unique hash + function generateClaimHash( + HashType _hashType, + address _user, + uint256 _exp + ) + public + pure + returns (bytes32) + { + return keccak256(abi.encodePacked(_hashType, _user, _exp)); + } + + /// @notice Check if a recruitment is active for a user + /// @param _user The user address + /// @return Whether the user has an active recruitment + function isRecruitmentActive(address _user) public view returns (bool) { + if (recruitments[_user].length == 0) { + return false; + } + Recruitment memory recruitment_ = getActiveRecruitmentFor(_user); + return recruitment_.cooldownExpiration != 0; + } + + /// @notice Generates a random number from a signature + /// @param _hash The hash to sign + /// @param _v signature V field + /// @param _r signature R field + /// @param _s signature S field + /// @return _random The pseudo-random number + function randomFromSignature( + bytes32 _hash, + uint8 _v, + bytes32 _r, + bytes32 _s + ) + public + view + returns (uint256 _random) + { + (address recovered_,,) = ECDSA.tryRecover(_hash, _v, _r, _s); + if (recovered_ != randomSigner) revert NOT_RANDOM_SIGNER(); + return uint256(keccak256(abi.encodePacked(_r, _s, _v))); + } + + /// @notice Check if a influence is active for a user + /// @param _user The user address + /// @return Whether the user has an active influence + function isInfluenceActive(address _user) public view returns (bool) { + Recruitment memory recruitment_ = getActiveRecruitmentFor(_user); + return recruitment_.influenceExpiration > block.timestamp; + } + + /// @notice Get the recruitment influence counts for a user + /// @param _user The user address + /// @return _whaleInfluences The Whale influence count + /// @return _minnowInfluences The Minnow influence count + function getRecruitmentInfluences(address _user) + public + view + returns (uint256 _whaleInfluences, uint256 _minnowInfluences) + { + if (!isRecruitmentActive(_user)) { + revert RECRUITMENT_NOT_STARTED(); + } + Recruitment memory recruitment_ = getActiveRecruitmentFor(_user); + return (recruitment_.whaleInfluences, recruitment_.minnowInfluences); + } + + /// @notice supportsInterface implementation + /// @param _interfaceId The interface ID + /// @return Whether the interface is supported + function supportsInterface(bytes4 _interfaceId) public view override returns (bool) { + return super.supportsInterface(_interfaceId); + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } +} diff --git a/packages/nfts/contracts/trailblazers-season-2/BadgeRecruitmentV2.sol b/packages/nfts/contracts/trailblazers-season-2/BadgeRecruitmentV2.sol new file mode 100644 index 00000000000..cb14278a371 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-season-2/BadgeRecruitmentV2.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "./BadgeRecruitment.sol"; + +contract BadgeRecruitmentV2 is BadgeRecruitment { + /// @notice Events + event RecruitmentReset( + uint256 indexed cycleId, address indexed user, uint256 indexed s1TokenId, uint256 s1BadgeId + ); + + /// @notice Errors + error RECRUITMENT_ALREADY_COMPLETED(); + error RECRUITMENT_NOT_FOUND(); + error NOT_ENOUGH_TIME_LEFT(); + + modifier recruitmentHasTimeLeft(address _user) { + uint256 endCycleTime = recruitmentCycles[recruitmentCycleId].endTime; + uint256 potentialRecruitmentEndTime = block.timestamp + this.getConfig().cooldownRecruitment; + + if (potentialRecruitmentEndTime > endCycleTime) { + revert NOT_ENOUGH_TIME_LEFT(); + } + _; + } + + /// @notice Updated version function + function version() external pure virtual returns (string memory) { + return "V2"; + } + + /// @notice Start a recruitment for a badge + /// @param _s1BadgeId The badge ID (s1) + /// @dev Not all badges are eligible for recruitment at the same time + /// @dev Defines a cooldown for the recruitment to be complete + /// @dev the cooldown is lesser the higher the Pass Tier + /// @dev Must be called from the s1 badges contract + function startRecruitment( + address _user, + uint256 _s1BadgeId, + uint256 _s1TokenId + ) + external + virtual + onlyRole(S1_BADGES_ROLE) + recruitmentOpen(_s1BadgeId) + isNotMigrating(_user) + hasntMigratedInCycle(_s1BadgeId, _user, RecruitmentType.Migration) + recruitmentHasTimeLeft(_user) + { + if (s1Badges.ownerOf(_s1TokenId) != _user) { + revert TOKEN_NOT_OWNED(); + } + _startRecruitment(_user, _s1BadgeId, _s1TokenId, RecruitmentType.Migration); + } + + /// @notice Disable all current recruitments + /// @dev Bypasses the default date checks + function forceDisableAllRecruitments() external virtual onlyRole(DEFAULT_ADMIN_ROLE) { + forceDisableRecruitments(); + + emit RecruitmentCycleToggled( + recruitmentCycleId, + recruitmentCycles[recruitmentCycleId].startTime, + recruitmentCycles[recruitmentCycleId].endTime, + recruitmentCycles[recruitmentCycleId].s1BadgeIds, + false + ); + } + + /// @notice Get the active recruitment for a user + /// @param _user The user address + /// @return The active recruitment + function getActiveRecruitmentsFor(address _user) public view returns (Recruitment[] memory) { + if (recruitments[_user].length == 0) { + revert RECRUITMENT_NOT_STARTED(); + } + return recruitments[_user]; + } + + /// @notice Reset a recruitment that hasn't been completed + /// @param _user The user address + /// @param _s1TokenId The s1 token ID + /// @param _s1BadgeId The s1 badge ID + /// @param _recruitmentCycle The recruitment index + /// @dev Must be called from the s1 badges contract + function resetRecruitment( + address _user, + uint256 _s1TokenId, + uint256 _s1BadgeId, + uint256 _recruitmentCycle + ) + public + virtual + onlyRole(S1_BADGES_ROLE) + { + if ( + !recruitmentCycleUniqueMints[_recruitmentCycle][_user][_s1BadgeId][RecruitmentType + .Migration] + && !recruitmentCycleUniqueMints[_recruitmentCycle][_user][_s1BadgeId][RecruitmentType.Claim] + && !recruitmentCycleUniqueMints[_recruitmentCycle][_user][_s1BadgeId][RecruitmentType + .Undefined] + ) { + revert RECRUITMENT_NOT_FOUND(); + } + + bool found = false; + + for (uint256 i = 0; i < recruitments[_user].length; i++) { + if ( + recruitments[_user][i].recruitmentCycle == _recruitmentCycle + && recruitments[_user][i].s1TokenId == _s1TokenId + && recruitments[_user][i].s2TokenId == 0 + ) { + delete recruitments[_user][i]; + found = true; + break; + } + } + + if (!found) { + revert RECRUITMENT_NOT_FOUND(); + } + + recruitmentCycleUniqueMints[_recruitmentCycle][_user][_s1BadgeId][RecruitmentType.Undefined] + = false; + recruitmentCycleUniqueMints[_recruitmentCycle][_user][_s1BadgeId][RecruitmentType.Claim] = + false; + recruitmentCycleUniqueMints[_recruitmentCycle][_user][_s1BadgeId][RecruitmentType.Migration] + = false; + + emit RecruitmentReset(_recruitmentCycle, _user, _s1TokenId, _s1BadgeId); + } + + /// @notice Set the s2 badges contract + /// @param _s2Badges The s2 badges contract address + /// @dev Must be called from the admin account + function setS2BadgesContract(address _s2Badges) external virtual onlyRole(DEFAULT_ADMIN_ROLE) { + s2Badges = TrailblazersBadgesS2(_s2Badges); + } +} diff --git a/packages/nfts/contracts/trailblazers-season-2/TrailblazersBadgesS2.sol b/packages/nfts/contracts/trailblazers-season-2/TrailblazersBadgesS2.sol new file mode 100644 index 00000000000..5984e3a3e75 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-season-2/TrailblazersBadgesS2.sol @@ -0,0 +1,211 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol"; +import "../trailblazers-badges/ECDSAWhitelist.sol"; +import "@taiko/blacklist/IMinimalBlacklist.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/utils/ERC721HolderUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import "./TrailblazersS1BadgesV4.sol"; +import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; + +contract TrailblazersBadgesS2 is + ContextUpgradeable, + UUPSUpgradeable, + Ownable2StepUpgradeable, + AccessControlUpgradeable, + ERC1155SupplyUpgradeable +{ + /// @notice Badge types + enum BadgeType { + Ravers, // s1 id: 0 + Robots, // s1 id: 1 + Bouncers, // s1 id: 2 + Masters, // s1 id: 3 + Monks, // s1 id: 4 + Androids, // s1 id: 5 + Drummers, // s1 id: 6 + Shinto // s1 id: 7 + + } + + /// @notice Movement types + enum MovementType { + Undefined, // unused + Whale, // s1 based/pink + Minnow // s1 boosted/purple + + } + + /// @notice Badge struct + struct Badge { + uint256 tokenId; + BadgeType badgeType; + MovementType movementType; + } + + /// @notice Badge mapping + mapping(uint256 tokenId => Badge badge) private badges; + /// @notice User, Badge, and Movement relation to tokenId + mapping( + address user + => mapping(BadgeType badgeType => mapping(MovementType movementType => uint256 tokenId)) + ) private userBadges; + /// @notice Badge URI template + string public uriTemplate; + /// @notice Minter address; BadgeMigration contract + address public minter; + /// @notice Minter role + bytes32 public constant MINTER_ROLE = keccak256("MINTER"); + /// @notice Gap for upgrade safety + uint256[43] private __gap; + + /// @notice Errors + error NOT_MINTER(); + error TOKEN_NOT_MINTED(); + + /// @notice Initialize the contract + /// @param _minter The minter address + /// @param _uriTemplate The badge URI template + function initialize( + address _minter, + string calldata _uriTemplate + ) + external + virtual + initializer + { + __ERC1155_init(""); + __ERC1155Supply_init(); + _transferOwnership(_msgSender()); + __Context_init(); + _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); + _grantRole(MINTER_ROLE, _minter); + minter = _minter; + uriTemplate = _uriTemplate; + } + + /// @notice Set the minter address + /// @param _minter The minter address + /// @dev Only the owner can call this function + function setMinter(address _minter) external virtual onlyRole(DEFAULT_ADMIN_ROLE) { + minter = _minter; + _grantRole(MINTER_ROLE, _minter); + } + + /// @notice Mint a badge + /// @param _to The address to mint the badge to + /// @param _badgeType The badge type + /// @param _movementType The movement type + /// @dev Only the minter can call this function + function mint( + address _to, + BadgeType _badgeType, + MovementType _movementType + ) + external + virtual + onlyRole(MINTER_ROLE) + { + uint256 tokenId_ = totalSupply() + 1; + Badge memory badge_ = Badge(tokenId_, _badgeType, _movementType); + _mint(_to, tokenId_, 1, ""); + badges[tokenId_] = badge_; + } + + /// @notice Internal method to assemble URIs + /// @param _badgeType The badge type + /// @param _movementType The movement type + /// @return The URI + function _uri( + BadgeType _badgeType, + MovementType _movementType + ) + internal + view + virtual + returns (string memory) + { + string memory badgeType_ = Strings.toString(uint256(_badgeType)); + string memory movementType_ = Strings.toString(uint256(_movementType)); + + return string(abi.encodePacked(uriTemplate, "/", movementType_, "/", badgeType_)); + } + + /// @notice Retrieve the URI for a badge given the type & movement + /// @param _badgeType The badge type + /// @param _movementType The movement type + /// @return The URI + function uri( + BadgeType _badgeType, + MovementType _movementType + ) + external + view + virtual + returns (string memory) + { + return _uri(_badgeType, _movementType); + } + + /// @notice Retrieve the URI for a badge given the token ID + /// @param _tokenId The token ID + /// @return The URI + function uri(uint256 _tokenId) public view virtual override returns (string memory) { + if (_tokenId > totalSupply()) { + revert TOKEN_NOT_MINTED(); + } + Badge memory badge_ = badges[_tokenId]; + return _uri(badge_.badgeType, badge_.movementType); + } + + /// @notice Retrieve a badge + /// @param _tokenId The token ID + /// @return The badge + function getBadge(uint256 _tokenId) external view virtual returns (Badge memory) { + if (_tokenId < totalSupply()) { + revert TOKEN_NOT_MINTED(); + } + return badges[_tokenId]; + } + + /// @notice supportsInterface implementation + /// @param _interfaceId The interface ID + /// @return Whether the interface is supported + function supportsInterface(bytes4 _interfaceId) + public + view + virtual + override(AccessControlUpgradeable, ERC1155Upgradeable) + returns (bool) + { + return super.supportsInterface(_interfaceId); + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } + + // v2 + + function version() public pure returns (string memory) { + return "v2"; + } + + function setUri(string memory __uri) public onlyRole(DEFAULT_ADMIN_ROLE) { + uriTemplate = __uri; + } +} diff --git a/packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV4.sol b/packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV4.sol new file mode 100644 index 00000000000..f3313f03350 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV4.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "../trailblazers-badges/TrailblazersBadgesV3.sol"; +import "./BadgeRecruitment.sol"; + +contract TrailblazersBadgesV4 is TrailblazersBadgesV3 { + /// @notice Duration for which a s1 badge is locked after recruitment is started + uint256 public recruitmentLockDuration; + /// @notice BadgeRecruitment contract + BadgeRecruitment public recruitmentContract; + /// @notice Mapping of badge token id to unlock timestamp + mapping(uint256 tokenId => uint256 unlockTimestamp) public unlockTimestamps; + + /// @notice Errors + error BADGE_LOCKED(); + error RECRUITMENT_LOCK_DURATION_NOT_SET(); + + /// @notice Updated version function + /// @return Version string + function version() external pure virtual override returns (string memory) { + return "V4"; + } + + /// @notice Overwritten update function that prevents locked badges from being transferred + /// @param to Address to transfer badge to + /// @param tokenId Badge token id + /// @param auth Address to authorize transfer + /// @return Address of the recipient + function _update( + address to, + uint256 tokenId, + address auth + ) + internal + virtual + override + returns (address) + { + if (unlockTimestamps[tokenId] > block.timestamp) { + revert BADGE_LOCKED(); + } + return super._update(to, tokenId, auth); + } + + /// @notice Set recruitment contract + /// @param _recruitmentContract Address of the recruitment contract + /// @dev Only owner + function setRecruitmentContract(address _recruitmentContract) public onlyOwner { + recruitmentContract = BadgeRecruitment(_recruitmentContract); + } + + /// @notice Set recruitment lock duration + /// @param _duration Duration in seconds + /// @dev Only owner + function setRecruitmentLockDuration(uint256 _duration) public onlyOwner { + recruitmentLockDuration = _duration; + } + + /// @notice Start recruitment for a badge + /// @param _badgeId Badge id + function startRecruitment(uint256 _badgeId) public virtual { + if (recruitmentLockDuration == 0) { + revert RECRUITMENT_LOCK_DURATION_NOT_SET(); + } + uint256 tokenId = getTokenId(_msgSender(), _badgeId); + unlockTimestamps[tokenId] = block.timestamp + recruitmentLockDuration; + recruitmentContract.startRecruitment(_msgSender(), _badgeId); + } +} diff --git a/packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV5.sol b/packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV5.sol new file mode 100644 index 00000000000..9dbf8942068 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV5.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "./TrailblazersS1BadgesV4.sol"; +import "./BadgeRecruitment.sol"; +import "./BadgeRecruitmentV2.sol"; + +contract TrailblazersBadgesV5 is TrailblazersBadgesV4 { + /// @notice Errors + error RECRUITMENT_ALREADY_COMPLETED(); + error NOT_OWNER(); + error NOT_IMPLEMENTED(); + error RECRUITMENT_NOT_FOUND(); + /// @notice Updated version function + /// @return Version string + + function version() external pure virtual override returns (string memory) { + return "V5"; + } + /// @notice Recruitment contract + + BadgeRecruitmentV2 public recruitmentContractV2; + /// @notice Setter for recruitment contract + + function setRecruitmentContractV2(address _recruitmentContractV2) public onlyOwner { + recruitmentContractV2 = BadgeRecruitmentV2(_recruitmentContractV2); + } + + /// @notice Start recruitment for a badge + /// @param _badgeId Badge ID + /// @param _tokenId Token ID + function startRecruitment(uint256 _badgeId, uint256 _tokenId) public { + if (recruitmentLockDuration == 0) { + revert RECRUITMENT_LOCK_DURATION_NOT_SET(); + } + if (ownerOf(_tokenId) != _msgSender()) { + revert NOT_OWNER(); + } + + if (unlockTimestamps[_tokenId] > block.timestamp) { + revert BADGE_LOCKED(); + } + + unlockTimestamps[_tokenId] = block.timestamp + recruitmentLockDuration; + recruitmentContractV2.startRecruitment(_msgSender(), _badgeId, _tokenId); + } + + /// @notice Deprecated of legacy function + function startRecruitment(uint256 /*_badgeId*/ ) public virtual override { + revert NOT_IMPLEMENTED(); + } + + /// @notice Reset an ongoing migration + /// @param _tokenId Token ID + /// @param _badgeId Badge ID + /// @param _cycleId Cycle ID + /// @dev Only the owner of the token can reset the migration + function resetMigration(uint256 _tokenId, uint256 _badgeId, uint256 _cycleId) public virtual { + if (ownerOf(_tokenId) != _msgSender()) { + revert NOT_OWNER(); + } + + recruitmentContractV2.resetRecruitment(_msgSender(), _tokenId, _badgeId, _cycleId); + unlockTimestamps[_tokenId] = 0; + } +} diff --git a/packages/nfts/data/party-token/metadata/golden-winner.json b/packages/nfts/data/party-token/metadata/golden-winner.json new file mode 100644 index 00000000000..53d54f7c9f2 --- /dev/null +++ b/packages/nfts/data/party-token/metadata/golden-winner.json @@ -0,0 +1,5 @@ +{ + "name": "[GW] KBW Party Raffle Ticket", + "description": "A unique raffle ticket for the KBW Party. This ticket won a special prize at the raffle.", + "image": "https://taikonfts.4everland.link/ipfs/bafybeif2piyppimpd4rn6wkq4mxtwdgajil7vt6shkb2gt72a2zyqufg2a/golden-winner.png" +} diff --git a/packages/nfts/data/party-token/metadata/loser.json b/packages/nfts/data/party-token/metadata/loser.json new file mode 100644 index 00000000000..d0814c76707 --- /dev/null +++ b/packages/nfts/data/party-token/metadata/loser.json @@ -0,0 +1,5 @@ +{ + "name": "[L] KBW Party Raffle Ticket", + "description": "A raffle ticket for the KBW Party. This ticket won nothing at the raffle.", + "image": "https://taikonfts.4everland.link/ipfs/bafybeif2piyppimpd4rn6wkq4mxtwdgajil7vt6shkb2gt72a2zyqufg2a/loser.png" +} diff --git a/packages/nfts/data/party-token/metadata/raffle.json b/packages/nfts/data/party-token/metadata/raffle.json new file mode 100644 index 00000000000..429c5cbf593 --- /dev/null +++ b/packages/nfts/data/party-token/metadata/raffle.json @@ -0,0 +1,5 @@ +{ + "name": "KBW Party Raffle Ticket", + "description": "A raffle ticket for the KBW Party. This ticket gives you a chance to win a special prize.", + "image": "https://taikonfts.4everland.link/ipfs/bafybeif2piyppimpd4rn6wkq4mxtwdgajil7vt6shkb2gt72a2zyqufg2a/raffle.png" +} diff --git a/packages/nfts/data/party-token/metadata/winner.json b/packages/nfts/data/party-token/metadata/winner.json new file mode 100644 index 00000000000..9f301d467e7 --- /dev/null +++ b/packages/nfts/data/party-token/metadata/winner.json @@ -0,0 +1,6 @@ +{ + "name": "[W] KBW Party Raffle Ticket", + "description": "A raffle ticket for the KBW Party. This ticket won a special prize at the raffle.", + "image": "https://taikonfts.4everland.link/ipfs/bafybeif2piyppimpd4rn6wkq4mxtwdgajil7vt6shkb2gt72a2zyqufg2a/winner.gif", + "animation_url": "https://taikonfts.4everland.link/ipfs/bafybeif2piyppimpd4rn6wkq4mxtwdgajil7vt6shkb2gt72a2zyqufg2a/winner.gif" +} diff --git a/packages/nfts/data/party-token/static/golden-winner.png b/packages/nfts/data/party-token/static/golden-winner.png new file mode 100644 index 0000000000000000000000000000000000000000..1578f5b11ad5bb3bec956b09ab424f3d8090cc4f GIT binary patch literal 356870 zcmV(_K-9m9P)FvgG(dYA}3kfSF) zY34~0qZct0GozRZNuVfUK!5~6f&|eP?aNnXR#sN}%^xpbZS zlo9#{*X=05e-Yj*viOhxHh4F3U;JI=?~ebD@v?FpCtDbN;=iU;$TrUZ8@ZVHzY5+7hfZ@a1lFy4mX7(4YAW2{#+rN;G}Qt;vJW; z`5w`g+m6x)Z{wio)ph&nCFe9*uC-C7w!bo}emvk>bI#RITC8o+>E*>}~4*!fm?n z%x!um-l9Kyqo7}VwV-EkIrIP*x`PWIZP4BQC+M5z<8;&g9POK@sH|ej@mPuoJ)GU8 zIQln~4F4G|4Bw%_@(%4KhIU7o9y!qf&*JXGzd_^aCukx4T^cTblahEu&f=NaF-;9$ zXQt1<^wCEZ4L^T}2EBbs-=eK8xyCpk9!FI8?Z)`N!qay;CMz7$ zruY=$Tz!0A!23D8KO2$#6voMUoai8>$<>t1^(Bh#Tq3jc62+rmr^Njt^~yJCvHvgV zytzti$sPu-qx+L}dN}?GJjcIG(`<{z+5d+|!>>`Yc8$#X0ohG#*NZ55?HS76`5Tn( z{RTz2$toF9nS4WDBl9xl$!&7W7zKF6DIQ24*S&yeS7HqBVuo%n(e%y*%JzSaBJ(R` zVne<2|BBYm-KC2!-lFLKJM<5)<}?|gWAdE(7*$3|q`@ZH{<9au4~x zS#yYfu*qCmXwg0j#%YQ+S(BiXfyo!dC{g+V`{TBZGk8u%y z0q-yIPx#!Y524}QvOs*48-v?IJfO?jIa&akSmR`&>k)&It$`}sMeIM944CBCLHRZo zC^Q0IIvEt2Nudq>zzb;#L@Nc_^gliyUjx=9S?u@~&SgDtIuGr9zRC~jFu1LJZ#-~! zhdV=b09;*r^@w^L=YQix+|ccVyY!EDew)63@D9D;{xWUYXUOm>4nU%b?0|(?)=x^X zPEB!;2b;jL4A*WUoD@GtX0(JKfGGReVHX=bzID z4DNrK`w4v^!h-Y(u8+|lPr=|la=2o*Ph~kJ2ZVQf1-TsH)&odf!rezb>TQ>F{+%g3 z^8g3m1`_2%Y%@R~;}*&T%A)Jko4!n$eU(i5CII$pw9x-;8VtWeODorDu=0SWeJscj zW+GEkzT2Y*_dbus{U)ug{tx*5bvz%wjuHA}4?tN0sPQ~8o1)7TTKbv$wED4|lzwZU z+#f-d`8J;1ZQSlQ02Y8(0{EPz&dOLCzHeD5^lMqU42A!AJn*=Q7z9&%U~q-NLmPPZ z=kfPuB!KAneHG7g$pa+|Mm&ho4F>&g7@WByaDIdCi4qx@*bduc8(PF~0Bd&++v2#@ zQy9lD;&l-lk8$#A8QB{+=-mqx?LJNM!B0}`eudI-a%6k7r;7f^WZszkf51V}5-; zP1A1!aJNr;tW$w3gDY6;Kfr;1%b)N=0n~ZzqYkhMCi!~2N^9}5Fj<8tE1+csikQ8o z^0)JV*??MQZH~+0wR7tWZgJJ?q-CZZT1!l3EM3hcGM!m@jnfw75B=+0G(0hoD_kqewxZ02L&Q6b0 zIvLS8G!5|61wJ%7B4RdWj9jfXg-m4rT>AcWZi=r)a>Y^4Qv4#`UxHAy6VsDdOZw&4 zEv?@H7)*df(}6I#$bxG|BkILF0GK_ny$4v!-=qHEOQl&o)4o>i1b5Uff| z`ws`$FQJ9ytJDVo8!Yw)-y0mu+7Yx3mPQ$v>+^<|eqx{2o_avpt7EGE08jo^+#b3h z+Q(H+nRVgaGglFe{Nfb;R>){Al{`Ko{lK`$?9BD?VTHjI-)-P^0pC4?F?9*A3wW(Z z0+6%@fCON=1qDyXAR2qNk?OGx1QS+Junc7Z#CCvfcpn_wF~H)u#nXChP)n+=<3KkS z$=%%~xBV3E>r<3ge;y!v5$|tNmcByE<~HzrBKI^l1KKMuLW}cRnxsn*gkHsYUIR$p zBHQ1gVi62~8R8V4eRLb3xC8CU_~QUaWz!T*sEDBviLf@t0OS;%=r97(LVB%4-zO={ zYAl&zjPuQnSp&63RdpF-2)&8touc0c`xOMkF}*&8;Aa8sd4+kuO2wUb=`_tXkK~wN z&)&jZG^g6~a5Lry0j)n&jWxBbwf#E)+h2h+B24JxQOeTPrLRwWTcuC;b_`6fk%xcgJjFe$kd9M+*Zq+#g9v-LztA#~9J99lT zz&;VS7RjO-rd2A??OM!Of61_YgcZrkS(<(qZ6ZYiNaXj?1zeZ#h#J+7@c>@d3QGlh zzK^ZZ7X9JQAJTWH--inQB0bT=!pf_%r|t&o#xxe<0|pBa0m$xvVLe=idOUfSmL?yk zc#LC?nbBf_+`&5!?;ck4XYl2qHn(7*f5A$|JxMJ(FuiXMz?U|I&O#>E9#RRJKKfFbQu zv~Z82<%d+RK=-{qp(y}6PaNfw9!>TZ0mzQB!GvtWLJ|78R0tWTC5_i1G=03H)h~=_ z1N*1109=2!qA9fHtPYQ$31yXR4sb14UF%dWEIpkh($CgwHX1?AHP6RCP~Kh`Y|p4v z^8~hf79jWujEZOR0G^CI=wjTgGq7UZg2`4Z_>BI6oJ3~8f{ju2Gc#9axj3F27XVx> zWB)Y;Sc~IZfa{cxdp;H+!@ieN{tg6=`)gz$UdD6%Gz6ocqqz7qG#FbD!oG(&bQP~1 ziXo&_7{jA-i6+zMXyRT%H-LSn-^4Y%h4VfD;2u!2QsTODstSmTH&@AQzlibwJh@6| zRRO(rUf#w1KfrZ^`9@1+q_uI$qb1cXLVE-F{>)$($x&HW(D0{t_ZqPdHub76SicBJfG6uU`Aj!7mM<>8l zc+R0}*-Gr1LFJl3Ed}Lbt$xLF-~p19TQY-n)~kk9JsA5b#@E9vGIFX8CePSdn^*ed z2lZ}f)_)(~6aQP~fjDfLc@?tj+zoX;hwBK7J71$PcF?b@V70%u{d;ti-lZ?3U!-Bw zCowVS*l?uR#ilOS2KVt(1)$x53VF1!K}-4PC>dV{*kHpEb^@cIhkmtq7U=VFd|b{{ zg`BF8W0IJ*@jRFW?}CNwr&t)7$)>9EWYwnGT%`UNF4DqZf0j0W`m^-KZ+(jXgMaZ^ z`pxhDI=!&{d0A|!Wab0=9k>)IITlvf`LJ+Ldll`04dufzm5U>qtWGJ%f)%74-9*;i1Av5z~Wri1z!nAxYIYB*ql+E@F^UWpmzX91$0NXcHosDeOKf!#W25NyOR z2zh)D%#zuT3wx)ie}@XP#LO0Q2ej%GGtdH9frX-C7H0f3j{h`{aTz0G5o33Z5qKNy z@LdR@w^qpBy+YaeGmvq99%|Xo17M-KFyE$r`Z5i&dr(loZkj+40)5^uHfZWzgi!J{ z)VmL$9rzZm;XR6mdtliI6fc$#a?ocZ%%+E%&>%x7D?f&@m}*}Ym~CbY7kU%-vXAF5 z0{cea!)O~p0%HNeM9jvWjQtXwm_Tg|`itvZhfsy{;##We4umBbfvO?pdpGDtPmR+t&MG?w}nqam#)E9xv{6%<(w#S_~K@KvOys#Mr) zDbT9?lt`VUm_e3Uz#XG7;@E>RaIO!Q2sgvGH+`MqR= zr|;hYs@C((h{7Z?o@JNb{wp^ie3jXAEz{NAtA#{jOEerJ_7MzALXPq#!b{3>mlsp_DiR%TtT1GrYe z@*ObHThWxZ!Qv(hQyN2UJy}2x@M2uzY!mFW3zj@)XpU(N%2z_D$kr;#p4p|vCl4sU zk7NE*ODp&AEcftyz*rAk1evOm`NZp@Y9U zs=ihmroUExj!+d_uwNK5$(8`>`*`yAz}D{oVDFr#^4>c2%1@w=ei7IH1xldRNTTmS zG4VQO@okui_aO@uqT}Y7k(cW+L}37(<&=V%$dpfH_{K1VlpHV3PwH z16U2Dw4T^YU~<64maz5P=`I8;-0+08HvnO5$BuZeVxbuQ3jr;I@Z_L%sCMsQ+n2HL zixiaunEwrJLvUJipP`?)_#OJ%Lx|8R<_JHOg>`cK_vmcR&Agv&uhwI(KfkZF)U}Ug zI@I7SjcwebS)m_YkgnDK#{8Wu%YG@(^Is;_uXWm7kR6Rie}K2o(+AjWYaLJk_~B|X z*wIG30+3x4peoh6r=Tf@Dh68Sq6(Dc*{tz*%&avP4$Hq8VV_f{Y}JV^Q~^;H&EDb2 z4_c8no!U=J?^MOYN&&XSXLo+qDU(&@Zt0I?T8x$aJ1eEtqd2IB)!nJ|T$k@Ar?#rN zd0vTU;iY$(3JU1hPkp|=b~EBB;^ZLrZ{4N;^Y-7P-@p93^q*Y#+w@bzpQT>ECu&h< zwTvjx@X|8tQ3k5rWG~R_QbI}Zr^$?7z(V zvh&ay-?NHgWw>6xNVyPB}WtuyfBA;7so3A zDFDo?0Oa$Smk*&L29t)3BA*-(y9Q(|+@(hPlE-X<{mVWCsswBrw%n+AoAUe2%03-xZ8_7`>xY8S;{+i0K7Os6>FyF3?OA0{d>wcOi{lWi;oiBavLsZ;x}^K7@Muf^5Z z)*kpJxmrCOep9zBeKN{rgPOVdRVR=-bybIsZTwv{%u4)vu^1U8TyO(2-0&#nQ+#V1k|LZ^|pmGV_ z>fSp*NEk5R-qF~SxRR4DgQhIo6)e=}X&hakJ+nZ&=@MN}*Jv9y$M*(fc}6|hNSSpm z6zVCP10Z*xGEC5)3#>u~2v-1(eSFV)hB9XLBJ6-{-vxUr0XB}+hCo|^ac-1am z$m#rGo3aN`X?_#qoZ_*ckt!)0p6iD*pEaL?s6xt!t%r*NU&O+ zg$p+riHETP*t%s1VPNCY5W*sZZK}_nnRkhMN%-UdYubXSwcTgRPuYE(2X^V~;2Z>~ zkHZH4C8&sh2F$uoX?2a#=uLp*do)P5sSk}o3R|oN@QurqMs@&O>?$rV0~3Wxg2_S( zn>EIT$-rJ?)%7ISOA|c)a~?7}tGEwM$_`i1maxNU{2tgk#uC)fQQ8AT6$us36JyzG z|2j4az`Wsx2f)uQSPS04xz9o6y-5X31G{#g*2XWAKKQrMiQI9#p&7%!8Y{@5dQ9NcA7)|s5kao0)GD20NTIX{=NgU*x)y@ z;eT=B!H8-`^T-!OKYX3f1MM6ZW>#%-*bJjs;T5F8ET-U?Q+paT-kz>@D$2ypT6I)1 z3RX=dYU5C(JTtgNaf^*In-JgH)&>*-@LcVFM2%cYon!k@NFTPN@vg!KaP%qeEQAz^ zoraWcx51Rpm3kH|r>q@p8lfS4U-{J`0~!?0cCPCF!F~E4zxO}UKVAQ)^zS|Kx9C6p z_LX){i6Bz#O7?1*Ydzb+Bi6nf@%m*uEZblm0Ji!p?&?ctT=5)u_bm~!lp#DWLg&e`^ij*ZHFQF+I1AKQSbPjTJsY!Oc>?`n|k_xsPlc>DKGbD)N^JbL><1MFEOF&7iSI) zWGAPoKeBq}#$tta9*h{GB4NE&)MTZH#t?t1l6Oq5=7wORP9^f5I5ZjYh~zMt+^9lP zQ&cDr7Or_ZiNAKW<(c|;?RyRaKuPM&9DCKW_10GBg#eAYEb9ra_o^*`dQe#!qdu)- zPZZkf`mp?`Acx9M;H(r3Tie6h!$XHaoM8;t1piOj$@s|);Pf; zK7yV2U<>R6~To_GWX2X(5;_`)H90Q@NLL3O+ho9I-W!R$^Y;2ot_ zjJ>vipvFKq$yh?cO>$f@Y@icpeI`#pYw;v-`*Sp`K7&4HKZZNdPJ9ol_;;z_yFLM8JM3``|ETQrT2#c4LVN|SDbZrIE@!N@+HyLo|r<;iRG|GYI|SBwtvIG#wHWd%CC*X-w`n`_=?>93(9e{+Y> zJDk(hyF6ZH_m5O#9Q}vn?X$IaF$U&;jkjN-AGc29LA9PN(fN2o?5Eaq$I64FCS?dQ zt!jI1Yg$~rj0UxAy!0Pn%V`u)Z03MsX3bmgIXX+ zYV|Vzx^?h?e&?Ovr9XJ>51=|6(6gH_Qt!D<8g6XT#^M!vK6#Fw&t9ZwVO#4b08vip z5OFdAK4MO*qL%inB$!ZmAPh=YxnMDV2<>xtiAGxpFwI<@nZHSa2RvVYk74 z_Nhn#_JaeeRwqZvf+V88UNA>uF-e9qJk&4iYdB^XYWfX`;2gN=RLpw-4Y?<8RbgB*v@NT#M9t3^o@ zK|nQJ@Mrb_UID;ffpGT4luEF3`qnDZJ6E7SU;*Ss-0NqdYW*bc_jv%zvv`MA0IE>~ z;N=q-34DzOd@KZx{DAujCntp4^~`l|NnUOT$0#o0hOYp~Uj$fv9zgyD zJn2O|hr7@~d=DUd9m3;#)N{L(^(J_hQz6AAj=x(jLS1~3CiDW8$x{Hp2Y3dr;4*GN zL-7E8vJ3S!#wR--^)(p@v*&6Ts*C+i2sJO_JWJ^9F~;UtI?A!#9Fj+AwjtyItVtOz zr-rh4B^W~%V~CyI)7TGO+_PoDp3qCO zOYsow%Lx#w`c#1_sAwy%Voij%dKSmb&Vy$vY_{~krdHfk0|gXpa2}4q(-0eVq6 zc(8|b5L2&~<|fS9MD=zY4;#FRLkmeKh+NB=$#_R51^KRex-B3?6cpKQwN%JXRkh9{ zOweDK-o5isKC{p`>hS3{cvq5^F_L?ayn|K=MEd@<@6-S3?*Ebg$@$-+|LoI$mp=EY zFHrUwEO?`Y`cU0v)lbpjK3+gFR=^WfnWFEV#)>vzErIIixbZ!7@;$uX#p@1Eyzex6 zh?$?*G*ii2APz7ScIdHF^wJ&;vWH;9_bFc7q3Ar2^O*@npDJi|sigQ8o(ouOat&(B z>sCNDI^b{;$+`y>JI>?1!V9B96cf`}wVQH&CXk5_v0=3{XCA5|-6tQKT1&w9A%L35 z!0@X4(6_$7E49H2vt_3xV5$X+t)9-vT?GK$xlHE4OJqi$r8xg0HUtnRFkmnf;|B`~ zBd#Vm2Lr}cJdvAJO~B&f8*)u)4?qfAx*PE}(8)Np%%>5K51Vxb{dpRlCo^4xTKq`> z@^et%z6c<{f~|TG#J~#OD*)VgFothp+imKBG56UyiM^`P5o4(7$8Ldg*w8J=tZ(attj8{_T2!fRVV z_Oxo^KTT~R8c61*)UUjeDC9JzwZLMo>vqyot1^5R6tX<=uv2zc3BWqfSo4~##S#u9 zAsMdp8J%VYN{xZ7T4UJy?_;A-FMo@E(RM&g&tU3A6}H}ATr@lkc3sZG#7V^}R{CU) zNi$jRAmpIi-Az z1$AoyB&M$_ot(t+g_8hfK*t69ZQ3mUkQV#bXgIu0!({;NxdSR**r&-0C5?bJy>}tD z;9T)F^#A>ewn2_K(q}T&wUz-C#E-^NHylDjMZCdV<5vNs05JBFwd@{?i{}txS+ALu zGJBOYfC{RGS4D9ADmz(;YF<<6O1x(osV!C#MLY$7eE|S?09OCK4RY7PUPpfk8rRR^ z^b6{aJJtOY5iU4*3nvAbIH-9IUB?gK1`uInfC;`jaHOi}$xFNw0yu-hzF8n}$$D52L9jZNb=>*bD&M!#KD= zdG##%Z589@K4hjhaIbf8z0f8^41ATS)Pu$)-(@?r17PF3K2+U!@Y6Ep)Wj59%uNUn z;yvI75a2d3tuK(oixndPZVsDp4%ti@af%KdLugG>quK!gt?6&$eD|oBJi~EH7)y@s zLUQ}WyH{xSGvB54>*we;uNT&y0DecK*hygA-s|LZoPd(;1J3?^%x;IZ%w4CbA2)4D zlKdBCS^ihSCi_eDL(n2`jekE5S0^=|uxrT*oddwK*KZ8kz}b0X$KYBBFh#;qQ=ZlW z3>rV`Bw3`%Q#v!W)gAvd+7D)ZI(X8gUATn~G?GI$pf*Q$#m z11yub#9MZa9N&s_m7M`npX;64K-iurwTChp?}*h&&WA-N5mw+@%H6uj0bOm=ap5~^ z&0FUVP15Gw%{+^i%AFbK{*?aFH-3x$=eK{G{+&<#JM_Q##NVPTmp?|Iz%$xCuRc86 z&j&b z?-Rq$P&yJNHhJtgkC%LiTjz6mSUSQl6WdgjoM)W z1|_pqX1-2yHRlr}s$^CbR|9On&h|=d^9sif!|bv9CD@yP3gi`_$%f*5TY#DelVzYR zA(_Ongdw>YEYLiKv9N%@H!(Ke#7Us4WpfjIZ!xH|;}dMwj=gumKI7;~{CyGEa~^^N z*sJCAge!5ZU=!X#pB;eBLTKgKWzO0KHk(L+1or+mVoPO)9mNyK4=k{u17Tk_b`OA$YXswt z%{koHLu_*&%oL2AUr+}d%M6xdag7Kyjw4`bum zhv>&&yhuOu^iBFlci3yHpyS)40n$8>J9?`#oa6Wd&fV;=;`@{bIi`iki60fX4s15z zYC2%D&zxyz|Ndcj#s{6ZI01k>k!(VRm3lC@KD$!oE7B+f%)G)is^K&^@mS$tS)7Ub zsi^I?vHZqUPxBTx=@IkVn^zMsPQ^=69i0*n;9|d%lc?vUECMbh^f0oRGYVN(`dC*V zQz_Zptz2zE?$G4m&z#JW0XY#TtkSD)Z4Ir5dYqkNoE|Bnpk|(P;3HaCB-+rg9?nLD zm&!X{&6C!h7aEGK3H{%{{155(U;91!^Dq5X`tzUt8+2*+d0HD{p$DOjp#5aumvKc!ram;V3Aj>z!jI{7- zVz#9+Ao8#?pk4fKIr9>ZX9p5_Le)YfsStC|POF4%heq=k4~&En;U8M77qFr0A}ww0M8ep4raExhwJ(#rTse+-&+CkOIo6Ia1Ow83E;JXeoJL^Qgt4e z4aN@;wb|Pk{yP9NF1>>r8nH2W5y#}b&alJMQ@E&gY};4%>L!?5*Us2)_r^nm*D z1L{?r`*{pDTS|J+DXwX3__Yef?giMvp8;FN`I39+ldG_6Jp{|&mGGSsFHXZL#W&dD ziYox2gX1a@M<&tPfE_ykEoaPPO_ZpXd44(8DXn2YFl`K!+(G~|djS6d&Q$=g6Dmv2 ztsP5}7t4&+OtoT9glmXyV!oWi^@USI(Ejh~hsfc{&mQuWA*t2L6QP2E|-Bn?I1m-s+lf>zLgd@LfF< z#dg~!)nAyDd4vlF%nbnSI#j86FE@at*skPCIjfqypK}Y_B_r&&x`=%j zG&{Bh19K11mu~_Hubrd#!Jh-`{sk#)kfdLs#o;UHvzwH`=9qA$nPeON1-moB{#?QC zi80Upr#AXNp8ulQRUkJ^6K{wBKP|mYGD*90A_h}CdcwBuND)DC_K*Bf^f1AwUHK@#QKnU5x z=Mik?5OO)Z#&B9hfFV@D98T>jK4TVQ3-QutM>^Ipq{i!`0Op20tohz6PHM3tNiI04#Y%~_VP&88?&S2| z_U*YN{DW_gz+R67TyyN7bMDGe7lway+WWYpZ^b}brnE27pVAi8!<@az)%lUUN3hXY z)|i@1OO>(S`AOqOb81S*snd@p7c>+y&?um49a(O!R?m`7U14!01<>+wua1PB@K!w^ zfMflWZYu6{r9VS~?KR0Mh?-;u%~lFlA$*3YeVp!$%SfyBw0(?&^HU9hreUK&a4-~+ znW`XJHU!{AA};w#7!!yGP|MT7vDZ9|2&^0c>@Zrd8w( zhZrMkSZ{|Ahj2_zUCZ{&9P9T%?w?zv4n$H@wXZ5Yr2+Ki{dk{-kT|%~4141mmL9lb4ZzSP8IHd! zrqImBd82Uvh83y9j7O{1l?XqmE$8|a|cPAlv0BziJWv0S@ z4X(>_mZ%-fRsWE*M+I3Bqe+bRUy|0%`#?_exY|6g_V;^D5f-V- z={Z`D*SuG-s@=FHQR=~|VQyvZ)?<9Ja`hhO^-i2JDfa44-6{-4J&y8WRRbS}vyhN5 z5l={{czxEL04SB;Bl7^uj!y|ibyyMkD|O`N3aJ6w+P2il-$ymWW*w=jTGh-{$JvrU ze&Rt_fG?=3sq3KSX3{B!kRb(H>hw^!=1h7fqh*s@D|?G{art>VkFyQIK+2sSasB{jcA>`I((otPBWbHz{^- z|5KMXHc!C{G0^r`Hg%s-WYyyx4=%E7^(<#QjP(rX(^bePK zvus9yP{OGQIZ1;Qjs?4g>Nw&g)764#VIreJY~=PSiEl$S{ti^d??FhpE8f`y*l`!o zuPNB0kzCMDyuaAdX%C<`DwgTMUZJV|B%aGf{B#|v@~=P;xrWzWu>CRX^U?nR#1t$R zw$Hq0CAKy0TNzj-r{m0Vtq)<;si2v17Xk9iQtr@5xK1vUP_C5q_n7A;gpm^0#r9za zSazN=V9Bg`a8Nz7*FKNu6c2#QGm3K;-+Qr+-+Fi*i0b_EbSQbLZ{Izj?eW9ToO&GX z`1S4-=Q)N@n^T;(>pyYUqa1VmM+jT`A!>bA7ypCP)Q63HLEW>q53&Q_&r$nOgFTU+ z2WW-ZS6eUY>N%W>jnlT2mO*+8wOl<|K|ZgH0y?wk$R~c_>&g5ljm7Pj)(gz94h{0(hZtNt1N`m_PA|XxuPNIC*v3y#f83)5(8}1Zk{v-!IK;iJ?}HtVMD;uACp1A{9^gQEwF-M1 z?1Ib=u`qL{!2>QS2&TfR7SkdJJA$Aw!~)Ff-ho1Y;UcjuPPm#&st=9p(~H%iC&W{# z)s%@kJTd4-Trizg$G|GX0LwOIsEy5#0oTa3Y`ZNgt)e6P5(d^iJV$;#0HBWmuv1*m z0XDpk*B(yFX{hi!?I@FV+pA zt8iXTmQezY!|CQ}GQ0NBABP^sUAJ|7a&5^Sg02z?811@Ol{ zrZ|y2l6Z#Prw5!#1T$cSd$gOlMyPe628fwmbM4n^B5LMBu9Y34yv{FXH%=mVDzAXr_%$XkU#fr|j}uj6blRqJ$*+3cNns4L<=u67Jk zp44V(XsgB1Va?O24*BC6w8u6U{#jl84^Fl5DYluX(%|eXAGNj;Yu(od9QE!LSd>MT zE%%><;yPO&Zy9`R)k5n+-EnauQmbbw3y`a=xeB~mHo*A=7O4cmtCNq0K=6L-EEQ7Z zg`^cBY)7w)>P~KeUBiiT|2cdgo>@px(a!wT&Vd~6KRmw>`qNP}JJ)y&hjRpPZxhZl ztGW)C+9bcQo=*oBJwMpNo%%2G{i^-d0B#9G>FxdZ=-=G=Cv^3}SLuc53T>npXnD$6 zo51QOOHkM1*{wW)4f7Ti8+$ZfpV9#s=3dgLeJqwE*cfvF(g-YPROOPEaa?er0SI7I zsGbYOrNIR@TL6HG+>{eZI@0>rsy z>rg#}i^vOTM*Eu`dbuc&8{zm|X^08oK7=+-2*GKd8F05aC!|)saeEMJ*fD8@iyS`< z@c9xzE4twZzTI}u8LZWKh9>!w^btFN2ZTCMAY8L*K4z;a^fvl|&gn z4%rcBiP{6`L9I)-MO~cYa|U&4KZ4C12T5b~BxV&mJ1R|a%pJTAicKoYX8^jNqH;KZ zI{0M>A72N9eGeeJjsATI!VCZ(q63DSVl?Lqh`BOQER~N81QEjki&r{Xd~Lk{F*3>cB;>}TsR?u+81`&$Ntj#ec*M?qkN zx}1T=X8U4a{sdIn6F?)VDl-pL z4ZyPVk`ZvOJSz?im|FYtwuOhAkZzIx*DxOibzV>vkQD%(3HDQsVdae&1bd#9mPAxh z)l$c*y|^j=-duz7=%lV16k2!!so$^tD=$yRgaQE`U|SNg0&~;_sR36-m_Ls{ng>ckep=!QKBK-931nF6B?r(!vEApp%n*u5Y%YPDCqv zWS8zxb?!Z?R`1dD+?4i)i%@VrOWWn=XdjF9w(Gp}pCeOl5_d8u`{2w^hW3cPEi9Lq zWOED0nX^q7Y})~VxuAOmb$Og|y;-ggjdO9b3sy5%I=47x*cC9QR~PV%hLTe`a@%wf z5AO-LPIqC0zV_f6qpr#J4sLjUx^|3K-(yR;Z@(yBd2J=pJ}{bh1Hppr|l_d1Y z<3;2hx+2|Y0`M4PkCBnY%+(ln$?+w8{%M>yhM|aUvbUfj9zl&;;5sdAvK+=!fO#6t zo9xsVfK#kEfLCe3{-H+aAAfj2-(%gg2o_GFcvy_;Q`1=RbK8kSufiv0Dwhyv%*oo*8?5`^v z2j|NAeAa{k71*kykkYRiWFZdL`C6~8H>k^414 zt+qGbpa}N6>cI}|ep|q*J*Xz{kiGN7_jy#g}ND|16E|OHzVuXX0oVV7s*qhI<#F3ueo?84@sCE@%!jqp;H|QU>d!j;I%j zVpT6Q6D~QlCrEH?d(Aw64b_Q?{QaxYqscAG!WUND=i^3_N|Lipi4m7kW26pB>;u5rblx;=BMAc6p9B zWHt!a*`P%L0|f7nIQABdHZ}+1%`0BSwh#s=q8L929BUVL*h#TYV{;xh-t7XB7g#bALOTd+^>lUc+5%iLF$JX=vYT{u>js^rb;tJmY_qKO5!kDtS#s6= zt9!B^w|T7w*^m(aN3Ci6>jg~6Ox3bREusZAUbg(3B-yW{UvbcEW_evWieKptJ+L6 zKj3Z6Ps85r9KzI6dy@~xX|^NkP8mmCkgTO?Z^EM1zHUa$cCB-T{%en`t~!{gq;9#p z4xrC`*Ji%1K86MpHMZu%>T0nYnnt}XUeEYre=?%i@4QN{-~Z>dI@zY>#hjL_OaEK1rq#j=7C}K?Md@ zCaccKi*JsPXE;GJ=SSurC(fsoiX`krax#vVVM}}lYSo_tz(VLt-=IPN2CYWBz;WNS1YZZhehup3t3<2l^C5(t3lpthn-pq> zDSh$}r?b_GC%DxLM;vbpb%7akJz4ZW05&c-NyZxP8I03qS~LRp96^AxVtXz8*kB(C zc3vBhs**V;GgQU^_OdEO=;gGRW$v`!%M91jBhG|Xm28(~FXJuD<1r1fN^Imyw7IZH zU)_C&iegG(+7~q=(K3r0@)uuS!4+S zdsz}pC>TYe-)fQy@}jN9)oxEX-V3-R+d3KIAw} z^VBVh&b&5v#dtR4b73{Iid5qPT8(E_s%KpO31I-A<-&s}%vqq97GFFvN{M|ym>o{>j z!R6})R8AIg&L{Ake^QbwWbqrcklmmK*iG5tiIXsh=QnF7BCoAs(*PDIE-25=K2xqf z;~1>LimN{5V51DQk+=yQ0Kg6eXbopa;=cjcF*C>13$Ltl##zSLUmTt6GdS0CP!sp5 z>c0bl<{RjzSE$;!32=pd_lc3P*fOg$RHx#&RVS)+Hm9(|QpJ5#I<>b>i~y};8#OyW zRSQ&30kW`>8mJYxnh;x<$8Hz*H--RkfcZ2LfMv%g%iiZaiX%<~Il;Y-Ma|9XV+QrI zgyD#V<0uuu+;J5msLq)wlO2i*zruYxu=p4IQ+js-ElK)--r7AIn{AKr`D^kiR%$~X zfQ{VodzljsF@NhH4#fDNGXGboV)C@(T4S(>#~qyi}sHC1aAn25BLToWjxj!_9|b(zL~N)p&_J$vQYT#kR_ zT&Vy_K(@cupQJwLAuwx%gQ|7Bz;J`zIQDgZ^eU*%FvXQptgBl06N(<_cgnOIPB`m) z6u`5cMM{t5>U#{VzTM_M+qNi>)Np?oEZarxn^Jk?Gem`cY4)u9%g`ZxS16d!+>bu* zozXUZ?e-tjy@%hVb9n-0yGFy_lR#mpkGHUBPg$kN{@W8Q*Z^G1s=yelLvJ z4Oy#MR$AuH_?HwGU{*Ks3yBPFBeq8YSv+S+Ou=9Xb+Lg8Gjd;|G~sgSuhK#ab#XeT zh2E5Uk@i`k1j*4KBh$MO^X4z!nQ? z$pKI?vqg?0juXml3Kci{2CDhO0$j}tV71U1B-dbr{VLJocgU^Xq+gbB+CXg_fq5GaKIWqDZc!b_IF1); zZBCacxrv#pyD*A+q82YC$2RT-Y&^mFIc~OMm2qN3o5iK>EQGHrXJ@cgfG$+VX(G9h z$JpW`7kZyA(FUH=cgJsn&E|AenXrNV^vS7iZg`kgqaXjuzaSh znDC#S69O+w_gw|C07@evdXM?2)>FMRu98>86NK6_}yp$~FTn zD_FvI7cD^jICz_q%WqMYEdoIP4DC&SjvnS4v_Gn7ybqJYHb%=17IkJ!09wOf+aqx@ zlDgv)P0uLRbjAvFG3QN?)@?iUCvv zAvR8gZ5yao4clR(eeouaxy~QY52#%wI~6DS05Ioto+kDZSmLv=!J<$5_dx=`j@S2K zhkcKVOLr+fcRmb z+p$L*gcwt;$n0a)at!9}k}di;Y`5R2E=xiB+dDVuxOp(|v;N&S# z4r3p28q}>?qR3HFUy9xh|5tdA(^Ee6_224ULj(b%(FUE~_C zV)BLEZM_umt6l3Od|$PuhNEuZH&@@pzy?)p?0cZ<9H9X;R+n+FaBgSWzcrzQ53g%2 z2d8=FuET`8-^Pc&Z<^YDo0`6E<~J=EuYfCR{?>ISCav#1p=b`+g0F%$UK?GbuiX0o zQ@ryAT`&OJ7`E2QniMJL(2XhwaIQkVpK1PFgM~O6>`}b_4#mrFQrTakJpTncIQV%Q z6`a}-i$1$FkHKWe7l4$X1E9Qw=Xn=4*zeNf@D43yV@X00vUc$S zEgwX6z$%#FT@rIt3GM~Qv=Ag{6U=f`s_z(_&?KDq7q5u(4gzqqsTf)$B`GdelK&SA zV8G|7Og;ty@(I|rM^F*}F<#$+E%v&oiOuNuBZc*wqfcIHk;dJTz6mkn!%E1Y?Mq%z3CYkt?E>5CQO#q z#w92+J3nz5ya;OJ!j2(qRFV-YkthJzsV7>uIA-T5+#5fV%00w(d-QSGy5E3`{&Igz zuTH+NH5kv>*q%7+pKxTGRk@u4V8hR5&Zeewu=YCK94w+oOJeb-sXZ2uJq`vxtnTN< z|HbH)=I(##NFPNz}2zW=;K@*33~(Sb1xu{uPn)O4GS`u0yY-osrocIiHnVb(w1ubkzP{)%TWW1q9Qwf0Nfjgky(()1BHj zY>oDCwML||S9fjG&4SW=!>s@6?p6Ae8~>bo4<6E!U||D#1`GL9V4bO?O|%05?Z8U1 zf7ZFWA?q3Tz{1|8XyY}q%Y6XTufg{FQvi%T8pB>&Y-8l@;9Mz2>IQ&y)oM1Usqdpo zRmWP*hn;OWRigrJG{n_&S}IQY$G&{b-V(iO@fzp*ovpJHGxdlT4M?cRCmwf3lT5HTG>*TE0XYI_O&EZ{+$`8JjHtwt zK*YWdF<5=YwpdQdn5&DO<59)T5JHDt0Z?%q?9);@gSb8{?6B3sTV&4NhYfa{qG!io zx9G#X6oHcy{^zi5M^;Tf;(X-oI_y|xyd=qT0#}%;aL;kcp-iz9gWyn}2sUX8b$KEM zdi#C^u#SFL3kPt7JAjnS2D10E5$^)*2bG1)Q}hv=2_{g5OOA3FfMeKYivs)FQ~=gW zsU*DEvW?Cvu}{+5qo;7OZ_zTHulDHX=vFm!`W2sd^}Bb4=}ZN?x_eAuz!%Ni84?i@sK> z(FBRsC;bafKm`S_UuArmkDF}|t+1#o4~|=ld0?GRSaL3^WWPd~pbBajXFIDD8C~bv z;1iRn0Yd+dYA3A2i8aXIXY-9Rd7sdN+M!6sJ3G0Wg-fc$zyO`CvpLo0FpWJk2o&w6 z;A{>}-o}R7y_cg#MdKCS^(<~5w?2=fRw$MJ7`b*Tk*+YK*Kzo}_VtQ@17`Qu-m7$V z=gag2n9@T0JjK-&0KkyS1NJ(CcmtqvQ;eMh*llBGNKkh|-Iy$2r*s+izw{DK_kMw< z<27Nm)6oGl1fG;QyaUbB%acAP8&?D?PMn)wpU6B z4+G9V9}LIZ2gpKgO~uCm+P{Fl8qzTSCiUW1X&KBrgHXUJ1j%P@3O8<|sPkM{Wjiqn zvIW%7HrfENoW~epHR%}OJ(c1DY*dbz$ugbhny!2+n12&i6}x3z+B0}9Q=Z&`YW+`u zOK(%TevQoL9?|7}XmkOt1tbU>fQIQUw=PR}F<^k)7pvWb$j=B2Z+??I$n7>cFh99>h+arVQqk`q*2H627!ZTRFn5_nHTLGMQG6G}0 zh17_2&fz*$&0RGupfWq>%g}Y;gxc&h*k}WjWRJ`yp@jmmhLnVL%iDXsqZ79fZ<+>h zYYqC~%rncFRc-65@lXR9!P~g)R5knFc4AUi+%4oTNiZlR*zllJqm0wy)f5;9%C8&+t+lY{5!hIYL?GXnm)7X#0vo!Vo z%{klZ=>5qa{mK15qVeP#w80pXEps^@1;jnhyi|$N&`S9o92+V~Q6sP2px*lT$*dee zCH(VL?0tfY`~l_rSm1X`N~atL3Q#%k#179sM2u0Q>F^;x-kqH)_NbMI0U-t;EV(DR zuTmfO1J+w{k_rxEVHP`C0MLTPj((D&;-?{yZqcy!6&fzwggy3vHhYEFsF083rdoi~ zL?6nMSw+fT(IeP9ixPHAsEkVon`*MC)Z4Mjd?G~!qQt+aPU2__Ot9Q==nvGXbeT#{ zIhnjhMek*bRuQLc^9gd6ZLgvw*8O8?u)% zGyjR^b~cbq*t<9?`%>c2Bq_QKz*(-zT-2F5k;*$9I~y6TrA$UMjK^44axMY@GXZNE zDvqsXAwoiVN?+4ivyOAwKk;NUtJrfz4BI&Xyl@lR0MIVLDE*G<(R#8&clYknY@5}1 zosQ$qw3ASC&N*jyuYWr-PyORvyZ^Mb4+UiBXeSP}v)FFK@fOX1uB1;$XiiWwh6O*A zftww!3@FCO#0G|%dP`~J3>0j)O&;GiYg5~*F4hHgIg*C^1W#Y})aCy4|?L$h%pwiZ--38gU2;z^^+JMi;wST36fj@di zP5iSsKba=Jn8?jt)?%9DC5<0%ZQrEt-2HuW+pp7lgoTyMzU^HElZ56YVunHi!*v&MtaaE^9|DtJrey6kFxR`}HXaaN0!v&+pFzE95Ab9jfZc=KmJ_eF$+SR1 z%rQnh$P*QyBqukgp^R0yU?C&nl7CZ9G09o4AP7Q5Y`|jOgljS_;W~!mLm>%FjDKD% zh;yv4B-e-~j-Bfe7Mw~l8sMGhF;wep$K|9M5|dnsidkTu`y^+z@iIx>UG9_KgvQYh z{S?^pcd*UV0OfbaVDQz^p2lYevRPG8`}&oz0L0?V^AvpAeLk|if;@-oxW0+gzhqeE91 zfH!!62eop0&*tn{R9y?$>q}~8TO%7*C z*!jzGUf=^T*olmLXAAKJF2V4s0xDuywOtG_O0Lqh_bsZHu7Uh*le+{P_6Ce8F$9f$ z0N+0P>!Fj{tum%L4%XM|<>A6*1yi0deP#LVWzE^LqACA|9zTdExrkarCosbL{7%{mx#y< zt8UH@1gdklBqad(;@A;v0(J2wY}FQO?AP5oorm_|-rk+g_;N>%zEd`TkQy700^TFe zU}#p$JQsR@+#a!gs37~e9@R>`L>JNx(o$@BhiS2mt37yQZ~e3Wzu*!d>aaG6{GI<@ z7vIP`*fdZRlK<)0 z-1``-K%wB&2HC(g+p69!!20X=*QmZO4XBB*VcIdP4Zt=$xoM5{*8)FPvC@pHECBVqmXYyKPLCCvxE?RFhoWPS!)-b$=<4qGXz*}C%NfLr{3p<1 zPl91$@t$yLwNkD!s@O@!N|=oSn3$D^6b)|!M88DECXY>iJ+ zdo(!>*I|a4sE6@nK$4Jw<7i5Ni@gsJyq{6|5bE6h%T(?EGC=6B0Zd?8N&k=*2j8Z( z!4_={rcw}~-Mh}1x_6~_AY6_3X@=Us0N4uW9z!*n+XV$!b4fh)NovmW{NeGK1AwMl zv_9fI#Y+IJr-`#f*?5og^g9%-yiVofyA(r(?k+-AyauMs-d>zmc*lyWm{VX{^cg$; zvS5*;@7O2HaBW^@wj9fAe5pOgNL*VyjRaK153A_OOlPX=*g*+WNrY>O#1l9c0h`P2 zaZvzc*?z2X^pf^c{5UuUIFTe464qm!fU@M|;u^Eqm$PCy$01GXWz6wi47Bp_%mKwc zF6v&h}HDf0+hg$#_*OHSxD0t>bKKPgd$2bN0KC3A)|$RA0Ag{nlP9dX&@xkn|n7 zL)(V_ojq~SU;pg&g%+MueT|0Z3Jmkw+~WZVZtPv7`*&ZZb6`tL$xlGF`6OP2xV$=M zNqwzu6ZIgh^_+yfBG-)450jr(@>sq$zePTP*Fo&>{cO2z;?-Hc-XGV;Vx2#c`N|v zSd9wMvGI9~bJ&QJ>r|w$PYw@b7m(wenL|&hsU$iSYfA@?aeVKsDOZ9a_K()EyZU}q>8?9%jA535f`T~ppv*0 zJtPilx`ku)Xqyg3TXZyoJ>{y~oy;dLuI*_u|14)X_xot^8FL@}u(wl#?Bj4)dcPgZ zbzmYq$ z>TN8lVird@q{rdjZ4BlcA3!xdk$vJwJryDd5$ptIpdM$nbP@yHp>pTYpJ95Jo+@&B zIUYg~b96Vqu6e2Fj;IsHV|%=tIp3Xe+;WR+Vq@l<=rKd$%!0z$68#7R?_*ULx0%S} zZ0tFFKHH>o@hVjm@-$Txf^b5%AyM|2*xOk{!FByDcnmA3MzRcBYV+BU@PVjVq;;9j z1V|y#h6*_p;#3v>a%yKeGBQ}%@y2<3Y~>kadxT;F%p4Sfl~C1C8-R?OLgViWAHuC~!0Mo`@%Bhyhyn?u)Y>i$q$Uw4|$ z3gG1XvTb{wSDRLB-m;xP#vw^QsF%Ac-lNXnJ@)%ol1WWn7zuCeU8idgev8%s8mrU4 zNb&wpQZ>2^yB$=>@s6hUN2Ydf3*i?6@+=K1!7DfkXt?Q#l zFJK=|$GBu@x&oCgGh%>5zLU_w^@PT6^y%Qn22JjKjPl)I$20v+*kI4oF!^IzU-&(! zh_BM}aF>R?k_NH!Rh~4Zrt|glJc~{GqMfD$ePF~T+DI;F_G0F;f3Z{{BFXwB$0Ds0&0{UW!Ka7OrWWG2eBxcW|E`skH@5H}l;oT6Y&cP#a*)F{k|?*7vgzxF1F^{>V5! z9o2Y(oJ-bdGhUZj7I+5-gA3SUa1^GfmB+F1jzOkba09di&)A?U)zo~AOH5#oAyh|` zy8y8Bs$?mS962o2;fIv=X-&O4W6lTK7G)aL(Xyt1LNGp9%4% zjW@Kaw;P+|;Q`rFll!q9dwsDp-S7Pas9WO2nu6v}wjk8#SsE>Zo4KFFhxbIC`#;96STJT5>>m;)8ybO zs>IuPPivsEO>fAdK2yq~cewNoO~!u}Kna`Ycn6GhOcf`uxQpjK0=V)Ez`An_K=)oo z+pjLr?zIityYVp^-TQf{jsIP!M*k}Hk|_-be?S|He@K^>-ldg=1L{lNSXXOYj89;p zAx-+E)T*k2BO5j&;}cW3PzI7~^D@w;U}&6LaSbeWN$ioXyXAdu~NX7PQHhCUMII1vJH+2%1syQ;4VH!#N!D$r> zd`@Et2L_n=amN753Ih(~0gL7Q&z9B3T<)*Rgq4c7SiC6gmW2knXQ;V*T(I4!`k0Bh z^}xdwc?!4S1;I?p3R=f07oj=^-{->dlEayMmWvRS%VPH}Sv`)Um1Y~4G=f@rOy|K~ zU&VO`_~l@7SJE}MN6@L;Aq@^4iGZ`RXj=g^JHNUI|G_mLk3TBK-XA;2K5Dnj>r}}@ zoUDkW69>nu1y-Gvbo)pu+sLBf$p5B1Dl(>KmZ20{BGPE(V^I}?LK;3kb6`A?mwYud zl%tS}F%eH*g^$Q9VS}2OC;&_49cyfz-j5r57N4QQ}^0O0&A zfb_huI}Qse!KC6e2eZv7P3~a}sn!K|@ zyYF0}gF7$K{)1n^_WuEx;BP=hd71iyS7vOY0uB~Ck7Xgw#6JK{XR zV7nBpNczbt1Gpxy1LJPdIJr;N@`%hjzVBD!I-D`G0dr#ZDrWO&mIc5Ze0xpapX(p$z_D5{BUl8|fPWh+;I6HWa#J21r zroW{~n|dFS7r9f_qByNs#npBkC*p`Jsm{Y*$W_U}%Ej*b;$j%nJ<=~G~~ zH>Q19Wnn6C`!t#CG=t?VZ5BCCx!EiM?tW|Ng96y2S+JS=dlW@<+_8R`+D8Xu=ls2v zEYn)NLP3ejlc>ahY}aHE*eJlplAS52 zTGgS*`aN8oVX5ua?7VAkDyw!ZX&i0KPN>&tMg3M8su?b`MlCy_&^c?tto-$Ah>`9W zvM=f370eTFNv_D&s@8}an_IY)CM>4g?*TMzxFKq$TYF*}>V~w;f@CXlwPv-cWXZCm z8Ka}xN4wqH)4Ds&n>%&$78cX~;rP~ZcA{>^sl(gSslRRiHgEiIkMGiZ#XqM0(mI_> zpP}d6KcZ+q0yuu2#=D;ZN{j$v`w|x9`Z+BOuTz%33v%=VK;bXbwER_??7RpD`vQ#) zz=rR9j>h}HNTY{;g^JO?4M6&J0LLQrhi}l@5USyYKcaIBSLw>a7A;7b8Z|9=vg$!a z0WQNjolmw+fpl)UpgJI2Z3@#8Ih|?@Csig152r zm!<2tzcixB z91^$~jf>_iSEWYexB{cSh_rsMq^ZP+#5Kp9&zPOHARriWsMcY+dh}aJCLFPGW|su!S6Vxb3<&q4E8PDpSWC}%_?ZSb6T3l zbPeYl#yuL1Z|cRJ1}$4i$>$Q)>AWFnx*w0yDw}ybd_c{dVH-(~a?G4QeBB>y*gY0x zKg>&SFV-wUuLEGu#hZTNSJ*Hnl$ZkmVvxsCB5wOZdd2I3wTWXw`f^9M=`Yd&$cEdK!H$=gaN|>2b?STNhqo%ldYkRpjji8i$Gw;D{ zC?wc#Kx#Hcp{-wyI5O)m9aFcNj!f(7Yj!PR+jLe8&rOdKl}$L(yws2LcX9I%ab!Er zN)&z>Pb;X8{}lifcGm1y=~DSEx)A*{Dt0VwZNX-H?@Lf^4k<~uX=S=ktJyYQuL5k} zf=U@9EqV?>^%EdizX%QI7hzj`9*lKB!~P9g9DIdVm;MES^=ou-@hw^!+^6-y2AdvUKK&JrM14>pkdy-`}cEOpmB!`8R zunQ8Rm_#BqYg9c2S58jBVLW{CxoMmixd4FJQaL*mhqK~3-57T;iN(g7u-6$^B}&-i zcnSA6kh#~F83xABUeW;BM4Z6(HLWU4Qw+8Rm~a9{Trrc4e9VF6WE~uDi@W5g9YJ&* zv$2D4!RO;*@iElP(Jr(ahQ0`ZeZ`LH0G*X`QTWkAI#p{+y3`2jhlS3=V{mqpqqjJn z!1{x4KO6wdEjej}InV3^Y3-1k4M><=Nk^TELS!mwTw2UAX;xO%ii6#GiWrr;O97?W zFB;az$XdU!2V17~0XC)g>}`gard6zJ^($+vk~xDfq#z6cAmHMhXVEF7?~oi(?ORfR z*4X+!gHvI!u`07Lb@)wCm8uu9megxIFY)~a6U^~t z9}?37v7pG|ektUbiNCH;h1bXep8NC8hQ>6Xp*K67z3G=5D-XZH-pua-29 zxMbWORJix>z5z3?QJ|HRC6cIL3i`mvT17jo$ECcON*Y70SxX#qMG4qlJ}qS+CVZYC z)w0G4$Lb}Dq)FvOK#&>+l8H*sr=}SOUR>$a$hAiJYyp0p-jW@Zr11I(Dq-}S%V8t6 zyAY0t!n8{OVF49#<;IkOPP@3EUOc2eROm&?MGv3?jz*MMnMMwP)h4ht6WD5!?C7j0 zCQ?{F>rJV^X9sD4UrCxl8v)z(6l!v)pC4ikd$HK2KYYAIotMgcMv8?mEMx~`prH-KN|m$;CeB6v2F?+-`8W=u0`=5}+`P8De> zl&W*}wxR;|<1{mI{k`$mka#hqXhq`AdH^2}P)93ZkN%}~FD^J}8R<*C`vy3Vw%{B- z-f5aS^+-Pq+~$N|?(f~8-Tm*<`ueA6%l6CBF|l-X{mNhvtv@>J}(-1p+OZ8KSq;)IRHeeqJx?SUL9 zhuZj4c86YO$FtO_P4{4z=8i+3I#NQb&O+W=J}xr^xV_QL-yaM}J$}qEGk=-Z`$v!2 zo*866NLhg$oHmm+`J4zBQ}tq1b5Sd$s8SOu;WSsH%3o7^-^SDwNe|!?oTA7BRd9?- zG{rb+4W5P>hNKiB>yn-)7HAE_RxB>AQG#kt+=gWd4;8OswJC+riP&>EEj*XWr=;er zL;=(TYi(M4;&fHD!S*^k%wm6~?a-Il+ug$KYd_bZY;TAE#NuUL`p=C6&|x5XG{sXJ zjDvETTGuP;ZKD}}$O{MoBtn~)?8KenD%uOt$spUnRl6O1@7>w6Gkr)~ix|Y9QjKmyl7meaAZvOD&?Lk7+6SU;mclfPtP+8MeT29Q z5f>I<+iI+`9Vf~Hv&3iUaTzZebThWmuqL-63f}aRbC^r~S@uv)^;o64Ad6EJm%0mCo1%EE>UZ{h zX4Q1;Rn66s^oguKTtFfn(IsqqFF&B2UPZ%UO4En;Xs&@ZXq7_J{`qJ*znL~!_^9%{ zv$px7LRbFyXaVg@HkM?ILNKV8Z&)4_!o@X#;G->6*}x$bX{= zA3|oP#4pQ$wBQ3NY&Jfz9HImI1-+n8o%?ASuVW%KWN?5Mx^-`G^H%hQ3GwCR)jM*_6c7 zSjT5m5|Jq`7YcCbgevEXJQxQhC(;1uHAGb&BX`Dc1pTjKB$9@IdgDWoTz{ej-@{7ui z(6{?w@dbU-=JYxQCuZo-`IFn(rX$-~SnSNGJ04(vFwpzx;W>w4v@O_vwBS|ST#!BM zg}&b#TLptX4}gv0*f0FH_L4PTc^lv}#F>iYfoG82!4#5DG{GiGt!NFZG2O$~3S#Fa zRo%Y3IEVAkFdZ*-rXk6p@e3J;N0>%gYg#N(tM-I=Lp?_rGN~5|VhXi^LaGa@{|;*8 zAX4zY?Uav1vns&`;8caKz@w!AiP{x&g4#I*>jXutqb@rQfZYXqSBnOR)BWpKv$j{N z`y}$;yB5EiokU*UY4m&17C3hZ@Mqgm088~fhvT1hshQ7H&D>ubjYs`WBO^dPZ0X+C zyR>BYDLX%)k@*cO-dTkG?-d$uZc)6vL*>E^fZca!T7Y3zpQ7^M)39r93J`LFl&N^~ z<^p~_D-kO?F1(6YPp?#W)?YF|sbc230Q@TLvb(yiZXd;JaE- zI%G{Qjz7kQr5xAFMIT5~BsyPxh^y@6;(US6J;qTdX%CBtYJ0tmXHgfEsEy1Nql*EW zfi`Ea;|TXZ5Rl}2#8H&tZ_Z;pl)~!0=G2R^^K)8asyXQdSTfiw zC%z%B-ov3kF#|202wy-I*05OoG@Rqa9jWTS%|1>0j-G;z`abN_I|+oO9v61l^Pa{> z46MV0>)3W!;MNw_gTn{^;F_H2l)xJ1xI27=*5BQE)zw1H&bS|Jdn_RPe%cajHk|BV zasqQDYMwmarqo_U#hxi)G0wX-#gd*dSep_GEhwglwJGEvY7+W)?VCDD2&;3GI)P}2j1$ICI-TqxFQ*O^e{AD_qxOIg4o_+i4Xic9!v=V5J2$mlz-lm? z4Tfo+U8BwoPEopNtAIl5LC38@-1eY$hmPB||GL&S9W|-x*za7uKn92pf4gvjrny!Y zZsygmJIsmQ+sp5smGh+xtcZ6jB7Ua zWI1h@S5zr11+XRnRIbXy5jf0d6K0@bxP}21V8{2DaWs*+$)3g$12&scpjzjA#+LSksq!&;u@f_rK7IvR$;cgBvEN$Gj|^M- z3*`>I#Z`S`O}JtA_m3M;M~=C9bG19_4vVhM_aA(dvz;=*gm$$#>L`akA0;Y$RDkve zsxBTz1G<==6Uzv9NC6v2>6$3dHcJU1EWu7H;Ws?;SzY9Gij}P;zgCOQ?Q`zh8}m$-}E`rEL)vFfnz!j zbj{)8%v@_b$p;;AoRiZ=99DIoJSFFe98Dk3J74Fx^G@jRi-Gpm{#*3fyDyRXORrJ& zVnL&?{f9KZw@&fWH_5E-11zCpwfDrnX<-Ykrk?`yyo?tXX0t2a_ldE!*LY-nl_Q^* zShOroJ;m99ZQ}c=a+(g3^Yo6u_$C0($z&*@IXT-~r<(92t_oV{!7j{68?Ya%iVMpH zF8Wk}wQ>>-4z1HzFcwdji8CZs(LR9aJpki-=%|OHE(UF-Vi62+LAkW?nW$KJR}QO;@HROu(Ob4>EckKxb3r`B6sD}E3zkI%)rVXQp{)ztTDK^guR{_bfL;F zxs08N(u*Rhi(QyAKQSBU0~mIEQvZ1_@KA7yMM;8_L7m+bMqElbA;-$@LG?SPEX$?% zJf~w!n3+r6O|Ae0T>!@?u|5mWs7R-D1<&p-RL1)W19OjZRvA0n9VhMg*}-+fCWjBy zZXXW7p0&-_6Sd!)>2uPY{U~IOIy1;Vu8Z!&2J&Qj9ySn`egjA<-GsrCqjaSaP*^qZ{9iS zgzdt%^K7)?jP9hpTa5g$P|nP!pzn^pOuu&ZXK3Y14{7HMUm^SUPf>C8X8{b~qo}t- z)grsxa{9lkV6|Yl#iy}wKSx^iW)G@jPH7m%oL3D?ysMM3BQ=#tFbrT4fr&ct#w|-8 zyNLkoK{24IT>z6^0_R%6z7RhF1P;I$nX#r!=YG8eQ{)BNkq76#d*iM(hij3!cf%@ zL=43)ksNa}{#hjsORY@8AY&AcJ?A+!(XJhOK)pH7%l9^!E@+S3W)^V<&uWP8y4TuwJ7 z97l_%7qtyFsU2CGP#a0M@6}tes2pNJHnx36l2)*iaGFqECIs>{s#i@i5tOD1LUFAW zR*5+hTVqHr5j>Bx+6~8dw2OSwbU*+70?E_7FbZcn>CMc8ZWg{Ub5fC@8*mM_$D^BW z-QHg1tjk0@dG`SOLr%>dSH^A28Z#sDlGs*tM!U5mAvHTr- z8D~Uwuo^RacED8L9~q4^;66)5HN++GdXkz^Rv)ST%lV8CupdB{V_R_<++{@?Mz#7jHVL_wFKg=ag=$iLCyNKG zykd#PGqS&IFMU`ERF>3a&y8v)DCgrrlR5@BFxO!JRn=`1d#eI~^T4n5UBi+2d@L+f zK5@E}kP2m&iD{BKwx#T*yg^`ux{X48Gw8$lW51=c-fpr9{XM0cUAGjZttb~ck>*6! zYvy~gojDf3qgzlQfalQ?oa_b{Xeg5q4ZwcfiuF z;X&O681Dj9a}YwVr^{7rz#IWC6^@yJ@!6gia3d{5AfV=R8GKL{4mi9}e7Aw+PUJ*b5(J5U(`b9Ue6*x^W2>zIkj z4nTH7n_&8T#gw+Wh#&6Nv4h9Ks5>ak$s^7k^Y>|fdB5#ZVQgOB`e+V%nnV8*9o}lr z52iWK52AgjAj^PrCA}&amS>u5!sd{=Y@#g9R|Zs{k>mCi5IB<1zNT zgqwLD51NZmJj6mj^5>1k=E{9q0BpD*dcm!OR(2z2^H~V5r>0{*Mhy;r@)e* z#rqZf&cMTk&G#weWEj~*RMKpsVdp0X(u&o_@jyI`4cBg^RRGXX?6eiGhtfB}VDF1V zkxOBZg~~YLY6ZPYs_GC_#*)+9_*A2b#^XxvUl;nNmKrrfg-=-;%p@x8MFOOfK!YcD zVbn_*Y_-g}xIMFFh}tIgqmgG97;VV{#|pNC?kZI@XJNeu;EZAp3>x1s+4ScDRPu2D4`Fmri7@VY_*3+a2+_`^{nLdH(j@AKg4q zHK#rT-Q9hUzInc)=id5@^u?8X^zyIYplBE1wEKCgxF~yc4GeFh9;k}O3c+;L1Qhy4JYDvm=1z~=EH)W%%mZb8xy8uNhM0Bkn7OD5aL zb?-_Neqx*Kuo9r<1RLT(jKL~VE|rA4%HKQ|nAJucGuy{+su!-k?fE)bh)ewJXLG1* z0yQ!FE^+8i&M~;mYB|j#SL4Y`^hG2wvt_|quAo^nY?occz4Zl5*@;Xl6LCTMWGdEd z_SDwg=8aXtxIY(h$$JPCuxiIRhDoe=%cm^qR;&2j6Z0l5ic@Gb0qzJCUP{i>5+q&q3~pjHL&!{s5!LL$r7%PVrKnc#^45_Fi6yi$2HT(N zh1qCGLhwE|6x6*<3P4dhyQXAbsBptAOwyF72Ij!}0z2gABSox@`rB4MK%c02rpjg; z?%5tN?JP=-Ggfd~3O3f1W}`e^y-#DEl0kBXdXI`5HG(%1Q zbbk+Zj~baXq>F66YqryUn^@d-0RZ`E!nP;3*=sz?;pu2~b$kC=vE{U_D=c+Zf%fON zL_sGzXWicV9+{2j=*HEj=;t@@&>O%08f7=G0yw~i9{e>d^qhrg3Qz#Jf`L+W5vo$C zBvY{21gr{rQy%XHXEQ2N0l}&o0C0!+JivYnQjRV!H^Ia%g1J5mHS6{1pNGRD}ZJ7%>pn{}8KJNA0!qUZowyN>;F{`3LVr|;rE!Oqe> ziJRrhHZ%ax_VGS+0-UDjq&i(N-*Cu|O?@8XR6DEPm8BnJ+=2irvUkDiVNJY|m&OC4 zk)#wHT2wLM78=eY2dz>GKVo%v9C0juUpyLP(UfuaHmH1~T-5V?v_#a)vG%FcdsZ_Q zwg2Z`y1l-n_F|o z#OZ{+4+mh6I@6;c>uC5ib3U8!kD0UaQF2D-JRf}fP(XGKgX&zo?mj)*n9995`B(2D*o&Jf&r zHs1RF{B3pEnQN&*>)Y1R7q^6id2Fx|0H_8-Lk(E9x%TXN8c?-;!ej?( z&@olJ|7!tU*3Lv=q2vIx9E=tpK#d7CZM-KAf}G)~DAcJbw?nYKWl110;h5X}62R?A zyg!fcKMvq{0^kB0ts6sw^FYFFxHOyrFeLUG4e35D_eZ3&HYagH47(`<-y ztplf)#d(QCcpO~?Bfbm3g~}W3o6GDJP^Cr-%w!$A6$|4|6LrdxvElR|aeiv`ozAPq zJ3lxA%8Ym3X^Nj?#VH!uJ`1sxOXsoLo2&D1WRB&$!t522i3Uy98vGtb14+FoMH!u@ zNaZR!Bq#deqC1-hJUdhl%6l3HLZv7t2CgN!7Y;MQGt6(&R-Y1GClFyu?h zDGPKhRi)`Lr?AL#JZ|B6YeuH_^i{j0rb1+Y3JtfhHE@Y^++rwd=5)Sd4JWWu_=w{+SA6u@BRVR_^6{R%@6fFm0dyl)O+KV@?@PddPvRJ$K+LMd#{n!cz6DU*mXI5cU(LZ@^J0aH1I)*K z6QBs@nqQ!@d=6j;aIKz!Np}TWOxSA8eX!5hu>W<~Qt!z%o9Y~;(Onu2ZqQKb)RH`> zG3=aG$t+G|W*NvC_zO-@(c}2jJD4l)K%IIQfVD+&zoZ;0XPYrAtSA?d)fAAa?+dPU zCj~M%_nCW#cHY2`AXcibqVPB0oo*8VvGzU*Uw?I0M0@#+KYyQs1y&rW(b2{Nev?_GAHKg639f|%veL#(q zOVYylZHm0D8Wro;JP@z|0 zXB=F70K0cn;%k-idQKlgT|&)26YERbrKBaV*p@VPrBvSt_Y{&#%v0+`t?3YcS4q60 zP}HDddZx}?70=jd>mz#IYWHkvhmGrTWLnvsT!&Gfjjq5A=KTAkcWLwDuh2ahDtotA=x2Km z>D9lqLyLEy7Is$wD9=H~az!h~IFj0>CT8_4KsL5wO5sI)I(`C+{S|=8a{z(M`1~Tq z?vvuERHbYqiGd>NhhVgLXhDbe^rHT)a zW2^AL&7WOlB?F?PKKld_d5?;S9G%?WPcNQ5PWF`BWl=^~5~!|>7FpL66Fm%5 z1v5*HWW@j(o5-_MWgrQch_a@Y2e_^BjYXYfD3qYKGod$i)FlO0t7mF*9ZNwE0p=#< z0>5h#eO2L#jo3J9W%r||WLzaht~rD!B!*C6@3Oo)X4Ze7s3MA*L=wg)2ynIMbW9Di zPsn&7qn+NNdE{+|Jb-xhK)LI}8U5Gi=15Z(8|RXB~-!H$FSXV0JL*ptILvFuyiBX zO2K@SS1}e}qcXV)779D+!hNvQZA|EWFv>;BrdOcdy+&)gv!&Y}BZ?Q|Z0783|^f7N?m*wR9&WG=?w{j?K9QjIBQqX`*?SLrVV4N4! zo1*h7fP0q9`<3dM8cEdyBP!#By{M{CiAQI@v@((3IXOkiMFa4jBtsmhFFqg4hSgX# z6?HLRw}lE`?L^G@f=5VX9a83I!=6pHTi>LFCLj3lJVG8)xn1FD%n7w;=ITgi18eA`(lcpf)*Kz{p%dB?5(t{J3hJZI&2t?D|> z(K=XA@7uQZHlarC=IZmFb{KZYdUKzLk9v5glP2+z^JY$q>2SQPIq~T8!0u$GDSsVt zam^e)d@U#6ZL?jmcZ-IXH}Ll+U7c*vUwL~#JAZbMcGh!Rz6tP(ZfQ~nu9wQm>H&mF z%C^}(*axwwv#OH4f5)GIaClkV{#-Q{w(63%F(|$d68I*S85ryUD&7HDRR1B~w}p*L z-SpzKloj`BHG7BBK`uqgM;v?0PD0Ee*`I-n1{4h57bJAX(hV@#_sC=b{0!ie7Rvab zM&(+vd~HR~=jTp+`bP?w8xq6#Olf}L2FE(yC(IA2jOA2a%pfbwwKSsI<be5TN+IIZ$&f>J|4ym%*@22z3iOtM8%&`ZUqfPn%fi{{w(Mj&jv*csm z)?BhKiP9QObQ{gm#P%XSM#JPF{jy_*D{D_#{#^Ky>c$rfsFRs9_jI|>5~XJ-J=`jY zHrK`HC_FHSn+=Xa3Wb$=P8zB`p1I0T@U#`p6KU9wfE)kjS`5jlowuyrxm4;-{T*jM z3zMxGYACekCMFJ$_CGUZDGDwM73T^`U?{^b&aqsKGN(F&1RX%X}DfF zk;MLblu{m41+{Kjj?s5h3fa(Az~^}5L~PHzX0gpTi@7=xeu2G~{ew9U)`9wR1*3`? zGJ`#<&!Ms|IH3lokR0NDFoCW40HC~si@!r@`mSW7;=&KR(?uFXg?(|4vvJ^NFKeya zd2`PlIbPaO{OB#3bL7LVv80N5iXNq%?pobZyB_spQ0ke(06x3B{_<#7e^Ps2-o=N> zzM=EU8ZE{P^>=Fj)IlsZ4*uI!^&%|xR2O+>N`6o)ON~9e>c8YgCG86KPFCllrX*fq zyRHVcxR!u5tfvVZ3g-_KP;9-8+5EovA+IX9;?Ns#F-yG7P{D-?lw=h=c#%yys;461*yZpuG8g4YUpwjti;!C=HS|>Qg36)cq--YFt@m-Y!!*aV$iEO&R5Lo z7A?=jz9fr?qeWn~dXTVUIE^OQXG(dbg-qhClFUtwzRdmE<%+z;r?EU?EM9kNy z%<|j!2e6NF1X-WX6oYE!{%vUfd^D%q{nR@g;?SOCy2sFW?e>0rLk=yd>`A-~8;>Sz z$mH+}AiAtbyq;Azf!IF`Cy5>^53ZVaF;09{9`?HQy-!^RD7 z_DW!?osa@xWgg-bh)o>|5LB#gW~}mcM9#Ba7pp3YkMAOCvO!t7PG!#utsxT))#tah zTGwYnt=E&BTzxNXC#I+lUyAB$H1$5}5|U7p@up+uXfvo#nWc5Ud7isR350HDivSk0 zfH6C+tJaY1Fxb|{JOrf}310y~U&{)4u(dye& zrZJ7HB^p?7TLf$6cv5jp;*b<(U=sjo)ucydqC4fp5QSEyks7h2$^0crgoQ?nqg5=` z!lnx0s!a;16GK!$Q*fhsDx71VZK$$s>FWB!wJ__{sfx?ZvD%hvz_ON#?}4lBaJ*_I zS?5Y|0CUku?8C~cv7SK-H;oO|u9w)pEI70WDtUHpVhb&6y+n{HB@UP4bIY-nNE}gJ z<9H>s5DCE6E=Um?LJ)w>oHIJ_y zrR^;JJU(uGYqc^tivMQ5=pc1^51p9iw-aS=bL0kY<|SJ{=42J`3uN1kGdZ10Hk4`k z4oXex*{E_TE@j7ZVJcHaEZ^R{D-t_`CVq+~%L0oteO0kke86-&a$n{wDPKRZ_6gCL!csED@oPA3Y?l5OItTO#CfnWA{@+4 z!INsywpDV?_l-bumcu~!H(EtmGB-w7J#!drD_B0cYQ*%j8VIS@7525>Du0y^2tR_ z*O*{*Wt!Rr`c93#Vc{=QSY%n-aUl;3Oi8RS_5vsA1dZ=>W}p(&%HFzG!)?OI34)-m z1g@UTA=F0&y%3{Lwbn~KtgSb5STDrI>?Q1keKWA~I#U7t5)K{8FyjEO+$R)6Tfjxw zT_HK3RX|I@SW~d}SYnQ)K|o;ko$=WXSI$8n;U=nra~UtGZwb`PtV2&S!0>lT=x(=N4d3ia{ zgL&QrJrQ8%?RdDgVfb;YjUNlha=6VU0IagNSk%FV*iDr~7G&!(b~-5v8RWvwoKBv^ zr5dlwRXCi=`zBJ}Cz*q!nn+OeYO#Q_Rop#9m{#Oks#a|}StGw+NzIjMg`LcIF&|IU zvuU>k+fdY6xx+Dos2oKG8^=jB! z?$;>5XES3-!x%LV*Oyn2BlTv0y&I2v9HTUcwwjIQ4P(Bs)Og1ge$Gyv%9=yD&IF0c z)Glmv#5MiEnhXE9`tM_}%C+JCOeZhew~JsJ<89gw7oc?|LLHl3;*x)l)V6) zdm5t{EJ;hsaU2Uf+_2uX6k*hXwGD>v&;YhT%ONE(SR1D}%m69?SH~*i4a~cBjDT|x zRX4Hkd1#5A0MlD}57=^>_Ut*DR*8-;7I-5q?85`Ow`|l1MnOV@e@Rl$EAZOgM=JG;X{;8MedPiL7!Fv)4)rY!VkqC>UTN zh{U~EOT@A&lB@ObErabk0IeNDQ^0C>12sLpC*H^$&-;K@=&AjP(wkWKI0Mwj2K3m* z&--kraZWsb-!}7Z+L@uvoOY-A=AGm4`Ejz@Q-kbml8MmxVy>hYsc(ip+(bQrMFlGi ztDOy4fvpg5Ok^-hg&3#PNWyTOZ5&kOJ{5v;mj|Vn@X%1=P8p@zWOM4;dfO@ervAFx z;F3!sGzII_C;2a>%8vpzUuQuf!GsAyxLjR9q3TvsDo;UiLcwk-CB?i2n6IVhU7`}t z&h=UxRWmkX+k(|u@D(=V!uWDEPKi^KY5FYyov7of0r>#z?TMfcBTWH zN$O_aXAd2k-MdHeXosRTSPQ{2@AY%~zk!VY#(%p)7AnYmBbRs6=OhXfNqA5(gX0B0 zwKN5r-CX`7{PDb`_am@T8sf2`y(qYlxO1ZgUTd1_~Ighd)hyFym=yGYhoD(HEE8QIX@;fr2UuSEw9Ab$1m?XlkIW?;odzjg~N`?HWlrn-0z+AY8 z^FDLUX!gjiDow^}xoQyD?=({3Jxg+>;+$wAM`t;%AG<(q8cR|LDbvX%bol~uD}lUG zT2e89T7DI3{=pq75TDQ{O|u0W0MJ>3Z|>u|Ke^D%Z+c`(cVvs{!)d3Pqq9C4hv(u^ zKb)?aBi_5)XiW0sXs14kweyv4Yw?PAASiv6nh>`dadQ`>@IgkT5H1WUTJmk+!6jEu-swQVcdL+p|=^`@s0hz|jIIzT^VhMz+Db`N) z)ieyV+jLMz^)s?F05sdumVLMZ)MJ{_u#9>q{~iR9dHc8RZLPx`x}Nr^Y>$xRgxn_P zxOq}1f!gfMuDzs>obZQ_c&vm^4SRD(Zqses@4Z2nOR%8L36)C)-7+Kk$L}uEFMoZF zCO?N60yVGUl6VQ1mcyI@qvC8%4yxQL*#kp*g%&yS1Ba}L6bJ-Zo>Io@=0zagpb!mI z<@GXLp3Yo8007^h2@rP-_G;L%2}l(?O_ORw?@LYRB&tPr>}*t2%4DS8Es3LH$(3m; z51u*3I~Ou=q%p2?gvNpw=7Rb?XvYUzEvuegp<8m=MA^1b2o~Sm%7e7;=z_G=UYtWH6C|;ksx^`jta; zIDR17&0-TVx+(46^+mT@nG6{5N~ z4!5Q($=TcKobev5#T|k+pH;R2Z&q9|H0O`wCitNZAHA8!0JQJx2n*4W*5hRX#*#uh zMC~SJW0i!sIP%H=nb|Un^|j0jfhixS=BV}#HbyI;I-~CVB+gKY#>o0}H$WP|+}1Xk z%->dsiwzGgA=g^ODw$B4)kT5R>J3mx&n9z|0t;)NtM%hJCUwMcb2~MN1I@NYos=W? zfOeRr1ux>V?nCR#;&lg$T%PMXAGMvH^45ei^>qagI-PL`o$8IVe z9o=T`&Cuc5bnM=A0@Qa|pS~L2dmQ+;nYJF?%=s;R(Hwmi@l6Y0<<{z*&$`e(TF^y) z<7HYHVH{sxCcBZ)bUCMQRAajO%}qMD3sAU-@w13I*T+cel}Ztf)<~TI6h`R*t*m{I z%=kHyQNSRJ?Fnqwah9mki+`{SnjOsM9Xxs15KAzw5xMbEJar4^?~EX6Zc7%Y!S zjmOEWz51CKPvay(ge$#eH&Rt`9ILyP6^F;N4(a0u9!HsEk77qJiZlZh zKR9N@oHmiFU18Mhq{#^`r1W5%Nm|Qdgn7i}_AD20Cvm{CqM~O9CsrFD(73p*RlkZ= zx?vXR(gZrY1FVaE+{ZJ?oSASeB%QiF8Z@7-Rkm%o>oytp#?+e9W3Qtv(4Ojo4~xlX z?VWIaXW4$XJu=Alz+SJUm%OSp9L)Gc`RcHv%yFu`(}(TI0&bcP-Z#tnKJwmZ565L+hNawGcv(LMU9|JM@PFIchX z(Evcu_o)C`4GQCZ0sCl)?^4)Ud&POl0>KVJqQCDuE&2}jn*tbU3&+7L=FdX_$=X9I zq3)gLi9F6kgj8%3Yx+)uW4pwsNG-fZC1X(OOMYMu3y^iUl!A0}^Eo>^3boYZF_Vp} zhP76HRP*N%xmqL)PEH)6BVlQbd6l2Pl1?-d7AlW{9VLx7_c)ym%v4xiU6#2xLP>!F z&NFP4B$NisKH=~ky$LS8SNXItqVAPSJ!1I+o<7;WSR0N(|uriTFVOp3u* zQ=c=LgD*Hov40i@DtZ{%!Khiizk|oHM%!i?0!)vVx3~l-R*&b|INR%tg7$k@+a9Hz z1_(@BusmbyE>+$2K}-fmIY7=*+*7wl>xcQ5aC(@Wch*M&Sq8gv={mWZOL}0!d+tio zT*Xm~88ypeA|>LQ%ATxf&7tR+u+0_kY!@v=MXcGFG=!)0`7)y!CT7Gos}oUW-J-J; zH{OWNw?;gStqV-h!JeEp4Are7?Fa}pM<3G70Bqf_$6k6feja66D6W5t zzW63a%O%)ipGv7X7t>uZ(tq^EkiPW)U8LgKLTs=WDp3oY>$J~F8Jy;Zk)YFUTJPgS zeh%Q2Xhj^LQndrYYl6@B(DS$PeifknHdMRJ`uYbXGYvM!UNe!jNP2j7jBGwlqAB?9 zQel8;qAFL;=PR*0Riq$nwJcpw12YR{uwrLEP1Zu*c}d4MD`(jeIAedUiJn*D+;Lt} zHIJP#Y02=^fVO()CoplbyERr8sIaBRtI%o%TxGhYdLM(97F8i@gW78GV|4&VTgW~R z8i9m`6UTtd+Od5~aM5O(N|hsYI^~>9 zkBa!N)VD3{8oI~OQ@ct;=oy@Ubd_u!*y_*aHtAs{!z$ zwu`q1v=905e+R#16^Oz%+B6}EYuQFa;e*5HY~H&9NBF~<)^K%4Pw2p|-CWQ++~)m$ zGMjaWKFy!Ahxz*41t#3KIlQ+!bcDk@JL-;;)3i32Kb)5I{B(g>eX znXGD>Ipdn-7bXQq8hg3ddfzGXeapw6Mjq&Vtaxb}O#_3MRU0omJ#qFWiCLB3j2wxp z=48D@`Xmw$V5oGbzHBCY8?#q*Y&>~@&}+Cp>u8-OL z+>mHS5A{)M_Ru70|7{L^nswzmYJEI(ICIQzvtPTj39`*Kbg$}Bf%eRMEk}#A7Oi+U zCrg_9H`H5=q!d!sQiZB3ld3xWRl79+t-n_-l{&Sq*VXrxcCNJx zV_gxa2GN-guwEr}baS;6lsk0n_Su^1D`#J3x_g;~ibNi5zQ7WUQ&{lREVfAtT*X1{1834bBhbgssu_EL86<5`vt-lc{7 zJjVV~?JXxcez$R3yBK#kbi9Z8%ca*C9EM|Z3;R?~ppxdaqMB%2<7T~cgH62WJA)we z&nT9>!-YI&HlRkLd(?7s`aBbBd?E?pr}N&$jMZbcrCKo7DXzuh6^*?X$*QB2N}d|$ z&WRtCJ!=tnVX>r|s-%iFjEv7&X_X&|WreU{#70Y+fPyRPR9vWi>OGkw@j@=FcdlcP zWJ#(KiCeSi+xTEfj&l^EmNpVkuuSE2K-HuNpid-OMu~Nj`$fF&ad2qSA+*5YwFG!y z#LcC5pkij*?s8IljLJsPw(3qf1mT(3bh%y;hb+tR8z z<~*hg(e0J#c!B!x>D=6{4LwQ>?WsUEq?_V2ew)cExmsZ>%3c8(_`b49H%@jDm?Z$JBWv zn$q^0eY$+3Ptz5x8dWlz4zd;XMn+9InH*O7Sm>rJ{`iHI%f2>`*0jBXu5G53+?I zsu40Bdr8guVTx$hDqg@!8K&P!_|_Y_9#q--MQmpI`#4#`13MUnhH zt)Ln%ti;oX=T@;TS?&chItOj7Z zncQO(yps<|Qa$owR16Gfdz1x$D-v;jWwS7%viB~I0ichU>3#+_yM>J&;M^Cm3N0?s z<7{zsI<7VAgK~0f&m&X&lC-CiJ?BTEYZl#V?Qjsh6gew~}XMn(>z%qAKyj*G$8O1c`^= zL*^o_dc)wJ)Qhk}xK0pNEk~`cW$-Op;Kk!R_pYF>o{bu2!fOmmx~v{n_N|>=`m5r< zGKy!UBjfG0t`mP5Y_VZE?b42@Z+<-F$rtb{_et0u|H0MP>=wXgTVq*W?;cIuBIZ$|^<>$5ICzNWe%J!! zr5*r}M~*B2XqUN93n4ayg0TrIRQ_J`4X35gnC3w-sCd zf@|&Ck=|#1KjOS$DLvcW9l!Nifi{{w^t=n=j#!J9Xff)`z$%1oCIWVm2TbR~b;PUK zX?`@`k5fpn4VFPVHA#I;&X^L1B>%>TkhpNHP`ySK%Rw?~4StU5dCRhy3G&^FAK zyy`cAmFqr}prTEDadsYOVmmcdtFS}C_;CF2Zve*N`c;qua#ec=>-SZyB&Hhp+Wl)= z?{)m9-#|PeO;=5mx|Tra2c2nM+hKL?%(Fc7@BA%hTXpCc4K+&U?cN$l((R`h;qH`> zISat2YvvTc9D$xEoyeW#O1k&x==6fZahiu|zC+ntM1StvyvV~23npuygpdmD?`v4> zM{gzc@i)M{xJIeb@oCw!mDJ0JW8ll-T^i(1QM9M!;3BN!IT)%K57D+%H86?k)w`=DF-_RFs?hYQ)l@6ia6V&OL=xl54o(vN!+K(7 zhYUics(M8*R^K8ShzzVz)i7Wof&l7lf_Vo}Wt(RVuy%Ys*e)woJzI#Am64a^IyXk6 z7C-`6<7N^`R|WQnRW8z?HO^*d3$BrSpsH(9=T2t8qF(01VADQ;I!y|3=t=;%Q8Jad zT~-;p=`xPNj!aM=S3?QsVHGu3=V2aEg*gr;YZoffEacG9TTtGrT%=Li!#j@ufH%g< z_({IbK0U7HPV)9Yb8Aq<9P_I@yVEGR=6ycyJL)b&XTLKy_cRSJKbzV(nmzQq3tEC5 zb~9cV-j(}w{Z5pKQ-Kyu#-Q1qtpBg_j_z_yqhUBYQ_?^dD%RNpumK!2da*$rIzaSY0S!2W=@|F%@LqF z-yc03-J$)v*X}yvDRl(^clbKG$38tDJ)2Z|JdAaJIXoR}0ipf1nLWZ$$D4OHbHtwS zuQA*F!_^7>nR}ex@Cw;=0K=0UzEjX{d_cdQ@6i{(nMi6y%h`!~_+6qxoY+Kd?4+{H zI#+et?~BTp!L1*jo5XYiz&P*j7-MY;fXQ|xvlBBsNpi#~2d#$8*pw%DS!c(S%PYu zM0Nm~;F5fqNB&A{%d!KLfsVP4H7&)(L~f!?8g|&o0Ax!rSqF7~nF&$g$H2>%@VbB=atiLUJ6ns;%NPht%|w@e?+)}5V4CAM*gJ{-|b zoG9HDVct1Tzg~2YavWdfv2j|UoqHVD*&w2G$(lf4U~LH|V-)uw?P;QkM5;ileN_ve z$07l8o!DRt)rHg-gmXUQif~p9RIw5X7jpe-jn$AB*a?VNo*6o^_ZqJdb^`UPfKL2( zzL-bds@D3ZkEHd7zu%C`kfYGpHrpfhaL!u_%tF|D!`-Id#;mNau>m(KVztAV*7qef zxs}_T#u+z9Xmk3%sIc|BHluVD`qk9o4QA#VQg1I;8?ieQ&`uKzHVYzw!MB;KKUj@f zZ5BJbe+UaYOFJIOX4}b=rF+z7K)7}%o0-k(Ke|Ua&9yvAJ5dP1&v)Wi=_l+%%I;hg zbqv;JvX?O4vYg%p^Zb+hJ$h=)xBwBhCpqh>8em>=D#0FR(IV#Y`uC~2`X#d4*q7NP zJJ530q}+*$*06Um?1^lb1*IjMF&N_NIPra~S&%sC1HYGrk&rxom9!_ITjdI1Yy*rF zb$H_0l(8C@^B5PZ&b5+o$q0j%>`zWZczAV~>g@^(j-V!HaE`yg$zeHATc-d$$v?~vMa1=SStQ2VmSQDgrf(Op&Osdzr#jNXMknkk&BYDa zlbS)%D#b4I5w4+>0`2UnWeTW|xgZLID2`#P4Js#4uTOF8awyZPhPKnHjicjFX~YiOGnuf-&-N3sL6SYVCcGz9TMeN! ztXO47D)!FfgcVwAR%v)}T2l3E)ww2R&4ss#q}0URhU5>izjl)EB>94IJ_c5SQjW=> z<`+$2u%6rshh~kK@aD2}ZgJ(W(~|4)%UY?dEmQ!~UmZgt|B! z#4@7e2jXew-F$|tykjQb|DeVTIL*Dyhxya34X0I#&+c(@TY5dA$#9wex8LMM z^F6Z5*z+QEO3P3`V$uHRxuu_cbwJZg5J@?!lh`@{d_7g4vJ+GuZPUsq6)$^El0XLx zuo%xAhdR;+$xK#My2G(1cW`P?We|;0BP>`7L9o}X)H~)nwi_Z&vG=hQX=gq-<^5Qi z=_v!Q6d)OdIgXY8W>8KJj3BGjgqQ0e@pew|nVBs!&l2|$RSKl0G{S^=LRa{H%C%mD z2eXaU`&lDlMco{8Lgs7;W}Qma9mdQYOg*1qec?a`7<{X$kP1Cgu}4xMl4ObET*sV7 zvM9&060wmhc6^a|4fbK%-Pgn(IjaqpaSf}uwgK39AMbs6PHY$Ebdn-~muwD-V84aR zADwQJEm1!^dy$G{k=7s-47PDCTR7YW%;}{S`XHLDXjMh;w>9-yPdVmIvtg&s`birf z@vEV;VD|juowR?bk$&tp$NjhzFVbQ>B27XU5~SA@i4MpeO_7LnO) zy@2{FwVmXBEDh=f#vWD_zM5=B%#_umx2V^+R5D5VBI|XU3H>+JNL3I~7AW4#-iblZ z>RC##!SX@H8`6bj6V%Ek(ge{AsrQ;0(atrt=k^4f%~R~^oey6D ze;d!-$MM&AdTwcs+H=-!??1ct!#_&cpp&lbus!~9w)7yOOXE+_$9I58lc9LR+I75E zxllON#?h2syVj!%t5A<}46NiLS#xOzCTW3uB@3eZd$oJ$372B`|5#VTfXep290!5UM5aKc~= z0FMBy94g38PX(ttEY$fai@{u_@>d4cHtwz5huT@=Bh{TmJ*hd4pP8teYOr9IWn%KO zY=;FPr;q|naR63}7wA8$k`uRre%zG2#Kj1Ggno<<*oGVl3uopY`OpDQ#*-!-!wZTY z-NSV*;C@ru0onQ3L)IjqKUsBfrAHrB6LRE1@=;qzOfjqEI#u&)^syVvIojEPwY^vS zy?d&Crco8i?VAaCbxYSg zhOz~4Ju-FePwUq|RwwgZE~)*H8Z}2-5=mN&v{B7AY(89P8+Qyfg{XsCw>^Fe56a;f zsq+ODOz3adVPm!CfKCTK?a-kR^V{9x=zW9W(7?9`#nzu@7U4|y$nE|Mz}YZ=R|`+G z=RVE-9evgFe<3=C#hN*(g|6aa_9#Nv@_naMIDO*uR$k+OOgCn}r@=Q20Idbz9|7Zq@xVT!A>)3|dkD3BED z2vvz2hLPA;A(55ZWK+)Iz|KR3IznXvrk)WqXjyf_O1K;!gSgEkbtHqZV=reg(Nc0R zVm(O{W!)046MEiC;)qPj@A39ZFSyJd8?4!e>M~PT<-+dJIzd+yL1-wr@H?0&7k#f_ zS1s9&3!AiE#XYT34}jYPa84&$pEjOqbslGf*@@NfRth;p9MZ#{*~J3gf|_~rp`rc_ zY`cx?*kC(x(iv%V#0Z@GeJf}1ymp*J6z_Ku083FBcS`MzX|5>{A9pN^J^I{dUo+;P zAsow|wCxFM;~HeUYowt~04&>HWk5>#xmfIx!A2^oKc@^ZqR1;?@jIlUz;xUYH`&{uoHi5s#UJ_66kx0LkAeFG(MLk za6YN8Dd{pWf1EzH>`{}7tEzva4%~$E1?HPYNqwDd7TJ#dQqb4EUF*29|DNxw;)SUl zC~LaU=WOw6hnMO{1Fr7T+L}|>>O<4rTw2FIPF?OAb}f%lSD)s3&74oO#|Y1}`>p>a z+>4_&`8@Kd$1gA4f}TM@; za%l`epTfS(c3uW402XmFeHJoGoU=$oK;YQdX|C_NsD~G%CTwK-00GQ&fHl9k5WCHL zSht3Zo?y37Av1D{cLv*yx!65vF?voC!|GH9MP~dms5M)bVXxyJ`)W+^I>7DjP%j-( zF=5ue0`NbFYhHjoc8J4Zl>w`*Cb3*EKlGB6ITuoR0CwH_PsF2$vr;xm-E!(W->h+-uu5p>? zY9xZkesK-SAYg@&vIcEcY^a120FqyEtHijlJ=^WcnRVK4rw>il%-T6223H}xan!1@ z%XNUaf z#v*MZs#!G!X&@-qot2VzmJ188cUC59Ps_<5IFl5P8<*-U!I*3ESUij?t~JZogNczA z%K8eh!vvt3F_RXLU>K3WT&rm;PFqtBHDym;4u8S*MF98&=i{tQ4j|0gmqgIFsV44c zRdO8p$OG?`#acY6F-zik#f-%iI>(u@i%yOO0&EaL^`1ae5XZbGa)J7sqUk<_gzrL-5A)m*!EaP7Ka*rHpR5J7D>o1i#M_{rBbiT4s4MW{tmCLy94SFY9rcdUu z7jNehvm9Mn(g$-)do&n5+}d-o%W_TUT&-zySMKjd-V12tWED! zwVmcjMq7Uy`6SAmIC~{tk;3KHb0(?RYPu1TvA07iLK*eqBU7tRMeX6E(p6EUY{j(d zwnn53Q&N_Nu$U!%~U((ggXm? z`fV2_@wD^zHEUJPYqzI{@wOSN@%9oM$<~kzHJKNcsn|VL{%Zaa*NOBEeTJ~Zjj!-4k#;->O4d3lSjSS}5OXN9n_9GQAIQhYd zvV$x5G8S)QDUKt?biE%*x5$b4nZ*H=CRi7822U_nPWx9#dAv+BI&o$w7NgSAcZV7W z3I_B^Aqn^;8x#W|djyLr7^WbAO)jcnfGRs)*+}9_S^dlTi7S9Dt616aYXGul!ZEr~ z`vPFuP8)GibudE)P6pNlf5$j(T=ntWKiPPIw{Za9J>kRa0l{1%=h9EC_)0a%x4`tyAdMBeM%N@*cLsdQmNKrVt!! z8P~E1a2|+b6c=`nC*A{EGEG6l$Js!lUG(#PtfhNcKc1jzb%m})EA$1};3HOruj0Pe zm+1Ypv)NtEiJy-Wj_2BV{cvx`)5pab0#WrY;s zkS#wr!uErQ2tUg9gI*jCJ7kB#VJkukN6T`!CpJkn+06kXK}AbTK_&%o|8kN&>P6Qndj_z|9gG^w}x*yZAC}6*u*sxNk&YwX%g;2-fB4!TWngY zS?Ne>*}~3^-O6EU%74rW>{LCaVYF3<22#k7vqf{u)&UqZ%}i$8)_~AhD#2J&v?hv5 zBQ2x}nY9xv#f{>_293>ENhrLbnM(E6jm7bsQPGqb9aV7}KP+1&8L0OAxOJ zCotd4HZA9@S^RX4^Z4I-;?pVD?&!QuuLLzcKb%=<>P_-TR-3>7PY#_w&l*S9pSemm zJuXJeQCGq-dpWwsCxgqgFAlEQ-cy&Q>@ZllBEK4AwC{0*;=LhbJ&(6{4Gv>4qsMST z*0&P5xEEBr3(5vfOqrmwv?O$ET zc-QE11t6tE03Se+oopy(kq()N6bBb^qAq8$>qLQ*7KXsq0noM(Dgt|qaBUQ;s9IWT znBja{X-fe=jWd-&^kBhdh;6V;hm(ycs&vxN`=vmurT^oM7Dsn+QfsnTk}%gHxhi@c_eu#aR9_xOP_bx}Rz zr(`Wzl8gH|?&G1jC)VVXPwGy;%=Z?#Bfq(sZASKKHpV;gzD+voj-RjlDXa9a>K$9O z%pQMUSx*R~5^H?B3he?4Au7p2;$m~q@H@JMqS zv34%EYFOVS7eyh!&&6Qa5}c~QTd@_~!)eqKH<}-K-KwQZCr!KNu`FU4FxC3oPWdo3 zu}EXFf%)>>BOlAOK%Y!x2v;L8qU$)9aj8r*DjJY$+PyW$78$qJi$-ZZzB!fAUxk|< zvev%dS*E2v6I(Zv>5e{=zt1k?)^yWgKe_JNTu0L{uJ6%UdtQdmcIATK(RhBZ*Oirzd+;)1 zL>&TT&#`8fg{6h;!yEKwmCLgqv(G93mjV?%jGC4OUfFYY;4cCIPe8E0&|WdO%7Iu? z&cI$?_5LXRC729tGR=gi0pgj6aaOP&9usAs*P4*j%o+(`IzkcmWTtGT43#yXE%i-# zx@!T5!`#Yo$VLk-Z;8}J9FyrWZb`Q>6QGpICJLesjMSADS1suVt|)uBgyY!$1^;^L zESDYq%p)FJA?8}+yBzV+a>#23a3?$_t^w?_s+IweZ9VtYb>NLRwK(_STIEmXPwTPIqub!6=WkbFQ(Cx5kPa6}E=dQ~l`J|@R+rp7|f)^@F z5;@H>>ku-VIG^uEZo!-D=GS4&hwx8oZ+>0|YirMC>vB{L%CsWb?g|6_T+A7fA887U zYjkx}eA^NU3{R_5gDp{pTY7!5wCx--2VE-T$n3NjM58G@F3<2xPzE&pFq?B41L%00#>t(?w5e{^ znFTkymT~!wW?;_(RC5Qsb@|XvHB72-jj8t9S+|~Gq{qDuR?;(GV{(9-@Q42dgVK-A zar9@iggPiULv-iu!JQI5&IB?tNvqGY&3JH3=9eAa&CILk7OZy6QOR}*X*zr$<=#cm0)OYKQou{MS##c-X4JHJ7ozF&WwqvcM|Va zTxcMa<2;SGB-`3kCgmFU2xFw-N3@ly`L^nazy?oOOs`N!0idj53A3OIZKghh*uS(iVTdfrD{%O!V#Ej znP-+{L{?jO0azUaS%P_$DR8!u7MLr4$1(N0%-q%*Bkm~cW};Rc+r?LyjCgIVz*sQl znJ_5;0jM;Vi&%7S`pq@%UT%biYEO>s@ieytZupccP`lEKwk2yZ&b@+luHc-P!MIld z?5rJ*lwp&dGjD}0^Ws(^X@|`T9>DngRHF1f74taAUy(=YIeCrJw0n35uVA9FG+za( zDXE)WPA8*aOJ0t1O`MzO@)^H_6J~e*xs1+f{uj~Q4UX>ZBwP54Sr$ypXO?&-MjkaA zTujbsJKXSw9f~<}!5YDODe`ZiQ;)aGn&lJ&Y|fsNZQnW&9TTqto6s#Qh7RovXD zv75Llvtfc(8DJp^XW2v&E0K}QJ00a!%M=hc8MMv49M|2BnWUSU-ZeGFW8Cl~elK#m zK{YSdIgZ=9W3!UybFZ1T-OLY1fcK{e$NISpdeQ9h^aj8kbHsVq>L$LOnZX|+xpM&g zM5eyjgK*MvT8TCqxvNiHl`s8kU%^W&a{n9e$m(Z*1FqB0NQa&ul}JkE#r<6c3lsgt zC|awT+^S_aOk(u?Sk437D$YI+FiHlM)xCkXrmbD+9b^*PQjI36E`Y7d9oC|9f&=zo zEm?1xs?1`oWjUf?D@og40%C2+>{$X>rob9SZ3T2?!7S8O`9OkRs_RBtiW94Q+JXJD z6h{HJY^y6b&W-7^Bu5COOd_g#(iXU(g)DRlpxu*v&;w%xgZ1ox4R-J82Jay*ybO@T zHXd%;$QW+~Paa*zT3S@K!gGnu1*k&-AV^6>$}+OX7Dp?&ZHwJH{QNrZd3KsX^of(9=D+J>W;YA4em>o6Ox*M? zWR9n80Xv_Z^Pgohy9lsPxA;@9Kj}7BKfp%3E=y5Y6M13+i!*Qd9bR`r@ep>J4N{C&7IkO~jGyrWuIWfuY7>QeY5k+ssNC`fv>mY>f?Sv)|_L zYP8MRm2CINsZ3o-zgw6j)JLA23(WmwbKOh>>35}P znW2sC68A0(b|l52W3b?YiA_vgqUJMLp6V8}mX&qJBr3I6CfcST2W<&es4{Gm6^Jn( zO1s*XL3&mE1m$eLR0js&{Y6u`^$PmJvEN3MY3m`phj@W8p6RX;*HJ-*kDkWFw7mD#LW4#a$YJ zs2s7k#?Tu`S(c*<6X zVNG!K<11$elBRgvIJCavA=W&GMaDRyo6@Dp|Pm1>ie*2d9Uyo4A$+VEvKLWePBw=W^UKIrKlx z#V`7#nIFi46Ztug<`?X0c8na|dj9jF3#Qvzmlro)m)EZUvMgmA@}I5zpQQeSJp;R! zGP&^UFUj!Hwp=Km#emq6LH|JZ0Fti)p^`k->{%){Fk7|0gm8aiG3F_l-`-bXRU*NcfsN9=3Hg`Wmo-xHguRqCrON<7#0tRzWndsi zrYAlgU5p=g05kxx)D)E{4B-*$bnZZ1zA(1qDUZ8~%se~l0HUNGDbol49d4SVB9ueeD>(!M zXP!z|^^jTCQHX@*OV+jvolv30Jw4=p)_NG)1AIf0o^YS;@ zYx3FXJ*oFs^GKYvl`hxg?dySTaU?h(+MH7N^MJi7lypB`~KoqBP{{PjupFz*{b zI!SFX0XvyoN;VWKtZPmb+@a>GG!g$&Whf$r(P6lwoXuvESGj_6hCyGcVpBb;lQLk6 z)eXumHKyxpg<@*}U>d)J32@Fe1!4>p7SXImpsXOw7oe;({>zzY?Cm>cS`r?B9}{~g zW0Av2J3Btc#1~-;JKh+g8USe$qnf?MG6v9jHoB?QRj#eQYOSs~a+d5>>a<_xT3>(6 zqm05n>xug`x!q|7&wLP?o~ioDkG)kF=tq7UmS?r+IY)?t7LV3M6K+^tq@wgv!b-*<9wF|y}Iaf>zsOj2)Yqmyk*RHdIi7%7q068e3qz%3Qzzb4oxCP z^(%!Ai>0lFixI8Jwui`Ns^_Hs)gi@_OgT*b zwK+$nWZ2{y8Mf74wJq%z8@07F0yf7s<)Iv6KN$egMU*~BjUJZw$gz;T!S6y^`*Z0u|#*bCI9$q z@^Su*yk6gxA3V-w^YTR*3=qfN+m%ncoMz7HPrL5qZ2lPI)FgY>e(^bpoCO?zu9@@1 zK2AR7)Vn%G)=sbJCo5pnRW+Ht{VpcsAM`{w22v4I?M6%XLjKMxtV=WpWpbq+3|by zsumBj`3!bu32tJwM-!hd+HL&_2KCurg_GT@quJKX-hH?hKl_zCepknR`}4lW&Ei^- zJh^mT{)0<@OS;+b$RA(m%RhVhAIkoXKNI)e18qMSFGbRNIhOX9yYkuHUzLr!UzZ=Q zen(n#jV=#l2@Gq8jnn~FtFW;L7X}tLA5f?sZ&@!^jorP2MEXTfS}@?lv{I(lD30-e zDMjt~OpHO7Fq_odMz3$hj9$v8b~J0(S1a~b#%*Pon%$9xNhz5kXJ{Sj^kxc#D!o_& zeiGAa)B0L=-|3|~iL>*F)#6gXg6;7Vmno>S@q2|>D4VM@Y00ZvQl{}*PSa!U2b;-& zHMLAsQvEjS5u5l$689wubb{|B@V*~vieOKy#1?kYyYZz#@~`3fg#t=z9#wmKN7#c zFP~&NX-vCQes=s9Gso1yHQySX9$2ULxNz&!@9z`_;>eyGBO{ta5n3yY!keP5zCkkK z!p*c!wMpAFfE5SCe!#iD4=@x6rURg%pz@*ZiFA!T2cSc` zBQkR`P07+xHLgj9IO&?7#cO}U*-bC*$d=7yOh0kc^|z-B#i+q>VC z>JK)>J+Ok+xQ9vUGm)%*F_o8=pOoMDv%e>Q*d2iJbimB;&bUKiscc0z)p{yd;1<5~ zlF1H&B8l$+V7rt;U#|hEEWzP1=ys*+SDAKY4dYD^ z8LW|c`;NrB)@)FMH!rlvYs(5@k_1Z+RiwC5w(rO!$!6Q^K}+_^6%%!r`?`bu_cTd~ z!VyexDlv08@Q3)l)=CKOnYm@uE4G5dp~i+Qb~(d2WxRd>XB@3qKiue0v$BgE_B1iI zy)4BJx?W2FU2Pi2trs3iy!t1y|GlqBx^-Q?JUop2|j^u##WkW;&bwZI(|4%|G`tne2goDO*kGGWW1IH>Soo6hvb&$E=qo-#_vV zTbt;SqA^-C9b}Fz3WNJ7B<@%O)MQyqG%~p^#6v5ST%5>1t|yEsgUA|x4e&>RZ6q91 z3CRn74A)b@?Z>Wbb3WIjSf+kIzKZej!cWsMpm9w$9C*Yk#1~dM zZW+KXJ(bA0uch+pg{$)4`}5zGWamZszh3_cJM5S{7XRyGz#pm>a3aq<@bW!?oqLS8 z51w2}sdtMv6|P6VKObWK-+7qI-KC*w1UDnpD;jNR{ih$RwT#M!?KUC4N|!F;iFMow zbFa4D3m=4$EwNd9!X`0*tY8K*05IC}fSK)L`eNgP2>`gq=(r$18A75m`H%2+;jaB`L}{;u<4NDC(5ma@v}> zR22hZMN`i5AUuP-*w<|sAC7d^O>vDSoYR52nv=Mz?FZ}PQ2W-Fp?penM8bG=h@Z!| zL5~h$bI9#-q`WLSs0J3p2>qJgO`J&aTV#ei%>gw^*blBm{wzTvm*T@lC%yKO8 zZ}NhPc8gDR*3FE?O6zZ9bpe|UVj_N232Xmrl$fm7Y$SDXG$#t5CNI`pB9oX{N1CY2 zA_kYMEZdp?bAcfTm#hz^B}sV6s|iS2q?XkD*UsSRK$=vAIw`AGWDKwdw*Ev*+yJcp z*H1I4NhUabrnA4*L`{})Y(0se*I(S?F--3@x5HI<=k&h zF&`RliSgUJ^pt$9`xWW*{w>+8-jHuCcVzqdKa}0q{$EnP|E|>kXiwZur4z&$1{t12 z={*(8g|B7u%(XT7{eSs6`TPgJA^#li-`%XGV)@!P6^wSb>dFCJl!q*j-9sGj0LB~f zJKymN4s;iLx^c1JEyPVPJ;L_Aea-My7q9lU!--aXWthI{*by#Jy;uYzsl zk8CcEM)%fPDS!flsiWcDjtF*i%TlV4anoEyA>yE5W-B@?$;=jtXVS239`-LP=! z=6R*tC%z0hE4l5D44KCwFtV%%F<-__Da65AUukt@uirv!79Iw-k9!56#6*P2OX@&( zl|EMjuf3F+evg@y-VZ^{wq}z9+^1F$wqP$?B@FC3G_;VD_E*TkZnv@NBUqUBfmF|b zQ?`>|lIo|=$`|)Bb%|b;cRmxz;H^If&<^GF%cS)Q-}b8QB3Wm&&sB|3HZ-I9$Gg@#I1QpUX9#4p9JX%U+C9|_ z-Z7Ug{NmfuEDeA)x3yueUM9hJ+^e=x^{D2+);wc7I-7}sHqVgT-J3VO7a8&K+071w zYT?=^e7fL;@D0!&yBuF|)aYb)}R?Eh=sK*344Xy&Sq& zP+&o`c2lM{0!(T)RBfx}Ws;0l1x5v3v@GL#wUuC)hl5;5t>5|7y7$7{!(0VW5z zWB|Hh#XhgOCOl~w5?L}`)P=FyELp-m?SfbUbaAS~LB|+(oGNp7TA@4$mgE5Yt(3uA z{v&Ky-UV5pQq_(y&6C;46t&fAn7|t#1Ste~Osq&9uI}lcg;of&IeOuh> zV|nQo^l;KchB2m_8QioMkSz5gg5o_pPcykeFfnjnE$fg5B z#3wQ~bN98TJLLgPli(&EYL+sb*YxoO7EDlP0t1DxISa+4O<%7fq%*PpH3{d>MJ^Y!>9FU2*jLsiEZ9HJhWI37n4E>*9UPdD^pY?AcCW>ZoUZ z@uFTwp1k^d@=W|clCAn>`C)5W4llhUTd)16GPwHZBH!2)`SF2()~YLzNxN|u=64mG z?P?^Kzmm%Ht6lj!-+4m5`qST*Zy)>;fZ{{Bk!@&6ij-Yh)o@NKIoyms&ZNH*%QC#T z(Z^tm7e$-1TW?sKN_&7yg&5<23QMs!Jziz4PIHKA2X@I?^U(ZQ$2Hxn%=T?L6}Pv3 zsx6fk^hv1s4lbZ3aenlyfdqNM5*Lc}4={-Um;lfSDo(cSWsWT78d1hCH_-=eqRwP0 z-wQ03zw@V~s!@$(U`4D&5_nY7e_?h;=FjYTpLv`chrQWcnrZSi0=|!}27YQ`(l{a2ZEg1xR-^jFlvau?`uL zrKJMM=7%A?W?9|5;p|t-Bq$eCo|1z9L+zu>vPUL%u}8P#B#9z-oS$%>(8Cy6!#&=t zHP)-mjvmmB4BPsJcVzIDzTEl#@5md6tMa)1CAs&7SO!1(Bk_+0a`wfIx`)laN=Mdo z^Ai&zEeVTM$!fH2Btgb~vE9;VBcFuD9{0(oz09!wiEk3COZCblV~wSj8hnqmP}^7` zr-Z3irMu7=pwc8MyyCjG3)WBpv16YHw>_hhvo?i`nGvC7fOXAWoU)FD6N- z+_%bA>|ZUAeBL(GZ#)a#fiQedXT(|*zAFGMgBy5+52}v^`YdP8WJDCQ3Kj+(di=VsJcyCig z)lF`9{2BR)|DI;4XU^mJttGgFafvNbss_NUv!;%`qmMPM_G&WfyG`ek`}<9{l{ zgU`rY?PVFR{#eS-{$m+F^F68WeIV{X2eY_eY1XMrBL#@$944vfBU!%gWc9UJp6zwz zH@|&VzWna5%Xc6B8}dVWD4)aVy9EFm6!iA4$qF-y;VRz4-+PB%_LdWQ0t_wQX#-dH zEW5YsG#=ZeS9=({ge}@~OO~>FRMvLle4>63=C{kK)IaHh8yNo{F5!J`+n6ow-E&rW zJ{47{?NDM4+gRhR6pW~2fK|B)X2_b~p0>X$i%3~*ox{%+lLfXkmYPu9-yv?x(j0Ft z+9CuksnoTN^X9~!VI~z%Vp5pqFM+Kx@hYkH0;u_1g1shbsh}$L z9`?oFeZjt#1Lc5yp#u zgj3#UTR^L7IQTAn3)gQ-|11B6Y~OrAer@X|d1wEs{N!`LDTg=yQtA))6CYQzIYbhB+E1gSdWD!LeEz&X^6-UF>taGV-9hX3B$-_szFUgn*@ei z1;4hH>@FzkMe*OLH@ za{wmH_??UyFWsz@@liLkT{LqZa%8=!-OI^b@#Lk65&PLKkGNA$-k)u9I^gjq{C$>h zk6(Ym`S^u@oV4YU?T%dsgJ9+9H{{8+e;+Q)-;@vJvgB8GQK~K+5PXiT}l} zxDPQw?0Zd!iNFpMfM7;trmG^W&&RUyOd{98H2?N@uE>|(`-=Qv^Y`R?oTz5+$%o~O zvaif$7p&$wCTs&tKnsBGzU&_4a&Q1M-5pA@16q8D19Wh#z1mujs{AfR7@TIPQpjIh zyzwoGZNR2kp>5-QWNJpWw+>oXb_$=>plcxn3!^G1cvU`X8Dmbh9M!%HF9hv?Pn-%_ zXk4|np0X}wtg^4~8sn}RT*AJz_-#tJIb5)=>}UcIjWV5QO=lniJ5M?HRu-25#OQ)f z$O@S}MISPlY)tvc#(iDed1-Y6J!`l{6pN^|{SBt)^?{vJj94}(V;Wn_9lDZTHqi2$ zoSDbnNZq!~?AA#{0=C^h!1Kf;0_;2=USyt`Bv}u?FKNb!l_26+6-6&9jUS6j$m&0u z&Fq1mUfC>N%LBcqF*B|cu>2vc+ad157VgUuz?4T=QDtmE@ZBoDz`0VByZ>~&p6SfD=Q;n?6_)@pqvT*vxFxOF6ky4w-MJj z?ceDV7@aYOf9uiTcI^t-+IHH76bXx^Ml*61rea)8++&TZXzX_s=pM0jTXH{sCNi-% zKN?_1P4;{vKF0+kV?du=oJ_wqlgp8;yP)YXzgI z>(tGeoddwGVJuy8vi4FW=av$AawnB9zj;o6^=Gfjdyjut{;KZE-R=+M1$Q7f-5S6e zI~amZ4&f#)Fo6ZLg;!Dr2^*PvX?6Ot{4kS)9T@fvjQnj(PWQZ(*x=?AwW%y<|4yZw zRS;68j=zBto2kBaEftDi~}9Hla03AzLr zmvt5ZYUEZmMG1YV)|xbYjS+2@!ZZp z!N0_@iV(|I2^+ZJb5J!`4)9FDNR!8ALn!4~lv-w_DWEAEw8PfW`WB`_$1rcCv1BGx zvC#sPpm+{_6R=?2?NBu1nw^QN!=Yr4ZPHUy<>@lcW6N4*vJEW_7(>ebHmnSud;j{b zy#M^W@-&$8-yZbjTVGz4TNhw;zX3Gfn|y=M&RplMyU1lcyQbP;7qI3G$B-juHv7Ar zVSlG12}d_MYIEluEU`rOLM)5e0ED2*cnrZO(Ux#c!*Z`+NcE;Nz=*v+L330@0mqVp z3_N`(0UFO&BKySWdSt${xs(AAeW?8mV*K9Hq^#$T*TQ*qv9j5KPPpw2uEX^jIJi+c z(d5u+ZuYDWaRWGJUVO+_9&aoM*?%Ov$?wVgD*%qGZ_421e=Pa+zYux&vBclomgqeg@}bvQCmAdoUv==) zMclOWWF(zy5r|15PrcWbH-6fauikxH?rr|Ie5-y!KJNTAF!gP@TsjEECW8`i8uAfqP>HmhWvsMmE=GlMZdY8jKM@>pP_aY%~N#4Ifl zDy@Z_AHSR>W3LGi4B!}nsivUH!yF7YJJc>X9yX_n>0Un6?Ww|~O@x><#pEOE1>m}i zdZ^@~-gT;E(R$Q8N?_;FUh%d;JNEAERW8ch&plZu)? zLgs32>U_sii?g#gKl5)f$!>g5n^M=64`3zIX!$B2c^QdnOg^jTrvb_)Y|%^zCYk3f zC|48fPA*Lb@6mbPoWG8YQ%iC}3x8j3XP2eCxG%-C|5S<>|46F#TM~W$mc%~;xID1QBpbI- zo-bQ+(pksPRVVGI0n#gpT-uA}`FAq;?E5YGrAJT7&cWZ3e_4Dd0bZJ+v z-T#8z(Nqao=K)w3K(kF(Df1>&RDrHbFZVEo1~HZo9)tbd1-eo#2(CsZ&afu5oqF{V zv5lO*8wAnVCRsI%b=4}(Sk|UJE3VOh&&>gqs}CN@lQ2_`R*0kUly!Ig4_x!rKGU}h|9=?Y`aWRl(*+ZLhjT?_vR zk~M2^2O7U*g@X!K@M+WSP2kba22Qhw=?2%g9-tb5vDPJQSZ1AaC<2kT`|2L9_<39@ z(kEI@0}lZ1Yn|3g0@#Dr!BwvU8FW2U{GxTB31P17REUD%tw?>`EdODzT3A>di!zOx zR~C}QA{E1M!EW?m`q){FR)+D@L!8TjGWtjpI;a5US#Avv3C2-W2I>yHPLzgw6$!cPtF)4jWAMo4>;8W!8I z-v)3OEzyKMJ&s?W4lJin`qThB+H{Nz&Mn?LX%3+Y0b;dsIbIkAD<4~ez(i%Ms-m!o zJ7L$`=M9jI#TLwom}~lxb%$xdVzR4EBRv>O>H+}TZLFQu&PsrIoka(LWnCLffbt+- z(cC91<*cP1J&J~LM&WgA?vHKI0B-X$UdBegaeX&SJ+sc_!gJQF=!s`%!0t?s)sO3M z=k0qDU``!Fjt9=;zp*1vPD*B1KBRYV7seugcQ7|AqAZ*JXF5E&jrR3||3zefA&24F`bz_Lf99`pQ64iwvU{KfYM)J(h68ZAYRe5>yn&bzclOGO$O>SlnWGDL@$vcnboND2o zmjm{I1q*fk7UH8!-c977qzoS=74fe1E7`;loc}ZDk7MXO#%#cQo)%) zlv!qU-BK5}29mPWV#c9IAIofFf-A`_)sh@;oCYwhOeZf4aFYa9kFEcfhMIgtzpKMf z0dQ7k?%0_JaLk(hy4IwzQr9!D+mPG<2wH1GMy13gPU$wr1f<@=&k6v)HkW-_j|QN% zZRKQxC#}VkcqSc=lil~!!}#x_j1DSwHymaIvPnq*>=(t6bd*jWs;!erZ2U2<&#@71+J7OSyR z7Yg)w&N_2XG!uFT5nH^VC=j%`Po-AUTiw^f`EsI%fIG@QIJMVXY%pMj@ zE*81Wqvch(cTs{s8gUe*)HeQ=+$aB)Z2k5CCl3Yb8p& z3UECSQh7O&_69%}fV&3Q>9t#lJoD33UcR#|uWVkCeE1pw_SfYn?t(nZ{z&?rn_xzV za(RDEZu@fpuzdhhUzs3drpq1ph!9{rgjKCbTVQzi@OJ+)z$iOFIOh>vycps8k+!E} zE440St1Z6DxlL5b!U|2%XSp2Qo_%LYLX9EhJzQd6_;V^DSg>F-0niESI&)>XH5gY0 zFs+gv?7@;sDLT!3CR5|&9XG)(<7L=0-zbIo89<2xz(ygY5)@++Z*AUq4wN3|=L#{z zF9I~(t_ns#wv=6m_VjoTzmv^Y0A0F*sh(76!jUMrC#^n!bf~!|Q4DWDYXH|R*26t4 zVYh0`T6CG@|m#JXNHkg~=7~IZJwAk61obm6#Bexe93{0DJbw ztz}a|oFz|Ohs-@Ouf2r6Cz@r<3MMjI_S|)Bz`&$1om36rl27rR3&~oQ*3Hs2&GjRk zTXF&Wy;y0JqZVVeA!h5zYT5a)wm5A{W_t^E8WXO24{^@VR`TNISf2V~EZ==GmRlbp zs_-{MDehD@NugQ81R_on%}B3{>gdZj`}aZv=Z@I46E`{LFhBn?=ETP?Qzt#+l6Eue z%`A!K6C02=tgBM2sH_lNOgl8uEZasg#1fMlslg;pbv9ZBw#b(ztrHnHGB@T~hK2!= zvd|(V7EKE~kpKD+;55ai;MC=8ur_%_b1_tw_!JDN$tRAF*SLSpE$ya&{#5rd{5y|T zmd>t`>okn|$R2z%d9jzMnTpgiEP3*nnzS%+eEWVH(2ir$^S_xvRVVX-R{wP;GTEaM z>eHUbNz3%wvoYrR`fVr5}qrgh%N1g)NEzMr5yQ$Jh<0N;GrW)BxaJ z1K5`!3siMtd^2*!Vp%X-^9IGGf}aXb!F^hhl>(hwIe=ShXGxl4y)T+HMnc^5QJ_nJ z>RD`tJH)y%+XnD>j1}WwfPO38)KVSwdPkWu^)g(0^Dlpx1jP|7)ua>(B8XgsKy8hXslLZiIbMn1UIrj^zz_-CH*HVx$;yZ zUk6a%e$~lOE~oP7%}9oKaUb`|fNLW;ome{0c6Fk5@WHOgWbC!E#d7?+KM#*T0iT@M zdit-k?#G=5-shRUQywg_B%NG4NHlYdIF#I!6E&<+h!iTLtg8_}j6?SxYuawfQgMTj z6AJ;BwY4lRC&L}p(@q#O>p6=T+y{|<*GMVa$n)w(vBZn0wkbgw0JibdM~EQ9St$P?D8A3@xuRE`h(}C zXt$-h@JNa${!Gf3{}d~{DcO5>CHiO&WDraP?3Jt{0x)&SU=bkg5@1ufnfsBfJaBU5 zLonEfEqQfwU7p=P4^Vna{-*w_{3Lo#K1%P%PW#7__W)!|)c5Ymv+lh70WXVZ2c&~4q zz*={)ugJ1rxz9k1=-t)NVoMTajMFKb%R_>cSNX&uJa)A;ls}|~uscweSg|BUrJlsJ zmo;aj3a-;C?6cO)YKEVvz+tmZrH=2Xhy=DsACGP(GxPYNIX z?#)dZZX;a43~JYqibZeI(N7vX*L)j=$^PkR(P=-Ox87;joZ4uLubgHVi2@V{G<+W{ zv}SBJ4s=*04e7$gtd&9$O}WOT`<09|uB>~Ha^8@MNUqy72Jm6K7^AnW#)(g&jvn4r zxQDTSEg1Kq{hc#ui=hkc^1N|6ouP((@b9K1rxF*Emg>MD?Fi!{qXvZMyKTp7jmvtb z7eBR8bFb?OC~Uk4lQCIMjvB=_3;`xFpqg_OKY6^FbDj6y?0Snno%@|1Pb`ib)XgMi zeC}sGhvSx`M_=5`V0s!kiiI@ye!*iq{%DJr5!r9|Wc9`0mu&feB75~qFk~2qS3Z>D z*?%t8livk?ye-k)yOL}UG=3O&yk>sJFnH}1gipXOmb(C1SfS-DCzo!;a`9dyFFeTP zh2152@?agr=LvbQ{<3_}za}5Hwq+~*p$t18iSP6^V$JtdMITJuL6K8EP6UJ{#87ddywbGD zB!fZD8U2lQ-%%nm^>Pwq2$Hl3h~1X3KL&jEe&?}QFpudT=J{q`do*(*OI4=2ZaiTC zI;u>ir7=Sa?z3AFCIM+ysm<{C-Q2nWqfV`P$RuYeb5wF?{Y8ZJ%+Fsi9_X8|^t>Zw~f=~^BqYB`mP z%qM|V#u>&EjQwQ8;iI#(`Oq{C_S4%p_ubC*c!-?_;_>-6&+X{O4MKT2d0d}nW+|id zKK*Or&+zHwH_gOF7H1PL*polS`An`8Ev?Ja3;%OTJAYpeTbHC>fvE1(RI@J6s+*>46bkxF5;YJBd8EO@LjIr}oZ) zP&_N|mS2)LBCSN3Jeb!835 zyAQA_8M{+YrX>qL0NB5pCh{-w-s}xat@F&lc&=udTwSW=&)b!%EtzYlvfj`DtSh}k zc{?|Mf@!~r3Q6FF26O5GWOuRM4&0}R$ua}BX6)32795U65Q@`UOKoZ`L+Rie0G5?a zgBg2tN!Nt%YjX|LQB{Z7tP)bN*h1r;g^Ek$h^^9P9BJi)DI|GKc3|>UU;T1*&1!^> zsaCNAk+Z~22mf+Jr7A1>wMj!kZDuQ@A=`7_`fsuA9T~8-*-HVwkxm>O-RQWv8C4&P zp$bRjnu}8EdaALm@>5#y#OVq-mmA*V@>C%sAFt zs-A;{F*4?!lth{Csxz320U=(YCdX(pubmi@Y6HRnzZds)c>q+oz^oHvZAJtcX;+!Yf8{f!z zkFCiD=J&auV5wnuZi2tQj>R*Vz z_8l0+`v9FslH|FTdc^18f&{R(K|H!`{0oD;gqz(Nz(sr;G1!k2x%?0ecBd^b9j?gJ z!wa(Gugg!0&&iMKuggsU%U1L~In3UZvi%SMduW-qWhNW`yzKi60NLB>j!a-JyLj(b z$h;7k9HemB0%&V88vJm;K7e6=qg~4r2nyefs0$p+d9436u-j_&K(;90kXm-=Hkq3)p!J@G-L(*4n$rFzAQMW|=&t?p(%sEAuL8*P0}huMq511Y;MM z)6(OR%@RR3n~mVhqBhWnJ!`dKiAXx&z2oO5Gw7^2Jl|6i z2~zvENh+#bBqlHgL0aGua2r}S$-3-ZXa83Bo6?Pa;8i5UX-I$xaQGgc{h|lkdQDW5 zy10YS_ngLS8Tw=S7wc*Zof|lP4l({1B2;i2``ZDS-r1?;!fGy0uBY-8Sn|zF_yI`Y zyW?bc$H@*{D^lX;O;w+oU7{$`pRz3F?2DW8 z+b7xjq{Yi8JznFEPDnl#UO8wu+vA|*L+9+3opm^Ki|k-|ZD6O`#kzxFz||r-?NY&0 zBIub&!_b2J!JJn?#fi_p$wZF50ZJ5Nz^MXl_=GdMs!}(N1ZhVt+Y@U9&@9F1qQ=Z~ z>_MDnKBgDM9AGe$xU>9$3^q33I;*p_!!TMinU|;y0EK|h4 z{tQbnMb=0h%3u*1*8nB;#A2DKTb-FWr^25h_4|cx;hls-3XL^bkyr)dY!^n$#AD%-cB_`F-)}eboUj zBUR7{tW^~lq!^f5l(2`aFbS)rJ#-TsyJ9o>@(|mWnkdCiHUzUI*0;f={T!3Bz$)XR z9+xbVHi?N!6y?`4874v%8E$_f8TMOLK_{K{$qWp~NsxB*T0%u34)x~2h7Aj^$w^t< z0#RW6)jH_J0N|odmClfnQyY#QhLUg(IKiOXoyp3k03{Z8Re44*+Wd;T*bj$Bi6|RM zP^33r%Xtqg3l{*u*>9H42c5|9cF}cAz2*C`&5we57ptHsV%3Kenvsq$(MVNv9sz;c z@*@u63ckHn%Vl`1pMZzvr6t_gYq5L)Z^%#Kn*MkP;}81+!I%C1j=cE+-jD8^^6cg3 zKFt6_l+U{Uy?rKwR-FwFG`xSH7LxFLYWHHwgqWGYBbKjXJU zXY!4i*i5wy4q2A*=%mkE8$ONSiVyz#F|5oo+Sz4#&g2)|plJ}E{A_fCLo$tqe@lICju)i3_YUkgs$E!t=? zL?6eSo8OX4Uy$C5{|U(8D_ZO?h{4tyccr@am*O{mjByKqg@sD}K$%htZoM`PS-K2t z#Gr0b))2G&&bG)h4BG1BNY=Mwxx7n|P35`rA{ftx+>@u}1NV8kU0;>0?iLvA2LKh& z0kAhob2}jbNitlLUU5zhcb)G9uh0+xSwN=0?qlpTaSERMe&4#j>BZs+4il}}e79H0 z*Yi@Y8_Mnm_Pqf^ zeAh;ZCiRutjVo4FB$nl{WF~+|9P4`=0pMb7(w=MAAnj_?3MC@Zie@8M36HZWMf(F8 zwm!!7?*mwd5(Tw$CT_(gnIda%JCZT;HX15hCZpB*2u^&#=n3TY!0R!|Ue#KRCj1r} zBP(UcYghE8(}`4+gSjOom~ow&>|x<-f*`|4Rh%eJQET2xg6&hShN$Y`Cg)qDgdo;^ zI%Ty0@+i^kbBxF8In+VnsZe=E7Z>WQ|xkjI! zl^4O2&WO{<;c{oim}euYgmBf6%?gZ0F8l^>X`%y>)+i3G!`M2NSFN>Yeg z>&4djtjh$ukkjtL%{__J5{}6wscVaBYFw32=dAWr zL9s5BxzgRM;^FvRlaj>bDXbGsW1PkyU}ZT5q?iY)C`AJjjmV;<^vBwp!+^`03yiXZ zy}4pETbCfr!LQBZlW?&v09(Vi#>=$H952&~Pt!0uStmQW7Z-qZ^3!kvx~K~~oab17 z(_XnIgL)CZ+5MPio=1)&)2#h$i<6LgePlT)o7nEh>4($V2A)5|w{xKJ7|cCx50i^K z=JVw8Yts4b{{sg0d2Q?FS1{h!--ny{&%|H&p~TrktOo!9$hKg_6U^qR)!)Lp83uC? zIMM}s?LI^-7H+q5k7K#Go5=OUmb?TO`}_dLvAQJp{WJ1b^kw-dc~%|+sP|j%!!3GC z>h_Li?z*hdU`Py5NsF#r7_Q512DkJO>^a|-7T$?<#9*(&P;SFeA2P$2Q#NLvY6ia7 z1j6?aC%%jcz;B6-vrT~84?3l6X6(X)^$s$Cnix0${8n*e`so&!?0D=b$Uceb?ad2d zcZ~1hou-IB{irTCpcN)3A!g|4V5Z1JR~rvd6oTa|>|yKTuCce$DhyPB0ti&YEnFra zOWl26%GE~_FZU(tRLWk-GE2lxaZr3V;%22hmhvBHyygZ6&V1`b8x5h{r+tsn4d0dtP%0#PSQ7E0@{Vl*~v$UmCV4k1m zZGckJrt%z>ozi&Zv|Yxb61a9Lh>^4RuG+#%vxTFG?FS?CGWjIfs?yxZYVQ-B1SKh5 z%WMFD!K@3;znxe$2y27~!+|iVU28t}>xo7RATFF_u|#>rYj0t7|8L?MY>x9b*u&UV zqA2_$>UvfpQ`)54Kg7K`go}RH>wN1xyf#-67Wv|`lNVM1s<_7=$9q2krLjr=n2%LzyP^+siM!ulyXoYpu*0H9?dSa6FyQ0d*z>n)exDe$Q-kQ_ zBqx5IPhH{3>z{2o%Y1Os$8Ce&yG184|CKx4(d?OKmp?1ZpZhOCT%HsUIpymYW6 z&-rsOh8uF*KP!I|y&>j2>lOzV8!my0l-yQvA5)>;pPNwIG!K!7p`9Io=i4%kKFHF@tnfXgk!{8&Gl z4k)BRwI$OrR2jfN8^GT*k469_#!&qlY{6SkscX8dc2&SW!Fd+tPyvIn#FP{*vG-N# zz6vjBCX+MKehn{a>^0V8B!XaG-N%i4TMA5M+(k@aHn6|t8Z5jv?P1(IzgugDZMAn` z5{T_(3N?xlq zli0NPEOXil>KZ$3D8Q_Dif%;+0Tf`S#Z8;=vm7j?G8yh$l?V5#wc*w5Zq_8H@DNb8 zaS!0!$BbWWk@}UGrJIE>{O~Wmy0^F(>MXYUIhQZiUVFpc6(t#2OR%&dmkVd?MFT)`8nB_N& zfiP#7FQn7Rti9O;2}_X=GiSZ%p}JpGOSLJI59eQxF0wJ1AS z-t?21i>1xqGY`d|cn0JDQqiV$`In^o+5bBT6MzIp$hX0kx^GLh@y8;o?_idH56@x? zqkNz(F$h>%0fPZSDPFSHE=cGS;;*Y)k*wfneLs_@4-uHRObrM6#@JN5gP{Ffa{x7d~oK#Ua_ zw;QsHunkeCGC;u_)dKkD=^?_Hl`w+3OJD=g9=cl9#@mR8o*Uqug%#hfye8>TZt)S^ z(%V1F^p-XyEd^bT3EaPj=W*p^@mqMK;qt2on!`^k;fjG(AMl-tOy$W{nW``GZ<9YR zO+QexiwF3%FV*_nl3#mUT2CH`zlv!&+`UO+60gGe=T2d9*Kz>Q0=Rv-0=H(Rb@O$c z>${h>THpd(Fw5B^gAi!D^172@& zh%?y3u`dF=FW~$@d2=w^xNUuc9l$oGzQ`W4k8y1FLtx+9mX&c4(wTXjt5?8j{C1a) z0>pm%cM->j+js?T=?mu~xq|&Zk9X)X0QU}JwhsWxo7iv@`#iuf-R!?B+n3*!>rY>j z*MIh`oV#>IZryrY9zTAhw%zR4Vn5(X_Vu*OToThD>ik0=yUc^~WMt%3TQ>=Hre3pz z39%N1txZBuOu4BFYjL)hdvp8n-%Ok2)#9W{>=^?H887Ftbj4`BY*_^mO-D?Tr9^q) zfeCBQoXIva9?R_H*uIfrZ7MNM+;Ecd&BD*Dp{-;(jc7j087D1G-@pLevjEl{$+?k- zVbLpY;Hv)_}> zuh~s@<(FmUrT>HUqi3ys8v<0mcTei&?_;+AE-deT7~um=+iQvWKIqSB!Kii*EODd< zfL&$$btjT@I{>hK#7hUMyaa%~KI}@bIxk!0HF-aJUEYdcl{<(j?xgp@Fh7tY{Rqc} zi#9zFqeD)8v>vYF2(IE@u`2DHF5!JJvjc5J-oiOvs`_{%+OiGcShS(v3)WU`8Y z>>dnqKP|Pkl&#q+x+QVWDFApqZ_86fTQ*^&ZA5~E@M$L>~mgMlA zW!5v@`U;$kcT3&ly zSBl%1kReQl>&QaakPM%xniI(fTl-aw@37Wv6ecU>!@l}MVi_mrs8f%OzcN1=YkVm> zF&uy`yHvXuAs~Ts2e?+XmJ{*wVSb?T?}T!co;h@-K9&?QRYw;w>rsLoC;-!)hK0Pnyd87{mIj{)KXK=k8;Et1BdMt&^vZz5=8_i%Ge>)l!gkf=2+zF}9H#&UCIrF1b>6LW-A8{lyv zQ;tUh0^VBus1DkOVGRi{s5 zy_2?@o*pb%*UMzXiv_DKnxZT|mu8*h(#z6&^*@omdmZ2!S-;QhK0J@#1*82DVxw?j zMq3!gyP9d>;37=nL+oHUcMsqy-ldxu1_g20Wq|AIZY&!Isayeoy#N;bEI_thuflD6 zSw2i&k`EAzz2EA{76A2t02_ZKW&BX`1To%F=h9IGciFq%Pi7cN<2 ztQ&AaUdOo(@xpDnp|VPs1AOsbT!y858bEuyXvs$a*&&mGy!9?kV2qdhEqMz2|4iMI zpQ^;6SD#`GFg)BvJXG$E?;*=ju3~I$oyYsa8rhFw{QH^(D`_3Hxnlz&&0sQ@sFu|z zP+87GS;snc*9YF-lX~@mM6bd{{2V3?d+?)uSgA`h0ke`dOlR7KN;Nvhm(?D$RI!Ob z?o{C4Yxzo{EQ^iVS*A18w^X}g z6VAZ;l}al{I>}*-T2&OiNyzegYM@w4)u{kjLld`PSE7R1)o}}>a>EQgTrh+30k(LA zm_2X6AtpG53W-FB(H29D4<3^&oj(-oV!K5GYZrR}=u%o*$Z8*I&Yi^jqBX+xq1S8I zaC<1x(AaNmE%l0l*BJC**Ghk~bvU(GoZRbC+{9^C@>4j@0bI&k*my5zX0w+8e9sSG z_?|>NS0%mv8L9tHB$xi{Qf}OQSMt0%hR>d~*p{bPb{eDU$QFMJbU8_aAcRQMcFweg zD^=w6fzLKet+CW578_YK)v}6%dqivQ3X1nTjbl{IG!!e*;X+1QRe|Snd^zK%lMGO^ z8C|XAL|QYe=ap*RohDzoEDR_a2}~RhYt7l)I>%LIHQCd_GaOFJ&-^XZKr534IE$-U z-NbpgaI|sL_33REB^}M~I|`pwGoUnio~M;ebW^{b4Mxwt#q_bqfB2&#+sXXD7o6(p z&LhOlFIbr9i)0l)*A8O2fS>2Vd7pqkuI<+4z+aGi?rHfTdO>a{S7jR$(gU#9Ve5{R zDO_YpAMVXUCI4uEhoBcJz%|M{lIG`R#joNV=%U<}3@o#QC;w!*ELXCgY{dgPaD9z8 zQgC4@2Y3!v$@0vh|E6I7U0LHoI+2e5wc3Esl&0g3YBcA}IwXFi|Ms zTV)KDZr>6k)>*~EPHMH%t#3xmSJFz5A%0sGFWTdi{nS!fH2(lEY4h`>VL#ryJ zlln??P|9FqnAKdDp~-t}>8jT1Gg0Zvvc918zHIqRMM%nAvdv#v!@W-_+kS~>@6=5;A`=@UHGq$fh>C#stmov9X!|y7T!2myjnnp!= z_k3O8F)N$~A?Kpyg5>JWSiq%wX=M!o`A+V zE1U{&{E;J{9WFm9M?P}D-0ZwHOkn)X{hLN+Is1aqx&-ig{eO>`tKX0EUn7!DDH8#7V(kqdwfj0F@2^woMl?fVIO?*2748`*0KQQ`ISw4Y+BasJe2E zb*z3(is+&|jGmBp-7|70dRiX90`6en{R|+RJb=Zc!uvo44S1m}m&-mD~JQO<@Nrd?823LqgTo< zOFVFSmxqab9zj-SE9W>)oo>T^7JBQ~VZ4XkTVN&@7gKF;YTz!xGQR%;$ZnhEu*zB~ zrD&RqxdALaQI#7{IjNXL0AvS(sMf?M74bj!Na|m?DegQN`I`Xa_iOf?*W@b4EqfTz^$(SJ$3`*#J;HPIw|+)Ece8KHBx|6 zbqW>5&=P0do?4kWZ)QfLSXy}w86a;POs0D2veYI9RB@s@7Qu%}WeUbT-y#b0&w-XT zU|xW+QH12OOa(4#xrDEnAl25kda>rMz@EbM&;sG9Fp0=;jjALi6rNy`liB)Y*%}nE zuClxotKdnDcq;oJJAiG`!g+xW)A7M1R1*fVYf+nRk6g{Uw-&szPiF_V-D$Bw24b=R z;aij#Jx5ovxu`GWF|M@X0m40hp?4^EyWfy!|KjuVFS<|4^@e@vV5 z4%38s<{p)E?_RUbye#CgM(#Awn<Yl%5>ToX5CN%N>u~YV_OeAUFk!Ju3@6{kn@s zr9XE4@w8+F`;A+E_GG<3VW0DkVojEpUi)9eVEmpPk25c3D1cqM=xwl?+ZbzbY88jd zGTQ~k;S1@)-PYc5suPjz5^S-bL;QfvuJ0yt36}4fGLuVi+pYLzydo=d7+sP(?yB60 zpOpu&WIKqU_FFd*Ck4R90N8{XrW}>E&br8EXfQoMIxaVG>`T%Cvn9*RhC8y3lf6-_2KafnFE8{nx!+&X zEZae3EiN6daji<_?QL@#^WD`cb=M>S1#=L9}Vn%k1b0=84W>~p3O8f zZCtw8wORm{puHvi&)<^P+CbuO;oZIA=_pXP%*5d89FFx26_4Pp`tZCIw^m`K0q*

B}MOTfs;%Bd7tev5IUMi;fjcO_(NOQv~*OErNQKqmoIY z%2t{jMK2$9ms#&iTL@RR42SBbrZ0@#p!)jop@J;dRErn4t4Ut z3?)^t@*5hqOOlSNPjxXy%81l*Qxo>8{t)v4E1zWOfc=PL${+4C+Zem#5AI*x7JDxM zg!Mxw+Wd*Ud6~d0+CERuVQB6EI)cc$(-4*?U?=-FnV@I0zK>7@w#oOs>|)qIgqxa@ zqX!!v9+Xm6qDbxg3MQPd{o1!>^}9p)Z+2dhb8qzJTz6G|_Ws+L6b_Dgv&R5?YAig# zXiPfI**=Y$;(&Ba?ATs8VciAJjo@IvmJR1?Wk z28LE0tDx;nj*)$18!pCFdiJz!GJ37@&GswdXex+NTe4Nt!p<+aca7^;>+!$EH1J5iH&P?7s1Q%)1;&9cp^EX`OgtI>detB{1fiU?6FU`oCS=J z+hUfz&kX0O-C$E-SMpNr3jtZV6W|BgiK|2_;s*TRQ1WZ7dak8#mm7;84;+=HuU zAniknt-v6`g7ol?clY38V;mODRlDg7FbmHUxqy-W6h{A5fWY}=3Hw?*vAsHf8i>=6j5`w zC+o0u>+zc005f_37j8}#C&pqg44#pHRGmjubqJQeDt~*pEYE?>T_h8ud$3%RJH?9J zMtt=Of^z%#;XBvP5Zm2vgZ+FEMDj%k?je|m-^cY7G2Gajs?-$4)^}QCpA?uNqEOOL z`;MCA3?bS@(fHwk)%uqoN_zt!_#M3W?^-r9mp)yf7w|s6#Qg#Mzx%AXn_rXku%q{# zy;N1o(X$H;_8C*qVi`cvRf{6gF2Lq4;>CN~u)xQKF=x^%hQ8`td)YExDr}X<&SROG z$(W@)D%_iCjVfc!Ugcnm5L&ME<#lvFlT|WnIk(!0iVX;2Q%zFQi^AAkD1{KSsm|ic z>R*jDZrKKyvvxJFITaXa{t1<+sBcWSHPMTc2`;rIYipu4Prqimua-Pk+H`>DT9U1^ zx2`6Vws74`xatAO3)aDjF&3O)M?(NI$3V_i7 zIg&17x4p#VHCeB_{@M@aZ~u8I|8n#5vi0H}xrSpsy!n>wZx2qeD978<>CF`Irq-W~ zR-N769bL%!LyT1=6|Cv7NQliEtF(k8u4xhr?6gyb;&Y2Z+DVR2)m+0x$W$IOOIfp* z4eAK6l_pKqp+kf5%{YiouvV`S8O4Yv!HJ(GT4%<=T1pa_>LgqBGS=>$`&bkX^+&h!)02o#V*o8)PQ&OId@}VM zOMKscBE7B&+zZxU<}@c;oE^x0yD}FFbfCB;v_VK z7_60Y!mT~Hhx-6m1hUqKOmgbTRSeooU|Z*84aV=h>>)<>v-k=5Fn&Sq$aUESbJ|TF z%P>Y9Hrd2+chovLX1X$Mvs49dFfmMP5#vh%t{r(&deySJ1;sxGD1tR3KD(Y?l%igf zyPy=?06o4-D+r>!0S0?Fe^!24GPxv@!?K5WZAHFV9x9`urF#qe{}}rmf@xodF~3U+ z1CVUd*nz3u`>1KEp(IU)7cjLwM7$5jOQVm#q6U_9MEb^9p9?@lWuer{P6z-g*cuzC zQ)Gcz!g6_A;ujHLdlNCr_l!YlA8NRW-P172Um)PJ zp_qJYqNPqO1yZ+aWKvAAYB!5A&RR=_3Qe}+@wC^yGtvF#9m^CLy@_RLt!<=?F9H}2 z3CfziU8@*FtW-qQ1s~%a2b^TZ)I(0KnY~zTuQnlJRSrFm^bF9GfStEeuT2ZQ$^|U} z97`#N_!r}+F51#+b@5#A9EV#77niypbv0A^krR;tg-PsMQtP##HMe*is(3~(LwwZ~ zqXaS5>aq4G(0;TvJrQ^>*mwX=9MwYBIb+L|I#ukW^!j}2hRtk>ik+~b{Ps3$Zs8$1 z@1%>d)?UUBjyFVHKKbHX^2WDw`Of37NOHNBrPfPw^PRWAgeP6c(+u|1R-v(z6C0g2 z(djI0@)9=@Z;aH1+XzgE#%HbS)rxq?G?`6jopGwbRwb-kkIuDHhpf4aU8pOqy(vZ| zVaqy5IFO~Z0GNdqW>ep$rAO0vj2CrdWkKel>2B-wg|k}RWCCIQ=v?H83waV?C%<9p zLMapOfJvZoAFr#hOOv#S&Ka#~1FE6ZIVNcQ}5Dmf^G#`YmA(BDk^#YufgX2}?0t@RVF+f>zQh zw2dd9Bdt)Ss!IeC_}bK+orQYfS_L|I4NSPwOb=!r6SM(P6_d;A4#1r@qmN@`7Lz9E zF+7~xHSwIacP+DrE3$p-QR}UU*z6PIt3Y=O`m2k#2&IcSpM2nTQc#R0l&Kno$oe3d zzASzz+h`!W7=~Ji3{g7@iy+}rq|9s1ln>3;S&NaCQn7bk;)Lw ztY&eo*7DMz&8F1Iz7R0{DLZLwV^h&&%7Z7=zCa z;1l|+-1zA`vNvM1V}PACAIF;oH_1nSAppxIG0thZzgje2vH?Joo@8#>xZ!Jb2hpXW zr8AMnL@H?#2~4^o53~IaK(KQN zum$q;0I=ua+Py$GG2(NV;KDtRDSwK9)&W@69e-Kf#P{S0d5HMzHpcitw25%vBcZT< z9q%Kihj*lHTHSR?={>$fQ~_Vcdj@9aE=vco*A+jImEsl#@OGHxt%4D+Ajaxshd`2~ za-e4)*`bFJ4@X2_Bn3SC47wCbUvc)qhY&H?27=eE?K z`#13|V%lUn1;Oq)uKr4();n3BwP72u%SIn4oVfA(AcDEr+Y1LiRd=hn)w1A zhFGa~4baz^G468-psmwd8LZ=vYAE&*_e9Jyhlh-eO0%hRJf|gX&rJ1)O@g-45Lv9feQPtrI!%`;<6Re2xlx$qUtm5ECrzaxP#tPa14Yxz%r^*G$ra^eP!{~ep&NszTn-f0LMO%_Kt z*XU{EhOK=)al;x`T8{p1_7N*PKWg&lC1oA=*Ky0Sz&C+wi}vWI&iEIxoDN)PCmxf_ z-1>7r{l}!&_yi0deaBeg>SzD^lDB>v#_62tQPb{$uQ~Yu%mwkh`aam>BN*FVxX=aw zB`_t-y0sp*06+~Yu-QoCPQ4re3uAdHM+_EmL6*eysKD-4+b-0IE)dN^8SRepH zfxy{gymOEE4pp(7JG?Ak9Bi=3seGrpCA&n|M&*L+vh&M*OY_(CN48$I#g`?|D0d_uB~KT{<*$`e{B$!qOE z;!RSO^{r`CYuA~`St&_Xuo=O=lwG((;bluO;i$7!fE}(KlM_e3XRVD=!PZO7*vTvN zx6vv^9zz= zB^G)kPJu<|C75PA(lVnYvWBs=g?t}1p;X(}g%QoH=9JYM*56yRi*;V#wO+SOE{hCw zsd8nVw^{Vs(o=-PSuJInwKd64`=4Q44xvXARHkm_J4SqGsw zdJp&_E?EsUW8!pK)2+{JWY*Hkvaxg4|5O**-G`xc*yCN#Q&g~pGeK}T`%K0lrnzF8 z#Vlg#y4KL3LiB{CLEM(fQ6Aoo;cXo1Rb2mP2a??Tfh6z$d(wa6BLHwqp1u>w2m5~= zTC08nWOQYR@|?IS>G9JBw+zFx`Gl@xyAzGfp@j4)39Sa^B`b~1_-xYmSZE^bZ<2gX zqLiEYS7am%=|+1P--Fo_qRIMK7w$=YMtJk5{d97G_!Hqq&bpipl1~QOg+eZi0CvGH zPY1B}oYQB&B=Pcp2QMUy6b+3M3qGOy`1u&1_7LMA?lTy}6qYk9$zn^e*IHeyT>#ip zkw^!18i6ElviPh&y_8(UG_#@l0!`OKZ5J>VRi)|dtNrPSo(;Y4Wfrq#1BBc z5M#_>z*95)noSHhT)9Vv0~QMqjfz#tqU+LzTX?B_EUW&O#KU`{O73Js^(Mj6susibI#Hf>}Q3gJ<*Ofp+DCx z<=`gVuzdoL*L+}Hq72T%NDNtj2{2^)IWi*x7jq{f6Va!;UHiM&R<|h%2$kvRu7Mdn z57+9CD!bL8G^ltQ@55I!$$s!_(!L9Jwf-%Y>#Lc?U0D`wtS(~MaqNrP-I#X3J&bsr z6Kyr6qEf>GgsDo^>4soxq=XcisKX>7(lQt= z;VRhQ)QSS*ET_1-$;q-w0SQ2ns7JKbUtknEIXc+5=EJZ68YJT~Mf)VL>K*$&Mz9v6Y|3lbO(@9TJ>Qj54}{;Vw>T zRGG}Z?zM|g(y}0)v1mL0lTWV4k z&atnLN`|k4mw)D=EZw~$hmW7;Mv`7DWFx;UcW-_439OnM8IE6+n|Rbu*5GRlR!)hM#;F4a zyM&)rfY-S)mGdxQYmUN(a33P}wFwsWK(5M8bw#!Ty3Cp##ygS&WGfi4x;n6|S0=Tj z-bV6XqV8)p6OYOz7$wAG5v=SGSgJkgxEna9hoUK+1R$VQXRs%i0q7K#xbE-B?ZJEU zZVdxO0hpLdMXa2?f{O%;WGs#iakV9zQ+Fm~lB?N){D7|FReDda$e{l%0a=%}x0193 zZo&9PK+IdO;JAo21Mn#~sl+g=wHLIOJz1+P^;$_~?{CT=B{gwh+Y`5mDf`<1t8H&t z-0Lv%zmiJv-PdK~&N5t%Kb3x2*yP)rgdy20-NDQqUWcLBfF0T>DWp+K8}9FvfP-TX za56dE!J7cbhlr6L;#>yq99TBu+0i9{SqwwYZa`b=p{QW-GfWbyPHFC6=69&P(z2G_ zs8l0;Yy^b7RFGs?Iigqv?K0Jwm>>iYOw{%1w4uA&%aI4n##dg9n}%qeEL_kvkT|Ms zZ0a${&J(kN1XxW)p_m6JBDIC_w9z~VbnYyGr~1W=XSS{79@uJLZsY!iq%XSRlVtSX z41ru7t&su+kM4gxH0oT|9rr*_YMnB7Qqk1v4f{X+reS;;>YWs#*GDiPXyeNxK+j?J^my zZyDPydJr%<^B?14t{2i>`L;w`|0_(aHYHw73D&^P81p7=^>oWw z0MF`gottGVjcfuF)(D zMLA*`n*P_1x$GLl~f^VZ1L0i}uwcr}B7j!}z@eLv*67bVR*1?8ZueyfOxdcm7!Eo&(-gO7S_qcUM9^>DA4E{lK z2uAo2j0>^Y#4=@RsiKgLOM!uc9a`XeWY%c~w``OzHW2R$tDq;XS+$!+vK=wQltuQ?GaxW2y&(y!QfPdJLd}=^*~;$qp;VJi(ITW@NUn z328VLS1`#_Oc+?Ia~0S6N3bQ^mSM|^pZqnj?A=$S^YP~pU;Aqrl(05hniT8%PTg{z zM-TUR1NZ-F?CvU9Sc{Cbh_#Nm8AxkHG0bFEVZnQtz&uW4OmNzWf48+y5}f)f%E89# zC7Y$klwv&8hUsk8=V{65wl67K(bc3Wf@%_6#hTohP~5@Wb<(Zr0_p_~UsaCOze5v* zB$Pw)5i_9(vCsm?(at?ds2^plnVvpxuJxSf<`swa9?^V8LDq+|j107q4JQ~E8h2&c zjcU5H!2>4)YYK8~P2|XgYpd%PZ~Li&;15-}c$^~dN{LBH#fy!*s-VUGYMk5*i+$W1 zYkZ&dOKqLU$&-)6buqS@Tjnq)Xf%W=Vzh&n_E8X>$09ykb{LNbCQ$bptd^=#b*Qf; zFt|8~S+I__3>XqJlX+`-e^?&m2<~@b`JVuJyYNUlJ3~1fQsQ%4isg=6xcqs!zx!vJ zJhpi8GHqlgY{aL&Oz$EeZNdCb!5K zkSYzcy_ASHK;}9Mtj_7WLtiWFO*E6aP!^p8CyOQH#bUr_DNcz(t-XxJ=uD4b&eZRX zs*;;wuw!HIM>oMQU{SL`cN8dOa&H0r{gK-~1C>*YljDGIfzXAMQ-kYCwYYMo^Z8_J zPT$<|c60Y|%x+J|+cAEgd|j5aFU#KW9E{(p?o(&_DO|Vp`&zEkDz~HyS8)vRi{Z7& zFs<&wpVt96^}rN66>CdlVS?;AfX4|YzHC@%#iaGuFfB_cT~iPUdtDhv+ytRAvMSfY*R)qTr<;WqZM%JBoh zowC*_BuU2MO;f!djzo(3Yr|(G&+i_a0S zjZ`zlL@(H5*0F*P|B^Tdu``qK42n@@h^RzNo`Mr6qFd-37&hLCKIKY*&^|^SdF`rP zzI;jUetb_(UMB3%F92a1c09T3r1>S*e7y>wXW5RbM=U-xaF4Z|$5H_D2?J;Ov}H+^ zk`_Q&J6Z}mmAK%4Zdwdf6PL%?QlUjb4GjyzhrW?Ktfi52Y}&p1z)($vCd|r0cOE}; z^Nwpa?&p2r0)REUn03X9j2QfJ#(k1?`nlgn;*Wu6zwon(6Ple(%mLVWZs4;>CY}w7 zn=MZB%`6x7vt?@IW$MGzc>}Bm@I<0oyDb|}{e3y`=R~tLSOTK)s$IO$@4-IZf}z?1 zh?+KW3&ypLby@(}42G)>R)bI_+{Brzz~FCyk!;|5{;cA60&D~Z%Q){4%<>W9fje+X zAEawq`jW#slsHxe>*C`>EhnMOpifQQz*E)_R)tO3Bh@JeqX1NNz=*SQ4*-8pdg(*N zMCn8uz?BD}#Tt*uWw7rYR{R41(1$R#hnUDRBQ;`K3qWHCH#XhUS+b&WNj3ghw}b1r zh#2ujFw;K(@F$nyl0LUAA3nUPN<~cY;XN)gxLseuJ$UOmoZ~rw>3vO*F=Z-0wo{RT zgNrj|S`xBds|&D<%Z0SQ}pzIy6tMdS^D*%COIF}_D;ue5s1=rR? z)OY%N3Q)86XPzz`@c1&e1OUx>;ZcF7JIYBDn zvduc6o(wJ2Z7n5JxlHZYo@m0Bw!nq^KVz35y7HN9O^s`SEg3%J(k%6^5U&-2D9d{~ zCO*LqKM}&?RMupsF&n;9;DTjh^`VBqIRvy`Oy6z35(9OFXk0k9ehk(rNwe`N9s+NQ zdqJxGo@70EYub1(FFdPl^76xSjva9m_9R%;QyaLmMq-cJ&Lj@b+H$J+#8zv1wJMk7 z?4QB+%3QXDU8dJ_#=!)V0n@-mwC}7HW;3p9dARiLb3PV(7h;psypSqSldfLfhknw; zYVF(9S+TzM0t&UVGPS3pCb)4YFNDY7r#IK4%t^`_1B0LQ>Fk>R$X4MnBBAi;tV_7I zne%E~+H=oi&Lm+T^v(mf(?hYGdClo_m;g?9+-^??uv})RTfGdr5X!juz9;vWwUe;;?Q(UPq)ZVSh9woQ%Y*Coa-vyUB%f=Uf_ zu#}VIg~mS8hQq9{71g;WNLFj!vXH4<8Cjf`f))hqdf8ce!IoD>O~*hDcXNV?6B|tB z6#M1lbE2+lmLrq(<{9vZTHA1$cR`scap^1eUj|~do|N^akLBLs$8+q65C1j{>U7H| zO>~-Fl1O8njDrrR%vocwRGN~!5;rnq?HCP}H}MDx^lPG%NXVqKCdETHn3_14)M7kx z?&jiWIE^3GnCi(=nvD`*A?Yaz(TUt^h3aVArfg=C+|3%|BWg}lVAU{bW6;Iqjwa4- za<7q|!D2Q#J%Lz!UbD+lC>gs{-GaK;g>GVh+=~^%nIC-8vxiVF!EOcvTI;XP65^@Tk48*n6f*>d)Y^oaZyV0 zX*L8iImzHC*9Sn4hih=@tx5|9t>w32(6#{nutwy3tmT9?jo>YM0PDH~6dizRCzXjP zm`DnOF7&Oz1v>zUWU=*1je;9;6^FeHe(&yGZ$T)~dXK(*Gda_rb7-(2PRowJszQcz92DcO;Mwe*=-&2zz!TQF>l zVQNuQt1ZL9fyzuq6`R}RTHsRVT#(P$Yk5+w44QTMK2OzSN7l^=7`-PP6BNZ@|Jhpe zWipM)YULxwS&3~JLZuWUOKQr)RQIX+dm2B(Ia0Hlc{U2#Dc-?tI=Qjng6j<#^EDSb@8U85IK3L-xy90dcnQ%Ba8 zFUbAPTh_by$TGH7r(v<57Qk{zR4OrMp?Z^WGzP6S<_xGdHwfozOb*b^8YggVu4GNR zv3@?o5m@`Fh+8S+x>}2Cq?!m&*0ZvRmW>?IhfrC)oD~N-)k>u}_OPyGviX3>SkYs+{&jcE1w~?7GY~M$F!}>XfzX8$XnBgL5IQr=%luUI02_Kzwyvg$)gZs&F zcXq&?e{{ES??>sipPX2_nbl8yzm9&#U9GV%v!h!nccXA7rI+hX$kJgr~}t=3>R@55ZaXsa9>i<`w%YU0XXhqydhg~ z6YsloGQd0IS(6#>tMQJa9TlBWD@^YL*k{b%R{+|Io*5!wAJD?A;{39{A1$!!7UE6` zfY!5CqM~|HE=4_5u>j40FZwDoR2McWW#82lOt7WR(Gk=EsHC7249Y}cF>So*s~F^8 z#7*DDMB~=dmR#%}O1ilsOZPt12_|hXZDYlDXV1VUeE*k((muX^h~v26zr+NbAc6xY zkx45ONH`6SVd#7dZ`TXB_78Cn*ne~hKX1euCvLy>w?L)el6+XIe~~)qx{ulthNy*O zjo@Qx7qONRZDP+mpnQjHqX14ovA;%nLKkKXkxeqm5DS3eVQtabYakCOTESupjE$CKD59ZA7BH()OQJY;vW!Zyghmm{_GL#bQ#8 z-YN4X(3bho$Ob!~aWW=W?N4D2&-RE^qw*$aN%q{LC$KT7rOgS{J8OZzE;H1l^blR`kBG)6nxc$LpBLyq!tB zdkNREYWY8rjYpQlm4i$!Uwlz+-+B+8on4tSNPhay(=1JR^3z!K_A)U^V-&uUvBQ{b zl7juYiAU(DHeti2a3)a(!0r}pyNGcm!LzhM|a{w!B8kxhQ- zIe6~A0OK2JsDiFAF0rF7(9iI4Zh}M{;CbvzRue8OxTO%AWXXsoI)VMbI4$F8(lxvU zklKLtSkc_hR1FouJ95hafS&C6b&SOg82qj#|1e(aX^gbdcda##D$U0+&px1FXAuHU zJ}1rSVLx!u`3stW!UUlNOsZ2o#JK{XLw6Z6*%TJ34VPyM7k0|`!BbYCl0DD?me}c} zRR^HGhb2H@ke7&EW-7;c3Ew?~Yx{?ALsRMLa|l&``~CY;?Av(Pv>wiFpN0_}u1mE2 zf-spnHn=N#hOYhbtEt272&Zs6wyT<4#EUZO7RGYhLi zK#V%(#Gs5!wv>;Y9m0dxrlyKiY%&a*YDpFr;+&eH>X>k;?lUb}Vr3!AX~={I0J;OX z)*sJf#i z35pcG(6rc6(Z;i zru0q$SuD8>KPs2V7&q-LSS(%JoMmNE$Ycg>jKM-(-$HrZoMl*@VDOq_D*@+y3$d9f z^n+zURnL8xn;qmTaK&nNLyY4wj-Be9Bd_T9iDl5qN8pb#=#%h-+jDlG$nQhiFXyK%Ua^AjetcM=*_6E@68SM8KJR$F$ zL(KI>cp)xf9KEk{lJpF*^&qpR5AdA3mlE0gC>VlKnaISw_*cwgxg<$wD;IkSsZQ38 ziR>}=){vb-6IsYT&ctNCv^kbDH!y?n+GJg!kFg-92~z}E@u97NGg(4vkkU2H?VPij z-fXP0p!!r*k4kn_Q!26qfIeMh>Uth24j*gooBOQed2;QM)Q8N$f$21-;~1mNoJDoa zy2Zk68x7@YI(LK>Hvl`~K3+JvnA-ayF!U=K08Jjx=$v@W3xW{XdrB zkfQOc7(W-(m_+J<`v`x30APK9`@N4b$c`k1#+kZcS6u*C2h;l=+{G(ot`y^k>uMbo z>l}b_1z@#IRVHlF2fN+JN!bOg4OwEPM6|rxkRawnC9;;aicF%DvnU%_M;$RS3rZ;_ zRzImRQihmQljqa>&5$*LwrSCqwD63F;oODTYZ=FFJlnd+tV>Y33~+xeeJ1Hun;QFN zhI2J=n$V|W8e(i*dz0s;hpa{mz{yZIby5y`u4#t&!@Lc z?D?4Q)rrNM)6yFe2X*15cWbRf$O_Z7uc5Q%0L(CB7o4FoU(I|{(2NxPtaY6g@t9wo z>@}~85e&HobfZ+=4kBaSUz53J?O?9|>Z|IknS333%$7kfG?H<7j-R=>=DRsON=8O` z(p5R>la;eU$n2Wa+fIXpDqhXms+{>`p5Vmn9*-L{XF30~L-A=@?DUz8pm6fqX8%3) zer0N(&F0yq7vSc76*KJ(7}u*9Gi|LojN!U%r|-kNatmV!zXKp5Kw}%@5+NUr|Fr=a zbjJ0Dg(^9nk68!X0-H_X^-SPWX1UIi>;eoc7`Cl+m5xXl=L?vS_F(i1ZOInJh+p{w z6_1E0?N?PQHo&q57JF72CIOHExc#t&^8-l1a3y_?{XX2q_hG#D;m#hYzs6EUy(ZCY zz#>w8ZlC=(@i&cXg>ye}EiHpfD7#p;0lt~~d-y4EQ(k~EeF;?Nzi{tK(Yhy}JB;K{ z4}T_M9;_398b&XF36o&NwtBa|27pMk(YQC4QeZ);{cuCD!l*Esq!N3*zNF8<^YvYT zKD98wLdwgaFMsk?Ntf?q;%%+)NZ097RY8d=(#f;hgqS6-g}M{()QV2@t1a}B$J z40Ixsh15)6cs&?vjajQaRF`U$8pTYL*y{3m%1Nv&x2jA!vcR<_ye}*gEh(j$Y4%T~ zP2!y?K+x6ht?DDfeWLa?-A!yefzJZ(u?Mkj?I4Quheg zd}z&7aJ@0ci7#5xMVLcwd6_iuXTjD_%S9|QHfxDC6IMXeM=wod_9oUDhhDH+FB@Bn zI_egOB*O^~YDG7k7MH<2tAjuX4QpmIO`giVsJF~+A#>JU1iX`+y^&m-u3w#)0Qi|5 zyV+weTKq2vV9&Dl?6fDibG=Mw6HfuGKXxzkjxo6_&fc$F`+eCh*-iuo0dYVkJGBtA z$^6HN!(#UB_b}6kaRdwOff00YGR(o~IRa@6rV8c?BTh9Z0_-`Ar7kQ$kA?_Nf~C!BmAX#N6YzEQCyS(}>3xfTIx?tWyUggVH^Mc7{z!HBb%5G*z> zdSIM@%=$5m3^R(Y8M#)2d$wvb4?v6c0B`~K)cs{CcnLuQuGSW=Idhx(QRP2UeE;R#g7lEnR*XrM3vmj?l)uV(-QRebx zbGAyIT6msdR3ubPsM-hHxq*0OC!u_$lQm3Ap1=-XR_)(NYgY?=e#nwQY`^P5l?PqW z*k&&>X+dTl#W(;3AbNV{R=4U4)Avhq7VW?lpB&n>N_N!mN}&nPyHW~E;M}X4`tBi4%sOLsHKW@aaeqe;W#d6 z)cMX2D<1E@o&L9x#&EL$JF#=!-^5N&5}r8OkvzHXS(nB8oIlkF>rc4mr^<_(-_L#` zGdr;Vb}zjO0R22%s=2-F7^60cXHp9QR`%d3W-&XQypHYbN?BrUC5#XioqAY*6%1k( zv-lOVSQwrz+r07h$4gwn4R?T-8eCKM;uYD;GcZbwRhH&>3jS9({tn!xyI>Ol+Y+o+ z^@0zjZuixdtTKGqN1?T`%qWJD0KhW;Ax(#1v0I3_9wPol4^Jrr#1wn6O&nRWwuMPR zubpa7(mmGdytmvCNp+&y_a`I!vck7OTo;r`7J zG@DaBD~z83wTE9sOmA>rl6$`b;7>HE$g%TE6+{?7HA*JOWU-colv=XG0!XmD4DbFm z7}>qjYBgU4iv`n0kl?MQ;*s2mJ$^qANLa~B`wxrZV1D0WEX^1l!nhL;Euw=x&esOU#M#Q5B6_Nmlt|kH)-5Jc zM%tHpfG_(|OZl!^Ic@_)Ehsg}3}ePXwR{BQfD!KY3f5T{(r?Fhdp!4&&F|?_-og5Z znhDOj-&%$LYfjGqHib?Oq_kWS74h(q>Jc;GoU|%UU>g?ZEnuwE73>AOg=>NHpZ6K# z%9Tl&9K|Xyk+cY&mO-o*5@U>U-@>OVctH?n$RbHoZ9z!pAN#IN^CJodVV@C2hg&L? zlFDwd{Ft1yE&RZVD;57qvSPhUu}&U&Ej9bv@>gmvRTYfrZ8_G-Xo<+*3{@ zxoN~0G;ZT?-wYj{0};S=@EC9DUQc%VYjVGTMGl8=;68r=#Q151A2HdfKZJ+s15GM) znlQI4t@wfz1E3IM{*MRsWIBggiBFH5o_d+Yqa+InM1?X&OF}ZY@fchPX}Ok;*ZP1m zXM);{!zRjfy?)PZZq~b%t_rrZ91(W%&`7J`oLFyKD}}N8YeN+i$+lD{8V@pH7a+*A zkR$DP+lUS{jiAQM*x+h&;{aA;COXkOc5L^jc%PqTN3wVpk#ce1?pw`KouRo$x&2GCjhA=tqV z0BjS+7yt$rQx7h+HjE!NiF+_;WVEaJSpsk{9@_zktihezg;DKLCl|(x?%lq0RaI%H z>e11R@!ytp7{Dh7Juu+5bO3Tm9jR#jAnnV3vMrC7w&ZT_mfX!hl81wj5t=J>w(h9R z1Or$xJ_~ljSY=v01hKl0cVHg?mup8F0>Cf{$uBg*U`hwM3Cs85j{37RcUM*T^E zSFN?48b@a9Hf^P5?0( z>f+ZLO)|NTR$)-Gk(^8l#MskIRG2VTrj%K?hgw!uV_c-HJA&(2fm!3xx!xBFK=8aA ze=y-|#m;J;@psACBLlcup(LbMx4YLwAs4k&d5WN0sTx1s!JN?4nk1I8wH{s1m{=6r zqSR^S26c{ORqbc80`^H)Zfa$jb!wpp$}%SOI&eb6y4bW-Ag5k3$1nM3lu(MYZ*&Lm zOaXIJg%-HBy&yn ztJg99U&1q33yoY5esQ;Pzu{>}>6WKPHDc%adBm3)b{S|B2NOpRcKnn8`)RY-$u*NY zI9qKqtBrabhV<^OXvo(9$mXd{rQLyR_8RT!WbUrW9Om)^@FtJtXxjWp4alptf8DGmZFhX~B8o_{o z1yuo*-MA|8gRg09QIniv8P8ZtYh&kGdI#4uOZH+d z-K(_6YPAX`->y};r+N~MWDgUETfZXy;@iq#sf1K8j+kM3g8iov>yfRTDbYiiY%7UT zl3F0es{&K3iDP~#QJp=)bd^|$D6dSH-lED=7nr5|~9h z{G|GQDbo$+w2z__EeUXL@d?Zkxzyc;jS^>*D8Z-y8uUf5Oh^ zE~i`hY!G~=6PUa1Q4x^IU7vmb&D3Rb%L|u&2gZpn7>sGT3Wh_YDcW5pi|>MsKE~e% z(kX|C!R7!ZxQbZ^P9O0Cy0^7WlQym zwZ~YwfqysP#!lrUfYi6-Be@xU2-f#V&Q;5@8U2-{ck$-rR&!cYD*2ZH77yVj{>g9S zT-J43%X$xeB}i3yTh(xzHVH`6U zdawRn*QzuNw*}B<4iIDE%RW-ptn76NP{M4TEbWjEV3vO{x1%&=qO7*bFjI{(zVO;G z-fB!4w;nRvm6HboaYFW7DFD+Z)T!yN*D(G}N@5>t7Y{Vk*Q>byK$>g}Uq?-cO=W~7 z6|U-7r3pFkv?+aTE$_5xyJoOsLdJwATx$Y`r{1*KlERAIYsPNH7%W`-RL^q`V>M1x zxPlqHY*Cc)pO_wwE@H^%6oj1vgQaV~Z?H zq&c4|{Ld1g;-FnzDxmQy*layzAlrpx9UpRcohcGgT}JyvvgtAd^Um4`6P$-qPGE*M zl2T^dWG>GN=^I0>75;6eSx8g4YVW$aQk*J4HR2M+oSU62@8g=~~#G9;D6&us`R%8WuYVuv5Q((zBUqW!P!U#ihR`kM`GfyznQZ zAqP;jKx*9UCfv}U;!JR?dDReS%p#DgR#x4 z3-EJ2A)UPqi3Z=7H|76_pB*sQ$D&5aI^N+yL+mt_Wn9NLF1ABM&$>Y{ zjf`qIm=JVWgHbP8Uoi)RESIFpE>IUpZnP`;F(cGbY+QzlFj;`1UBOou0H$jLC)@o<9t|_N4ihjEOwtFY z30+bXo%P3z{Z?&_%d)mprC?k~lXy;Y>=$ zh7%_8G5K#2!enJ|*_l3}w%^QI)9J!Q9}|4WTO(sllqzIWQwH!fYGU~<6qryj<(@OL z*d1%|o^+IDmKta8=>8KTWE86eA>{(2cn`q6W#v(nW<>ZP*IwUr)27-6PXWdmbJai? z6MTUNO7{ldoyIaJ%S<|58#|T zv86?EqQS(qih>d;6Y(g>(zR<%LpTB6pQOEp;~|DzpU0#%)5%i8(jpS4#OkbRuho-+ zdqH?ioY6bA^NfKLgDOtMSYCHWRnRbl0}K8l#?ob+*E=}>hj=y@v7_ez!qqiyx z7NF>-T@O3Pg6Z{=$&wOftUA!@k>CWgftjRD_YhfPq!aInW^>_!imK48Hj`W|M;15{ zHvzE{09H5D!7jnQ)0E_t;XIN6z}6~#?674Fm{Vaj1YtjFbmv~bpZKp#8~U)+a(b@j zXE&Dl06TdY{zOOCnAzhZ5IV#8oRtrremU)4{o+sDyf04PZ<7-+x#7I6)}Hv9)cc@h zeofVQw4_99MfYG3wj^_p0hoJWsYAqI;VOn9B70?;$129_3f!Mv%$j=%n*)HMfdNEC zf|r>s!!C*+T$Xb?7ZFeTru7f-ZaV5L^AJhCLW8 z`O}2tYb{>901@Vn87;Y#a(#_V|lyWmfP(Q0IYYV)dDLy*BAHE2gME0q+icd_A5 zU($6efV!0i#wxp5MXWN&)eF$Yc`Ut)-_jPC3I_7?Uwe86?Vu; z5ZBafZ3{uLDSTO^)~FoDJc}(p8pAWd#^rP)GpvMJl@{O9UQ`9#@nmGtp_Y~?FflgD z`qVfyoG)3DQ&~QT)~ePj`oWA^-jhtpJhg;tdvEF5rI<--vFlzd(~=_Yi}7Krk+%3R zCo2kq@LG_q#i>$voWC`IuQZO>QAxwNZB5_V7q?=)Y6}kUHfvYA3S_E}j2Q87m}uEg z>CKAAEd%g`F8yRMdWM`;QCC{~)z-{<9;(-)_ROAUEw3r`t2Cs#?M+*nHNo^gGI=ji z)w0qUG+phWXm!KVHAGiw5^PMC96i#kX|nfS{A4XsDwY6cnvm#RPbX~^o>{>j$(STY zY%j~{n!95FR>ezSCSS+6uXJo4H3nzW5^>~(D7zOt%)5Ce=qmUi! zf?Ln#OfIm}aUU9!nD7CB$Hp^h+UF?;NCLoCqevgCcv*ARtiM=A*dOze-44Ha&8ej^ z_EYRB{L~AM>}LKxevR;#TMXfo>-jmq|6%}k{&J>conrDZJI832`p8;yCKE6)&$XX} zYjzF4wlQwkHM6t@L(r-bgH0X_r6PKC5mSp;Qf<86#ngIP1quMNc-hwgR!q|2gwo}V zvywGjmHk0SuIwzyR`LIrKbCg^m@EM8>!EEd+ndv514JPYy$(}WlX_tx#DSRNZ7P2y z|3udOH{^@^e^1uipO+_hugHI}^S9(rF81YzV4qCGEWx;QD)~h0AOnL|)PXrU*#~9F zV0@j*JFZFL&V#93kR7;sAHbuu14FnS-;_fbp#D zfAcAcKl&{I!>Yw%V{`k`W@}Xk-fPB=JsB6XTZ;n~d!VQcJG4Y#v7X`*WK08m_I>Q< z(O1A?Kh}u?Rf1|5?3yjtT4cbr^blJ;&v@LXm;1ZtWUsu0c=xkXcGsm`fnjey06~9G z%J!zXbxf361j~VnHq`9cGi2$8(>i@JAG((du%~R;l>tB}$^jgCOOwj#Vg(Ex=YXG5 zyVCSSWIU66803pVTeZMjtU;;Kvepp=rP-VO~PJ{23gONDRWF#h9 ztCoOGv#bw$qLY!FlO$>eBti0&9mEQ2Q(lviQ z?9x@uUbU%7b5g(ADLZARxmSfIW*t{qrTW4anTfPqN3Cpv@7gQ+mNAA*$x2Q@RMHlc ztxl^};s094E}vUpeUGZ;Tv!}f=NRlFMP`avXquKfMvJo2GNFi>+}`w@Dd1uyPKcFP z)^}JnyBUq3q9Dc{-P@dGWQ-Ym%7Q+UjpRqL_j~XPy(WX!iWKYLkzw!KlB{mw8DmTw z;yvBN`Q>W>*%##fe1F>Rd5$hRhFVDt9 zQOo$MZMtZ%YqB~`+_;v;@5<3&)5l$PChsDe`w!&u;Cu4R<==<3Y{~CE_}Aqe;+cO| z|33jR00w5CMpkRCO#-xGc}q2mBLHlTbIjo$8^qUD5M!_I$u^AtL3Bs@*)1?1xUyT< zG3)=YMSfOl7Ze)m@;Mmj*AVag$BecN_EOc7A~3*ZP@fC^LJsd{^02=m z`~4SXxby`MU~ zpp~T-zou(FBCFjr#!a<8^^Ws-+PfI>Soyja@b|q3-sVcGlw{b_^ zz+~nu@uEI=8g=#a3irG~NQU~>Nz}nEhnh4+1{;&T;u<{vb8%sAT-Wi`P zyG>M@xoCP%M4CGE?ChhlR5xLrdhjSPXMSkZuByqJB1C-!==WqI_Esyucf%`nGhEds4(#CA#(x#J!2hFO4L^x8;j4g4Zud{8wL6>BMMw6)*H&Xd9{ehN`#kMEZQFdCLHLb8nKh6XcR4*JkEPmWPTG zs|n6D?pbP#)w66!MIW%jptg)_S7_;Cgt+%|V$zX1s_<_+=9n_Upvo{+-Plf9Y^`j- zvHmtOB?3wgQr@;=b}tj=*zY@zLL!bc4NE0WwK2<_5|oKHH=s37`hCr)R);2=)GEs@ zY!l`luvnQdd&VMHOkSLIUZ?JKTvN5G(#&RNRI{Y2Vsm-?ZWEYPy9rs1@G3$%PTxU- z@IbE1Lw8B`*J}KHN2;g4A@wu&#C7|c$*z8*l;;=g1i}sQo^L-;&Ey-W0NGDF)yd8I zZSs>uYf_~et1shXGRWz3@H@BO$l{KYJj2yXrH5ZX0n}%!1**9AHfMS>z9fcu?$t zae4XY^_x1{Y`ipstob(yXK0cv7S`apt?;HaJ(`;lXBon^u9xcQ-Ip!-G2*qm{-J!m z{~t-ca!bDS@GJ88%183o{*S=SYR!}_@a~j2x7@P?1TIh60Nc9?+k8po{|?iAxR)Qm z#d`-p02Z(TFu3xMB>ou!HUJ%W9{YF+`^XUcBEa7MyW;w*FrfQj8oQdTNcS$A5yWv{ zvq=eOWes+fBR-m6zCi_+{&{0YJ#Stz&8oR~ip* z?wU{62@&;?;q}0Hs_JDqs4mGS zCXAB7ZQa_Fa_y!JFZ}_=?+vLgK9Z<|d(+nsYF6!~gB+@jGw+Bf!8_k?_QQOv;%Ty1O6M@=IUQm;05H8-&-ik$k zExvj4VBjPFp;ygzY+6OJ-}oq6k}D^DS| zcTsK&m22RJVloJs4y0&9+Sos}NarfxT)ROsv!(3Q<}gD!nbDHO@w`TVjQAQDC$o zZBQP7f!-^BDA#ws03&u&e*N~><u}^m-z7)6)+|G2tOZ!@jaB) zOPlh{bA5T?OMSWcvZ~I@CJg$cU6J>1Wb)x3U6+Foz9i-LbpSzZ8U9gEW$k1SMtkr) z0O%RG@Bd8Q!f|Ew0~Iq_S*r~Cv~-Zj{^O23?mvl1!Aml@^nIyb`>|v#u;O=MXFkGq zk8nQ#7S+CWZ*hTaaeAT&w7Df8aneuWd*ZMX0H-R2YSih$)EFtw!?oBH-fO2B*Q-Ut z+SJU&#HG)&QT}w$pQS zp_+jzG?{1+3yspy%UjECV#R6&LG1#Rn0BXQ0vClla9+&j*3rgfJ{1?T&>ZbENmSY5 zjb=7>r7mIB@xzQY=j^4h{27f&Gp<_tQF)hhw!fIrZ{;PL@f@j3IkoR`4_wB8bxVa( zbR4G`qX?SRDctUByLdJj=j%U}`uu%yPi$f`w2LqYyaJnG|MzkI%*!H#q~;&eXUOrf zjH9m?c&-;@r~eMFwK~R@eEIuXwd@O&)PyATAa`r|ZGkG}e zl`J~XYv*5)er1-Dt>O}P?(oEiJpkyIbp4@<;4S0im{Gh2FkOYgU4>;^hpVrZcVK)F z`(kntjLQJDY`J<4f8UjMz7N>DD+Z|M3bwXuc1BL?MavP0He=hqwX%ib`l#I5G zMiV$6_DeAT5hA~Ls(0n{{_n}&;2+8F9R9oV|H=Mu@{qA$mO~(ZSVZTgEH=PeFH4Dd zY##07d_R&Zy$uEd7u<_*tG)V%;_e*C@YzV~V5yN@y!*7o@BX%AgO_21-v?>9DNjE2 zo_zJ!0j!^^<#Vs$o-9QwqW=Kr^(M~h27VsH0=QqxW#x@nlrP4(WbB$6)u7AjGIbgM#xpER6@Jj~!Rm@+MN7a6$u)O8ZaMALM3Iq! zH^CmV#F|M}E_ijkX#!~Gvw3_&n8wN<*^HH-ufE=Bpa94OCjxKfU{zhBzYoD&IRRq! zb%Ge^fU$SST2@R3%R;PJO56X!C0?7$zR1lh!#d-1Da2u&wmsx$bP;E)6IPikltB@?!d{zc0A6*nQQS8RkELKrggmclOPPuV)F07erRbaa&{7>yn zHZZP7Oh889Kk0fMFN-+o>>A_WkB8*N(6orbj((rF=|rsfWZ*ds|2y3>KH|yyJi3NE zvX{BL@*<1e#Ai9XBMU|2tKWoCIA^u7ai+;9WHLS92YcOyi?}aqFlZ|&W!>N+hGDq` zBeVg7$JX76>sZz)3}OM0T{-uZ6kASSEPqA5RsP3%+$eBPi^7JC(!gdL|BH3;)N04T zUTyT)?@1UJ&E(P6Y4Ynur;uc*FcR{f>>@_{+~6y+vidu+@?a>xd-Z=N|CRfH!=21z zz{{A;Ujn;24|io(+vrK>E)4gMWN=UBp8+&}`7dGg@%CKB_lGM||MG;{%$SnD?ENGO#q$k2!1GR23X67`27}swzcbSExXSlvikc6((e7C zH-o&7v-JCkLaKp<}Quc7)um6R( ziw`CGDM0*#nwp3r`*4x=6_XV-^`0{XNFecURN|L}F-A}&xJ030G!3{j-A2{ZO*89f z%JnrQsy$21?avHhs&2B5Uwa6s$VFk>YCS9tuw1DY7nPxWC{v-kx^5Y5W;?oJc_6JQ zBzQU|fetlsNJjw06dYTE0z4_kUx#G2iX~=jVb}#AfdeKx07SNrBS0qB%)G_EyI{3> zN1La6qH1DKijD-QJw+|7s%~F;p;NE!W35?@?YVNyX_6?xmkk44rZu(+eVB|(^S)7= z)6>OUYxxs9EZ3Tl753mlw==3_)h6*-*X%jl$2G2Ea$8szCSnMMC=|dW^)^~CkUfcW zO@1r1wCWLD+mG;k?rQI3!QZvFp2?nSTzm|?s6M=E9+IpspZQ0+FGt9V-ePmmJe|l+{o6>&Kz#dOsNj8H8)|Ul>=yc{Wyh$OVK1# zxhZ^_&!lGlJS{}|V{YKtAa1$?OUExkvP8IO1Ga zakefmw4Rci!)w+S%$Z?s0jx6k8oPKK*D&VRFj(1D=RC&YdAO5TTGaVX0l+Xe%;1D8 ziz4yTZOhvAS7rNPQ(A|8xS;O_Nfe6)+t>@@1yTiGnn)wu;zGv40FYE@D{z`BFl=>J zH%%NHMq7oq#O{U<(@pO60CesH`L;a2^K~gOYqT`Bfs^fRF*e5AwXb~ z#!m(L$M^J*b-7}A$6RBO2iem)UjQ&OlV8Dg?&8{hcthgB1sL7bGH}{(@payndTF4& zL3JX**qJIr719|3tPW#2MBFk@z=AKmC-rB*zV8gA^&Z~*E!YurYoU9rNvR9ykC=;u}({S zw~D$)3FP^JLidq^HJMwii8pxCgTBgRIx^_eDkDmkP5WLC&%+HDQUhqU_>BSFD~tMzS5F=EgK{KnMpr4!f3 z1MIs3v!)nEteV=q7n(XmiN_M&MV2b@-J!;EUh2P2eeYGsh0m=mUt(@#o@<)n-O1T_ zo@gIS*#r$S7Gk))*}S66QU&{p9?Wd0vXL&cIIxc^_1%R(mNElgdMM&+dARC zALBmUg`L0SwUK+gtGRS|re53nsrw(SxqX1=vfYsfH*Q*O^PJ_=Omv#GU8mh^qOXLv z$dc8$rmB__1q7?TwII^(L_*c-6m;l+RWdRB-axg+XvsPWz~1BNWc^m8eodzPY$27HhydMp-?t8K6BvtQIU|*0jh)d=_XpVVlu8o(^Eo0-R@? z1e|T{xo6|%ta7$JoPOi5tX_HsZp$kS%HXB1)gX5~Rh|xHIop#JjF&YSp$lb({sT<1D?1Ma|NBh1^tQ6RFBE`+H;smC19YP#NQyE$5;YpFR+^PG+L6B1H`>wc?(ELar`1RzrO}WQDbcfO)ND4%ZlDdk2MUGq zKC{yMaL?R5=H7_Ntjw$|G&tWrASyE>UOaQ(y~q6Lod4X7LbI3l8Nh|cH(b7fPYZNC zkXbLP z@;i9^r)uaKD{7^Htf?kiktCJTR2^kygCDmhsK6fJNBG3KMdn9lv4ttfxb=GRL z@P@`;W2g9}@JR+mbGaie$d_yN7=Uo{IMNS!Gyi&ocWpq@_;E6M+%YaUbD0*$xK{xto67}3FL7S5?>=%WwVmvZa$V>eP-Vy z#g{ObW5jfgbPVok%Sbs5WXPRbRJe-!9>xVpnqmk&#`erCdzD3b;NOhCe%@+Q!* z9VbC?teShr3TLtCQulplO*8y1q!&f*W2@J|XhB@0XU_^X*1}9)9a8$kvE@)v0*2_L zQX(1O5ye!|N1yjAiW$=U4X)F!H)w9$pufrL3%QqM6;i*>$y2$Yu3mcQ=%=DsS>%8bWYfT#MCR$8wl^Yb+gJyvPZQJq0 z$boE`6B{|w4%p4Mgsikt5|35~ST|M08i~l9GUgs2MNzc56ImTPO5tm)^=ezk>R5aJ z=vxh*-SWM)9dp*5Y2Ch^?wwuh*qQdv?JLgPRfZqUb}L0_H~Z-3htcu=_7v<^cYG*) zlsp0Q6(gomTos{QAVJq1Cm0~BzK0fh4=IM8q)5t^d4vM=rUg>4Omg2tMp~D&oLi;& zTpH;?&%S-YE1X$MzHsA)%MaizT7ol0$$Brg(3+v4YjMHKvk!w9z%EkmyCln?j;mNT zAKm~qEb!JOIH3^|0IszS;b?Yu3_Zk5qe9s3cDFnrg$@5O%q!G&Wewr!_XPFTFaeE z9QGRhc8T`8K`#!EGLcN(aj&ro$(K1k#=T(YBnw$ggLqn$Y*4NuCnXzX3XXI7C&%&#Qb3-C zHLa3&fqfZDbb_Ivk4!nyt$MIb^_b?Gfy_NyGYaH$Xy5jd04FD3GLJdQ#%MNdlgmjt z@n(hIuhD#AZrvJ%zDT(Sby74;V&Bjv@v+p6TJ2mz^RG!TbD@w6^2T+yX+ma8kcivB z=wK=doJs;=vQ#<}S*cwm6OH!cI^b9$6D*rE*ZnBbtZu6z32vfZC|bz^=F(Qnbdr3# zWIYs$?Aou$z2`!GNbzN1Uup_E&TS6GpCZLv5RPW6N|9+vU7TCuztSSjYC;$(%UBly z#F-V{X|*Ghk3jJL%s;`_jyk*wHE{0)R*(#)6nsV-?Y=_yJxyaUL7HaDa>E_2EJMig zSem5VR3Ucd1qFX@c7o}m&%V5(@c#F?ZMP=YnW*c&yZPQx;vO*LG$Ka$L1u6&F^6v~ zE|ss+gqNAevQ|_|XvdgK(=`^5L--z!&hzxugllfbDHyI-&_U}&Mz9H%~aU6{4O{n z06{>$zcQ5+m~(g;mW23#c?L_f4SaF*2!5mRZ)lNBBko&3w4e4mLThCwMaLcu@LqS0 z*{(k9c_GF!!Mg8|WW3BVHZr6u6qoxX!H2^m6mPq~iNQ*SlI{kISxkubl zD5EHvaYk|=p10)n_mfl@rX9Ny@p_nqz!u5h?Vcyd+GSBN2?2NP$;p$a_*$8JqBgh< zAH|YOG{y(sBjjNP!8JOf_EQk})wPu+Wu&oJnOm;X!F!@?@cU2|L#1p42ny%CS$@xW zT1eqk*X7SyyR1+HCv$|zLD@H@%^xe*0+;r5)6*!su07%g8xi&e#?8rd4OSv)HO866 zOg1FH*ObqlX98b)y`D_hT5?Ss!%aF2>j)S7CEyuM>dR!jQiu)c%UjkO{k$Pg1 zFB2Kj9m1i(&zhe(d8i>LG*PI)kYdd_PC*7uVNnS;crAuaqaB1&U4s>g$BMc_Wp9W_ z!n-iBv_PL+SR)@kYTCs1e(irdH;c{v+9XjPpg5$kH&(Nd? zO4b~@nQO$BC!Zug+1%w=!U-pBNo5=rW9lNap)szuPI+7Xg{m?SBrz-0=cTZ->u1~K zBIr&>c+J3lc>4VHkofk$>EGEPeaf^yUlU8-^9nVs8&X4jDsIHeDcfSa&K`M_eQ6~erz8`v2Vx6QS9p{ zA;D6GlQ|ep9iwml2<|06dc=GO@7YPxDRrnj;{4SPvrC1?}Q%x$UTqtAZD#7AsR&jQ^NS9E>L@f6ciGI0ey)WRNE{8gF|LSr>V{`M+e;t`#Sa3mC%T z%fGXE6S!75Ieg+%d!8s7))Bt)R-Yb5M>+6{RkLv!1t@Y%mcGaw8gWIt*EA~uM;=6( z6u83;=OwWx#Sn3wUaRzZBUHMnCTA8K@!HwLPiqu&Ce6bNKToO(b2G=1w!;x+D!tV+ zR=!F@XaZ%95>qX3`|;7F7Xz07t!l&eT$|go7b-Lap?a+H8NWguH|B=su1KLYWUzWp zx)3gnjk~y0A)$d9zEy@kA#<`aK1Rqqm`YcbBE#lz9w|3P2;F!^Y#^|)!p#The3e)P zvFHb1w=84L&oWoyAk);Q#Fi8(m)wL)bkDRj0yeIg!-C@60VCjS$Sg>UU0R2>g=|Q3 zcj<`a^7ECUNHVZX$NJIp{69rs_8+ib$==Sk9R<6Ya^3t3ZQ&Rh2L}j*Z`un=%B?TyP~Yih!j=P?$xSL+@^OIbq{ykzqEzdIII?&4xx ztINt>ylh!PN#|)>H`WPX-%4q%GiHC;U`=kO|4{k+imb*f-BI_v5Fi=;vi6BIo{amu=6f+FK+ zX6o*%g8ld;4$%YOX}*cC+qqVhmZg#>V^sa(!yrk^D9uRCp0_XJW9iReI{h9VSbPYR zGZ*pp2Pe_BLU1`ry`gebdggYMhcX;#xaUClB&PCxNMhzA>cT21viedap_x)lG3)9$ zqTjB<{7H_B56-~+*f@Ibp)29+RJms*GVPoLX(gfWDxZ0jEohT$rU>L3ONO8mqh3oc z)I%teATEBl=Go+tPWtkF= z%(fVpI2G7<;rKh(q%*?MlnNvH$u-Cl%lFD8ciH0lXtj4Q6J~INc<6iR#Ha zG2#xx7wM=UOs)i;!XZqMANejmkiN5;^c1?19@|mAre2ti1|vRKaEgTaui&tG0;k^o zReUaZ4AaF6gkUa9E3`^ukPM0A1V#3cM^nTK!PS%HGHTH-ax%$_rvQjD9t8C!F6%0khxTpvRy^`6E>rxha$ z1R^wC(c#p-8ta9QX~$cr4@S@~{wdEcQ>DNM=eR8M94D-JNGRtFdvZN2z1JuzcEOGy zXC*V8BWel@hYhYYZK820(VQ_HaC^8+i6JB6IT9eFCy(wV4>u5*M8nJIkKo0m(Qd9r5xANJ-CxEh+^h*&x+c+&Hfi;=Cf z9F3Qo+7~u4nmTA6+1ZVc{8$e5|u_sH@XR-Mj+Rv}iab+ot11A+E@7WQRQ9!jYwX{fMH zH3@Hy+n-Y?pTXzN92UuBzvepkgvgyYYn<7rSq|Q_WmcRO%#dP!k>Kw!+*SA)j5prH zXYAj?Zv_7wDH!$0?in-wm7Dhr;2g{_~2>4D1z{#o%!*N4&*6+bGdH;03 z1GOR^tB;}4HI8ZW%pQ92DZKqRc46hec@c#jbu>##S*R&sBxG3#?_wd(8KrY_PXZ=2 z0~ZT5(wT?7;h>nHkG$BV!A%Ty14Hitdk7D#izOq<6p0F0PC^P?MzPCVa^9#ak$Ub* zY`pL_riB2s2w{z*R)l(QtcwKAj8(}B*Dvct_Ua09L#S~)mR=kuWhSUFRS!h^?be;g z#ZWOR2=0Q!-G2D~_#&BZmdhMD{;4L3`qNp~kj4O-ESIXRi?kFnCk0X}Xh~zN?26*W zaBo_v{VckqQU(HIXR1euc&ozT#Mj6yOM!K%0cw~T>x^IiC$p}WTQv} zckGcWTK14#9F^f>fsl)gSn#;fJ(o44r}NZG{(@aqBZO_q$Pq<|&B$;sXNlJ#^}az< zJyp(z3Z;*NmF!?KqO{#xt6WPX0$TIz%>!?%i{WYXnexuno&c*~=tKGP-4vQRMh4ym zl*n2t6e;|(x_u8;k9|A)Z@ljsUt{Bbt0bqGvs4lvbEm8n?$EfY>EP0}u41qqElr*G z8n_qlugxJccs3@V(&0PpFmT6{Oy(*Cua?Q+V=aLroY2lAPV_jQWKV3ze@oJcQG$xZ zwENfEoBrKeaoSCOzm>?}Sh1Q-cT(Cxb4xGwcDAh!<;$&Z{>J8$W%GSoP{u6|WpDa; zySKaTeMx|QEZBiJgCUeTBa+6ni&ke3Va5aGt?eMsZCA0TjoE`PDZaN+fs|1-vUdNsN zd+{f|Z=yCZgVo_4RQpHK7`g*N-)^ay1i|5!+#}2VOKapw&M%AWkdn}E(n4J-7IC#6 zpsSJKNs7kig>yLi+HNHO?kLXvt@p^&v!a+CzMOM5EXC> zxPS~DuFUAF#h6G&$snTd3|=EiO>x=@jm0Jn71jbW7&o@L^FkqPxMHO9-=Wi>9CuHh z0Oll}#3@plKY_+_eZ<_4I(x6Ia3dkPS3Mv~Czg{qzGJIK1g}v}YN|R#pSt7Zt{#;e ztut>sXAg64SO(N%m3Mjrp?IQ6stpjeD-Oq8`D6|88kriF%U)RSN;WTlEzz78zH&ZZ z7O6KE3K6iCfng6^JmSzfeMVvSOspXFKv`zyZX61d@C4yYE)}fAq#2HuavZCcOzIq{ z&~)gBP>m8q*5%Y#9|i?;pD@!^Op4XAa&<{d@{<9aI<#{Wa~#*8UO&rdAtq6jLSn$F z!*S#RDViZPnS8#?wrO#lVBoRg4C>W^0JSgDoLf8udufz(NCCYR4%#18@Lu^o8sRJ0 z?sj`|*loHi8y(V0qFo>nAXa__E>Px?$<-Fm*BnW~tWKcV3-L%|IMx*;C{3czCQd}L zYE&h2ML2-A&)Zpo)5PlAhA zl4<&N*`3J~P-}XLygDrYVezQXznO36=rc^eud;LdGu8-C8?pY zJdag^4Qm1g2Bc7#b%;a7ggY$|#9R}ST)i@aHtQt0zte~)c53m3-~-(A`$L#&9>v^0 zI)^CATk9m|zOqwIG*|khH5n)9DEkukDa|z_lpA+bh^Uv7p;k%+@$M#+o?yI@dGgqr zh*sD;3VPI>~$yFtrV|vP+T*#gGBXQ4AWw|(Q zt~^DyNR52SCN_=?lNBl_2y^__yE*q*MceqyO)6e&5Ju8vhdoec zz>~hJ92h7l%_P^An$TZ@#+{`jAoH~gVCOwmmjUehW=iuhxP($COW5NSPg5LeQpBNY zdG>4|X|<)Ii2@rts=n0M02ho5PQlG;K0%-`<{Br3;omUP>)`R=MjZU?M3MTRiN54_ z_F5UK;7Svo8{TVmU}GqJnYLA-z}eC4cv;iY6hsO0u}aoe^-zrZ6T`3*PXU+66VEHO zt_^1LVVtntc!`d(7@Afs_4l)_l}9(r_gj9_@qtK=h)gHrnil6)>&s+&`g-(-zhK>NejtQ?Oh8we@ChKB`@JvTbhbRhhT8zW*B8t<~7g%JXKGZ@2u? z%^z*|wr}^&j%6oMqy<(9mdP_HkfO~=p_121N9s3Boyah8mu9Y0EVO3Im?I@qwA(YOL!8FV%u+sVJjPfYwE zelh+<%-onDFXt-7($0}mi^tBYKJ;c_uul(6N>hG{}1}Q<1iEBW)#hmT4~S+xU88f`i#}>aFHd zVpX*}V0vCAE2xH$d&5?_TTCu>mVqW|i>D%`pw1TYqveTjLN^MM`C-vY$8t81dlDL_ z&75+TQOi~N2-$=e?k*8X5~Hj(6<}q}#1704%ypui(aIjQure7{f<~D9AuL(^pVW&o z%$g|95wnsG+%pSYKDJR$&IDQc!aII`7CHhj-2$eXqMse~i>6XR+c* zXzo@k0hXSmsO;E26yEwTkSt7zF>CV%8sP-a=Erdam$0|Hf(w;yV0jr^ZKmVj%{IHi zH#U05Z1nCr18O69FD!^%pk33FysB(U{-x)|fjnS;seH`3 zQ>)FX{R$F&{k}d-8)mpSk zP&D)rlX~q(=RMnD`tdn@%n&?HUhSk{)jAqVFA4`4 zx7VSSs`DBFV(()PG~Q;zhtV` zV}ij;bL2r*)l;%;;Bv_cEAJ4sQXO;IB2JT#+?Dl`G93s0HQoDXGO5RuveIE%%NOWs zrV6Aa7DyQsVGB)yq{#$ec#u%0BEi$W%$&4b#A0HgDM+|-Bm{f8aMKl;C$%%#^!5ed?dwOWCi9)OB{A? z`7M>xW?;b9;{IlDcilJJ(Rz79QqEzwrA18pD6QWdK(=l7fv0uzusrf55%>JdB%fQFJRZbslp7uhMh323HB&K93jh@X}wv9Mj^hyoZO% zz-#F>@iDY4>`^#9R_%+TwfOzIph_eYg2ALf+ZcQ^nF-nSY_0ZY7nuu4) zrLWE4TF6DiyOB-Oczov)%1@<2>nB3+GE)lDcjzkeP#b&%IoD@qLZMhFkdkfE+FYRc zw>^Nc|1!`!LqfJG2~RxMqT|!H5$eHoUN0OTDxjSJ#R9o$eVwfD!mH4+ZEPEUok4aIoo^IXj0?I_CDS-?sec1HG-3p% znkdHS)!Jdb5GgJ4Yb? z{sw}pkI;C0j*d_BlZ-|-WLDU@&Uz+C_i6;! zY4?w1TIeh2>Kj>m5wjd~o1mFGDf2gP<vKxzLiOSEpq0Bf!4lgV;}A>7(X*_>Nt1UTf%#(X~-oKg&G0d;xD` zHDAPC_%gmxx`=yg$1zVB;|KMN2pAKdqSrXB4hoDB!VX&|n2j*SxUr9fZ9hvjGz&dw zj(#2CqbGsI71X)eK(+^6?;a59z6bUjy!Tv)%5l1$Zt^T>472x(!r+t>#M}r&N!rS? zswkzfi(=j6+4hcyxI8~f=mAOfz6&tjD-@rltDbSC7^zdT4IL3iK3QQFI^g2mdgdqN zn4T592hfrq1viwD*Fi1i<^FbFY3P0z8RTjb*`wsTO<|jAD!GAdT!}9FbFw(yYM6AB&P}mrHU~Ox`JbfdZZL z&2VBBXEC#);)`|=Y81Aokig>NHEW5J7G0QDq8Fs^Y@ju@e%84ZaW(oO*UUT_oJq{= zS5lwK=Mp-|K_T> zl1;(=dn=NY0Xt3R<|;1PL-;}S4!&B+v9O8{z1>QhnT_7DYrkwZa73ccBdgMaSka1h z>C)yzrUK1^$T4ecHy%hLQfT26ogOA|Rdp;d5@=&#Z_jI+YhSE@mdD_$Y!l@09eqp- zw$pzjIhXPr^YuiwV-jtkIJdLe+t_#g=B@A6xjUeOwgA7i8o6E2^mf(S_qCaICtdUR z&7=2cVIr)*o*hgsK#RLX!5=0^Vfxc@SVLd4fl|mxbR|(j+&yNAP?nW|0pbQJ8(Nf1 z$WE?QktuBa#*=c6EaJ3|rF_X5ldXo2;xE~jH>m?*#7BT|0xx5pgbyj&VupJ4JE#=* zpnv2+{%H z-TB@4QvR3m9sG~@a`qU;gK;dn+zKISuh6==x(mVehfu5%`V?K2I|bT)IH(kxO+x7)F>7>~4mUmgfl$<+Yeg zuThT0j?yz}R=cp0kQduG2|GNa@!AE=D(07`@v~0Ba5<$^C4?@aMxM21536zRVcqsP zTKAr93APT%4rmkXK)dXOu4KeLR*DO&W{(o4W)uyl%9(3tS*bAV5OV?>Mb+3dlu)Hn zk_S!?(R>p1#tKpUI*e)eTVfr|Ok}Kh_!<&YWJRCp%%m3ucRk#%HB#mzX+bNVu(Ydf z&3(xPmVl;Wdr7K;=<9pg^AvIl<1H11hCON|aIn?PWMM+&`;goj_G}B%lwCsW1e3D? zWVl&9d#JQ@@^1AuS-Cct@Ps*t2|eKiC(D_Ki`sflpym}?KTAdv3bg^7C~NUznKg?0 zx0BJ9-b({A}WgWBXFxbo{&ay-oCm+3?pjTjaR@C41M4m(+T^ z-#YSsXeOA5995Z2SRu?L@_Q@_RRvI6m;~+yg$9uVI|=tvbfqks1eK~{mt-s7$|_Kb zHc_)K!_#O+VJpSS=z872k91eP+25P(d%NnvD|ol)Z_<;t_4Y@x*-d`m{fm8@6zRH=dBt#qJwgsc)rCgx%y+=mL{cquc?jOKhX%yYBT*p0Rge)8*=>0np zlF9w3^lhdEr{miG8O5x({ODo zS-B*fY$n_m3fnfE#&i?JE2(yK9Y6MM7}k%Z=6tmOHfYCX<-10eEPH4i`z^9OV{OCb zGjtK`Npf2{DFxyfZlsAy?1eEAJ(meeCm=ddk>i=<#ixAnR*5EpAa+^dF#?Bi$W0jq zx}_?DnTlxKxzDc1#sVZR%Kcd2;?Zn@@Ohf`td)o)*Pknd%Qq+qVNQvvY;+}i%2^?` z!NxmDE{ixWXkwIntqGxy!NckRLXg};R0^&do^y+kqJm&h2P$(rvXqv_*>V%=>ecC=|XNB2{@0PPT*x_DLORh!Y&0TxaQ1*`X| zy-U29u&y2|Yr(srRcKmSQcSBaEdQGrpHpZhCL5AD#|Z_g^=wdqc+|OwnH<=L*xt;K z*v_`qerrl{)+s0B;tg9Ld#$qCY`cBMbUO;xu02y{^ZQQE_2w_$*7batL##(ABJQsh zbrDR-Qm`Re>;;L6vdASx$50&!wgp=0^Yqo_FeNyyCVs7<1#0s;!OAp$%Ek75ah?Q+ z3e&S4K5Y9pHKr1@qsST(VLHWO>=AGBFr9am1Xw)Siwa@St!^a0I>fNqo_K1HWtMNYN^63`c079&O;}fhP@Y%4(d%W&8>LEgsE(lswZ< zVKI9Z5BJ@V@5X14U+bk9>@iVdVeuS|0V&pm#xJN4>RDF*JfZQZ5!k-F3$@`D1kA(~ ztzvRy7U88)oGp%{HbwF0BOz8N=suSE31&TyW^n{zWd=d1Ax+EsC|-A%g!jU78T0uu zU|<4f|2Qcr8h^)Aj8v6Mpm?xo28Kcz&QwZ8<7yW4&XwW0ty<#3?2OMgmQo%}(SY{dG>r51illUo@;jnUI zPgCkU-7RsM68|CftW5vPw@Jrj$XH5p0Zk8Agy&8g4G1Yy6gznu-Okx24bm zAs47MG%Q2=N~3$m_8I179&7S!rN5-RMoyhhxxqr8S^_+F+`TB{+RKP(Zvw^1VzR?&8iezPaxX%m$x;z4RFrDTdz_K9Anu0=g*dvceEJ8EiEPYj85` zVLDB}#AWC6$H>@yu{|lUu~)j;cB_5uR{OXQ*B~k#`$j(F&c{?k>uJ&3NAOWrpY6*J zreT|+SRH!NBBoFksii+jNA#89-GHn(PL2>X!>AJXspUEu1DB(0TZ^ZjDv@?fUP{xZ zPPt|h!)3TIv$msFcJl%HGf~7FXb!JeJzZ<)a zeYSVJUV@4WL7ziVs_4$S2PRX}QDl(ZfrymIGR=iKQnE|jZjRtz&TfsEU_vN-ny3`W zbBv?*L7A;4O)#6SI{zbg-mG^OH0j8;R*2`{Cg_z^>NNcqG5b`%VP+RhH+B%L^(O3W zgae0v6xsPD5`qI1ubRQeN|yg-DugG<7N5c+=5;)8=bc&&-PsZ`do{ICBRrah)D%9b zrVv%Uh-dP@gx|N5_<@xnT&piq+_p&G6MY)Z6Fga>qYP0Twx7K2VPs5F(KSwRa#J~L zheBj`(fKCm&c`fH&L-$zE~01eG>Xj;lyZ zD#ZE8188tNma)?WL(hsg7;$^Nn#vK8_qp@BGF3F5RZ4&N`5$n1=wh$ye2vcL8iFZ! zvKO?cD$6Fxto4uE!LzIf8EGvfG9@JQNs^0P;%CNO%!xJ$ha=C=s;cxOI+!*}$(1li z9tMqBph#X2Xr^rDx&vj2gPlXIdT1o9#5~HU3R+wp_N?g(xn%$5%2(_mXsh14YGy5s zfn#~n&NiWXuz{BM|I$`^CVvGxp389Ie;<``V{GvhqU zQ0l$BztNf0iM`~vF9=k9WcZ35}D}v z+H-BS-8=-_QNbG@XUi{baWVGRyWF(z_O58_Bie23Z`WU(S@-v*$NT=b&Qol3C;eFo zW$wz6EeWAP+Qs?nvGhD;WF(>3+7b!O*;t9;XXAx{UewIw`v%8bbu9@3?`ymrT;G6bX3_X_bdyuSO2!P%<=6q>sm>F^r} zc3vbXv5t6-jNnCurA?;Rw3J&iNq=1xh9)&ZqTkwx1g)@AXxn8MEHy&+@`^ch@}mjU zqF!umu_|)zyc0O;IcdS!aCCyKkQ!Df08@g~nNCm|hci^laYLqDY=-isph6~(^h?(c zIAR1C^%A+cIo}$4c~Rh+N+crtdghjsH(x(i9EQL0H}aZzSWVATN7V7Nl(+&n%>0_PlSnzf+^W85=h zEZ>rTV7bjMFt@Xi@?N7Cm#~K~O#?VXxEv-(pwQUr?GT8-m|dcVx(#BES51*z>K zX^?s^t%)Aw6GzFQ`3mCd!-yKEDfI9nx}vM-q7X`NkdT35CF!cj#z)Qx)dj3Fagy!B z-ohpP_4o=(%|7fmSxd=o$BW&L0=DbkX;rRte5l9ilw50%5s7`wu?WZdkUP-VC-(SF zyhi4OB4JjvL5EfELj!sepNs61o!YD|%ot*2@MGz=1L4r*pnK?A-epeq`9;*3QOJI8 zK`j0Tlu^gHIC1-?ZuSv2_M)~*HriTotW(Gxiby}~JA_4gP$Z3xdRExdSH%;*{g%`yt8HG+)PQbMsch>lj1;weeH79hU`MeOfa3Uw2Z{|{LpuN`HseBV=0F3qgZMe;bixc@SF(tq83l1 zwDdNreSduCeC-^%JRdg_FhG_{}k+KRm_l}o(jjUc!ts{Mq{E(TEMYLE+KJ^ zeWVZvH;+6Bo2i(4gW6HVU$lSc1XKIttA3hFQFhR3S=)AM15)8?!rq!1tUru9<*U9#4OXnX}*{xvr*5aNvUOg3Q9qCfLrlEd_Ja zCtJ9p>qd9880=af2-r@>G4Nr%#O;^}xA?2`-qyI4w|_-9>FDos<5{*siYLn!QH&B2 z7)|;alQ1K%&X%On_#zjLaVR1qAs^H^V?dHlI3N_&XtDP7wGSwbw|N?!>`SS9mo!oyS6Rg-hp{dK&LPbE)d zy7GhA(Okqm0|mTJ@O2UoqTXFZX=Vmv(+lJ`XPD+%^Ya!}@;DL_y z+Jj@u@1t^T5QFzexc*PcWnJh-li=m@@O$VUsA6zWhGV2ar`{^y>Xm!YC=?MMdJXAL z8V`Cl!5m%h9JGWaQ!)l=*d02V-Ej1RtTa-sf$bDf>Y=(=CcFV|+nO_LyAs|w*CN0+ z$pp*9qG_XJaPd=7z?pj2oY=&PS(YG7ZkQyJjAM{o%EO)|duZey#*x;_ayB)rD#ye* zC)}lmkCAFKRY|I1U6U|`Evy+<&L0)YgG-#N6{vH;iqDrXN%;#OH`VN7&Nvn?zOIB2 z>^ZYywa!*6GV7h#gNkbiyH%syQha!<82srJaVLITYmaNMGW6c%ab4o?eWFcfG&qLlaLZqGvq z8^`EgAERp^MN8IJ7!W!V&Z82pNZZPOQqpmWOj<@#=q4A^AxtDsp->#ev&FCC@yZx} zsW67c>^kmS{c|{gG zv|>XWxitNB!vWg-z0IG*dU#;H)>)HSYjD%JumAQ&NBiiv+c|3Iz8zQ8c|UfGuWbI- zhI`!Z{ch#`vhrL?Yh-1w5|WjoTqu#%Uczcl@0kXw3?s#LdXE$u(*2Qqo;O$O#sL=!(fL0|pDzdVs4jdLwY`Jb6VKCv zit+qQ_hat_@R5*GS#Ifm6_u zHJ#_)o6Vqn$6i#Vt!rMw45sq;@J#bdm@xk}}%#jI%`2wIpHr?gn;i)x&Q?VV@Gn+?)oD| z{-oWnFi8Xgzea9ggew@DVI75mqo?HgrX^0y$t++5$7=&8;}dd!ILJ)L()NC_WS&OJN>10t-ElRR0k_B;nTb=^ZCXcPS*!70&79LTIw0S+xZmEUm(w};ZLMh+8&FJH@6*oKm41Ml5r;afp;_331UW*bKI%t{N~d z-!*H^3iTqprHAZJ@~Rs+YTm@DXc)))3fQ|d!)s?A#`wMO68v}#=AD{kQl2~WYv_OC z5O(dm4;i^t(JU$Y%gY;%fR5Mz3GUD0<7Nu;_L8*4(=3Uw!=Lti$C~dieM=<;YL)Kh zE%YX%B)Fc%oAW=z5!t z-PlV8!6@C|@W>Lbf47MGrM;v)KftbIS1@#Ef31VE!g``)BV*D zH&TS8U>mFaC{iJiFJ%g43PFKu&Mig@%kNdq#$`<^*&0HEgI2?K75!*siYP+X{=HQP z=>?t_B%z|4);W@*bgXT4-;r)Gaw2XZZ-jo4>@A@Zl=4-Ak2A9Rr7R^@h%{k%H*v=| zjt7{|&#Y9TBia`w$nvpal#iL0kK)Sq1|LM48+h783s20< z9;h@EU~XVRa*Yy8K>4t;R7-wX;fieK@h0yx&(%?hnUJ5AEGJ|IdRz%Z_~XYeb(Ni& zSUdQHq0&b3GYdFq&HM>`@nSSk%vuIB6!r}hbQ5CCT;9wMHb@8PBO_%$y?2m|fp->AQkO>@?C@0OuOLI9>fL=Hnss4!nmw^&@y<>3+O5@(#|9 zOrSFLF??nA03OQD;kU#8h__0=dP}6ZExxxa#nye<|7zC$+`{KY*i-2KC%zwS)QW(v z-MoVHS;K);jR(TxnYR?M%kpcTGZ6Se8B`VKS=+wd*WzkcVb;;Bl#dnDbk$IM3Qzh_ zWGJEq?5T&HZRo|`?2lrD_t$T2g|PMk*!9lenq6+88rtiBlhM6-yFK-Ly9&EQReJqt zaI*%r8=vXcXKR}%AEhb5TO};xKj`QTC?8qYv8$zF$TJmHq#{($_Ya0|x zYoOSqcqAEjy9;-tf9JvW#k~&6E`F!>%M{P8(KopHT+@Xml9th#xt4TRYEx4Z21D43 zhcIm3A>rG^#Qvi=e(yZ4%^$|Ay>vB4-vM5nMK+TPY-mVwFOVkLf8qf|tF#ghl68L} zg#_nr+We~MCFMtut+`47a7|RGX{8;yR*z5=Cy?)GuUr1KO8zXv#=GrdB$bCSvv3v1 z>(Am$_!@HZ%E~)J93Tkz>a`g4=_OL=xioXe zua02X*sIw8@f8e_R_=Zy!i(R#12gf*k&V2Br9^*sQ22dXFLE&?#{C!maBtFRV{S&uN{f z$zCjXjmzAn@5}jkov7>L4PD4CC(xuEz z9qv(^It5DSZ%QjuBk|)bQz>L~Hz0x5#fIVr(;N%6oJcZ-xv>HB6UU@9IsQwAMo=iw z@3gLBIv;nLC#>B__jQuRsWu`AqYA>5y;xGTh76U{Na)_4qO!%v`AsAD%xnrEuJFckFT+sCh9Cf$j>=TG1> z%a`ytzJ=c}{vQ5t6_uY zo8gTq8#N7O^MSn`A)jw@gjRjLA1s6IZ?>)Yw*zF{o>ID%y4&g zxROW{3!cM+1v=K@3z*vdpRlv>mq;+yU>+y0`ng5Uy1HpJ+UCjKWE@Q32Pr=L>(-mO zsk?=OQ?LfwCq{fIQNT?xJ(h45FW|}g&*81;9C}G0?LW7dyxeQ(CgE8cX49dB9)WL- zz>|m9OEk-AtT};);o&?%D}ETbe2du8_Q~3?jx-`vl*~AWBcI_B!6!WFzAgGd zH%_S+dhHmKY<@(<(#+f6xx zm=qN&LxFsa<^}Qj3o$F_SX>DuoUlURz}d_~5W$+$YP?kl_-Qb>->c}ff`fmBA<0NA zmP=^Zo3)y=BwlFfyk{=#$edxqV;L2sPn=vwnrrfDXdI=A(VAd3Dhgb7LzabYB}^$Q zsIa>mJYG9SyPn0I`yxt~l_#wM?g`8(+QG7`@r9Js1%zG%Y&9_NGROSbh^lkUxu4EY z-fQ?Ep*lk-#S3%|ub{7R4qYLq-&N7ap&VPrjpPts&mO{J)J+Qg40fec_!NyJ!}zCy zU07|7VBe`baUy#TkCY;56Z0O0leQu>5w!Wr~_Pw30 zeT}z1mRZ|98L-PU)<*z8DbxGiTZA`sZXS~ileNDH55Nr~XHIth1< zM>SED8oyM_5tt`7D5KIl(!K#M$6&Uj>@?bZ#Xh&#(@@w}X0dVa@(k@Gdz&d0cajo3 zHN1e{-4nQaX#_Jz&mdixK|aw`E?B7RHo#=;G>z+f-@=@I5hLTzAl*yez>z+fQ@&%* z`boyBl-0}Q7{(-Ydrq3#m)gVS6Z7+P`M1wW{2?MMxq5 z;p~<6ZAR}%?nh!rUZm-YUz>4kz0=j&{Ium{CmvQNfhf38x3ppNc|1ab!CbxEJf5>| zNvR1`uF2?(p$no$nwh%{S&pq1pgmPNAt_bwjUix;zcS3uiZ=*!?nsUa4}wed;&LU< zBo1O%!ej%9ZH6s&ruH-lLoE;D%wI_hHP$stFrrk8fySw&R7H_qF$%Tapbm}+)Jv6W z8)kQs+`T}`eiR+fB<{>-NSm4^%`N~{K&ro2Mj?feG_ehvbZvBkB7L#Mb+4&(V+gpH zv+xcJC!>1WWb6jaP0bA;mddazHHpK5;9`>vAxaO?)eTczc>%@3+Zdv`*lp(2Xf@2Z zxdW5+2e3>Cku7q6*mJmh^*G8y@8RvCJ|qi|qIbF%dz&|;p~jBh-^bVcSMl9l3wZO+ zMa-;}@V8DrgYPw7#pW_*^S@ee*<0_Up|#GPRl{zqVD8pUcq4_j88#JMCtQaC9F-_J%;^U8x z4UT;~B7fTow&P>F;fEU?^Uq4bZs*+F`1ZQ_vXKYdIe|7;uwLwKwckeH-2O;$NMSi! zmf2Bf{%TSWTn88s-d7~am<#4eh8an9&YqM68qQ*;pT)EbaZh*qQaK(=f^RmNbt*P% zg(0l0fW(V>`GU_p=2irwIEa437Wflb-upf5>Y2l(t9wv8@(#=gRiw41rVNNDL52YH z<6i1QvDn1iuHQjVeiusTNTJ71(?3_B48njB> zyoU?dsYk)&Cha?mSMhZ`Ov3sHqQ8n4n*R@cq53oU(~19p(|??!a_K5J>=B`P?xEe7 z9XWygz-uUco8qbD{Y7JMkT?7^exmq3&b%Ds&GScbb>S$%$(MnHe?&&Yb@EP{FqcUy zE#+#suu`oBTKb|nH!Tm%6Z-T0v5amsxG_2@U8Af^Y13-V)F>nz+V-sAuXWNUcD^S( zzF619-TkiYPFjyDbqK6r8&Cossf04pKb1L*#fxr2W3>e>_hhBX*lgf3jl+6~CMl=_ zlRa>P6?=s2L2@muL)Ey@(6F;YR)&!zF0NPAu02VrN|PCs7=mVKT1tyT5B1Fe&V^H3vSkIQ3dG`ocbt2G*iU?^J) zcypqD3gKfg)%Y~Xm9 zn|3y9Kil}oVw1T709B0MLyZM`%H%WeOSTgctW>K;MukvfHQcV`i$K;PYQ2r_tY(C;?ZmFTb_EI5Vl74don+c`!++X~*^)>al~vt2$!Im`cE+gg>i zE|9PeQfqCUyV=c;aH}(SPUP*I7G@j!c-lOQzhJ8W%4T1-09dWCXLXo)(D8`hcK`zqnQv}IAzKn7E^Vq-i-$;Me{Np_c zzTVL0qaF8))?M@a2T9R>4nJvr6TjrjdIG0%+Lh{U!iwDCQhHyO{NOinsPQQ7H$R1* z=C^Tl;RIe@d>-8-yiXqQ!}vWz6#MFj-S-}X`Bj(|iv_OXygZHBpLiGl_U#j-K)X?^ zETVDGR}t)*AsJgkc9Def1S?lpp5r`L0cTm}*In&uqzX%Tbh)-YHxdgi#O_{G>*`$n z+_5g@3~n|#w9PH*4t?QF3%F+G`niNgEnII`Xe<)yA!>7T^+>|J{m4V6=}WY2TbO8b z_}n-&g3D;6Q8~#Yf=oH{mZ=7r?>CZiL`bO%$7u~c>onkwP|7VWwfx-l-g%+YG@jp= z5*=4_nyZ4%Jz+$yo<7&}YJ+$PDMTn1f|fZ-StGl!1y!yYb0g|RWy2zBl7yB%D9u zGq6P0K{vA6*h0!|=4)>9Nr&(=TZpM!Nw6sINJR=H!z^$-!FfwD`hTtSdK)gXns^2i z`8014Q1~nBRCHO#`>AsUHDzBJtUWwrtv^#6G|Sf95Lg09F2-o4v)~8^6EK zM&?8;gPZi!mIrKo?0ul^sHR&#q|Lvz)$!L~tZjY8noSP5!4d2&kIxfORwmkPv;4cX z`9{0S(ThwUIPe*=dB^d*lJn+M;$ANIoluWe_E^KJB*&y|>ZL`YW;1z#9FCZTS){%k zV|a`ca#jlotnU6X*LK96j#&=r2-lJt?3(f&uSSh~Ur8Tq2QtH^XM^Igi{UY>&g{T) z@j4c`uJRHcYpE`=;+#E$QeDz!rzk$Tf9?jZT{w(;KDC7Ej>{Nd`DN^0{)@<$mtc-i z-0I{!T%*!;55+6d`_W@3aoqed-V-X(27D4wC>hXs>#B43_6B^_WbKnh@m>2%IAkBg z*=Q%lg@U{TsBI$oa0A}y>U z8ohwSrI)ey;4DhZJ8|*SgZPc5qXq&0^Y-`b+}m#Y$t~aM zym_bB0*?brUFPhL9_S3t;lGe1q~@x;OrVxk4XVU(vGWp->&wJIbjNW zjTYqs+Lf{DL#e83z_tP>?aFZ$k>oowV=#GSeou4FOSYWnMiCg;kcaSAHTEl zu6KrG(vVySVc=p5g_dP_kc{R7biI2Pkq^=iGgVT?S5c~b3wM%-e|K#Ky|sgQH9L&A zU-|?yiq9m5@DlhW+{BojX)A!9_r`aZIqG>HD2Qp;v?Wdq?QuleY%jK1wraK>nRF_|@jJ@4?NJC(Yx zp*1dbs?*cmOigUGb)Kv99Shv-#<^ILlM~q7JKoy=Tf6V=Y#W+Xx7Z(8Z%V9r%dFq6 z^8;q)VwP`i3&(w|2I==9dR0WJDppi*zEsvaSi5~RzsH&^5c5oaw<_7Vq0IPXf=1}Z}u3>Inh6A~Fo23SqhX{pSU0f2jxWg<)SO0MPUiq>J zU0Tg@t*>>IiM~Am;EQ2=>{C|&Cs_?(480U5t?+$|JyF2&Vn{-E9(Jy&#rh-=GZM^s zAANrZ&Evid<7t3Bix+V5tM}vBz0)WU8_X?z9leda(6zb~`EkOKUZI$Aa|N3}&wldY zeo)%t{iZ!n5m#@HdcJU7$)V$C^JA-&=HyZ18mh^4+}r(Wy8i~g()ZK&H(E0j)e%i zFKdiQ64)HzZM3(nuSC!mnjI6i(>m-FeC`)XbV4T;tG3wmcAY*ezHZ~nR`k1Bj&}C5 zw7!GD-ki7|T9u2e)pCM~B_SzPMU|0e&eBZo!7(9HjM<_TsWxXq3MsqcX-Y1zG)l1U zMssZ%;JpXGIwcV+(Cg0JO$K_|dK@o%a%)zf{ji}U-OM<* zB~P?7kg;NXaDrFN9dumhA>~lc1l~qmlj7#MqLh>od$5;CY2To0oYmT4>CsCTMYEYx z44?MBK*u4YGVBddu?_4>X7LyqW!<~`aW?ogzTG&Anc5wsoV(FyM{tnV%>L#n+*f)P z`+KgTzjqR^9Gk;09BSaz_j6qO8m-R>HOfkN7Vuc}ui%xtUco=S0310oi9>r=(f6G( z8vhv0Y{YeSTQe;-{L8evc z$)_M`0gldwEN`y4TF$y_kisp*1+k2gt8(?=uZQ_PP}e@L&rmj!V4#`H5rPgc+1@lV z+u7RM#%}a>$7r-V>}+wY?W)+@SFoKwH{avtzdEjY{XKQM1J)~6o~(D#@B8U~M`=zB zipMHmt7{^me1rsz8qOZ#Iv6LhSOLrCpPYyuXe={!Rylt+k$Aki5-B`(5x9!a4DD_z zkRxmJQ5MooE;k@osmR&HCYCwCr0f|p%9xVQPw9M}siLL%SI#Ra3=QbP_ymh`5(eFQ(UVwL!)Q?Rik%NN>1xY~h0zbnejw4q^{ADn>1$F&;wbaV(>7U(?y zC(?`~br8zqL}S20vm5Jt5YLb9r;)3doyyG9xxpE|4e@HZqfRbmWK7BsC29chzU4|N z9xm?_3Y8~6k60SpbGIK>cqw_dOb{WY9GPpg*mo^b2UuB~5_hZ? zA%ZjdrS8@lB;1gIWuqiUNj5TtQZiDqxt0}4vT^8$eYCBQ#Lt!Dg;sxw5FX4c>fF1E=QpnSo*|mbN9jW7`p(UKTlw$T90ai|Ptu-VWF5DU8&mI0* z6en-s|FF7%>wkR$wZ(o6zA*?>iZOZhKDy6Ibmp12McwAA@FqpPPV=rcd$l_c==beu?#WLfLX zY0FbpD-1H_+Wb+86M_zpS*JU0t-jVO;|{gBkrFcQ`f=-Hsu;Yrn!P;*d+W_^@mGiO z-;TwuvCi1U>800EFrA;l$7szRP^BYqu*O7HvC>N8EF$h_CGWGR%YMTu+7sNvydGjz z71eGV;htNeh3F-&pRWB3kE3*4PK^TaxZT5~uM?;F7b;k=Ho-~&4JFXDLe zS$wDXF7CgcAo7W_Kb9q#zRlh236%)%B)ZU6SH#Wvya^RFn zs!ERYzc}V73XR*PHH^TkHgkQZeNZ*`OHUJlcvckQ0uN5y#BO#Kgga1%Ta*TSFjg{( zEP@WnAfuJ4*C!ros4%v`+pc9>p0{IWqL?|En46h%wroSMPezt*kQ24Uc;VJ@ft4;` zj4X3=fw&Pmnn!XJ(gJx_ISPS7!IF?vQ0pLMBZbGc>0+^gyYJkiWI39N_NtZV5NHyX zq@g;lX5&0?N%DhIVG4#M8Bz*IYfLzF2~n)fn?g64J47LnGwvv9c)Oz1E0u}Otu zksBWfR!GacNK>*vdTf+{mNEKHiH=FQ3-;32N9j2AeIYKCM{#NQe!M^XMHFW4!05th ze2SFn!RV`m!Av0QAw!ZN=&QZUxHwYB*T(JS~*{U4z3cmX44iddm}Ivvz8(j1}dAXF&nlG4-8)v|qG(`@+bhJSDO zI2~K$g;}R^Py^6$ZX#=Ww?5agfi_Is3Dvr$c~Z|BJCVc>yx{<0%@=65%#-u+dwIKz zs53ejxU(ceIuW`eqqf4+T3T#Ft+ltC6>P_Eod+_TeQ)zE-}at=)?0@*HS4@sm)0+_ zRdXl3o~CjB1U;9-^ctl_=-d=I>@T3zg*p0_6AFBhVN-cKrNboW`i0nAT4#Fxn-8A(gtnHq9p2#d1kc;K&IW9?LN}x=%Z{ z_-&34-@pvl+`=~o$lWz~1FzsdQ-#iEUKe@ldvOQNx_2;0r@Tn;^w@<0R_~_>=^_~< zmz9Z%>mLQ=CL1IhkZ2g9Dp}}c$Gl8R=IL*}i0?l9IL`d~J$U8|C$W6!In3?37ekjG zMD{SnXaBgD^yDHof3970U!TDfW(w2xJ9x<`#^n11<*iDFEI$H9RRv#QWyqeJgEI3_6&J7Lnst3rBPB!-WuQ55 z>Y+9Dl6Bo%sX>+UN?ZxrWET=v(cjbw&Z%uFtkAlq zsfu|vYI0Js`4|}l<7gIUv7OCq^`^bmj$7$nyWyu%;1uclk{DKtu|&a)Tdp3$v#rBr z>rRln_^4((>ca3%*o|Abo`Bn*i6=)L${ZECL=EXFDK%$_)cf(CO^F4^!e+zAj@=T| zINJ6$d(%*@RkRzA(f>av&CNHv)w`Yd!@?mTk2QRlet(4CzMq~0DOrk*z?NmlR?J7f z9=gO3a>bZ?)G%zkOzZc8>}w30S}U+p9Lb{17kGJP%kMYfg}gP6Ll{1L*eh8TW5)QH ztWSDsn^|zwf$GH?>E~&rM1m9GiZVkv*(0#5WNOlwI>=SfGbP@@j$Q3>;KMI6@>wOI z`)bRNZTqh&Qs=#P8UVaSLUcHQZZm^gyof4!^{c&A?5;+*I{XePi%jZ7Y*G7aG6!x} zBFJu)=I~`&O*1iW43+S$KbPaa-+L7chZphNzxfoNdGJ+SfAHU-(%g&EwLWBb77@Np ziZ)wv7ww^9|5$mPI8Od79yB-bG8wgtvQ9i@hK{8#P4awcx$rT^^e=f5cpH0a_v29T z<5)gPine$NziQ7&yTH^aVQDBz#X6c^mvEG*kY)u^iB&Q2V;0sXc7)jzlsZ!*0-Jk* zveK|kBYeEVTh&x$D;cb->RGl5n2a8?VB8eQ(CQ;CiEgr!Z7p9Tl`7(0~)@LXO z?s1xmCeK<2viMqF-Z648F;gA#{p!;<($$x9(7B$Mubb6j&dEg#sqz|0)UD$+FqJV`hq^J%dM<4N<^C82@JUtB zmOSjFZ~_`9O(}(=2H@b09v)B6l`KhGsc?M{-X#z8 z{5>m}K2XOpcYB&+)~s%1$7y`}ih_LhUhBe><%h9&;t~$5-h~T4{622nKS$@+$q_t6 zA*V$nEi9YILewcHlaP|mXfl7hk4l@+lhA-SWgGaA?Cevg`G7)^Rp3+db>LJn+cf@1j$%^fJp(gUMrl zPVuq?l}lNJP#fW6zCx!ldTi5^qMeDM;Yro*_LmT>RU zW%RtBVVR*llC(^o!sQ=aH<&YQJV)lhdA>$#lbU@FKaYFt=P+A%7Q32X!>8lN@iqG#jbcN1$GMdmo3)mkaydWuAWD*Ihx|5O2 z$R;```JS>&=>?UmzU)>s^Dm{@W3<|JaRifsA*Gr)KwD z!j&DTaqhoLQQSr6s!ZVQM2gDgJ20@)k9)@VqW|S_Op?(#P#?uixh}M)cP2-1;lw1a zf8jjRy%z6xorEE@$vjWvJQATqP<%XEK+hsU!eg0u_Q6sa^OGU2kfC!l-ARbfYcA;# z*h;~!mBFU{rfvVZ+1{HU5nJvTdF$PKi=AKhY^iV$TP@1AXjfyn-O8Jv#aH&Lc`W8HSsIc{g$ z{{D8$Z*6H#2ya_Ag6>Zu82k$ex}GF`RuRQ&eRx$L@Y(~q;k9nkiJ<0k6vL456#YF- zFA8Y#- z;2^$>b7J^pZk&oREm*!ik(D2+AWa17^lvu_r^mCuf*a9wJVDodF&e>1JE8GUqcOyQ z$>xJxJGw}XrAt(#_hVMTCG~Jcrbp^MwH2Td;nylj$zAf2Rqs^D4O}$AKWSh16-v~H zW=5_`JB&4^9mJVtPxArzK->b5yhpRh=PzPzb_e3Q9r$YXvq zh4X~IbT6ZN@ig)gf^P4wqwpD;ClA(0^bk}Wk89o}VdYmSa3S$&x~?0IYZ|!Z+S|oI zjHqzJi1;YYQK+S4&~>qbC;#Bj$UvY;iCc%RtitH1nTB%mN{U>r*{s?M6D@`2AFFXnHE@nDUkb-%dEcV* zR3m@o4yqPoKUD}hZrNmN9E&6D)@$s%X+K@029WvNfoE#gsm8|oRe9Nf>hw!fP?P|Av{qkNQxmXmNjzeogI-jOleIOv?mxA6QBW{eMXXWDv;{?nfFn9B4T z)>lC)l9;=kMh9&eh16PUBt{pAwLZI1)hk0$QJ_uQJ4LTYE?XDZaT|IB-2w-H<+r%m z^Y;PIaUcJ3mWC(?u; zZ`v2o9_aR9t~rBczCodMVMWT^gO}(hDOq!sUXuhJI%P|ri-}9nDY%qJyjK35>r>g> zriI8qC3_-qKQ&WWUmha%Pd)AU%xa8^W3R?KcudDzd9ziZmgvSxoSH<(Dw9+!krHOI z`!emtxx^*%WDksf9K(0s-@e7O^qN}6c=lDy*d-zQPo&*|20MgW)H6)EBrA`x?8Ci6 zL~%X*FL3IAbBqXx}`^b96QvCWidXa-3* z?hqjWA7+zq;$WuI84n}$$K3mM7? zI1VUo9+`6l0@slWYM`97I%j-_xT>(Ver--q{H#omvEo;7A$blDM91--xkkb>)UjZt zN-mJKu62SqneGUz2smq%pHr+QGPO)Qz(`(3s3j*^sxfkL8ogq*S|VifwsLg*(0K+Cd<1BkBe1+LP8$f%58snA%d$0{y5jgP6)ILwpgxI!NBYot*5 zb+(A|WCcC-0dy_)qmY!*J9miYW>t+<9*Dan_v6u2Yqrm9c#M1UJ_e-mIq9Dlxy{TAIsl_1*QyZhP9> z*>2Avwzv0bg}kE&o`Ct;zmM$xM=6d%3+{$4$lxkk$xM=@%WJg@ZHLh%|Jqi?`w|_W z@l;l#%c3}~y#&oJUKEH}vVDzX*Ovo$Z?-d$$=CU<*XV2SK<9xz0Mq%o@nfuuK^3eT zfjs9F6y{_N_8ejf83<%-6l#m)?_6T`y*u`_PnqkjG3m+-1)OY4vFdedciPVEXYct% za)ry7Czxvi4-NhhmWLlh_A~cjEO{J@wI^_P>Z@4z(JR>XCi#|E-$XTYj6ta*-e8!q zX{C{MW(OtbAc<#5X_E(9ULc{iN>E;%{ABWtvpU|a{sKO6;J-!Qy+UX1M{sSrHA3Dl z%G@aO6^0a_?YE!AA^birAd`%KNeGi9E+q}|%>!~MTZEP9YeN#GF5_JsuYUr&hJP9d z=HI~+m8bB{;Jf5al?c+Tlk(7HFcbJ^6}Y5cC03AxrG}FsMqNjNIh*>NIU%UgP{=cK z3Xx@mSD+o`tSx1lx$k-&AJ+f}wlxO2a5?wDMK+ngzBQ-(8jrn53pB1NL=;6maOO-X zXR@@@v zf#&NCjL=@FSyRmS! zin-qRkxi5L+dqe_Yf)IGY)@0n;>zVQ^ek0Kq2`i+#s+PX(9d!*ipMT|0w+yc?Xt`t4SpYljDijhe4-zI7^&t@q+B@_*!jQ&_1cumCMc zSec&eO<>j9s1+R8?0Hl5GBVHE>Hgz)Qi0R5mU7KExHy0OPVwwpR(l1@d!-!;)_-T~ zTi*Z*ZYkPZd#1K^rtPWDk5a*|IV%f<2Mz##lP^#GAHkltGuZ}8fyrW z%Ulfncna?2f3N#9vtp(ApV2Q`%djxl#m?vfSOK%*wToygRi9a`ipjTNvmH;V-4PfH z>$P=f$1Ur=LJ|P$$+dKTxTKWW%^&tuxl>D#RRk$nj)z6IC@m2qSSPTJWFi+yWpxej zX%8S@HYYt16uz1#9UM;{&W5NZokOu26mnmg0MofZ)aP(z*J<)lb6g-H@!()D;<1NN zjUU1cd6LUZe}JCFy(yum#r zaN`vHECwJv_ zo_arXcN+>wnUD!JLyGowoLKr2mWpTbOnL{-$0uko@`AgdSPTtr{wn<0 ztn`>ylH)K8w`Y#(kQ1Kb*k3IY3a-XRi6?}*k?)93#=Txsnm9$mb93hD=I_(MaU7VH zZXh(4fjTjPLeN^OrU^{^ENrTo%Q^cu4gwG;mM)~3YpAYB)`;QYHhHZ9zu5S$DC))I zlU4M4L7od`W!|6A^)70A$ejBi^I%OPSUm+>r!gRSw|Ds0aM$buxODbTOwx?1#`h4c zydOK7*Rdx$i}GrU$<-66&OM52!8a$hg!2x?qVpjX zOOlfWga_6(J3iMVcb<16UAg(@)bn~>W^O(fwsD+~X0P=ZVsCjoGgv|Vmwy6y`tKs? z-bo&-cG=Ci(x##Hnb!03dz5e$irT7ErJKt|GE!)_EVZM;YGr-!wk|ta+ZlhYxr1nl zj`XnfL0xy1t-dt|t?bVZ2cxAR{4M(sxN+a%Ewmcn_pqoWfIz*PE)rnOpd51(Y8wjc zQ$cPw6vm)XjdWBBgDCY6wa$ZSxa8(@&>C31ZeJ_g_NX;Rn>!Pb-yOnU+G{|rySwr| zltw;If@uYpDi(X`Fte2yjeugUf8lQQj{F41zV_2tnma9Scvvox@FqbNRFH*bB-{$D zuuO_!8CkSK5M`Y_1$r3VN~||WUk}hv_deJEd+5bs4A0(AUT=mt;lkTm%a{~m1}VYw zj8)wj#%C}_3UeAC5dN?tC2&SOSv5(mGnc&r)4cwWo@|}G^mnkgN%1cG2~1}H0-p$n zaW$Herh-y`zzI4=VN6-uzTQi1YcX=Pd`77k`C*A6z-?6<>bbI9=OiAk6D>5LWDZ83 zw|bt|B^xPEn3p(`j|3}^PgE6s!S}lt#4Jb46SZz~aeh+h_KBU)YPyo3z)eE-R2ktd zauu5deGO_cvnSE0akj1SMQUje8k!K5G?YrP(4;Tr8e8?DHpN&q<=P4lyrKsw4FJnV zBiT(_x!WX5gpoo{*ps=KD|INdE^!%7nlneYnt+^OCPoR*9ivh(;NuIkR3Hpmk{T*) z^&BHrsN-a4L9pS#F=U~0WC*yI4J0xk=_f@g5Of=D0#Je&B}Q{ns_?hA7@cQY`;r;6e(4??K5}c&#SrsFEAKoVAS;fqa z-MC^tL38bsSm;~Aj`}Fgs}!|x6^HBnSc;qI&id&0C5#pRGgkKhD|F2k(8Yn}qW1qS z)!v1fVES zwrn}MCeOsHOx%i7`R=_K&0n@1M{md^3AF=<358cvMV>;)VY7W@x*oKdo^*%GRRD6r z6?Y8E(CK4uw%N6xuh(bxRx0kMBYec$<|aZ*xfTg7{rG(-eEIJn?b?TIW{6PTNNI%~ zI-8Et*pa>rSJazjf+ne?@uc_*s)$98@=&wOkr51>bNqE)cC^xLbyognkCv04z%TE` zT8+7CMo7ENrG2$|OR0K;%#|gsiRs7g#R4xeE%aLUladW+0#Zf1RsA9ZY9+2$gckFV zy)Vg61T4|oi=~L3g;_+4zNdQ!;@bM_6D&l{b9U97qOQvZiuewDnnQd3xDPic7Ey`7_I#q+&K3iQU6VDw$45{ zU2Ry`(jKOP3~0_rHKe3%vNA#6l^k6?7JY{(HZ?-yGP{EF^?!xR{69nKgKkn9-3Ymr zSEjiT0erEO`rW+R`mvkLfghw>T|kwhtyOmiYDz~AF7_o#`ia&9G;y6Gx?jh?z~jkZ zz{T)mc(8E_cf~vL2KgmTDW9`K8!0SHfigC6;!qZA>5M2*cVWUH-Ozek&K=@c=ECyg z-R64jQstvzcwPUtJzscE#ID}8>7Ko`-Q@X@DMa1MB$fr@8@;Q71=R3oZePJzB316W zgM!&RjLKHxqm5WOfH@JUKwe%FDRRaKVujUY<;A%q>=JVgPabMhfQX@4_T=a@p^D`( zE{ZZ_)+J$e;`v!n&|7%BX>KxG6T|kFWLZ7QByJj#0amcu5=bhbRM?4$$yNxrk7L){ z#sw)|WPFi5)-cokIgzViy`ic&JVV3^i!1eIL>_9Pi;E5Dd!%3seRN;Fxf%nJTYz<| z-4)mau4RRL+EBDOJh80ucC(@Zh?@V-jOS~_`nCq z7E@H`?-T^6P9uC^zJg=bPvE}`pU1VujbpJlZDy?H!h`jj#AHLq2GRy%eS9{M zAbiqPXid0+xy_bQb#qv1EbV1nzx*`6nSTV8qTU~(#qp3xpb zgvgEtXRQ_-|7?YoFaM-DR2Bi8qL^#NcT90Fp4eU8W8_qHbmnkfu$p)ic`La|;WPbL z@)>~^X@)0vFrvh#>HYp-5DR+-(R=B6G@kk*`I#39WIc)pszqGu;Zx8Ea*xrt8GP@Tiqd$@(q*C6cE~Bx5JG*f)%uE@fILONIq|v%k zVK&MXij7>DB5G(!Nzu=Ghj_*AnS03J&wV~l6zC#V9j@`ig60G1>gPIDXPEK-ob*&s z77bNEMb}k`sSQgCaWmB2jErRd3hZ5CMZri=AhAm2_BE2v$BhND8Yey#v{8G?r1VCb z3dGEORwPFwB_*4X(q;Z(QXWmNt&NTIaCPk1>y60MlqU9}rkP5PHYb5Hl*>>rE5)Xk z(|8U=PRfd;1W3ady6!l+DiZ@l!p!V;va+Ld*pR6i^@D)!vB*l58)xxi=`tu$_^8mM zoq71&5gSfRR*dtUxr$dESTnh%4c|B(6P8{_NUt+UOL6e`Qd+3?OrF#aj zb2P`-C;xjKIQ}vYU-~iB7FIAwbBdc3j1Zh$jOWqcMMA1Hj}v52muh=3Ir=&ty1E}@Gxy*ZR?g#3E`0|#$;*xYTCW@JdgpaJ%5!@P zcKu#a!2xki$E>v0o96nrHmxG>BL(Gfz?xH1nNfwvu~yGf?CJfPF~-MRJml=*WQI%l zd`YHCl0A?jVH~+tzn6>ORpBZz91B@)Fu;mg;pz4H$eV9=i&5B)Lfn2H@$D+ut@q}* zQ1sMZlppyK)M>Hhi)WB^@1-YK72;SsOd~*RJfqNKI7eeV?_LazlJ4ZbsR7dnvVvug zw#NK-q+pZl^lUlCIz!ep?ZkDj;@(!>?+vsonjJr$Tu?hB*tC!j+wx=s_k4Ybz=wdn zVinKBz`?sdL|}cVG2ufE+GmsatIsTDnZa-{D_VvUIpk0w0VhAj*G%d6F7bLf4AMQg zLkso&B%0EbT(X&~i1ic{-iNmCcmH=NpO@*VJ8%S7$vYeg58=&$8`yvLJWee?k0ZN2 zgLlKzn4NwQ4=yBlanB{x?3@x&lDE2}+>fE;8C*a9B$BxGI}Hhlm98f= zzNBOW@+?wI5AeYL&yn}FNZv>{%*Caa5##-x4)c{p z;p3$GCs8%u!!^tK#-a0BRS~zlxaJOL5*{N-l;X0UJF;hRBRGPG8g=Y0_2PUsN5VW4 zgn*NNMB%ZPw4Q**YGSz0G|ttt71*DRin=~`IivGjeYTU7U|HKr6YwUrQ?p9%7-%Ay zsutI%z}-P;+TjObAT&Oc*+`-j*T2RtyGqECT#am8Qmc>G4=XYLJtPI2$C{lS5X7I< zGAYH1SILD)Sdo%qObVJPMF$T!c3LkA^1)ThaTtn8hQNEGP#066TrTAyGlu0??l}Uu z_c5tjqoqBP(=PIjNSVh) zD+Yt@&V|^`P~4SJSQuVtWQoQ?xyQ;i7XpaT6%7!&E9ErhRXYC)p%`_IPcxer=WPu` z*{?E}9bRGDMJ8imBY&C{|MgkahXXwE^e#+adJF%0@C7_`;3@Q8eh533&eOcVjKSgp z$`z6~BUL6uMleFbj~+rPyK=13JxtMUbMfHx6d{%~ccGLYLb9@iHx^d$-AiA^^1>1} z+uC}}{nmm5;S{Xt*mLc6`@ZVd-;KB(T`mIEc3y)!y_Nb`{}*qaRjTdoCAyF#S)~K2 zk%eeIv7!=FWUds*lYO_3<;XB{Wqwj7ly!Bx+||do%YyHjVmmzDjW)aXSF`r_?J3yp zZy%*cZ2Bm;|3e253?3jz=@fZ9!?1;2Wcd+1HArU~r4b_UDLDXXloOHz8jxZQ-=Uuu z=m6K%lNAq+!>B7&5)zl_#fo)`O;!jL%&sm&z%8$pJz7?{4SnBuA2V0C#KXg;9eCV@dxh$SpOaxNnun5md0{Fq(^k%=;l4P#n&aUwOQ1yZyFgEhkF?C1T6>zBqQ5C^V8OFBsJlC< zlLwp7^@I}3VedM3p1zRwbBCU0O$-%gY|{8Q%>(W~m}`S|R+%W+&Z6A02uu(4JcoOScN)ujIOp_}Foiu8S^t_V;e!^5;%qh*WX zZw@^UJ9(6z%Ujq@6N1ZyBR{fvUy~GyV!dfZwyP39O4YfI<1$2g zybI+|9Y7ja&`9dYisWe!lw!MSB!+3>?CM57Tt>DV3hj_H8ht>&ze%slkg`@R)4t2A zuytl9nkGwhj^I4fzPXFN3I`mEO;)JNH_Xv;+X~<|^(B3}R?s5-H%_s-`e(0jVf9%_ znFds;O7C)ar=nOpAY!SDbZ}tMpaZOJGRiYWa5R0dURjdZ*;3!b zWQ7O#(*Nzh#DD&K{{xN(CopyIdx+jYfk$3^7%$!THS!#$=sGi8r@6d(D8Y&U`+NA< zr3M!NG{E(9Mbzt=KySl)6WqPq;=a8Ei`{FbotYs7DVw)={a5$W^F4=^-V)B%|21|V z`lpCqBJZi#EglaW07pQ$zp1en zjs-EFYV_YYPT@ZL6Zo$EPq>HTjo&WDf>a4%f_2J}ssD^Bb*}%kQ6TlrpKe{VL7GWzte9&5xYSJFb)E zV(5&CB52$KQnt-5x_5<)<5=04GIo=BhO(07vL7Z?v2}4GLTBXXE=a6d+L{R-8;z~X zJ`!gQq|Aqnq1@dkb7fmc@nn2shR_jdmgrf@eUTZ}L-#`PFxUPvc}0cuXz1PoM!9B4 zdCo$9FK`PxQnFp-+4j&g>m@}wO#2Sg2`O?RVHpxXm?5Ks3uZ1@uBtbnuL)2#L%%N? zHKG`*@1ei2AHVfA+;M*&{!--$d}ZYhjE%oT_Q5jh z}%|U!d!pB1Ic4QjqekAH=^}{7t-e?xnVX+*oXGymct8wWT`tR^P;jg@`-1 zNa7vhVft#pwZJIHO&QwAY||;t+$mPQ@<=M2wJAHtX@pqYdaGD7Gd-}Qx7GGs{Kfea zA&w0PbUxqpu00HP&CP_Zh)urk)AgIhRy%Bmn)uI3y>7N~joQGY2N4|~#Ztf}A7z41 zNTHTW$otE%{iJNiD6V&42zH>1aDv9~EIk5#(abj&=^zXA6c8YTATy& z(<@o|j%#$yUa-^*=9)WD6i=06v6B7~ODu|ivhmKby8_MEu6TeTv%&VjF6!+r+4o!| zwp}A@T3PjckDZv17;J#&pul(2l0N?z3|0e{6 z&*9MM%eZf%2ld~28t*>z9W?h`$4X_HgnS+E(h>U)SRDPUtN3w(=1;I%TXJENqO%;h z&ngMd#(0SD{m(m){Qg#C__1; zpB$s)D^Id`(?Wx!{c!mpoKc*U0x|@xM%<~eD^R}gW*{X0 z1(Ij^awzdt&WsY)r;MZ(Db*~E$asj9WsD4AlhKQVp4=6JK2MSo)ITq{MZqq9&D~Fd z;_)le7LVDMn4BS@v6Hwn8BW~Km6@OjhnD%5G*g;Ck;GOx!K@_4MWQs0;&^D?Y+TY3 zpNR0>pk&3>j0x$Ac^R;AP70V4h+{%@*n^F((41MKaUh5|nsbVkG-fY7j}iKPgnkYX z6cCYT$zJLOT4xvO=SfZ;q$``WMp{m+qMgN%_=n;QvA5~hKO`fq@V#*ye|s8#{m1UX z*u4+nx!2C&zy08k@GtKv;Y+;(xQpc6&RK&#GGbPHEygP~oJ(r>fmc6|e|~m;mrxeX3cL~>k+g4bFVw9%YAEu!0j>}-GQwv(~5q2hF6||kt#&?E~Jm9 zgA0R5NvhrPBD9;+>5+Veo_ek^Lm^h!*a**@Gxi>Uj{`w{HekELXuVqe_pgOqBS#&obBcK0AD+TF+p?uH#46y+M8 zqt|8BMMw$n70%je0`Cbu@Bh(<b)o(t94|+a8b>~}X9GOOO zXA`xd4ChK2g~0+`rW<^igy2qs;%c0zLLN{TEu`_U2l%aD+kyP_B@_z{96NCc2UZsG z{;7UkoBb1vjP1d(yM6@ur37IQ3HGH$w0jsC2eWI0m1~7Z=xX*zC)pL86SP9Qld_5I z)@Guat|+=10`BTFOZPlUF}N|T1ZU7|ixS@p8=1Dhi#0(^Dh<+Hsrq6~XcDrANRbWp zxTMvqQ?!156uePp+hh|hab?k(RZ8^<2cNo_tKZvs(XEmlo^z?oN)DmWX|DRMW$AIa zlnhzvl*FZOfXi|8J**j$t5mK;Woq`k95NS<|P1$QjlgzukAPO{y$vDZl zqbX+w(1F5=w5`k1vW&jaS@H##I+zrM!x6=BRWfzcggK#W(!(_;?^gQaGAPeoc%*(- zadz$nD@;u-DeRpSH6EC{vTn2otznu(UTnQI4@j{Z@?f(bP57!X1kABkLP!eNG*=@g zkx*J7#Y(8xAkD+kgnMooQLx-Vp-Rt|Nz&dXqv|}JV(n6vs8>Ce|lC(?)M9Np@?c&Ra&>W@8qFLq|v zQJY)Fcr}-p&}fN^$On-2j^NC>CNA7Kh1L26$#i6h%66#IRsc;jtn<7ab3~`2^`5LK zTjPWQ6e=!>XwM}CQ*dw?f7TnQqGd~)^F^c%Hn0+JV$wj4tJOknY*%CtAhXK(%C&_4 zY}S#RGpsdypdHlZOPkVPucfv%57$y=_`K%2`=qUM6M1(AJ%l+jOU?dxm&AuT_BLNT zin)QGL(dNnBK`mTDn>s40bYFeZz8)eh+ugI$F4txr56V<9$v-b=oR$dKaPq1Khl6qE*_Zsby^u z#tBNCoLn$yJr({|;^s=jc9!dCqXIuG#cK`pr*X_q+<%lqq)h$D-RSsQ86M{Tr6DWY z?m#lQQzmAJU5JZ`9+=duNs4uqJg}-}6h|p3RZ^~bgVrN?umJ@U4YOgT?7f!Bi>1It z(j|z12}^XnLv%k)6qo=aX`m371!k`0oLESPN|b3SlvN^^AaFmqoRKr=c_1V+kVz<5 zd!`OKinWUm4KR~vus6(XO@ z`O{5`x4)siV)tc6GWq$raXH#s^xoU_`$c+hf&M1o28*`cqnDpgOvZpuUKRAg%_w%b zBItVLwZDVz@j<%gdoEoe1N18Fy#v_wGY9eVWEG1O9KNb?!&uyiK7~VlU&79zcX4(6 z7g4LGx2Ise7uzA2joE1D534-4e*|f)!$j5WhBDyfV>`b4PG_B}7opPA)u`vm_&@W2 zS~vNblUV9jjct+dbLDJq)jswyR3B$eT%uEF(v`n3F91XFwc5U{zm62yhU&GYtk(^4 z`$o3I>ZGvMb~B2l1{Ll`8g)>fmsPrHu1)C4`An)#l9qlD}c#MR?Fv9sB zMDNgdUMHdUJ{@b0nGncIUb#VQ_aw%8UPm*W!)NXvBbe!9IQH~TJVv(Y43{MoE2!*v zmOPLaEsHD|jM6Bu;^icp{#-*3 zQma$xbt5wj92I0(yoIwuhV7zw|)ALGxw_7VXjY)F;=TPu$=rAbp83=u+RN6{_D5@&-k5Z?!?K$ z6PS6O45sNK`j$&*P8>z`t%pcpjU%dDLxFJ9a^8*k-a+yZmN76)&+l4{(Y;4;@Wvuu z&j#_z>HutM9J|iEK^|!tiuf0Rh4g3JTR6AtYi=2S-ejMa*yNGjYERvn>8&%;!$iU zRiDrZHgoAk%U)V$mFiGl7VPHdIkM7kNT`+>T;Zxn+e1z{Z5dnU74jP@kYwX* zMTUjB`wjiHT$V^~w+$0fQiX_{4-oQ{HO0_nG6^811JPk>%QeGio60sMu$f5N7{t7M)Bn!v_Qzaz)a)E_FO%!-ymWGKemW0aGaOsg}B)Z~%SC?*`M zZ4gXGF)>a;3AogZGd9bplXPPa*b*l_@#c|l4lP?Ig{ZaiiP!qy5o{|@w|#p<1hn?h zzg;*fWFVYC6UQ6}E@FrT@9sPhpmm&t^M&~bF@4W|^d z5K7~BAU{_|PdyVit4y)HUbBcnI_1y|$G>)?`Thv*D$V1Sg?{|U@*v`s%jmDZjl$Ix zr1$jWV)qdgr|amw@Df&L0=!-QB|P%b&%wM#O0&=h(^y)gU^%lHhe`T&(SW}D013%o zf%aP-5Pu|GMn}(~AiZ;qK$&8^rn+vT(6~61 z(Ux$mz&P_Xv+zDi!71Ae?a+ek!}7uSr=zv4@|>KI^h`}mCLzQY&U?)i&DGFn2&Eqk zv`r=xOvDTemo$4g;1U*wPRdL@sBu`PeQMS?*(nstz+#hKUOHHtI%nDA4Y`4CptdLzS;SoE#Yvu7K{&UX zxs_6$C{}}2*r813n5?Wr0~j{XwLKk|;BYn)hk?oXEB54Cp2L^fMQek5$0jKX^8{wI z2TSv;$hEH|3d$>_Tm8mhHby5bxdzWsD}!8)!b=Z#4b+M zl=!X(vy3DGgkdPw5`RIc+KuwdrZ(GPNIE>(_FL#A+Sqz6BN{GHakKi@Z6jv_5UY@~dImD5Dd-3tR z%h>NRDGuG)hoP9$ikY#A(`>lPtfB5grG&+kAuhf;jWe%Lpu2h*2fqD1yctt$ zcW?#+(^HsVX_A7>Q7sg3VR#hp&kc~Go5D~3(C4r)8{q%-cm4)mediSZ^wpPelD**i zEcB@cEknxJZ2A_2Ed;`Ovc6ji=XEe2EL*&USc|j83YMG;QnE$_O&44BT(-j!RLEMb zB<&Q*5HoZDj-46$a#o|+8kI#jGpwAG6peZZ+U2f3cT2Xs^`w23YkiF$t_9otIptxS&*a0b!>-WNaRxuk;YEd2R`~(D)qQeDppXsy&Zq|HFHjtNtnp zn4P#m*EDy8ptV^7!LvJ1YVH)2=Q_>(3xy2h1eJZGl3@4zpW@(UGJF;Zo}=fMkCoBA z*udZi?+^qXNj#eKAg*5cQ|unS4|@(giR?6a6YK${xr9;-Ynk2j+Cy{cgL(3l-@%*t zuR8q4->dg$W68Ky{iP@pBUYn0AV|UyibGx_?=5g@viiS>t}^0*lO|)%Sr(qEPHzTorZ!W5{GBXMB%P*9d&#aL*(QrCx5*}{bM{|vy8^ft-oknh+#uOn& zol?@~VY7>jK{5eJsdDhbkdlohQ;PYD`&tq;C2us6Iy5>?5a{(5)Wb%NJ^GS>@s{RH z%nDaZduq~whpmLz&B-)rl7c2DhG`2!Cizk7Qp25dGA?VO=x(H)a@b>!x=87gM~;5Z zB4!@qT;S-C8L4QA#xwNnCR~XQDOWD7;SAz#8gMSh;a9~i3nuMkDw@-DA6Ig24FbtY zPYuvccGRM;9{PJHz40L3-x2zGm>`ECRAv^5M@X};VsdmGyOSb{pD5s1V?XK(b)1_&(~_SzsmqPL z*PD0T)^2(dtydn2mqr$@bsg`T$?t5zCuyS0BnGW^R^I#bFt9&-r(!eEk{(Zj z=)G94gnfArZ0>^P#`Rew3zO>s-4$!=yu8D+_M2VzH`WZgTEknbMehf%SBUur`+c~r zee7sY7b<`44kX-XH0np%M@wm-NCJUkucIWm`q+vcL;TVZ!mlmDoV$$t>{~cQ9?P8% zKZg5uE#XUl{sgK!W-vT>8iN!w>=Kuay)iBbr5U`qDt*1qzdDF3zn7r*?bk7S9=1d6VsUlt7 zsDjEub}V(dmb{b#2`|p#jKqUriaA0Ym^;=^V<#CmT(ir~x<8mNJfk>=H&VOkw{_4aMS1n9Dh1Hx}cfhdhZR)dWK+ryUhFF^s#iEUm&WvGEy7vjH|T zw8dR4gcQwx}xe2<|2S8?5*CIPxCIsd66*-(gF zxq7@$uZEJMOJ#z|dA(L73>1;~O&(cH293nvND=!=0+tmF6^DTv<6L-t8Ai@C2TD5x zASc9um2DPiou=cmagcI>lp|;E zROnvmXTs$xyX7s_sHI9KbW-A zFo&rvkzw3LiZYhTZn)XF>6ToAfZ3l|`4`cOKMSw8cE+RoXT`d#nm1w(HU+s(G^g2dYc70gXX zRamu16SC*8-bt}MQX*_kledzNk~c9}K{~cW_6epEl)kY{F}^opuB8~J$^WTGAHxa4 z7l;1BIG(zzjKSuMC~-kxl@=7I4ldK=O9&3VT*Ikfpw(su@%ot%V};+vuD5RBeG-gk zGEFSh}2QYT$llbrd z`rpT|eB*0)=iG}DceBn*iQHXF2|g=VtFT_~1}1ROGJCQT&xtg-rHiC0v&Re@&X{Cn zO9G+nz7Ux9WDQ-aC@WbB#?iGi{Ttm}W#DeTG1t$arDP?ADr!9u(|Sfql&^X0o^@N5 zEq9vjCKIN}DyMcgR_)so3lj;|t&LJMP7-S_l2^1q3NyorkZ~YwxDZSSBhZi zu|V%nOA^y6sq-d%k~rhRwg^l; zW>i22n=t)Gh8BIhBt<`3LtL~Rn7%vtP1at8tGi`$u=>! zf@2dqu)5}1VTgLS9^AGPmuH14%>jb;I^wKl$qx#gB4rNb&_zB1R|Cr$Sg5|(Xr<4% zl^d7uaBtLZ?GGyuakoO)b)yDZfxOqO%Gv9Lkx>jbPiZYu3^pP-ILy1~9HhM)1jVPU z#fBvIY8xd%IJlfg%7)@h62F+YI1j2MR4ej+RMKnZoS@K6HfEN}2!_suP%+e|>zQVV zr45eLredT?8w7CTR>0mYXAl=u;j)sYi9zvYhKa2lFXECVF3Ta8G<2<> zIg2fJ?rDS|>?8Dqo}la5H4tIp z@P7PXjy{3fyZ0e{XHe#e5n>KTd1wt#5I8SfLf&%)W^@+Gv01EqW*L=~9EUd&+)oo= zC%qQ?2JtT+`iBTkJ%D`VS2)1}i^(E_T^G@}Vz3xD(M9<4;T?PN-nG-%SkiX9)6$nW zenhg|n6gm^%c383s8)=+2wTXjwk`{Tlc!fsu81-*W)8^PNL%nNDg4SMO zNZ;dltI+)$?#(F8@LI#b)*Q#!(p=w3#O@B(l>TgShd2LjZ%1`*f7_nQzIiL(KZN3+ zJA`V&iz?PyH*gQeK4g0+wiEOse32}>Kdd8v?j4NYu?q(tAHicg%XsoJgNN@gV4#cp zh;b$lt(FCPjgux>ZQ#a9`t!|EG^Y>a<(^q&^IyYi?GkQ`XLyBO$fgmVQO;@lTD!kHHN#8M6?@ohMXMH_-0N$0x22(+{rKnCzG;EwfT~@}8Z3 zl9Fm#lIUascVTp?jM?QoNJuS^V&O!VRf6{;CB`ao`?sdnljk)YOqK=mWUsrH&0>ic z57$|8BMgFFxvL;Ucm*;Nx=4uk*q!KavLfxrkR8GR3GFh)*vdT_x+sp8kRjC|4=1rT zQKa*PTvTz1uCM`3QEUq2+Z5%Q!}Bt0(~hS6Ol74dF0(jwK8l(cd55`SWxeI3V&@1l zz6-PTV(-h$MkIM5}e1K+qaOR;0=iO~7@~VT+AnVlL0I75>RgM2gq2UwMkAyNLoEew7y!5JdT~lD^h;K zO#y`CzZgqBZPn36MhdY*={*xj@fCWDzM-6|*~W zgLTtQ^QbSAEaIS73I0P?=u33}jYM$1|kTNKiN`aMybK-kX<7>mbZ{MN{i8og#r*P*h4GfT%{R>b003N!~h1u*NYR!j{)L&q6Md;oi zqIBVhQND}9WLX7Ym^^`t6xv#C%zMFbvje*3r(O5vc0AFIx9xbaZ8WsKMV-|BYdu2O zX3RAMh^>~oXD)4o3F-8qE*pLvYL_7cT^NC?JdH()uTf}vS*C8HhmI%p)`bGC=!G>hKr zWXY1Ez5lYo-=gsE)YJ;T{fGY?`-cwU!NW)J)y5nyEG}zo&*ZIWXVZ^_Y1@<5Cvht1(piT^uzRe%t1#A ziAy#zLojV#r!h^i!`7vHOHQ6kR_#I1Ab*sEc5gC@fo6mXmx7Sy2x-2Xj66+RQ+0xQ zYxaWlcfCfcw9cJ>$eYaQUw!F)82I*Tu|mga<4}Io#n=%AoXEc^d_j`G^W1r{yeGe3 za`&$5oFcg-WJgKa9>kGs4(Gx|i0ipdJ(vDRT2m`fBL7EgInA|6y^^8^V#G0W!bJ3W zk}6vfBQ>@yjHH>R(G)C64B}p>w11McYYdI|X1VJN#}-0PSjt4{vS{-0Pgbs})`~Hq zE-6^Lu0A8lU)%_QodZ_(IVqihAY$Pqu2KxP*-e7IBJBiC%5hhQi~DIVl41?}>Aoof zNl1c(TwS|Zo-ds3%jGK^(y$>te}b5!Le|RIE-;rND~qOrF>sCwuVIm_ObEQpl+^(Zw~xVu)R8RWY$JcRbLaIZ|A@BR zJKWm6!~G;&|I1Hcr9py{GZ#5&Y^X@^NiVWHXkpJqh`%|5!fWs2v-_UH9XG1@_%l^} z?6X%ZO|*%$n&)C0&ozn|A{L)u2+4mZjdL|I} zaL-SI`KqMyRtbq%89+Q)M)B$}`WCxzcx4sAGI=TFDXruan6p#3YEO{@TOj2DwXkoTU|so*Hw@I|ZKrhkmVR|;6MzVcHA&PL8iiNw zWhL#!6L>`A!A_BYyn)^L3Mr3Y!;`f>JQuABCv#K!5?M(M5+Vhz{S;(Eugqg(5gS@; z&2j5WtD`FvjFP}%RS6p_S;}&6fwBg14}!=Gh8#{gcZwh7U9_&2R3Ziiea;-KWWIG@HBIukR!WjVY|}1+w&@GiZWJTNU~7mK{otqv~NX|nAFnI>6~i0i#}7MjtY6K%&Zkg4LK$g zPefr;!#G(ciFI+vEL)^J873}i9V{EZrY{h_<)DxWDipE7Fh`d)Zw2V$7%bC~^E&6# zO5&NIE09vb6{%peWFBhv{!T`oX^ieQnw&aBf3MQ-JNPrYpySMwyf47N*z;ouPyHP3 zAA1!icKlnMI5LOpc>(Xd*N^k#dk9V^gCrQF=Y9gs-Apg_I+|Q2RVJrmd@nf@pFn)7 z7tNJ1EF3tA=N})$C%$t4cLozUn@wSS=@6PjJCW78aCu}A55N5;dT$)1dtbpRGMpYE zBl=Gk2eDG0ze(J-}`$*nO-LC7n36G99Y3C2-2 zwgiw}JB;f**;^$!t^e9~w(UQXj=ed<@kk#A{`M!avQU>!8@5QEE8(yCe!7Q)%ZNUh zNBCNR!><(arGro6NcjSu`dNZ!cU7?Rtyvw-M-AqGJCRpymrbGCn>tDuD z?-k7TeiK>G+puS1tS*hg?jwQuK$WcHhOVwFWGRzEG*?q0g0ikcD*I?UOp|sx+xjT$fbNtPChJupYnNx%;R7=~#(0zWWZg_3z<$Y`t+f;^S}Ha`XRWMC_td2dUBg+N$2(-{e;xzx z%;V7fQ)D2mAnRTwZ-K6Feh$F|!Ti%~0x)F$8eRIda3@_PRrNY4qRRsAR$CRiK8x9i z*W(7mO<=t`?e5}xS1I|ZmS8~?nQt|(>`m>izU`#0+^ramsy3l)Pq}*~Xs0WBuBaw_ zAEjlw_UG~ManRm}yX;S+Tzwrs7Ea0v@fhU<@uaSqrksmjOXaYLH z2=64Fh$2D6IV+*E5${jfoH#L#Vz9w#fnZ^Zn{vVv&5@iS;)t1c31vXa9mpvL8`Dox zwl<*s3Ps84W!hL)dTF|>8QfAs#0>>fkvE)>$*7Ew)(Ke#ee9~jjM^D;?{R@G+*RQ- zwmHoqI3tB)*0IiaL+7bP?BS9pOI~bLP>7gaO)k+1IR9!OmwRJ4ntMhEQ?%a{)RUdl zQXQTu>?}83<9R9EvR1+|!u1T(s>0)%b$$`1hELO*bFQ-wFGH?vU+6dZ-yV7Zc>hcI z@uU9&-IW>C$1*%WQNX2h!>BIrA_YrEE`>XS!fuQV{#(>feHZ@9}C{VrN)or)cj|$a^)oE@2BYJn7SbVZGq`7v%( zN?z*#%oSQ;BNR{UU4Y$LgWcOeaDasBWfFR)>Dhfi3-lrhX|jByhHq1bR_O(MC5dYj zm(jJ@NgAzj66e!O#Mms8-!n?#tg#TYpU*MAGsk%n5FaB+__xS{euN(7H%Ne;fo+9E zS{liJY~4um#8I% z8RN>@cr5>9VZ#?8?!+-1AXnfWyCh0Q)tdHyfou2X=;!5G8AqYQ-sTy+O#UZ%c6kvy zuVm=I!a12tQ@9K*gsYNTT9tXeLMOjLzfaRRo}qUZ>GOt&wA`tk%+0{SDfc!it_G~) z@Nuwkd$RNUO|;wGwJG;}>jRz9LTb-lzY)#L`sz?$w7|gB=D{5j3!S;glxns zNtbANp(gUn2eeMlj z&9xWrluSTN0RlyqMtoZ=`msoh_M1ohFmdij@W|lvcxCc#+_C$+n3;%i<-$HR7KTZ_ z4bZ)p5Ddk5!u(%J!5Vz>zk3vSK1m1ILl@B?v+R`wd0t~#?; z>~32lZg0o!sNl^`>(^@7UFiNNtY8b=zKJJ0r*Zorr)|g40>21awz6O5Mw_*-gK)iP zT;N2fj`Sx!N9YnOjI*NPj_AFJv_naCDmRJubiAu#<)*vBT6Mqiww8!s>+SXwY{xlz ziWvBdU!jG*56#snA@$CgUgbU#PW>cue{Bwx7ZUt<@Fc#{w-b8?u43%W5_XhGVV%rT zqSbI^rhuuFU05LacVgmheEZs$@!IvzU?~{EOvo&w^J>QO9Z}5B)XS13$uG>)Q&?c_ zlxdO&L#(^4GvqHQLt_yp~@LIIkc1B)w+odC!n1MZc$0 zgh_-AfDiv4C4*sma7%D#vxYpw==MM07`7x!e06 z)9W0;zo$rnze`H#3<=aLbOB57l%gq2t4`G`SXHS0r8Bx9ia2Qb+1d!s(KAR=Vte)~ zF>mKmR~76ztlGGfbsWu3#Q_~Kv*J?Pd(O1fz4Egq(&X z#(Oj>%Ovw3N1u5N$C5{IH{k{MW>xeC-IxkiBv(UF-N4<8v90)I=k0Ij(&TDE`WcPNs*wSCTT_fiyms++}8BVzU30l7v^X2Kl1Z zE{cMh8OdziSnD-v=BmlyQg3Z)plqLh5rKmPOI`WLs+F!4(4NA8*i&m?w_Kvq!u(sn`{w%kypZXYr{ZCU2i2H{w z!j6zKd^|(Bo}v4nEh75PEPnXtaeU#SE*vY&qds00hV|NbgjKS#OA|#jt_|V+iBDp2 z<|tmD{UoO9JCRb%Q7T%bD-FZwwCcDhzTQRgB`ulIdYPIMs&iv-@+LBd(8{@5!d+;Q zuQN594|s8VEY^aS_DOfr&;3kadbWY#xAp@nX3C!Kf1C?Q1@sj}6F5f3j#> zCFQ?NlBG^hy+J>lG=H*OIA`cym{^??r*>ep_tTQ}Au-t%(^jzJv@MX5B@j1%pUjgQ zy;W=F;VQK1sZu&=7jvhCGl7m-8LyJpI!&(|q+rJB>d0>+#Zx5}R3jDCXDw%d8-;`DJT>P4Zipyx2VOH1}GIvspSK!g3^Io3wax8#sy$pHnI1V zeF2wQgE`qXYQ2q5rS2?R<<8zbn;V?rJWqGNL{YtIGCVHlZ`1u>$KL!4WI%lk57E8c zpLJt}G{TIXfwshJA79SF^{SjPD@{MNQd#yfuK9aG5h+e~V!%Q={IcR@CChcE%-7H4 z6Wq?N%$f15U;`=F3By3|m`OCqdreu%a`W{nO>%-SK{41cA(*&6KqD|jN{GC%2AO}P zgrx>m3<5qQLAw-ZWd$pL2OK+XNQPdTY5l0c!+~SjVv0plI3}p5A;6F!b3>BXnlW@_ zr)gTx(^t4F)~xiG4MLhN1?D=YkQp~!FOq^S1;Rxfkg^SXtl+p5AwtyMRR`X}gI*AGXy z-28hO8h9VI{SXM$08) z{lSTp$1O%aWzn-xz`@fW;K1Oo;Whhl6qgQTH(3Sq1R*zbT1^KgP|p^zcYGF&$&x_$iM5Ao4_)TgSJ68T8xV{ z5mhb5;<2V8l%g;e>qr%3J8?>*J6UV7GWB8(+W}+w%}N}W3Aufia^7*_Z8578+VVOnHnJ#liutB&8!QtvINwB#LN=?<(xRosHUEai zqvtIS5{xyr!eus=tW&a(GuC}p>h!prfNLU48JC?}v^ole?sqc36WXDk641sqkhJ*g zTo&UXM4mN)RV@Y{+lFTAE&$Rwuh8;ORUtA|+i(!E#zTGlHFUVA^CjH=0+iCb1-BQVM5g{M zVMhv-uQJ#5(!M&cJT=(~t?MZOEmJmyaS2duBf!sQe?0*-s_Nh4V>DXV?{kxvBtdFX z?z_T_Nc8b&;}8xPzk=TQIsEPP1N?C`j6X21V1_(G_GD9|(pLrq0 z|HlqFGnzpxNmAC8oJCry!-_g#h5Y}c?LXkZfX&mQlGw7a`Gy9`zg_;(vr%2~3oUyum_;s~RA7}B4C3{cbR16rmK3z~hm|500>}ci9yf(p>5}KG zDLNdU7D4e073@#*GnWmpN(CiVCOOQEN`XLClg=6xDPDJ~Q*mUP#;N)vRi+JwCJa!M~j(bh6DIddRl9p$Y;7=tq zTZ3ZvoLy07Up1YGVMAt$!oT%13HoozqA>9YwJAJbF*;p^|(8)!sb%+Ivx1SZb`?|5c{b+kxQgTCh5d=DR_6uJhM(p4r&S z6lQ)i&sAkyY8oR;HIl&kVkK}vqkK*1MJqUlXjXypt+;Vjpqz0n?d=>rY{Z%0u$bi* z+HGu(;lZUD1$N-B=!E9)npeyVZ=<5qmCydy+?-})j+?tLFH-$re`#xIX? z!!Bl;Gn-Y76`NT=lJtN?%FYe)YKbK)b<;|`9;3Vxq=qH$O_K4Uf~u&=`x&V>DNvIV zNNWp(rXJdZyF6|JYQu|k5lc>C0CNt>*9Mz6%;-YSPusGc#jtx@=t04zKZU&Yp9V zh<58fvlO^V5UO)V&y!ZZh&F0z?a_AR+jd|>eH=Ue8*tVe#UcfAU`sbi(FUo}Yoc_` zu_Mc@1)3LYen$dzg!)ygST3ie(X>fEDn}|-rxbbUme&HMjl~ZuRhIG*=Y;E5tk5BL6VviUbcSNc~dgcm-aXcvYE-cA^z1aHhMJ{sT%es(Ax-vt`>F)%?~QP|M#_HXEJnL%9nY+$|9XhS z8Ap8!*G)Q$uFEf@IP_r*%mJzmiY>E`vXneW(7gk(%D*m?EMwwO+q<@FLkaXZEu<<1D-~|-6UqW$w9);&B$Uj|0#|tsK zo=s5P7a=^xIlLrQl3>ch`8HQhYQ2(HmNbEM4d-jXQ^!n33fr5c<+?=hqTd%0uZ0v- z=NBY5P#RjtG(X}BRj)Y;I9ip_<_sn31`8as1mFsuOXl|P0aTsqPQ&nSPrxr7@?7A)u+G~0|<>}$lvPA?V?q@)+o#sqm-ap(Q>! zCQ$+~FuB;F%oU?jka7GEj_OUQgkZFNm4 zlENQLZCbuGq(UfNbu#IW!*%S(^t}?fyriGMRn(q((kwj)q!s#ip2v)v; zbod2C-3Qeu@X`(R%hQPx+>0A#zKrR~Jo0Pv{EiDObh#Be(ciTdv^P z{0!!Xj-%`1ttNP`^DL^n#}K`~gz`#Svx|?Sy?&9dvlJ&Mj^lbzdNmln9UJwn-nj4a^IgBL8z-}25Z;yWVt~@r3~q`R-OPTdfSa^@*6AniCX3x@PG+O$VXRmY zXf8RyeA5od>f0&MVjr0FA#GCN2WmwxQ&ZlCa+3XT2UrQM??U@8{CiI1-K1Mi(8+%R zL-!oRr=LBF|L5Ob#$9KtSVd~)#AhDlg4~Uj8*+I0?7OM;Rd6xeiG{XKZpKhMR4mm7 zF<0!sOfpQRngA;`PE$|mHCHbmmIhMVI7cAvdYV4qXW`#*0mVJD=zqD4;@2Y--$>DM zGQ;5U6f4f9SbZTwH?3KW@~VvU`jzec7>BwFEAh*w67(ePaR{2(MGD#}(w!x-T-&&b z+f`VBk6uKfMIjS&Ahj|D6cI2fXIj#(zLi^Qh#QvIP897a3eP!VMiNgoZQ1CO+^_xY zTKzy?-obGh8dM!k zQOy9XG#j%3ot4>YGkOYqZOYLE z3bO?T$53A{G=c_0ZI&)DS+GEwQvfx98#Z1GEx6_tTyu@Pd)F4~)8qQKjlJ``I-jlA zusmH%va`Uw#<}^{+GyQc#ww2ObF(MSH&ZmJ=+M3rYXDEA$tmKqK7vBhi$3ptXitvd z)~pkk$h=Hy=uOi6jnG$?Os;+CB3tdRMG}Od=`EfH=oPrO68bE~H!FWj*+lX46$E5+ z&N3$eM&gH+=Ih*BHTp?u(Ms7rFY3|a{(eRm3oTr|ewH2cqxAbQ6uIUHp57iuAS;y80{V9Gb_# zs!6nOnntwsG)f&WA)eWeq(U~1bn&s3H)5@K5Hqh&Q@LJ&l{b{pv|g>CX<>hw7H*7= z-6_`2cHmg~Jd&A>$mVWFC0;;u<6+dLrQ@YBRBv95-cxs>&~cn>*#Z`-3(KVOwZZkT z0o?xaTN&IftR5NCL6?<(+iV~KxMfR&wB{1rO< ziyz^}`ym2qVIvQ`f`9fW2k@ysnnCw?++69SE78BUn^bT=zJD8mZ>$@q2^L!`3m9!b zgDR=m3c0V4ek2LX^CIJU)9+d@x<*^dCX$+_ZB%VL&LFq;735~$iQ9K^aqj;JZkSkw zkNj{9#f_`6u4fDVqoaDPL1}L#g~CgkIe>_=B$5bXQM5GZiTBl>Mk=NBt%?no6D^+eBA=;Ks^LwKxcJ?UfatEE_qT7XK0D8?CN zYm@^tGInYb$ikDW@P!4jS_!gqyylgH(8N53aENN0`Wonz3D+zMgi^{bUr>KoN-A!+ z^8tiQJeUMtNC1>*CX%!$5>mpNSMWQfeoaAnJ$_mvjZ<40$-$3V&#u!`+OoNfW26;S zo1&u7Aaort`kI+ru(qao-h@SCtx9Y4obH-}h0T29b2$snd3`OfMdWk#{h~dd0d4bL z^LL;CY=F^3EqfL~o1KTemi>{!1xh(#m^J7;xfzPt<-cb(N!3{Cc{D-WgK-#{eO_0f zmBgkQEGDDq#Yb?weGDHa=*{MP=((7Ht>-|?FffhY<&T0LM`j9F1jWFVY!zQ;P||{^2occoot)Y3OaT^DPQ7lEz9Yf*1-fDa0&ISge@jZ8 zRC1EeK~!j^-+8LZuQoj=@f2vKzptn=COX@kW9YfyvgVZy>;l%J9-c{R3&?0m>%4d) z4Vz7#rX>X(DSGA;tT`3nmZNp-Ia5XPB3ZJ5Syb=ZkEJex;moawCwAhs=>3@QB*1>< zAWnRJ7}XhCwJYoNE9Y%_F4*;zM-ybtV(7hb4*ApFcq*F1%8U1)F4uJ6HDv3j5S*za z-FzDL`X?|nTftcU1jZMq?aI6!P_|lS*T22hyVnC)(~j_JfYlwz|yFggz)t%5h-Slk~op?JSY(DoR-h|3};GM|b^3UOMBZPfN(R0g7_>}{%JYEt7VKEy#+_J)uH#jdCP&cQIYOcK2&$bcF>_M^n|x~0 zx%F6GA&nhNU0nh!eK@t)=AB9jx_)0vykz~fOld7(oIiMxpfpFVeUZRg@6*Q9033qg-0H>SbcaVFUF}2aduynDrU>zJeYS>tHxrTBWSZmYyO9ccC;N=^Zt9c$; zV0A!Ru+V894Y1}K?-%s-f(26n;WqwV)Vus$X#Cw~;kM8KX%j}2+L-BBEp<-;*0(mR zqv>1|xz=5vg@7C9XY7p}T#Q9i^)}ML0J*c8jV0UUqZ0j1$upj&P1{GSW^ee@{PZaH zrni!z7$vPdt015yS5?;9j#-w~&^CHuYEn)D1F%w=EYNb(LLHmP^q@1RP0K^8?npN| zugvRIC7mm|uq6YuQsmzkkWEPyXW~0G`Nt|+$nkoTXe#c5%#@CmH6yMW31^7iTuAR{ z`gK!Jj@3;$B>iH$xV||Xk@!|8`8g`J>1FPfSrRqVke*9{);BC`BY->sT`IX1w2486 zg7{wvv`Q2A8=%$vSUH;|$`yjE&$|c_p@=0GD~vs5jiivCHdn~B@s?K2QumKo+%T+> z>j-3%LyT;8!l(q zbt=KC8J^#kBbeUyBx(`YGl6z);bxp3z8Nc)-as@pi~ZlNp!~`pW-9^8OVZAgw0xI~ z;&HpoAkawrB7XSXHk1}O)1OX7rsGvw)aMY;-R705NVasKc=SFh)D^rs_S&0(tJm`U zO~m+Hy!)nBZYxD>f6~c|P>OrUnbU1kyCniEW)h>bQ<%kZ)X;xnx2Vxsvt>hYVNS74 z7YMz4qdu|RqzFamH406sgWYdw_U>6L+4z}UfQG4cqo1+YLaIYK`ufdo*W}1WZRcpMjR5m|(3V`njnO{5 z|0kYD!LMUrD8i*Peds1deC${+4!5sEZp95)*nI#CYb#iN{2}z8`aJGDJgGHeller0 zPfEQMVBFxEFWVuOfTvY*KwnlWrUSuW+Ik7VrsT1bObQhA8-^m9=C!5;C6(M4GYt;G z`FSnME~;}fOkuxW{9e@eC7|L$szoLixMX^{v)c%~ZM96JHuLnW`PPV%Ch$@cuVO3d zB&p>kr1rH)6dpfIY#~2kJCYb<^WVo{-<|5i!f@Uu3u-bhe~dpmT_JV-4EB}(942ii zwThrw`Q~P{YrjDh8;_%J{j=tIPAydfucq=+Ug=*K#1z`Qr)%1?Q0!R`txMMlt$!+j zE1}p7a&mrFzX5kS3vRx(hy`9d_^h3e-4xyu^d(_667~B!&SWR}EL5OPwZMj1?Qz5M z3}Jk=fjzIJMdX=WSwlJJ(Ck6$fI5Y1FyJo(Y)7}}H08;7H&UF!i&$A&kKW+@$hSX_ zk5$*9*s%&f$ez_6K@#Dl*<0!w@@@1E*MLL@hsIYZb%LvjXIe8ll*k*R)2B5nb*(ig zH>K>6JkdDSxC1F;m=~X`#5UAy_a^0jVV(z8h9yRM*JyC9Ask!9F))f84S+&DsgD9sxEcP3%kL>kRiYX=5=xIiN6CS6xrc(|~Rg33AG7C8w5Z zPC^w6StkKs1W_qAkxiR=#OX9=T&!22g~c@!nWAnAs={ui){@s&gO-UAVxSn;vIai;&99UtSEb@7Y$LdZ^zAY7;RjV@$O?o(7@^Pq2Wu3ai>f;ICJ+X+p z)*r|BZ}=BDz2gh;-gpG**!%EQ^3Tw@FotcxS21(?0H!aMv3716FAuNB_}+f3A-lA7 zGnKIZ%nX9G_>tGPp>}!)sc

+6{l~E{@}MWZUS^9wlyV`aWhxK92m6o`(PaYKi{# zZg2mS*ZA(0U(T?s{)5&oHc8aYI9;h=l2eNzG3gD7+3u+gaA-}Zmz&vYM*A?IYX(O| z3XhovOu7EF^`x10BlDSLj>>Yip7_1QGzoAD?Xua(nrHFmpy))!|7uINg?7lbq4?2% z!OeDqwzlftaTbr%zk$F0Z_lAJTE{q7zEm(A=Xj^ZeMn7vZapot+i1;x^6wyib_1#h zCHL+-T=XlcX|Ld1wQDGUV2dZDX|oxP3M-pfo)1ZS6^^KI+P3Z)eEe5mM$gUsMA0Dg z>e8aNmi_UuS1@+sAfEfe5Dxa-jNGdUmbOl#a_RrV^Z)n|*1qrzZg~6@-k{qgrB+%M zf7fmfwqz}~So}_*8NBq%jJx^wAT8;BZdN*O;~`Ur+UrxgR{KQAqM){2No&X#sW#>7 zdYzMvndUJ{z=Bw&bv~9!=ay$P!i1-dw11JP|jA1AU~BDy#klQW23*@xFl2XQJngem&SV*RhK78u|- z8y7=sY+194T)EH)E~3|j1jW|hT4;nJnSdmz8f0u#1C+3|uHUc>n*mWSLfCIS_Zt?l zp^}RP&;ok+S2v&c(*M|nTwf2u9{On8+i3L^HB#4Gl*C4kcv1TN-h?JLJ zxX`fHO&zWZTuB1s0x~H_&7db^$@-Q$4$#aDFf(OpD+d-vO$Xp6`HY5YZo2=B;w+xT zA7XoQH*PL{f@{^skC$FUNBb^(B|8Aqn8e5yvBt!wC>?wXdDApN(#pirDg>DYVw2yg zR+@YuE$b=@7TqI>1Ub=VA|cJ0i6oBI9W;w5zC<=^jKY=HYp}?@K!D8_w7`TQW6?7b zG^F&+wcBF<-NJxDD>+G{C@(Y=aVBnITCTpdt&^Ux^sgjRp{;7#>skpo#T6+ zgDvH_1{ZSZpUQCWL=7K4QpfDNH}Lh_k5k3?Cb|!Nko50QV1DWE;z)R!BIE$}wM#a@ z1Xf;p2DL3`ap0*AT!?R>e%`NbJ4-zisC5iu^>mM(L)-Kq>gTB7-%I7GjeELp4)tAM zL;u;`=ph9?TdrSUPQS_R?R>&}v+ue_1>QB^)oONhSv3Jx>5xW&e$jBFWtM2`O*UG= z(#fs)uP$iYSQhTJKpQ+qS!>}6PwUQ#1a&$z8e}yZ0IR~Tx{4Y@0;EJ z^44pU-w!_a3rP2Tkn{x?-pD2VeEUDc&-|2&2Kq=%gh=pdn1HgEzQ&IQ zSQuDD+;pcCu;kuc=|)Tuy|$!^Q%6D&9{Fa#h!!M zaO62$ptihpiko#L(^{!IzfuuQK$bMI)OStQ|Fl9QGefEKN)_A_P?4%Nbn<3(YU@P; zteDA@Mo6W8stj_lk{fm-)JjP?zT{%6$?zQn`9e*ajAd#IO1a07{8hpFJ6r{oFgESQ zA{hQW$c%-dpHP`D0U$M8s{BuM4Q`>uTt=ZZgQWwfa6USMBREFgV@bQ))U`RBD(cn-`5Aftw>spzb)5Ptnnh6fnsi1ij1K!CYJI7N;I3)t?uN}KZuPOp=JAd z9EN0PN{*%|zg3t#UO7W&;kNo%18b=#4fr>L*u19o&3Ud;cEhuPn<@yKx>?4rTLY}( z4J|yGkTfnUYcQLVeW|<;lf?l%Qu-RYyZ7RMW{0F3uKE+jG%HHmOYOj8I{L^37Naw@ zU3miQ!xe*9F1zzWOZTZrdMAn>Q(D7OS<4eN<0^ky@>WkGF+ZQJB(PJ~{T6YRh-0%lDb<3A= zasMOeJ@xbGpT8L$v-9Yh=)}ZT=AOmX=v(X{NJW$n;(XtR z`qXMF?iY})Dd{yycRz=jm+nU4qHmIXm)-uV0PDT=XIlNR78@Ogx1}IVsegB$o;}`zz^O!wQ!!b$(Q2;Aa8{<%B zJvr3Y6u4jrS{G>*POm3DvYiX`c7&x{I48~cY-O?%t5^tq>`N=GGWY2vZ0LOjx4-ih z^gR-pGDu+waJ=bXMxH}mEc;C{-yj$GHY4@K1_WDFtM0DKUFYP z%ZmQA&{ATaIGE+sB`Kf6(BsA*9sfQSr_N)pIz{Z6*M{a|%|%i})>-m-B5KVl?bD zUw49u*L6+K4d8gzUJc-KU-Rl06<=uw0W+_`Nkx6lfN)VQQlWL*2~2qcsdRZM7JG@A zT?jjAt#%R+Nr(9KEut$lHJn}ku!k#Sm72>@ZUV4EnMlgue9aUiNlZdrrZLXDum< z6TvYAGS}lcPYZ`6HkpylmAf#(wYPfi&+&=w+wrCF70gIZw~R~kqBHfU>pmC23=F7N z3BnTKBV}R5Co2IvGH0?pwYI(ZDrM~uG)-`olqk$wMb##>NGBX#3zJn5nd(SVWQAAB z3#&?>RQY#N+*1;4=}T~3oBCn1Sh|V{&`UtnB=_ez{yZ&MDa=9EM1rV7DV$AUEz$=Y zsLz?}NqX9LaLn{=hJBd?Bm;w)b_>#CGm%Nt@g$OXlJ|M;Kx*lM1TAP+9m8^GGCWHa zH`jxS7|7DJ!9{3@noJGnNx)W|3GJSV?C+93vHZKwlMXzB^PX-W2_s5r?bk~wN|a>_ zk))YZ-qKQCv5KN((Zew+0E-0ucrJ&^LJ_sa6`Yf`RJ@0{1Pi#(8RJ-S3inSP#iP%k zLZS0Kp568PII`zkIC1Gi2#WykLDqO9SC;gE zCWvRN5H3x*S@_q{F?Q0y-#~~uCMv}70)!fNU3?a zYE4b+F~PO1JlS%w)&A?YKc$laSKjgnZDPdo(u|GFJ!{!E3sGo1v8At#s7vh+xWaOg ziiRdxb@hp6c)KY(KN=KE0zIvjfAH(5uUkN2aTvD^UB<6{?!Vx|^GkTGoN84gofF?M zm{qX|*AirJ3Q)U+K5kN;>0vJSGgM*cxG+n52}HLOU<2E0)8LlY6t;Jn2(bp+$Q@9tE>9I@l#c7ykiu@Pb{J`Uc-r(?!`>)0pR{K z=(@2RiNrpDVxy9E8|JyW~nw+m5${0 z3Yyd(uf$a_%Z)K6t;jsBF{I%DL}+8 z=4(omqyq&Sv60citJY1@fwt;y`nY|Zock`$C$s9dh+xVl##*T<(VjSw4Gl8+u?bvM z0G6%S2+ntjhVRnk==wGSIInhShXU*XsDaaR?8SN%gB}!mcyA-s8_<78+B)o@pqA)V zNjGT=mg_~1j4;b=`D1`1n7*+8rh z)8!|yu^66JunleP!nP#Ls$Hq-oV9+XoZ=j&VbopMfFN#}C;3zXnPXP$zI5GI1@7HCoXnkNnICA!|sMIdQh zu}Os%&qg58!s6d7`D!^T$Va^D^%6|2MqYz#o=Rd~t1+dCDODY`hCBk@I1$ew z*U9zV#W|-;kTQu<)LUW)MW+&_Qv8upCJ}Sy?#*Xvy$bpzww-j6WU6$#_=L>pFGkI_ z`gUsnmP)DO7--kV>mEp^L4H;OnEPO?SE=GH)@+dnlEwh*C7L-h>3tGpCZ)hN(Vc$b zPVU=))cA~0)^h>s({d+&4Oid# zZmWfAm<;o-YlAJXN!m>w-wUwD z-|64`Q>gtE={8b#D+dGo(-VIR?@JeOY%#@@Efyge1yZk}%tcxo;vS`+v-UpD^$Jo< zFL3D}804Z|#|5*MTK8^l$eamI$U*aA)tzMPCum`G0c;9~Bwd9M?f5L-`KuKa);7=D z%{=TJHmj_(TC^=!YHJbOx74-y`@ouK@q@pZ!pZYHsih8Ja&9$l-0&Kne5?!6BQGGi zcLLa#LtR>PsijF#TM#L*U^Re>S{s4Zc9j+&B}m5+kCd^b@n{WyUPzBpF_|Se_Rud& zt3HS$ZB3T;8bUVl&DE=yP41tPmy+=BOJuRH!7#CQ>NdTOApl#~#6<#mjC^T;zONfF zb@>EFOVgBBb8vC+W=0|fR0FP2Biso}6*rsES!V#eW$cU0V;+V^g(ZOln{XpmY&! zR}&)laD*vN(npwBZ?J2R0JX>g7j@xTA8cq9h?RutUH*G9I6!Nn!d+XN!)W>f&Lm&Q z>zE>Bnx2Ak)MhwT440{p**Q!Vgsb{GMKi@|9mmqAaPPuTQ<3@vwoQK-ztsK^{%hNJ zF|Cfp%(Q}2Mbps5MO&0Y@@ccwcpkOHp*j(L-AfSPwBTtq)!N;GuxYZf@??YRHH{ut zr>C$qvfs24o%mXXSE*^C6<@$nd*TKf2as{y)nn7OCX+IY!Da5tOT5mLJjW^i^a96J z<(e(40ioY-r}a;TGsnZ{I)x(kwA@)px-})c1gTRjI;=43Qzj1Gbgh9Tkf;-tLg%ZQJ-b=oz0aojST~4rS1uvZ9ye zDP-iceYCoV`F98Db8!<(AKp&c_Z-JeAya+sxI|k^6*aO{el(|wT^fzTl=2jNc?H>p z5me&sIJhu^e=)ut-yL}!e`oX8@PEv`gyY$9yi_=iL-#+1iEI}pPTY>dncLA;zZGG` zwU?N1Itga;y3eAr;p;R|o~A`Tf#TR;OTm3_B@gPjZ&^mBS|ItqFPgad$zapHi2qp|s=1TsYP%CZ zx$q2D|Lz~-nKKFIC4@gS8(zA~NajFH5UJ6Mt=&rteFJ@vuW(Zz=OVl~Oigtw@#%JM zj6P$XJ4?pqb;rYuU z&TOE9L@T0=JGkCP&2pMn#;m0BT!v}+Asm-&dai~`P4f-q^;)5hqC_V4axIYVtJ6A> zNMe*!vLS8fnprJh=h(|!PX$w{MymTH6;ElannaWO##+h?D=a*q)`JVQ4z0+`d}#$~ zwJo?*+J_V6GkU&(4OKEhO`!#oOe0=Ra+u+8T!e9El_+DWnr5IbjK{Zjm@CQeHKK)0 zL~%b>VMp+8488LfO)XN)DYPuMYdzvRuREQ|T~;5q@RNVRDVI*jeN3EB;2NJx#H&QdheTkBFN&z>rDO?GIzIC`6Y1>{ z@Io%0K#(d&H%D7p`^l=!?vd*B3&yuAovG4LK{fPDpp^y;X)to8b%v9K7Ho2nYw{v3 z%5ef{S%aKHZ;79)s1H`;nG}}ri&d>qmC+B|PI?&Jcm5F95J5J`C8pU2so+d1H%)Mk zCQ_w^rBtG{tP@2oq@|`+K_zlHvk~^Gi(|2VKQFVPbf(i)56`TZW8T2$n|!TvM%Ez3 z_dF@~CdFYgNTSiK=c!9eD`98GS4&+$8@P95CgQ(Mg7{+rU1;~KS)~I;r?>nCK9T=E?jTLPFFJ?g zJAZ(=yZSIwSw#hdY{CM0BFdb4C+D?$5L%Dg1ye+w0T7fmM&+Fn;Y3Z3*Be)T7}!Uk%#VM^uT!H{I4~v+t#8KE~C)=m1(em zI^HdJ;kQHpn_3<*T$WzzkmR=|2dgIiR<#3=OCJjK_mk{u;yQ$DTAek1<62t8o85jS zOEwrr`Zsr>x{=GXGK97CpZ(nFKf&uS&tSHm+29N=Xy4FQ^Te?75W#j6rNM5g|I2wk z&CPs_HSVQ`0s(Sw|8wZsbr2&TsbRS=wdYNc zAAh_ZFF&~rue|miT=Xxay#Bki6kkGep%d}UR{Y7IeG0oeLcHsqA7IZT`_XoXHIr$P zx4%EZBM+X&)R7MCdu|0a&|gA+>_u#vy@Ya6gj+j;#k(;yKZG%VCC;z=|8sL)GS*sR zt!Is>NVPJT^up9=%1#Qx!BpFK1#2l}+7oR!Eh&jok6H2n{hBH3slBih8yF|`h`DnM z65$@1d|2r-D#ZizGm>7klv__5@}S8#+UQHWgCef~+YG(TiaWj%?QmU!~T3@7k7W>#dbtYJJV!Y~@I`;6yPX zrIysIsL#zHT9~CDuMKT`Hqrv1CU>S_tU95KGe^-%KS7RtYtAG=&JW<6ce&wB23({w z8X;Z|bj@dsmA;x#I=uEKc&8%iNzZjwR_@Y(=U&>l^iSeTIDq4HAk^VX{u>97I>}+m zGm2^++0%9%zI^TKGfy9_to1FmMRbRsz|73&@i+SJ!5{bR!?AEi*Of2r=cK=Ck@7+s zSx7LBP|AEgk$h8Wib173CpEam4IvTA^%yy>MUU=|c*)2TU)T^@s2aU4^DI@GBB{^b zX%xlO)FzhqG@e?bjH8<7x_Wev1l(61$LrA-TOh!Cq&dTYKr6v!sVD+c^Ib|L`q~H9 zBR$;K#TDIax?ly}MxoYLdW$A{SaSR#i6CB-LKB&StkF|4jbU@?dxG{-Qy@!S%8gkt zV!=u#lXx&!61hhdTuqm&CC=Rs`QaB6v0Oc}zMd8mlKS70BcH%)NPZ3P%M5kwV#x($ zLw;6V*^%_tjXf=+ssU26Cp<|3tmyR-`ppC_8^>{huA?}cwY=4i`9L{ zkY~PH#&V0Ix;;){Ydl#?*p6O=mG-f<1C)}9QYX~UOq(lBeb;N&r0h&YCRC6~Ze}&9 zUE`GB{Pvdv*OtpdWgxis1E}4+sI;fo-iuF^sf0ZKGA_-Wdj?L|^BNUt5P`-@g?{3T?Qw_n-53xv;lU=!r_ZkGky(<0zfV;kAWN;p{i| zVCSpf!aYC!9o+GWSrfG?+lp%N;B7G;xormTKKnc-j#5mHuSMx>4zI?$xd9@azU?$F z?fyOFy67LK5R>Xlo~z*|W0PXVQfivJRdRm49_bK}DQ)I;nhqgh*$5J!^l>;(QC}kT zQQ#D~fu)yjyI7~fXpj~Tg`Q5N{wy@&IOOv{ELi%4JevF6^{tq%PLlaPp-skJlz@vp zH=?u#SA!UuGwR!!a~ZJqGV3$951eLee6gMe{}`*-L)!Abv1fyP(Eu#o0$|;Hj^WRt z(VQf$E+Jl=M4kS=Qgs?jWhzRGyl$l_lq=I@b@)CNQt4uq_uJ9aw*i}XKZ>EQUBIiN zS`#Rw_n-iY0PHqevg`Omhkfc`WipWyEdbk0#51$u8XLIy={%VevC(fpZjK;cs;i$7 zi6}9~YL3}Y<7zS* zzf;vnX0hNy*#pw^wS(u~N$a^^0`n6Tq$@_7(Z50|Kt}M$=zq;FXPWXR7Og0rLJdnV zcZo%iN=`CNN$E*!0BC5-G-<7XEVD7;(trb4P1$oZr*uu=sYP4kkDcIn4$~~ZP!~qp zLn$y-o$6Ye)HCTo&WW3uB56v*(2}eXG$lj2C~26IkDl5i8%&y>V-{khTEZOT>u<+@~VBbhFv6RmR2-A*rtb2kIV1* zDFu`SHPqskbR90;q}H%jeNAYiph%)da8T<>{YaMSTi%*S4%R-5^k+C<^yx?))O_(q zymR&q9DIFB7m$ix&uBZcNEazL>f(#t!}+<3=QfcyR_qkj*b>#*+A1#El}4Z$me>56 zXMC|*lUM+j$LUL^v7zHRgai9Ad_%$^Vzx;Ehe}otE9`RUN@cY zZyV&4@d786dDIriP@W&d!qO$omPWBqy@V32)lxK1-`|q%E6FbwMb-hL=9_0`6hT(P z{M1I>Q|_1?cEq_6(>oh4SG0_g9HZxuDqpo3l&OfwjNA! zJoCK9Qprj5l0^f)Qq4*C6agk@D>=DXw$O9@im&@m7{ej~CnWVHeVW&Dy$u#k1N+%- zA7#?(>m)>v>!?hy8l_8Sx-M3%>0A|;T@iF!Sd()RC9xI?l008YFRCP}aYxxz=t47`_09_3&8EY}h(TOOx0eG#P}CV1>jFP?w+ zR*dW!!bk7=MLc@n*D?9zpW^b1(^{{&!v;f2OvWs&k^O!SUm(ElOWuCKllL}1b5(5y zSPM4umVNNrkb3nkG)eMVgL-ZKxYi4{*>FNAxzdZZmf(;iYfU@n=cDC-?AWeM_5WtE zx)7#EY@8Xv?h`n}G-trZUAC-_W)T%*i0$v^Hvm6Bg4))3 zlfuGrj7)66O$+}WUp-gTg5csO(Vi#1spOYPK+hH~_S>Wk9A7v|DKJWKouMzbHcX9m zm}fHJ;%QWFCANg3P|YGJWN{brr_g@eAK>DdpTd2^uc33L&KMe!n;$&*$AcJq@diu} z(ZWf713gd7pvEy(yQ#4bbMX_DvSNYC!3u=*Tjrxq6w(rvq6il!KZ1Yrk2>&~U;R1; zZmDV%u?}W|mdUp>{PNSE!ouBufUUE?g%#~pWS@sN*%oV4g8d|VQJgqp#3iJqYMFt4 zDPdfXO}wd8T}-6;jesm)lb+XdS30OBePua!w0P+zBQ-^#QI`BzOImV5g%@M zvxWs2G(5bChW#v(O;{iy(64;ARPBxHi>OebluBZWUdBRs98)uAFi&50B_*6_1ZCYs zzh*h50hMBvlo5M*P5Uvk3rtl}BghO062el+A)Uu7Fa17x-?0_l<0~Xl6xit*fR&3O z^*lM(Q|WPd7EoJPQPc4fz!i#bK86~doQX25N`*P=xG|?r#7fh+%_NV1j-UPtspD5T zBeR_G5=?A%8^2kBYdMlOw2s7%K&a)a9%&L6AW0l+qaC={`@2{?^#%OO(1-EaT}3>d z?&mpC&g7(XO{OU^npa+zt&nMhC~*#Y+KD{X<{Ex2)QH?fnKJ$@)uTvx`;T#_)IA#eNB4+0#ZqNodX;?$u1bWK6=B1&1iiTk!-Wbiopga^` zaTmwaMQdDW^IE@;LpuXJzBfR5jU1ofyOd&J%EOIZC!gWInc)~N&V*DRa+-3dJ)oECqB62H2lf^sMe0+ z^u!#-PEO)`m&Wl%iRxI^)fsB> zh`bHbH)X+d4a?RLa*p;jMaTv16HP{Uf`IgK<~(Cfh2B)lfhFFgL2#*HRB$zuQG|c{{fIV^+bl~>Uug~J0QS?M7wN|lWsd_I-7ZC0Ot@{g2J<*f^7>!jeSP9g?DgKei z!i&F*Tetry9{9kCmeMTd3Y3oI@$54<<8;q1wAKF>?s@7WX>|Hts5VFIJCSVNh~f)- zu=eSn!!1?PUET8--*y-k?+m)85_BxpFn%_`WB=tHq~9dsVj5|sm%gnkmhv-L*nJG| z|JDl>-YME-S4$3SCVBIj(o=&l04u^t>h(vSEhbXTwAg=~H@-8eWG7|d#1K_YSU9G- zRNk>Gj<0v{#HDs|PgU~uxONiL^sO98?O5p{YkJw%YB{a%ymRQ2xOCw)TEbJ9wiKiR zOwF!_>k(rtC)Z*KaZ^gMlg-fp&B5gDg;iy9(U?{54Uf3C!Dhakp$Y2*=VnN zHX1iId8FFtCf1a%TxQB7ioZ|-p)^OuFRR6-1w!~3(hALzSaTkHKQ#ejc`Ba-+Cn}y z(I5q$ozT8g7O|LWdXB3(EaAC1X-vV-2)Gs{#(+vrK%ZhTP8rId%#jw3#pg;8l=bh| zEw8|_N}-2>rspKaXPcS$IbpU0^JEM5ONXDp#B56kqPg`UE^YHMcDw2S>Mim-$8GSG zCIEPNor`R+Q|M$~B{Dz$B4tBj`Wr{W0I2-Z!pE96C6Vg7XS_fwJ&8pxt^!q?HQpdp zvrmGtjK@%;ytuAcQ1R*DYa;~Q4^a`i9dTQ?geOznkx3g^MAE@ycb3eFcJJdj`#CQg zNDxe*_T*pS!sDa(&+UWw9clOw)~HA?@V#*=siiAqd2`4ARc>$l+s<8^;VS>Ei%q;T zl{IuaY$#f^mo~PVR@m`HOHNI_VZahdsRs3DwoID-ARJ+4bo#svrcj%e6mTI5VET1t zw&F;j(VUUB%T=e%9BrLy%0_H`D}iT2Q6!ZoF-@~w(nUdI+9JH&xq16Qn=P96oact#oHowt z=r>nV@88a^{(U_79`gS>PHqiwkV1S7HP`Mu zXK*-=N&1NjD+4S}En>J-LZ5UWY3K3J)bPfAJ_hN}oBM%}k4&am@>Ji|wsj&Bll&oqB9x{m#^WZ{ZhClMA@NnIY1p1O85S_*=riq}qN-Zzsb-u;o?7za z$C;<~x|k7cV=8`CX^GZ`tvf%B=tPW7{vLd}_F0%{Un8(HTh7y5O%w0xf<&ZHhKa(o zJ|vB$w8b=Z{3fS3RZuZ%;qq>)5t`JpZ}V*{gam>deTr-6Zo(NJeJGtq@3sI_WEzsZ z;eleg-jeD-D=5*fE~)k&m4GFAO<`N#hn}}7Dqx-SBG)oQcS``6(C4D^=8YGSA0Z96 zG-`4+QVX!Kr*>YREMhd7Le^rpnjIfn#n+LyP35+Y|E=)0Anc(^wNz1BHHhkP$zd7L zm_&TCnaOg8beO5W?Zi9g6Knlu>kw@NQ(1=z?~xgC$)zAgv3dAU%JzHD+lxr+A{(NuY zG>EObLZhzP}hTcjV_L0`n!sDEEC`E}!qqri|{+{Er$lO<ubn%y@BBNF>F7zh>XJJwf?v{)q*76=z>tyO*YpwT zQ!2BnTBoU|lxby>&_q>dX5UHfVnNa+w2!Wh?3cxq4{h$Uy~%~5^|auf(3XA)T*QR& z>}AX5O!kip>N1tEszC*lw@hK^%rMf)Sofk|uh~x;zpV36`)CruZRnvd@WWa}@fdzc zu$)&GEKnQKgAZ5wLe&PqmUc9LZ_~}EX2az7Fz&1V9L^m`@UF@QB=5cz-%Jmn zL=+V{lSw5>DOh0_s4xX8c+__hsS8HTL234G;=@ZO&sr=+>E-H6`id*Wk?CG6h&6;ogB5aqLaMW4zajWwL0_k1NRYJ3j|j|2kp!yJzu#NB$!XYSKP|d z#>YdvR_3(|rw z%_>xQV;k_tE1XDWtQpE|;sX^Mt!wT{g{(o&RTr6n?Od<7bAp6JKR~PcJmT>K9Ls6` z76%!PaW9abCzq`?r+wenTwZPirY(@=66vm%(LegFX#-z}Al3>P+47&UqSr&KBeVID z^cuesx*u@#09-($zn9x$rd*=aYuzWzhSI|9EiLA9N-M`2B&C5#Sp=615vNHb?^e5C zh`&;(7*EoJ@|yoD)^0uxO_6pr!;LnT3rssP33Lh@8gMfdrFGJ;2d-{j{_?j>&n4J? z7vhH_t#Xv*6V)_DQ5F+q9O6n(t%Yfca=?nsm*(!fONEjnrtu9 zr7qJjnwFS~o74cTrtH%xllrGgv!3BWPLfVJkEAe*a%naCN6zB@I}hSADWHyd5^rMu z(z1-c-GK|8)NG@}cw{od@NXT$_&|UcALzmV_=l@dKR^I}`C*!#w;-$T)ZF7nhfrZI zNN1wwd&ssvh5Sv2F>+`cANtpI+&N00EB!AgDZD>V>+z2wDMXXgQus}uj8SaVuOrSR z?Wbjhw`XW3i3If}Qr!3SQLKP=1z?^>W^BlI0tpQPbaHG%q@~)abr0~j2I$!Cu+*9UD-qS{b4t;&wK>F&(0_ghlJhcS9kh04Z6JIon&7`v9C0- zP{e5^Qunmvc-G6AQpS0%qf~mMdd6K5WJb10Kyd0Aajpd?J=+kF^CZHtP68b?ibW(}RS2S&$jGhVb({x|YJc^sC%UVipN@*Kl zm8J*nZkdU{)6bL@x-{tHg}r&ad}9}?eUwjaB`rW7oZwtd5%BoCL1fb7)H0H&f11Us zX?1T2iuku@dr+QV#m{lVD36p;tMN|XmX{84e-7#umE3dzMp};ntW62hfw*?9>%(<*Gl74slO{e9nw(!T$pVuW^m?9 zDVz~6b5$mo#GO`3O>rNqCft^du+h zGVio5yDlL&G>ef5`lF^-U|~H)8`WPjX9)SRi{D;><6rUcz6<{eJu_qYA^pH#+?~Vm zU+BPmbtUkn-N>dNBpvl(3Y>OLrdK*Pm_yw08lo*=#bPS%y))ypW=}95B9GpkabAaPzwgsWFYmwRD7y%85*c8B(I-`LEw@EYh zOcga6w`vi0q_!xzbUC4AM%N80G*?Tco_Y!Jf4R8AJHCIijgrlv)pCU=wZHZIOi@KIE`sDV@Q~3c>w&7^BC&fCs`g_$n2p%e1_;XD7`q(-+tXw3PnA zRAT*8DP37K=@jzYV%dt)Dr+R?DI*|3g5pC=#CIks9Af=Q3JK?K#ma5421ip`Ne(8D zbs^mcqw=P3l(DnkGh3|G6)sH_XhN*SMxM_Y*2j~0=IMWdJ-7WTHg?>Jp$eOS%T@;oG&a`gx7Q9FM-oAowa&E_z4RJ+kyhf7(M?jkxT#Cq`;XPiYYe1JEr)rXN(ky zBjD?y?O+px#?_(4^o5o2&D9pYpKK^{!aT{G*A1xVY9{ThD85xHGu?|Gx=Sert0vcV zk(TqMxK>IguN6igLN)W6@h_e!;NL4%mAp*Z9O~$rp^&##oMH~@jhg~|`?hvWksV8i z%kUSZC=9RD6#15OJnkgdK*bcz$U<{HM7izc*dM9n@L$h&;@Ef(k_AsoM55BJ;EA-# z-x$|efFzNt)}}po;SG{uU$X08*83Q(`BBajWpZ(W^mr$RXasEQZbu*8PIpc3#|#bP z8X25uaFjC3!{-hiS8#Rljl7@T_fjcF*|)N{ zbp-iDSWoLsZ6Pzuz7Xa$x=v^d7n0z?1>9eM9HR3FakG4%uLUleCEg^GSbV>pSiaiL z+b#s5g43uWBAs7Y#uLR&Ke60m`){`Fm*4y(|FSxe2()`{z8$x$T7_M|y9@vB;Wu#b zA#REVilOmT3+k@nBAoGG#k?e*r3Pe_j*`};#G>>@{%$`P&>88i%0*k{f=(p&F4QPQ zi8{^EgBNLFMU9(?zOwuo?%Fd1+6xE<>A%>vh_+i6Q91Z3*1txTWR9Dyi}uUeIxfCO z|LBXa;r4@vah_W47e@l@e{VbH@9jeEJoWHryG(FZ+|N}#LmKA|#H$Fbo8AES>_@); zBKi+k(f0za-%}~pQeaCoZ?QW^8!W)zTgYJ_H|A2(fy5?oO3;d@cSFz{UquU@Dtw)? z8ExiuafWHbfVu@<8^O-aCG}^;RUooY{7jK*vYy1PXbx@`Km@4eq}ASF!8HcOg9_&B?jgOY_>2&TsiyGdo@bD8*{sh<7UBrrsCv zt!$KD+A2&Fg49~XM%u(K7ap#nd0iEyM8P;F#9qR&>`B}>^=>4u+<`lf{SkUU`Z4@* z=NB;BNrkH*N=v4t2UUEF(oTyk3|xqn*RW!waDxD;C_ZggSr&h2B5onEdIOV9t!Y5> z{MM3KrUc`84@J_zMY@W7UXMkBTbTykB?9YlF8g`P1SwY`G0O_rk#(>ICjLT(W!$PJ z9ZRY+Ns)f(6|j+yTX-K5l&3{{WMhbL?&`t$VXl+4C8cX|lIviBD}IsI;Yp5RCe^e! z`7!OH7Mi&acv364zRuH6dvJlXxWwH|#kXFb(+GBTdZrg)BHG1yBMm2|*B(bCE$5^a zqF+|utjASd=$OUO$SwG2Z;W;RvpCU}U{#T-+vNab`5diR6C^u7k;CG)8VXP5R2i(N z4oP5?3(r&lOi~ww=W5tDt=7L98T{rq@2!sRUGIGduFGj+yve6S_dye1X!2skzmrp< ztd6D^D%9`}xfwrfcHP4^fjL1d>n$bEvN%#oM!;74)k-B53Gm2T_15M96T2NGoIMOe zO~Q}g25kOl=f0Rs4SV{WqV+_~IBI>j-d(rsveh11vp2d*-z+ zq$lVbsdp+(l(l~g$=2URu=5nJ=^O?|D;Ro`l+Jky2nvO&bhn}4UL`FDsgeK2Y=G}l z!@V3yk#r%fdd$f+@*GXSR(DO!JiBTN^11-4544bnD(O7~$iiCq?rp<;SYNJ5ir1q5 z>i5Ys%vzWL?Q}wGwx@kN*6e(T<`@Q-LQKTp!g#i5fz{YdmRqr-tHT^EXX^}`wsb`T z>=4%DrtXhn)%)&%ClOoced}cAO3!V?s*XqTsNas~Yy0tXHfztut& zHG=8pn=~@x#cy5k$b8UMlF)%zDpm1=1OGo%c9n43jgKNeM7K`XiLhMKvD-{EqdeOy z;5yaHby$nLaft`M#rrB=BGA??J#XeUj}$IJ%0(di7KZCEJ0(Aqz1VLGw?e9KF0{W3j4!Bir7y>XBoVNE<^*A2i`pVBbgTE*I(%2c@aGGr$qMn zS}{!vz=-=HZvnkR$fN>rYbnN~RJOm8R26K6Ity)C!13!sjDty8DmoY(C*hPfSV zp-WhAjp7Zh?s+AU1!y{c%_3_8r-(TT+|YQ&td8a{m>?^ce;9BRNNr@7?(Y(H1cakF zYDPcfM+eet-!gS{KeYEg{A_$bp1F4vHy)Znex{_UB;hMu`VUcjN@+CuHaaE?m@b#m zzK|*i~Hg$HrC2HT2G%FT8>C&t?tCdp3KFHDuQiJ4~ij;(1q-)wH zf%V)>H!L7`Gl5X7nweg#nZJx|@HB3Da0dGh=h6AxH}LgB1vA9I^LGZQe27-xPEWhe zq(Z2MtqF+;s*P&uLLt0c^IjrdnhU%v>Ue3)OJo>YE?|aT5rFiN8w%+-#1gZ=;Lb zVG?daDQhQ3$&8OaCk0AUiF|J-omar-9UnqR-!QW8rdl!mjoLvAWv=FR4PFaR>e(bP z-xl>3Yf30kDRxhY#n8^(+6Ne8z6oEH>KNKTOip`;(zACwG*Eu?I{2&jlLrRQ}G{m$TE=t zG9Fv}uYn<nqhtghH03B|$Zu<4v?Md<{ZrENSD96@R4vef2Xt z^}xjF*Q_;bGUbinG0Ah{t6qss>X+{KBCYaO;r^5EH}!N1-`M|eFuQF658d>$NcKqq z2417Ns=5e_eGj`z4BQ5G<;ay@EiLy1nDGU?O6zFB<}T+IK(j{jl4;d0pjC^? zex^)HEi;yHo$IbrOR&IGsfYy@n=VjQVVn~~nkI>RU?rHw2` zJK9fAYW;3sdoOd%&?JwF9Iuu+G}N@%so$ax`8`PupX7;CFT&S&&M$K`6&gF*lQwhZ zNZL%9Tk_#uwD31krrlVmVOzV0BX{0|$JTxfcRl+ZboS)cwJL4tM77d$lHFD#A3^1& zFcRYS$M44TZKU_BC4(Z`xWRiW#Q8@x1zzn|-bHCRLjT8|C4{SMXrHbl_ae`8dJgkl^Z3Lq5l*~( z4+`i1J-)Fg#{A|^RJZe*Z5C#SSB1hg5^c7#%AZ?87k5(MpVYB}KAWLMrs4GR`f z)~-CU0)rYhMmv|S2k#XLqu@@i2+|u3Xp^$p_1MBeZ z;yJC1m1tpgep-5lhEo5U)G*DfOuMZZUa=!Ih3b7;1*r%&iO8ffDiPvRVW>Uq#;TP& zmRFjRN2w&l>u@HTvlMY7791`iu2HQDE~UxS`Cp4&oSMtnNMXCruM%{skj%*_HM9QM z@jpa)O9k(}?U#^0AnngOv{}5+kO{Iz-7u$WJ3?8c$SNv1p$4OUp6bSNax68(R$_P! z8&4D#SMyj_OARiIS01a{ar8CL>=_i|c5F^Qh{1#3#eD-Kcz(?wj?>be<53m}UP}bZ zQcikO@R49t5vx?2#8tSy&za5m_pGZ- zeAHfQBf_CQab=B&Z&<&t6-6@jyN7)!N0cCGtdWYI+`;qc@i1K^%SC_x zNy_&=TD2Q#jsG$&ZmFa;M}>ca&yUqIb-EO30QK>F)^hP};I)z_K`Uh4@i>nSJ&NDU zKS4RRpDbL7AYV{MC6^~kkPfd<){S;9!M}qbdLfVR^*x5MgJaEz8Ua$z$Ou!x(aHK| zMf|`z2ClySudra>!jIbuuvdNb&EelfP&j~XEpem7r_uby2`!q1Hp~?Pl4Vv$uj`NJ zbHc4tgV&A=X3@2F>oL)RMlUuELd*{Y_On``LInf$p3KB-It0zo^t)!r8pZ#GBKE9x z?M_l_C2Ix!{}tA36UKY;-T0XsK7mvBpGDvAb>if$2k_w;{$5)r-qEp$pPG#DFAfH% zzK2@c=uLPx1<#3R$E0f(s(~@m#S)RlD7DRe(#n1>1;%ER;E~b~m+`|{eL(?H%eYA> zVS7Z7zA-85DT&VK2EKJ5L}@g|*I&-?Bn|4BSaRDs zIF&tCB)aI?4m1~(vr-LpXH8S%&w!F0zK3%0Huc|`Dtb&=!sD+Hz~ zjGr1SR!U~Jg?XtjK-s`Ys^IxlO2L_)vD>#js!h$aXHB)J1Ic%6I!dG#nychwY!}Vh zF#cbS5caHk7O2wLOZeztyG@(O<8o+f4NKCZOCu9SPpW!pXY8AhZ>!;cNl(<#Tx3`4HPJ9+il|_8?_Wu)| zFG}E6FDc3ytq5iz1sPmrDU(C({Mjq8gTMOIymFt%Q4+w@n1?A;k+aN0U_T$iw|1~` z2}BCO5sE4|CV6(x@)#4@op=a;8yyROgu4r?ai-(jRD=&<$uo3$nU}gmGqy&+sggk` z#WoN}E_-G`RRB{cRJBN@dAmeA86jm9F_>PoraVN^o|&tkE=M!%{<6#{nOf)Bbcwf@ z#S~rfCAx~rN^c>-{i}gBw^8P-X~)sAd4%6zLia_UDSg20QjDM5abYv}?mK%)6%V8M z(mhDR3f9&x;qKdR!HEmgxR6Pp7iWcRZ^ZqctmkYKti2JQOCJrTLX2uXhb3CQQ@oIe zCC!NIZUx<4eN?y~D$|uhcBIa|utX(efhPRHvXQfWR7TcrAHmCms}L8zj;`7qwsa;~ z6s91x#Zw9#C%;!3;VP>pSlhiGC(n%Oyfwm_tVjv8HobHz3yn3~@^&Dl9@Dp9DzWwE z{S`jrUFm~W<;Z>GYLt01$jz>JH`KbqnXlBJz9|!iv~eKwBr^^MdouvqoCxhlBI!0s zt)b()6rP+B14@^Qqg%8%P0?v+tylYaO#?j>-4|!glXUv5vzPp3qrmbpzpYzyBKG#* zjG3F~(ecbGO#RqVeDvEZuu3ZP$Y!8p|F4I0`0WEZR6o#8tLhdmgs)@x>x*je%*%1a zze5UE3WEC!)a2;fiAeV*8>soy3`sU}R_3VX&r)E-w&j{o%YB?NttlKKJR4C%jnVlE zL7$GRRTQ|Jwr!&?EXC2mKg4rG>yf=ov#Og2c{?fO<7MO?qvrX8Dmu7XR#i--?to~r z1lKxgr^-zM_HNE${+SHF{&<2jrBMB_S^z=)FajhsEB^9u9&|_6dkyfl0ScNZp4v}2 zYgGc=7VUIq)_S$z8pKKwdp3PXEY~7`vOSQ5dIO^B1>)Db_`J(2kS5Qeog2K30KOBkGfwK- zDYs@%O`Pm`yF7&I_io{UE4YvIR4E;&^;Cng-wl-+Gze1Te@^Wx%^Lg*1rmY4SYFTK z9ogT&sZ&e%Y5HX+NLfGK^@e^mqhciPF)hmp8*mf5)E1Klr8GMMLz!ZU7N?-{X+?~* z-GGAM(MtUoc`ppE_Xhs%6&>yZ|tiTCB-SUGobcl^=*``r1tmA-KN5IbBNC)D!p9rM?2H zTMCFCqTlnv2y&;kQNbqPv-3st_V%N2b^-CLXHk{3!Ctz1R`NVaXrwoDr3`XE^S9Cp z$0+{(P`YUOnCs;=DoVi+UKLJ?&vn;%nLN)~?iGT2JQ3^Z6tYa^NiVg6>9u?DY*(l% z&BZ9fFY?)ITn7_me@arkgP*CoXei#OvDs>9cHzldzEDeR*FC(3M`>4% zRuL_J2Wn8_Yw|3SZ0Qo&@M!!ZuBzGO;*rxdX&lkTpGmrqZ>ff4*$BO>$~2iey+!Q>IY>Xl$7kB{JET>2brrGx>{l=|&&4EN zcZe}-NC#&^!JHH0EkXGbX=HAmc%6r(VQSKA2)NWLlQz;S6)BKn^E$b}{c~LCPseC` zIYH;C3|({dg7R3KyK>wxotUdn;kCKF$e!E?uWJ<94Hu9b54aO zS|Y!5`F3u$zm~_%?c6lqOYk55u!;jS5~-UrK^d9xackQ*Rbq-(S+4+=bT!b|$f&hf z#TACPjj_b~)4wextg^YT*IDRcu?#g&R;~*HR)QeZiY2&8ImQBoS$EDyFX`Z3`njbF zR2RS7#rf+X+7z=k8kBi#-1snx{r#X531Uu-MlUJbV#*Z6R?xb_21WsN1r7`+;=xrU z>y&hz;T5Q_EFs_C1@D5;!yUpE8V<__P1{mG(E5=&KX)S}F29S%EtL;rG%GczR|Dn7 z2W|YbhI%z4l7CBf4M((S-@pi-A|3aB9NqtA{CL9a`_7$sb?%TdkU|O9CGWA#*CHno zEm`S@s_n%{$F)hJiOAEuLIKx+JGfXZU|av4rqo^Q(jGTUeKaX4t!~I-uoi(AH(kslqXSt3-aa%>7s)GF3eXe7>%M0{8PPqu)dIsS^JBeZPT$XS&s| zAJ&%)m;nvIF&_{-S!=rp)jh>n0n(OMIebaGU^J01LryqWMe;p6*4KTi;fTzzy zDEuJ7s!NFmV@W5z3a@vG3VU@^fbwl*7T1!Jy_i>n*;_^af75BKNhYw@-;A?I7jTis ztoGA7-^8nWE7#yg0(^}CdxlE%6xGUwK$}{NJE$s5Sv$|Imr7Gd4PhUZAa1;c?UB}w zkgi1uT{5|;R6$m3jPi;Uon0TpvHV#rgZMSdm47hnV-1!664!)uLYpM;p8fGf)YFb#kX^N^L$v(rgH&JmuKs^a#l^R zBSACCto2;31Xyzm?5bC{iTOg-g1uMY-kybMzL_?D#O6}EL{c|0JGz#qxY8)US|e!w z!zJJcjz37CkyCQ{}(CCpdE7>xKJj2nZtU&pO)%w zy!&hkgHOML9-&b(+n~Chs$U`~Nl7zWv7~MzY1rPMVP!t1ZMdYm z(_kof(pTh6J2|#?iFo#nPqM%{Uw7ks%<4ZX)ZRfHPflpj2#S8B7BrTVlg($%o~Fjv z*nyRJV)VDMbG`$Gkz24~=LgVsUb|%h9ZpNni4d9)y>d91H_Ajt|#&5*n}h4n|%V~hdzt{WA%FclMNBC<8ic!TO6{nq)d} zUeW^BvL?=vmY?N`7n3dwq}%a&b`~qyn3drk56TNO&H;xRUWo&_Helmczv{v z@IZpLMM(iNs@eRYhuJ==5vvG}8>l31AxlwcLt%+?yoSdczD${P0UJ*OAKdsLE}Wmn zt9@gbTgBhm%LsqvGUxBYEj~KG z*@gO!I-+j`IJ9`8wT{De8=JTO)p|3=Qg+q5!4<~UmEV86&y+1XM-c%a&~; zb49H$8OyiWwZ>rn_N?0NHB)%9D~8niEW7FeO+dTWt)X+e-fd`}r>ohNUG-bnx@Fh> zOnk*C%|?53c=a0UMDwU&F~rJUT{z|+MmrZ|UzLkAZ9`n4KOnL%XCHNjZ5KL)jxdGvrQV(IG(pc; zvzl!s(QNmir?ZClMk%eMvtqNr#3M*>ph?2Rr&64`2F`n3H;vqdm>+KF~%YGHb zr~ftnN%wp4Plv~Gkye~|9cu*7wst9gulkJkDArODlH#O=;i-s7;dUw{Ym3{_-rk3n zWoN2?M4ti6r&>nV)zx=hk~6;@qr-%=Kx=OD2 zL~ATy>v25KecwX5r-^dQn&j=o^xFEhQA|UNgnm&zknrwQfxiY_{0LvJ-3ibOIH$>2=}Q=}PW#c^w(9 zm;QBl|Jb8=e$~_Hzc_%qN?TAT)mcfW(Mdt-w@V+$UJVF9TNgH0>UiwAKf|jFT{yw_ zkH-Z}5F9Gf+cY&)s;p26ftLUs0gd)Wf-R5v*J!cbT}<(l1ldcRj~{Xvr$Uo^m#<|S z2PK82=C%3}k2E=k1KdChBQGLc@g&;6SVspp!O{-;Rj6D>duX9*hzZrQlYHA*Rk|PyfFIjaQFJZhvEbWO`j4jS&k&{S_#6OpvHJfg8u#J>#yR& zRD8Z&9VafEb{J+w${AI4O}eOoX2U(R<`QitFhLLE69la}j8uLRi{JQ7{KF64i+?rz z5-zn(X}X4_jubeT;s*Cp3$l{?m=J^rej%-}Jm-5$csJ*}xIBMOBBrH5cQT_2fFX)~ z81gc;<8Zxj(+1RfcGt~wjMD^>5eny$^?ui+IE)0?*l!r$m8k_SMt0(R3bvQ1eEhek z{yu*4o_~NF^LHRS#$D`DiAk3<=*9WVlg1uxCSFN-h)wte!M2Ap`7HwNI2D<)9aX3i zu&x_Yie}5f%sQD&Z6R41a|E?BI2S*Gn`hsJ>5hZgusDjpmH(UgJ@0?0D=?oHX_Xf> z(8+7~TcJQMvn2jzsmZHt2hkL_W|n-rD9T0&^~74A<=$Ap%CL&PT=+W)pd|v>G}rv> z1g*$flXbqpOLdWZx3a2;sDl*qB6r8d0y45$QO^v*HB_iqQmMQ|xp1hC!NU=HDHwK< zS?hdsH*zcX;RnxmARHM)dHZEDW)rAiq*OdX7GP|Ua-)lijg+xmrIxIu9H!EDGFRc+ zSt59rXf#mSOe?0ygw%Qz`F4h%;W))ds}15sUi6Wz3szyGYeKJ>Ubo=@3#&u?r^5j@ zgmo+plyT}^6WI8>9eC{YYZzU;gsZH)Wq4_1d#ke5dTUsexRwE!Ejw;#)moc5e1(~hoXTHiHeZ(6<01|+WTgn2K_a5Wu!y}x7`##mk&*|oKECua(V+saUx z&4$qN+SACgWsvDLPWEaFKuavzz?D|$OW3(X4 z)GYn7(qNsk$w&*%M-|M}YM7rTtu;7`?#~^?OOMlgS-Jx=5{)O?aN@%ImFt6Syi_X% zNpS)CO6bp?<$FiDsJr6`?=8mor}-E+(zkI+Jnb}~Ds@jwp=mgnt%M|%uqx|v$nWFv zIJUUY$Kpc<9?sjyHcjF@mXK~B-XEAvs#Vb*!8mU;09iCf!rdYq6aaBiX;m0#U zv}O@_>Mv3uF0^g{tuNd|)L%z|u#&=a1F7yFg6J@%L$64-51iaRV1`Mc2B`@J9K4 z(%#48$Ej$SY&lNT7A}QL3Uh>K)4K6&NL>t*iZ)BZn|SkBYL`}o()*KV+!kOgc@Fy* z{t&mV{Z$0>gpQ3of$^#-E-$5kit5NV1!X1T(j$G4-HCy|Njx-J!#Cntr83Q}psTj| z%dSbhS;KBq*7*73c$HM_NxYX-XGQa;4|;pjNe?dh^2g8gPVNvbz*FZViSlv zA`48JQE9wEA8j${#>T!|G(FXe zGOfOq5hmd&Yf*xszSw@w3JoTX`&(2-CR8CX4ILbiW~$yBk9!Ieg=}UWFyU5JstKaV zOs8YGdFi7F=!+bwp1?2Xe;L2y{ULX#^Va)~I1t#iW5TpVc9~27v!<#V5M_d{1o%5G zfY9Rh=17E;@J_NEBfSyM6FUz|-Ox*^$%c@&(Km7b(!W{{_`NAAYezOCn;cQfJu6;B z(!T(|zk+ap_oETopHI+tKEqZ5?79_PBlkamZJnp^*emUr8oM8rkvaGRu;;17yxxmo zt_$hH5J7Sc>ERVfqm}d!wbQRErpTgJchUwYzDbMHxQPxL16>@a1Y3=9K1g3nooC<5 z?zl7H{_n+!ZWoKe!|=8GngBhgeVp#9b6^tZC;&@SM2qBCMN;x{Noxi#lCF6wKaV%M=TYmS7%pXo z^d~qi+G0LxR}jE5%JOJ~G>+!%ZKEi;ofou=BKC5K_rDzBBVRs?E^52;c8^G*^In*X zUChL<>q3@Hha6Ld*Z4>4yeGC8#4z7m$K5a@cUn%Hd+9Tk_K%dBon4-K94izOQc!ha zCI2Rp2i<(k3q9_sRUnmgWE!YAi|g0z7A+64C{(rOW<(`R%2Ib%qC5lb_7T(wffXY6 zJcZe09s%$9(N3&h^Du%og4RhH|7D!5zoAyF>5`M!>P1bO6AinpN&C3&#PsZvM4ZB! zT%CS#ews9w*G)Z`e0G#iaU}aXlKBj`cl6u!FDLsH?;P1ip3X)P5B|Qg8KUqWaxSc>S^X)&w-}w0t z;rH9WhDsD0cW{;8%K6&7UT8iMnPC`ebBQ5rz(B{k=JIwFk@g0gqC4YkizQoy3vA08 z^X1#SdEQ2^^=90R*C>>C(^5O*9YL)A?^L6T#geVLqgeVw){{K12U5g7v(=5b1Cj-N z?#180qkI1bZr%Mbl4CpvSs+mvCT_jSDT>T~dTJBfWqP>(Y*-JSA?dIRhe=}QlvW;Wd-j7k%W81mdOp-6I^&S!k(RfqT8>Ll2Ht5K&qXi^DeoHBwG)C9!P{ zAKPdu#RSnR4_4_R2oqE<66mX>rRnNHg?l(z<7+~HrAT2}wtn%lNwX3*N@6AwiJTU9 zQr>{Q#@cpzng}ZCg<^4e-R&AC6iUD1TpNl+>0*`s#fc(v5s2E10DfThm<6#0q6c5xcuwV-xk6Hmnq}Els83l6M?o7lERi!n&QGr^TTa}XO)93J#cAs*|H*!@f zfXzpRws$kVg50N zUZFp?q~9-RQ3IZ?S|e$O}7tn_LUpS+*sFd5C_&tLp4B)3Pn{nq!v zds)OiU*PHNl(oQ3vpnbBHMDVLce!U}3M_ji z-uoH6gs)*Gt@`_`KaGy?0ervyU3|oQ1drt&C#g)HDRU-73==aS>Bx-5Y|d4ACe?!J z(4WYcn>$x`BgVybnOm&_!nm}!1t$00osmpM623y z@yQ)nQ@M;26Bnqz6HKeLh?6x`!U(kCdaltm1j9CMmm{t#s>i0CqR_-SDdV|>xUEJv zRHE#RFFmT~On+PL3??(mbLkz|=##Y>%0k?j#%p!J5 zVbh??8j4>1iaZ&&B}12jetlc-TDu-b&O2D+{u4N{0A6JYkut#v#wP{=C#EHG6(t=HJ> zLl?AMguJ~=z|=Z7@vSSvBy*Y^0;vdBulYzVKh%*Uux&? z(==WZ=Cs1s$GMPdrigz$&g(3-#bc?C!yyr*qu7YLObWC|p3#VXdhCRMl5iTKKMDHz zB0Z#3Bm~&C*KCj@6-vr$o{#j$di4Uf4}F-Q=R9BHY1E{I;)|9huB#>MI*mHPpEg#J z^M;tnPWi-U+^Pi&RuwB4UlAc1mN9Z&C{-`tqF+s{L|UxR#lMSu(2JdmAAmo=6PM_t zizO>5Jgu>zNxhmXD*|^9@ifMr$up$uUc+-r=gzk%hZVaq;}!zTL9An1Qi{L@vL%mU zZ}tIPc;gnlyZk+5KeiX&$X?UVF&a^v25MdSRVjhWHAWtJQ`aqg%rD=N(m16m*-oc4 zs@RmEh^<|3=E#+eaUG(~-jlK<{XDfiM>B^dvN96pByB7`7^=8rtycjZDJ?0*VQLh{ z?Npd5QkjYuS*)c{D^&^U+J$PI;0rJPCZ@Mtz0OPDgx-P}6XBc+e_G`@r1#-8|Le7xgl zus{6*{;BtO@NfNpkD~(Msf1aDwx_l^POMs(;egb4CoS5%2y3{OJWGZ2 zhud>FyRjYh{5nLh?LcAi0V-{K34Ep`sYf;|63RTJS3cPfzxOP{bE^n4oB%rje{mRbeFXVr z7ccDy!F7lrO6xW?aFIn^5L`P_AVjkRf)bTXo@t*%A4+a4SH?xLVl#D-_?c-GF9yKM zAu3O$9!%tCjAB`rh-_ZpC0fOEF&6$Cuf^E&%fwA%9pY*u_Nvdp6*ID~MGILm;$_B{ z`)+Po3{Gpb@ztp0Zp*OCvMlgSh+BlFW$dsgvTM+k2(`H483rn~rg>|ClrtJ#&)X|U z5*p$PEg!xzw5bVCGN@(?q71G4w+n?fOTL9b&YGv$S_;w0tkh`~XcED}mB)b5R$aZA zI-14RuDo42dIea|ByS+3#+TnjKipOXg>?kO9sIxu;(4OV4C&!anv{+6*e3}b^X8X4 z8{VnZa3Aso`Xg#K3Q_ys$|e-w%#gX%0jWY?8X8x$T^;fl;T6WYsLL4an8h!zDPz78 z;j~2k62ub9a4GGkRoX~jhNLp<^3(>Y69#ui|kYpMycPP7`ePgYA8VPgne zG44H!LVt$R2*q|^tnCG*wOo?fF3O@Q#HKvQGx2YeDj&v%xjRS^@Vz09ZKiIjKuO+_ zu&x5o0%mgYd;!`e+*V)0V);1stM)4&GFF!>zTh`1^SZu1?y?!X@&sXa0;ljGejaa} zz6~FFW)al~dhvw!G_~qX6}MbWQmT#qO|A<`-B}TCbJD4~9j46lsq~0~WMcoz8vkb2 zlbwT8cfH2Uh4d4TYud?-H%*~rKABh>Qub`D+nu9P1+$HA>o(M-Viy(4*v~WoD(?%> z7PaV!bl<9S|2=l>f2bw#zIXmjq)$}%n*;QyOly>~@vIu6*QjJhE*V)MZjha%uYZgR z(--hv?$24R_Z7jlUvCy#ZPu{z8tjJY(L_#)Hm%I_%h*)93lDXCk}S%X@lS$};os-} z3VY_4nyujJ`V=v+iLT-S0$`EjlUx~+WDX@LNXr)_98@UNr011F|elDsjEKRj_= zEtwhy;qy5p7fzX3zlInxyYbE3g3a~spsp1ou5G<~SIGCQ@tYZ%?!_xzhsO3WR-dXK znRVlM%}=;~(~$zatG#Wjv5R7vne}LDrX^@~S!#(`_zji~Ex#XTErZb3$pnrli>^8~ z`CPMPMPu0Z#7yr=?YL>p>xLEUWep&0Jz>@5GqfD9S@|h$IRSTbm10^a-X;6C0(9on z^7Q*P>QU>L6+7u$y#xMg3d~;8z2aD`aMdnKAyX0TRf5EG$l`tcfzwo8E>qr8(^mRO ziZ#p_?Eq0guD{P-jWj911OV9FIW2x)py1K?S~1n2MK^pNBc%39TE;7uXo)Q1Lqm(W zuO8t^nu3}~>X{nv89BCuL-JN}fzy)AZQ+q9MDPAwiVu9bf<6(NiOFz8Lz6O##MK|j zTB!lwxDBONe2u^+B}S!vWK9AY`6vwngbof?^LrZzm>bC$4M?MTPt!zGGDFpK1Xr@$ z5rI9L^AvF7iZBRNGWc3t542oB!V^g99KZA>4yEKJ1-EDVW5>wK^d3nwA zZPYTCBrR1xAE=fnfin_?UWnSTrT0Aui{z-!rP{CbXz2$OdKDYKW3EeTW6sU>w=MKw z=wq|+4Q;%EMBX`4`K#%Ry|i%=Q6IM!GX2b)9D#X=Yo%)o1W{{WtM&@$X?| z{APGVp3#CP>P<#Kd?L=sNjbqj*H=dc_tEb)UOi2ik`OafOd+wgpOXfGxm?$F;Ic&M zkPx|Zcop}gKaTRgFXHD`Y{UH4Q5*@+6I??C6xv}NYB7ox-dYS6H(;46F3h0TVxGiA zI%)HXV+GsTHcNLo#VP!T`f zpj|~>qk~rN0ty6_iWEGMn&c93O9e{6Hs%qdtd1v+e-8C}8SlC47t#JQ8H5@s)%v_m z2ZFWtvj)JXFhv&Sv76UYN>o1NeFZOO`$@AKJ0!4Fypu(qRTiLWRe;H_4Xsom?aK2z zOx9q1X$Q6yKZH%*m++6hPvW~>e}?h+gsJ7^8PB?})r_FN=nmaqsaC%F{;nLRKGcpi z7wWk2Uxmc%579q+dDBP&E3PuWFb%)l_DO&G>`i<{k-uwu64^=U=}UFcP*Emi`QO0btN{p zn9+07?D};hTcg2R=~sDOI_EUN(lgX#(Ku&p?Rq_05AvjYh=GLTa7$9jybOd75% z(a&0c8cFhX{y}P2s>MT za#|qe**0HCj{eCGojSraHR1Li0;WVB(dQ}A!>eX8Jn-8wcD){ zd)}!QyAM@qk-S==p?qRe*hbOVWeO~WlwtvCsF1(WkF{7ea0~frp4WtjOVdx|LNu** zhzWYCpxFzx4(Hu;HJywCCx6vwC#~ePZow;f7OPjqxVTD!Q6#dsO2(Z>ktW^+12*bC zs1XpNNCS$;vUB)$?O)-aIN9W?>C}lMmPpp=Zu)?RcgiET*qETLJwD|kU$*kh<93Y@b zY;L4gf?}KcBer>6+!QKlV&GPN;gW`o1%U-K|#j#PPriZhzRW} z6_rxFfTvFVIoEX+AA0!jqVR;w3#rX$UM()y0HoOm*yu4HOm6TXc91&$G;Z9g$lY!u#|ZzM{nJOHB;}w%JoOEjy+zhSg(tPdBZf{vMv1OcwRWcpHt~_>n4OO7kGH$vp&B2V4XF%4s z-)+r)amit5COtFCI zEmuZroYqVPv5YJ5RBtzsL4r7QXd7M;JZGdx4zwGeo4C^Rx zHl3$oiQrimkPYZl6N)^q6jdTt zyWdH{*+xGtL6(9xNlk(OI105@q3O0$4% zLyie|^`|>&v8~E}3h&`{`fm0D$Gf1T50%hOtW(KVXKwO7u4zQ9w%xpzi~Jsb4_o3p zad-PK(CYl}xcBD2kI(k}HjXXqLzRFi!9p?bb&04I!e1DxxgG-W2JE=pj$gig47qoc zu~-{x{J~;v1{YpBgX+?4c=ClCNx`n>ct#|F56^cz32)D>I#Gk(10bN{K{@2Q+E(WPQ5*2k}%t z<)gM>nPZ)ZUwIBDUD3+wRzz$?TP!!2mWfXLYU`)nb#7L-zcTXXS~u^yFT0#u zuSo*x%^7XZkLuotTad}T@Ai&EtLErkccH|tQR#h>@1<$>Pf0g^k|z76*(vl~ zm_ozJGLx+#jh?k~sh2h1vqI8LsHLZbCReK5SZtn7 zxRjlfr1n?~-B(D*oSLTwJeOe$*ZXZ3Gu-%kirvp9*zj_KK3cBQ=khd%IGUL|F;Jt0 z#r@}nRx_7P5NN=zR)iDkE^711erH%9V3Y+|Nk7-)i6 z6&w-$L0H4bL7uxbMeX8dBo!<{F!aev(2i7r%JDHzU@CM{9MXy{_V6(mDm7PF$Yb#G zI^0zJq&5Nf_XilC`T_Qro}}1cRJu6QnnN)X8~o%fvsPa$S}a2zjULWR*wz(cbOWtP zx&i96Uh7evN<*gBd!6P;a4k0R z)e%}>$IwnU$Fx^9MJQw*2xxU)(}c7zsUiyP4$_ZZ+LA9QkS)qfEJ8Q;Ocw!qEx*;S zI)5mAlVvAl#v&7ceJpVfX@vR8MNCYe!umUJLR*;{A2mXWzV))GA$yt%2pU({^i~oz zb2F`Pas=Ka7E}eR=qd=Wh}bZXxn+L=hPiW!$g0|AbmZ?R%XA1U*S!O8tUij#0nXh( zfO21s3K|LYXfu-6?#9OH+whYeWBA(-A4TE)1om~I`h8?nMJl>0)+gAx`yvj#u!N;q z?iG$Q_GwLa9Ol;GA=G-6S)F0vRpNF@SG{=?&c=G$l zczq7hlAYx25PO5zQv*uKI3X(fZ|uO}=Km9a+Wj17YEpgEh0DCwzdM1fbllb|M`Qgp z@UJk8_p)YJpisfp zJW4}ldDPSdUo&G3T??ymWzOjhyEJUfW@f-RssQVo@uha02?rU`GOUq$O~g8-+j&mX=GO5$J7|q= zC#Y`pge}+4R=BBRk<}-uR*dqy^ufkwd99ZCUYS6f|2Txki6lC;=9O1lBba z7F!S{8%aOyg!EhWNfG+tc3SK!xzUG+H=SBAArOj~7Hl95#szFC$O^dtxg!0p9RyZd zu~HdIyq1Mpj)Eh^j_LPcUGM$yM|o1Dt@lm-F{a{C3$QNW$;FDAG@axM-owFdw-!;n zfdFw4U4toRXl+H(s*z4-xeHrRqoqXebw}mRDg%kPhy!P$%yZ6!m&K-~=pi=Sma~)`F z4^<=8ZhWc$5_~i6Jpyi)EvoXVam^BBmI)Ws#wlLZNY6z&{x6Roz}h`~&_n;M6wB4~ z&zwck6xOaZe_&sghVlh$fH*1Y-h@USyYiaG0uJmhb(OcS5!ymyj?N3nYtQr{n!y=O7Phwg4 zk-b2E3&6HY_Es#$RnJ?WIlybi-gwJC)4ZAvZgTLDUJGCwPt5V04AnRoVA;{%?B+_^ zwCb@}=F!Tn3ASDfU2HxVbm!WCUA~sLg{hh;FXooCK%raka*(_hzc!PR&rAfM8%fsk z!>xn!8-W(BL%s5(ni|0nwda4`Uc|1biWvgj%S5~9yW8>fKn|~M_HlS;4o7d!;lj-! zM%U*c;&^KA3~oFA9ei}lx3TqsNn9wbL#28jYV%TMs6+s$X`Y)WJ1SXHzp3=NO*5z7 zm|DC7WYY7Lu1s{%Qt9=j$7UvlTV(xdc{EA?lt2NwivTE^uj}8kMQB)}o0HH*q20~< zFc$+VFz6E^i_C#tUhBXhB)@#ap zECno9^1hzW>2s|SWNTzPX%eBb$m?~6D$_aI7#BQ^7_N?s#m~)N^-)DP%mxs^YB(<@F9u{H$pSrg<&4+nEkPE?6odp?#e8G0w>n zE;m-bDjQy`w36uVW)7KJi#6$rF9rOw;uy5`p}iX3md#Unw6epvkAx_ zlTwP0;b8p$XKaCUSJt~zP>daGn$9_123jjP;BV~0t2o2!lw!_b;Ax4kooj(KXxSq$ z%C(UK3SozWY%brSImVfEr51}eN4uBSQ=!P;5z8(lvk}XYx$iiJAfq*{6_oPIN~F@G zm%m=F&EoRp5v;xaCVDtXH_zwQY7%Op*?-mrL^aFpnGV72RA#mjYNevoWu@nh&#a&U zQ5jsX;|$9gJ2a$}%*qs{$1L3g8{-G5u(n~#xjT8y%D8a89mA&{L{Kf`bl8r4$zlAU zeHKq}?B71pg>Qai3r;?kVKo)CzBN^8Eu}{dxZc;@6yW~5r?5FsAMaR<>DdvAoYhpA zdf}fXNFKZ&{l`9vouu9Gf9KQq&?m=n)4Qt(ijFXKW2Rv-1^oAaw;rqF9&OK8q2;a0 zcF6tZm5lP>}iRGAB?s^`v9HqfBxJqK@?j2)E&uaDQ_46WEBDcY#fcTg^fPGc&g znbMuBw|3x`dmqJrXzRml`UY7G0`e1i#NT`hrcnr5tk&h=<)aBO-gV^rwE#}~hf8A+ z(GZ$Z$IY~g+(M}9T!FYsf5#-L#d;O9eK9T%E}-2zgOlecaoe+}aG(Dl@!nm(kJq<6 zfG>~#IKKI{y_hB~8bwDrmREQ!x%i|yzm#ss1kR)cnxyPVJ3ZO7DY}W6YY7S)>IsGk z#8TK^*}}{`&J+CQaUnDAFbSBD#VQu85Lzqw_gc?H;Y$uH#Ucqn1Lz``r!y&Ik?Hqk zB$^0s@m?E2d4`R2+Nx}Tyo-fsGe8^C*XR*wBO-q|OuBf4qGg2E#}*^&C4Gm?p+*gZ zpc-8iVCC`W0@O;hW@iXIRA?&vU|bqt|3Qv&Y&Ezirx`1|p02P%Nv1oIoO~b?#v(LvN3iUej=$F2UiQBIFye^ytU$&9nsu)2X}seAKPqYq2ClqeZ;&M)IDScUDV zOgxOj*B;02kGzZi_rTFYM!0f0C&>&BRq6NRyhR$3U4<*F7{f=ikF5M=4z5dcQPclB zR0gc}dofOHOVZvpHvCohza;d9^nJNPhtv|HM5Lwq=|0hB>p)#(k;Vi~~M zct*OAq~#GlgzXuvPVZ}YnZDpiOIwvK@m-Ry+sjA z>NxRd1)M#$3yanJ>F=iX8xnOx`mwzVg1Q7haaTR{EGM>&@H zW#Hg7{sGc!Sa{c#@7D%k$(i;u6E~2vDwHb++In-C()x&&8B6R|T=oT^VIeyPr|})z zDE`WEdsqCPDLmAy-``a0m;ak17RFiDz_`$*%{WJ}34Dh&+x?bg39oSi@(b?7T}fi^ z8v2D1Cg#=}j-6cRGPDA+RJU1i?+zS$ZXPp1jM+W(4}Q8Ie%nTLKlw2f4?awwSY@mR z`JaQUx6y~vcLHZ`d=(e&J&Yj=n_K5kWAog1@h=O{;?p14fj@Zq5q$H)owRravrZ;t__!!smIxfb7)PkVGDh;3`KA%YqIF51PQyH{D zmkJdM<@FpF4M}<|rR=$(mgW4U$uZrs5W{2zT2q9-b@{269-W+z$&0>*L^O838MB~J^g-o5$VFbL={s2 zNIqRm+LL^FNXta2b7>1G(TviuM>_PBd$8Gik80E2qNEF5!s+S}>q9hfYDKeMTM3#q zlbRt0E;eu{?j|%{z{XsJm#Lv7WI_aBM6_1D8-i7jk&O$Wi9GrKu`JSguB1T^e@c1+R{LNkJhVbGg4My{&sHxO6m4LLwS2|vEHMAh~ z1uEdQK-zn?&lDbIrGL829bqT-^K_JXY@F zo>@e}UybyCoS?yT@G6)0r9^5Lg$# ztGH!NJhQo=Qd3x;TWVMuowrLkz4nPVr4S3!L%dyFf4-W?-T*hF6qO*j*0y-+i>(g| zEAB~nGLo}=B*4a0Xk!g*^3{T^(vq!IX}L!9zs3aDtc(8Gm8i$7kOtd1A6vP3cXBM! zL@#g7LNG;mNz!F`DRe5;t>T;tO%)lE1`sT9KHD^{JLhwgN-76^vju``fsaLQ=3+ik z0huTDx^3wptS>$YUs@1dplm(+N4QWqPN7#;s@PD(#v*HN3b33gHZUcDLR)bg$NU;1 zUcU>}=qns!obpJiln12Jm>EB;^viUQ#+T}ALvPP=^yX0#`Nh0VjsKGr#`N3~bafA5 zux+b$%R$78Qcdi}@s|5Zgw9P@5X(bah$OHxiEB+7yP~=0OzmCwMIV9Pb7_ko%9Ld+ zkdm)nn#a<)OISR84pYb9!09uO<8b+LTuRT7VqT=;R@RiKI!wcMqpZ|n!uTYhreKen zBi&lSEx3>LXoT&-R_t#(r!fx^fi;pya$2@g&`+V=O$DS=HNK!NZ}Oo<1o~!QYZ?RT zVhNf_B{!N%i8O-{mIGeD2Kx9^Lqj^ileDgZl-e|&e|w&Z;*aUZxpesr6o%Tddfje# zqKR^Zk_zUbDPT?NMAkB2p4#FPbhTFcEqT)f%q2~oO04KMR!C~++o-k8`4`XbN`9k9 z>v3;L*WhfS4Y!hwINCnW>sC`sy-q|@K&uw$o>@Y)?Kmd8xjLzAEG%utG|y#V+{Y^y z`Vmi;F#atbt78t>;G#HORENudbyS3-h~3&SSNzyZb$s`;0bV|MGuPpesp2FN+QB0K zmWBm#oE|>5>#-%OILplwXpiz5>?bClfHy(|V(S90Sq7c;bvogTW5AMc43;!w3PM_y*jKP1Avg`YwgVBP`x^`{imetv}FZwNB&o`IyxCYgF z?dQQVNNrle8Lp&|%{UCG8sL{<<+P4NwhUaIisM~pj85fouZeY?c$v1C1Y8>lAFXU~ z|TQ#xY1?G9ZQEvr8lkFLLp4!;P)R!m&HB zcGY7PR3oEa(L40Z+ zeRV!*zc4Hr>yDbVuVoX9YGrHbMCrbx#U-lr*Dq0DiIC4nq_`;FX(bBS=KWZG)}1kZ zKk=u?7_8K&Snt$jyg2$<%%yW2TUF`2y807qa2;c_7LaO|F*CN#dRls-wyX>;;!InF zMM*!Q;Fd-Zk{c^Mjw8!9NPz(yY>JfCiX6HE%erBRX_2iK5lE$Lib_@q&Egp@`_6^?`BscH)l$zEu$Mtq zI1ke}Pe43Qn(_cfqc=$D9l>OFp3pi&kXTTfxTfIha*Jbohdqu)48W9o@D!9b<4*b{ zr?Dn?6JBb2o#0CUJQbyg3`Y|7kXok@&k-nnQnI9rQ#FDM1l33tE!oSS`0YZ`vc%Pr zXhD{MchT&T5(tuZ0_-B+lTJKy98X@Y_?T`1jn4OM_ZtH6_~cQvujs(a&AX9as`5K@ zMWmI6914JCHi_{}n@+esiS>l)R?(xfz@1jM9g@6dbL;5MM&UgE-OXoQ|CA=uXm3T^ z26UBrQSC`_JRsE_h#QH(M$0`3E6DY5JcE2*SmH)JhGKSr=RAbk+IB>1CgERRh35}Y zp?i@mPOXOin}J3mYr|U2wVaU?`{r7Yo=ow|S3{gTxE@Q@VY+i}(DsI@*9UDy>HAue zG^PBKB00h+rDO{-|0QHaTCrVckPV$ju!*$%8Y;fy+=p*)-<{&MqOx7!x|Q~tqRjVD zzTDRB;h_in@gLUyBRqZXCX^^6r5AAJkN$%s%`c~kmx*leibn(5#=5&29N+48y-!`w z&)XUZ~oVnO`@BdQEh+_?BHd zt60?vvR8)%G*7qH+)i6z-)jNpEW3_I&>ZOUqZ{o_tHF8Ax{yFqN9pb@U}xbosK4tK zsS*HxoLcxwS}>zNif4BsS06GU#`Sn`>qYFl@g(-`JdXpLXD~f5i*nF`mb!_NQ z@m_-L5Lv&=dwe{%)yFZ)rxRqprYMxhD$;&5lQxX>ubP^tLIt1UoSdmJChuyqMyL?K2gdB=5Dp!NU^G=+ahxhAz{H z);8rBvP%-=#Lu257)$=E+vmTBe`5KPRzoOKrDd7;cL>0>|hAXA$0Ja$*k;4|; zM6fuHu3`-*LSqM4^$4i~t;8$|$O^z}ca;p9H=9|$J{3;i`kG9`_h1 zXqLHxDr&7tr&YO6@%e&U{xv>U`F`A(y{N_R_hE}O!l}msNn-nTkpU=+2e>`J30ksI zAT8MnTo1Hj>HAB=ZYo>dJWVM=u|j>aVIefutOzz*dc{JdV3|e)OlcQHe`_F}UTEFL zn(jn^PP#N0&gbXj)D)3O2wajMtHH6JNy5qa+QqTgxaO-Ex%F0fqXKYbN7ASPv{wsV zr?N{op&`!mda@c5RBq>VMtrp(oui?(YmZ|IgmV&$u!DcMV^2DWvjnvb#dhp#J4P~N zMholL0{S)EdG941O&Ni9qkJW2%V;}!fO2FOyC!OQqWCbT2G`=y&<5mRtl`PeuSMb9 zIQoXjl1b!bV1mvJ;5xFCN(Ys-h4Td1&xiQtx88@vrFB@0Z$%bygZu638}pM+oexj? zAWFMUp^Qbb$-hiR{7H`KD7@~=@Yl@1-!hA0Ofr0bg!aQ!fau#QRz24v* zX%nja!Hc)QjPAR?ijgcLeOJcLfeU!3?|ay| z^+~jkJVC&G9o1qPy~SAy{yy{`yC1nX-h+#UUOay{1=DRac!a{`~%J7Fy9y7|ET|^e`#Fl+;!zN%P`= zr6ri%zyYn$l6bnIC@lSuo0USw3+A|(%Lo+lOkonS^bkuMEiwUKQ8jF_bi;Is*HJ*0 zlyO+2(m+8>;FALD1q#cKm^5Yh6X-6`_sjE*XvMyKY$M2z7iwoqq5LTf7HdcL`xJ@)e=s$OuyL0LiY$=ERRX*n3>F64A~j6)lX9^4idYu zwYj~~Y1P6_#Fs&+@X8#T78ql=f9 zk;|;kY{CYk#>P%GHK(qDVO6!&>Xsfh5!j~qq?@zElA|Wr#{s#skVgox2|=aL8^DR4 ziYp5U4x6HG?AzQNmemZz_!j)$;0nV&zwSqK8`gv-%3l2ucbNOUH4ZH zSKBu3xu|W@>|hO6d2@u?dF@D)D%b`VpqpuXfJ>w@wy>0M+~W0Mo=VrIWSA8C0je_e zWzcF3a%6Klq>EFDu9{f=&$0#5d7gKP*XP_6;>)Ax&mBV8SH=1><2b*f4^vBRcyV$V zrKjhyNQJU(GDSxse(G2a32}~c%i#F;GW_Ph+=ZuJdLIS#8v3(0(~Ys2r`Dw<4MoW_ zLRS*yJ50++nGx=@EJupCc#;&+f|{sdwjOP(x%UoCq4;tFx{pzyTSi*Ql7m4n&usp0YGp=Uho;u;wCuPplGy%;=QTg?(r~UEV=G{y1^9D~K*T1fx1N_{ZJlD^ ztlfq@vLG+#C$S_AkZo!hty)R8{A4_5W{Y1kR7)VUe=n0IXlgS~XS@=`b7&G`*%gp0 zClFDayRq+XK6w|g^ScP2TF{Lg-Ac{vAT`6;T`2clLa}WWzr1w{_uq3Cx9*UG|#1Bs5p?V$f z<$}6{pt6$|$$j*{J;<>Q3NK9nJGq`d)qwzWISrzuk26*7SJFPj_aueICAzqj88FrQ z@o0i;9ak<4>!q>Wf;8l5_YFl{khB*8St&Ll!A;U8P6C~zVeAU&mZLSuQCVZ!(JA{k zM!*%{D=FgoW!|MMqcodel7{HCU`sh_$$6CPZ5%717nuMiASr^& zpfzV`QuI@}BLA_{=drc&P4sYN0XAvG5~p_F5_`1F7ND?+1(4O(&ExLD-3rRvf}8PN z->ax_(MdVT8kMFvmq$d!De(ntrP@=E#w>`oF44t7u%K}Qfkfo{bv;)BTY1mVn}8*W zJPra=MJ=G#7)6}~3yL4Er7Vjyo})r0#LH}_BF`$F@`Ufr&Yz`wW*lp7zZKz>D0Bs# z`z(vEkXRm?yqQsm3bbcKDqbtR^EgL3y{;XO<(&kr9D+GUY+pCBX^_{hnD5b2h^6jD z91RZg9C^J8-25F>+4@L(_fkbD*xY9+3PW~F+CWAW1nJ}=Hk>|=0ximXTM<*Y^<$81 z&*ne^uV^5bcbckN+6A8~N!NmR)#~v@@3!lFW6EhpQ3+_R^wwZI!z2yy4X%)YJ zZ1yIVphWVJB~{8y6R!`QQUrEsR*_2y&^Nw>;Ly)w!{)cDx#z% zZY03ozO8`Y|L6{Uee@HUAH7r4!t#ZevH1A^iLAWTsE_Wopv`hCu@#iC?D0z2^;*EF z2~?gfH3tR=f%ZVLap|Ly7!sOD5Tzbb1 zd(b|4H|DooMtJfKq?fr-Z|CNk&ZBVt9&LbA-1QqnazKDVN4UF~Qhei5#gCifM&$JhZfATcJxQ6X>32x(N z*(`KQXiiwR-+8Xgb3FkTC76Z2(cmBj$e4*pO_NNchb4nUCfLTzSdn?Pzq;Xt@oeQN z58CiryU_VkCXpMQ2a*a&0D&sCpwUWLmN5Fpn<)OAA)gbWC|fv0$av z2DMSr!}Uc9O)2aj(~7MZX&F#>roFUcC76X4tiO>nzJ~|79U8r;xk6AMq)#A_CI>!! zi9tpUUTT+00E=|nN%CsFsYikqpawh9@(D8Wms4=$=QvH$*m|D+*D8v|3N2dk(^hz{ z0d^MOgB88Ij0HGa!I48>#pTi&Ek03Ky4b*lDTL?1#`N`URnG)`hG~xtQBmmjPGP(l zVS>U?>Nm?V%3f;08rGIERc~tVF~%0C?L9wyQ~qS(WH*E7Sh*PvVpbk z-G5QbbJsZs4FFG7V70^9|DF{-L-amM`Nk@(>q2o8_V>M^b*Lk0_#l?7TC}v5avd7L z6sdE*tWn1)=eUroDGQLL#&sa3e?ZGjijauETS|Q@MMrB^e64!D=!XxfHG1-$%(O4m zbC%q7nEK?-p3sUp5{@rhxdLw=O6WIjaSDko0_Z+dUL=Yp;5_Gd(uAbgRmETOt4oZ}_ z^iy8)G)U2-wk@fC`NY>o<{%1DfCu)QSsU^6$SXpS+Z*TSK+x6yYSlU zdvMsh2{~%c)%*p5^;Rn3eVo=%0bcTAMWM}vE|xP)4S6DgX40EBZ9mLCw;4U90rahz zz*2Drk7lQ_V?~V3ht6rL;DBeWto0n@t;2bI<;Paxf6U#1nR7QFt8PJ|hYa28zd|PL zsM!ZPtzHvoTa+2MM%}Ad-l9GT(f(#umFEL!&rc`;407Y{GERqFp!x)2+mYCF?3@7~y{fz}i1NG()Z(&C&$Y zt0xX`GR*76pS4bQH7a3u-!@dr_oKe$JMih(NT_9}yNbvT-+-0lJ2129N%T#0V)e}n zXr+pbX%}jeX};G-2W9z&hbOV--Qx6Ii<#mOZg}BOFm&q}PIcalwtaV@{_J1Fp^;v^ z^4@WbujM8xX6WuC2DEuN%=;Lx%-j|qvlCpRq$As2j8V8m(N)egHAM>ltJlY#f(u7) zOtzh8nL~{=^h^aQErV;VSV@T~$e42`|1>I^p0kOxwWTX8Sxo>Xb5xQbr(q8jjw_qs zg189v!$zZG!SZu+zFM$xInW-JG3nt-xsAZn$G-19YRQ>UQ3P23c9VB!RY1>^ zPDE3XE<_n=;v9J_FEc4QQfpa~Z*>W$V$pRFh&w4*+qIc^sDgHe0(hR!`N+**q;M+I zqRojFTd!d#S%ceG|C~nMdL<9@2Oh(7r@pH`#=0dxlZGYMN)b8d!-I-gLa=lExtooi)G{Tf*M=UIj z(gnGQRXc>%lsAi7rKjm<@tRS`x=ec@#mzx5!LJ)>o@jBGeFSd&iv_XZ<#83sJU1OXht{0l80<>|C{@8q{ z@jOZJkp?SuP%#lbJt0GpszsSsNzd2li`N43L8Q_-i!wsB zo9EbxVebS9-ztgYij_32-neEn0Z(}+SuqK=WP5PddljpL&3LuzhaBxZGPFN8q-uFD@4VzO$&>h^9rv_FLshi zm?aS3u`q>mwT<{F{mJ=x`ohaS$d@l@F`aFBAL}=^;VT~)!hb8=jLB1!0j2c_dsbj^ z=C|mJ{j-LEcGW{Yw~iaP<=}PoZTYKB_UYQ62+_)JHbE?FQK7E-9alQhTb})rqS>Dq z*Z5xAcx-}j9?c?dSB}x`^;T7&sc5M1hOx%FM(jdmSzK&H# zyYc_g_8-u)WZ88XxNk(7=l%EI)h}Pax~jXXeK*hzG%P`Y1_TL+f zJwU7W!&p0e6gTg^j!U24#N~$!E}n{U@%|WV69m#li>o)LP@8UH^qUEW<_WA^k95&! zw5%K=@pN(B-@s7ZO-?POn%9g6Ua?-eASGb9rsWbH*B~jWLJ=nu&Ig;!2&mF}BxT(? z6`@J6ZA;7pEmnIYQY*G4R52aF-E|7;EpFQ+<=3R3Oh^%D1JsJe4?9UAASDv_QFszy zNfjpP!&+qA1pZX&HAmk6nrw06P`f9I?{HWp)}9?KSezZz8>3Akn+j;#7)1^c9Bn^?0|lzl#q z{wi}W`boe_^wzJ|ZEaNnXJz9Om81%GA9)y&m<-}GOS6*HFb;I{7EZ$bkK(AAr@xPW zx?C(oD1x8LsU}5iWBALKi1Yxg!2|2Ibg4QvpMgbeu0Yp)xSy2qA?z_nacOc6OZ4j{ zafON)=M5F6v^MNkkFXz7cbNBCnmJ@-C=~WHzs@+;wMwG3y2X7UwZ6428UZ$v#uYWb zuccbxMe?RIT5xe^l=Flzm~1L-tkvdd%}S2B(0?ITIPx`r#QtnHm$7{FE$n*yAq;k@ zc@k{3Aw||j08YnsxGHuo3%JJr2B^s1q#CwBU-&AVyi4CSmvDPfNTw}3t zF2-qo6sEd#n4~AQAj~5JH?fOU_k(*b|?{fnQ(=DrJBqU8oE;(mc}l8b_uHKaf8NT?}z0=P6@EdoOShw`M#|=uzW8* z*tYn-XeVsdNlT3)X^)U5p5eKXB9@k08J)V(V-#)=@Vx8po=PiR^`EU$KrXqQM>?Ms zU`1F;YdGoD(Q%~{<$`T`klRRMcZ#%()-2&oio#c`3$$PsNDa@?D&OEeq(#f`s(jA0 z_u$dPKSyCr0l6Gu?c6hX@%lHl1({1d>FBfTiwT5ar!Yse(tVZh_TxCjVKL2P-l$uR zv6VeE#fnwR*!ct1&huI>ytM=q@Gsb}k+(iw(3i$TMb3>8fHu&`LTk#eRcno0;L_6a zSqzMfVb|W%FbkQxnMtW)jjk(O`eR0k$zw)9R{Gzho(y*Lx1fE)JL^A}NAb5U`4|f= zJ#bH9wboG(t5T3K!bk8!+O2565s?kLz6m11;Q|b&ckQGL9WPR+E6Zx~mgi=l4dceAr)E6+x(HH0y(|_UqGP0s0P=T zPjbtqa0zc?j-Xi%qAO_SBFs!iZJPJy0eqgE!z%U;oWa*7{)ns=XH%`o^~o7_fY#-( zk9l9^Xm5J=g*0iRax8s_%@G3PQ7Xk$kXxq-Zl|QwDc9<~ypH2kW{#0DAj_1V+l}fK z0^Q1^^n;RFNcM6J#$7!VHHjR_DQyN*-_gmKS)3fWKrkkF4&R`qT*0pR67QeP-31KS z-o}HwU&h>02Ycq0FmmoK+@}BOt7k?Cu!r&N`XgAocnIm*6r#?4x~5*k%2WRpY_sV> zwM2;S0I{dy1$L(CdS>vr_ zljrV+Uf#MNUn|))J8;~vuPz=8@*ueU#lojXo8mxa3pL&GREoV-;JVEJfAhF@`3kD1 z9@CzO)1!X}2PZxcd}|%I{^MD+_g}>3!lyCz!k@!ioA=N{{YRMp#}oL_U)^+Z>HaK= zx*g%%Lo9TJiG38#KmIsyaUKWbzmMzfe}w^p$_TC6#;d2$sL&TAMHhq;JNR`>9Qub` zPz3&ix3O zV$BG!WPY$kidZ`AG=mRzK5`MoOBAzf^uLM)+o@?GiWV(bCH2~pjxownkjfRiC^QL5 z@ga2DM>#QTYBj^>nY$w6(z;Kqk_Lg+=X|MOvF`Fe#g0p4iVYJlT)w5PjB5~-)KQJA zR9>npq`Pm^vXkiIbyT8;YTa=w!Re{bVrXK@H5aFH@YeOO(P!Mu+u5Z)FE-d_cn3fyWDLW$_>aY0hxRyGS2D7dcT^hI7$ecv9%p%FjmP9wP)=bBr zd+dqvst@+6V0r60UVZUb@#vHPH|*-(hvZ5|U*v$s47kpozKW8RFgncfpBp8s6JsG= z^kW#ZAEVs%_o@{_2J^7?*PWumk!dT#N=+1t7NWsK7qmp!TdvnmBXcQU5`;m@xEu4F zIVP2T5=UVqgjerHOL{KLK|0)jo6ONFA?6a5jM*`Q>uyxm4ibG&km)(BJ(yAUGo^0o z2=y%GN@c9Zc)bg)Dt6TuFhWp0TD^kfBbPBqf9{bFouvYvVlLT-canQhU;FQId3Y3S z2ZwOw3so$xj3K)+3e%KsNdu@%Uc}0G{ueTZMfFB@7Uo?fsAIW+RysGAKwP%1$=@c!Bl2bsRIqfg5|Fb(ir0?g)N1nvZ0a`Y< zPoPGv@XUM9;p)Q_!_yQ!*NFdby{;%=p>|x4Hs5z zFQf*sjgL{F9n!_DZQUedT0qjSP*Bm5jfEoaYBDp!6j0~TPAVk@FQUq2vx@BNi5yS1v~jloQ01_ z{AM2eD#m@T{&WSzaw|G_BTZ{XlFfCdHO6?p+86|#2W9(+t$ zghS>G-Whz0AOS7uh9CzgJAU(x?! zwQgx61qui zwITaQM*pSeD(|a4gEPBdL9+iE_9jb+rxs8dxrGNlK7ixYO8-V=Y9p<8@F@}D(KBy4TDn#CEGLC%8zm;?9Pt>Vm2T1 z$gzIXv%D1U6r(rd82R=&K$FUKfe%7%Yu^ zFr_1Ur84++WB-ly`#@gI&AL$N-kulz94KWyK2;jxphlk{EmPQR0*udJ_- zzPN>5qtm!;UcvnBhj8!AX&n3Gi+KNUypP74e}Jv!Jvi3bkIqXE;fsfV6`z>BP9)%zY{jq#b^4?Hjr?glw6I;7a`@mXzgcfIA&s`R+6zUP>*%e!mXkqRv^_H9zU+|tSE6v+EZK?vUl_4h# zq+(BXmD|#*7+t6JJ4;$nszQl1yP{TX#k47p5*)2RiIIuDFjAdkE5Y@-m#~?-V5h{> z!znTp(ZpGg9b0e_v^XgQ57UZW!D|F@0(K--ogAo2WhbGCL$PqBef_Va^55Q|wA!>f z%zH=WXTH;O*MFuJ&Uho+kyo5-pw!xWZ?(vpuQk1vt>O8%|1m!EBuU5aF<{;&3v^1> zq|Hhzhs)D`9{aer&zo=IYxbu0NX=B(xJKmuEb`GPug?B;6GqEv)FGLmn?s081&T-{ zT!A!{AEn(kzEQ^$d$fxNeRyZRjifrvO?YuxKv_JT=7GulCvoTC6TYx(nR?Z z&x z(+b}YV$_b&vgDKRxdqReD6(Ef!Uz8CRGWT zme7!{SiT(nimxv{DV=UO4(qY&?$nit>X*+RUMAtGGIH6o0t(3f^e0V(^K5 z*nFan$LbcsJd|5%D@md=6(a6%Qy4MqcCTC0XEFCvZJH?dHK_zz=lV;SS0fG zTkOO7I}-cm0LUS)*N6*2`qq@utruX;9nP^hmrw)UZQJ%p6nlDC&ZX_o)|AdQ_9=7% zurZaJG|l`q7%j7?J)^Bt;DLZP&Umf#Xuf&-cz1-dIb2@HWfMOXqPP>lhKI`=+I|AK z%kOle)Bp1J;;Z;eQ~S91o1FA3cz6Gg;L{g>1uIv%1fF~YTl3H2+W9|+!#t6J8z=Fl z-M@nI;cw#1=s8q|Ul#Jo% zzK?2SZprE0SiFIYo3Cn4Y&S0%5qxDKw5a&6_mOdok7~=b{RHv%C}=v`t2E2)lvEd# z`1vyJwv&2FSo31__J`n#pcornD2Z`p8sbtVGZmuR2_e$JsW{7=_KIRo#ag+7Afo9l z9a585@yyHr3qJeke@$rEMS5I-wc;wWhjM2+cY^qm)Sl1c2x;SwQ^bGECR$*^)s0U4 zh=f&_^uR*@x≥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ü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%0AvtEvR^?Z6a}DN} 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π>(2j2;So<-O_&5JZJ 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 z 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%0A~V1hTo_slVXnE+AZ< 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

?;CpyI*3XBw_sZWLKPR`3>%Swfvfno|{j~)B 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�FLjL11Jts-Hbu;&DUjqkc}b|oH8 z?SkvjFxL_U@6roG_if&1I}I^|QxTm>dCb{qe_Q`$JOPiBfvGIc{HD%xMFJfQ>&`%2 zS6t1bwv+93*4?plkCKWKgXX9bJ#oWw>!#CQsw{$;>({6Sa%%V+akr%hY*bwKkyCDk zF3;m$$p6R=?*_SVA8-ftSEKC++po|-UuWTemzAq1dY8vs=}tba_aYJbd*D^-6VSZp zWz;j;6l|n;qsE?E+F}!4Kw^cdhpy5b$y3bj_7I}U@{JWQjBgiJQdK9Ky|Q)kwe?yt z$^OlnqXiL}QaM+7O~_+ay9F?aIdwgGlBT8hc3s)}YlQe2>_=1G?p%3aB4-Rk5jvkF zCJmh%ozGWOUsxKl&4MeY#%4N3Vs+6yS=hy9pi(?lH@3+p`SYVF?F{tvLdsrSnRM}A06s_w|pW6=OrRO5B_Yvwume>z=gtO%dc%f%`d3bKuFA~OWF-@ zl5q`0Z%cvSekH*_ps)G@i*M=kKtpD@ddODP)F~FHw1a}8=2kGvV40@br$b0fWb&Iz zgp2c(I^m)yrA+l4|FF0;7kHE+ODIdFWkxzgOSV}G%MsKit5j8mHNiAUGb7xQqr#mr zP4aJ-b4$-r6x0|0P+;5IZkDT8LtWC-=TU{Hk&WG z7{>bCiZqfGeuV{mR|roaV#d5U`DCW`&^qUxoWM#aWx8l5++D;#*GGFR67BE@wX(gq zJ{7%=b6AW0!a^x!`JYUyR;5HQDZdxWV9^k}_&yh?H|$h(igTsc)rMu-$;=91HYYFU zD{u7w0iRf*u^SIIHLhff<62;n*~d7`oXZh87p@5HllVK(MHH3)Y_^w;27W7JKUDDr zRyU7bAPDrDC;9cfE&bL{z3hilQI$^0xdBz{S1@FvZzRY0*Z&Z)Xv+jp;uWB4a( zD%r5w1Zksn4F!)coA1Z>aLxT<-l4klkSIfdp(I>wLVYr zl+sKH^@CJ(`Ziqd6-O=fhJ=&&;Kt~r#Nc@QtH;dj95Ixr6C@#!b(L>te!X^bYSB%S z8%!Ok_@bm1*Ls3co1DBwDNKccT5Cex{lWRcK*+GOG)?Va7-P6(M4jawQr>xbeDCn! zE|*g+ubLc^EYzdaQNl0by3%NZ(`&+i;fTkp>Gg|y-_ER;S!qsS{jU9l$-)&{IeGX_ zoW9-00ecvy;t?rB_S8~pbPn-R**s%(HlIH?(HG?KV6+?e;2KfH1+j#&aIBf-)& zI>?&Y&4EWOyG@|Zbr|a~_ZnQJ-dynKVc$1tVqH-;v4(x^jw{FO;CIL(ICnH4=# z))bU#K)rlt+Zel|$@$cVP-s#Fs^tXBa;b3`v2)VC{>Q9ebv$!tmRV(~NSVf;>FOI- z{Hl$tcWeseox@4C72({oj6ZLJ

{KWI+!h!8q(uzp62R6uF61{+fCw$BVZaDMDDU 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%0D&J$Dz4 zbZhOQ^xQogaMM5BqCRG@t(!kpoZ5Tb&iHUL@Napp9Q_h*Y#fI*GrP~;VbR($PXW``XT@wu+aY+D6vgVZaq8U{@)?%5j-O3#fWv2`;OX`EF@qPtd;h!m&{w zHQf@%Qd3KriJaFiT#9E)ipj0t)R;ulA~bc;3`|`#Gfo<2yX%SFM{#2BQH+?%Kkl0k z3+&;d!G7+6t?9=sF9l2@e_e-ogwv_YzfHU=m&&23T{)QAm5WG>+>)_-xF2`bKa0Ch zZA^ybB-{U3n=r`ED5%0!lP*AcP9f5yos)ffhNP`&|SYn8UxlFVE*4RolG3??R{oRlKwCK5Hp1Y_oX^-)ad zSRTU&gwn-S**iBOWl4a&{B>6#J6ET9>+9~t-YvVWUB@xmxT_C=Rht_}V@B39MbAe^ zEkm^{baFDYeGvwQgkx~Rf~-;GL~ec#t-bCtlvh=%)QJqRj{V7>o}O-Odg^I3G@P^9 zl4#Ql8*tTSH)!0J+m;tsp;p?=PdA)|=J~O>yJ?mSZbt5H@5Zjjw~579>54Eb-mr$w zA3Y-mC3{1hl40gjvwO^dbVz!jE3>H3A|vm@pZN*!IA(a`47IUzjXZ!BmOsP8N;2R{ zPDHgpZ)lUnaw6aIXlNXbd1eT1Kf-Tm8Or0>fQWpQYG>Br%6D8R<>7q%uGS;RcH=Le z;w(;XBm+lIty5FrF3O&a)q4%0*WeoZ2OHCLVCkc8$90db@l>`~?5^BN$#%c+hNx_9 z{7d=NN}9K3G5q*(Zs$)lVE^;GG0@ZR?nPKb%U*`dfEE9)xmhveKo~PCOA#A&j*FbH zTqp8p_8JqVeQA=t79w*bV(hbgdNJ(mIEi1Jc@B@A+lfRP=e14LJD1x;Jz$gVkFQ12 zGV<0ZvO{f7DPA*q1um;wqS7LA@&~rN9&9=x?%DHeY^>ixoUO@gJR0>GZc;Dqy*O|_in+~6Z;f%W-sL4fqtsUE0L@^ z8=TXa?W(bCmB(1g*aO2u6tmH?n%mfU801M&c78MfM+OIUGsMaoqbjN^aLM(TNPrFN zS3Y_F~p25gvLZgQ-r8>b>!=Yt;^3PPcQdxA- z5?Xu1WxCv+a1K#Q24-8{o|krD(+0U9>gt5eFU-g5?dw5#X(h6=aCVIdJRbeXY!rC;jbWUCFcvEfURaRvK_^5j@|~jG>VS_E*u?kpeQ9r`DGOfCOgU2% zhuidb^FuPWsHuEtJpk9_X|WlA7(fjS>I+3O&94AeS3>9v5#I~p?rZ!NV<({5_K5Ra=7dy`$ zMpO)|WET9ri^yp}LUXYHDXpK9 z%?7%HWlW2qF>QlmR|)k+S10O7QDAMT3Lt(Dbo;erHrzIC(C>4PW4U(fQuR}}3 za{GO|c4Oz3tqN$}Bo+3hj`7@<4S4-^Z-I>`%+AWjoayti>(CAeo0%9UBsW}nIE^~m zKZsqAZ4=91w?-Xv-ldCibjv|odBzZLw}`NpO`-bg42v!h)#~QfFer>|)ts{kWeMG4 zzO-!7&=6!NI9h`rg^4EYvD6(4!e`j^@0tmsMm(ZhV}^-$mD(k5x)s}zEljxnxzLtxph$pb08w9VmSLLW|N|F#av4n!@1*F&e( zZqoS-HIQ=`sc9*gwPGHoNO{1*tiBHJX{PkZ4PMkBRriEYgVZx3?X6N`j%ln@-*hPuQ<~gAE0TfLGZtgTwD~G+V+ ztk3P>&I1gx&ZoytL~iLlb`%gYEW@I`Z@PAZ(x2IVM97Z4-__P~rYWl_r-dt*pt7z; zS4`p0M`AjOc{GN`Q|H7>o42Cj%sH|donk_l{c}uL=nPnV;01G*(!yCwrOd1|;qW5j z*U#RMp1yADt?4|a{Z|e4x;Xo_AACJ3jT6+VJ;(9*4<2^Frb2HFJ~;dE*s;>r=sP}n zyqA2tvIA6#A7UqaIwA^lejWid?_1AfYuD88k=c(Z6qyYZRE(Sg@}yOrI3xrk6~Z%V zjFZoJ8_UCw|Kwq`HF6RL{VXb+4YYYf^%F7u`Bi$%-x1E-ZEUnKj(<9?6%-P4$L3%5 z1BAq%7oS9kWBl;hu=#GxSU!gsTwj(7ajOK^eaFS{;IJDwmKQbx&0!!f1ge2>BP*t62^8qQlhA#!z`y$P^H zyDelq5+{z>+jI=y-g+1IHy;rkXNGvt^uIg) z`~G{s1&Eck4-FkHSXwn(y%UvE&(WsS_}PvpaG>=#^~MGiz>cV(9T94%dfHR8r)O{g zvnnPjHXPwEenfthmBK4?%1+A=lJ={wc;HKH;bdYgk>RO|(CI>0`w(}@66mOuqiUwq zs2%gAJ?+Gy6C}Y%gi^E960MEZUA2J}irJL6!lW8@_FA*Q^#B&;97LF+k$=g_%f|An zR?*T+mLaboUlnQBX%dA7SZRyh@xnGd`}kAT)7>2&-*ci8!e6av*3jP3iW!sVIKbvf zH&rScXPWBmI$W6Zbti26woIBGZJ(8suKKv3yhwQ-_eeHt*9K$;MtF?XJun(|NyK{= z+jNeW-8!P?{&B-D;umukU=4OyP&8?K&AqoDS^ri59u^x$6~?oYkKlGwgfXS^|CZBD zV$O>Bl#-g53&f$V`|;S1A3|?Ok1)g-_Vi5O3T0iw2k#nff(S!H9m@o)Bpl``R&`!Y z^bonlg9gkHi~TrRcdgD7nO}=*O0n_{mr%vjDnwEuZabESxBlum(R8wrMTtlD#VLyRqQ`}RJCXX|&MbF^2A!}3cd zKd|5w&Tgt!kFpy@^s8j5si-Y1BTj}9;n3P#X^BY*xDt=rerRNftZm9lPfku#r=i&@ zJbS2RmYP9n&9SAig(_+*k(-~ZCYH4HbeukV%5JAUe%0};$Bj9BxOBHb<(!<(PUU5n{Y!jYj+yj#3*@nimj) z?OIi()y6g}<)EA*G_{>auQU_rj{N%@YO@x1d)vCz5o+Sj(QF3x5}(TEU^s>%qlI{949M38_TX=MKhPrjbpC^-F=)O1IM->R$jw; zc${;UfV-@Cdp^9IZWokFH{tL$;cC3P3ORBiu5t~h41pGRm10_-TxjYTarHc%>ubZu zU-+SvhaW}n@Bor6*j;*W1;D zne%lSuA;IcG@fZhubfz|NzqDN-sL*;pE-&NSBZsSYAmuaN~oK$O~$3lY1Op)x{FaW zy$)#{n;b-xS2Y=cmC`VBa&w&>HYX=np4T~fUfmW?ZHSB)0u(dk*w9P)+S1m9@}f#) zWn??x&Pvb3iH752%oJARhIPz!h}m4=4D<|8U>GrZ z>ltz*8ukmgyd(M#dzYb18Y+pzs0!QDrRPRCnZ)o2n?z_@Z$2&RD?vJY4MQ)-x}{m^ zTYDbD-*5S;^2JEDWc$Bp4rDJXn}v7Iyc`Qkr^rb(L-~7fNY10jU%>ZY`UQ@6)V~q~ z1;$8xW8U)t^_2h@W8Sxov?Z1&eVf$YPN=%dN}zujR)`Z$q{;uXDFaI<&8Dm7U4%&` z72pg~krZ8XHI^d*R{ofLr<9SBj$UaK3EZ;Y$WtKaaHQsK%V=T9l;b+WU0+XU52_|r zDK^V3CqD;A_a4y@9gD@!^cpwG5i?l1)>g;SpR==+rEYF$=rMU3&>M42B!4)4;;}|aj&rbIG+a>praRhTIAK>sxmeS1*~j) zH3=o6!%?ap$f3nOWhfX<5B&t>G44LH0UzJ=1MFxy=FW}1L_fCR^%L^6W&3HO-lY@u znjM^glswV>lI?%LMP`-GSpUu$m*L`?1v>Oaeg)Z)V2`xBes{;uv87=b#@JoQ0xFH8 zpRs_;%}kv9XT;ye&3!Q02F-5aoXB#p6h>1Fdre2Wm|jpz*DqX+1+~+WBbio;l!;X# z^PC8xmFethpdFhcDo$2Gc>gd<-k}o+h2EKFf;O^rD6#5FB*HOV7-OYqJl#Mu7tU0< zkr`}zB)e^IZqrh%URsCotD)19Dmp;I8<&^^a1W5-Nc;ttE=O5SxdPRQ1J{UT4T%JYUDxN=BP187~)LIN#U+;VG@wc4=(CT275wjT+R~*CVnr za_HolV`BUM&FCHMB~M!p@2v-Fh76huBeb1up{Yw}soJV+n`D4(IC{pEwR6I?UBI~f zfBMx+4GHH+90!K(K_dtDB3wMVr%H_7K2$6bdKRm)F1r4jQ&ka<)aD}*IQnNvnc6@& z!Wl9}^=CwO(R!vC2R84cT~BYv&Zl=^*M=Q9Awiby*9so39&P}ZtRI!fS`i-B0WmD9 znGXUYpCy{hQ3a^XDF@E^z(~ZZ-yraqE`J!f?if^Q`3F-L+lXU0?dm7Bn0_ ztrlZ;f#8NF93=9=)$nfhoT>72q1}~qwH#eUeRy~WsuZ^cMP~Nldlelrx3fyu0>2cdqxth*T zF8&x!_qB{W5NJM1;YV2yG&cR-U6R2CWtKVWS zS(|?W0-jp!;&Djmj84&^VO5@v87()q(;j;1AXfw;UlP_oWW9zg>$3oBS+g&L`rgE% zwXvC|&YdO!GhN$YC70j%{0?k*@Ch`W*14fYOoJaYB9@X%OUtxvRswBNQ4tOv*sp^0 zVc5ELCILKMTwkv`ulX|;Q)y8-UOKQv+2#>)4svS|Lp=>rk}0ES-zF|5-`n0r(=M2$ z-Y>2#!-*Y-X;89U`@EQoCrx+k^I)#sJ#fOCnvHW4dCwhL@*AdT1YATkjeSyud&(4B zqYxyH_!pCYmmIiS0YJbZsim(W9TafyxP8J$OcP4us1%TcB=>-lcWiw=o^z6O zWU}7HWQqfXBw7QjUY^>8D#6I&HZY^Yt^YJl%C=3;s^2XOw*cq9bf`9Tm}$ zC`F>c!v0cB9V$RtOo#XJ*q`lb#os>jeSCl4BWN4!!7H_)*s!Wt^T}g+! zjWy-)qvnAwB-#=MSi8?e9Lo{~*zxv7cfan7f=j@44s_$u6Pxk$sVx`?UE6;bz>aPH zHm@iFzw)+mm@;;AkL|Lg#Zy2;LTf7WQ?jwVY921Eo2$y`MT|5ozjqicAVl*ck};); z)YJ&21Sx_&jJpT>(Z>=oGeF+nR=6=XC{;K>m{146TZtPPEwBmc$Pe*=o%^H&C~kW9 zn<%$H%f>r4ZC5{bHlr~)e%u0dvMrYc3a=g3a% zJHFdw)=`cqhLOWc&pM?ewD%|3OSS}A{@n24n_y+*h9hV2;J^Po90_5vbAWtrV(VcH z-#JQHgLn9diSWtsK|1^_AX9FS;$vb1=jh{VrJ4I0de<77DvWZWHZ?%0ia5aSr%SGB z+DO*z-AT-jB?cymp|KmY>Js<71tGBNf)+~BcG4<8&ty|42Hw8vLINZEs`|<{&^0`s zd1!UGns5sRz0e5Hfj>`4PoZg2fnXJ4Y%0W)yN*hE_$aF*{<#5Rx@7O+26~30J7I9!< z;DfvYbyZ;0zczcJnfZmuo6ynJhK7^p#7i%1r|3Wwmfu;%OEDKxqt1yla#dH=nvfoW zg8U+|WZcu+qv=^J42R)fvNCh&;tMaw{OOBKp@5i5ZCH>~h*Rh5rLBI*0>1eXh5!pA zqZ>Wko|BOVm|%CecPlo;Ew?ydO2%g)ZI!UjVb;~fvPk2Y<$xCU52CndN>#xLtdUfB zB7_K|gxDP_IIA+Rij{O=bHKkY(|11og>MKw+Xp^NgC2FtMvpIlxt{s{vRJ4J0cKmqs(O zc(8(sMl)0vHx0-!Jap_ueE7+4V{^lSmr29FttCTelI_)Qk%O(L)<1pvMfp$<`@m?M zPci8g_9y)A=7VJ%E7kA2dD=UUo9xJOIQjKw=cXCClknQv7h`4J0%dpQoXM=S^=FKt zy=WAJd8BH@Mx;HKot_4zywu#?F1iQ%ICO`!1BtS0g)G#+1TtYXE>6}=tpC9- zs5v$0fO!kFoYcQ+ay9Y_@|1nHxV!|1cOMxmYr3i5h3&+QFRuM8=2dzz?!Oj$S%U8E z?(yVnwqIGVWTQvhe#U(YA5T`nU<0!7SFqoR$q7t zveL7(olDiB)#t=9!L6MwoQ%T8w7T;TrP(mydbm0WA*H*ui;KCVd`hLdwCb6)*z@#D z_7EZ65+d$Fvgt4p_sm%!wy0xAOZZ^xL|3yK@@()LKi$I?_YDXoU-LxT)gJ7z)Pv#- zpXLJHK5@t@h&*6)2QXktCSgBOoNW|iLT*U=55UE|y7x^_M&4DQSi7q^j;$7DJ*=I# zaNyPquCLPCa$IoDN-%?si+4TSjNMOcQ_f9B`LH;SFk2;gcgHCK`Uw+m)vE4wOh2?L z9LI#^utSrIcO8xnQ_gTIW<`rpGm_`j5dLp_<6->MrvJj-2R0y@1kGgo18Z<%uiCKXg5JvCLyYePW{&3RFD z7D&`cv+{3>nvh$%Iz(G~b!xc^h&DnA_!DYKc{~Rv7*w;KP-ZU!U~Y*nY)v!E zLKT3C?yer1vsfo!$dzDww*D-2cXaDH-i7DDgeq8@qe&a54<;O2Hs~A^VaYu2RsRTM zsf;-$>EvRwExI~8F>UG$7w^g;IlX;7qOHA6Z9jYZd|Z0b<;wQzavbxk$z6Q7{s1=Z z+8{c5JIMj4JpZzSGR&!+jmEYH3O{f%F8O0@&!@S*5p&lpQVvk;2*uvDO**8 zdk8{yhFLX!?Bx#@12DAeni1gsbY~p;Jh1Ej-)IPi7!A z9ksndE6h$7*04-QWOd9{Z=)4qON&jy{J?>#3grnyZ0z%?0X9O`E7*sBrZ}A#-mz)nfAM3UTq^WGq&N1nG(ab&a4Klb z0GwrDj-66ZXSZUqB^A0DHNWoPzRzcU1_Ui1G$uxKETQufTM3mA=4{pH8HF7Kv7kRy>H6ydTiT4?0kGHx|%vfxGNd1Z9VhtNW1G2j;E7# zPBXQVbpdsismUhsA7$ICRA*wtqf|YTi`gTk$c?2r(?PeiyWY0zQT+3>|Al=mC-J)) zhq63y#b>a$<77h4Ih^dD!+V}QH-6_PZeLt}D~@(GBxL8EXd?ZIB<-JQa(hnun3UH4 zXBvN-4RKRV{Fd!Jwi%e+xW%zk_y8GytibXJAf86NQnwzD(O*{Hn@cb6Yd$XO+Z)uX zmf^ReFVhlB^<_NMavrTcov_MfC}3$mp`}k7&>piTu#`PWWrpIS0i*nWj3rrN0^WHN zFaWF(S7m-;Go{>49W!RInO|c%yKYd~zvk7=p=+02gW9rM-H{x>Syj_n9#{MXeh89!NBDMB^}741 z?JB(@H)gZTu3rhObvo)};e;GxvMCtjnq9GleA0iYy>Oo~Jj;Lh{4aqWIb+(6?=t+R z*j?gMWrpVz)=P-*%1RJq2s2zxB{G5ty#7Sob&ho;GTR87!#mtYggyi6uz~M{tFI5rvFGN4q0dS^*6ROFV*pZw zk{oF44Cd`)0XXLOVRtqA#($)O=p9t5j5pu{05kLJ@b<-5Ba17{$W2a_^dp)_sIx1(cPpg4xBnjwXU(BZ2WaHq5}5 z2D36E%u!qdc41;#?RG0JyNKkEx*i6%pMK>wRo={>EbU}ylFY$kqn>I*rzjHEVb)Az zo{bi2WMeKw$Sg9{fnp+L$o$8`1xsnsoFxiK)dFEeFFax+!j!-p#Gw=Waropx3`GYu zmYZb%rFq3zHfuRDQ!^B>j`F_Jeik#5@~#uRajNyKa*~P($7Vw&8ZH9Vjjx_nORxP% z_yxP?b3aAPnI?4+hB-RMZ=Igt9u{)yK}^KFNnV4Ma5}&Dw3)KxLQ5G&S9K0Qdi=H5 z6)feoEEjGEw_X(b(J+kB`1ZK%VI<*@&4w|k&hgG3kfr5_&L*XwGd*yTfXwrzlUukL zSFdcH$?T+$3v)c3k;%MA=6BEeNva2vt1$24#VDOr?hla!*Cq+9`$XH>R&znH=WDuj z%-t+q^|KE$pv%7(udt!T(%)C6E=b{JCYJ2DPhBDv zDU^W>ymrPKv9xwJaYdm1^iiBH9YmV6)AHZv+M6*v%FI+t$TlMqPZY+CrA~l>w>Ymr z6lUdVr&N`k5$NjgLuY@t3hm(uG-4#Yz}UU4$0wXjrU6xZYU&AGJF-YKaYj1b@}XOF zJy+Rwy|5FTe*LTnfz<%C^%Fwq(QKtQD#<%H#D%v18vBM5BWWX)Kd2$SM$vW-O8*TOz@DM0p!4LN3{er2FXT z>%zYJeNshe^Q8Bf#(Hy(mYjLgyt=Qi{piig`H9=PBd2lySMD~;F7g02yjJgl3uXHF z2hRo?lUu2TOju(8*%(^)w%x{g9}}EB8!n0{RA@|s2qWVLYWVHq&DN~7U}^!03@DSA zZ&AgLlB+@MYQWmnL=Xw=g3kc25B~aCHqD`XE=hxR2(+OzotBkO3ocm#&NJ+{VaX;B zJimwQy9)hX(BAB_e-VCD$&1g`tl6%1h{Bjx1*bZcOy?RFI`(x`+g=%5RV9!*6i_wg zhtHt==^pIG_qO~Bckg~momX^MwIuwQOvdFbsRFD6gW$^OvBkxWd?6 zW14*$+iO!xqu6!eC2DGEP-kL`6RUsF|*6b!tg@RI`l{&b|}H{!<5W{QOCG zGQ!5`LO501@k%YJLwF~jTa+i>`LFMFkAVbPapuq|!zAIPTQzHws~t#ss6}`z1Iqq$ zD~xEa#xo%DmXDU|Te2$xA7sOaQadl1)39;2>Ym#$n;--o4UB4OXjK#4LqL{g>i2C* zL&u0ssl_lh)@s~gY^}{j>@j8wqBiX!$bRI1PWGIz@X`w~`=WVL7EXiT4m`ITM|T_& zBhlgbJjg1M1lhF+T(utxyp@jo7Arpm9s^t7)u;?Q?$t2YVX1)BQ6XxmKm{2YbBWsL zdz&A`-MgMtdBu}0+5S|T=lEpj5~E>-ul8pQVX&Xuw|s#0_v38?Zyy5z`YS8E?Z|>^ z=*FQZ8dK@jvPNm!5lEM8thTTmsX+?TqlAv^5j9~kDDvzuFf^!rEt$;4RJZ`8r>3K- zsEmuwa|ArY5vOhwkpXGzWVw`Ua1(nYr=V}3-@h0~!u7NW#H}b|j#6rDFuaFfyE?is zX=<%wv!#`#*uP`H9?%dl%`9bBH`?ivxsS^ys2GB9+ZX^gK#cGpA+P~C**Uc0!d0|< z=|!Q#lPQ148};^eWBcwc*uM8g^!E3XE%?I+oh6lmH4E3GB)?cqf;#`Pu7Jc~d#vFY zUOc=NZ9VOV9O}M{atl=*V79e6nb@o$JWHdVo8<@5fgxg>Y{e9vDXV(sBs#QtpNj8A zxH$~Kde5Jm<}D8Edt+~lU3rj$YfyO0;*w4TmRCwdiN!Nt$2gr9YVg$JywiNmVVw%> zKpPG$&AEgH5zMY$6p-+~D6jylw($!Dn0*acyW}YrU;~q-Nh>M=k1bvKXE&f`c3oUZ zPV=er*l^cloZb>zaSvr|cSiO!DexDD&STrE9m0g<=;G=6bwt}>l~WV@IOHIW7N=CB zh_cPsMg#G-GY9eBd%uKdPwYyD@vd#mQMa?dIg2gAvsfAlr$Kx9^m)?#$v^WJ~*C3fE7SU)bJ^QQm{Nj%-I? z4~+_)L_x~NqN=Er3bONfckS53iTk55iu@TVPcdW(t}R_H*tqvOsTQ15*?FuC%!{4b)iW@!dKQXv3Q^yD8g@}-blVW? z95>Ro(WVm(G+){Wbx2PJ7+|Gz?A9?(K8=5%!oNi5+~l5{z~PkZGw!LjH_oy)eYWJS zH9cH3-aKX=hPV5q>wlZ>LiR>a4S_a<%{Z27tRHf7#H7jhE zOLICv#Z82isJ_5pSYR+iU^GReDzn)h3FK*-Zh zSE}kXTdSQmNu^tK6wH!)lXF7F= z>Y(6c?eN&-%*tt4I%T1>-D>+9hg30H?&#|<3|9DZt@m6hIajh)DM62ph)MINsLx7k z%dl_bE{sM;)OZ`Zu9=~?zh%k}V9juuzMOUp%OnLn8>zjMMpg~c#A2QBFvs3^cMS5M z*Eog>kRSX??wHn&8)k7*N7sNG1n~fCYqy$!SmpU{_cAm(E?bpZQSdiJq-Uf<+Fj|g zw_lAMlj4)x@L&`NrQP+pd!I&sXP?c)|L~cu35B$Lcg=^euxN5ZPDkvKde3E_#B*|=MEYXy;i1uJLg7a| z9`BiTbwY{$xv{fXMkMV|uDZ}4T3-P`W59H*6dVxz&;j_#2OSW5VF^|mwp%GMb#ZfM zYO;S@h6){o8o;Z9=@?^xcyk&zF5Z5sqY%uxUjPd8OZ90q54!nd2LV$^BHIufH>(w-ualEh(^S)WKz6J=8}Ibb17$ymgl4-M;? z88hKMDij7L&d@N(nDG#{_Ae&A6{S_kPS4Q*Zajwh`p!2u;IU_aEuMbiaZW;^7Xb2~ zwA3_OFmo|(T>E;I7MAH0ilgcz)ZL1X3`x7|0sLm`qiF7Gb<~h?vnaO+moK;k(<`Q^ z6qaW4RX??b6>6bka8>Ew{=(4tPr3d zI1wH^1PNh3gHarWd)$Rd1u0x#7Gd=Uq3KtIxMRC?-yec6djRn8$sEafZ&A4X)K++9 zau(WO%yb3!s!mPE0J=a$zfX&>A`!(6plNegFQA(~@pf8#*@bcMAKtQG{PI73hP`s} zLY}^Fl@g;i=yzkb?4n|+cI9lxMd;LrLWQ@f$~e;2!l0@`a-va^KcXU%hZR}VQI}q# zp9ux8G2FTBaoqU5zs2`ocu;xR-cY+-b!A`2(>P(j|1;jUrhK0A>`f$0htF}X-0$tv z)+H2j!+r363ySK-y$|>GfjQT!z7lC%^nmwE^g)W~;a=qNct!qv2{F6h~1);$ip0 zSlgL70Y?n|lk)x*&ag)A3`ltza}C+roO0Z<_)2MK&EQOgI9}3={*0I~AvexzGkYk4 zlCD%_Mu{#6)_sSwVem`Xp*q=u|^oJk2+hh zK^z9`w6t`*`897xY9vj8B}>CQ_wB&`BYU({mA##E-`P{<5i?f>kPOD`+++Y;$i>Iu zGe>aX=%~xk&$TizVQVDY^EoWEdl_KIjh?g7}_cvgVo217>6en!sD_jnZgy$ zxk;#XY+$~(fhiDBJ-rr7uUwAGsnzgXQ+=b@yZq1^J-QEbiRO^A<;d9{lN zqR<)7-b3p#td@2rp@dE>F@n5E7N%sBB455*hbG={Tm3N3z*p1NXN# z(PkV>%uc9 zcVXMvL&`y;I!{T;avMTVuC&ocv==cSWN>gOO!{i3CnG2d;e25bt`vlsm=LZil-G0p zSu9+>kXSlq`(q>}pyP**o02dfM@JD7A3aCK!dO>5(UFyh9dO3D$7+xNfln& zw;j)HehQ6}#TtZDY`MIs0xK7-p=q@U?hi*x+gBOaOqpF#PVxbA-6EkU370p zH#Xh3K`I1W(bv^$o>y;u5dv(OR~g|*SQCXxibA{wbJ?2Y@5WP@6Zmr(I{AG{ku$`c zoEl8aDp&FBb`f>1vjyuP`T@T6>@U#R-G;G^rCyeA6Sb|foZ6gVxixNyW?AB<3$`cj z@!T|l^Gk*+{pmINMT%%$P&Mns6pCJ4T8`_smK2oW9e?&Vy#3v8MRra$-ha!7uWRZi?f&2*o<@Q!_K!DZyB*+_Ci(VR)pfESoBS3R80N=Sy!uUPiWJ z52vzw(3Urhvfd1o^-FLa4IB{k4G&^h<597v=_Cyd52`*gCHs5hyh{|&viD_Qfqd92 z0-Xg)Ue39;W;HY0!UHO#CothZp`(d^b%I<{J;W9LnmnTpZ~v=zxDD_6<{dbF?3B?l zt^OH~T?pJ>{HKT~WTt3=+m5%%$;uU+GEwt6r9dMmD~FcNS%Kn+`!=)|_`Sz4C{`;oi$OA@8}etkeIDtnq`alM;*r z6p`C6=_T*uvA(u+A0TB~XvTZ|@?4bdc{;1Dx&EFeQl>WeP9 z01Gc(iuBBMciOCs?0;@I4!p2OrA2h1Kk9fUkFkxNh3UhtA-reVU&-iu6|>I+Mum26 zV$%sh>HR3+2fAyBQih)KbRf20y zkb^hf^agzSo1e!uue};YMTJODPs8ds7MkxnF|7V@J2* zXxmxzORyc`bcv?Q4F5f&xLPHzNQ(v-$dHpt8ixd>PoGbW>;xIk@`UzCsCFYdC$!2qaX>UMWC1nPYYz~%!}4$py%24TUr zRIBq*T538in7)WsEn1_>)md;A#-1CE4oO*fKep_DktJS>%j%j+^Gj&O%nMOdT&2d{ zrKZ&OI<)n4VAsjrIM>mn(?(kKbf#B0pEe7qaC5q2p$cr6B@OitQc7w>GTJ)zLD{5o z39@@JGCZb~881455USjx8}?`4u|kPXpbHyk<$vn3>W90zB~F~QN+IQ=aOq?}@L8h1 zTtTjTo6}zpOUP&)|FxQreeQ+c2g++qJ#WSdf9{I;xcZ$pV#q1^!?w#vxi?whU6sM|MyLTY_J|40Fp}lkVcu5Db`-Jn*QZ0>v8M*--)t{QpMsF z$jR5N>@2LlWEEa~dJA=T_EOBGOpFIeeOv=hc1{#QxLq6=lNV2G>tPxwHqKD+LD%%B z-)rve#FV@$^OfIJ;VJN#t4lnHw+y-&%F-347g^&-h`ZWTalRrKX^#j@HwPbvoT* zz69H*b4_SH-{Q)L3A3%iG2N_}uKFk>$#w@3f~AR! z;o#5?A5kdX@)tx`((w?~-VOa{5Cq}s&s=Swvr52~RJ1y;{{siE?u;o+BW141Y-kX? zX2v93dCPTJbm;|g?6u+eSv>QzC$R7N-G~lF9q6lb5EObtll>N|G!Ws~lb6&>t9)XO_A`LK~+VS`0T&@J$>q*{ua|` zPD5&Hs!HhH(%6jKe{d(JOq;Agwon4ZnssY1(A|#{hfa?1b_|)SNepM+)u77u(-hTb z#Bqfn{9L&`r|2XUWYCF125hBca{X}Ym9o^_lF5p3@%i=)_2KE0FX5R}yU;q+#o(&! z$SS8B!ikmp;W*Fs!5&O2tVX&7l{6_akERL?r$H5dXP{*^YbQK2EeZ`v;dKkgr-VN# zTX0j;K6@E+-*q!5tIw(@SCeG3sydCcK3a}sIF$A83BlCJr(_wgi5?2WeJCv@9k0FQ z4eZ3_5=v-K=24t)Ys8EDHj4xG`zbmcb^CFV_E|ME>B1RHke!|#g0hIYY)(fTkBdF0 z_EFzpzXyEwbm8tZ;zqy?xHqBui0qVdAwiY;yL&Nh$xO8$=hr>5RJLdk|A%`DG z8yDsiK6Eb5+J7Gwt&J$58Lt6950KSu_JEzd=KAE(wZLkeo`esw=2`Xg7L&UcQqR1T zrOgSb4br6z|BAO=gG+9@9C^k0?)3RN+H~L3V)L(_rQXh7B?rUec9>PlQdxw<66VJ6 z$*Z~7WF%o#7-Ph;*U=I6{LC(_CHaGN`JCvSCIUTj!S%1d`Z2!t=$&ZnY{l62>BVox zKQFxnH%?lCJB~j+F8iwu(_wHv-PeLW<8*N1FdeSK!Zk&qzni=UB17ey0U zfK9ZLk?ku*17Sp^D=aH0rCV-&8*X{`+ca~P_DN=MO%h!1{PEqm>$ZE))72v$|MgS! zo!h^G^2#zypEVW#`XB#{RR$<(IC&#$P{c$%G|^#`J3J zW1b_8wP70nE;AgO;@Z!Kh6b_k=x)rJJYRbNvur**gxyDW;?Su>&H>l>?O?KGy^E$S zaG)I18GFKyDc#JN2>lJwL8@~{ac*020I?1km9ANqg%P@ISHO`GWd~`^cMDi9+1fBH>#zWy{ zz#Rweq1gZ?5rxHkXJR)er8bQzp9SOP<}TkJ&vs&SH>PK#i=|gArwcAy;cV30hWh0_ ze0B%+Ytv0Z9Knk+>SlgOwuVQw%rMM=rY);J_HhK zr+Zq^S=cN4>mBz#!u*$TUvfO$d5*L3ICM(VAQJ41`^isDJe*~d0`tUd>3nW`67=?- zXzNsfm*BupXb<}=CcYnj{7W2C;e5i}>eH ze_qtrOIc7TSy0+)Q!#VubbRN(zJaMTrm6}!3{vcL@$h|*;F-st#f~j6p^NRcHc>rv z=mN)1E?u@57p}YjH@)MH$jr*bNB-=i*!0}8ZN z)I7o2hWX1fqFgj|oFC#Dm)Tzbn=02D8Ig2krl*6GTU$3>M7qlf{Uve{lEO=a zh&a{Qz!RkM;0Wqm+0o^;C1E{p;``?RF1q|8Tz&Jk>fJ%f(thwS-xVEg?cO57 zppxT#a3kVNuKp)5Y1%ETl&oC5;gXxwX-L+JgC`FNjvLlAMgyB%Tw(5{IVjF4(qLzj zcBqgX`S+j%Yc>_cOy;My?lx>W`jYO>CL<2d%YrL}12S)sAbba=a2puO(VBGm3|R=Fq9J2`Ri`5h8?2gx@GTn%)vic+$2tZWyrl-Gn{oCKbXA%|xN3 zV8CXKa>BUJB8BIaY%1WG3Os=g0Wy%Mout(F!(?wl-R#M@_SV;^1(@H?9zBgG@A!@A z>F9wj+{5RiGeX%4KlXP}=-W@Why~eNv+62^HJRwKj~R3S!;y~p2wKyAa_zP*vNHj(hCWOhb2&7V9M zb)}PB&RGbP)LkkVeFHk)wO_8FSIoG;u~}xf`%fRlxwb|JkcioyHR{D;aVtMHCLFuV zi;{uppz<&_KyR6@E2-xITaLpu@412Iu3o4P!i58V{>9rt2+QEWiGMwz95DNyD|X z>iqFT%h@J8^NS~OPTF7Xwyq2#$IJ%g09wDNy@n$Jh2JJ~jpQvlwbrB;J1R`afNM^= zw7Zs1K~YAoXEG2te6Ai}dFa2egJnk8syd z?m_>^fV5){8{kvT+QQVU1SpXa$)Hs$SK!b8>fN|-)l#HOHppQxb~bw11n9|=d?YR@ zH!v`OFMsAM_~{S-3xi?^zJn;e@_C2(2N0jv*7W2i|Ga0n))C~TW@AP5 zTr8=W1}-4L?bw~{1XGJQD3)KWcVt5tSa z%&eNBWO4p%RMmym%$2L_96NVH96f(rr^l0R$<&1?%`JA`#Y52{Jb!o#7q{0d2~CI0 zIXJ9Ur@#_pSzZasa*Bntlhe_r6R;cF>xzXFxp!|lRyGgsSpOGJF5PhV<9O+@t!_Uz zG)4=yiz)ZE$7#d$jeQ8i$H#$TC?cp9gerv_MaOOpizNSHHC1)U+GHt+>(*B3A>&Y` zAILz3sE)~j3}GCs z^?+!rgUTWni@9n!{9MnJi>|4~l`fG4dn)$~^y0gZ--o-O{|%BY*^+JijXF9y1Tz>0 zx;uV!556busx58Jh$?U$brVYv2MwXgD^RRff{b#--k(>vavq~IB|r%Rh|iULu) z8?zgg{QYbLHb1i&1w{q8;ielDur;1Lk2hWRW;C=k$X-W6HUV31mBu=>2sdrMG8DV* z^`bym^5OGM;n-g(lrOEAi4|3|k(-{S?9ZI>iN&+_{84lk$3#kcs;XHV2{e=K>6JE{ zo*o6;UTmWt1+oq-&@&i?kV^J^Liz%qT)pjsw_wiFIqL8F!zXdumwx2Nn6ZHS@)sta z(g_PNA+Wv-T*Hm!?=>aWv~>DnWTj@R4^);XlT?Bk>N#oC-dle_ve*7lij^%REgh?7 zE>|&~I{))1PBfoJee)@2kG13Nod)uUb+(vj!_)cd`1MLFWg5`z;Lh4!Ux6=0IZ|n;a&ZM=3tjlWh*pjbkwk;*wKDC=7WG zcQ*`Dfhu{Ap}{~6aPjQXd=`XYYu0}&u3fDFmTk{|+xFy(*!<8&m2=osbT1>%XD?WId!b?AWKV(&!C=m$6IlJyq{jGFvVPE;ut#B$6U# z&Yn)W1$oHH$ySq<1X97_DxIC3YV}-PT#Va(`6C6$!z07E{kwPI%j>@?24VvyB#6yl zK`2SOupMJ#GTD)Ivy-f`fqD#AF9reyu5v*jCg+vY6?GS&I6F_}*HsdmoWr^@M$lLq z6(T)Cx(Iwkea^Xz+uGZeBNN-rB7yapHj|~EOa-}fbAT%h?=f?{w%x^p0g0lLLi*r8 z{gq-f+#dMRec1WjORzV=P5FSaSCYs0Li?*322+?8;r`H$QWwrxN;9jcn+aAZXD9|) zW-!g2EjW1ku#n(qmI*HPq2<8DIf|#0*13I{@oqn{Q`&5YoblBX+Pushsw^m%vZL`( zHYxUap*1`j#i52H%3^MgZGqYnc$=_a9Z`Z0-SSWGL4Jw0Pj3F@M!X<@yh{#&&OW&0 zue^lg`|c5TLl-J6WNxC}NwYz_Fw*xjWVm6e3;zq@6lI&9&=z3@TwP-ur&>363SRU6 zn@~^^Z+AU?s2;!m@h{Qc-fdDUlJLs@gh?Z8x$iOP%O%+3+a5*d2#yG89H|KnEW}4#`EW?tG|n) z{JHFFuzygTK5>SwdhM0q${{o6&cKroJ&DftE(Tc}_G5v|{m#={#0v`=3tVGTIr6rG zvsP8472>tiSJCR4`N+-4QqDZQ(Lm}bju-c#wMa^zDQtU z#g?Fuh-0fF{M$ghjlb>g>lRbXC+ib6vTsxZ<=&I~vGc@kX0K#V%^VBnTGT|{-QSIh z{4y6C$z5cpWud97#W7OJSZPvm71fp0s*G8}R2H)NZrR>||!L z1^}}6-Ym2N!&}Y1Lb$6_?-i65i8p`z7P{n(m%D`(x31O>-1m)p@Z5vXB04Z=`XT@6 zCjSzM!dP+RNo@J5eq3}qOq&u>=NGnduM%9-Q&Q=o>GLtWYO>B>9n*WJ%3-ZK86c-I zhA+PKbBw2Ps11kdaJa~xj+5gKbmhUU23`z}GK& zUqT^4+}DQdzM%U0_Q8iS-p1o`&$>@yQ`7!&ho{)<;=7ngMI8on4tGlA{J3#NqCq(q zClYeQ=lJKdu9D|>6p1t*KL+$foy2aG&&H9ia|!R$G|-W7s!l$~L>F!2=_}H3s%8D4 z7*OB{fWm}pp-nA-FMW~-jOb+n4{(Y5p}(ejoyQO_al~0#NeUiZF$^oDGRqq_R3XoY$^*eGc<;v3jbhP7izp*2Qzc{JI#2P1g`pv0mgm}A`-ToDt^#&Fpr!;5{JMRcie}Sb- z7K__{^<&D;%~BK2hu-#KJooJL7!pG-JLcGP2k-~gZtio=D24&%~jB|Q4hAbazt!o1Hv z`~2-VbGTkOi-skf?qLb-+GN*%Hl?(s`-X(7@-v?7EZjXcgXz8iWX-lV(F7d42X5)5 z9h>aH$v0Nta4{~s`RX|4%5BS|&x>d7f0~8|hwL|LOwC&gCF8)6`_Mz#6{6Kx8ygcF ztL*N|xoK1Z?aZ1fm|v%JP&>ya`E%EXU*mhf`MFBC!fhheV02udNQSf|Te5jg^0xH# z6zXW^RcFVsUbB|Rg`dMQ*s<^t|DQiqgwv6?y@HI+)=nxY$jAJp^A(GmvuF-}dFO-5 zPV4Vuov-}!0K(d|-Z?lRWLY_v%WvgX$caT43fNiDA{uiBlyeA&;qZhtA|=U=u1;{F zcb*`15rDuG{mlQyaA;<4*jlfEKf8zQ!UsgVonuuHVIl>2W(}tsF?G%~6iSwpB5lHz zlPdAjrXAsoZ@|wS&k^CU55Q@Y=6Ca-TL^Kj-7_s`1+!Xn02?PMjO-dxZilk)3a1mN zm=tBXr5K0~(7|&@aK5{R<8diFE!#0Cw)aXQ)_u;d*e+TzH z|Aa2?VA@20l2`OY$y~+BmTYlNa=VQ6j+tq94#8;`a#C`TMyb+vI%2-`q?s2?)^S)n ztyz6LaPwv#1JdR_%lU-&J84Y|;`o8%bln@TL2iC7^73+3IMMDcyG=5Sko}P-U7JDy z>LA7q$({?rTPSo&#x}E{hO$yJ)F-_u(#DrDtoG;nupQmq)Ya3&3MmDy%8q5GHjKuS zeJ#n_365>45)g?)Sz?}(kcE3Y&kM`8tgEys9|!oU?SKx+Trap-7u+r^Ey9Td$I;Q; z?$}oddTzES=iF;pB0SJHEZ6Msq)`J2E{VT65$iUrjKC>3enLh9cnnn8Kl(s z^bYo-B(GR?#ADIe-ApH1>Xpsc?63OO_S~3$9;_`@ueMRGTg_*Rw^nh!khm3 zZMgcD>rp6ww@uzlJn)^L^-Gg2+5Weh6iL%R%hQFi zsS?M%7N!@9%+xHB_BP2zhV&dGKTnb3az;vq{34Hl!Z}IUx*kvyOhDm$Wr0@%bD$UB z6aufY9m+#Q2cjy|(2BJykeZ&V@*_WT-=j3p+plc8n#Bf|LHne{^=5-3C}g+l{CL6{ z7#_mR!fIuYEf`KiW7Ys-5w*2i`43AbOFBiOwSl?CfCezfTGihiGh0|#fQs@m6&u{y z)#Z>$jfL>hEL?KHfSH?34RBff>}c&!-o{mvHCwBkRD~^1Zgvh%?!rB>5^+ckK={1M zbmS5}SodVa?cjm8W>MyI=kjabt0}C+oT{0~&B#$UR$(%F#f%4W|L_2gHJ_yJfo^+k z>NP7ZOH}1o@P5?U->r^pvL<;x*S;BmFt+g)qY}UwU|BlmRyDmEdp5ijSEYyCMfsp< zMOauQjNhIpp3oYIqY(Mrtu&yk)&WHRoh8ocP3vyD9B=yY+fX?rETBHvH-Kk|!VWUtZ&+T4o42{2FgN*zox)?`bzakWSWGS?dbWpG7qS{}!Rssi0o zH03*Oxuh@_w~1V;tRs&fmzmQI~GcoLW2 za5;)fijXN;3OgZf+q7M%l5_|s-Vj*rf5x2?%9EH&4mfsV&!EtTRFs~p_GaXluq>5A5RG%PB6F?;-`U4I zykn~HSuL!NYiy+6KEkQl`C0jxSuq_Id1dCVvp4Ff=pN{`j9K(X`>4CW$2vW!_gRjw z$SW0<`Q_|+%wr|baRh_IL&{l;nQcLKK1pdAzH#+s61+JZe&fvH(=>0*LS^4%z)eX@ z!O6YHT%vtvaxZ{hr;o!D?yciI6LE)ZJa|#p>^a9qVY|!2+`9c>@hw<9hUc*9_pksL$ zHRTn!Y}rcGR#YlgCT67J4ZF7DW8eJ(p4q((mGZmJUb9@aDv@-D)h+#9qnpJD53jAliN?k`<45ulXFp`j!Lg)a(hk}nUwzjXIdnS zaz2}tl1+sfg%Z?K)tA!RDHSHj)p2HOrkrF8C@m#Tq@<(}S8C~x_Ss1=PM-A{EX;3g z7iAIFkrw#oG0PS?)*vR%o;*ue-gt##hco6*$DVC_sp0fFr(*_T4j#L|WwB~jO;Mrr zfrnkDJ9%~kBT+G@uvTSy${bBWd-@QDQdE{3V%c|aa4>Wgwd@kko=O=R87M6&76tiv zq;ej?1^M3&_VPp&n83`d7WYFa8ylh@C!c6uFNeBuR+ z$oCNwhC*ujoTN#ew~q)fq6BvF{!9V+FjGE%~i#_W~XJM zwWpniV*@0w3m@v`+(WI# z?`aEX;4L4y1?z6Q0-4#F?hq&T9mBofxC_rd@RVe-gW;}3;dQ4^u0A7!m`qt z5?JOd5F5|r&7mScx%i{X!HI$5-umY;p7yZ?ug6VO)?iJ=JpAa$W8<#E!{I&4kupyl!4aZhxi!sC%>UTc09XXaNY z?3~A;Rf&X0{ZI5obr~}mIQc!H;!lH!k)UFtXP}!nwW5@Wg}J|?8iPlW@; z_hOg|T*!ryl`T<&m8Vrfz4RbWTv4-xR+PX77-^c`kXxE=;Z9q zP?PmXzW8wz8GGJyk8H$4Kl!B(vTDKM@jXF8gz};{#zqYmH%EOwq3hRx^)mfx0IgEymMsdEgMX@K_n4M;4WD(2Cx|)x&7V_dlGhEqWZ?vD- zsVz4>+r)5cbZ+Q4FTd1LcV6(uLx`6>!?^kH-r;29GY3!Mo-h2=O3+6AwmXGu4)4m% zQO#Jz4 z3JZjcT5YEu@R%A+>ldIUU{3qFbp8U&pFTr5KiTW&keu)S@*dpzWj0na$i~{J|EJBJhQD0@A$KMJ{ob2pjqEJVIyVK zdz`6hdihj!{mhj30~MAts;Btou2xasc1Fcq8ZNB%lT26IY^#u&nh`QyQ>BN0XD6tJ z&L%N1JfIdQRRtBSoH&o<{^%fDdRqM(7hV?;dEVLT&D@fFy!WdgcH7p9K#VX%LR4qdZaj^gg{za8Wzr)jRo>2)jYpELfw76 zxbyK};m#)>Qb3z*$(C&YcP&zqQL)}m)p8OPo&6m&I67$JTSLs^)Pi|gd7Lhh|5S6A z1X`7g)(K~hr5U@XlZ*jdSk9WYjFXZG%&`pLQ|8OQ?tUfTE?T}wC8(G-dm26c&{Lwn zx1X%^YUdv_7a3dc%V~#Z$Yj_q5m&iQllJCG*`*3Za)(oKHoH#+k*K`9a>^fy4w00r zsjRF-zGkpPiJEsg4PeedgeILyLtzh>M+lHE7l^%Cqe31=v0Mi0o}M09e^hHrGff!% z*-f7w?Y4TW+KmUly`>$~=S?TeX3MI}u>F~B7GPhtpl~$Vrd)7#Ux85Rw9pY!MROWd zm|dWpnyQPc)EhBVq}_yvaMB6o)O5b9iGFnX`IZ zsIjw2Wdc)O$`9BMo1K4wWM$K=`?UAx$v_O?TN z@xibD6E^JJg6MG4rj~5U_J7?XMQLT99gU4p_dpl=qAbaddW_UB*G9?_Dm^uwI(s|O z(%sBn#?FgZgPDz`wP8NCkU$8q)^=(E*b4)4^AV>lK6By>u6e^X$jQr5Aw2^F10?OU zg2NMFW)?}DVX#TQ*d|uk0=H%BRo2%}KKzYTsrVlDvG$l2K0T#KrIaV5E zu%WDIKvT|VQB_+y(qe%g8KLvh2E&3n^GDUZ%8B&*`}?>Eyyif{N|8eNbG{m0PW+z!WgVF%4?!jT%c$g$eJR(wNdq(N4Qy3$&j zTQiF@I4Q>({y1hls-?6mPBhn3ed}o&8jd>P<`dxRI#Ws}QI=E&bcG%b&M^Z@?ebYU zD-{neZ)Z=VWI4`{m}ste@Rv^HNzIZOAW`*V)11~km1;*Kx=7?0ig zYcbG2I96SDo>$IH5+_0H$Jp3l1w2!SvG?oJb3*+HuJKw_Sct3FT}sOqEpm0Ad87~3 zpTH--^JOIub20T~OSWYD!)TFok+r^iu#4UPEmb-hm$K8R&r{ z2(alEO=+(%@3Be*0fgC?xEW@tm`TI|tc7WdIg(Wm4ymeb7p}cf$zpZW>hRnXo2aY3 z%jtQ6%lAOGUo$yt+m=0M9PFC2?u_<|Ir)>MIW>aZXet^rdNCA?>MMyT8>9-6h>Q?w z+cGe{IR{z8De9=Bqa3O-;NwlyTA9iD7*1bc2#3GCh@=;=7gKIdj+6hp`}^_rpZx^?_=B&b zq4nhn?Ac)^J(8NRr|3k&baWzp@v8KdY{~Y=(jq}DZM~gW_-m`;bg*bttDLyFy8q3oQw*RLO+` zA`vBH+T5A^y97;~X+I}zt8Kh+gS|i26I!^_)F-6&mv@cRTAH{Wbshu5g9aeUoqD(! zBkzhNn>}_$%(!3}%->8w=N0se$R4iUFpI&p# zl~hw%>EvTR)7yXZAU^uFf5G;H`|wJwz&JO(-6YZLZjeO8HgD8IQc|HVHMSs){300T+WUpvNLm#o0+SU zI^<>MikXvUp|-S^|5nA&<1{w~#Gy?zj!kOLC^V1<9;4NJGsq1N4AJfXd53%*RE6NL ze%)2LaLt9vn=)dK>dDU*Y1ASi5+;6Blb5aBqg7ZgOg@6g&+Zh_(Gdg^L`nxUkvE`0 zBd^_fsPHe=6hTUi%=*G^rKJyA)A3)hWW5R^F=-tTLN(XxS@Yv5DaX0Pa8!ttAW;#r^ zANZj}_B~iRIHr2sx&d1#N%v-w%HSBdPtO?va2j0K{6qgyxdsTMVzy024@cO^J zSuScqY53^wBlz-P{wp5%?$5zVQuJEJjz2;bzqjzP`iBG`|$Q_%jc={W6#;~HU^>vg_Dt&z&`fe)|AgfB8|gY z*b6(6^W(<-EGVi=XdgbuTc%xxL>rGsBF}~G>+RDnMWXF`)mJGJZHb;Aw*_+XmFT#0 zTT?L?iMH|dMFl7mZpH1SS8dKJFRrBg?0j%`BMq2(72ZGCub?e2J5PnO@OvlD9!GC~ zk7H)WX6J0W23~3G2^i*SsGD%<^!axdsk7xI_s`$@C*mX(JTGr~b}K${>))ccyH^;d zWae5|#K3owQ6DKW4mMwuOG2ay23%3O5GzV%ay~_LM~2X!GJ?`*rY`5E*#z37y?Cl| zH%|4k>=+`_B-meAG6R=XE>OP@r^aw>x|At10>KH`JEXMT(b_Ipisipu4N}iG z7iza;W@XK)0suv5{(8V@*$HawyeTEea&#UY$pMIAY(o>InKL1k#vcfOK@Jf|<)HoDXl;CZj zc$Wm(c;?!Ez72PM`KRLOp2KlNZ3_a}aTF9Lu+X=S+>`A@X)PnW?@7#DSs0K5%FWBc zwO3t%+L~&&7~{p!x#lK(=G$MxwgY=H-o{}teB?wzXLut0;N0u+Z@b1<=Faa+nqd-- zCuBfMG)~e^*opQv(ZUB^$-1k_Ho+FjK+b0=lvZIUXO>t;Bzr5!D^L|XVC2A#u6DGv zHz6}U6FFHqoV%C3OXX`CI(s@nPP(+Rv#ZoYzSI}QTS{$uI*X0Ayq;on^+)T)Wj9<# zIk`C~uPQ@RLlcf4JjPzDfRmZSor5^mtN>OZ1amKYlt62=8}sw)kQqrshDbqfEM4(& zW*NQ11K1+vp2yFgYB_>N7)I=fsF&4IH#x(&^(*0T?lz# z7oI~H38cMqIr~>}PLW~2CQq(><$T3w+Rlo$zVoGk2`iOw9V$AYzsm1LY>T7a(BE;OBPj006|8y4Q_L1g7-(-m*M z25Z1u@|9%X<<^V#!$-CkS0z}dMqXSMHo)>*U4un(YOu3>#$?J+D= zLVu*Dr_qY#7vS2fuRu{zq2cZ^X?N|zj~@8B0@#xcXOT!_3AQ=GEI}+ECJK7CuZhHC zCJK7ow4|DNUlT2SkZj2|(H6;6AZr0O@L&)s9#67Zk)D=LUA>)XY;8baf3KQX*!EVK zUnq3?#Xw}pZP4uThJU40%euxpMN%jHs+oS<;T&-O&Xr!xKU) zqrnEp`t=c=BU2b>sn1pw3Yadh-8$eDl@?*!Q!kETh1S+;N91LI=Q%$Sg(&5~R=9yT z3!Nc(uQSs!L`F)Q28GxNooPF#l1Fezj#Eg&Tdja5{=2947Pc5Rx!1Z z=^gCD;K-o8dRqj+O1z=Io}#QQ(@4|sm}j$}wqvL)LeVT)uTZ#}|L9kt#j z+vEmAQ7NHHdAPf$lVYQzagH=RU*+ZGDbG|TzsgCtrL)D(gH9(4jBBNOGa$N zRK4&9Jy)AOl;h3WlV`Bz$~7n~E>xi!oTOskj=h@As`<=Gv5KsEELu;)9)t3LSWSE_ zgWWVmYX8h;>wBB=Xv0g`-gXrIBSR`DthI%~W6gG+m3kRTxi&J(j zj0UyfY!n0G-U}5Cz?vKThWaQkBTuyUv{8M_84j~?GHf^|ZjAJC?DEOHZMN4pKv)+n zyRhH|j&_vl9qQGJ0h}4YCZZ-YN_J7<5Yr~uZ$5pVmRxqB&S@-v*vt6Lp;Kn8LrObi z@hrUklef~kH(n73u19wr#+_gK37)JdJ zS7kkur#-@KR{l(?tHq5sT#aSRmgs~iX7sk~+l_zt##eFs!@o>|YqBNVA90IhQQmrT z^I^C|54n(_5l$drNhy(LqF?|XL~eG0WV5N%*4c_v=j)}+I%>$8JF1$G0{?G2`x=l6 zyyL?BtvVL#at>l zn-mS%{|&?BV5UCnR6&^<=`{LJ##J0MBDY+**i>3dCjJ-$IUqpD>hGKm!m=sn zQGFgJdlt*la!h>5>B64He* z3BAZOK@;LfACKcE!z3Jw}k#m-mw7J~2tBQ_rf>F014=KCw3* z3$ydSX6y%8pwW%&{iLq8R>w*D9WLh$#vx-J4#G+w@WKX*j0+4O*H9nYmUW}g&L}(2 z;xrv72P);Pd&lwzQ%GiZf#i{1`kt*$Al1IkLqgEoo&{IdD@$DW0%7o- zft^fI!ITiy7h{4t8vH{nWnj> z8Tl-}hcm%dxgH3-`Grw($?qQDX1c&Qc=^OpiDSk(So!`OaG5#9I*{&)39E?|X5@HE zQX(Fn`5z3Jq~;jdy+?jXOQ`V`)^V_I=Nw}-hUbA+qnc)I2hco3Jhsd zYBYmj<+S`|MlSviQ-s6YR`@1Qi&krMg6Xg$>Fw%S3ythD(vhD(?5R~zL3aLvq|Ujp zi>>Kzt2U!ik@OrDnUq

s*as53QOLP~RMAs_Kjp{i$%QY@`pHu^i?6ZQcQ@WzM8Y zmmrtzdwqR6{K?m`oOwV}tzCRk({K^q80h|GwBEa=8tp+g?}?*D|wnp}y794|%Y zZ`tc$28AC*b^aqaKG72{n}*<`mPREQRM2&F!-3cj-ROuw1{G}; z{dMO3vYh=zHs!=z3dMy8kvY#pQ*C$E-F|7q7pgSJ+&6lOe0omM>Rp^+#fh9^x3UlL z#APGOH5pPPwlj9|#ETbRJB5k>i{8c^&KerJe~%I0e@_Q8L)I5sbR!K3Bb((OJ|28R z%i%+L(VIx_Hin)PR{(bFMA`4c*xSdU56)xU*UD(h=Lh{*H`0s{{ynug*jxDwakxs7 z;bZa&S_Cbu;H6Jw)& z!(WHCcAJySr5Tm)u2;iiTOZ4m1!AK^I@|WTa&iN(#p5?jIp|YAPTHi&wu)B{`-ez zIKq%PkFmjh6-VAu7#!=u_wgF7A0&}b^E|luvU}WhPCH?;_*e9Gd(O)ld26w+Q#VeN zx(tRg5~qBgG|P%(l2v0{b7eyj5pU{buKEFPOnO{6DymS~L^?Bwp$M6AWD~qli<|gz z_i8G<_N(WO09gkgtv9n(_3L>_t_udeLbGa&^bN=vj{bO1+Y9kx0r~5R#}jS&?ym$c z7~km1dO(TR=NO?>y_Ce~zGhU>Za`Bcor*(Sb1)s=?z*Sh{Ef2ybmbD9E*>%}{Ork6 z-uA)pKN+lhmXJf>%Om>G+LDs&puj&vzSUVVpCMFr zk9W@scLl(bMdF$~Ivj}^09E#%0$N!DPDAHBrTvmqF)1SlGCr4GM3vWO;!X@6?akKw zYB-VS@AzNp?1?CxgG4_NgHP5<0oWvnVctvWNg3iL#uxnKn}jstg&PahT8g~C)spD) z<|e!jWhQF4Q7}ck2mi>bh!8M34dUV<+sPW4Z(H(i6OwEy{9;zkYy8BPc9rFyQkA^< z@yCbFj+3vV#i8&mr=ti&>=`Hbsfg7X&IDGFLgVv1$a6ydpXSSy@Wxvn@O_&_!p;zS z7jY;bFCKP+b3%BnMJ<1B!!ywY1M-!5kA!ZFUS`3wVSwN>%K8ZV2>Vp#6a}t3>hTBy zFF8tB!LiHWqEEo+Sa;HR-3eu>>qsGuDYgi}`dWOx?&taT;abxoH5_=^Wc?PZ}zgyH@q^u+Lv43My2#29)s z;|5$-N}9-1&8&0uo&p-$^ZN~7R@_5GEFa1*zQNK2c8*OoNV#>xUFZGRd9GiJ?Fo~W zt+klf?YEs~oXZ6rZu?a;e#OWJEMFe@p!Tp68LZDkRxwH+wHfXTv(j4f+;FS0(sqMf zvc`kGd}LwoGXQ2{LQId@UPe}~Tc;-Hy!v`6;RIBGXqnPB=+ zY~0&re0VD`yb4hImGmdv*5}Of>aHWUF+9@Fb$`=R)QI{|P=l>I z>`t`guG_m7;;#+7*U^9#yKN;!i)-w3-q}ZrA)G}htgD27!x}*5pe3|61qZk`Qq1&I zm?d3tBYO2hYO6u+#Ajso7Y1MFwa&u>2`wMVf6*>{-S7iZ=%sk$h>xhb2$fqGqXJWT z84;SYu`=PJ3^UXaI|bK$U|HX?%&;tee$(zLoyFrWThZo)ii(0xK68lV)vmKK2rufP>hi?7sf)1Y2^V%wh4#cf zQZGo=?wDg0Fz-ltBC}Xd&((~T8tX)Y89fqiJ&M&6l?Fen{Rbmd1vtY{1fykg&GRc_ zElDs$uxOI~xYL_#Kv>2NdF!A|pdGIB$(PIGvJawdb0~E9yC=zzadmx=8(#xTGEo~C z|8MlJe&z?QFh(`(xKpJfw2EG4IZUC%y`O3X7_hoQ-qbg_m)F}2J1IXp7kAcy$)Qvp zgnBtTl0&o7noNnv~&8p=tN%GE!i9#&?B{3jcO)`K$_pANgo|pBl{L%;Nt)#oyh@q{e6=?{}JeT z2tvPiMJUyO{c@taUkX$doY=$ux1{;b7Xf}3vcc2?ne#5PF5onEw5oovvQer1v>`?U z%piOQd^+82NX)J{$R1XxfQ=sdtYWHqaJNCcY{&|(#^_L+_Qwp* z0;tN%=D_R8IU5x|BBL}+Ir9)=C?7=``H&~yGr_2yF7mJr2k|k)_l@?|uMV}(RnMD(YPzmqjEqcr5T{m#M7%eta{K9g zos+f8p&t5mY8He#71b`f7o!?k>M?e@$TBv3h|zMu_`>w{VuewHm9K|PE>8dN@eJ4+ zu(>Tx>p55jb;?ysk0MIwoobLQi&(5cy;xm$RQpieW#d~>R=(7`T zsc(QgvKSYMrqDviP1Vv`aMER}*q>aJIVwdY(A*6KVlDre($q~=?ng@+?5}+6lVdJa z3i*v#-~D}G{@nf=E%beVG#W>Hk!+`?hc{&xk>W<_If2d!-A=_!U*58!n z0!GW=avyh%Zgi+1Nlda(cUW{9cbjyS^oNZIf?&+@X{@-nqQx>tvsMkDX1OARAa*(I zmv@7|QL#bo(I33^_tDk&=RA6FYtZVI$9D5o?_0A^n0iI^56?6I!tFk-TvxMQQL?wMvf3_ zo@3yky_~P0PkLzm3-H!vx>>9Ym=S)HEU?F?+jv1m)rb|}mnQ?>TCC^WzDQjeb_E`w z#BJCMBs%naB3W68;tF-JX;$rK|AEG&zn z1ig<*=m!UXkEI~n0O~LKMHS#Omom^+)b>Vw{3yf89R;sw5t$mM_Xk{N%JcOZCsSFR zV#(b{4h6;qxea+J5U#jAul2`pfZq5X&>6t#B5R$Z>&W2C2dCIO16zCATm(%mLw)wz zJUGW|_gKyH^156lO=XCr9UQY98Y^OuhrKzOQ*+;pxPF@w`XvWAM_$osh3Vo_`dK~F zlqCRPw8W$Aa?-kGC(hVH$fQv-Yel+D5%xmSutKgP5W^7Q#94hBtW_MP@HtpMqvn031|7Now6yw(6vI*4(LSE@>GdbMu*rJ)oNKM`FHJYEMC*9 z*Y)JgrY+!m+xok#LdIv^?mGTum(L4k*aaUETzOPS$j#kO%@V4`6LQ0#XU+ey5Zh0M zYyxj4e<-QrZBAw2!Z}S@VWi!f?`v@S_N)6HrO9K*0=u5zOVDv+uivx@c-HU#=_dFw zoP34R96w*a3FJ;%_j!9eZ-YWT4%U|9n6?$?;{k1P&m1V>dsBwfe`1@|o_Y&ukVk(` zW^EO}rPVZlq9B=b<9TI;ve(_ZStaggmE2=*mlr`DH2U0a0Q;!ixJmb7lFTZugx~ir zkyUJ3Zh5<_>C)oZs8lroqJyu4W4WPZBRvIiI~4hvYuX&E!r%Pex8@*fF)D$e7GtEj z@OYQ!SOM`gM(dg1x{no(2kv#PLS1OZJ_RAFA znNm}LL*(kS_nEibXZuzT#szS3dQ;o%jY0!ANox+mHYsNXt;tjTPVk5S!)W4K(ylN( z{76q`*UCAvQvfA;F#|CHPv4W~t?hkgd7f&OcHKzH2~|gh0G-tPkNWD`Xyb>bi)>R# zNoh`R*H7k59@~q5KS7!UqZAsS)Pl#i=6W=ey;<(_bzj*h0VV#ynK@lwx78^|2#{3Q z7^y5bLF}?!L7+a5re1(Vty|+Gi6V^(tpGz}%*_#Ub^(zrgQ_;rL^ppXlhZ^5k9_aG z0)3~MORv`c^!>&g*%)W9IP6IPcly>#FI&EchxNwN1mOB}Y18Rx1yhY|8DW2hW0Z44 zK|E{Urs){hdI91&sB+hW^4DxaYW!_lx-GwoOkwjM;*OU&sh17k4+wZXuK#^)rC4oZ zjhR$^SozqpnR`SNyc12)WTAb_aaT;qMx-MT0Z-zBU6*A`aD9Q0W05gK1%(_@B}IFFn8LKBi|~;NDK81QmMw;(I4ob+V2H`LPb)ySywK=x2cRk^6SJ5;Tjld21; zhv(bKs$9QGUwFvJe(DdYJM~l%xUC{>$su&@MoI4>S$Ukfenv))pp(^7+_e~~uIpGa zpx=m5a7(97eN22(9^P&fl*jDUTt$MLz4jjnz}i)Xw+XZ#6t;(%Ji8DlfY(ooRzj}`KH*62eW{_&EN(Qz87<(Tzss+(j9uTd*Cw zslK|2wf+fs;x+k$7g=}AU@zcVsFiZ-3NKst>D4@=f`k%hGn+h8T!pvE!!tlF z-%1X~`W&AmNCK%OVjl>ds{b<*SG}N86^Fz5-y66Sc@WgRJjp(#RJn@ak0b}jx_i5- zSLzm78rW(EMAjthp56+ZK1|bnUp4G?!aHszhsjlA%Opg(zZbs-;W^ryF6Qj(4>;|9 zSjKMdRq-_NGQj1i>Re#q3R`<1LKCe*OVEmixB(`qV?q`CYwQ>yq>^hgj7b;SuPRBOk#Hix0_%^=PuHm zdt^O5&>|TRA!jkDZA+MeUi;3*?RN!IW2zrJ1KsgKoBTN+ChT?|BpO80FQZml58Fjl zmKU|f0eQQ2X)sYG+iv{LwR;!h2W-5C#(&upqc?p`L2`=bjsE`lmtfRin zO%J~g7mq8;B$`CO4j?&4HDOdO-@6widq9_>(~xfVInhpGu`QC^HurSjiQV4e@x8aV zTB{SGp#;WufHy;@ROCo`T9>Xj7AtMK)-gT~fC-bbd31~xB9RzhB37qdt|#e-0@fOs zKx?d5Md!IQ@N;%{Qy{4pgRm$^PtVLR3??jgd~mZ6F5aJxh$k~%jlDiwAeLSg)q@kZ z;XcBJlT}tqQl{yITsnm;5Nb~|O~dY%C0Tq&axg(%$Ah6iM zbY~{}JNKxdLH{?@!=Xh@JgbINgLBCY(Ks8;2v>d{Pm8)q%J$?dre3V3_-X1KG5Mrc zfpz_aMfUrnC=lchsMaCAZKc4jNGF&d!4DaJrpG;=d|y`H1Do@0=t{-Z11Goj5nze>R8fg%y zFerVgZ3}R!;0~K1;*Q%)+nmMZN>!GKOGTsesmzyl-*;}Gw{YDLS-V376+wk!>jmsLbOk`J;Y6`J&eBaH`xY+z|N zyo%!h7A}`E3fPYg%0yc$ZZ%K2judz;3=>5DaEOXd`S;6&sy(ujFkowzAQrPAkF!!< zg^=<@uD7;NhoxL9NGJeQ$iU4=n8CLx*kPMG{@gDE!Xz()Eg%&GJ#{G?RRG^1MXRvB`?Q2PoEf$+@0x= zKi7o%+2tG7Q)xC#E7X5waayW^^c@z|M6CMw$-BVg#y)(hJLKLTMQ{FP^E#PSJ^;pN z%wJ4(+i{=0&rQwvw$ZW@L#li7eVxdJ4XcPyMn^R~gybXL@do}DFh^i-JAhVopK_uk zp|tp)BsM)i>V87=eoxx&W;FDEb-4f|?UeL;(2V<;E$)3^ql5TLTTTBLkZ7uwk$E5H z*>yxsp`-C^PP@3S^aT!xzqM{LRTfENyS})VABQN)Z}W+wBeCh-5pQ}>zx{Go>;z%_ zuPa{>ws@^GFV5|W=h!1ooOB%p?Yp?2e3`x2cRJ3R*C#fo84L6m=B=}*FyW(#Z@;jJpQi}(TBQeObWhkn9 zQcswZ({GIb_!)5Cml{qlbv69%sC%qAZMZKrO@^4D>`q{eBi9m)Dc z3E5IO>-zvW9UW%-sQ=VfUbE;SlH1L78>L^uKSWw}v@4TB#Z6CuaJt!*O zFIw+?R641^k)5{)qslw65@-$(!_#I+!_Y?mK0a$Hn?Pqq)*n=Y!&K1of6kDcw94HU z+Y(16rWTfoelM@DQ)OpIz8q=u^{zhMs>SXCW`X&I{iuEH81Z*toz=}uDh*UE(bf6T z+TqJnuPza=i*^&(m;6tV?~BV@=Ae!Jm$~g@NR^*!Rrm`(DS zsi_GhH616^LlcwoI42y9dgpCb96nFMuc>mzJF*)F4hwH(I2FDgV=))~#19Cve7AQ9 zn_kWDJL`}FVY{~%^N&j|-l!x|_|s5|ZngDrd3sB3`O5|?;~91dr2xgUU$>1MOoMA3 zs{?iRY;e1`=8+hYkiEHbh^U$sB-Tv==ud?PSE)D$u*HI8Q46q?^zerL4rzScwg6bv zvc2n*(~I8Lc+*u!^%^QHPkP578nwLNQ7?nJ+T!bbzV9b$e88*<5zv6f$NPl(Ql4B3 zudIsA3XAv^jMjswVd>57qpqXRRFs<}4cu{2`exU_kTh}kfi8s%51-R z)_ozw8tT>h|9>JS86}sP!YQaIkwsny2PWbV^-L(NvaPKwQN+%p8!Ac!Iil^P&FuxC&ah?I1g~q}Q!*>#;~|Ge z(q&~Ewb_T$ViGgUZF8h-0l^m?RtE=%ex1I*?Zl@?$hl|GSgUJ!vfg;?yi)=!o-L$O zrlXx^FCrw36tE5wODrwN@QBl`vyYE6dLhxWMu#KrSHn6PlbH5xBV6`wr#cDK=P39{ zka1oT7-21Fa8+{BV`B*lj3x+patW9_*l`Vh32me7417cY453OABBN&xZ95b{6{tx7 z;2NlN`%d-&u45Qh0E$476@NE0aZyP&BoA^m01X;#F!;`@uysh%7XMm->B8QUuNQvl zTNR#Xqsy|cBc*UDG$6naN}a{@Afq4QPQ?*9FsG%4cpuZ&jn=A&GPfhhki49BSf;rv zmbTLdm$9BP6UyiPYV#$S&I@Y$byQAeFylWxQ>rPnNnAqp)FW#YJUF5NJ2B;fbc^@K~dmBJ%do)Ku4BWqg|sls$y+;Uv#W{Bq@Afm&>!AzO_u2 z@sN5jAr;j@qJC)#%~A(u-)N3^2y#mb0^B zgMdVWMO!`Sv%cF0I|hWHD?cxbv-)}eE*}HUf$)9T_$^+y z{6AqC-#m72Vs1Kae#8lHFaG%KbmEoi1pj2dfxj3cu4$EEY-~btH4DQ`op5q$ESA3_ z^2>iv_&mrE`j@bBVp@o#w1T!q<$>bU2+bIk>L+mdCky-ukO#;WfJX5DCht#c{t7o#OxO7IvHLy{WzyFfEnDoBvspX+) z{B~>FJ7%az(Ces+Z16Yly)|duc}+C{VQ;eCP!e^>+icG^vqxr)JjYP`6~(ED6gR2< zV(!rGKD%3e^=gv6lxWL&`}5_*lsEjc{prvD&b61mWfG*CO}u}={0RBjqSMwjOUm2h z1F%L;Lz5Usec8$ERn!xw4v1IHOhidJJva-A*KIEYG??K*a$(wvetV`{9@IN<6Y0TN77kzaxX{&lkoiE(SITcL|;l>!zX zl$4f~_D0hL7QD*?P3nk9fWHuWcH_Sw^vdumGCvpd{I_kfPKWxW&GVC%W5}$lSUx$# z!%yc-U<)3FDqE_(%U70NgFHyc9aV|-(ePm*GV}278Ovh@6j3n}UCzW|JKfhRQqq&D z)-=~}PhPHM!R0A_sb2aC!+TkoP*48AR2B;s8`vPyP1ch(s!Nn!S81a|Ye z>TS)vj;U6A#9Ag_wm%_u~%Emo;+^#Hk9&Lg3#K$-?$t{to_NOpp+JI+1fJ1u}*f4Qi2Rlc8Dv5+K&5lML9A&5ccbw8>;+~YL=K|q#JrkBw-94 z1}!!4cQxEhanWcYX&G9DNmZ(NO~<^*1w7b4_b2`P0+*#}jz~S4gr`B$7|8@frN0A6 z7=6oJA0~`_{~9)f>6q3OQXxjg7!rwTD=?sQ!B@L2tZg=Q_9F>I?T{N@c=Ts9>lm1R zt6Z^OoirC`7?0+&-uS$xav@HV{`Nywdg5gy6^Qw%ihrryNtv7=dqr@c#xX%iORQ0427)dwF{yv{W%!5d@{ONcZSr$8 z0pT(es%c@Qr+j%fDeOprG`-OhNE9TC`YukmbQ7U|gBBOg(P8O()}KrDica@x-(yR9 z!`X`MS3M&WQ;OnJOs);hSC{_ih)uNO=F z==dOYcoVzNH?i&r7bT976*)wm!0)E(E~{2b@qd#hrbrp3p}46|Xk{3t=|~)bt#0cO zwzldybj}!xW20W`2 zT{!}KN~5mT@*;dEbrUYD$xXa%zYEu+X)R|&QWA5v!JPo#i({G zB8-~*r%woS<83{Xs+`Lxvp8AOf9!iFf;!hP0qgT|h`;0i{Z^=FNn;`07!;97> z*yFH?b*PwlJRWYe%OiqLL>A}o!|>1Ao2<6=xg@5iY>$p6{f;KorMD+MazY%-hE~Vl z{Pa+g(xwVyFm+Y1KvYpeyvh4+2dYY`++y_%OfF|8kUEpqfqKwhTn!l9Z4EV{&5Dfn zzC@$$D8x7^GF*#F#)RYWZVu9407e0}DtXH+vyRfh zXq=%LbGHGMsdHb!7-uGH6cdZY>2o0{mzf*81vi(F>z~6YVzSS(Ff8iyW@!fXFEeti z!JtYx$0`E`-yx7aB)1RDeo(1?24u!wy^iA(yupxFrsaRoQ0D7}SzR`R{MtW=^&b0c zS^1A)^C>dn80^C;B-YW%!N+&GZC}TmDQB#0tcJvF-sm;3G?jbptk;=-Ar#qA^&Tr1 z+<~krA@nhDG!^T_s0V{UHEF)dg=EG4#6rubZ{o-PaS_~aCa+A)lQWUP%)nG1x24>o zMI*>waD1|d5fnybp#|>oHdsnjJTgQTjAr&%4*#{~Cr8#XNywjNGB&6>XshT8&VQ59 zoqjyi*9U)(Oi%*j(`k@1Yt2Zje3vbC!CSDeJQe?5RuAyo^1VL)lbR{rJ6*k{Ql%Am z9+C42{L12`L$7bnN3e%CHTjqzsC==~Ua_``z}#Vf69Mf}f%OkvqAyajZ(M4kVSaSPFSU%WpmWI;Q%>=bE@c4s+h?KV$+`WbM}{I#mPtb2xYUEAC}Q z6d z?p|GQ1-5rPqJu+#t03A817uc;Lrou}3i(x6-l)%_Q|3h%Td_tJ831=8nkf?y{vx7C zIByAP1tF#8g@8=1@S=ib%2RLQJ~_`_NLjkj5ENurP2Zb;dg&#!JS9KppPk@G2;&qw zG9Oi=Bd6`csU$J!S4YXCHd{sfUIY8~%j3IG(pZ?$tkiwJfGiJ1a9*>ng+GMM_q=V95~_;!MK2OUmRfhl~> zSq2?mCp=7Jmkxu5PIKj6Stw#p8w{%}{g{I=> z&DHq$?(@3&UpEr4(Gfi+Y&Sis<57YGxQm1$6K3lcjr!s_G7hSc9uWr9N~8%2CdI~UUC&$N*xfzSa1z@9s@CwxZ&Y5z%cYAX)zd8r-p zym~oM9bEO6n}VAoPv5s4w3i+jSJakMP}|e0TrPPgO6BoQ)CkeGLu|j zNWKJkr2{IQ&BA_p{Kdn;8t9FOs5Rb38#PErg#=T4KCq@s@%%~KX@`4OAUz2Ns_YOh z?w9vLh*QcZ7%(f4NDwNm2n~uXSj(~f&gP`*Ffr&M2?o8!+`g~g+L{|`LYLJ~Kt);2 z(9Qe(;)sE%pwpd3h9qds-C#-hz~w+AZG@<(2iTY=U^`~~L^s{pza=azuZ&;Kqlx(OZ|9Ob3{xwhhe;G>MZbO> z>*>0%l39Awv?ELZPZwt94v>X&){m*^a5U7YJx-?5HmL>G28=ZyM`e1y>W@Sj<9MRd z!iM9ZwI>4mjf3E)rY85fDRq_Rlxi>Lj9ZRmmU9})V26%n4l%p#(VzEpzdz5}J?@M) zI6g`}L}d#;OLhJ;li@3dCoqi&PP@*DN}w7ihE0May*Si6%q}j60^1}HZTesn%TMiA zChNe)89dLdj0y@%VP(to(n31<-B>ujv1(=v2JaNBSN&U-imkyEMCuama%| zrJ$he&D{(ZnQy%x+h>C`REpS;^l5@Iqce(^+RlmP;@W>L?^zR>CSNacc#=%Ea+XlV z-Ari~CaK*4x#?I9IWROG&u8c6qHL2q=%V;}Ortt{X>r~MR9$A)XDvH2;XIwOs5q_( z7?UAiEaB&%{h(axPDHX~aX`x5$qq7%6fHb1)Lgxtp7otCYHzEw{$4drd+V;byHY?f z?JDVmzD@nwp@E=2=-TL&-qy>tuIUrMeN*XTdj8wm@>IF3|JHFzNjwa4kuPW6^G4?l zmag+39N?p1Di%i8nyq_ev>($*JlZf^btJ^KxY z)9&8qA@T`|pwMdWVA+IiMmnWBrXk!?x;zz62=@L|BcSB*#kfRT;Fr>zWDTWdn-@)d z0Paa(2!@E%7k$(+Y)Dt0-}teD@JS3s)j)qP(5qYS_(y1%2Gd!?Uv{TIp95W0!8%U- z)1Q|Nk!h>tC}A{%3IY1g{^-YgF+zx==p1{=P}*h1+*cWrR1NZ?t=W%)gL`wy)S1Jb(fd2~LdP}VIng=uRaA7mar8&6U@AMPh) zsQJ?jKhsy?cMq28@aKI|nDQjfW%Z}K$%&By7W4`gRwZz8lhpUbEqj8aDwP?b45 z1bZgBb=%)Ke17@GQIJz2R>zMS6F3^&o(yQx+0}h+iZZ)D6Bo1v$5xBxS89FR+1I_I zL>GJ*0)Bwt-8)RlPEDP4qt|cM_pMRj62SCRKcZzY)-}|j=(fLauVPA~etzAm`TT>h z^_3S^5sx;JDl^o-3}}n-n?VJmCaxKe)E!p#>`1FmRtwb{>p5I?r044tC8^l?ov_Km z_!l(Zb5@zP%xd?vw6x%2^$uVyQ@OCbT8_qJWe{0ngpEM?well>QU*2Y2lH8zyK&j^ zp@UEB4BR$m7*0L&c>wz`88Frpj_25FY%fAln?Ij4oTV1fHy)f)e;x!5Xs@rSYs0TH zY^&WVyH1*#8R#}ECIxGxMBPiXq#N2Obj-Avf~nf-((yVL#zQ`ha ziW}tRa6Dn*HYV_OQ9)6kzzn1~iizg!%(;&3C-x>bunv!+M`f@_5EVy}w4oZv%otEXMw$#jPQIM8jg6& z^l7KB@H1SzMLnG(K-EN6NH(Sl9rZ52KS3Xd;=2E|j6nR%Vu(>h1me-fCBHpi6Ave- z6I``RHJ586vQIrgO%(%vW1E27Bc|*gCY-@*VRY9%+8l5x_2Srw1={(ptvttMJ&a=rp3Ky{{18 zsnr+L$#g+htrVqIV!f)N{c0%48oPknJ4(GeOaSgt4Wg!I*p77I4={0l`G_`FzGTO7 zm!f%s2F#)#N)waaB11%ns;E_wPMJ<1yCOiDT|ad)kIBlbYB@t7E{T?()-fzWL#RCM zysV=hl5qDZ-Dy!0AKbngUBdBcHtZx zS4ooIrru_@QNEzrCnYG5#cRdCB6*(li}2S4gBv!Z_AxP-oNthC{)frb;sAX-MZDR) z$q6V76%@A1Id@3n#^iOmw9JIwq2=KL<%ZpOWD28cnS(0w5sC{wyI=QvvTr|(W-|rT z|L^&;2vobK4GDuIuGjR5nM{e_Ig~AS%`E49AN*zQVqbAiK~! z=%{C@Ul}4QsZFC>g-Rc58=F?$wMk-7xz5_0MkdKSnQgf-kIFKE#AUAl`2u6Xqbo7~rhFtDQvI1284g(8*i_HiX&s zd*wwnd1kvt4Xgr7Pi4j-0-7qUm*kDM!w7SZac*NbdU<*O{`(egw4pi>V<>?kO0pT*k|zn0X&c?Y9SnemL#+Zt&l}2 z)!dGj40W0{&UKdZcn5ON@jAo#tN!+aisfN=g^kFW)i2b1qDc`Ib?#xVN6)B$H`wWy z2XMlF*qxn3874k#H@~WFs4F_vK*~}Y?O0WmlckbS1SE_ptbIP*pRC}myV34=5FCMY zOB#0KMS9bKt(8B}0o2OEcL@*aObETBVLwYAaFC2zi!7b!$9Br9w$Zrgm$B9oq2T*4 zONrC-!`7gCUxPi{-}zbZWA!_drm+>YW2QA(cFcPkl1+G#>?4*8tME$V#iB+f@JUGw zAp7ixe+W9(qOCSctgh%R>N2Ez0=^RCVg=E4nsAc0THse-IcT?lp5XPXHf-JZDc9MB zyLa4}xUAUk&#o0vR)y#V&O|0v;)BmIYr^G6iy(a9Kl;-(O^}smyX{oHXC&A2_cdBZ z#V+6zk^8l8pWWlFB+gAm5zKr#gTKi3k*ZqWuTQDn~+m=6H{k zC0z@~;HyZ{0zevYQQtsO0jg)L(SL#>E|#DT;E)FMH+0q76U3;K*I`G1Rs{$_sX{T_*97&X^@oB}yt!Oq_!%V?&m;yNp{HyW zf`{0duOKoc^*+Z?$)Mytg|4HjbA|wyb)4<|p@7#^(;DrZ+LU)^kXEZl`qJ1^_b;AI zhzw~#zbJ@X}Y=vu^sk0j?S*0Qq6aK^5^S92!DtU{}pa%-X^6%D{zB2 zPCR>k^PHE$mp68X_Z!`NHH`i{-P_yl3eIhJsG9r++jg8SSN6H$9cYn!YC}2=Ung?F zhrgC6xb52w#O?+nYsiCD1}_DMvFjK+~#vA$kD%vf*ttrqBiFN5R+O>3A{bhi&Qs)ms#Db&;S%WOWx zSe;#gtk=YhcEyL-UL-RZ)%3x|zlikRls$US!(_sB&`c14jd|1X)j$SEjcTM6Ls#WRa1p$}p1l8OXzgnD~^RFM4>tAynT{ReWM;~5S zx^ys%_{6TFQi>c|(~;Roz)zQQ;ri_)azcMtYZEZn2hX=ktj@5%QPAtGOi~Z<{2Uyq zomkAc?Gl2x?ZN$RP}7d@i5x-Z_5L7be_U&dv??Ogu)tQ zngtQ8Z~>1=^sti??H-E8>sC50Spa%RUYW{Nld+}3lrbK`z&BvJc4tsKT^$Xry7Qt@ zSzEO*g`A7Ov*lQ%qs6mc*3c}UG%zzG@Moys`AnI2(KxS7#|t>hA$mZ)toL`Cg_Kj!q3rcoRjpv}9!i2M?-tmz9TJa&X<%nI;g%*41vugK%_7spE=+&k%yhWP>v(^_SjS| zLj|Jo4<^7{xk(wSY%#t}*_?AKWH9(x9uKZTgO<;IhyBs{ITUh)bO=FKvDu);w>~$N z+SfuTXF{wG(_%A;^=Y&Nb4{xsG)lc8g~2Wy%Q6a8@Yn^dXo_lGul~N?{L$G`fuR(H zU>96tZS5u!xSV^3#}oX2Gn;3)GU|fY($WWMJo<9U@RIDv4=S_?06$gXho-t>;XHZS z8P{4sOL;R4b~9f1@K-%RyiBg%g=vrjDm$6594r9=||?mH;}2J zsBy?X%$yUoDS#TQ+_;|d^Rn98*+`5Fd}Z%bL*NFx!^NYd)~s!ek<}jPMqv6|n{3s7 zGVFEu3pJ;N4eZf4Af%9zLPMNK>rerldVL?u!=ZhSP+9V3_Xbr;C;(BwnC!8REUmO% zZhC^>v!3<}kNv&eg%xYu1aVD!l;cPGAS8!j;~c8s4GZ=k;@&sm$DyEEnB-Gk&1 z@r^aJ@;z;q7DB?yDn+Cs=W5;Jm2#ER_XEfKo@)HwkxqEMtvqQk$Xa2v)6!5cQ!!bZe|Kf4n`3?!aw~T-$Xq^ z6(3438=J7V+3SA{R=IV!(qgFMKbDx99_>#=*Ostt`G6~-E{pjr822VjgOUhsb`jfy3c<%PW05eyE)XbT~jsQic`&%b*}xv%1*mK+f+c z`jzh6%fRDE9KL$1NU4YV1DR!BN=R7>j69F}7a_l_uOHK)(AX{o5mUe$1h~1I8(_3l zq%aWrfW-5V5}LH|kGy>v{dwV!z{!6ZF8)gzc0(|z_f*#7zz6it6svU9O1zx>XbR}V z8R&1Em<7y~Q7;;)S;}fz>|L(XpR~3%X3JBYwgZ-Pd6q_K)^OD9 z!~ST#P&%J|&6QTRT56vErj#Tr-xC@|C2n)?osn_@wSGO&x+)>zIR7y7_#%o{M$*f~ zU^zUbX&dh#tTb%pio6+;tqO?vv>DAcO|z+n)sd+QC*olvF?wwd zx0D|9iEOhIYnWk;qROHan{ra7FnI1?YqCS$O?pe=#6%>vbgIwLowP3Lr==K4n8>v)*27kQdHJ;GJyKZgY0C|atr zM)MX-F9Hf-Y`I@QAE;1(va0gfZM~b#JE{ExirP5lU$Sk^kGfXad?JOZrvZ`OQ0tb9 zKPu{qq29w!h@htnYvxE=+v4aG+CYF8&Y;;U_2?*VOLiok^}web-yhiwjw!Gul}-70 zufLv7HiBvOVDRD~(J>T19;*5|A9`Zxy;G)|WYZe$(8eq&m30pP#({WzjiL{fP_~;w z5pq;0cArp7a|#63F2@bSS>u)bgq6Ze55pQYBT>$)p$fc5EC2sUy2_w9x~BUi5L|=1 zEe^rmg1h_T?gY0W3C`l~5`3}6-QC>@?(S|MdB3ijs`)jwb?0v1p3|q#Dc8y!ryrde z!gc{*708PFjQ?g&a|B>DL7@jl%zp}ZA3nggOzV~aHu+hD@PB2U5pVkcs$Jkf`oaZI z;$8A186LoJ#k(;_*Bq*oc_4us&^g~V1c0bjw|vq}GzCylV~ju=L$S;Ck*osLeftPq z{*v!*od3O3{p<4%H4MWS>wta-ZHs^4q24Y2@B$;5_km21F+wC#P(lhuM}18m7f^a1mQ$=Y)?v!!&*?!HQcn`(ld*OWrrPmnh7qV7Fwasy~g-h3e4$Po5-UR z{%D7o8JcT9taLmmUiKyxP0r0QK7*7;X_NBx!fWrNP3qvlC6o20fk{B890oP-a{Ff7 z|17BDexRZvZ`VU!af$4RKz3st4rJfj-c*dy0P#Itl=Q3)c_S3KB9df9t~|L&O+-oa zgZswRlN9-K4C_NAQhhg1F5|vsS9qmL*pE8Q3`*_{UvTWk^N+5rq{3q94A3>!J+$ zKM^{Hy_AM%LORo z@k}8p0DPH?AhQN4LXECX@^!t}KY`C%K2+11xqsN|A!4Hb70D~tzG3VzuqX|l98X)E zvByuHe~+nWaY7hBNOfP4;kWwLJ-+&6c}#J}#t?iIlC@0j6Jf#7j_Fdkqhil8H!XdU zI4T&2HsnUU7^mUqI9$!%m+HobhD!TH!CykS2{Nu(DLXDwv#j8ajsytSELD!J`g@Vw zE;A?_H{*_DV$;B%WIHk4qb;e)mN@pA1U>HnSxavbPBC#vDnIkD6y+Xn2Sx48(j+-t zKkub{3xi2UU8vS?tGQ(+cE&|HMCW?#8@nmI|64X(l*!|ZpZ#{Nm{$N6mwGNc8fNDD zqRtsJ*jp?jT)1zCbZ)CkD?%SI)X19>Q2R^NE7!wRolhdQv)V*U2cMBUF6ggtVubQ< zO|{SSU9s05UORBj%ru1(pv$BiL|R6vu41v{036w%KMXEFlu>++V-V2+~ECV9$6j(Yeg39=BNPa6GfS?ZgWm_MQXw<3$3AI*y@?54Lg0>PE(*^*yjZ0Ee@*4}1BHCUml zh+}T1*YmIn7M#0V4{TWW1>P3OCtlXk*MM|m#Vdk@}DY?ae+OlFlBA# zjApy06x2+xq5-1Zwa=v4MY5I9;hOafzx0wj@j1q-h8}=c@I>+lecmPCIRUb}K?MWL1}{Hrghhi;_|NP{)Q>^zo=WdQJdKaCuJ7t`n}X5GAdBy)H1a)u0lZj$7N1&7WDn*0rTzcozYbF0;TiW8}Skw^3p7kiN%KHtsik6Dg<;z&x|8M~a_=yzYg z5@T|vmPOY+mbvX?v z-Yc`SDKM*z<+D%u31?62A|vNz4pt3bh{Kli_D`hiZV;Mmr?A&Ao{>G1sWi&L(K$Cw zK?JBHCSor*q1UB}spYk(e>^tX`ganY9f;7=!f{9*#a2RsMB=+DZrY~eG+f!P!XvRW zqM=-NRHyWRYHMX+FqoW)I=VvJnd6&*=a)qz5FW$8h|{(;*MK6)01@i?hxf}})1vmb zFs`4&3{mj~BN}C*z6!tTirlaM(n`R083`OG>B*F5GUm4_2bs3ex@=Q&89MC(5~afw zrS2k4ETZt>|I%bS9K%Gg@TA?KAGv?YjI_Y-8x5)fw>A?Z>3-=8TC8^@0Q~n1A5)ed zD=lx7no~GVCO&K5(rp@igdUKK9Ty2=NQy~>7P8LYw2+9}dfQy(=3R~;8`9;Wh+~0D zx4w));}yESO4`ZGiRAvw#5r%T7!o-Owj@bpSLXDL%9H=d7MifjA!!JiHbHVD{46?~#;zc*;uo~$yF`nQ~>&+kp*Ywzv% z5T97PZebKr`Eoc zNBc8slb{ODc<;DdgXXU|8pYOoR+FY1s)kv)0_Y@3diKJYbQ%&w;6afg!2>pTU8!;6 zd|#WNUGHW0sUDy75BOZX8t;7%)6d5F-M&ht@dVN?;zrn2Uh>Oakt$X*Xsaal<4?3d zzu&JF4F{6Bl7bxXK5G}KWY$dZ#93$hX&o!x04iUacWKlISd6Yb*w5`HEPhfK%*mTg ztHfQJ(`Ik!1N`cu)aTP>^F= zo8TFDaG$uofHBBicE*2<5vKpR)=}M+qgl~C78UTi5oiVC959l;V=O$_ndpsa9v^uA zn`PD47#x|~x@(~^Dp@03}Us02a z@zY9#Kmk8du9RFMIlnCE%7dn|;hH@T?N%v-wu?z0$0ERN4*QYr#&4sZ#WW;+v6SeP zZQ?V~S&=JT!;)BCZg+0gWM9PV=Mv}WtlMDR*FCuQ*hkGjhAP;8uT5_IIQGJBU9F+| zh!ihW`z9fMLm}iDJX7JpI@ONcePF>zeWpnxP}dLZp^ipapU{TVgAQ|WRH$FU_6z{C z)e7G)5%cKB+H9X#kporyfmmbq`YqDtH4-uj(dI$4?aSc_T!X*hYHR8%FBZ;`)lG8K<47-wZ#ax0<0Gsbuimd z`#U${laHouV-bu2fIxN9p`0efX}LkNG&6t3QicIaO#={*Y#Lf*;^L<-+$$>qkoSua zU3Ve{s`V?JNM5*TWEX7p``mA%$Hz?lXXLF8;GWCuBtH}a-aG8Nq*Dh5iEkn{ue-T? zpu6sZx`V&pdarZ){}`Jx&o)VC)>Bkr|89=b`FbjDCn{8`mG2@(g%`QwLe?-pShfqs zq`}y1?Ym~Kv4Y`a`(kCRv%)6cpEIzi#zE^v79Vz~TC|;|bJn#=(oC>D5T!X~fG4Cl zDjJtD#%IveA$S8(5r>c`O2?1HhbHzrT(-*gW_w>LUi?WU5wW|)b@L?mFOsTjfZ#;8 zKj5}st#-ug+_#gVWOH|$T+#UG=1O_=C*W0fkqI=EdL|PRp6&B8iJR8Vaij>?VOu5K zcq*wC>EWBA5q1A%aG09Ls22c9(Un@yD!v`Sqn|4oB(mQJj<0ga$j^WMu*kmO z=`KKgL~eF{CwqA?@Qc`SP#IxgOMv2tdBjy1EIgFos^@68tFxClNKYPV9K;2so=d1a{XkbZCJq=M4bMGR@nM{s zO9%+_tv$0wc0!{XL>bKbftHU2xa_Dep^Nw9yk1Dv6=s)mi+Knr8^q z$0$}pJ1wopRc*36M|8MyN{hldAl8g$-1rWaKnsySp0dsc>F=b_4wi$+_QJ!#J4& z7Kj;`w!bw*cPJDWZL2-A>Z;idUkh7)7+X-`N5l}y4Ewa)ft{~-_-D}_-mt|Wx$vtR zW{CNPlhVMH%^$+<3FSf9Qoly!^u$c%5vt3)Q$Wvh)?k0@Z9ViD7>N>Hy)qbxh<2k;Jl7l z0CfIxQ?yuZBI&Tbv+)rZ^PyR%NBv2f^;^q28qOsiySMa}?kj?+2l5Wraz^WRlUO}O zO=$|28YeK~g$)LNe3D5k_x1zxt2$~&Zc4>mM)dDh@aBoegd3Lh)@gqRd5&z|aeUui zI`SSZ*%ma1QvBCuDGKLX9QH(XJ6^o%B14iJ+P-qr#R?|fjhe#&zXIGF&ag`*AV^US zM&0b5Wv|?GZqiPbDg;UZwlFHLJ~>^Dt$ zs8Lt-mtrCz2`;`=xYi=BsE};$uOZ9J{}yrMBAslS+vq7^Rjh1Q{QqVhwWF+GUsA;eP8|+g|qdA(vD?2A= zGX;TjU$wEhyr@APQMFL0W(XOQiM7(MRU6L~)cotZD(QGzUCPqj`qjL#mD~3zg+Up* zHQ$P*LcbXyM3KnMpE4I$1{pr?LTMWV{m1+SnsRv585?t|y`CE~>qa5+B8~N-r}_X^ z6)2_k93n{n&A^9e-8)}}mjC{IVk_P6T^{KUwVUhFg^_~u=XAEqyZxm8Xx+qjYzjmO z%x6iXl~1EnHesP4AVj3>E1M%9cCP-c17lLXT%R|g&VPjM{QkC)#QERR+ef7x_ryZD z*QO=nJtNlR;ojiW(j)S!*@2pQeu?^F)HEFY2I#hr2Tp>hUPOm_3-*6QLomCV(Ov%4 zC4FS9KHa0RYS!vVC`d+Uxm27bkZfMOXE)-`i;c>SE!|0@lP(YbKa;{?YsFUh6O$LD zTz!MB?n;{*pW>~e20w{cm_EGcQTv9rG5)+o0*Z&0oJr&BM1b)FRw~-$|9Y-w78B?c zMdF7tt9!-upJodF1pcjjff-F_iB2!8PK{6l(0Syv7zeli4ouPFf|u|YL1!8Y3Y_1z zUgQhO!C1UNcaMQLcPXgHYG_k zp@XFA8)_s8*M7piw)td$>(#Yta-;qk$~!c57mFN_b&< z4|j@wx%L?-EwhyYAF`fs4#FQoH5+G8SD_$(no_CTf%Nm{Soq+z-Y=*KXl2Rj{Gl{l zop4m*BXy5^>hWhcwf6CifNm5eF z`+mKk+rr35zZ=FaRykYXU04Ja4e`mSqg4A@aISphdGC}kyr+Oe%pDG6# zFQsHf)l{`BXDWg-ix6~dIQ4XwPYg0GYT4G?-wlmPXUs<7fLFz z$QWfvyuJd8nx1W+35HuOsR!S^B)mk|FK)zOj>jjYkBdVGm#P)KmkomXd=fuQ&m|#% z+rx~QL>&!_$!a-A%doRhjnd&au@3&)A}nfPwCdh3NCV!u;TfI_yY*hv^x}Wj4QSeI zAp4s}YtJclS*^G{e~WgFo8^i-1&<#$8y1QJLHVE!Kh+qryIOL-=Yv}VeJ3tZAD0H^ zk7W`!MqY?9a(7RKc<^;!g}4g(a)nkP4-=67#1ree<@6~t0fWY=A$ zZfn6#7Gc$qWvb@gP_A?QszYC*ny*54g_gcx*L|}zqokoxD9B|jG2=og=%8iFroBo^ zk2dNAPcCfoz$Bkehx55$u43>zn5V*xp~AqCB8jQpzkpYjO1`Uo-seF2=0fS=3meYH z+KOPaoLmoibcU= zx3X&Hjt)i|S*aD=N~?=vVY*n_@wX<=L-9HNRMrt7EqyK_UHU2E$-xr>Hh4YlZ}ibd z%NbTq-Lul>G@0$vAnGlT%Q?*|pNTA`j);6$?-_?ccX57!!KWqTs-hNThzlmyPG%Hi zESByF&MVlYqJ1U>RSl4d41p2ZO`l1YhIY&}KmhU_lrj*BfU zO$GgU-EN4*SLi}wO8%lJ+EK5ndcwerQVmw>Qa-^sd#7iYv)^c{K6JtVumWSx(tbxO zl*{mc_gKeaDKWPX=b0Lk-15TJK zzTbg0$W_NcL~_AOU|WNTe2Hh=&UQN1fr>FCPIRkt3W_yT0e*dg>lQy)J=PvNoXNny z<0*v60keF1_hGuIBh(}$>agp^+qc7}#c&_N?WE!p!@Z^CeH49?8CQncA0uf&VRZQYUmU3r~=>V z!BOYbU7o2==dyCiJ2DdLhNR+ay7x)nK+HjODZae~>gyi6twKQ>hOy+eLZZaDQo~Ir*-?_LHkE!vu3>=#uc9*1DLCC`2`rw(J1QEa6AY_0A zIV`OeeVK?NUNzS)r^oEoRL&TpFf0?7ljj|F)`D4$pH=FI?1ywz&8p1+`c%2uSd0VirB6cX@q?%V$j#}rUbo0Y*AbfHTkOm+#0w?ayKz`JdA@s?iPt#h zZ>7C!^8s5nLJ!3Ac7G4x=DWJOHho}l5Cj<6cP&3g=9O&M8zXDW2_JQv%y}d<)m2X8 z*N(dVJU?k(49_EjI;&4EZZ4Qe z%z4n}^sR2V3Sz==oqZK{{6Afq>oY`0jBR$tLd6Yo=SijK8jueRgNDDu%8LE0-Ugh< zyEF!fzUKa5{=Grf=^}TW29DXLj!X`RXmz_S#>w^d$v`o_91b8K ztSjG!pHs308bc}n&{4S@o}G4wFv;XO5(@<8IUA{ zpOi&8Rxj&_(QTxxbj=MFa!(1LO<;{6IEK^%e}0A4MGXX}-9ZCRQUr4hZCn4y{{F-i z1jNILf1wkbOG||Rjo}PfC|5_&LAgf-+0u<{zwvLkSlZ(vWaI)?q!lvfNG%vrXw{ID zWGBTcMGx~m9JgU!oKAs~75}QI4l^UkD*_4ON(T` z=~rsS%zUL}8wxdM=E*-UYaiA07;6Q-DFu3Pt_393o99nk5u;l4ip-Ky_D2&il}f0G zMb%i;4v8y$5jX0=Ag4sH+N(ciwwNM}V>Ako!8-RbVL~Nf9@$$dg5r_8PFd-8ZHKdu?1G!_-O|VTNoRU zN>NID`_))}PT59Oly5;@)J+8GcIWN&+9tqje zVNfI#BwIlt*)C=U;`f!LYgF;HCzkB2Z3^y5;2WnK5ZD}47icC_g+dw4d>{$@=8w7Cv>x0veR|0sGCi|g*zZzHdL z%bA5Bl{P+}j*eHvPd>}}zWROszV4Do_skKqVQ3OZVtTJeyxKj3(Hg;o65ppwm~Dc1 zAhE!3U#@Qb9(PgGyM#j6*yIf8PmDgEdup)Xfc2p*zf0BZAg@|{TLSRgldvls07e^a zXEFiV{+dIrshJf<3;AqHOA%Cb&L){D+}41QG#)I%hvU+G^MNH47PBkNhzdgFV`r)N zY+j$Zd+GMxYYWECX>nO)RrQ`7m69kXmYA3iKWDH0GUJ}BYNv?OIa9GI8u2zz@0iz@ zZ8do-wb?}B zLsrC+)_u8O`|t94SbDK!qazWb1qQ*z=Z-#2?g(F6vIy0A5cDjXU4XiF+8X*)`wSV3 zRPv?CvBmRhQ_F3yJ{~(u23v`YI%)~;$MW)wVe#UT@)VN?6~>bDQ#Mv&I#ntmNxihT z0xKWJPCB!k<>FCnc~#CWKf~iqCV{nMS>zJ)kvG7b8uBHPss-i~Ai?+vy*1;LPp%z^ z2;SYik!#jdz{gv5s^eOx1qc!p6sg*Nh8uuw{r_pg1>RcGcRY}=TNb^ zJog^7d9YUk@a+rFjAHg0{k1JiA;J6i*xD{T)n>sC_N)@;1@DW8QEvEBEXqP6V3Ah}7T*va!04eV0#YZK2X$ zUAsDd`kEE_4|Qqm)wN39j8vLpP90Z`oEl|PJ`fC*M`&VV*jxK27S|`t(F`utgbPc) zApwISHT+}FAHDG%Ucz&^&+B&~*$An*h&6gCLVJ}quE8Fn`L5lB+dr-(?^<*}j7pu6 zC7sHdp|Rb{D?6@HP>j%1^C+}uY6)V@zXSA$Ec#x;_iKI&r+QHoN#w-a6&b!_+I}B- zzOW^UVIi2_#8b7*6(T$8kL;PHRZS%g^Os1B?vC=|qn&22e@%0Ff_;{TMO2q9kf6*^ zQ)Wn2(RCbh;!NJ?r=eOvlC+dmtpBrXSwjkr5=3L9&9&dv(w56O6_Abp4PB6P9jWse z#po4GSX9wwhg@P~lVZ9cSceTyt}V1a3Anbfkbe!Ll$h$C{(KF@aRWM`iVtARWdMVt#2a=6G^;~4 zi@$nee^N4o0Ueb>>fqFMmmchHSbco=#FxzBr@(yl9ZP6!3(s-tRai=f(>+lOjJkaT z8bor#?KacpWEU<6O;fbw!eilUcVjx5Q*ek>rSrSs+2;?( zatDWpRSH&%qrb5HnT)}QxWOFh%wY;3bCxzMUJ1=;^W4b9f!^48PIA&^SXei5(j;eI z@07|<@^pX^T1H0U?HdVS|G_f*6Yi6>2FX}+nHhSnFTdN9o^|fS*)lDppk&)ybXPKg zLh3iSl$ek9I3deG7H;;zfT=Nt&(bQ%!yuX2Xo#eEnZH2%Gc2sFSV^?91AScL*u@_V zqcJ^xoEdYjs~J=3rRENGrv#$>wgPa?u(L|fV}+4UdR+q!>-q>o-Rhr1T5Qf%WU3Q9 zE}G2FBsX4^Co`EjvpJ5Dxk_PiGs!5}+L7Wl)%8x&ERV}CRgTXDN9MUC|B4QjeN=L1 zf;|DlRtk197~vHj#>Q%=4w!-3R1)T&y_t9{qTq-4Dl!W=p9cU?p6Y= zJ-Vya&fgg5Z1E^`O?>ygu^1{o4s0s<0DpQ712P#|SungLe$*VkPBit*Vx>kJ0wBZ} zfJ}}7lFar(k`^yh6D?RUsNVUiM3=HFoVD5IEyE!-T&-@bn4ANoPyI4olMiN$Od1Bq z7l96u*>;MR6I&@)5T1Bqhs->=_F~|s&HDqs&;C_9S*gz^aFdQ+W^Va?lnHF1v&FQg z{60T5yiIoW*^>g!xxLa{#f^~-fk_L|HsC~7v^Y(-jwqhgiE#){H#G~yQ~>EJ(WS@~ zP#H8t>shS%LDK$yFmbs&ewvT$J3!*FIRB_P-VD>XrC%qX5(elS)`l|xI=N4YB1wI_ znml64(F)Z5079l*{xHWocFUFWtS{u+`2Gl8@2OPvu!m>C3)vC)08LDZ&Hs~384_^O zH`(j_&xis&hYSqUV?J$%iziF=aJ1l}pah%&g#Hc0efTFp|wfOouhK_fBu+vU?fF z!{L{5|G^6cG62#36frgE-~}x3*nMzxP5I8NT?fx0sw}`7FMo}+NG9Ijc1cX-a;QUX z)P{H}T0FCb*_YHO<2Y5__i&OdI4~v#HU;&sY*vv7ln~pHQ+(#6_|N~8Qs@+xR$ovJ zJTyaCHM>4jV`q2IEWRkX4)<`A@{$}R$>v(~xyIRKSN_d*3UG|3Y#|#pE-hZkms@lx zR)!an+x9P)IBJYc2E*Z6uP9QRfk@%wb`39m z=rhSjVmj!t;ld(LOC62(8&o7idsPe)Xbx8O$cldO%qcGJiN*TX)s@ry$ldKdY>l-% zU*M}G z#g{4SK1rc#WwnTs$<>h~DiI>6`S&YIx8kkxQ*l-~yRS=yZ`Ot-<&Sq%+myD})oMDN z(*Ua743O?&Iyy-%oen743}++njhqENv6b&bCL|Yi9lZEEJDKErbaLPaWEs!{3#Ghz z0q}$=gL`tcJn(AI9Due{%TD-E_xx(Aq+Fic#UOnkJVpUy;4Ww>G)Fqp&_ zvb;Ra>cw<3t$OF)kktNQCg3YjgnwfRwHO9o8ZWT`#IgUEKuH+HIO30*^5smux}#iM zCqnFbQ?Nt>dO&Jin;&QsBzHNKe5sGSu?WwCZ(Jrjm$fDHw586jRl~r9J9_Y>Zo!~u z6pzhg-j+9hOYM9sJjrl**6KxtwJjxYu)d{8N1`p16e=8it9t0_Ut2cIVmsYa?dR~_ z#npZ2&nB4y3+$>iC-S#0sEMHr|KMpZz1cv;w<&7jI3nxz+=IBiy|a}nRH3(Il94D? zB7c-R?#BWOBO{hnFl0DZWkj!Pis+KtZ@`Z5j!1ADQYw2*4qV7m&MIX#v8g)yLLNH1v} zfv=}tVBIjo;`ssqlgoFRCeGz2j+qsJwEDm^MKMwUZjt$C&Ukx&SP^vaK;~3rP0{uT z{7iKHEp6m3%7r}vMrhd!Gurzd{bao=`?yK1ZP;pokirvBKqyXRHI2I+EB8tn&b<6QaHXU?Ies9XGj0KM888U5J8+5 zJ1!;CU=c1{vUBi%^%TRV)mxF84UX(Gu4Ad!<~c^@0W@J^b>+E^mJCWzyErUyI9pU8 z5%=@8Na}2Fl`MWw74aIYk0$n?raHVKm#-GQe3f?l1P9zRe*}DJ$wwdK>Sd|ot6$~# zfYG(z=M2OZ_T;c;dlQ?@fKEI3^gWBsRah|XFc(3s`GWX z2|AoC`nDCj*k69T*6?UoVJ30ppc;qCd%^aV*or7TUo*$ej9eLgDJ-vuCO1g!Mfi41 zR#Sgi)hiHgao}Xc8|I3~)Wr9X`>u2EFnYchG zUhHuG7Y=p~5_@cmX5KI8HA7c?mi;==t~wrNW8~p zn8Bvd`w-M$%JS(A*36-gL(M+H+tpM!kK>)*uGRWzOyivH^D4cQ7jrXd4GrrFnl`Nr zD{+N9=Y|k6q|>!Y0;>%{0hyXPG&}jU&p@NRr@4CD67I5J7z1Fce{n;QN7qXLTV7{5 z%8nVHh=HA}6{u&UY-dtTONcY4z~q(w)1pG6Du?UIVWHB)AFk%#Nw`>N+2YXAvFW>C zD%$!fl3(N4G6o%c$D~_hH?ni zg0fMx?hRL@m{kZVkVl@md}s%69^uoGLdha!d5N0Y0LQpyybo>*b+lw1i+`rnn-!|_ zX9T4rR`d%DJr>9Bj*jqhWOTWyyT2;**=xGHew>1h-_eo1QzM8u;ed#G5jojAioxWx zBF6#*I6w8*BS#=@x*tHdtmZfI>otv=f#)wpQj`d`zOId6Z9<7Odd6^AMvX#EP5ezI zX7DfadC?G5E8|;NW9)g?A;Ls*-!9R;W9q@^^?S!DF%|WIwLU7VM!cSGh^fWDzd=lBz+f?0w!VyRJYIyl3 zVB*Ka7mUO!?DU!13kK_!=Jft?6~0-1s8A>WbVs1U3Nl-6J+G+uXU%$?g|4$$(PwA0 zH!kf{&Ql+@TN3wpEm+7OK0$CYLy&uH3Q08{Cp}8|RMXvGGu?RflaRxj0*TEi80Zwa zHj8U|kU4$a1{Y61*4p;eU+TD>$%Qc85qJ4z?uT?-&0FfN$Jx|=j7-57afo0@naUzJ z(QiAL2t1gpZPbl)VqvE-#c7W~amW;d!`vk1-xmeDa!B43l|t>1BxxQs2tR* zqmT=+Z3uBTwb7$SF_`PVO1;YBZXE3|OE06X{FT=B6L`+p4U#-W&*{yMj zDvu_p1nXk~9SjB-^*}r$EU<(c#w9>wNf_@ra8!_F1@koF zW3`Y=A^%W!U63>>r{j2eOMl?|2X|+zUx;lC02X7qaW~>yzNT*9~xc znWH`*ze|!{62Hf27QahxDlHl0hHT3L_xFAG%ewbFjw-(a-&DE6Kh}_Wa*6{Fl;%>G zr?ls^n@La65~}feXD5%)W_JA^!lr5O&-vbRxO6>5+t(KZP&h`!7-gnTc9+c;1`>At z>l*g29RA4k@Ng7Dq@wp9P+&fr(R{VUa-Tg$VZej80sSZk08beA`r-N&e|mlB(O2Kd z)WE2LKpIb13mhNc_4)*i4L8@j`8AisD%LIr%1PBaxG8&VuY8r(_-{l(Nt7WvmD%jG z`~AE;aR?M2%E7oEt|Tnm-+{qE1l1vPtCp7TU|Q9{TdlZ&v}OFV#|wP#m$&GEQRcx~ ze=TNo#f`oq{a(>^-_S@(wVUB_B{+YByoRYQgGD!{>-?t3m}VXAqi-e@11$PIac!|( zV52Z)X;ho1qK)l<8Wu*)KC2U?YHo_BOQjRicJ(S8YI3L_&rnkNAxaFE>1wfgjl<-W z2ZRbaT7)DAB2`j*(|_hcMX=%R!~-zA;cLMaM0T1d9E3x4-MXUq6A~mi%N+UW?iRt@ z`>zx9SjPPNDW~1Gc>~bHN-IH2R3|K1=lfXZjBTfAz0~%tn(bl7XoJ>r_)9w~>$CK> z61yqEG=2VY!OebK(SqOTBsHt2diwXdj0X0IK$bP#;~k)dLi|%-)ob6e>RC$Zqz<#+^vWMnQYpR{Wjf+zk zlF}b@y~D_I(_BDJ0WwKtM&#n6LoX|mWR$2LWKm??{ejQY3PN!n?X~g+!Ki%FQU8j2 zD2fu%mQLRVHPiCawnK&LM^lN(c^eufgwjAFV#59`uDh*j^^wL$%R`XtWHm$_3Gk#X znI0XD*t770a;>6EL>Z5roV&1eZ4rK~c4K{9AqL8Kw_9Bw4*oj!Gu^W`Qw9;yYDZwY z5j$MOu0p%``vs!SEToM&pUe`Eoy+m21a5xh!MK0YQddYRdT9y2-9cL%5ZWTh_v&3*nX0R;_ z0fLa3T4g9!ZABscAtnWSax#1{G{yj)IgYulq@RNMcaF5t`FTGuv{kJi4zpiX+TVtc z0YgT}4Cr}F4Ke$n0RVs1m@jP3OL_?XW}rUdt`lHdMNf^v9571;Srb69HQz45AUns> zB$IV61K#}PUF0pqndH{_(Ifom5{`vlb@YGA{Z4ITo!C#WR1{=4Nn1yq%T6>XSKZ$( zVy4cfeK~whaIvZQcQ`I9Xau_i-zuHo?I5MXDsFt%+I_Up_OlWBwq>oD(z0h?T509h z6BhsXOqHHmJA)r2oG(Y}tykUjq4!id)Rzxwdjfez1rYBV=PW226uES=E31@wDq_I_ zT9b0m0tGAmkU?xbgE>8l#*z*c`Vi_I8SJPWf^HMDkW1YqN9rNRe_yp8I${A8`V&%W z$h1{UfwfbVpM^GZ&XXEhnVp%}LXHB+=kH8TuS{2@S?u=MGdbI@zE1hJ60sH_zulrh zSw+wK$Y(Lo(xcbxPjqEwH$!bxM_KTo5q*x#u~}O8m-M~CDlqX;jsUr7cQ6bk-1u*ak`2%O7!DAV*=lgAZI=4X`6}2-GlJD3^c# zP&-j|UBLXuFeD^ggU{l;z>$M^U7##sNN@+w(GjDkysS(!euj^RZ7E0Jx)4npzdpJq z;E9y2kiDHbW+|x3B1pMGiCmluXNFhRyoxBq+p5WaXAr!9d}i?+24tzr#*rRjzV!?F zBCbD#{Mft+b4w&vkap8RpnAcKVB#LA9ENi=y)fI@Gvy6#3P@4uN!X*J7mFPYqYX=W z(A{UaY^MZS0xQw?HXnFJaEXFiZ=CZ;BWKK~C` zC5mMf=%PU3s*iI7Y~a+zmg&AkP4>a>GX_kA`=S!i9V;<(%LU{*BTxh&Uc0l#U9~f> zv?kY$7hQkNZr(*@zwdP6wSqOkKs-XKzC`$TAzm#nqk?@WEWOg7Utb7QP+DOS)tAg@ zo_l(B(r+TeLc3pm<&=gJ^2 zTm};I_G7Y^obiTc_XE|f9{~S*S%e^A%->Jy&%7)MVgjBx`G(#+iEDE{{LZ9-? z;D1PKgeKtoip}YfMAkJmm;OtBqBLSlwb>*vFJ|eELA9q%m3!!NZqo{Sk!}|u0P{>Kw zd`3Hp(&wC3mxiFr+Ejr6Pk^!^-H)NdvqoH9QdUhVb`mHlWa) zei1B98RZGRdR%h$^m>I&7>(5ZzidLr&`aX`z&86C0EI!-VJO!G<2Rw8i6sFYPa>;=IXL}na%%u{*|$0FKrXW zjBf-B*l)u&TG+uOq}AC#aga09?}fsUvg7%Zkv)?BXyH7qy2ESEOm}utF>vBSDeL5Y zho`U|n%wzbu^0{Y|5e+@h2XDL1<4v#+{<7?7q2z@n9Sr_n7ODNQM6YC%oLTyvB)n~ z%Qut1d$d|_$Y-O#;=SPqWczCF@;64?&GK{tFLY1p1knIxX6*fE zAO&qHoU?wde992_ehWL}=uTEFKcw;l8P32d$8z)fKzqA07Njc7Ab%c4CC_SvORx?X zNn=R}w4*MmY9l4Tx0?<_k^nPg(h94Aynj8Ok^KiIVgUnMWNvOQTaVQGookuTG4pYR zRs~%1g~~8%ebdW~_>?Fk&ZGCKx=?I>GJMV^@sOh3K{*ui-I3+ra2oE>=p(@;e=vFy z@W-82Z_{@fJ@WDi{#OE^bjXV#uB5b4s#B{&p-VG;S5^r#~XnA!Bk{L)-~*oY*Z zZc28!`6)lXwMNuoE{D&6j_L;GB`sdwA%^8>B(yd?GyjhjZ7_?3f?5;fGfOEx=OWu; zl-sa`q?lLmQAPSeP-i8u5muWF3&b7MUQj2*vFU5pc^Zek{ITrv zLp}9X zj$IQkek#Zzad_$wf~!c}e#d7B82BHIkPT7fa*ytQti&SAsS-0*mO=~xvEGT)Kxtm8U?}s zn=T;q)x1EHtHY33qC?7-u)U!ZP&c4tEia}?wz1ca6nedS4==4~i?e9GO2{xpU=q0g z+J3kGp6Uu2+Qf9?-&VIPrElz-`Hn-UZlDqh$?{2$BJ$)_7Q2I%kq1#q8r=m7?(L8?v zVdj-LZXav!q1zs3@8RIy>Vtw&`wu3<4SY>Ua@MDKyg#4!`mv%*W8*12fPq08Z?v%| zM$|(|NlE^}MM%Tu+*Itip*9|4T&Om|m@{Rg15&2b-Pd``Z zXb!71jk@#gt|Zq@30WjW#s;d9B;aFXQaZ1?a)j}Xc5Fx* zYH70#uvlsa$m(b}SF2)0&H=DC_zv0JsYJ4_%h0$>)m@Sjd1|hbt^`nL#&f(XJIX$L zjN%ewJs?rfNv7ir2x*@5eENT6%7J?VZS0<3nvF!Gz#|WxrP;bx*Yg!YxBiNiSVuCJ z-b&^9`RQ^P5n?zJTyA>AR6Hg9XIKK4SgRb)hC@NVhd5BJ0UaPR+~d+zz2-#NeY|C;Ho-m=@c zMRE4xSpV;2pBp2Obb}v9ZfaY8 zZ?Ut@QM74*vqlgMUoH3ZDz&KBEPJKcPxYxS>xAJ$wl+@Hw#rLhyax8=&d1?iFC8cx zp>>=MvdOH^R3j8$%*al$ z)s9(tG<%*NYesjKAY$}xZ_8!5fT7M{#Z956u+3w%$MI{eL!&uuX-d$W2ke^SyWGo5fx z*(T#B^X6&Z#P#qw9b>l$(Zb`*P{CdyBgbj*3H&qb{J6l!@{3`_q0X{T19;OHLD;%A zzfsh;h(~KL(`OS^l@6IyN@JQ^4|*`W2lO$RsB?l&mu$L^n9E(Z7_XMSEv&x;rb5&! zl~m7)O55;$R%#DoS7zD4p7v>97=s@RkX3~2$Bn_ep|KJ*{)ySGisfd$Aw_7QP|q7D zWcY+4?Z#q+i2b-aVuo`GcCHvzyP9+Uy^cnH``&}q)~t3zyNY@oR@W)m4wIoUR0?bw zTTSgsc|eiUlKkO($LbQ%3ODG^H6DmMS5Wxz_fSrtyc{RMW5Zye{(J5Lys zZ<7C%FPireeF+Sb>Ik1nOLC65epG)xK6!7}z0VMvjNS8nN9{;NmBB3ijJD}~t4}R= zI~@@?Pbo}~V<*&U3@2>OKn07MYMS2i*W&;6*1T~7f{qC%(JIRh3-_x`#qm`2!UP-) z{BuT?R`-1!IxBMhVuQp*lCocNaV>c;Fv8_wHFp|u;y~(N%Ws*Ub=cbC+UL2-!vcS9 zCXp?}D{O^AZq0WSyw8iYUGsjwl3zvR%2!SVg04>6iXcDb~r?R+5Mo|an!-)4A-+%i`#Ji)l$>iF9E103t>xuST7TT)311%GV$~|7X z$@i$^Z*t)IHaM3|V4p3o6qt~$jbNd2x(r<;aRlp--H#i*%b|M|#1bS&=<_r`a0t%j zw~;2q%#$2b_#l+1+jGV@V6z{up(>iUntBc*$&*hr)o}_NND3r-R7|Wyh;+6i@XoN9 zb#O4)VR<2W_DXo6=Y!%}Q1fqk^Kp&8n<1-Es+F=ie8NPedmg23K}VXz!q!hr>7|+V z--;_C!CF&qK+R#K+`PUe9s1#kVpdU4lgY2_9}xFMn5S;(B)FhQVvEXH)%yGizF~nc zWpY8ld!<>EWZCrRzw6>}2VvU+gcs`P=a)!*%WA-eIB? z@y1zb(JBpjj`qGAD=A=v`IpTGr>aV5U5?1-0`p-6$AP3LBX!l)Hh2c4vX%Uy#`{vlbaWrS`a1;NF?pa~7h|$j9^6|ix@ZNv$FErP z*v}GECVF&c)h(Fl}wjS8GSoCXBs zo@j(?NX!4r9^c=c^=_2|ZAf3GiPsfFN^AtZd_oHlqfp8I_9KOfPKV&39S5c?=o0pD z8FNy~^e^ZD1mR+n-B(o}I5=L_9CUL+>O3}$O?;_x$&&!hTernYmAW6 zeGPW%1ybXJ6`GkHGa;P0ca`M)SIU$rX6d>wp9Kw?29fE^fB$f_c9TxHUC^o zQZdZkU-N}C%P)L=p{_r!zVg(gj@FG{Ggi8BGVkW+r4E*}_gkI>3wXS#HfH10bCuXK*~e&>+33L7?6s@V z(@WAj9(snNhnTc)`8K^u>v9ayznw1WdLpxhmHY`h*W>4-*;R32P1)L1(_qU0oSbD z{6T-b4QJ+=YJ{tNpLyU--t2nNT1;~kIy`|nc!w=_zUDxJ#d*NxYt8X|OoewS_Sqq5 z*5Bp1Q|iF5SH1RU3IDR|ZB_fb7OFZAti_@h-UTvdt7g|NF`6%9(Oa-%eJg)Gb7KJ~ z=M2BuRdg4y2K2y_2Kve-ZYub^VWCPQUbWcRDAD4`;-s!D@K;L3kmB9=} z+R{vb`S^VQg&erZ7X!GtYhFEL&kidE1?;vFc|lMpT5_I9V)Rl~aN%~uMztprdOI;H zP_89n-9suNXX{ZYzT1ebaa!a{r(?OJJ;$!1setsG)s^|LCHQwY_ zQ++(W_K)wK|EP!QwcPnI+(@}&@(rkj#{_)I@WM!=nMnL=qu~o*fA-FM;XyUnz9=D^ zc-6iaAw4g?{bKt2sv_d<^8ol@ClH!3ReKL0DOA~+&lY4kKqLn=cy8Sa)TIP|UVXh1 zaJn2kw*r9{^%9TP97fi#HiF%QAk{D~wW68;3pW6p!i~fOwjX)&r7sb7J>iw9yI2I4 Q+65fe7BF+#nM+as0hAf}kN^Mx literal 0 HcmV?d00001 diff --git a/packages/nfts/data/party-token/static/winner.gif b/packages/nfts/data/party-token/static/winner.gif new file mode 100644 index 0000000000000000000000000000000000000000..90b551d549e27d458affb2af24061f42bdb92736 GIT binary patch literal 1353312 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

NK|rkteiNRdMFBy5#di~wAVUVz zVl5ba2VkM1!dw$h2oke=03(ee8H|q70b;VL!svA~LFWpekysl;#^4ZQ(Vu*&F% z_Jee`wGsO8`&i>{;>C)y;Tj7hn4Qq#O!2dks920dolFtU?tin$c%GXbILc9CF|Up5`Om-=J$tC<^d>x z>(Ec$x$aK%-#vxEA&jCQ3R(`-rnvxEO2HF@HHR?bM3|a;#uLXWJb&eYW5KUf`dv7y z!~%_G4~Qi0yhj)+T&VN|WiD>&3`kK0B@OH*o7YpNWa8chb*yFkHWs)&4M%V~ed!?HS zu{L~{cFIo22&FdkJDq`jxN-vo#)HUi0DzeyUS6#FzZ3`f6XVE<#TKTAjx#qk!CA)| z=02*8@dKGa$fVIoG}Xn|ZyXT0ViSlZ!=@%gno`(dk9CSVsw{XNl3T5g+C4hRs-efY z&%|O6KC{53<-wblUc*DWtBfAm|B&Yt?vPw{%=ravfdP>|6D;09v0nSR5`3kKdt@p4 z?tSWu*QOM1)=*FYaV7<|HWx(iTnyYiRR#M`=ea!O8rqzR+Ho&tv%^*>Q=O?BzbyB74c9{dpzi=gu&Wpaff4HbYnklEVbK%&W;`#IuLBjdongS*P|a@S{0k7*PW*p08v*5Uf4lM0+4rdcK?V{BY`l3haSS?13rlfoLA>ulg6u^`>jjYYqOkU&iuR(Z^rD;eVmS3;2KHhl_F@l2UpmHB6aerpU~wme znsB zeINCG7{kry%HU>B7GJCQpxoM!`->lBqw zDpe3>fNw%X;H6)8m9__ zVHJjv%9I&MG-%R_@rybKIDl@Unam7NqZ%ouoGHf2%dJ5trsyOldn@WRiW#t*BBWDn z5SjAlG$paN+6H^bTL_CEFWlcx-0vpE3{CtG7nYTYxQUmzDeF+m40iTzYC_(i@j_Ob zVVZ+inqwsI?rNHI1GeLWST2@?yHgrl+3@T)Y-c=dmj#Jm7qLE(!@ilrE*lczr8qUc zI2EhubsCaYFF19fBNe;p;L2Lb&u3_MRKJwe;BJQeKlj1Xu|STjNJK;2gznBCx%*T_5GB%9L= zFLUlr*mw_voSzGYlLwbi_=AS1tCG8VX1wQsC|fqXZ-WT#40aGLuXh7>7)=%%m4q@N zp9CkR$@tUfKteb+K~WbdWgt5O$=@^l^D3`93ekTM%v)tKyAj?kpFsJQiLpYhb@s-_BLvIV}9^TPRIkkgr;}FRwnFTR8eO zBEPD<8ZiLn7BBo66dF|&y%$prYD*lLeti3jRUfV+$N0fr`{Qo0{EHf@CzFwPJwksC zN(G~#+>)N|62NK+BS1}0u2#QFO}A4GIb$g#9d6A}ndpUxuuA$#fL{L z7rmwIXG>HcQ#5|rxW1jkP zo%Z#O4iTQo!S>eq_OZkE@u;+^#*H|l&fLn-u>ihB($q7S&S@DwzlpG=M(L=(n={68 z>VuA*TTy%v=-oRuyfe6Zt8{uv*B$$vn+3F8+bj_q30rl!TbmhMCxd$Di(8a@$yd7T zSKqcMLE1Mz`9^>0cWdj>v+6uN@H1udKjG^?%IP2J>Z8K^FRT&sm!7XK{}0xv*RMz# z|9@I_FexG>Yx4)gQ5h^ZT9`We2cI33S6 zM(azaQz!v6pkGX-f(4>th-{&(WdlXuGq_D*lX4fz)GA;H#~Le^YYh6sy-%Pw*)^gO zqntJV^VCIH&sT+W&D&^pM%pUMXx`aMB{iI+Rih)olz0DzMDNAPq|zIRKw4eF>0mq- zgDK-8i_E+~N-q|MG6I9%>5&b2CdH%Gps@^=&XIq&d&pZV=)rF&7iRx_!H$u~`|;_Ja!i%^=6KobeD!$i&*7>Gk z%0(;D5vc9QKAu%AKl3bbg|;U45ioC!iWu}D9^UMFlo2MD1%7;kPw4}_o?mMrBP}rY z$*b!89l)Y(L@v<%O~M?MH6nuaEB8GRZG?n0S#gwdIJr)N_8ZRa2t!6>oiZEPv3|U$ zr^8W+4=h_Z#eBCxG|mYXbw5J;UKWj;#d|wWS_(o9o%|U?&bFv#{Fy3J40&)~R5$Nz zoYswSc3H7Z;Hy`+E8$~bHw{p2Ua`Ujcg_)BGm<{<1fuuL@`Vs%m@EB3lIJuGq3k+R zkK&n<-HnUs-~=Y|M04$>M=ZYV2M1KQocL*fv>s$=A53waA*&&?KzQ#<(b_~lcw7ul z=)GOGMl`lxK+b-|T(+De^4xsGj`6xSMA-Jc>84}=-Oh99^W9TDz_l{_LmN3$W~oT6 ze8NR_jOtssh+WU!v35R8ClyF)ZxbB?J}=!KUxU*?T;gMfiLpp ze%A^5;FG8B#869=-sd3>NMOh;S)u+$%fOBNY;Y^rp+EM90TeZ)Fu*4ukU|y~mTg1` zDLFrglx|nutW+3x?>dP49u^5~HPYuE$QZ&zHioSJEJWId984CMPNE_jV-TCCXj&G+ zO*0#8kXi{Rl@X3sW+6tGFA|}1Pr}!e%8?&=Bcj@o-!RoONbkcGDerE~yJsQJx@I5c zCL2!h!YLt89v3CGF-kP9F~Uv29E*Xi*u4j+^Hu4S%bc0vF!@R#H|8IJUl2xiEF?9c zqa>5&HB7-%Hm1-PK~+FkM9y?7rDltgsNY6RP3taARpgMg^NXDRuuw+xaSqUZV8Uqk zGL|zCpVDAm^ivmG`Ubj??(A8d(m#a6G&>#vxHrJ?_*^p@XGOKLK*7OrAV=wknzmmk z!KDqA5LxJ$A+99BbAAJsw~tSNJIci5o{f|9`Y6cQc`@VM=bFx5Nyt5$IOcyFRs1uD zO7-pM3HL*qqAUG<&R3gI3sF)w?6@P$lCbaCf}&+BP7nkq{Sj>{%t|6fq4ayQr_$%M zO7b17#ZGCzq%F0Skg`-t=q?jv4BHrB4+BfDTTX%Jd2@vrmSuvC6!N(=iz~T_%&BNi=oEg|Rs|)c$(t(wu#ADd^LlmJQ$Bg3e8E z2j0={fq1HCcDIGGqlG=CNNF2yv~>)Eqd(chC>~L*)*Hm#$g*fw91{EIR8diKBTmNC z@&$=f+Amzc0Rk&Q1D?eM7$%szhYZWbkX1g40y<0S{`mg)4~(?|BoEYYxTCND@Zar^ z500MLf@?q24P7@AH%i>A-+@BboB(Z&UL&JxX(jkwB!!k9(yqT@#+AGG2Pyq*$-hJG zL3=1USR|R8q>%17d>e|0TL5v4Ap?g$=e^>`G->~xi@F zoYHJCaJ+y=f%NrB5q?Jo)~(|<)x+`IbVr=Z|CvazWNe-vF~+1ZI`BItUsjs&qH0YW z1hb@pD^FN!u-m^0!GF-J!<&vkV5YbY5E9HH8qbLQ2C{GT1}ZJZT4?oTKC+gI$yq8F zaF0!BG`eXa#H)+YFXbRUl*)Kp${WisqwPINc-e3oOna;}v9lk+pB96h(L=~%lZ8U&psCRp&7O3&mj9AUy|#v=hg$p zWanL{9e`_a`}PX5GmYf>8IZXRWe3%P+I3yZinsk5?52c__&YelXa}3)d5HYOE(i*= zj|fI`m%2SFh--qM=Q4DU)7fIL9sv=t+7&3<+Qw$~<5BW5gid#&IQheSSFmk{JDw@c zADawFSmTt<<=K*!StXr`*0m|8Af^;6yypY4!yCgWTNsTFC*CzRs8lQq_w7e05 z=RR46di-P;Ur)FC{HKT8&VM6$?c(Aj&soSHS2O|AyUq^JU3Pp|c6J>ih5pXfiUb#7 znAAtVC~C%XI`1-EsZO-(o+o(tFG?i5&yu=chnxQwtIq!xYozdTn*j!$D0IIrPk%hN zgWs=XxS7rU|u`_h!w94pw23OU0*J4U5;|^(H@WLRg@*4R8X5>L4VhyKb;pvz=tBl55u%b1$w~s; z9OR(=!@epJXJ7%cRy1>4KW@+p>{)y?-P zoKcj>`=Wk9PzGrrTijB(V8C#~M*X z<;A3vP`^u3Lt)3laK-Ao(H8B|Hs;gRqQteLgm{k7pp?-X^wL({(zYwb;kd_rdUi;q zXz@k?_ewt>O^iTQWShGYNtMn%*3?}9YbN&g;tqBY; zbo`o$f~)buqbN8cwj&hWxN|DFEJ=odB+NTTRVhX#7+aMxM75VBDQr}&Q6?fFt8M}d zQ-LFIUa}l1YiwWuR4=O_X^QPHHyKh6iTPwF4F%6I4%Zh}-!LFye~L91D@`qjJ!z^Q zs;Yr8hqtn$$G0?#eh#lw_GB0i*L@DN`n348v>YzBl-1PiG?an@+cZaR%{1=pZ(PM9 z(J=ezh4txmX-o}e>9y1`EOF^WW*HsSs9mkxc?l?U`#i(nc*pvAMqYTwM|mN3dB@!O zCZzaAfAP%*@J(|4XLYmYn6;sdf(&jDL|qVkA~pC%CiLS#P@X9pazGG0Q1GNo@SkS( z%_;g-SvH!J;4@baKt=FvG#j^8l>b0fvOxs=M~HPmw9QFWP$iXBC|B$tSCLE zKK)I8RAB-0Si#TT0WOrUgQgX}`0Ou~I(7g|v^tL)!{!eTVJ zp2VU_6HOg%8ATd7rShUF*5ctr+4;a?qfe`jRv*JZz3EFq1UhoUR)uR;p0SflJLgZ@+vZ-PmciG26NpmZGaCli5O&Nh$ zSthKDxv9#p?`mpnI5tVD)#|7v;mZ1|s#eaQCT%rSsc=$NmAY~@qeC^Jq>74`3Sf{L zS5bN6Sh?|onu1uRu5)F>Yen@~0_Sn%5O;;)pxQW2WgCu0z#~$Xn3l(P?Gp5S$>XY+ zL#_QY&E!Fi{6VeQAoZHTYUhyZ0(8wg9BpBbm`B)}vv7^qwd(h?;F~ecduhPG!B0v` zZwjdY3(N7aQTL`u`wm?XvAw1mqxKqI_x3^e-dUGF?k{SF-cF+)CT<;0#b5mKzY`CC z1ykxswQDKh>d=LZ3BVL4KgCVRf(?0tjrbo8IL3{>71wjSm~a`^)4CX=H`ViCkoQRg zB(01^ni|ADvqpeMPM!u8IAi&BoYzAAE%TzTB+jgt9 zO%K_evD@Uyw5OT1PX@PVMYPqew=0YzS9#k0ZEw$QN4pfqAd|4CgmU=4Y&W}Zj}hX4 zrQQkPuwSu4#{@t9CXqnHGj|}6=){reTDIz1jp*8cLp{{C->K-_Yj>cYcgVkS5OwWl zN$F1HLKnl-%g^oB1@xS=^?=(QLE2T&yaiK@J$%RAhRL}un0OJ`ylCOi z~-uC^`!~K6!Tm?X` z9K`O-m2RB8f#Mf^Qt_6kBuLo}C_G1R9jU z3o`Q>vdA2=>=?4%7_tQo{l*)1;2n0-8Fuj+cFP?0=ot3e81?}T|G^va=N$>u8430p z3C$b{2X~A_Zj3~OMq=?s<9SCDbw-oDMpH9K(>q2pH%7BTqq%rv`MhI=I%CCNW2Kp6 zn#_d8b&5$Y6leK4TOwvRH2y(S}enPdcvObm6~e=|;KbxC6o( zdvgHqGibV)Cqc}DvG^oo-J$Mxpscy1m)Tyh8u(~5fv?Ui7vAlT~ogBFtPx=Tu??> zoS6V9bW#YPh{3|ddhaeGmbn_e$3&|yy-6vP+Nx(a>Z4u2TTz!)RR#_6u*+9)Qctesu2p7gEJtP+`*wH2EqH{!Q7XA$eRGHSo9 zu=}C4UUn>JPRw&Ack3=fIB)2sZFD@6`1YAXZ=@8?M*aY7>N0MIakWOcZBl@fH|<|o zmvoU=sy5~4llQ&zw{5oE(zd<R6-v^)K>Hg~80j>p{cf+PI_}i8ZvrhJb|Z?j8h{tMd1>!~0bj?X5%OQU1FxM*!BN_x(d% zzeE3mL!GW8QvyNrk0ZnCBea7gv*@G!fMaXD5G<0s{5ZrPuen6B$o^n@*ubv5ABZR; zaVHUa`62wsv3e)y;jW=Rd2r#laXz_ZnWwO8B2%-c!2~ECtVpHM=t35y|Ri0n8>r9NWi(TJ6{64hI*{wf7DbLS)?=S?4HgVpE5{O3J-=Y2ls zf3J}1uFl8!FDD43EYFI@4x~a9OMLNBr_oB(EsJ;PuL2QJ59N!G`Aag;uDzfY)JI1qM8PF2Pv@2=WN>1Y$4J2`4SxkvGEDJDl%RqcKFxC1OR`FXXT+7^ zRZ?t3GUUm>ga#xd?>HLoy2ifqZ>tH$7|8M7vy+pG$5eX7-!nAc3vUOCB0ZGhR7ut# zOWWb9Bc*EA+-c`jsSv6fY~O2u?@f@Z%>F&7<~*L$Px-O+Jkivox%}nH({lM&vnP$? z(M@<2et-J8r2h-?ojd0(m5V4m-nqU}hWjO6R1UMam z*%#7>7eXF&s)|(>y;oYe*PlGE)aNf%zOP@BUh_I%kHu;UtZMV^-kQkY+NSF+oB_D( zL_*pcS`n~tA=>{8kh+{ysRU352~86IfJmA^n~R`nUs7T)Qlo&3?tJ z9grfxO@h8&eXg{>vIsOC{0i_9aTyr^;n=n?8cDoh)XHbUW#7)^1HF(pbxmHp0+9P3M_i zT|whcMH;21R$HQ;i^pqKw)-EKIFHntW#(148x@T|4Thw?$3$6T{4;C}Z}o9Lw;_-- zLrxm)b3UETk+_VUb$qO0sbAb`Nfg$Ebuk`F19OO6=v+9S%oZt>=xx3_U#vEO*N!f* z8!YCEffdnI9h~B;LtjaUt1?~hwr4aYocP}LozLxSB^IVOp6+&bLQ=@|KQ3Q3+824C z2sS&PpQZ2{;V6=oxla%BBV}=5h=aJl{z$fgwDD2ix|5Av*Lm5rS=V(th(pi) zxTsmr^WPwczW38%v%W9*JEwsk6h(_c0FpSTVGyQSi(v?1FsD%%WpRs91j7)gaTLc< z%YUuxCUFuJttJTy;#{Ul>SnE`Df+=&W@+Zdt!5c^LtN%ruK(Gf`u^ay$P1xpvnYrW z=l)fcV%GLQn0v?PN}~qevZIbWwr$(SiEVUj8=Z90v5k&x+qUhbW7|CUyzkWgI#W|K z_tyO*p4!jewSH^;*Q{<`R#My!w63Tb=C!G6Icm45>G{t0KVNwz`Tmn$>ac6s3E{JE zJ1*|9@3mU)na*TIozuJqp5rT!*0NyrT zC~ILJqC-`|NWdM11TAm>e^8?CR;?jA z^E#h<+ybl#>|vjx+eq`pRJ;|>;Z|Zg>^tskX-F`nLSYnn_dznOhtZLO7iGEMlLgdI zt5W3iueKbfr3Ys8V_X?xjba3w#JfU%%CX+A`H1(ViY&3|lV+Uv z>36`0VwU*yersN|zk`dE9Owt+5xH}Q`-_LHYvri(MqY~}nv9z?$-h_m%Mrt&L_ zDt>LTS!S9#YQwKSdXvgm|l+3eB}yjRtO;w}?wxP^1*EAyhhGGX}RZjfL{`@=6st%Yt-` zwK#TGMXVc3#S=}f!Btj~eH-i6HVM5;RknbH^=;hq7T~Cztzw7X`kgeJyLt#Q(cS!{piii zAwo^NKm54|BdrUaKG1jlPxrYY>K?@;Y6AT+qLj0rKNFLznC~>Ok zC=JNBt$$%6F{L%iA;}V>>3e|rj6GZcS5Ern80I-khHVNHE}W(v&bjGC?Xsi+Qj#CB zmEaKA*x#eCl`}?@(z9+gQ8Z`LDTmcQ@F=PjDM#C2wg#a zD+_0e_4(h;Y}trYR!pa!gtwMwLbNPHv5tXcJ8{7x1`Ls=yeo^P?i1x5CubhLI?G+f zZg6&0IC>R-mx$9JYmD^I<+gd3+U?!y5y5TEA>c^{{hsQ)F3+u)bXTW_-K(2GZ3#_2 zz=_fb*XV1%7Eolx_J)+o4<*(+s3cA(J5G4M%RZp_ed{*cqict(9H@4xyR~B4BJzcp z@O$IEwT6|uXKDAEraxo%!JWHL48tktS$7u$ntK@f2X$D%`#+e+)(#OrrvNHA^r zd4W6#8QBRXXaZ-dHSO~>RgdW&T_-9+yi18!E;AIoCwignbMNKu6+j6xk0@v?a>&Tg z&19TdrIOs}vL6=xr9x!Q9n?3~9yGTCq~&1zs$T^^`svcc!~Addp0_mB@X<@>P%kCx?eW| z2_6C`%AO=v2Q@oCC9M$?_B(QPu6t#^?!-1fqHp-$veUjw%Kg1Bm{i|Mt-kJii2T-~ zfNx#ng7*v8zfOt7KO$PbYWI3RU&VU97Dt5c{s`SC3Xv%H06Thqj`p;I^l&c_3R>|Y zo?&5WVG-PrtB!)6xuLAc?5lY3-`Qbc22nzLqv6DZ;n~A`)_Z>}Vj%nW!jOx=6^5Y= z_Fn0VNZs`M;=w?p_fdt5gr|w1PxgYiqgTg1Len@Rb`g?BkspJ7n45jbL4B~0qVSa> z7_R-2s4ykJ5z5jc#&Ths(t^BB;1gT~c-KVR!(f@%qkzntku3BBY)NA5fPuc7ex^z| zt`Asly(k{je1@_CMtTJ1AQ%?%0l|x|x%&v=AUIC)L1X4YZn;6y4>(D^0g=f8QQrZv zq_}-LSeQiwrlgufVW_KIXtPnozVTKmW%1T;LmU4P-l>Nkg@+EPL)6*BH8PP@(Im9l zhjb=mbn)Bt3dQgLNt9s^&8A5lf0IT`5020MAQqCv0 z*W!)Jq+A9^V8}<^g1G%%rK*KT0@S4Z$YB+&(SS02iTvs8@^#XDebQ^Q(h=xMF%OZk zgQzMM^&0KcN@LO-R(u7-Xo(18%PN3aQ$U<6Af_?N->UofDd6`jAbS(w4?AA%h#`iX zqX9-zXj^H-D&s3FqpK}bYCF!rBUAp6T_)GLv^!q?FkS;WQHwrNM?O){KG7gP(Wo}j zWIEC8I?)m|(V8^TRyfh#IMFdU(YZL$buiKWFwp}!*^55eM?TrlJ~<#hIjA-{WI8$Q zIyn+FIhr&%RyaA{I5{ymIk`AFbuc;oFgXJ`HH$tqM-D0zPc4W~Evii=gpYez$$NNB zxrfWUr%$<+O)ZiC-Hy-N$paOlvMVaEfLo0O+opWJC<*OwM$-w73j4JRCpamW=tO6QXxIEX*eJOHaKsRAIeVF@cj$aRMv9L~sn3uKp7Dwj z+Ia}HlJ4wzKl*1-jfub5xxCwEzGbC?eRBG+%zj+JQSs*c8qEql&;`urQOpmidCkHh zCc~>M!6z#bd*>s{!|{NV-RNPV1Q#&yHgg%1`LN7kRHb54D7yvBnX**!$rMVox5$;x z3AY#GH#HM}!BMn?pMi?+ zaDnG>!Ht!QXDG~Leu3{&)%h>Rg)jAeV@dEEm6QaJbTT!-j#{RPI_!)}u82CcT&-w= z+O4cKGD0onO--I-NmfEVdXFr|nda}hbc^>=Vn2;G#+d7FS#1AOTKSTedYK+aivA;w z;U~0KR@qOtrP@HcdS3RF@$$xqih5LypI#MpI&?{kOO|%awpr?KZ5mAp6%Jb(=0nR) zRT{0Um4j#W{bzJj_4Gq`l^)5dZe5i_Z}gtQ^j>Z&*i{%lhbxoiE1q_m0Tf*ufz|)k z8P2R334XPnpfc`>HioKe0T26Oj%ceD3RVyPR!3Gb9*b&)>1)N>X;EyU$2Vyqy|1F6 zFh7-={0db$1=D8yk~B7zFcf+(C#CS$pM5rSA!Qwt&yIaA&izMO6TxB= z&T0&h^u%BYll=Q-su+tQ$ zu^)ZY6tfaT_Pd#!!Xe4QfksR}mamywv4}dQna-1`?o*%Aw5fjfp+qJ;pX;Dp(4c&h zIFaOlF{b#K@R78*xVbx;Z07*y;-J8RIL+;#wfm9e;9#e;xt+n0eer-px40#yh1Jy{ z?vptqq=g$NgZq)W2WGoTl!Wzzq%MLK^>=vR;b?o)VFz@{+fhmOwP9b4Ve5lq3v?+7 zz{&6BS zqNKuIt$r$7rDKk!Y)g3uSp^|T2WLuWH^=!8TIE)s8njt?PFhi~o!XSmCpV&IE^1Kz z0hHRKmlbacm5(KKjwMc7cT`ztL|NB-*C!+y`LWz2G{qS3i=6#`!rAi0{} zeo!6C^lSA7GuG@C%cL6_S=+zvK_QSnm7;arD881ftxj*)yCRzw;_cqRL)5QG&woFA zLcqBE^wRzrCE@Vo`H2CY|T40o>H(1Q(w|voUy}Fz%0$CmGqj8&U7pjd$2*=+Z z&eLON%T!mWvU#_l{va{=;lBzW4o36&GxB@ipU$Q$Vx{SO%ar+VmjOG-YqNWK;n)m{ zU=8?R{f~foJHOOyrl0mFaukJJKjl6^&kQ-xXG3|x*w&>RVT4~0dm-ovFL~j$d0NI{)J~`q{I`zr%KX!7VFfW_ zw_%yFJXfpx(GuUi4q_#LgpNz&A3@WsUIe5+n1%LW@v{W3h6il zFw-B>aEkx_tUIOrYurphmFC(Hn3wKbD~KUJak>lTI~x^U7fz)ZqT&Tvvm$bXaNBY7 z6HuBg3j%)VoaBL1SktKe`bxJd%>3G?`IE~^dsgsQhBu`wIUgvaR2n1Nep;9{e5T|B zjC&q2s0ep1SLl3$qo?Wz6)B>3AKzwbpxjU|Y9}}sE9>SIDk=jeyZ7lE1Fh)j#8w1- zZ0qUV=J$kRs5{V`6v}i-I<8dKQ##FNeP%m0D1&Rd<<=^edoHi&ZnPm+GR`F=oj@JA zQ%4a)(PZuyjOb0m1Li?gMe({J<`~`CVH8DrnV};P&M|s_09C#!)#dju+iHFL&&_uyBW<&pr=eibmGZvSE0f zQ}Y*4UsZO|e^UMlo#nQ!>NDl8y^(#V$O7dxEXN|M1Jp}l` z{C`I#n=ksicL}dK?0gF41TcN69ccQ037xutEXx){4uVhX8#7!GtpSQW0JQm9+Ld57Hj6U*2*IdJ8)k67jWjBR z#RrN=@MN<@x|@;_?odkz{*8}8Q`;xl;!YL-&A%+=Oo=zrMgrwx3AbnGDA=^&l;x!3 zbeuyULByOUido{{C}_&I*)hfDTcZ4r?=tq+BahBy=2 zU!Z+hCk3lE&7?l&LaGAT5v$ATq`~|h38B?UN@Ho9s!|wYjAIbjkq8p;7ApZc{U0(F z@ya60dqt;{Bd!6SX=loV%u~H%4!0xVwB7JM(e?*4_YgqAB_BNNL5Yg5f+Eht87=po zyi@?qdDfSa-30Nmgda*~CUCnUA9jgKvA#?>%vmk}yF{tzGc1aOms8eELN5K+Z20a! z8j?UyXtsmZkj@t>N=5-lIq1je^kp>yE({3;kGHUFNlPjbf^s=4>jk!5(ERJsib5N8 zsRnteRQ+&9rQuC2%ax;8qKH z;M;wvVNwC%0}P_9L;lLo_~IIW#0xoSA9Mw5%({qAfJywLRu8yFZBWyN5n5zLwrxsH zcJc)gH6GraadRU-kDUb>{Q5Z1Af+*~Dcn{QVr@o&v$18WQi4{i4ysI=(C0lAuiq*T zR{uIkkfhq0FlF#BIVBh2L9cE1NMdi+ExI9Osmh; z_NIn#6ZBnRW1usFaJDGA?-`B*@OY=7$3i1irZgogPW1>6QX}MvKfMgY%(xu%CR&e$ z!}Nr8G4dDxaEK0&FLOg-iRL2gAjt@--$Uv7S^8!^25<%wgHxzp<~PS7$7H@B60;D@ zHsssJ!Tai28|mR0;g^6DEMWHu86OAKIj?vc8X$%ZVIgZ&d(xG$LHH{3nBJkS*WqX^ zXGG6}O%-Rxiqka%Wy>Oqo_E&W&oytw_k>Y(5T)xgg!M}kVbx1iu=cmqPuX981AK4P z!Mb5f1?a3*GH{p5zrI&g(Z^}RAC}OhKN{LZcj&H=ELBVsi1_Lg{VWh)4IprmJJkiB`bM3$x3RME!}>|hxmRDNQGSqucj*)puJ$h=~&A8 z;a=s_MW(|vw!snTo;;alL6`AlHcR@h*3wmsa=1$dfsf#KE>0_zc%`=(k0S9pSi}Y>UWU+OcM&K}y)qBDf`>rO{_d*rI=wOlX zX@})A)~#l5>d*GGr@p}dOLf-&ew>Y!`wzR;A5PCd+-ZM!TmOr*z5Efz4ie=K64wgi zU-hON@L?|wx)k@7E~S>U3{v3^R!hT`z75K0VNyOp)ocxBmLZib#D#zT*XRuVh)=N4a7!m5y9&r!3{mZ zGaAKf0QQBMNaMz);l;P&CTihnoP@Oogd1xTtk)52eW?(^`5Mj@YyCa6&^ZHH_HHIBI zQHsiXM>^b!x=>0Q{Rexcm6U3pl%_wLWiOhopOk<#hFOGM=?+N+9Peb6ynQZ4W{+GB zHTL?2{Ax7jNjjENgu*P4%8HfpW0mqti^|%G%Hl589W~A+Fb=9L4q_}q$r9PnISw-2 zry-xVX`Z&o*{4^UuE3eDrazu7kv6TLwopZfG(C7TAfD)yHdxx5yp6VbFTtk82TMDF z4cHdnP=X7u%y@l|G#^M$gM&6?%(zCH#0N+MrErc}lbDs0gm98hz!RHBlcac(IRT8@ zfegEWNvHLUP-x5?I7~mwm=!{q&8(PBPMNG|QY-+Numvd&u$WG#DGK4QdsU(HePN+= zbntOuC^%tg8FbhP!Ow==mqcNRMj>QtVIW)H&)eJwv^?m=T%o=^$hSNS5^+8?aoPj% zJpel8x&gJ0m?9)5gN!(vskl&(I2pURoM{0It|*{Tj8Uh6##`K!rGSsOkPA*C_(9rV zP0B_b5F{=cav&A6*T9n8x9o<-{2PdrvSA0uathQdH30Gu9TO_Ab zWMf^7OCnz(E-O#}e(hylQ`3Z3|Zu_|MAau)3qK>JS&D z!%VwOUAGEDueJ&8eOr{7EmqEEYXsiwzF7Y47Em!-Sj#tx~wkJ zdkuDlHhiQGzD*tSyUuikAx?n7-jd+~2!czle`~6LI5d13LZb%qq0{miLMR(n-wOkKtpRDDb^C`~mcOz@k1 zbR$g+-i?2Dq!4m8>+3d|YfNjP>YR7$sY@bbV4K&C^57H7Tup zQ|f4LTcSBF|6*EYa$02{SpYaKexF+gR#;@ESjOR*M^Rd;G`IfQXbrBgjEA>OtY}S^ zZA~(7r4DG#l(mfNuqb=C+BUbjG`G7Rwh?NyTRuZRd$Oz4u-glh1Qn}EqxR7|b zzP@_X1>^vPyF&Ndc%<@|q5Z)^>Ci>t>r7+AAMg#$h_V>KXYtAp7>v#v4C@;V*d0uU@fEO5 zSFs(WV;MqltKiuT>j}j#$MUYU7$UwMD#IG42^g>o7`DzEw&)u+-5vf3Hj;T9WNaHh z5IWS`>gA~y{J#}v8`PT|_MIHfoE-0*oZOt8{+OJ_pPJ{NTGX3b_MKYIoLY|xl#Zvi z^2G6(EQ8;jvPd)Dog9D?oi2u)cKe7ty9hl-7=*r^21lD2;hs*ooeDDZ#t{iir$+v& z3=>0{jh>tF!VUu>Bth#Bf9slcZ(-=_L%5xV8llaAN0~#@pF8DYO-!46=R>;*oJ0Sd zV?~)K5SX_@n4_wiqn#tzN^ET3oxjMBm;j<6G088?IW0_+EHESD@ynx4YY}3w6Sbo( z-molQ+M-BCYt?BjHhV70BjU+MFOIS-DSx7Fv}RevF9GyX^yFh01EcljQ4F`D52d47 zz+#nIM*{Me&qkNMcbCswt8WrxZMKH2Nmd-UFukK!I5JZ|rQ^>b;(jy41x90&vBVp( zuEJ`s!oMO#ZNDCMoXs;o77A`@CA5Cc|pY>~6F61f+qrCHW-wb$cl*6B~z z7_DYHRESG|C19DX*Ke&C>TeLCps(BslQmH4%xxgb%Yi?R!ER1@ZVps!LXm7@ zU2Z~xZQ-&FL#d=H*A1!RGuWkXc>+(%ede|_^0u@mx9(9>wh`9}n~_%qws*R=0!g;( zUW2^DlZaH2(6_K3v*@3*cEaj*ltWp+ww8Ze?J)n@8I(u+mhA?f{g18g-{<8&VLtY< zHIApj+G#`%jB0i)!R6eNT|JXs-oV|I<3@DCJ$%7E!XJiI1{nm5Ya>g0PWO9sPH=kf zLPw`Kvul`~ggiZE`;%pu0#^b&jB_G>m|`*e-X;e+S?BurcaQ?shJC5#2=gl&>f@;e^hLr$wQt?l%Meqo?#!H(O93eMx0|5 zp5v;V1K!T-v(FnrEZbGV2;s%p_W8sYilZ9zB{RMYIh?7Ek!WzLGySEC_~o*n#OhVy z`m`b0+$BECKWlx-R>0=)HNT=^#$YAQ}?A}@D*O(^`*kq_1ASn zNhxf68H7`5ogEsCVyVEyjm+*%inT0q&&@FVZMe>DiuWyK$}NJ?3{uSv5mKq5$gQ{a zEqPBFRS)u5MES(J(6n%OtEI}?~{>Yl^c(BvG{eDqonF546bt^I11_7IfYxNHZr;jm3S@HAw zI%S&q9>c|%4+)^p=P(n}Xw4@*UemN8%PbS}nuGpEPvhbB=N!`4g3uR-?f`i64THO^ z9iE_mm+_O3@i!7Uj1qs~k2Y10(-|UVC<4JCY~?-i2n-2*beM@@$gOxstxodgCkjrTJ{B zQn$ko@m=X!JH`)82opb*d27G}Bh@U^{nDg2{t&Y|68pMm$QRGyXmk1Abif@gcF0zT zO+l&$cs8f{6ul;70gS*fIXX2Y(7JI3UPW|jF|(2q7|6+QaN2Km{(`_#*nHtSm`q~x zFhKTxC|z*5zWU^Qx!D_ur10wI}( zTHwVO?$3gbUJw>Os1zMVHe7sAkAvC=nP=@!bg!IF2SE4$Ju4SFJ1qAI+&Zpy(^B6LKP(q z9ONN;V^bofB3)F9n|76+lOVEIQ%WKgNCMpkx*Bukh?2t=09o`DYN3(@jk5~M>gtPz z-P2=bI;Kut z=o`10MTr|3gX)~T&J&=ZyDONg$5!*Y8y1b?93)qX_e58Vj@{N2)|zMJ)=H^g0pjX* z;H`kxPR}~Q%g*u9C%aLoP@&6S5_Zb!9tDYkhDikT6ZikYI9sR7j1aVd>zou-m+OL} zl)!&i#cnHxp#tt}7A0No8xA7^9$OyAT^>9B(1M=3paHSxeyo(B*I}wfx7Tq_N!PAE z8==NqcqJ0XyLcJZ3)3amC*jZ70SkA9JAk17!GnZ>(81HlaW=n_EK2!DjBIw#SJ<-< z5AcTm7tzaai5}o7?e8PJ+^-ZjVQ-4s-ya*wRNJ?Riv0OMHcZkXX)Hw$s^x%xFgkx$ zvvP|dyDOOy9pu6YNcW>hC>mhwLeicn$D$1tzz4DBbxdOn;4I&S>;~liI35ziWgQ6N zRx|2!ryd|BLrE?%v|O6^S^Flf<7RyTVDTU>NSrDe#H|89ITGQc)<#RtHd$rnvx;C zN~cK7$A$T(QxK#}H*1}t+`LHPz;H-L_u3d|gK#z;k@4s&rt=i_5+i>RQiWX9OC1^OxCigyg z)+$*#ti>`Mq#WvF5}8ZkYF`5=>vxi@V#Q0poH&v|4LB_U$>p%LCIri1X)P#R+Gf$g zD#u@8dLy)D&F+sCPU;oIXK!&GUmP_7O-NKfNn%|c^OT^lY%3tSbzMxAqA67d z>jdXh-H$nXX2oUgNl}gZd=4BdA>Fvy>4y5qM_Y5nbDd=RW_;ThDLQcV0@S5_9-0OQ zd$)I_?eT$@J+Nwi`;3h(_xzR~32n!8S-oRitahrzE5}G5J((2xj;UXa&WPyi)ww6) z-Bx5~D-zq(SuNP7>Nq}A9U0FNSY~%ih`)9-SU=i5dY%RByzV0n-f`u!^F0Uo26r>= zFip9rj6+zBMZQP!oRh*DF#mR6NWPN<_06_df-xrl-8*CVqZZ%Lh(-NFv03dSkYou% ziZViVc6sr{auTJh9S-ARKX+q)#dy-6eqn?!2+u z6Ao8*@KOob-o0iFSg%6}nvHlzTH;+7^c@joe zayB|t1Guq;Z7L^9nmTidKV2gf2`be5y_b?CA1X{PE!BK*7yXer%8atCw8_{hvf?W7 zzUE?T`AL7ssx%SrAxHYN52J`gVbufkY|Z@#)@GZV8q4hLY&&E(HtnApBv3A`H2D}- zLh{=ZyDnV+@X_zNKa>2M>K)0<*xuIQ>KOUF0y@`B>}-8KwGV9BJCE>DI2VWNkq~Oc z`Kk~!+yW@pe=j-9^QRNmaPu=>rCHl#?vLNK3h$vfF$Vb_l)i?H38Xm3k!c-ZGrbO5 zbUTONcOG*3ze<``v;2MEJmijTo8Dl>aFgyJiLZjj!{3E*nEXRHMh-(eZ{((o`($)t z+`a$=b1PHbI@4mBUp}34vzz1OFp3>mh}L~7H_XbnI_9P7>|S&3)4x*A@!p!Ne(by^ zXsWw=Up*##Y1qlSv03ri;Q34&Ow77sCxcc-+dQ4wg`T2vsN*OL^%GBi=^Y zbfBW8bVkY9ffXDt=p(%Mz_2exDio`86FnyllIr}UNZ9D>Bd{6upeRdt>9*0)2 zuYU=>{o61=pPA{p^@#OdrOSD1lKOmfs(H^;!fVg0jTT_$ed9fe$WJMj!V>>W)=fw# ze}u*KcAocTJ=6WUC(?rx(et{2E$hVB+$$t9FZ5+1^bFs-5hsLSUID=$0ofQ1r6&Y* z5q^mjeq-w$V}paAEPa^h6?*BR@ahFi>U}HdMNW!C+3Z2(?|Vk;{XsAMT#$rQ4jHah zxuXQlmB!osUg%)i$HK%v!ef7mmmrI~h7a-=4obMv$kD?E0nh>B z;)0M7vIv7pYAN#k;sWdvvLAzLL2$`w5q)Wq%gBhKjv+7`k=-X9<=8z~Ba^Xf%l6w4-+y90pe|PI(+&JUW_i zFsdXn7J(3xJSZKCFP%7Mhmv6U8zo>hk=!cmWfv7?4v=k&l9Lq2g)(mNidB#l zngy9y_yH*HjL-9xA&QsbgoP~f{ZZiySs8^@x+%kdD|7ozw(bC{N_@P!ay++FrUW5H z+hv zJF$ZbId|W%tETqLYd8ecbkO{o`p%Cg)N$eYnp{0nnhTeMLeAS@i>bF zrF~T_orUgo~NPaU_o?wtq zw1D56Ogx&5MI47efh+}tL<*z>7|0~63Y6vw0TI$>Yie@18h8D zM#}0`TSaQP#m;IunwJ!MI_fx|&<5>AhP2XPv@rjP#0{zce55djqtw|_H#tnOy#s-D zly?1;_U)AB2^y9~%NBOamP5<_FU5;6C4p~Lp8WuQQflv3su0|jO8ONSfzs5?xhQZ= zS2s-p)lv|-HtnMsU$6Q5?}`{lS4=<6U+*&i%s26n zU>e|W_0@3s=<-0eFm5f1Kv3(CwtyCr1yLWueb!{#1L_6mCELQc*#aV! z>2G)GFF-}H!?W?dH}H!!2oyBX-LrA2ZgXd_aky-A4m6}TVeenEopZ1yFJWI+ZS$QQ z2xM&U|Jpu(G{`J%GKA;UC*w3I;4tiH(wJzH#p6_!UEu-YY*YPj3>GmiE_o%Yds5y<(_KibtjTyf0(+Wn6>+%B|2KYPw z@DHGAWD1+~s_yqKbdCH4 zqlmdivc<5lm4Z2po;jwid1$Y>iM{Z*gI@cuUK`3ITS5zT`eO|KVG#I z4nL+-?IkipB(jRFl-aG)6i##P2j$4mjN4ArB!{v>Of1Dmyb6aMlcJp_N4QeLJRuRw zmnA9;Bt2}+t5b&c#3gI(M=A+z%2GzGKCIn8`0EVN>z^dO#m`$c&fCn-tKH8VLToA} zt6;;&f-=VN?ecu5Cgk#T+V^Wf6!y14Q`?0~4i=l0)^arW<&Wq^D3(7p( zNYl}okkOb;+x{!tlt#d8x9M-5@iNzmqM(V|q=}{|yK4Rk3cy6(h5=T+?Znpiak5>s zrVqR3B)i?KOFYiBP0ooH@~dLgt2WoG>>zu38v7l;l)gfYY5vJ5naR#fd(*PX>ue!_ zvRohib&t5it;Y2fyWCTD%JbFLOU&fWcO!3|>v#L>j~~-VK}LL0Q@5Ph->7cd*d38& z9WitrkIAQ3B#p#4QlUqtV5AndT^(U86d1h}5QU~suWsOWZYW`I5Abh)fBQ!A3JC@E z4fu_o_!~1wLg)GaQ9_q^H1?O#Vb8S8rDQx?P#GLi#`#39KwOAaeqEVlAz3y@CyF+i zbg5jc!Fua|O6Uk=n=dq_dVUkUjf~NYHCnH=>%(~1ZM1zqA0N_Hy4LT8_`E`(j7_gs zHO>5iPH}do+8=^KhdH{+qBVWLvKEof#>o4U7Jm0+Dz6%Qef#+Uh3owv5@QL zdO51bWTyHO%bQn%u|vpx9!%DdCy&VS(9*-ioZ#eR>U3h4B#sFC6N$oL6- zHQ_lK{lC2J+s9s4+kKH#LVw%bU(SwOc3uU$e4ifWJ#zfd=Thh8LwoOI@%(cOVt8W* zSug|PSWk$9P$MLE0}%zWcY_KjMt6gWtg(%Q35;R#MM!l{j6#^5oFn)jU0HPL=hG?3 zqB-G0O`J?Gwf3WVQYcJgXFtPM;>E#vFcSqa#}cSdKhO|xGB+g@v9zZpijuXg$BGh- zetDUt&PJb_C0j&<7i*h`&}9C#9|}K8aj1vf5PEc-A2xhEF-q0;d3rq-1`&E1c_3=9 zH0dXccd2l=s5d6BFK5I_fvGn|SwTd7V-|1y$E~7hXrqaeXjCuIl}s(jD~A-m3ME;;94y}Jb%LvhRKQGFYJk77(e5XjK)e<MbrzfZz;KF&P;V|91`d^h~I1t9{98y5)MNesd9A{>D17zoq& z51j3!x3ZHd5Q_gN6vk-JcY9`1e@`h7(24hEMMvVJ0v!YFc47|nq6p=?Ai?v~iXi?` z7bai=hicX*M#KvqmWH|~6qfdb%-t+PU2hK~BW;Mvoh1SQR)Cs*GRPo$8^&9>hdZ(= z$>@zjUi*6*=L~t|7REHfzx0oAcOJ}>oLsE$MGO%TOj^XgF7AMbTmUq$RAs4;jUg{2 z!3r6b`9ewj6Lf(1D`5mcS+AC2Yf8<9Q?EeFnw;xPPRG#Y?oHdRV! ztQRRw^b1g6`6Cfw2!D!&!+FZg zx*>fNvbZ@2w%Abvjp}gnh%;wx%1s6>b5Spa!!8^sZ_ay9G~0O0wN<7Vf)6ejnW@7M z6B6MG$}bOngmN9_jfv&PQ$qhbTsx{$Qf7b1gNdh>fVWbvG(}IwyF8I1@urQ}c*tkt zu@dDOR|>6HBSHIB20*a}1TUi(qD;{MjA+r)pOT6Ro2;aR-$D}%4p3Hf_C{_>hy^|h z2*f{1gqKAJ*^Hpd&oXJ%fJW+-Ut$%&f3#`qnrO8$OPVGOHX2mP8eHB@wDxX6S{2?) zZC?^q9?3EW&oay1*~!(vhvqd4$~9Z>mMSgf>2;A%xgF%(Dth0BDZ)-*CEu(`OVif5 z9{$0&8<-QO*sX{x<$;2iDSz{dsIBBPl0eiRXBEg1F2wsDIzvm|T)<$bZd^#TwSlG*O)u+OTN=B-OqNX-WwB!oo}g~M-nx^v+@m}dFOlgBx-+Q zR2qCod+7@lVE%;`wF7pIHGl+Accn~?`?>lfEz=Q_R@^C-(pVj2%=%NMv5bmB7Bom% zOc0?yxo6C~H^h?7qO5GZ@2J2yGP!yiq5HA#(5p2(mCqs@fnPzElZHrRP#+tBU>0>5 zG)~S43SMsRt8%=KiGDfrNk;9{S+oHs8Qq=Z3ZjO+A9j&9-X!RnccWdI_wmM+h7T>V zPW-9&@q*r=$wMzt`S#mVe6H?uAOtK2s0U`lrZ@A8_D=Yv)@OcWy5=)PpNc!Y(PV|N z=ZMIkDr3FP784>B=q6YT)OgS5A8l2zRat7gyiI3!yOq*)ookV$l9u-mkMZxql2>QlEatUaWV=dwAkH|?%$ zvFNtQwVzwI80@_kVz!g&o};buuib_4w)e9=+8`8WLq-b!{lk>*854-}=KG**Dy+Gz zrGnSf%g1o0mPkH{bo%bI z0zF5i{9KYM@GNgz<~*uv>=F}CnU7y4L+xG4jz3NS9-i`kR}V4p zT}R~4?bGqoE=58IDA)hKGyX&gld_d{+cjnJ<6${Z@72F@ZShI*EqG43>!S0|@!7go zcwwYDxX}an{=>QctHYDc@GCX^088j)9P8^gJ$CE}D)w3H7va7Cz51~bruT9g;kC+_ zOoaxK56GPTRE4yCPNni*y_x;o7Ak#BVEnk40lCAB(=8nbL_K6Hd?9w~7EilIJtZ1E zTLhC6%*#o-fEa%F1rq`q4CWAA8s@wi?RKjz0@0t?hCb>4ls(c>0sqYuKHZlXe8xBX z*Zl*zKe7IQlhFO&Q+tx0LDFeKGOa;!t3e7cK}y)c|DpD@f;BvYwbFuhT7&gggAHDS ze`1FibBCB}g_wJWSf+(ow}#lRhSBaq z9`v~y+NfOR&6wVP4&M6WO-5FODi6AEFO7`6q6^O1&jha3i{kWNSP|3<3q!l?n%=aZW;Gf1c3?hk*7?r z`Dr)KOet$=X*lU&YpGBHtONzDF=MFtugrxwm?Z$#GFZ$C9%KsDzuy{I$RIMRUNLIC zI9p!1~UTD9H_PMLkc+1&hzt8cOisjT6_`nKUB#Xm0=1fXvPmhbt` z2L!5*1y26touLUFilJlS3R1}kT5A7d-OoFL$fthGAHpf17|-8t$iu%CB_tOkX%yvD z6WxIkqh=Q)9TWv`i=%oFp%E9uW-nx16k&lBrBxFnXD>Q`DbRo`B3l&I+AUCjD+JIM z5$8#21W5pMCESBDNdk(E3yW>vBn{D}j0Ppm4kRrgr2t9Arj5nsu2Q;SC7vMRJZ-6t zNU3X5i5*Y|wMZO*>jsEO0_2ke;v!TMbZC=!WwmZgOB$ui$z|gQ0mTP^bX@5Q_VOyV z@_5|xzlG&g`~QQxbN$jWG;-0Uly z?8|k8mA~c7_P#27H!XjLsJKQiAD1ql^eo>^C`Yd;KLS>?jmmGn%EKF~(mbee9w>`8 zsKlPCNI|MH45-ReV4S|P(-x=-vn$IT6k^6!-L@*r98^8MqJxF2LabHssA0giRo#cF zK&`p?A7}(ZYKEBp3=8}jA*SKzqTyFi!?B8rA)|(M_H&t{HXK78^Q|Vfp!Q23MtN3? zv!;dzqSGK)s||Xn<*>?I3e+qw(4BqIo)^;w-qbZ?)DL|zegkDiiCW91Ix~Sfa}?V0 z+S(IpI?}uivfB0IkPSlcx@(C#>Q?o_f9h8n>P_%;%-~UO#PCru4KNzju%PsDp$yQI z^j+5UQ5p@=77Z~U4PDoo+~J#@>6*Ri^c~Wh2oDYX%bI=ZnmogsQNEkm6dG#`8p{rv zS_GjbS(&E1nWfX2>n5dSwV823wMr$mXqlO1$e3FWnw83!<%OG7d$rb{rL~#nueBg5S!D-V^}AYB7g}@%S#}p%#&K9z9=5l;TFU0M_bytt26YUA zpsG=NIu_140-!ply{y-GI~vtHTUlBPs`0!$*s>|$#s(pjqlxAC)rg< z)`dEwLXNXfJJ?n1$wm6yRW`##9AUr`t6%MB_fD9LkVKyZ{s0$!KaVvaPr}2)%_F7> z!@S+IuxRiOUeBS(J%7pF3u{P$eJK8DupDeCq-ZGPr>BqikRO8kAM2qYEblJRP^x#$ zaA7!B6hfLX%7{B3McdGDjQ2=1Lf#yAu2|0i-uE=**6>XFfAe6YxFn-8(!RDmqh>p! zrr*a*NXGPxL-VXdAl%0k|BP-7jfEbMVcht=W1+-lcz^t)974eCJ@*@l2>VZ{z4nRq z^@+{*iEaGJ-7m42&g7x@-DxPFX_(AuxQ=OrjcKHhX#l|tD*p_+?hK~S40h%WZpRG%#th-d3^Bnh zDgP|F?kuIxEOq8AZO1JA#w_E}8y|&(KT4ot&Z}px z2!Gze0Snkc8=!D3jhGE59X(fbzB^N9v=_3V!BkqA1#;Hc{AH!EuFR&p?AWTq3$4Er_7+%@eLjE)I1@bBwnZ|HrIYaoMlnccO4 zjy0a$^%lg9fszCPkM%?24bjjI+R`s-uXiKR79^m_*t2?b$t2MK8hXVVu?o|fQq8;fvYECb2JlDieS_R*XWZxf+)HWSgJRy7?p%tJPH*^|wjGH^%6d?) zdBE;)kXLfR)^nh0i)oN`V8nQ!tCxXxz;^hzcr@dXr|yuGz{mEI&R%}gsdLGi(aTNm zNH%ZH&i02#CAu;za`QCwJ`HC-2qj{ci#^cySUdjM^Fuzu_SnJyI0fqjlKmt~06B(m zx1vTVQtu?%_arL{#h>uhXYPcy2bS`Y`(HeF2pW0CXZAGOnF7n%9qie+sP*Qo?AFTz zij}jNyR%wf{ucS1Zbks%sqGRgU_1t?tL{vo<{UEiS0ng^XW}`X@CAh7MZN#UY$w{f z0ATa;e5Ue(micmL?|eJzk|yVJ!uR4x9+j%T(DoX}#-Ttdtw2ZV>eT+~<+4Eflt$e0 z>X|TK!*f?-=jvPZ^;_k&TF*6f)s?>1setY^NZe8a}_}R4U`igAfQ`pDy%&us|YyQF|yx)gGIlp`Px;8%=h}^B;F6fIU&w z%|joR`=jaM;9T+61njTiWhy#D?fmcznPe*ce-hxofa{6%KKghn3gnX$4 z+DJ?c5B3xFP#FiF4V;DJsZtRVREkkG8(@{3i^v5xM)5)pQ$yv!>Lam6voc~Fq9?}1 zhF|n&qUSKITD#}K=K|f`6iL7673yc1|4-JReIbanX6M+oCZUN;=9?L5W=H+uc!E)U z+^xxonSXVHx~k3LF*8Rv_gzHonEeyvC0?Z)UNT9;x1{?y#R z{N+PI@notQ;<=9VQF+8?%jr}Dm6=|$SK9;eoFLAR*T<}_xd^+q%T8A6_M1^&yDqzB z|KSeMw{dx)R~YYe0f+|`yPi+N0L9Ml7rZ~Z{HDiZdV=xye-wT@iZAX2V?d7ue&XIU zQ3jkF_Mu2{y%Z$cv`Yo2+9fCjr5fQIi>C%hIMWvhD)Q9~q9eaTOAvV6qezm3n%riS zC-dDBQRT3OjMLbSI}8!}Avg|`_Px*kV;oAjt>#ey-i@+1IM>hDiic;`>2!R-)&HpS#xwylBH&q4)KNvmBj(VvpGfBW_lmc zQcQcTPSUssXo;#SB+@Pm>iVXXi<gw5OjXnM_ts)Rw!yh`^6OAFzUlo~aW7-q{m z^&++o`=K(ASOy8~;wh%l!a*&JadaFjhY@O%Eyl^P{+dQ%#)!Ck35blX2hsYQaG*Ac z%^fH#4KU#Yz~5N82()u)5=-UMDu#p8@}|pIE8afBwsWni#s$mrhQn2>U`2ASOUoni zG|{%D$u*nKfkAoOSVKbmtH!6ts;hpG9^d}p$|BzR6o4w-@fB=p$|mo4kn`F>)a{q^ zoZuBV>HOX(9Mdd`?*>y=Q`*MHs#>y-i?*BK*i)<4|3K~eKCe025xnN-D`-83RJbL- z&ZaMYdS2F4tuJ1tZ)JI}4{{2=-*bxk`5bKof3-S}in@H?u7(8tKAw)c{Jv6a2HzmL zgupPTe?tQez%ZJHpg5-gAO{#gP;d#usZamK>NkL5Zx%*!od)?6K^Ve_afzTNO$Sf` z4dK+9MKBwu1DOI05lp#6aTlk9IQtEeT$)7*AE$!_A&dZlTtHIHnGgw}5o%&Hkdk92 zR3X3!y?{%MR(&SyXTK3rA*lgfaF2mpDt(OoTbm72jNp;vp zVNKgTKkSQwt+98E&sfgT=N~gB&z~O$ z4;8M7W!h)BOEf(JXhkv5{H@o>64kVrFRb(+BaAVPArVZnV7YT6JelaBU8dU90(x@> zI-C*9#@eh7YYWje&7I$+;wKuCqJ+822?bLPfIkePl%m>Au~&`ABNf(atAVSy_2PANVwZsc3$M> zwQVuPcowy_KXzhu+(zpAOu%mqZDaYq@-w*)w53XEK9qd-lq4uOZ3mNh=thyg{u{nz zkSn0Ui_&OQfnZ$(j|c3*Ng4@4IX8qwi|(zhw&(p}J;ehHM)+Xgmq_XeXVmySz`QvV zVMULE)u%BC$hi^o@ZKX5Bp<$HRf%>0@nw=#F^vExnPbwOI5fzU;2B%stdGL^Xti<1 zP-br3DU?k;by6)2_4Jd+-c8pllRYdsoRT(V^($hyCk?XhUS^r2HDbP#1+20>J+2=K zZqZEJ5!Po1p0vJ(lFkH1jpUrX9gB$qXGfjbvM~^k(NiI?e0~iGYB8UxK;#ixnfnF9#FEfeB&ZVrG#~PfT3B=^Ff*RtO z$<@#!F621!%|8jYUV?aL9ZWGEG6qaIc~=)EXB$C#7qGFs8_=dtYbhn?zy+_gm$&(tI5 z6Nexo6U@LA5QE>fbiJ<$Iv;mkfpxRtbT6}X>vs!&>tC@6LrR?vek`1BW zZ`pkjp)e6qvKIl7(2FwabS-{i0PVf>{UHqWy<8cg67DtlG;jj%(EQKP4~jhzk|B1} z42L^?-`@LbP=O*D!n8XfK%FeHd(q@?{SpyvlJC#~DZm|NLK%7*S?7M?b>QbM5C}1_ zk1`;R092s|N~sRW;3cb*5Bv-Os`3G)b>KUWfklcC&CmWd|HA&+$LOC8gk6Vc2*DbX z54Lax7|S-SU5l9^h-YDoXH$zO#tiP3h#NSI+XM{Sl4sfNhgczmS|^0p5)Umh51I83 znwv;WapAFgL=F54Huw|qHzw`?2I(Pl@A^<5*YKR=@Nehg z4QxptdT@|`K0*M*@Op~mUh(kXbIH@+!;t|Yf%TFR8IiF-xa8{?&s!u9t~dl>U@Q$9 zBr}QNE$s#j(0(Z z^Js3sXx{xuenMfXiFCOMN=1NFWrB2-j&!9^i084tXmtYcBwj@dmBKJdUTH|Wt+PSn z%WN+rFoMoag6hnS(Pk2QN{im;ECak5*adK{KXj^8WAARsXuDe`j zxLu|%AAL-AoPR`?%tE%uJ7Fqg++k&GrX5|3d1AtOd_H0PRi#E}2gaJL)MG~Oxn)9W zWCCQ?!=ry9_w+L13^N&wE&q!fYwsO;-CNdQV^ZB>@_~DDKS6%8eDc0!@_1ctcYShx zJ9he4V;U?rH#PFWb6~(ss>E}O9ck8$b;KUScn!{*s>0(r z_EUM$UhI@P>y$b`QMFs)gHLf!O7Rt8`rcU)%oH0uaB4AC@f*Jayw5b)hQf7EzZ*65 z&`f&Y4*p2WAUe$q+5r9tY&r%;>{SacHUqwgF)yx-5|W1!dg9E)j?yD)AReSLfm~{h zp%N+kEVh{Ph;Rh193s8{?B+{Wtmcfz+04_wS$Z}2Pwy=68|BJxDq5&26brL-6|*2V zhW4zvES5lIP7FdWF*s+hIfexU-b@v~0eJoa0s&ok!AwG-i+mCGc~P->pxV5c>Abkh zyhPxXf{NIJs@j5@>4N&#U?Xrr zBXL2qU_q;4L3?09XJJA2U_tL;K_7C_0AtaRV$q0w(O7KJL~YU3bkWRZ(L8YRSE4%Q zUkaO7Le>cxtW0q$T`ubaS(}GNtIXM7rz)nU^)O;APVAH-kkl?Nlm?DVrg7P3aZ3bf zg)X`j=R!qpB1>$%RBpLNh!n~`kQ#QmbD)?aXWAn7*Ch`Y4c7(rzb+asy(*xvztrK< zKZ9qBLr5t|tYU&!sY6GXqc=1nTv#H&G@~wl9@Z?!TxcNOlw_`ErZlwKB0W!QTf;0WiamF$2K$ zp!a@Y;OXtbG4ByDk3TQA&ipvU&^w~gtBv18%F{bw*o5QV#ITwpxvQaOW$_Axp`c^& z|5bbH19OL=e^0UX5XeI5rSET`|MIZ>^^PIHL*g=K?Rn63EoEimW!+#W{3O^0O=Nu& zXXh5(c3?Ju!mJCauKN^Qhl;|M-mACnH4wF`M~tdRT4a-qhk=*JMJ6-^P}VzrM99yv ztBZ0N@h(GiH|nWyyr%9L-m!;d#^K2~8rAJ!90xY!O^*blil z9=SM?#(d|R*$)#q2)Wi6nt7x4__Fr+<&AkM_rhejc;pc)wOe!ATFdA9_LNN0jZKok zd5hP0O2B!f8hNB$O(vwWBr97B_x7vrO!mKY6Uv`?S4by@N2T=u$(@sH-2&VZW@v33N-wNLRL>QnL?`kK_!9O~)uYa<;_ z@OGGGnU47%YA+sgVRYWC_1wk>-l4_6-0@S&Bi=X({CDB&oxlT~sUGf;8{?6?z>!B` zm&M|Nm#^SneAm^Txtqh$?c2pLD~}}oh0!5|anXhG$h(mu zdeAd^aOb=6oO=$rdywgYv9`j|gU1P*$FY~kSocCW?LwI37D?hKF}^2>lfuwtz3kSa z4BmaYx(C&_7C#_PnVm&R6GXWAEZNINSxioKE>pP?L^)I~bFxki%_fQpMVagS{JQ%J zD=n)!PycoH50kaw>fg1b3mcz5Xo3o}# zE75l#s%=#7;F-pGe}}sDQL)v}dEgMH^_Gu>^FF@^o4Dt^VgB&Bz0T02-iib4g**C? z2mOUH_l5Jmwe7vNo$6o}m&D9xxJ|_1GUL#SD?G^E`C^{(!mf5G3IZ{xeK_VE7^x!= zNN(%RC$;}5Q8sTH8i9WVHR7v!d2M`o`Z*lbZ<{!8dukhbDR6mZh7?C0bx3KKfIf1k zCspIU622^*4Y64AgViMs7 z!|piG{$?p+3>*4pINxCrT@ESOVFf6M!DNcLbWOy0gOBBib96(R9CtZCaY8SD<}JT{ zFHeK4aQnw`XMXZ!#qr?W@#W?A972Jq%CUXF{q_e@6p{@t6r>Wu2P9(TPKCi8q|G#7 zVj4v)i>GReb4me4_abKJ4z5FiEBS6pJzN+xEdsjZLv~)hnR>Zbj(EFAkIbMYcwl3EAl^`tmvDZhQAXpRRg9kfxfDUl8*5Jw)WI$I$o}yVDC*kFODXJg6+-W7C~;*$q-xpZYOQ~1cJz2% z`DhIa{@($O|K}P)71I)BRE$NS2kVi178mkYf~TfPF%u|^%g)7iGVoQ^1@oa^C=o3d zsL<;7R6Se#M;hxHIGk9rT=TPsrTny(el^!}i#C!D%T_ne_DX%ctf^|N>o+(&VLM=> zQ6lQof%JU(htb!mk4L_p%W*>a&=F7FZ{ zz5aYD%ebvDbM4VK0jI1~I*?KInPhEnscyLVWfS z{ROQA6Dc7I9B2PU`&7;O^FaY)5ClM^fD!I`S5cs{xn4{TAx{g*4fCwwQv7NmP^UzI z%{=c$jz)6jg>yg!?FsTgy~I&hzl%-@<$LrExcw$6A&Nti#mEN^OeXA@h^D4ndA(6cN$Lhba_3I%Z;<7{le-&aF%5S zS*5Av}D1MxbIcNqnvvm#?uGH62{tq{v%zy^E3+ zL*tbA*qO#ABb{R7E{pnQ!%5V3 zZ}76!Js=Le>&DmHwu>Gg3WTpOzBiea0UicEW|@qB7UV)ms5=FV*g!rt7O%>t)gk& zr|Q>}kUKmQ=Z*`=$8Fp0ir;PTN+9cL*Sl+fLT~_~Kf)qI;l-^(%Vx7hDBEw7I~6w8 zHt{6OzmrF#0vd|sF%CR5CQ&BGX`K-%fiVz zKmJbR8A2xC38Rz7_>*%(9H%`*pN=RpcM)%|reQ=ghR89oyyGK+Y&5d*7mb5Yk9Ux- zQ2U)0V$eAE15jd%`|G$1LPZ0NP+XRw316qfqS&^3enLB_()wm7>9<$gz#VhQ(2D ziGzUoL>0*ytn_|$)_`_zR zQGodX&a z@Bj*N_e-EcE#(SZ`%5?POT`F6)Gd0|Ff<#8H4bQsYs2Da-oI)F$EQNaJrOV$QN&@* zlp)HqXidFpm0&q#y75#o?P2V{IV|XAKH=a0Pp%;Q?>6xpv`;9GP!PYp- zYkSL$+|3JNwjN^yd!LvsJp_z4nY;>r$(LxyC~Te3?$-Tvut@#vgZUW^OJ`_I2u0{c zjb;k~JD+J4q_}B@0PouG2r;GX1!H?p(sWrd;u)WU2`sy=NGYH7c zLCl4yv*i&Wo?M2e&7ZGPN-I`asClI=w38L{AGxvp_WMx-#EzclqaI*ubLU3Sj9{o$AAxRxpMjYEEQcc4H`&V zz-r7KA%7G-p4YdD%7>5u-3ybKs}(;B)#fVYOPgq~)saa+qY4Y7(b1d8`y`5Ojp-!= zGhYH=3Uwfv|BA-Jdy51)gOwobma^u3mmm=>Fgf7H4LSVi=C4Pw5fe$C`JBx2-`Dtf z--jY(#VR>uubDQz2Qc#X9cQAvs^Ct(_AZ&T8O^5caB;tXPv=+AtU3Ej`7Z^aw_8Z? zkHjB3?1gTh+Lh5C=@wneG*`Z$Kb=hfq$w!KILQ9l*LEi; z-}#4g3X!Y3yh{p35_7O;NU--XDw<>PkOYRGMhKE{$b(5p1an9*s5vC`IRstUce}_p zfeSO)ohk|2$6+~C>pN~dI`+R`zIhtH1=PMp%RVKNQk~3ryG3}F%Rbe`lCjL;ImcLy z&tVmk;kYP-P|SpTb47Iqhg!}M;)9W3D@U!*N4?!dZAeB1IY#YblbkK1 z@XwO6JBG_MlZ%nYND0RX8N~qq#C#tigW4hEj*CIk1OTMSQBQ;{YAMueDU)s}aB(Qp zc4AFyW8*Z?NG&Lha(St7;&8a*h%KTr)s)D|Xt48RX0hU5K`ilUz2O=C9^5Td@ka4K znAO4a;)PeJ<0;~WG~*>h5c1rpCgcWwe92xopDengkSv37kO5)0oXGi9kmq-qOM-fr%Y!8hbZtOfw7J)og zhQKr?vNR#^v=Ug>Dyg)Z6;ypufFW6ephG%%Y`XCto2jVU@1FFZm>Ithu==IU220X; zV>3EmP&!k%V*9v;V7QXWxC6l>$w)H&{&mcbOq7St(9g3`%@0 z{(Md=Sy#qpMZD)*QgAz|&q1?kW~OPc9CRV8^luRD#Hlei4Z8!VIq> zH*5mp{y9^8CRToLY85#kzgV1TI3zSs~qrfjL0{HeI& zXa*y5f$4qzFZ2SvoB|u5m<0rol}%iZR!j#@!h{xRCSCB$vOw1|rr=&G1zkF>KMDdx zvJgVLm|U7KGz2WC$k`H*njq~57y8FiswiJ77(|Qa~96;7FHp<=65Irdg5B$fWuvT~=j;-nPC6hl=%P~DJSGxZqo)T;U-4X`LE zm#0AkX{mgdQEghSLUgFsV^@`LsLC9uM%bwab5IAPs{vY6OHpKie%HXkmqTi6{&UGF zclil!sFlQBie#ionXZ}NpjlNwlKoZi1wqzTP}BvB)iG$-rm$=9q$dQXXfeUp8|BpU z$4d{+P>q>oZ7@%nAF3`Cg(AgE%)eP6wF4NTwZ!T+kE`(?vn+7;g3)7JKt z+TBjHPKC0bShPG;v7Sjn?=rLM1%35<;cW^Y%hIem#xSk33p;Z9Iu6py2g5rX2CbVY zJ1=B9YoNN|Z#wSrI?w4WCXKCs!=k;Hb@p*|eqZlUpwpQ@w4>*AU@~{0NOoW?YNms> zXOOTbbF*h@azMu`f0*tD1or@R9LR$m{wepo4|ZRQ_mW`sP_6e+KlL<^_9C74GMe|| zTRYOOJ8@# zJ4r9O{495|!%DS0a1G-fv!SFmJFY=-BL71Ts;uVng=8uO7mjiJn< zk?eKMO!`sRST9Qi?~-<}vURV)A(1NU{F?Hwyp8uT^uRXua3i13A0?lFoiT3=-zw_y zTFLR{A)mwG@q?oAtmXeqL-_v`XcQdAB;3KKu*?eu(F0g2au+n_U|q3UJMz5U=b9r> z6jA5+BIno`guuVgPlW0X0N_o2L}Ur$E*{P+R^TXa%q#GB|8ZDQtyt(Anb)=HWbRqe zlneGhB#*S8Kg?gc`mj zpg>D$Ie5b-Y@^t3W;w(LBW7Zmz-T$@W2lWC5Nt2R`*&y>CN|y2RGhT_tAq}QvTDMy z3fY$TZ(^l%VgM@^rGjC#{regw$y(aQY6F1}k1(=MHAN}z65Y&Nmo8<`1;rn=b>LlG ztnhmG#CpWe`XJ&)0LjMKM63-8a(P{R?1%R%sDfHnGkhzPMuKK@O?NYrYjdr4!>4$Y z4JVNSr8helpt_P6L9zu<+3L+ieU{tOD8c#AWdPaWe6QU4W{Z5sux+C0KKdPFI8FxK z8AiHwn6xc&!IAlhbmuLS14FM8K$wT?JD>HjjlD@vayiG#3m_-lLAx9#=-egV-2MCo zcya_BTqD=OL_#R-K{@Pk>#g$2i+%x($scH!W}6A#(PW z&!2ZCsaIsyO-`NO}l2j&8YRsu)1m4{3@ z8(t6`U^}8RwiurB>^_~?KeLX4TiE?UpGWd2$03Z80rJ=plSfgN$5JRK&8f$M0)T6W zOiC4GXD4<%B-C`mtjy078v*P*flNxH)0|I~lFiJlO16qgl&UE18l=+*r86(5vm)Qo zwOz!DP+ss?EEy8GZd<^Ml#hYod5`bEj`s5*J;2E4ISk4L1oOpjrSnBX-o8rI%RH0M zx_=5L^KLg6oS2t1_c@ffx!b-unR%Cxm*-z|q0X!LVob<+ z?(cbk;_I)#7|$B(S!+8r1Tr&p_B9^)k2R|6LzQcA|Le-eYnSgB;2>mdq8mJg8#e|3 z5z#HKod7-)7NOq_Ao~_h;T9j%lmF_--erJHJTIC+h{h)PgCqJ5BIhoZP}G!1MSw|6 zNDv@WB`%iDCgFGY)!>tzDin`~6C`@zMMmSddytHNaKuH2B`J2>hvftUc8LKYwf0@Hfo!tIunu z8a-wZ=ffvX8P@X^$2Z}^dBMM+b!NI0#T}6#L;?YNjZlMBzYH##cW~K_E)_5|!T@aL zeaS#nkWzh!5}8Caq;Q;$2JJ?dfr&Ea`g1fPt0n{!D*A)nVV4Z(vl|GfLMfLn2z$7` zQfJijPc)oRE)8RMHjOhIHR3eBRPpc6hAf-m1`Cm5z5y@_nR#lhR@ep4k0tfexl+@k z#R{(_3%zRFqTYsAw|p|^hfmlrGFoa;7wb>%w06anJg(m-EUpNej(wxataR(^D|edH z(PY_XRya<5^JO4SPFMc4TI*#bCrBPvpvW8bg>3BCs6bD1h3?K3Xx*a{t`qSkfJ1xNfJpii>=w|P!4RO%Fg3qnRa8?~oAK=^ zS^d)jGDQVJpde9R@8dDYOJyNh-|stSih)0hddf}^o+p?7-^YumtxH$^ zoKvpd7#hN6lL!^P)Puom7mwXo5`80_7!@}$+&(l)l{#MJ%g~SJ|;(|ggtJ=ECXrF+8>m);*L?QbT;^*Dxh=Ky4 z-M>QEV$aT=Dz}h4DnBmsTg=z!AOW`A;q+f(k&ZKart>*?h}jYhxXMAk=($l}G>|Vz z0f!DmLbr^CusUu@l4X?#GsUp%#GbMV9CFcjV;Y5;CzZ^_`+_bqOGTSBe5Gzu60Fo< z&gN>#B20)<<$_a{9sdP!bv1gWOv|4QaEs+yE@g%lGJEZ4$e!Kuq*21=JB35)O`qVE zeJWNo$2=WPwknlYHgx(Ir$0Tw8Y|r}^z@!iGdn$@JRhouKxC&XVLyEKQ2n@olwA+Y z!}5)_$rIMsTy!f#KA3fB7>mF7-;l<#)a!=>=q+f*w5D^_)k_%|Y;?mh#nexbg-<3q zJ7bmCUgg9)Auk03WY)JIl8Cz?mmQUcc#m)?T4ot8lS|<@wvpUg+tw~!I?^`+D1o&F zC#d|#U&_arpKTr7Ri?9Tn~%E~ogT4vX7giuPdu=SH-YdP$7@>_8(1B$1l2xRVB0UZ z$$}Xn1AMzZF$TkA)f4{J0W{Wz=cewx@FmxQ@kcv|;n*JJP|U%3!A5}r%TnP46bqKl zC{eFSgRQX+Sidsb@f0YBc*XUi3xEKE=y-RLDD>DrAa6c$(DLwa95@LW$FRTSd4xQb zHCMT^rZnb9qwdU`NkuvbOy(_aMwcw!qw9QZPMQ-MW=_J*=Vo+$n*5t7615p(G}SOs z-L<`SSwAsoGoNuh{vctL!fdFQeXJ;jY~JM}`tV62w-QGX7TnNQ9Lp%+G9*|*@~wN6 zs=(rs6iGvO=*h$=enpcDH`Pj=UU(J5U-9xMe-_K@B4{GVFXmZ2ROnZnX_Vo*H@Lc# zghpB#gVGin2ieP0`OjMCMG3|gF@zOKR`j>ejKAyAUX@2)1X%MLY}!&aN557$n7O4Vg2l-j?Zru`c0l&Gx2-pRX&YrpQ+s_0? z_UFMXAeq`>6Ve7--L9h+JqyxDIjmZ=?@-;i_fzTJgr~Q3!>>I5B-GnnH-*2n`YSOd=VB)mKh1ip^=A4KLwt()8&8k}|k zV;RN$bNAi$<=Ely54IX^_$tqgWO_FdOd+ZyAcm2mm1_a1cTUVI>H((_5r?0AAh58!yqh?!fd>)_|1$abakg_L!ED ze!pel*a1A5deIS>EAUTkYU5u7$4BwAJDoVh=oD( z`i(BdoZz|}N>73+c7islR3_vBZ4wbDNt3{;6l69ZZ@wST6EoPAD{fUDFC`peQ;%*Z z8)q*o_`o%2GA=GHEMaaE?}DFcu^;W$F8&3b*~%u^nMjYFO9h|dar@fS@lp{6_^7-cQHQMY zhUdvgG{$9F@yCGU!`=lG`Lbv?vJ((;6B)8Z!0_4r@p)l6#1Xiq?-SRt6TJL33 zO9$1#J~D_6v1`Y0&XqiilYNfMrpQNxnhO#k7L4Y4W-fkrE)KUuuz)&#R(bnmPUIs~ zRE#E3xfC-qJwLZZN0v}>gJzSSP@0{VlpS9-QFVVuRR%Jm5SOmfle{Vot`?Q9PGmuu zK&`%)@avtd?4zdALHkp#wRg4*o-S|@RY_rVp^voO_f@S&gr0U_VPJKk=T*^AOkIy* z#&|)^ya0YZtzr?b!q~rJa+JYJZBAiKeTAjM%7r61q+(%rQH|`UO~vA>$WjpXl8xz- zwhPRDSmh1NqK6OTjZq~Nf2DWDlFvux_3KY8ok`z@%0Cy2b%5ndFbxlOrgyNWkJ2i0 zH5d?-=nv?;zjfjq)krP!hnai;s8X-2-@sLQEGB8-$H85nI$!g39 z@hhlj)#-A~XuO2U3@|ATns<4cS&&hbDlAMF1bLav`3D3A3@pG3oFZM8y;!Znjm*+O zt&m@=EOo5=D_Trvt9vi2oNKZ>IBPs~Yunsw>@rymh}vt*Yyx!k;=J{$_4NXI+R}B} z@_pKq=W};We_Ra_HX?n4oc(`s?VajBezt|I+3d z4^*D8SvMJL7`tGXbBUYq(UA_-nPW$pZ_rtI&>1NR|LfJ{uaf99h9EHkSViOt*y98( z9w2WvY}mc&{%zxMJKI>35vEm;=9cPoaO+kbn1ubUd`=)oEeLg`||}KVNLVXC}711-EL4 zw0X6)_su<_8i1+8fPeBfTd6=E^0wXac7yYlY4f&P@wUUaLp07nZf=8LZgaCU0xo%* zybK^H4Rc8NmdE&K()owN^|qV&d);>y#`rd!Ixq+Mr|0+==M2~O4DlWfu{S$#8Y6K( z+rwfy$T&Jk^o+(>jfgom9?%4GI9SVnqYS8Oc5mNy&x~bn<~l))l*VV^ zg2+knY_5WbbbB0nhRi|6w`T(M9L8OyAqeF{?|VWBCPHw|-Qev)+c$e6jom`x`@)Mt zqGtOaPWyu5LSMdIDRmPe*H9!?IP7^!3i2LY^5wN#6C8XILiB?GL|Afq7)45vI>mzu z>H~ZoVO7RnC0BHH#&9ip7)rigO(YRLMi~7?fB+j%FrycU0AvB~8ZiRd`1(ycMJF_X z8<9xd=Y34TehcwPOWQ-VokNyrG`7;jssQ=QuHwQ_hBL`3pgjCjs zUW)l3!TQh-nPv>xmP-V-OE}<5I+CON^GO7#O2jc1_g(z@0^;3uPMq;ie$iWSLLo%U zTR54Brw57KkDu^7B4iDUCw^LZBAf>9@9qDv^yQQM2Q{2yHk^?#lE5~amXSQACRj!( z9Xf8Azizp*ft@oi6%BC~Lmv{mZ@GVGS${dw@Hx^bz8BeUnT250A}`(QieA@wmaBTk zzh+hI8qyGu(zP$$@h-i=Y+Xb?RxvKqvo6z$&)Mc}-HsqznjtfIIo8){-OV>PpguO~ zYTXoYK2A7ZpOHRjJJy77F~KNX%`H1OK8`0Pw`n-hk1(;enF(AMkXs9y*i5<@n!i|r zFkdIU9HY107O>rE#5?%3nW1OgdOu9ev0X)wR}{-STbwv=G~3v@j02z1m~6h`xI$4o z_#eT#Z(pXs?f=;n=nsR2Nv|fI(-#aNlg1ym&m9QIMo}Lht}*V9BoqxJhjGjwiK0*_ z-A{2W7z<|5ALYY#DwO-fZZ|nzaz`7HIakP(Ey7Q8e>5MV zhNq{N>O%KZNxeh_5Od=w7hLtLfEl z7-%ekh~E<8^LlyC&P1 zY}>BM#?)jRJKMG=+nO-hwl&$cPtWf<=Ovu|4%T(;f7W;1pZj(e2>ztbY_eW()Cm9f zBXiGs%G12D^aH>3$7YS~e%A*Mx5Ikf=I5){7lr4a_W3^c?%;WMJX>bjaz)tTa<)F5qL-K>bIiGh_(0FO!ec&KQcLM60wPr%T!IzVoteyS>l1~ncN?OqVUfGLE86Mpe zVj7@{kK{Vi-j8M5lQuQuoC2;$mL*dwGk|99P^hy*D6tb|_f`&)R0^AMQYINaDU(&b zh7X11dErV^y<$#FGIU-`N>l8@bQW~K)^$@tTaK*BB-iEpVdSv^ScM_!s}W_npzBlW z{Gg5$^&I!3cFR0}n8;G?IBa~{!br_E8odmrrqkjmUEY%jikM8Al4yf*E$1435Kl56 zX!LfPcmN!xsv0z7L;pMGa(t}1c`NhWZ~*=7yxxy;-L}4u?5Mi-kA-Hq=E=&P5~V#0 z!b&rQd8d8r|8#*{pI`5kdxd&G+l~|URy!`o-_l4R+Gq0$Jb3}QJ)jeBl3x91Z-<_@ zpEh-0bR7d}Kf=?Z<3PCN#PSd%y}XefXjDuIXC#+QNx+;NqQp?l6VXY8EXmHPgRqM5 zc9b%2Lu;IP`l4adXSa(@gmD?Mv54q+f^Cu+l2eIA345rZCy;LPzFrB0@n9&&rJ%g1 z^_KE|5#YYLysQ}B&8lzaVE<^i^==w1T-Jo%ngXf=r!lhc{ZQI)W(Vm!ZGK4uTQ}-o z?OVw`5PG=22#wsfEgu}F`29e!skYsKw_y&E;deE8)(IA|hQ$DTLFMDTa6#TZ{|qM7 zv-~Inn9~{@sLr#-#^3Fixg$MZr(I=Ce3w3yr}`&Q0#eF6ZhDAmHwE;}@%Ip{anGv; zB607+3n0_(yPwudUxy*n-jwGt9Q99w6X#mLyCa8(7~$=c-BI$-Le;4o2v-vagS$7W zkE^t=I_I>%7`+@AEU>rWB+efsOk#*_)eG~v9|-%N_k%`S7#3gI6MX{#mJuj|Y7@^G z7a#?eHCU8X5cKWdBa63-D;`ReGL-&Z3PJ8}0Qb{0>&i#>9~G}@Ka7x)*F{Og6{jy$4wYOWMfc>EAX!3Hi?&`D-XcZCASxt+xHqKS zAw@+lNFcGn1Q1{>=5zh2M{=$<)y+*D@xPdjaeNOWJk?GYDNP^=zc3}kp&e~NMNhO( zJ|Ko%m6j89ipe01B*uc1mRy^qm$we*wRkQzTq*j-w3Y;hMM@;}`GuCz#AItGj%&cr zrqodcGxUo56u_1jhAEWQbb?5)mtSD8g&Wa3x+U&>hiCU)9oLe?FdQl_6^@Tk zFef`?nS3wd3Z_8Jo2H?VLW$fAszE6of88Yr@@+i#N(W+Y#%lE4Cph*2d z-o=hcjku4&DjfwfOsRa+6dB$aVM1^z*PT84aqgiGU7gsX)If|_t5Ks#6YU`rXU6D{ zT~iR+>X=|-1I1wVm*Zu1u#&t!-~Pf%E-G~%q^sHNnWJWD__jJcj@^)0bIGjiy*hF9 znB5s#;~;^cKac#>@@KPJ8vb1OQ1`O680jZcUe?-4!xDwR#|RfcYi@Xn={HD~1RQbz zip8iX@7CV2#D8EN@2KJl^qd#p?ADW{E$NXuobOm??prQb_caf;|0aTACe$+pWDB!4 zaIU0tZ`S?Vc$WSln1k53_H1 z#p8n=Y%$^0hyK#5f2qKolSU8^OLIIy^mXx4y!Yzx>P>}M>wrHw()6h2EATjNfIk#Q z;8C(3`vi~R#43CImUSz5(_UB3c_6|QkuMQogyfwxuEMd@vFG%7`n?bsqm?KD{_OKy zlQj3`37^02Tycp@1#^sz1Z3!}|U~B(o=jBJy+A=4w{c=6e zMapb*_Gjz;&X1oKR&OL5e*is$mp}bX*SC*h+PX>E9DU>XwxBcI1J8e$+`!B@PbkAM zeS#y1h$9iztw=Hifm@k61`{-Z0-)Ou$dUt;LV9pubN=vL-4q1qA5i#TjH&fFO*Q%K z!Uw*bvi01=`tu)rZD6M~1hw*7->F3XiDs?+T(aqj4&{Y@hv_pVl$-h-Nw)ILIsbI3 ze%cUFYK>SnH@MGiw7t+e_MD%cdH^~?V69(=aZ$}iN|7X244^?Lg%@hKZ3z7H{`a;` zfd1V7v~=yU%(wj!i$M?XryTJbn{=#hASYJr$7ood*+>9dh}p%`y9y)b+ld!wPCn)oPp=7E_IJ2|Y3f z`M<*Yi*GOb+tmB-mdU@A`R$MR!<_iPlKy~bBX)ERU}M!r$HhWB@pnK&!#Y971P0E# z23nK(D@X*~aAB`B20~i}QJnaZY5T)T`!PQIV{&0R%>{h3!d{jl5<2!xsSiFBC(>)h z{>OzS$Q`1r62c1j|7QvWhIs&i>A=V~VDt(w_RAC)j~kK59g(aZk?IkVo*t3e7LmOY zk^3Bxj~iLY9a;Q8Q($>|WMx}q^-ARL=g2zTs0Qw+Che#ekEpivsE)R%u9c{s=cv9f zdX77KNIUwENAzfV^mtqJ#7gwkbMy>uOonlYT4IQ=NQ{X|j89;UUVn`FZVX3xj2>Am z>2t^qAXp9v6v^>0nKI}R(UQo}zHNb6e*puNjzzvLCnTNRBnjx?@yj^yWqcE^K)*;M zrD!0bGD$-3PbRn}R*d#9cu5CA%tvpe<{s zE4ihO9m-re$gDP@`w@`^6`WbOnl&FON=nLfpy)nS|~%vl1RW)tqBe4-+#$EU-JFyGAOIQQr7@8vpz=UuTeAED>{ z8(_N3$a^5mgEG$jh=-1?%VrB?J+0F#^0Y1Cm&gyjZ}+SU(c;aq9CiunQ3H z@?mug@Qia0>fnB%!aito2(hDzByn(=7V?sF&pX{CU8Rbf5)~#lhu_`o-f9@DbD$-+cg@$l&+9CPV&iFFuD$2wva%?K{A}fYW z(RyZ3#LiG&cA(g21?TSsmj?ys_kV8I^Iwx!jj#*W+1Q%zRyOmZo)_Wt$O^X7RX0{v zwcuA_h#(vXl!MXbL)oB{s|%xIih8lud{eKXhQe9#5+Pm?T0g_y)D_)XEBac$Z{v&X zj$@xx*4$RWpQ9p|k0T!l!`JsgOUt5ao2AJdh*>O%JJ#2#G)bs0NF4EEK=4Vb9@J{M z)UhSh>8eX2or@bmNx;k1fjSJ#!RtT9B`h(~TJzz%11iPv^C8#J(l|7MO){k}S&%By z2^6wP>ar;=Qp_N44SG4*Y|I+S2r2F=8Q%4V+=E6sgr?*L8BTgs76RE&)tD8&~jrMKkTyH*7~Z>7uo=6%eTOX-#~GYtcJ#ie9{;EhMJ$DT5q6yRI1>Q94jll;PiLu?A6s6UDcS) zm3b-EsESn2`c%mdRS8qti4UoZ)zZC1XqwwO7TY-`R4d-xGwIu@R65GM+o?)A z_=Y=3B--r%V5xVNafdmeJ_muF_f|P~Y#=JUs7i^Tgb(>aj7`+C0}hUdOzt>b~&Sczo-D zQ0Y>sf;$(kC7~;%ki{vC*N?-|ja}3qkkD^~P6;XO3mxfeEcww3)xQNz3a9@AA^JyC z^AG$kT|)W(`eFUmLw$1oRBWq(zl(je?|m~81OHA2mO}?fv-{cK{fBM4GG^K+X#>=ufBxPPRtdeXaYK2%A-GyDIbHkA<5xIx9Cz zMYmHO=BZF&s2u>7$)D%wNLE1AP`Jy+jZoF;GR7)$!CbouJI~&p{aF zzAu4A>_G2tR;xKNtD*oOSlTt@z13}mwN-b?G<$y`z&a$iZxPaZwE!wG9?lSH&dmoo zQnye0FS?meZwAi>nmxt_O+RBxCgtb`gH<2|DRck}g3-s~HSbbnN4a_cJh(;h6R0(y zv1XMRd@HLv=tOF3hH)MJCg7BD>o{h1z;cU4WQ&~zIwOC*lc+&hzxmS$xq5u~jB$IQ zA~5iB3r29KLu=<1Cj}mP8yp#p(FoFU24EzBuw#Tw=8asxfns7Lzg-iAVz5Etwl^;9m)DXVw_ffDp0Y!NNZ` z{-v+Jlpmn5LQ*Mj7sSKGO|~`FA;;=9Q%=U~exi%TL(m#QS_N!#`Rz9eBaHps*7EKX z={X#yf#HvbU=rS6irGD?L++kIsC{os_Wee zC!T`EV)AEA$PKO6$ARA<)#3q}@h2L7$HzMe`|+C>J5$Ym7x2HjGIn5PcOX)7VY)xh z-H|VHe~%bm!*)eotbL+%F~W#`>HO=UT$GP`dytQ35RM&@>vNCRx2`~_bJ1WhoI4N# zsL6+LCGgpg?jWA6Y{ zjQV&IdnHm^3HtGb==pRSeUiC_;B5$P!2)|M41fCVxliz7dVC~|I0g)H)$HorSs7X* z9yV(SA;AAQcj_vm_C+9jD$C%={TrOi&a*SgOQO(ax6jNSO=Iak{7{VWQ(iQ3*o2k?dT)B6YkIRCKgzWoo5Y}w`S1x4MOeJrT+8mboA2X z>w&?$Mf_);5NzYWyMu4Fb=4y=f}el6kJW!adB%TS2*Lglf(1hx(_#)fw<6+Sp3W0; z%Gw)x!TDd`m(gG-U1eV~mPo)43hxW7OQclz>ieo5%BJEv1a`X0rSRxh-lkWmQYulX z79XXvvWH{#8^G8;?v4B;?c}uQZVtiMI8(3Gs4*DM)S#D6-r&4L0h@XW%5>`laAKTGs zV_fidxR|P}>S^Cw&6OzRN&Y~ym=G|@WQZ8xbTVra1XV$~%Kg=!aNQlH{eBFkVY4?J zLoAiMLCLM**TA4NC;n*H1j)6_5&V*0nO-?Sdq2V);dFaAnJ2~kuvEyQ6o#1aJEHtx zwHRBpfAiO=WC95q4FbxgL-+di>5s~~MXXpkfQQMVgGvHa_o3@)7PK{GS@E>o%e(#vIU z=X0V}?M&AYyOKcEx-lHDoljLhpu+h)>f8GS1t=+P>mocGbkHZq%==W_q$&rS6*L@- zNEXTa3e+8mCJlNf!?;2vA5rlq$+=h6G7L?j6I7pNoMFp)Zz?wcWDJCn;##YfN~XYv zATpXtaO#-LKtz=)OinD8GdR|f#)y}{|16Mc<95?==!JGCt3z&Z9fO;7x*-vEa}ln z5fwtxPT}$Z7{jR{e2nAgd(yb==Z{y*rry^TxtqOV3A%BA@Pn1fpTqBSquh*1MNT^9<}!EF4oG| zlf#o1vh=Xbl49tk_hWDl#f3rvL4m{@2Kn*fRXDSS@Ny@CNT~tgl3-*34uIiF#WWP^ zXggIONMq#LC1(HjVMGPofr7bs8kP-VxDrT|?$}T3agNlu70CxqXkv3`*{oP>0=aCGkg(T5 z5iu;(sNmzA>#8}@eq}6n@Q*vF3DRnY30A5-7 zD<|}iHnF#)DP1N1z#I=TDHY`^@lHMV5Pbx zFMcf>R<$nDp|*sYW_6frl?@}J-Zb4(oHBzb)bNyf3wev45h;v`@&cpkgG8AXT(Wod z2yGr6N*PrhKTzWWL_>fuF)zFnmncDEu3)-4toT?DlD;s<%UYcdYiTT|l-WILgcAh| zWz1svN^}N5iaWAu9FPo)akHT~IQGW{1%&f%>;RGwEGOt3MV|~S?2lf{_`&DMgI7FErZ!(=}ryi(sBWecRDDQ zyeq=u7*^| z;_p~MwfVCz7Qe$cwB$_rcKSBTf&Jps60)t;qX_ojwS1m8^Y5_lN{j z`O@{fUVJ~nx6C0ga|)t6fMoMa`VSmxK9*xeu4&}{pA>O0TW7gXF6;K$-hZ>Uu3+SQ zX%ihlM@xDf5P5)pbEIp3R0?#%ElygPxpsn@Kk!^TV)Bu?3?n_?$+o!N=oM!p%X*TL zhH^NJX5enMqOuR_S$M|P8gJv{x(?2`+sRcwaWY#sj#x(8CsgL|^gG{=c(&UOfj{kw zAc;=Nz<-r7T41tnlVK?D1orod#Lj~=*I>vziKq8Rn_!ZYozXz5gIW_*<`K zRhibQnO&F*b#5#hxYzdz{Il7n-rkITYJ<$ZLbrb7{xEoM4>n^ISq&L77I!7oAjgnc z`5}J-)Y~*Mi!-%^;Y?9UaLUeJDGv^{%5vHm1k9tRmCFK@;@_oxPyE?UhD(KzTgF zD1k9n!J|pc3z?ok{;Ugk!fklzjKtLM$A;<^i0a3y?k8YCA~NguaugwUp~EW{A@G4G zY=S2{=*J0ZB>sx{QXtWA415der+^ZrQs)}z8zA2p@K+unu@j90MCQgLM!htFDm$Si z+XB%hLfXrj8Ms4^g345l+JPRhVC&^T?hrQ*+WRUfk943qdPC~ypul^$U~;I?0lA1e ztSEw{-oy-5@Ungm|AX&2~=`h4Bf;jSvBF2e-#BSq{|H&T*7pY$^ z1C{Y3w#8DeO;T=9Qoa-;Huobg(LmRs5g^H^2Zyvv^@z8fR9J{qEU*~lPl{u%UP@~P z&O$=M(Fxdjg>^_yc9E-wf@n{Y&)@Z^s9KXMN0mw3KuEfPNQSD()E{ef9vcA45ERN} zsmnkt$drCXP)^3a%8U6!G6i-rg$FWX$z!U|GK$h;C1x_ND>4Jz;~Da@l^3$5L$YNX z043|hsh7y#ZJ~T%5QKe@x`9*?ba)Qwu$pR3Cy@Z9@?gb$sr@?%Vhp7AVmXsR_O1mv z`-8uN_kRb#CNeQ6Iw$^iyHE^u)%Sjp6z_~94D#tw6To!&;p&MF!if=%iAj0+0d4u2 zA^Fh_@u?=ssP}J0>F9(aP_!p`ztrFx3xIfPu&&&pOVI!+t8kE)GORvJn7?wESQ{kz$=xeG4gso3vp1eA^o*cc zW&+7iaJzVN>=RnuwMBmNVhd)$M$|P$oIr^sLn9+ai_Iu2vCIOml~E@pB5+l}^k#d7 zXOU{^PX9*sn@HJ)$>}Q47RnT*0i4|t?h~}i|Rq-BXd%#pFQyNhyRdaV| z$(w<11>ALDbR;W*jC0)AJKT}n(4OVt?D2mhaZ5lmjj)_XDk{n1BG+iw9g%DT^Bg6> z?;qiuzVn*V^E{isdB3Z1gyIVvs`dCp3e^CDP2u<`)xW2}a=NOCf51wV03?6FNe$0O zuq?>97K{7R^88Rgp@36hT#(*WQwp6|hF-W$1gu%%RoY?*aR(tbKr!9sgc@N*20(jC z!!pevs9S|jT1M0-yzM!;<#?F5hVwF+v+tYMOo*Hq+3waMiT(l}I^R zG(=i5W?XXNUII!lncFX^d1%H&E^TBj{p!|qp44>NTynM7;(S|5258wdFF6S;`%7#6 zG}m%KiuOy<3aHTv>|Xxqs?|I)Rk69nD(QIbLQin3l51(P@8;An@ z1Pc7C0{Xl{_R|dggwjcP5NxAgO-j*;P}WI(SV@!6N&J9K+U(AZ0cIgZr+%!&Z?0xO z=%kkb3ZM}S7grM`bTbuJod$H$zU!9f0E;D7OG^scQXBeFT=q9IzYR7el06o~D&~{4B&SAao zL%m*T{r+L~a+;07?|nlh>;6U?U7LD)Asc-qYBl8>ZCKjFHS3*+8zUcjGf3*QzIt=R z8^aPmMjkd6Q}k5@B4#D@=NC6tFE>Cv&6_hhz&BRFpb9hxDg=%)gs>HcM*g5*Jj88- zxcUl=!*!Spcc|2tdwM_0S~mYjm-+@497Ofj`Q+ARH^#q1sB0{PN|Gc`_0Ok?Pm!?(8tyr)^9@r;uFJM=bVKl8E*zM__@6BZOdc zsobr;Hg$k7`<5FiLiGnnaUU!dC~9D)RYFhTchGNdCPF6B$_mfx0YN?%WV>6HkslRy z(#1-4_%~udO(ujvI)Ro2>I#+M$SUs@9rB&-Q1^GX)hV>XbCAkSl933al@Ek9gRCBv zh50W61r|t5-GUOGn6{aHE4m{q!7Tj(XkM^FYL?&<&%=zblR*5D!)J#6Sn#nGgzYX$ z9A0=wK8~Zsagt6Ae|iFKIYb>dRy}wW!~i!R~ZvvjGMja}4)K*rW)qYFNw~AsJOxTP^DB=E2jcZY7alW4pIXa5S zw24%=5|U{ED57g^S+Yfs=xXJWy9&s0d4xsbfocgo=$5>=4d_8kfOF=CH3ZtA$X<+5 z#gDBc*8-y)Q7=M;zmGrK-S3!eJ|FPt!gm>*PfObOI^sFZ8zuez;_~fe6)#tr5LW{; z{**!+YQwwHn1a?G?e`qm;0PZy}7uC+_2mE2xF30CsZ-5JU|aTSWl70 z`P8dR&4}e$q|DNy&e(GNy{lX7XhzB`P$4pq`Pk3ko~ zTOmeZOK&jORWn#rH!&AWS71_((E&u0OxK~;M^NF{<&Fs-zoQ;vuMsRG3TH0hrK}L2 z9Fs|ag_;ggsh22RH_;v!~fUv8kJTgv5dvhpN)L#Ngb0OhgMmF6i6 zwNr|u8Hi2lj$_1;MeB~!{f;aA?#l(pQ+CJOddD|%$G?0haC|5Dbp6N8eJ&lzbN&%1&x0}nnEbr#C)3W4>fhJI%TeRE3W#r55pY~I@1p|ZB*ol-S(9Z zhum&=YHs&dk7i|ucfdz~4>ubJ5o^Q8gYrjP=D5s6TFKJNGzi)(T?)=#ct?i{8YLuG zB}JE3cz2pw#MdVs| z4^RlPM`)aTSei$8uZgX#$gEBEK^w*p8RrC@o5V3f{P8n0A!iKNKoaqb7}HCPP)%xD zWL&ssLhW86>+%75=uLwY=bsn<8PDA5=ZI0y?KMv~0~S8MdwWNNQ`uGiAM1Jxj} zQmI$!V0y?qawz%>%0l;KFvFTW7O?YI@9oGssr(x1H-gZoMB%pwB5xfUZ#S)uYNfZf zyf<_q@6K@V->@#*9;e%``<}%EhPH;di$3HL9T-XAxvV|c(hJEsAN19nW6Q1 z+o&&)9Os({_f79G3=vl}gHDOjKq@1-=EO6x-4kN&w1yQ1RM3kZ*De&WBEHvW3)_`7lf}yrwcWv(>>iLPl4M- zO77YpuYDK2(?asw?>uie*Q8lx%(I_fyUms}-iOx5hQ1Tf&v71C2{?xS0Q`FZ|F*}i zlEBl);FxRqj947&&za!0FiKvRe1A+`U_lrm+p{r{T+w~g4^@^sJ`%^`WFw4dfQBrB zLokHQm#1O0DC%1f;2@eR)qP(`^2$Rxj+u$pG~)X$Y)LZXtA}|!NO6tEn09NzbcPQS zPIW{%yys~{wVftE7TxAd__DllBdpg57XdFGjxC-H z^xl7>WoG4BR^8-eVk^*gHeOZR2Sd(KJ&f#fQPUpTa4yvS`D#%&C`xNzv&fWX-?$-o zei^f)npNGrVsp;WR9YET-LTBoX|Hl4O9%LhlUS;鲭_}nv4usFRm*e%7Z_k;{ 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 D-5Hl=@1<>R2r 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%0A?Bc?H5}6-O|9ul|R3q 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 zⅆAyh1T{pgU>cAi1BbmcoP zyrBRTuoJq0)Da<$0~5=5StNmO;fQbO#cL9R0F3pYp8Oh(9bg33SOew}9;^yOxCGHQ|KHP1_8%!7ILMj>h{IG?y=3z6aWf zEBK;WtI|qQL7KANVg*w?ooPI^Wfq?5u^OAV*}7vH`H@$N(sEC-m~@gI*f_FtnPTna zbbjn|*hspiyA|vHqNj-VQM|Jiha$;BKu<($lWp9J=FG|i$jNJzB)`m$)VlyabU%RY zo}W~)Ly~9%Fwu@c(Tc2qOb948111KFUWrq92ANipCt`~+lo7EK))p*wcpu%fq2E%?M69p0(QTy`$Ns7;T>L{QxV2Ge(X4dpi}zAyObYJY+Rie^6%i*X~| zW%f*jHT`Dko2QDLf@2mV{seqL`aAznu=m8@QAX@Y_HRf+i#AL=k*(3XYVF=E^|(1B zBo7*G!eTmc?EO@;Y1f}M&lGUnr3_bBxpGai#Pfos5>0v$3iI#h7GMd9x}!DoL@J_C4V7lAy+E3uPSj46<6GLzwQ@xz&SjnV6z^NAS3>ei`^Spwj5YM^Vg zS%ns7kshz=5@c+&BYI|?OAN7;qD$=4s24Vt>o z

    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

    hs1X-&+ut#~M9XuPn; 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 z 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

      +i!OA>uL12f6=RL#!PD91iBKQC5N=_coFlm@P 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

      P!Qul5s>|p+B4f6k#5D{40&W#_6bge+1k+U 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≫@WG;uw8NdY@1>`(HX4kT_T7{J{i!^?3WYDCUf{ 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 p14zsfN_+zV{@2m--* BADGE_SHINTO) revert INVALID_BADGE_ID(); + + uint256 tokenId = totalSupply() + 1; + badges[tokenId] = _badgeId; + + _mint(_minter, tokenId); + + emit BadgeCreated(tokenId, _minter, _badgeId); + } + + function call() public view returns (bool) { + return true; + } +} diff --git a/packages/protocol/.env.example b/packages/protocol/.env.example index 093b2fdede0..fa0fd36a446 100644 --- a/packages/protocol/.env.example +++ b/packages/protocol/.env.example @@ -1,4 +1,4 @@ ETHERSCAN_API_KEY=ABC123ABC123ABC123ABC123ABC123ABC1 PRIVATE_KEY=0xabc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1 LOG_LEVEL=DEBUG -REPORT_GAS=true \ No newline at end of file +REPORT_GAS=true diff --git a/packages/protocol/.eslintignore b/packages/protocol/.eslintignore index dcb9ae39eee..1ed07294289 100644 --- a/packages/protocol/.eslintignore +++ b/packages/protocol/.eslintignore @@ -3,4 +3,6 @@ artifacts cache coverage lib -contracts/automata-attestation/ \ No newline at end of file +test/shared/thirdparty/ +contracts/layer1/automata-attestation/ +monitors/ \ No newline at end of file diff --git a/packages/protocol/.gitignore b/packages/protocol/.gitignore index a8640e16fc1..d413d569ab2 100644 --- a/packages/protocol/.gitignore +++ b/packages/protocol/.gitignore @@ -14,6 +14,7 @@ yarn-error.log* package-lock.json npm-debug.log* typechain-types +test/genesis/generate/data # Hardhat files cache @@ -33,3 +34,17 @@ broadcast lcov.info simulation/out/ +test/genesis/data/genesis.json +test/genesis/data/genesis_alloc.json +test/genesis/data/genesis_storage_layout.json + +# Serverless directories +.serverless +jspm_packages + +*.log +.DS_Store + +secrets*.yml +.defender +.platform diff --git a/packages/protocol/.solhint.json b/packages/protocol/.solhint.json index 047afd0e5b4..43f67a418ae 100644 --- a/packages/protocol/.solhint.json +++ b/packages/protocol/.solhint.json @@ -3,7 +3,7 @@ "rules": { "avoid-low-level-calls": "off", "avoid-tx-origin": "off", - "compiler-version": ["error", "0.8.24"], + "compiler-version": ["error", "^0.8.24"], "func-name-mixedcase": "off", "func-visibility": ["error", { "ignoreConstructors": true }], "max-line-length": ["error", 120], @@ -13,6 +13,8 @@ "no-global-import": "off", "no-inline-assembly": "off", "not-rely-on-time": "off", + "gas-custom-errors": "off", + "immutable-vars-naming": "off", "one-contract-per-file": "off" } } diff --git a/packages/protocol/.solhintignore b/packages/protocol/.solhintignore index b98f25593a5..fa784518089 100644 --- a/packages/protocol/.solhintignore +++ b/packages/protocol/.solhintignore @@ -1,7 +1,6 @@ node_modules/ lib/ -contracts/test/TestLibRLPReader.sol -**/contracts/thirdparty/**/*.sol -/contracts/automata-attestation/ -test/GasComparison.t.sol -test/TestLn.sol \ No newline at end of file +contracts/layer1/automata-attestation/ +contracts/layer1/preconf/avs-mvp/ +contracts/layer1/preconf/libs/LibBLS12381.sol +test/shared/thirdparty/ diff --git a/packages/protocol/CHANGELOG.md b/packages/protocol/CHANGELOG.md index 9c9146d0348..08063e60cbb 100644 --- a/packages/protocol/CHANGELOG.md +++ b/packages/protocol/CHANGELOG.md @@ -1,5 +1,597 @@ # Changelog +## [1.11.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-alethia-protocol-v1.10.0...taiko-alethia-protocol-v1.11.0) (2025-01-03) + + +### Features + +* **protocol:** add `DevnetTaikoL1` ([#17900](https://github.com/taikoxyz/taiko-mono/issues/17900)) ([d864cea](https://github.com/taikoxyz/taiko-mono/commit/d864cea2eb8346127992acfbd9012e675a3400cc)) +* **protocol:** add `lastProposedIn` to slotB ([#18379](https://github.com/taikoxyz/taiko-mono/issues/18379)) ([96b380a](https://github.com/taikoxyz/taiko-mono/commit/96b380a452f1055da960146b4bf1e94c1842da73)) +* **protocol:** add `proposeBlocksV2` method to `ProverSet` ([#18115](https://github.com/taikoxyz/taiko-mono/issues/18115)) ([0743a99](https://github.com/taikoxyz/taiko-mono/commit/0743a99ee6ab403024bab5834178399fbeebb4e5)) +* **protocol:** add `proveBlocks` method to `ProverSet` ([#18025](https://github.com/taikoxyz/taiko-mono/issues/18025)) ([36a2ae5](https://github.com/taikoxyz/taiko-mono/commit/36a2ae51c21a2359179755457a8933a346ccd8b3)) +* **protocol:** add `proveBlocks` to TaikoL1.sol ([fe687b3](https://github.com/taikoxyz/taiko-mono/commit/fe687b378fcb440184fd423088432dc63cf5989e)) +* **protocol:** add `TIER_ZKVM_RISC0` tier and `HeklaTierProvider` ([#17913](https://github.com/taikoxyz/taiko-mono/issues/17913)) ([64ed666](https://github.com/taikoxyz/taiko-mono/commit/64ed66628a18cb1b3fff2c4ab5d3c0149288dfe6)) +* **protocol:** add a batch proposing block function ([#17864](https://github.com/taikoxyz/taiko-mono/issues/17864)) ([3649785](https://github.com/taikoxyz/taiko-mono/commit/36497857dd3d5edb718a5cb0057327f3cde39c02)) +* **protocol:** add aggregated sgx verify test ([#18160](https://github.com/taikoxyz/taiko-mono/issues/18160)) ([8dda47b](https://github.com/taikoxyz/taiko-mono/commit/8dda47bf9ee47faa8a0d16dde0b4398d5e7019f8)) +* **protocol:** add ComposeVerifier, TeeAnyVerifier, and ZkAnyVerifier ([ee464ca](https://github.com/taikoxyz/taiko-mono/commit/ee464caef68fdec325aa22758bb69e17dd039794)) +* **protocol:** add Hekla Ontake hardfork upgrade scripts ([#18103](https://github.com/taikoxyz/taiko-mono/issues/18103)) ([a3436e8](https://github.com/taikoxyz/taiko-mono/commit/a3436e8cafbc96ebfa5742ada995adae39c572ce)) +* **protocol:** add preconfirmation support based on https://github.com/taikoxyz/taiko-mono/pull/17654 (with some renaming) (https://github.com/taikoxyz/taiko-mono/issues/14793) ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** add proposeBlock2 in TaikoL1.sol and approve2 in GuardianProver.sol ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** add proposer address to getMinTier func ([#17919](https://github.com/taikoxyz/taiko-mono/issues/17919)) ([d6ea6f3](https://github.com/taikoxyz/taiko-mono/commit/d6ea6f33d6bf54cba3bd6ab153e38d09abf19912)) +* **protocol:** add SP1 verification support ([#17861](https://github.com/taikoxyz/taiko-mono/issues/17861)) ([2936312](https://github.com/taikoxyz/taiko-mono/commit/29363123233f9d2d749eb626095d0c645801e384)) +* **protocol:** adjust gas excess once the gas target has changed ([a1e217e](https://github.com/taikoxyz/taiko-mono/commit/a1e217e457546d63a89da0b02135b3b63b22d19e)) +* **protocol:** adjust the zk ratio(risc0 & sp1) ([#18613](https://github.com/taikoxyz/taiko-mono/issues/18613)) ([431435e](https://github.com/taikoxyz/taiko-mono/commit/431435e6e74799caea94f53438238c63831cf07c)) +* **protocol:** adjust zk(risc0 & sp1) ratio ([#18684](https://github.com/taikoxyz/taiko-mono/issues/18684)) ([a0c21a3](https://github.com/taikoxyz/taiko-mono/commit/a0c21a382c779de54b119a6f9b2d5cd869f47f1d)) +* **protocol:** allow `local.params.parentMetaHash` to remain as 0 ([#18451](https://github.com/taikoxyz/taiko-mono/issues/18451)) ([94185fe](https://github.com/taikoxyz/taiko-mono/commit/94185feb207b9a2e74fb05a4898d25ce2008f826)) +* **protocol:** allow a grace period (4h) to defer proof submission to reduce cost ([fe687b3](https://github.com/taikoxyz/taiko-mono/commit/fe687b378fcb440184fd423088432dc63cf5989e)) +* **protocol:** allow any address to withdraw token to the recipient address ([#17843](https://github.com/taikoxyz/taiko-mono/issues/17843)) ([3d89d24](https://github.com/taikoxyz/taiko-mono/commit/3d89d24b14fea7b9e59659e689c3011fbcf4b852)) +* **protocol:** allow any ERC20 tokens or Ether to be used as bonds ([#18380](https://github.com/taikoxyz/taiko-mono/issues/18380)) ([1920521](https://github.com/taikoxyz/taiko-mono/commit/1920521a2478d1e31745742f1ddbb296cdd98f6f)) +* **protocol:** allow contract proposers to use calldata for DA ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** allow msg.sender to customize block proposer addresses ([#18048](https://github.com/taikoxyz/taiko-mono/issues/18048)) ([22055cc](https://github.com/taikoxyz/taiko-mono/commit/22055cc95e51d07b6b57ab5cb2e4ccd9a97d594a)) +* **protocol:** allow owner to update recipient in TokenUnlock ([#18184](https://github.com/taikoxyz/taiko-mono/issues/18184)) ([773ae1b](https://github.com/taikoxyz/taiko-mono/commit/773ae1b11f309ee8c4e0b1c0d22b9bfa41beae0d)) +* **protocol:** change HeklaTaikoToken's clock mode to timestamp to test the DAO ([#18597](https://github.com/taikoxyz/taiko-mono/issues/18597)) ([ccc9500](https://github.com/taikoxyz/taiko-mono/commit/ccc9500d861d5cc666f038ddb8ceed00a353ee94)) +* **protocol:** check-in `HeklaTaikoToken` ([#18189](https://github.com/taikoxyz/taiko-mono/issues/18189)) ([60c38d8](https://github.com/taikoxyz/taiko-mono/commit/60c38d8d179f2c02a0ed87f97bd34dc708b38df4)) +* **protocol:** decrease the rate of risc0 in Hekla ([#18553](https://github.com/taikoxyz/taiko-mono/issues/18553)) ([57d20db](https://github.com/taikoxyz/taiko-mono/commit/57d20db59ffa23f7038ad80a4322634cc71251ea)) +* **protocol:** enable sp1 batch aggregation ([#18199](https://github.com/taikoxyz/taiko-mono/issues/18199)) ([038cd32](https://github.com/taikoxyz/taiko-mono/commit/038cd326668b3a882798ecb4e7f9e3ecadc6dc28)) +* **protocol:** improve `getTransitions` ([#18181](https://github.com/taikoxyz/taiko-mono/issues/18181)) ([868d733](https://github.com/taikoxyz/taiko-mono/commit/868d733db962a76261036c3e583cb50feaec901f)) +* **protocol:** improve L2 basefee calculation ([920bd68](https://github.com/taikoxyz/taiko-mono/commit/920bd6873d3e9e1bbb00751fb9c0056ac85b8554)) +* **protocol:** increase risc0 frequency in Hekla ([#18407](https://github.com/taikoxyz/taiko-mono/issues/18407)) ([350264c](https://github.com/taikoxyz/taiko-mono/commit/350264c98d6a96ea11d5b1cef684a81605d3826b)) +* **protocol:** Increase the probability of sgx proof for lab proposer ([#18288](https://github.com/taikoxyz/taiko-mono/issues/18288)) ([fd0dbbb](https://github.com/taikoxyz/taiko-mono/commit/fd0dbbbb3df0db27873e0ba87e45a5165fb7c0f1)) +* **protocol:** increase zk(risc0 & sp1) rate in mainnet ([#18481](https://github.com/taikoxyz/taiko-mono/issues/18481)) ([f24a908](https://github.com/taikoxyz/taiko-mono/commit/f24a908e60c062ad789a34765de5a1037bdb1ff0)) +* **protocol:** introduce `getTransitions` in TaikoL1 ([#18154](https://github.com/taikoxyz/taiko-mono/issues/18154)) ([273bf53](https://github.com/taikoxyz/taiko-mono/commit/273bf53fad763b8504353e7cc14c8585e341f9d0)) +* **protocol:** introduce ForkManager to improve protocol fork management ([#18508](https://github.com/taikoxyz/taiko-mono/issues/18508)) ([ff5c196](https://github.com/taikoxyz/taiko-mono/commit/ff5c1964a303e21dfeb87f8f9c01fc82ef43a03e)) +* **protocol:** introduce risc0 proof ([#17877](https://github.com/taikoxyz/taiko-mono/issues/17877)) ([bcb57cb](https://github.com/taikoxyz/taiko-mono/commit/bcb57cb81d12d0c09656582ad9140b38015b3a58)) +* **protocol:** make `TaikoL2Deprecated` ABI go-ethereum compatible ([#18659](https://github.com/taikoxyz/taiko-mono/issues/18659)) ([05594cf](https://github.com/taikoxyz/taiko-mono/commit/05594cfe6fd188573f9db2de4e1f039ea7317c9b)) +* **protocol:** make sure `init()` covers logics in `init2()`, `init3()`.. ([#18292](https://github.com/taikoxyz/taiko-mono/issues/18292)) ([9d06958](https://github.com/taikoxyz/taiko-mono/commit/9d06958e713e530fdd610c439c7b93199d0dcc69)) +* **protocol:** measure gas per block using a debug event ([#18470](https://github.com/taikoxyz/taiko-mono/issues/18470)) ([e84e472](https://github.com/taikoxyz/taiko-mono/commit/e84e472e4a0479301d5ce1d4268d964705dcbbd0)) +* **protocol:** propose a batch blocks conditionally ([#18570](https://github.com/taikoxyz/taiko-mono/issues/18570)) ([e846f62](https://github.com/taikoxyz/taiko-mono/commit/e846f6289fea0b046ddcfcdfaf46f3727efbdf11)) +* **protocol:** protocol monitors ([#18002](https://github.com/taikoxyz/taiko-mono/issues/18002)) ([45b2087](https://github.com/taikoxyz/taiko-mono/commit/45b2087495d4f9e20083ebe2c61ecfe8d252e4b2)) +* **protocol:** relocate L2 base fee parameters to L1 configuration ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** rename B_BLOCK_PROPOSER to B_PRECONF_REGISTRY ([#18255](https://github.com/taikoxyz/taiko-mono/issues/18255)) ([bf3caf7](https://github.com/taikoxyz/taiko-mono/commit/bf3caf7d986d7b03cf3bd0aa69ea97602bff80aa)) +* **protocol:** request zk proofs(risc0 & sp1) in mainnet ([#18467](https://github.com/taikoxyz/taiko-mono/issues/18467)) ([1fab427](https://github.com/taikoxyz/taiko-mono/commit/1fab427005708036c981f2b8fb47d9aa408e0d94)) +* **protocol:** return verification timestamp in getLastVerifiedBlock ([#17868](https://github.com/taikoxyz/taiko-mono/issues/17868)) ([1998288](https://github.com/taikoxyz/taiko-mono/commit/19982889f7f4c073d182a6076633c5e2c892c73a)) +* **protocol:** revert removing time as input for L2 base fee calculation ([a1e217e](https://github.com/taikoxyz/taiko-mono/commit/a1e217e457546d63a89da0b02135b3b63b22d19e)) +* **protocol:** script of `UpgradeRisc0Verifier` ([#17949](https://github.com/taikoxyz/taiko-mono/issues/17949)) ([fc12e04](https://github.com/taikoxyz/taiko-mono/commit/fc12e040c391e0f37c906b270743d3b57710f69d)) +* **protocol:** scripts to deploy new mainnet implementation contracts ([#18356](https://github.com/taikoxyz/taiko-mono/issues/18356)) ([269759b](https://github.com/taikoxyz/taiko-mono/commit/269759bccefba399f0aa6f45482f4a24330a5e47)) +* **protocol:** support backward-compatible batch-proof verification ([#17968](https://github.com/taikoxyz/taiko-mono/issues/17968)) ([c476aab](https://github.com/taikoxyz/taiko-mono/commit/c476aabe130d151f5678cd35fab99f258997f629)) +* **protocol:** tolerate invalid BaseFeeConfig on L2 ([#18338](https://github.com/taikoxyz/taiko-mono/issues/18338)) ([f9f5d15](https://github.com/taikoxyz/taiko-mono/commit/f9f5d156f9fef622d921f6e007ecb43ded0130ad)) +* **protocol:** update `B_TIER_ROUTER` in `RollupAddressCache` ([#18370](https://github.com/taikoxyz/taiko-mono/issues/18370)) ([9748ae5](https://github.com/taikoxyz/taiko-mono/commit/9748ae527a75124f8674bb66280b9161ce79d046)) +* **protocol:** update `HeklaTierProvider` to introduce sp1 proof ([#18022](https://github.com/taikoxyz/taiko-mono/issues/18022)) ([76b6514](https://github.com/taikoxyz/taiko-mono/commit/76b6514fd42ba7fa2124b44443728fa32304c324)) +* **protocol:** update `ontakeForkHeight` to Sep 24, 2024 ([#18046](https://github.com/taikoxyz/taiko-mono/issues/18046)) ([30c9316](https://github.com/taikoxyz/taiko-mono/commit/30c9316aea083d187617f5342fb4a955e604226b)) +* **protocol:** update `RollupAddressCache` with new `MainnetTierRouter` address ([#18619](https://github.com/taikoxyz/taiko-mono/issues/18619)) ([b2ca63c](https://github.com/taikoxyz/taiko-mono/commit/b2ca63cd4ed7eca385c317d9a6ade794bf156c79)) +* **protocol:** update Hekla `ontakeForkHeight` ([#17983](https://github.com/taikoxyz/taiko-mono/issues/17983)) ([8819e3a](https://github.com/taikoxyz/taiko-mono/commit/8819e3a5a59675dcc6a1f333620ce6e75b7d2887)) +* **protocol:** update mainnet `ontakeForkHeight` config ([#18252](https://github.com/taikoxyz/taiko-mono/issues/18252)) ([7550882](https://github.com/taikoxyz/taiko-mono/commit/75508828d3755e1a831380cdd2ab321e67fa22fc)) +* **protocol:** update ric0 & sp1 verification contract ([#18269](https://github.com/taikoxyz/taiko-mono/issues/18269)) ([684a909](https://github.com/taikoxyz/taiko-mono/commit/684a909e83705c59b2b7a0a991424b7a8e9e03ad)) +* **protocol:** update script of deploying sp1 ([#18019](https://github.com/taikoxyz/taiko-mono/issues/18019)) ([9464967](https://github.com/taikoxyz/taiko-mono/commit/94649671bdf0304d96bf83d7d18dcbe21eff6067)) +* **protocol:** update sp1 contracts ([#18097](https://github.com/taikoxyz/taiko-mono/issues/18097)) ([6f26434](https://github.com/taikoxyz/taiko-mono/commit/6f264342fe48f8d193559ac0712cc875d643b6fd)) +* **protocol:** update sp1 to 3.0.0 prod version ([#18465](https://github.com/taikoxyz/taiko-mono/issues/18465)) ([0b11101](https://github.com/taikoxyz/taiko-mono/commit/0b1110159201f94ff5a4df528eab60b306d4fb25)) +* **protocol:** upgrade script ([#18334](https://github.com/taikoxyz/taiko-mono/issues/18334)) ([2c41dd1](https://github.com/taikoxyz/taiko-mono/commit/2c41dd10989566c1b6af691c92ab2cbde734a13a)) +* **protocol:** use SP1 1.2.0-rc with more proof verification tests ([#18001](https://github.com/taikoxyz/taiko-mono/issues/18001)) ([f7bcf1d](https://github.com/taikoxyz/taiko-mono/commit/f7bcf1d63d19b641ac6b9e0e972a7f6e2ec5b38f)) +* **protocol:** user smaller cooldown windows ([#18345](https://github.com/taikoxyz/taiko-mono/issues/18345)) ([63455f9](https://github.com/taikoxyz/taiko-mono/commit/63455f91d202d88583d70bce69e799032523eb18)) + + +### Bug Fixes + +* **protocl:** check blockId in getBlock and getBlockV2 ([#18327](https://github.com/taikoxyz/taiko-mono/issues/18327)) ([4288fb6](https://github.com/taikoxyz/taiko-mono/commit/4288fb6e0c8c76651d2db866cab55f32a9a25075)) +* **protocol:** add timestamp as a new parameter to getBasefeeV2 ([#18686](https://github.com/taikoxyz/taiko-mono/issues/18686)) ([361c26a](https://github.com/taikoxyz/taiko-mono/commit/361c26adc62a6358c4d38c6a4d707274c84d7552)) +* **protocol:** avoid invocation in Bridge message processing if calldata is "" and value is 0 ([#18137](https://github.com/taikoxyz/taiko-mono/issues/18137)) ([10c2972](https://github.com/taikoxyz/taiko-mono/commit/10c29727081bd8f8b94bbfc4472b162ec552ef64)) +* **protocol:** correct the wrong router address for mainnet ([#18291](https://github.com/taikoxyz/taiko-mono/issues/18291)) ([ae0a9da](https://github.com/taikoxyz/taiko-mono/commit/ae0a9daf83ab8f323c216978724ebcb71de54cfe)) +* **protocol:** fix `chainId` in `HeklaTaikoL1` ([#17912](https://github.com/taikoxyz/taiko-mono/issues/17912)) ([8f31dd0](https://github.com/taikoxyz/taiko-mono/commit/8f31dd0ed519809f0ea0797b1e6b5937ee087108)) +* **protocol:** fix a new bug in LibProposing ([#18328](https://github.com/taikoxyz/taiko-mono/issues/18328)) ([7436bae](https://github.com/taikoxyz/taiko-mono/commit/7436bae9660cfcf1d430ca111df8c75d50908eae)) +* **protocol:** fix an issue in same transition check ([#18254](https://github.com/taikoxyz/taiko-mono/issues/18254)) ([233806e](https://github.com/taikoxyz/taiko-mono/commit/233806e4838aa12e8de436a37979ff3e614119f2)) +* **protocol:** fix BridgedERC20V2.sol initializer logic ([#17823](https://github.com/taikoxyz/taiko-mono/issues/17823)) ([d538d99](https://github.com/taikoxyz/taiko-mono/commit/d538d99f9542852821d958008d913c028629bbef)) +* **protocol:** fix bug in adjustExcess ([920bd68](https://github.com/taikoxyz/taiko-mono/commit/920bd6873d3e9e1bbb00751fb9c0056ac85b8554)) +* **protocol:** fix DCAP configuration script ([#18088](https://github.com/taikoxyz/taiko-mono/issues/18088)) ([e8618c5](https://github.com/taikoxyz/taiko-mono/commit/e8618c54a58993499e852ec2ffc2468d4f0274ba)) +* **protocol:** fix debitBond bug and add additional tests ([#18443](https://github.com/taikoxyz/taiko-mono/issues/18443)) ([75ff1f8](https://github.com/taikoxyz/taiko-mono/commit/75ff1f87412c763e6ed3431d13689a629a2dd668)) +* **protocol:** fix issue in mainnet deployment script ([#18283](https://github.com/taikoxyz/taiko-mono/issues/18283)) ([5c371a1](https://github.com/taikoxyz/taiko-mono/commit/5c371a181af444999f611e03774ec096ffbd1226)) +* **protocol:** fix LibAddress.supportsInterface to handle undecodeable return data ([#18286](https://github.com/taikoxyz/taiko-mono/issues/18286)) ([299b4c9](https://github.com/taikoxyz/taiko-mono/commit/299b4c9ecf96644c909df70a3527ae5c2e728a07)) +* **protocol:** fix permission in ComposeVerifier ([#18302](https://github.com/taikoxyz/taiko-mono/issues/18302)) ([4c45d8b](https://github.com/taikoxyz/taiko-mono/commit/4c45d8bcdb52521ac1738ca271316d82689537b0)) +* **protocol:** fix proposeBlock()'s block id check ([#18227](https://github.com/taikoxyz/taiko-mono/issues/18227)) ([3a9d6c1](https://github.com/taikoxyz/taiko-mono/commit/3a9d6c166b7c6666eb2515893b6a3fbd00f4b1ea)) +* **protocol:** fix test related to SendMessageToDelegateOwner.s.sol ([#18300](https://github.com/taikoxyz/taiko-mono/issues/18300)) ([65daa3e](https://github.com/taikoxyz/taiko-mono/commit/65daa3e631b471d17dbffb1001dab66efa67c499)) +* **protocol:** fix tier id conflicts ([#18004](https://github.com/taikoxyz/taiko-mono/issues/18004)) ([0df1ad4](https://github.com/taikoxyz/taiko-mono/commit/0df1ad4274e6ebc3db79acbbdaedbe2d519262d6)) +* **protocol:** fix wrong Bridged ERC20 address cache ([#18287](https://github.com/taikoxyz/taiko-mono/issues/18287)) ([49267ab](https://github.com/taikoxyz/taiko-mono/commit/49267abaa6d27d16fe4fb62ca0bb28d49b09d2f9)) +* **protocol:** make sure new instance is not zero address in SgxVerifier ([#17918](https://github.com/taikoxyz/taiko-mono/issues/17918)) ([d559ce8](https://github.com/taikoxyz/taiko-mono/commit/d559ce80c1314e9ddbe02798f1c61a2e8349da6e)) +* **protocol:** revert `B_TIER_OPTIMISTIC` back to `""` ([#18446](https://github.com/taikoxyz/taiko-mono/issues/18446)) ([9549e7f](https://github.com/taikoxyz/taiko-mono/commit/9549e7f3e899b22ff8c9ff7d731aa3ce250fd071)) +* **protocol:** revert a change to maintain taiko-geth compatibility ([#18331](https://github.com/taikoxyz/taiko-mono/issues/18331)) ([9d18d59](https://github.com/taikoxyz/taiko-mono/commit/9d18d598fe3e890a1f35e2d39916d554282ee4a0)) +* **protocol:** revert changes related to `proposedIn` and `proposedAt` to fix a bug ([#18333](https://github.com/taikoxyz/taiko-mono/issues/18333)) ([5cb43ab](https://github.com/taikoxyz/taiko-mono/commit/5cb43ab1e29422353de549f8386eff613291c7df)) +* **protocol:** reward non-assigned prover 7/8 liveness bond ([#18132](https://github.com/taikoxyz/taiko-mono/issues/18132)) ([9f99099](https://github.com/taikoxyz/taiko-mono/commit/9f99099ac271e6e2a0973a43084e29169386f2cd)) +* **protocol:** small fix to 1559 error check ([#18339](https://github.com/taikoxyz/taiko-mono/issues/18339)) ([4428661](https://github.com/taikoxyz/taiko-mono/commit/44286615a0e0b0a17892fe83aad96546a6b1aca1)) +* **protocol:** use block header's extraData for `basefeeSharingPctg` ([#17889](https://github.com/taikoxyz/taiko-mono/issues/17889)) ([5f3cbc9](https://github.com/taikoxyz/taiko-mono/commit/5f3cbc97cbe2636314c4a2945fdf01ef641702e7)) + + +### Chores + +* **docs:** redirect the contribution.md path ([#18316](https://github.com/taikoxyz/taiko-mono/issues/18316)) ([0607ef7](https://github.com/taikoxyz/taiko-mono/commit/0607ef718dbe34c0ffe125825b12001b36a43fc5)) +* **main:** fix misspelled ([#18581](https://github.com/taikoxyz/taiko-mono/issues/18581)) ([3687c4e](https://github.com/taikoxyz/taiko-mono/commit/3687c4e060b4b316fb185c649e9b089b97d53eda)) +* **main:** release protocol 1.10.0 ([#18077](https://github.com/taikoxyz/taiko-mono/issues/18077)) ([3d12cb2](https://github.com/taikoxyz/taiko-mono/commit/3d12cb24b16c7eede1930b928408c1462134f5a7)) +* **main:** release protocol 1.10.0 ([#18365](https://github.com/taikoxyz/taiko-mono/issues/18365)) ([9345f14](https://github.com/taikoxyz/taiko-mono/commit/9345f1419a1e5d0f975e15bb372b6101da9f0c48)) +* **main:** release protocol 1.11.0 ([#18433](https://github.com/taikoxyz/taiko-mono/issues/18433)) ([75359cc](https://github.com/taikoxyz/taiko-mono/commit/75359cc1f76151cdb2e087d0000ad9052f50e3c4)) +* **main:** release protocol 1.9.0 ([#17783](https://github.com/taikoxyz/taiko-mono/issues/17783)) ([7bfd28a](https://github.com/taikoxyz/taiko-mono/commit/7bfd28a2b332c927cd8b6358623551814260f94e)) +* **main:** release protocol 1.9.0 ([#18051](https://github.com/taikoxyz/taiko-mono/issues/18051)) ([2547ba9](https://github.com/taikoxyz/taiko-mono/commit/2547ba9409705bb759b62e59a7e5d5821349c71a)) +* **main:** release protocol 1.9.0 ([#18052](https://github.com/taikoxyz/taiko-mono/issues/18052)) ([bf45889](https://github.com/taikoxyz/taiko-mono/commit/bf45889e18e97f1186cd60fd55e1b2664dc4bf43)) +* **main:** release taiko-alethia-protocol 1.11.0 ([#18663](https://github.com/taikoxyz/taiko-mono/issues/18663)) ([42cd90d](https://github.com/taikoxyz/taiko-mono/commit/42cd90d3f0937b96095076f733f60ca26d3b5751)) +* **protocol:** add functions to ITaikoL1 for Nethermind Preconf ([#18217](https://github.com/taikoxyz/taiko-mono/issues/18217)) ([e349d22](https://github.com/taikoxyz/taiko-mono/commit/e349d2237a1830edab305b2f0eaaeb0eaf3c623f)) +* **protocol:** change bond amounts, proving windows, and cooldown windows ([#18371](https://github.com/taikoxyz/taiko-mono/issues/18371)) ([fac5c16](https://github.com/taikoxyz/taiko-mono/commit/fac5c167357f430cfb030e7ceaa41bb8e4b938d4)) +* **protocol:** change Hekla gas issuance per sec to 100000 ([#18335](https://github.com/taikoxyz/taiko-mono/issues/18335)) ([3d448d4](https://github.com/taikoxyz/taiko-mono/commit/3d448d4a78608ea7daf1d50e877c32f8d30f1e7a)) +* **protocol:** change Hekla sharingPctg to 80% & gasIssuancePerSecond to 1000000 ([#18322](https://github.com/taikoxyz/taiko-mono/issues/18322)) ([75feb5b](https://github.com/taikoxyz/taiko-mono/commit/75feb5b36560b786a54e97280352c0d70c3e2f06)) +* **protocol:** delete gas debug event ([#18620](https://github.com/taikoxyz/taiko-mono/issues/18620)) ([06128e8](https://github.com/taikoxyz/taiko-mono/commit/06128e8f64b7bf2997b70959c78ab256404ebab3)) +* **protocol:** deploy `MainnetTierRouter` and update `RollupAddressCache` ([#18359](https://github.com/taikoxyz/taiko-mono/issues/18359)) ([aa351ab](https://github.com/taikoxyz/taiko-mono/commit/aa351ab0f90e442a8b15adb8de6a48d9ae6d1c42)) +* **protocol:** fix documentation ([#18694](https://github.com/taikoxyz/taiko-mono/issues/18694)) ([c7c01a1](https://github.com/taikoxyz/taiko-mono/commit/c7c01a156e05d9126ba6fab7bd910dfa3602169a)) +* **protocol:** fix lint issue in SP1Verifier ([#18213](https://github.com/taikoxyz/taiko-mono/issues/18213)) ([7874dd3](https://github.com/taikoxyz/taiko-mono/commit/7874dd3ff8a6053da8c09377b52c83e7a506f45f)) +* **protocol:** fix typos in documentation files ([#18490](https://github.com/taikoxyz/taiko-mono/issues/18490)) ([8d1f9ea](https://github.com/taikoxyz/taiko-mono/commit/8d1f9eab8e02b1868f2e24005699a8ed1d2937fa)) +* **protocol:** improve the usage of `initializer` and `reinitializer` ([#18319](https://github.com/taikoxyz/taiko-mono/issues/18319)) ([13cc007](https://github.com/taikoxyz/taiko-mono/commit/13cc0074a2295c5939cf83e23f531cb25c43bd64)) +* **protocol:** make two state variables in TaikoL2.sol public and add `adjustExcess` ([#17891](https://github.com/taikoxyz/taiko-mono/issues/17891)) ([ba21f68](https://github.com/taikoxyz/taiko-mono/commit/ba21f6836845ea0227116b701e701815f210d56d)) +* **protocol:** move two files to simplify folder structure ([#17929](https://github.com/taikoxyz/taiko-mono/issues/17929)) ([9dca4fa](https://github.com/taikoxyz/taiko-mono/commit/9dca4faa43ad938880c8e1ac54236ab292bcce6e)) +* **protocol:** optimize Taiko L1 gas cost ([#18376](https://github.com/taikoxyz/taiko-mono/issues/18376)) ([ea0158f](https://github.com/taikoxyz/taiko-mono/commit/ea0158f0cbaa974f90f9174410c705e6cbdc48aa)) +* **protocol:** re-generate layout files with diff order for comparison with new PR ([#18067](https://github.com/taikoxyz/taiko-mono/issues/18067)) ([078d336](https://github.com/taikoxyz/taiko-mono/commit/078d3367dce86a57d71d48291537e925cb1b4b91)) +* **protocol:** remove `TIER_ZKVM_ANY` in `MainnetTierRouter` ([#18357](https://github.com/taikoxyz/taiko-mono/issues/18357)) ([500a8bb](https://github.com/taikoxyz/taiko-mono/commit/500a8bbc46a3d1962ae5cc6d7f10e990f03d07c7)) +* **protocol:** remove repetitive words in audit report ([#18584](https://github.com/taikoxyz/taiko-mono/issues/18584)) ([8092ee5](https://github.com/taikoxyz/taiko-mono/commit/8092ee56e00ed3e422471a9ed85c42fad6c19a13)) +* **protocol:** restore proving window changes ([#18368](https://github.com/taikoxyz/taiko-mono/issues/18368)) ([9182fba](https://github.com/taikoxyz/taiko-mono/commit/9182fbaf05d309f9827310f3616992c0cc88a22d)) +* **protocol:** revert `TAIKO_TOKEN` name changes in `DeployOnL1` ([#17927](https://github.com/taikoxyz/taiko-mono/issues/17927)) ([cf1a15f](https://github.com/taikoxyz/taiko-mono/commit/cf1a15f46344e60448c5fdcbcae02521fb5b7c04)) +* **protocol:** revert Hekla `baseFeeConfig` updates ([#18340](https://github.com/taikoxyz/taiko-mono/issues/18340)) ([ae8ac3c](https://github.com/taikoxyz/taiko-mono/commit/ae8ac3c2e686b136de8c68853ecb91a39260a93f)) +* **protocol:** revert releasing protocol 1.9.0 ([#17783](https://github.com/taikoxyz/taiko-mono/issues/17783)) ([#18049](https://github.com/taikoxyz/taiko-mono/issues/18049)) ([c033810](https://github.com/taikoxyz/taiko-mono/commit/c033810ecc4c80a4581a95b06ab5127747efd191)) +* **protocol:** set mainnet Ontake fork height ([#18112](https://github.com/taikoxyz/taiko-mono/issues/18112)) ([8812eb2](https://github.com/taikoxyz/taiko-mono/commit/8812eb2a8de367311b8ada6bd3587bfe5efee090)) +* **protocol:** shorten imports in solidity files ([#18221](https://github.com/taikoxyz/taiko-mono/issues/18221)) ([9b2ba6a](https://github.com/taikoxyz/taiko-mono/commit/9b2ba6a2a2fae24d1fb34e23b29b3146e96f575e)) +* **protocol:** undo 1.10.0 release ([#18363](https://github.com/taikoxyz/taiko-mono/issues/18363)) ([116578e](https://github.com/taikoxyz/taiko-mono/commit/116578ef8a4391611bd1b3c469f4068cec8a8447)) +* **protoco:** remove unused delegate owner deployment ([#18290](https://github.com/taikoxyz/taiko-mono/issues/18290)) ([63ba863](https://github.com/taikoxyz/taiko-mono/commit/63ba863dcf322b2cf04d7dcaf6d8905bf28de6bc)) +* **repo:** improve documentation and changelog ([#18489](https://github.com/taikoxyz/taiko-mono/issues/18489)) ([c7b9b4f](https://github.com/taikoxyz/taiko-mono/commit/c7b9b4f01098d4fab337b9ff456ce394cdaf3a79)) + + +### Documentation + +* **protocol:** add L2 `DelegateOwner` address in Hekla deployment docs ([#17925](https://github.com/taikoxyz/taiko-mono/issues/17925)) ([fdec8db](https://github.com/taikoxyz/taiko-mono/commit/fdec8dbe8c8aef21f71c9c4ca2213944880c1a47)) +* **protocol:** add mainnet zkVM verifiers deployment ([#18454](https://github.com/taikoxyz/taiko-mono/issues/18454)) ([3481b68](https://github.com/taikoxyz/taiko-mono/commit/3481b68e8d377c1ae6fc5a1a0e08d8411f94c613)) +* **protocol:** add Ontake fork audit report from OpenZeppelin ([#18491](https://github.com/taikoxyz/taiko-mono/issues/18491)) ([e83adc0](https://github.com/taikoxyz/taiko-mono/commit/e83adc06ac4ce8ebe7e34feaad5691176dba27e2)) +* **protocol:** fix invalid links in docs ([#18144](https://github.com/taikoxyz/taiko-mono/issues/18144)) ([c62f3f6](https://github.com/taikoxyz/taiko-mono/commit/c62f3f6b4a21f3af44f7df908fd8aac198721d5b)) +* **protocol:** update `tier_router` in hekla ([#18352](https://github.com/taikoxyz/taiko-mono/issues/18352)) ([7c91a7d](https://github.com/taikoxyz/taiko-mono/commit/7c91a7d486c22e0f1a5386978086dfca5b73cfe0)) +* **protocol:** update `tier_router`with compatibility modifications ([#18028](https://github.com/taikoxyz/taiko-mono/issues/18028)) ([c43cb0c](https://github.com/taikoxyz/taiko-mono/commit/c43cb0c05f7cbba281076568f4e72033ebbcd0f3)) +* **protocol:** update code4rena-2024-03-taiko-final-report.md ([#18062](https://github.com/taikoxyz/taiko-mono/issues/18062)) ([fd68794](https://github.com/taikoxyz/taiko-mono/commit/fd68794a2de24b7a32d2d5a1c3f52c2156b6d61a)) +* **protocol:** update hekla change log about `tier_router` ([#18023](https://github.com/taikoxyz/taiko-mono/issues/18023)) ([11e27d6](https://github.com/taikoxyz/taiko-mono/commit/11e27d60b3da9a34e07bfafadb8ec3d3223867d2)) +* **protocol:** update hekla change log about sp1 ([#18020](https://github.com/taikoxyz/taiko-mono/issues/18020)) ([434bf3c](https://github.com/taikoxyz/taiko-mono/commit/434bf3ccc1715171b8cd4e7581b282f85744ebe3)) +* **protocol:** update Hekla deployment ([#17845](https://github.com/taikoxyz/taiko-mono/issues/17845)) ([d95cc36](https://github.com/taikoxyz/taiko-mono/commit/d95cc36260ee4bf2aaf69181fa6444f419cc44af)) +* **protocol:** update Hekla deployment ([#17924](https://github.com/taikoxyz/taiko-mono/issues/17924)) ([46a3e00](https://github.com/taikoxyz/taiko-mono/commit/46a3e00659534a715fb315859463bd05bbdb65a9)) +* **protocol:** update Hekla deployments ([#17975](https://github.com/taikoxyz/taiko-mono/issues/17975)) ([c96627f](https://github.com/taikoxyz/taiko-mono/commit/c96627fcdd9ba91f26eeea2b329f0eb96dd36660)) +* **protocol:** update Hekla deployments ([#18152](https://github.com/taikoxyz/taiko-mono/issues/18152)) ([6c7ff61](https://github.com/taikoxyz/taiko-mono/commit/6c7ff617b913b21b8b12b035f0d653c068830de3)) +* **protocol:** update Hekla deployments ([#18257](https://github.com/taikoxyz/taiko-mono/issues/18257)) ([fbb1c82](https://github.com/taikoxyz/taiko-mono/commit/fbb1c824e35adb452176d988f32cf06d0c72b9bf)) +* **protocol:** update Hekla deployments ([#18598](https://github.com/taikoxyz/taiko-mono/issues/18598)) ([a095c69](https://github.com/taikoxyz/taiko-mono/commit/a095c69a240d64606b09a26f2e80ad6daf18c273)) +* **protocol:** update L1 deployment ([#18299](https://github.com/taikoxyz/taiko-mono/issues/18299)) ([f60ce3e](https://github.com/taikoxyz/taiko-mono/commit/f60ce3e78bb9a2717718c3a9d7016346d5305488)) +* **protocol:** update mainnet deployment ([#17846](https://github.com/taikoxyz/taiko-mono/issues/17846)) ([ba6bf94](https://github.com/taikoxyz/taiko-mono/commit/ba6bf942213468310c6233051a90356268dea70f)) +* **protocol:** update mainnet deployment ([#17847](https://github.com/taikoxyz/taiko-mono/issues/17847)) ([92344df](https://github.com/taikoxyz/taiko-mono/commit/92344dfb8c97bae370d722f887fb2c603f96c480)) +* **protocol:** update mainnet deployment ([#18258](https://github.com/taikoxyz/taiko-mono/issues/18258)) ([eeeb4af](https://github.com/taikoxyz/taiko-mono/commit/eeeb4afeff8572115c2cf82db149cee7a723f30c)) +* **protocol:** update mainnet deployment docs ([#18366](https://github.com/taikoxyz/taiko-mono/issues/18366)) ([bbd69ca](https://github.com/taikoxyz/taiko-mono/commit/bbd69ca583257ade30ac9ea2601509af5bc0789a)) +* **protocol:** update mainnet deployment docs ([#18482](https://github.com/taikoxyz/taiko-mono/issues/18482)) ([9da8499](https://github.com/taikoxyz/taiko-mono/commit/9da849989249072e3a03e611b9c08b00295cf42c)) +* **protocol:** update mainnet deployment docs ([#18621](https://github.com/taikoxyz/taiko-mono/issues/18621)) ([eb542bf](https://github.com/taikoxyz/taiko-mono/commit/eb542bf67dea51fd42c0f5c40ee987e5acadc3fd)) +* **protocol:** update mainnet deployment docs ([#18645](https://github.com/taikoxyz/taiko-mono/issues/18645)) ([59d4f10](https://github.com/taikoxyz/taiko-mono/commit/59d4f107edc1aaac5716067634735bad03e75269)) +* **protocol:** upgrade protocol version in hekla to 1.10.0 ([#18343](https://github.com/taikoxyz/taiko-mono/issues/18343)) ([4805024](https://github.com/taikoxyz/taiko-mono/commit/4805024c15ab63bf345dcc5f5868a4a16af0ba48)) +* **protocol:** upgrade sp1 plonk verifier 2.0.0 ([#18098](https://github.com/taikoxyz/taiko-mono/issues/18098)) ([cfd0e9e](https://github.com/taikoxyz/taiko-mono/commit/cfd0e9e4af2e42ead309e0c571b09dd20ddfe0f9)) +* **protocol:** upgrade sp1 remote verifier in Hekla ([#18469](https://github.com/taikoxyz/taiko-mono/issues/18469)) ([051b619](https://github.com/taikoxyz/taiko-mono/commit/051b619c6ce93a09c7e14dd8fafc99681c9261ad)) +* **protocol:** upgrade sp1 verifier in hekla ([#18027](https://github.com/taikoxyz/taiko-mono/issues/18027)) ([de27e6e](https://github.com/taikoxyz/taiko-mono/commit/de27e6e586e14410c309e68ce6b81504b9ba9a5b)) +* **protocol:** upgrade verifiers to support proof aggregation in Hekla ([#18453](https://github.com/taikoxyz/taiko-mono/issues/18453)) ([bfb0386](https://github.com/taikoxyz/taiko-mono/commit/bfb03864ee83ccc3bce989f3e9fd2309eb90c277)) +* **protocol:** upgrade zk verifiers in Hekla ([#18279](https://github.com/taikoxyz/taiko-mono/issues/18279)) ([e98a1d5](https://github.com/taikoxyz/taiko-mono/commit/e98a1d5cdaa14af86340081ee42ad263a41bfdb5)) +* **repo:** improve grammar and readability ([#18501](https://github.com/taikoxyz/taiko-mono/issues/18501)) ([61994ff](https://github.com/taikoxyz/taiko-mono/commit/61994ffefcf29981beb567b84a3a55706300cf13)) + + +### Code Refactoring + +* **protocol:** avoid writing `livenessBond`, `proposedAt`, and `proposedIn` to storage ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** convert metadata from V2 to V1 only once ([#17842](https://github.com/taikoxyz/taiko-mono/issues/17842)) ([55ced31](https://github.com/taikoxyz/taiko-mono/commit/55ced319d68fe40fe82d1c7e0a268735c3545923)) +* **protocol:** delete packages/protocol/contracts/compiled ([#17849](https://github.com/taikoxyz/taiko-mono/issues/17849)) ([1fd907c](https://github.com/taikoxyz/taiko-mono/commit/1fd907cc81807027e730c0e27e258230670522df)) +* **protocol:** extra a new function in LibProposing ([#18456](https://github.com/taikoxyz/taiko-mono/issues/18456)) ([5b4b0cd](https://github.com/taikoxyz/taiko-mono/commit/5b4b0cd271534aa72d865afa5fc55e0ee4b16b73)) +* **protocol:** extract an IBlockHash interface from TaikoL2 ([#18045](https://github.com/taikoxyz/taiko-mono/issues/18045)) ([bff481e](https://github.com/taikoxyz/taiko-mono/commit/bff481e8a2898fab8396d368de84f8f343c532f0)) +* **protocol:** introduce BlockV2 for client-side compability ([#17935](https://github.com/taikoxyz/taiko-mono/issues/17935)) ([e46cf29](https://github.com/taikoxyz/taiko-mono/commit/e46cf294862c293b73b817574669115b85e973a7)) +* **protocol:** refactor TierProvider implementations ([ee464ca](https://github.com/taikoxyz/taiko-mono/commit/ee464caef68fdec325aa22758bb69e17dd039794)) +* **protocol:** remove ProposerAccess for easier composability ([#17994](https://github.com/taikoxyz/taiko-mono/issues/17994)) ([80176a1](https://github.com/taikoxyz/taiko-mono/commit/80176a1525c374039256c779f4a2408971759d22)) +* **protocol:** remove the receive function from TaikoL1.sol ([#17865](https://github.com/taikoxyz/taiko-mono/issues/17865)) ([3542420](https://github.com/taikoxyz/taiko-mono/commit/35424204d9f41d49f4a12869ed4410b6de7f577e)) +* **protocol:** remove uncessary init2() from TaikoL2 ([#17973](https://github.com/taikoxyz/taiko-mono/issues/17973)) ([4e08881](https://github.com/taikoxyz/taiko-mono/commit/4e0888190e172c950dc5e81a5115ee0fb6df3f11)) +* **protocol:** remove unused code post Ontake fork ([#18150](https://github.com/taikoxyz/taiko-mono/issues/18150)) ([8543cec](https://github.com/taikoxyz/taiko-mono/commit/8543cecdef9d10d038bc5a7313230006acd26e22)) +* **protocol:** restructure solidity code to match compilation targets ([#18059](https://github.com/taikoxyz/taiko-mono/issues/18059)) ([adc47f4](https://github.com/taikoxyz/taiko-mono/commit/adc47f408282c25c7a50c26e31130fc495734dcc)) +* **protocol:** simplify mainnet address caching ([ee464ca](https://github.com/taikoxyz/taiko-mono/commit/ee464caef68fdec325aa22758bb69e17dd039794)) +* **protocol:** simplify some protocol code based on OpenZeppelin's recommendation ([#18308](https://github.com/taikoxyz/taiko-mono/issues/18308)) ([fbad703](https://github.com/taikoxyz/taiko-mono/commit/fbad703739f09d4524f9d808c3bad31d0122ec2c)) +* **protocol:** slightly change defender monitors ([#18086](https://github.com/taikoxyz/taiko-mono/issues/18086)) ([b93d056](https://github.com/taikoxyz/taiko-mono/commit/b93d056479adfc4a1f557578d8b66eda48b104a9)) +* **protocol:** slightly improve EssentialContract ([#18445](https://github.com/taikoxyz/taiko-mono/issues/18445)) ([3d077f8](https://github.com/taikoxyz/taiko-mono/commit/3d077f8ee520a116028711391c323c7badd1f2c6)) +* **protocol:** use npm to manage third-party solidity dependency ([#17881](https://github.com/taikoxyz/taiko-mono/issues/17881)) ([d524e69](https://github.com/taikoxyz/taiko-mono/commit/d524e693449de9d65154471786fa4f5e8c45a381)) + + +### Tests + +* **protocol:** add test case of risc0 groth16 ([#17904](https://github.com/taikoxyz/taiko-mono/issues/17904)) ([90bc01d](https://github.com/taikoxyz/taiko-mono/commit/90bc01dfbef1129be1bd94e85c9ecd7c7b28b1da)) +* **protocol:** check LibEIP1559 function results in fuzz tests ([#18475](https://github.com/taikoxyz/taiko-mono/issues/18475)) ([06e190c](https://github.com/taikoxyz/taiko-mono/commit/06e190c01bc4c4aae25664e8c2c154d8cf46efa5)) +* **protocol:** fix another L2 test failure ([#18304](https://github.com/taikoxyz/taiko-mono/issues/18304)) ([b3dd4dc](https://github.com/taikoxyz/taiko-mono/commit/b3dd4dccd261a9ebda69325661d2941001268ec2)) +* **taiko-client:** use env names which defined in flag configs ([#17921](https://github.com/taikoxyz/taiko-mono/issues/17921)) ([196b74e](https://github.com/taikoxyz/taiko-mono/commit/196b74eb2b4498bc3e6511915e011a885fcc530f)) + + +### Workflow + +* **protocol:** make the storage layout table clearer ([#18633](https://github.com/taikoxyz/taiko-mono/issues/18633)) ([7394458](https://github.com/taikoxyz/taiko-mono/commit/73944585586686ad1ce5548ce59e9ea583c4b2ee)) +* **protocol:** revert "chore(main): release taiko-alethia-protocol 1.11.0 ([#18663](https://github.com/taikoxyz/taiko-mono/issues/18663))" ([#18688](https://github.com/taikoxyz/taiko-mono/issues/18688)) ([7e6bce4](https://github.com/taikoxyz/taiko-mono/commit/7e6bce4a0dac9e4f2984ffe2d3da2fc1277fab27)) +* **protocol:** revert releasing protocol 1.11.0 ([#18662](https://github.com/taikoxyz/taiko-mono/issues/18662)) ([29ce093](https://github.com/taikoxyz/taiko-mono/commit/29ce093100ae76b9eb51eef0f560207422496990)) +* **protocol:** trigger patch release (1.10.1) ([#18358](https://github.com/taikoxyz/taiko-mono/issues/18358)) ([f4f4796](https://github.com/taikoxyz/taiko-mono/commit/f4f4796488059b02c79d6fb15170df58dd31dc4e)) +* **protocol:** upgrade to use solc 0.8.27 ([#18037](https://github.com/taikoxyz/taiko-mono/issues/18037)) ([3a56b57](https://github.com/taikoxyz/taiko-mono/commit/3a56b5788b3e2473381429e5fddfaac2f10fa174)) + + +### Build + +* **deps:** bump github.com/stretchr/testify from 1.9.0 to 1.10.0 ([#18539](https://github.com/taikoxyz/taiko-mono/issues/18539)) ([79f3fab](https://github.com/taikoxyz/taiko-mono/commit/79f3fab5f1d1ec1bb4ee18afb9268b622e894780)) +* **deps:** bump golang.org/x/sync from 0.9.0 to 0.10.0 ([#18560](https://github.com/taikoxyz/taiko-mono/issues/18560)) ([3d51970](https://github.com/taikoxyz/taiko-mono/commit/3d51970aa0953bbfecaeebf76ea7e664c875c0e4)) +* **deps:** bump merkletreejs from 0.3.11 to 0.4.0 ([#17942](https://github.com/taikoxyz/taiko-mono/issues/17942)) ([1624b71](https://github.com/taikoxyz/taiko-mono/commit/1624b711e3fe1862f000e1d2970d6aee1b8990c9)) + +## [1.10.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v1.9.0...protocol-v1.10.0) (2024-11-01) + + +### Features + +* **protocol:** add `proposeBlocksV2` method to `ProverSet` ([#18115](https://github.com/taikoxyz/taiko-mono/issues/18115)) ([0743a99](https://github.com/taikoxyz/taiko-mono/commit/0743a99ee6ab403024bab5834178399fbeebb4e5)) +* **protocol:** add aggregated sgx verify test ([#18160](https://github.com/taikoxyz/taiko-mono/issues/18160)) ([8dda47b](https://github.com/taikoxyz/taiko-mono/commit/8dda47bf9ee47faa8a0d16dde0b4398d5e7019f8)) +* **protocol:** add Hekla Ontake hardfork upgrade scripts ([#18103](https://github.com/taikoxyz/taiko-mono/issues/18103)) ([a3436e8](https://github.com/taikoxyz/taiko-mono/commit/a3436e8cafbc96ebfa5742ada995adae39c572ce)) +* **protocol:** allow owner to update recipient in TokenUnlock ([#18184](https://github.com/taikoxyz/taiko-mono/issues/18184)) ([773ae1b](https://github.com/taikoxyz/taiko-mono/commit/773ae1b11f309ee8c4e0b1c0d22b9bfa41beae0d)) +* **protocol:** check-in `HeklaTaikoToken` ([#18189](https://github.com/taikoxyz/taiko-mono/issues/18189)) ([60c38d8](https://github.com/taikoxyz/taiko-mono/commit/60c38d8d179f2c02a0ed87f97bd34dc708b38df4)) +* **protocol:** enable sp1 batch aggregation ([#18199](https://github.com/taikoxyz/taiko-mono/issues/18199)) ([038cd32](https://github.com/taikoxyz/taiko-mono/commit/038cd326668b3a882798ecb4e7f9e3ecadc6dc28)) +* **protocol:** improve `getTransitions` ([#18181](https://github.com/taikoxyz/taiko-mono/issues/18181)) ([868d733](https://github.com/taikoxyz/taiko-mono/commit/868d733db962a76261036c3e583cb50feaec901f)) +* **protocol:** Increase the probability of sgx proof for lab proposer ([#18288](https://github.com/taikoxyz/taiko-mono/issues/18288)) ([fd0dbbb](https://github.com/taikoxyz/taiko-mono/commit/fd0dbbbb3df0db27873e0ba87e45a5165fb7c0f1)) +* **protocol:** introduce `getTransitions` in TaikoL1 ([#18154](https://github.com/taikoxyz/taiko-mono/issues/18154)) ([273bf53](https://github.com/taikoxyz/taiko-mono/commit/273bf53fad763b8504353e7cc14c8585e341f9d0)) +* **protocol:** make sure `init()` covers logics in `init2()`, `init3()`.. ([#18292](https://github.com/taikoxyz/taiko-mono/issues/18292)) ([9d06958](https://github.com/taikoxyz/taiko-mono/commit/9d06958e713e530fdd610c439c7b93199d0dcc69)) +* **protocol:** rename B_BLOCK_PROPOSER to B_PRECONF_REGISTRY ([#18255](https://github.com/taikoxyz/taiko-mono/issues/18255)) ([bf3caf7](https://github.com/taikoxyz/taiko-mono/commit/bf3caf7d986d7b03cf3bd0aa69ea97602bff80aa)) +* **protocol:** scripts to deploy new mainnet implementation contracts ([#18356](https://github.com/taikoxyz/taiko-mono/issues/18356)) ([269759b](https://github.com/taikoxyz/taiko-mono/commit/269759bccefba399f0aa6f45482f4a24330a5e47)) +* **protocol:** update mainnet `ontakeForkHeight` config ([#18252](https://github.com/taikoxyz/taiko-mono/issues/18252)) ([7550882](https://github.com/taikoxyz/taiko-mono/commit/75508828d3755e1a831380cdd2ab321e67fa22fc)) +* **protocol:** update ric0 & sp1 verification contract ([#18269](https://github.com/taikoxyz/taiko-mono/issues/18269)) ([684a909](https://github.com/taikoxyz/taiko-mono/commit/684a909e83705c59b2b7a0a991424b7a8e9e03ad)) +* **protocol:** update sp1 contracts ([#18097](https://github.com/taikoxyz/taiko-mono/issues/18097)) ([6f26434](https://github.com/taikoxyz/taiko-mono/commit/6f264342fe48f8d193559ac0712cc875d643b6fd)) +* **protocol:** upgrade script ([#18334](https://github.com/taikoxyz/taiko-mono/issues/18334)) ([2c41dd1](https://github.com/taikoxyz/taiko-mono/commit/2c41dd10989566c1b6af691c92ab2cbde734a13a)) +* **protocol:** user smaller cooldown windows ([#18345](https://github.com/taikoxyz/taiko-mono/issues/18345)) ([63455f9](https://github.com/taikoxyz/taiko-mono/commit/63455f91d202d88583d70bce69e799032523eb18)) + + +### Bug Fixes + +* **protocol:** check blockId in getBlock and getBlockV2 ([#18327](https://github.com/taikoxyz/taiko-mono/issues/18327)) ([4288fb6](https://github.com/taikoxyz/taiko-mono/commit/4288fb6e0c8c76651d2db866cab55f32a9a25075)) +* **protocol:** avoid invocation in Bridge message processing if calldata is "" and value is 0 ([#18137](https://github.com/taikoxyz/taiko-mono/issues/18137)) ([10c2972](https://github.com/taikoxyz/taiko-mono/commit/10c29727081bd8f8b94bbfc4472b162ec552ef64)) +* **protocol:** correct the wrong router address for mainnet ([#18291](https://github.com/taikoxyz/taiko-mono/issues/18291)) ([ae0a9da](https://github.com/taikoxyz/taiko-mono/commit/ae0a9daf83ab8f323c216978724ebcb71de54cfe)) +* **protocol:** fix a new bug in LibProposing ([#18328](https://github.com/taikoxyz/taiko-mono/issues/18328)) ([7436bae](https://github.com/taikoxyz/taiko-mono/commit/7436bae9660cfcf1d430ca111df8c75d50908eae)) +* **protocol:** fix an issue in same transition check ([#18254](https://github.com/taikoxyz/taiko-mono/issues/18254)) ([233806e](https://github.com/taikoxyz/taiko-mono/commit/233806e4838aa12e8de436a37979ff3e614119f2)) +* **protocol:** fix DCAP configuration script ([#18088](https://github.com/taikoxyz/taiko-mono/issues/18088)) ([e8618c5](https://github.com/taikoxyz/taiko-mono/commit/e8618c54a58993499e852ec2ffc2468d4f0274ba)) +* **protocol:** fix issue in mainnet deployment script ([#18283](https://github.com/taikoxyz/taiko-mono/issues/18283)) ([5c371a1](https://github.com/taikoxyz/taiko-mono/commit/5c371a181af444999f611e03774ec096ffbd1226)) +* **protocol:** fix LibAddress.supportsInterface to handle undecodable return data ([#18286](https://github.com/taikoxyz/taiko-mono/issues/18286)) ([299b4c9](https://github.com/taikoxyz/taiko-mono/commit/299b4c9ecf96644c909df70a3527ae5c2e728a07)) +* **protocol:** fix permission in ComposeVerifier ([#18302](https://github.com/taikoxyz/taiko-mono/issues/18302)) ([4c45d8b](https://github.com/taikoxyz/taiko-mono/commit/4c45d8bcdb52521ac1738ca271316d82689537b0)) +* **protocol:** fix proposeBlock()'s block id check ([#18227](https://github.com/taikoxyz/taiko-mono/issues/18227)) ([3a9d6c1](https://github.com/taikoxyz/taiko-mono/commit/3a9d6c166b7c6666eb2515893b6a3fbd00f4b1ea)) +* **protocol:** fix test related to SendMessageToDelegateOwner.s.sol ([#18300](https://github.com/taikoxyz/taiko-mono/issues/18300)) ([65daa3e](https://github.com/taikoxyz/taiko-mono/commit/65daa3e631b471d17dbffb1001dab66efa67c499)) +* **protocol:** fix wrong Bridged ERC20 address cache ([#18287](https://github.com/taikoxyz/taiko-mono/issues/18287)) ([49267ab](https://github.com/taikoxyz/taiko-mono/commit/49267abaa6d27d16fe4fb62ca0bb28d49b09d2f9)) +* **protocol:** revert a change to maintain taiko-geth compatibility ([#18331](https://github.com/taikoxyz/taiko-mono/issues/18331)) ([9d18d59](https://github.com/taikoxyz/taiko-mono/commit/9d18d598fe3e890a1f35e2d39916d554282ee4a0)) +* **protocol:** revert changes related to `proposedIn` and `proposedAt` to fix a bug ([#18333](https://github.com/taikoxyz/taiko-mono/issues/18333)) ([5cb43ab](https://github.com/taikoxyz/taiko-mono/commit/5cb43ab1e29422353de549f8386eff613291c7df)) +* **protocol:** reward non-assigned prover 7/8 liveness bond ([#18132](https://github.com/taikoxyz/taiko-mono/issues/18132)) ([9f99099](https://github.com/taikoxyz/taiko-mono/commit/9f99099ac271e6e2a0973a43084e29169386f2cd)) +* **protocol:** small fix to 1559 error check ([#18339](https://github.com/taikoxyz/taiko-mono/issues/18339)) ([4428661](https://github.com/taikoxyz/taiko-mono/commit/44286615a0e0b0a17892fe83aad96546a6b1aca1)) + + +### Chores + +* **docs:** redirect the contribution.md path ([#18316](https://github.com/taikoxyz/taiko-mono/issues/18316)) ([0607ef7](https://github.com/taikoxyz/taiko-mono/commit/0607ef718dbe34c0ffe125825b12001b36a43fc5)) +* **main:** release protocol 1.10.0 ([#18077](https://github.com/taikoxyz/taiko-mono/issues/18077)) ([3d12cb2](https://github.com/taikoxyz/taiko-mono/commit/3d12cb24b16c7eede1930b928408c1462134f5a7)) +* **protocol:** add functions to ITaikoL1 for Nethermind Preconf ([#18217](https://github.com/taikoxyz/taiko-mono/issues/18217)) ([e349d22](https://github.com/taikoxyz/taiko-mono/commit/e349d2237a1830edab305b2f0eaaeb0eaf3c623f)) +* **protocol:** change Hekla gas issuance per sec to 100000 ([#18335](https://github.com/taikoxyz/taiko-mono/issues/18335)) ([3d448d4](https://github.com/taikoxyz/taiko-mono/commit/3d448d4a78608ea7daf1d50e877c32f8d30f1e7a)) +* **protocol:** change Hekla sharingPctg to 80% & gasIssuancePerSecond to 1000000 ([#18322](https://github.com/taikoxyz/taiko-mono/issues/18322)) ([75feb5b](https://github.com/taikoxyz/taiko-mono/commit/75feb5b36560b786a54e97280352c0d70c3e2f06)) +* **protocol:** deploy `MainnetTierRouter` and update `RollupAddressCache` ([#18359](https://github.com/taikoxyz/taiko-mono/issues/18359)) ([aa351ab](https://github.com/taikoxyz/taiko-mono/commit/aa351ab0f90e442a8b15adb8de6a48d9ae6d1c42)) +* **protocol:** fix lint issue in SP1Verifier ([#18213](https://github.com/taikoxyz/taiko-mono/issues/18213)) ([7874dd3](https://github.com/taikoxyz/taiko-mono/commit/7874dd3ff8a6053da8c09377b52c83e7a506f45f)) +* **protocol:** improve the usage of `initializer` and `reinitializer` ([#18319](https://github.com/taikoxyz/taiko-mono/issues/18319)) ([13cc007](https://github.com/taikoxyz/taiko-mono/commit/13cc0074a2295c5939cf83e23f531cb25c43bd64)) +* **protocol:** remove `TIER_ZKVM_ANY` in `MainnetTierRouter` ([#18357](https://github.com/taikoxyz/taiko-mono/issues/18357)) ([500a8bb](https://github.com/taikoxyz/taiko-mono/commit/500a8bbc46a3d1962ae5cc6d7f10e990f03d07c7)) +* **protocol:** revert Hekla `baseFeeConfig` updates ([#18340](https://github.com/taikoxyz/taiko-mono/issues/18340)) ([ae8ac3c](https://github.com/taikoxyz/taiko-mono/commit/ae8ac3c2e686b136de8c68853ecb91a39260a93f)) +* **protocol:** set mainnet Ontake fork height ([#18112](https://github.com/taikoxyz/taiko-mono/issues/18112)) ([8812eb2](https://github.com/taikoxyz/taiko-mono/commit/8812eb2a8de367311b8ada6bd3587bfe5efee090)) +* **protocol:** shorten imports in solidity files ([#18221](https://github.com/taikoxyz/taiko-mono/issues/18221)) ([9b2ba6a](https://github.com/taikoxyz/taiko-mono/commit/9b2ba6a2a2fae24d1fb34e23b29b3146e96f575e)) +* **protocol:** undo 1.10.0 release ([#18363](https://github.com/taikoxyz/taiko-mono/issues/18363)) ([116578e](https://github.com/taikoxyz/taiko-mono/commit/116578ef8a4391611bd1b3c469f4068cec8a8447)) +* **protocol:** remove unused delegate owner deployment ([#18290](https://github.com/taikoxyz/taiko-mono/issues/18290)) ([63ba863](https://github.com/taikoxyz/taiko-mono/commit/63ba863dcf322b2cf04d7dcaf6d8905bf28de6bc)) + + +### Documentation + +* **protocol:** fix invalid links in docs ([#18144](https://github.com/taikoxyz/taiko-mono/issues/18144)) ([c62f3f6](https://github.com/taikoxyz/taiko-mono/commit/c62f3f6b4a21f3af44f7df908fd8aac198721d5b)) +* **protocol:** update `tier_router` in hekla ([#18352](https://github.com/taikoxyz/taiko-mono/issues/18352)) ([7c91a7d](https://github.com/taikoxyz/taiko-mono/commit/7c91a7d486c22e0f1a5386978086dfca5b73cfe0)) +* **protocol:** update code4rena-2024-03-taiko-final-report.md ([#18062](https://github.com/taikoxyz/taiko-mono/issues/18062)) ([fd68794](https://github.com/taikoxyz/taiko-mono/commit/fd68794a2de24b7a32d2d5a1c3f52c2156b6d61a)) +* **protocol:** update Hekla deployments ([#18152](https://github.com/taikoxyz/taiko-mono/issues/18152)) ([6c7ff61](https://github.com/taikoxyz/taiko-mono/commit/6c7ff617b913b21b8b12b035f0d653c068830de3)) +* **protocol:** update Hekla deployments ([#18257](https://github.com/taikoxyz/taiko-mono/issues/18257)) ([fbb1c82](https://github.com/taikoxyz/taiko-mono/commit/fbb1c824e35adb452176d988f32cf06d0c72b9bf)) +* **protocol:** update L1 deployment ([#18299](https://github.com/taikoxyz/taiko-mono/issues/18299)) ([f60ce3e](https://github.com/taikoxyz/taiko-mono/commit/f60ce3e78bb9a2717718c3a9d7016346d5305488)) +* **protocol:** update mainnet deployment ([#18258](https://github.com/taikoxyz/taiko-mono/issues/18258)) ([eeeb4af](https://github.com/taikoxyz/taiko-mono/commit/eeeb4afeff8572115c2cf82db149cee7a723f30c)) +* **protocol:** upgrade protocol version in hekla to 1.10.0 ([#18343](https://github.com/taikoxyz/taiko-mono/issues/18343)) ([4805024](https://github.com/taikoxyz/taiko-mono/commit/4805024c15ab63bf345dcc5f5868a4a16af0ba48)) +* **protocol:** upgrade sp1 plonk verifier 2.0.0 ([#18098](https://github.com/taikoxyz/taiko-mono/issues/18098)) ([cfd0e9e](https://github.com/taikoxyz/taiko-mono/commit/cfd0e9e4af2e42ead309e0c571b09dd20ddfe0f9)) +* **protocol:** upgrade zk verifiers in Hekla ([#18279](https://github.com/taikoxyz/taiko-mono/issues/18279)) ([e98a1d5](https://github.com/taikoxyz/taiko-mono/commit/e98a1d5cdaa14af86340081ee42ad263a41bfdb5)) + + +### Code Refactoring + +* **protocol:** simplify some protocol code based on OpenZeppelin's recommendation ([#18308](https://github.com/taikoxyz/taiko-mono/issues/18308)) ([fbad703](https://github.com/taikoxyz/taiko-mono/commit/fbad703739f09d4524f9d808c3bad31d0122ec2c)) +* **protocol:** slightly change defender monitors ([#18086](https://github.com/taikoxyz/taiko-mono/issues/18086)) ([b93d056](https://github.com/taikoxyz/taiko-mono/commit/b93d056479adfc4a1f557578d8b66eda48b104a9)) + + +### Tests + +* **protocol:** fix another L2 test failure ([#18304](https://github.com/taikoxyz/taiko-mono/issues/18304)) ([b3dd4dc](https://github.com/taikoxyz/taiko-mono/commit/b3dd4dccd261a9ebda69325661d2941001268ec2)) + + +### Workflow + +* **protocol:** trigger patch release (1.10.1) ([#18358](https://github.com/taikoxyz/taiko-mono/issues/18358)) ([f4f4796](https://github.com/taikoxyz/taiko-mono/commit/f4f4796488059b02c79d6fb15170df58dd31dc4e)) + +## [1.10.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v1.9.0...protocol-v1.10.0) (2024-10-29) + + +### Features + +* **protocol:** add `proposeBlocksV2` method to `ProverSet` ([#18115](https://github.com/taikoxyz/taiko-mono/issues/18115)) ([0743a99](https://github.com/taikoxyz/taiko-mono/commit/0743a99ee6ab403024bab5834178399fbeebb4e5)) +* **protocol:** add aggregated sgx verify test ([#18160](https://github.com/taikoxyz/taiko-mono/issues/18160)) ([8dda47b](https://github.com/taikoxyz/taiko-mono/commit/8dda47bf9ee47faa8a0d16dde0b4398d5e7019f8)) +* **protocol:** add Hekla Ontake hardfork upgrade scripts ([#18103](https://github.com/taikoxyz/taiko-mono/issues/18103)) ([a3436e8](https://github.com/taikoxyz/taiko-mono/commit/a3436e8cafbc96ebfa5742ada995adae39c572ce)) +* **protocol:** allow owner to update recipient in TokenUnlock ([#18184](https://github.com/taikoxyz/taiko-mono/issues/18184)) ([773ae1b](https://github.com/taikoxyz/taiko-mono/commit/773ae1b11f309ee8c4e0b1c0d22b9bfa41beae0d)) +* **protocol:** check-in `HeklaTaikoToken` ([#18189](https://github.com/taikoxyz/taiko-mono/issues/18189)) ([60c38d8](https://github.com/taikoxyz/taiko-mono/commit/60c38d8d179f2c02a0ed87f97bd34dc708b38df4)) +* **protocol:** enable sp1 batch aggregation ([#18199](https://github.com/taikoxyz/taiko-mono/issues/18199)) ([038cd32](https://github.com/taikoxyz/taiko-mono/commit/038cd326668b3a882798ecb4e7f9e3ecadc6dc28)) +* **protocol:** improve `getTransitions` ([#18181](https://github.com/taikoxyz/taiko-mono/issues/18181)) ([868d733](https://github.com/taikoxyz/taiko-mono/commit/868d733db962a76261036c3e583cb50feaec901f)) +* **protocol:** Increase the probability of sgx proof for lab proposer ([#18288](https://github.com/taikoxyz/taiko-mono/issues/18288)) ([fd0dbbb](https://github.com/taikoxyz/taiko-mono/commit/fd0dbbbb3df0db27873e0ba87e45a5165fb7c0f1)) +* **protocol:** introduce `getTransitions` in TaikoL1 ([#18154](https://github.com/taikoxyz/taiko-mono/issues/18154)) ([273bf53](https://github.com/taikoxyz/taiko-mono/commit/273bf53fad763b8504353e7cc14c8585e341f9d0)) +* **protocol:** make sure `init()` covers logics in `init2()`, `init3()`.. ([#18292](https://github.com/taikoxyz/taiko-mono/issues/18292)) ([9d06958](https://github.com/taikoxyz/taiko-mono/commit/9d06958e713e530fdd610c439c7b93199d0dcc69)) +* **protocol:** rename B_BLOCK_PROPOSER to B_PRECONF_REGISTRY ([#18255](https://github.com/taikoxyz/taiko-mono/issues/18255)) ([bf3caf7](https://github.com/taikoxyz/taiko-mono/commit/bf3caf7d986d7b03cf3bd0aa69ea97602bff80aa)) +* **protocol:** update mainnet `ontakeForkHeight` config ([#18252](https://github.com/taikoxyz/taiko-mono/issues/18252)) ([7550882](https://github.com/taikoxyz/taiko-mono/commit/75508828d3755e1a831380cdd2ab321e67fa22fc)) +* **protocol:** update ric0 & sp1 verification contract ([#18269](https://github.com/taikoxyz/taiko-mono/issues/18269)) ([684a909](https://github.com/taikoxyz/taiko-mono/commit/684a909e83705c59b2b7a0a991424b7a8e9e03ad)) +* **protocol:** update sp1 contracts ([#18097](https://github.com/taikoxyz/taiko-mono/issues/18097)) ([6f26434](https://github.com/taikoxyz/taiko-mono/commit/6f264342fe48f8d193559ac0712cc875d643b6fd)) + + +### Bug Fixes + +* **protocol:** check blockId in getBlock and getBlockV2 ([#18327](https://github.com/taikoxyz/taiko-mono/issues/18327)) ([4288fb6](https://github.com/taikoxyz/taiko-mono/commit/4288fb6e0c8c76651d2db866cab55f32a9a25075)) +* **protocol:** avoid invocation in Bridge message processing if calldata is "" and value is 0 ([#18137](https://github.com/taikoxyz/taiko-mono/issues/18137)) ([10c2972](https://github.com/taikoxyz/taiko-mono/commit/10c29727081bd8f8b94bbfc4472b162ec552ef64)) +* **protocol:** correct the wrong router address for mainnet ([#18291](https://github.com/taikoxyz/taiko-mono/issues/18291)) ([ae0a9da](https://github.com/taikoxyz/taiko-mono/commit/ae0a9daf83ab8f323c216978724ebcb71de54cfe)) +* **protocol:** fix a new bug in LibProposing ([#18328](https://github.com/taikoxyz/taiko-mono/issues/18328)) ([7436bae](https://github.com/taikoxyz/taiko-mono/commit/7436bae9660cfcf1d430ca111df8c75d50908eae)) +* **protocol:** fix an issue in same transition check ([#18254](https://github.com/taikoxyz/taiko-mono/issues/18254)) ([233806e](https://github.com/taikoxyz/taiko-mono/commit/233806e4838aa12e8de436a37979ff3e614119f2)) +* **protocol:** fix DCAP configuration script ([#18088](https://github.com/taikoxyz/taiko-mono/issues/18088)) ([e8618c5](https://github.com/taikoxyz/taiko-mono/commit/e8618c54a58993499e852ec2ffc2468d4f0274ba)) +* **protocol:** fix issue in mainnet deployment script ([#18283](https://github.com/taikoxyz/taiko-mono/issues/18283)) ([5c371a1](https://github.com/taikoxyz/taiko-mono/commit/5c371a181af444999f611e03774ec096ffbd1226)) +* **protocol:** fix LibAddress.supportsInterface to handle undecodeable return data ([#18286](https://github.com/taikoxyz/taiko-mono/issues/18286)) ([299b4c9](https://github.com/taikoxyz/taiko-mono/commit/299b4c9ecf96644c909df70a3527ae5c2e728a07)) +* **protocol:** fix permission in ComposeVerifier ([#18302](https://github.com/taikoxyz/taiko-mono/issues/18302)) ([4c45d8b](https://github.com/taikoxyz/taiko-mono/commit/4c45d8bcdb52521ac1738ca271316d82689537b0)) +* **protocol:** fix proposeBlock()'s block id check ([#18227](https://github.com/taikoxyz/taiko-mono/issues/18227)) ([3a9d6c1](https://github.com/taikoxyz/taiko-mono/commit/3a9d6c166b7c6666eb2515893b6a3fbd00f4b1ea)) +* **protocol:** fix test related to SendMessageToDelegateOwner.s.sol ([#18300](https://github.com/taikoxyz/taiko-mono/issues/18300)) ([65daa3e](https://github.com/taikoxyz/taiko-mono/commit/65daa3e631b471d17dbffb1001dab66efa67c499)) +* **protocol:** fix wrong Bridged ERC20 address cache ([#18287](https://github.com/taikoxyz/taiko-mono/issues/18287)) ([49267ab](https://github.com/taikoxyz/taiko-mono/commit/49267abaa6d27d16fe4fb62ca0bb28d49b09d2f9)) +* **protocol:** revert a change to maintain taiko-geth compatibility ([#18331](https://github.com/taikoxyz/taiko-mono/issues/18331)) ([9d18d59](https://github.com/taikoxyz/taiko-mono/commit/9d18d598fe3e890a1f35e2d39916d554282ee4a0)) +* **protocol:** revert changes related to `proposedIn` and `proposedAt` to fix a bug ([#18333](https://github.com/taikoxyz/taiko-mono/issues/18333)) ([5cb43ab](https://github.com/taikoxyz/taiko-mono/commit/5cb43ab1e29422353de549f8386eff613291c7df)) +* **protocol:** reward non-assigned prover 7/8 liveness bond ([#18132](https://github.com/taikoxyz/taiko-mono/issues/18132)) ([9f99099](https://github.com/taikoxyz/taiko-mono/commit/9f99099ac271e6e2a0973a43084e29169386f2cd)) +* **protocol:** small fix to 1559 error check ([#18339](https://github.com/taikoxyz/taiko-mono/issues/18339)) ([4428661](https://github.com/taikoxyz/taiko-mono/commit/44286615a0e0b0a17892fe83aad96546a6b1aca1)) + + +### Chores + +* **docs:** redirect the contribution.md path ([#18316](https://github.com/taikoxyz/taiko-mono/issues/18316)) ([0607ef7](https://github.com/taikoxyz/taiko-mono/commit/0607ef718dbe34c0ffe125825b12001b36a43fc5)) +* **protocol:** add functions to ITaikoL1 for Nethermind Preconf ([#18217](https://github.com/taikoxyz/taiko-mono/issues/18217)) ([e349d22](https://github.com/taikoxyz/taiko-mono/commit/e349d2237a1830edab305b2f0eaaeb0eaf3c623f)) +* **protocol:** change Hekla gas issuance per sec to 100000 ([#18335](https://github.com/taikoxyz/taiko-mono/issues/18335)) ([3d448d4](https://github.com/taikoxyz/taiko-mono/commit/3d448d4a78608ea7daf1d50e877c32f8d30f1e7a)) +* **protocol:** change Hekla sharingPctg to 80% & gasIssuancePerSecond to 1000000 ([#18322](https://github.com/taikoxyz/taiko-mono/issues/18322)) ([75feb5b](https://github.com/taikoxyz/taiko-mono/commit/75feb5b36560b786a54e97280352c0d70c3e2f06)) +* **protocol:** fix lint issue in SP1Verifier ([#18213](https://github.com/taikoxyz/taiko-mono/issues/18213)) ([7874dd3](https://github.com/taikoxyz/taiko-mono/commit/7874dd3ff8a6053da8c09377b52c83e7a506f45f)) +* **protocol:** improve the usage of `initializer` and `reinitializer` ([#18319](https://github.com/taikoxyz/taiko-mono/issues/18319)) ([13cc007](https://github.com/taikoxyz/taiko-mono/commit/13cc0074a2295c5939cf83e23f531cb25c43bd64)) +* **protocol:** revert Hekla `baseFeeConfig` updates ([#18340](https://github.com/taikoxyz/taiko-mono/issues/18340)) ([ae8ac3c](https://github.com/taikoxyz/taiko-mono/commit/ae8ac3c2e686b136de8c68853ecb91a39260a93f)) +* **protocol:** set mainnet Ontake fork height ([#18112](https://github.com/taikoxyz/taiko-mono/issues/18112)) ([8812eb2](https://github.com/taikoxyz/taiko-mono/commit/8812eb2a8de367311b8ada6bd3587bfe5efee090)) +* **protocol:** shorten imports in solidity files ([#18221](https://github.com/taikoxyz/taiko-mono/issues/18221)) ([9b2ba6a](https://github.com/taikoxyz/taiko-mono/commit/9b2ba6a2a2fae24d1fb34e23b29b3146e96f575e)) +* **protoco:** remove unused delegate owner deployment ([#18290](https://github.com/taikoxyz/taiko-mono/issues/18290)) ([63ba863](https://github.com/taikoxyz/taiko-mono/commit/63ba863dcf322b2cf04d7dcaf6d8905bf28de6bc)) + + +### Documentation + +* **protocol:** fix invalid links in docs ([#18144](https://github.com/taikoxyz/taiko-mono/issues/18144)) ([c62f3f6](https://github.com/taikoxyz/taiko-mono/commit/c62f3f6b4a21f3af44f7df908fd8aac198721d5b)) +* **protocol:** update code4rena-2024-03-taiko-final-report.md ([#18062](https://github.com/taikoxyz/taiko-mono/issues/18062)) ([fd68794](https://github.com/taikoxyz/taiko-mono/commit/fd68794a2de24b7a32d2d5a1c3f52c2156b6d61a)) +* **protocol:** update Hekla deployments ([#18152](https://github.com/taikoxyz/taiko-mono/issues/18152)) ([6c7ff61](https://github.com/taikoxyz/taiko-mono/commit/6c7ff617b913b21b8b12b035f0d653c068830de3)) +* **protocol:** update Hekla deployments ([#18257](https://github.com/taikoxyz/taiko-mono/issues/18257)) ([fbb1c82](https://github.com/taikoxyz/taiko-mono/commit/fbb1c824e35adb452176d988f32cf06d0c72b9bf)) +* **protocol:** update L1 deployment ([#18299](https://github.com/taikoxyz/taiko-mono/issues/18299)) ([f60ce3e](https://github.com/taikoxyz/taiko-mono/commit/f60ce3e78bb9a2717718c3a9d7016346d5305488)) +* **protocol:** update mainnet deployment ([#18258](https://github.com/taikoxyz/taiko-mono/issues/18258)) ([eeeb4af](https://github.com/taikoxyz/taiko-mono/commit/eeeb4afeff8572115c2cf82db149cee7a723f30c)) +* **protocol:** upgrade sp1 plonk verifier 2.0.0 ([#18098](https://github.com/taikoxyz/taiko-mono/issues/18098)) ([cfd0e9e](https://github.com/taikoxyz/taiko-mono/commit/cfd0e9e4af2e42ead309e0c571b09dd20ddfe0f9)) +* **protocol:** upgrade zk verifiers in Hekla ([#18279](https://github.com/taikoxyz/taiko-mono/issues/18279)) ([e98a1d5](https://github.com/taikoxyz/taiko-mono/commit/e98a1d5cdaa14af86340081ee42ad263a41bfdb5)) + + +### Code Refactoring + +* **protocol:** simplify some protocol code based on OpenZeppelin's recommendation ([#18308](https://github.com/taikoxyz/taiko-mono/issues/18308)) ([fbad703](https://github.com/taikoxyz/taiko-mono/commit/fbad703739f09d4524f9d808c3bad31d0122ec2c)) +* **protocol:** slightly change defender monitors ([#18086](https://github.com/taikoxyz/taiko-mono/issues/18086)) ([b93d056](https://github.com/taikoxyz/taiko-mono/commit/b93d056479adfc4a1f557578d8b66eda48b104a9)) + + +### Tests + +* **protocol:** fix another L2 test failure ([#18304](https://github.com/taikoxyz/taiko-mono/issues/18304)) ([b3dd4dc](https://github.com/taikoxyz/taiko-mono/commit/b3dd4dccd261a9ebda69325661d2941001268ec2)) + +## [1.9.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v1.8.0...protocol-v1.9.0) (2024-09-12) + + +### Features + +* **protocol:** add `DevnetTaikoL1` ([#17900](https://github.com/taikoxyz/taiko-mono/issues/17900)) ([d864cea](https://github.com/taikoxyz/taiko-mono/commit/d864cea2eb8346127992acfbd9012e675a3400cc)) +* **protocol:** add `proveBlocks` method to `ProverSet` ([#18025](https://github.com/taikoxyz/taiko-mono/issues/18025)) ([36a2ae5](https://github.com/taikoxyz/taiko-mono/commit/36a2ae51c21a2359179755457a8933a346ccd8b3)) +* **protocol:** add `proveBlocks` to TaikoL1.sol ([fe687b3](https://github.com/taikoxyz/taiko-mono/commit/fe687b378fcb440184fd423088432dc63cf5989e)) +* **protocol:** add `TIER_ZKVM_RISC0` tier and `HeklaTierProvider` ([#17913](https://github.com/taikoxyz/taiko-mono/issues/17913)) ([64ed666](https://github.com/taikoxyz/taiko-mono/commit/64ed66628a18cb1b3fff2c4ab5d3c0149288dfe6)) +* **protocol:** add a batch proposing block function ([#17864](https://github.com/taikoxyz/taiko-mono/issues/17864)) ([3649785](https://github.com/taikoxyz/taiko-mono/commit/36497857dd3d5edb718a5cb0057327f3cde39c02)) +* **protocol:** add ComposeVerifier, TeeAnyVerifier, and ZkAnyVerifier ([ee464ca](https://github.com/taikoxyz/taiko-mono/commit/ee464caef68fdec325aa22758bb69e17dd039794)) +* **protocol:** add EIP-2612 (permit extension) to bridged ERC20 tokens ([#17818](https://github.com/taikoxyz/taiko-mono/issues/17818)) ([185ef91](https://github.com/taikoxyz/taiko-mono/commit/185ef91d8debb0c3a88734f2552ca396c8d23a66)) +* **protocol:** add preconfirmation support based on https://github.com/taikoxyz/taiko-mono/pull/17654 (with some renaming) (https://github.com/taikoxyz/taiko-mono/issues/14793) ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** add proposeBlock2 in TaikoL1.sol and approve2 in GuardianProver.sol ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** add proposer address to getMinTier func ([#17919](https://github.com/taikoxyz/taiko-mono/issues/17919)) ([d6ea6f3](https://github.com/taikoxyz/taiko-mono/commit/d6ea6f33d6bf54cba3bd6ab153e38d09abf19912)) +* **protocol:** add SP1 verification support ([#17861](https://github.com/taikoxyz/taiko-mono/issues/17861)) ([2936312](https://github.com/taikoxyz/taiko-mono/commit/29363123233f9d2d749eb626095d0c645801e384)) +* **protocol:** add withdraw eth function to proverset ([#17800](https://github.com/taikoxyz/taiko-mono/issues/17800)) ([bb2abc5](https://github.com/taikoxyz/taiko-mono/commit/bb2abc510c98e62c89e0bfd9382c11720fb9edc7)) +* **protocol:** adjust gas excess once the gas target has changed ([a1e217e](https://github.com/taikoxyz/taiko-mono/commit/a1e217e457546d63a89da0b02135b3b63b22d19e)) +* **protocol:** allow a grace period (4h) to defer proof submission to reduce cost ([fe687b3](https://github.com/taikoxyz/taiko-mono/commit/fe687b378fcb440184fd423088432dc63cf5989e)) +* **protocol:** allow any address to withdraw token to the recipient address ([#17843](https://github.com/taikoxyz/taiko-mono/issues/17843)) ([3d89d24](https://github.com/taikoxyz/taiko-mono/commit/3d89d24b14fea7b9e59659e689c3011fbcf4b852)) +* **protocol:** allow contract proposers to use calldata for DA ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** allow msg.sender to customize block proposer addresses ([#18048](https://github.com/taikoxyz/taiko-mono/issues/18048)) ([22055cc](https://github.com/taikoxyz/taiko-mono/commit/22055cc95e51d07b6b57ab5cb2e4ccd9a97d594a)) +* **protocol:** enhance nextTxId logics in DelegateOwner ([#17718](https://github.com/taikoxyz/taiko-mono/issues/17718)) ([85b2cad](https://github.com/taikoxyz/taiko-mono/commit/85b2cad6216d93e3811bc3523ab8b3200cdfbdd3)) +* **protocol:** improve L2 basefee calculation ([920bd68](https://github.com/taikoxyz/taiko-mono/commit/920bd6873d3e9e1bbb00751fb9c0056ac85b8554)) +* **protocol:** introduce risc0 proof ([#17877](https://github.com/taikoxyz/taiko-mono/issues/17877)) ([bcb57cb](https://github.com/taikoxyz/taiko-mono/commit/bcb57cb81d12d0c09656582ad9140b38015b3a58)) +* **protocol:** protocol monitors ([#18002](https://github.com/taikoxyz/taiko-mono/issues/18002)) ([45b2087](https://github.com/taikoxyz/taiko-mono/commit/45b2087495d4f9e20083ebe2c61ecfe8d252e4b2)) +* **protocol:** relocate L2 base fee parameters to L1 configuration ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** return verification timestamp in getLastVerifiedBlock ([#17868](https://github.com/taikoxyz/taiko-mono/issues/17868)) ([1998288](https://github.com/taikoxyz/taiko-mono/commit/19982889f7f4c073d182a6076633c5e2c892c73a)) +* **protocol:** revert removing time as input for L2 base fee calculation ([a1e217e](https://github.com/taikoxyz/taiko-mono/commit/a1e217e457546d63a89da0b02135b3b63b22d19e)) +* **protocol:** script of `UpgradeRisc0Verifier` ([#17949](https://github.com/taikoxyz/taiko-mono/issues/17949)) ([fc12e04](https://github.com/taikoxyz/taiko-mono/commit/fc12e040c391e0f37c906b270743d3b57710f69d)) +* **protocol:** support backward-compatible batch-proof verification ([#17968](https://github.com/taikoxyz/taiko-mono/issues/17968)) ([c476aab](https://github.com/taikoxyz/taiko-mono/commit/c476aabe130d151f5678cd35fab99f258997f629)) +* **protocol:** update `HeklaTierProvider` to introduce sp1 proof ([#18022](https://github.com/taikoxyz/taiko-mono/issues/18022)) ([76b6514](https://github.com/taikoxyz/taiko-mono/commit/76b6514fd42ba7fa2124b44443728fa32304c324)) +* **protocol:** update `ontakeForkHeight` to Sep 24, 2024 ([#18046](https://github.com/taikoxyz/taiko-mono/issues/18046)) ([30c9316](https://github.com/taikoxyz/taiko-mono/commit/30c9316aea083d187617f5342fb4a955e604226b)) +* **protocol:** update Hekla `ontakeForkHeight` ([#17983](https://github.com/taikoxyz/taiko-mono/issues/17983)) ([8819e3a](https://github.com/taikoxyz/taiko-mono/commit/8819e3a5a59675dcc6a1f333620ce6e75b7d2887)) +* **protocol:** update Hekla deployment ([#17795](https://github.com/taikoxyz/taiko-mono/issues/17795)) ([cadaef8](https://github.com/taikoxyz/taiko-mono/commit/cadaef882c0751496809c88ee03ff818e49c4b4a)) +* **protocol:** update risc0 verifier contract to release-1.0 ([#17776](https://github.com/taikoxyz/taiko-mono/issues/17776)) ([2dd30ab](https://github.com/taikoxyz/taiko-mono/commit/2dd30ab2dc92b25105f19a4bcc1ddf7b40886039)) +* **protocol:** update script of deploying sp1 ([#18019](https://github.com/taikoxyz/taiko-mono/issues/18019)) ([9464967](https://github.com/taikoxyz/taiko-mono/commit/94649671bdf0304d96bf83d7d18dcbe21eff6067)) +* **protocol:** use SP1 1.2.0-rc with more proof verification tests ([#18001](https://github.com/taikoxyz/taiko-mono/issues/18001)) ([f7bcf1d](https://github.com/taikoxyz/taiko-mono/commit/f7bcf1d63d19b641ac6b9e0e972a7f6e2ec5b38f)) + + +### Bug Fixes + +* **protocol:** fix `chainId` in `HeklaTaikoL1` ([#17912](https://github.com/taikoxyz/taiko-mono/issues/17912)) ([8f31dd0](https://github.com/taikoxyz/taiko-mono/commit/8f31dd0ed519809f0ea0797b1e6b5937ee087108)) +* **protocol:** fix BridgedERC20V2.sol initializer logic ([#17823](https://github.com/taikoxyz/taiko-mono/issues/17823)) ([d538d99](https://github.com/taikoxyz/taiko-mono/commit/d538d99f9542852821d958008d913c028629bbef)) +* **protocol:** fix bug in adjustExcess ([920bd68](https://github.com/taikoxyz/taiko-mono/commit/920bd6873d3e9e1bbb00751fb9c0056ac85b8554)) +* **protocol:** fix tier id conflicts ([#18004](https://github.com/taikoxyz/taiko-mono/issues/18004)) ([0df1ad4](https://github.com/taikoxyz/taiko-mono/commit/0df1ad4274e6ebc3db79acbbdaedbe2d519262d6)) +* **protocol:** make sure new instance is not zero address in SgxVerifier ([#17918](https://github.com/taikoxyz/taiko-mono/issues/17918)) ([d559ce8](https://github.com/taikoxyz/taiko-mono/commit/d559ce80c1314e9ddbe02798f1c61a2e8349da6e)) +* **protocol:** reduce MainnetTaikoL1 code size ([#17792](https://github.com/taikoxyz/taiko-mono/issues/17792)) ([45281b8](https://github.com/taikoxyz/taiko-mono/commit/45281b848f3ef3c45487bfcd1bfd38b382eff4d0)) +* **protocol:** use block header's extraData for `basefeeSharingPctg` ([#17889](https://github.com/taikoxyz/taiko-mono/issues/17889)) ([5f3cbc9](https://github.com/taikoxyz/taiko-mono/commit/5f3cbc97cbe2636314c4a2945fdf01ef641702e7)) + + +### Chores + +* **main:** release protocol 1.9.0 ([#17783](https://github.com/taikoxyz/taiko-mono/issues/17783)) ([7bfd28a](https://github.com/taikoxyz/taiko-mono/commit/7bfd28a2b332c927cd8b6358623551814260f94e)) +* **main:** release protocol 1.9.0 ([#18051](https://github.com/taikoxyz/taiko-mono/issues/18051)) ([2547ba9](https://github.com/taikoxyz/taiko-mono/commit/2547ba9409705bb759b62e59a7e5d5821349c71a)) +* **protocol:** make two state variables in TaikoL2.sol public and add `adjustExcess` ([#17891](https://github.com/taikoxyz/taiko-mono/issues/17891)) ([ba21f68](https://github.com/taikoxyz/taiko-mono/commit/ba21f6836845ea0227116b701e701815f210d56d)) +* **protocol:** move two files to simplify folder structure ([#17929](https://github.com/taikoxyz/taiko-mono/issues/17929)) ([9dca4fa](https://github.com/taikoxyz/taiko-mono/commit/9dca4faa43ad938880c8e1ac54236ab292bcce6e)) +* **protocol:** re-generate layout files with diff order for comparison with new PR ([#18067](https://github.com/taikoxyz/taiko-mono/issues/18067)) ([078d336](https://github.com/taikoxyz/taiko-mono/commit/078d3367dce86a57d71d48291537e925cb1b4b91)) +* **protocol:** revert `TAIKO_TOKEN` name changes in `DeployOnL1` ([#17927](https://github.com/taikoxyz/taiko-mono/issues/17927)) ([cf1a15f](https://github.com/taikoxyz/taiko-mono/commit/cf1a15f46344e60448c5fdcbcae02521fb5b7c04)) +* **protocol:** revert releasing protocol 1.9.0 ([#17783](https://github.com/taikoxyz/taiko-mono/issues/17783)) ([#18049](https://github.com/taikoxyz/taiko-mono/issues/18049)) ([c033810](https://github.com/taikoxyz/taiko-mono/commit/c033810ecc4c80a4581a95b06ab5127747efd191)) + + +### Documentation + +* **docs-site:** address docs and scripts friction points ([#17815](https://github.com/taikoxyz/taiko-mono/issues/17815)) ([c74968b](https://github.com/taikoxyz/taiko-mono/commit/c74968b61828babf218fbc8e8ded001a853a93c3)) +* **protocol:** add L2 `DelegateOwner` address in Hekla deployment docs ([#17925](https://github.com/taikoxyz/taiko-mono/issues/17925)) ([fdec8db](https://github.com/taikoxyz/taiko-mono/commit/fdec8dbe8c8aef21f71c9c4ca2213944880c1a47)) +* **protocol:** update `tier_router`with compatibility modifications ([#18028](https://github.com/taikoxyz/taiko-mono/issues/18028)) ([c43cb0c](https://github.com/taikoxyz/taiko-mono/commit/c43cb0c05f7cbba281076568f4e72033ebbcd0f3)) +* **protocol:** update hekla change log about `tier_router` ([#18023](https://github.com/taikoxyz/taiko-mono/issues/18023)) ([11e27d6](https://github.com/taikoxyz/taiko-mono/commit/11e27d60b3da9a34e07bfafadb8ec3d3223867d2)) +* **protocol:** update hekla change log about sp1 ([#18020](https://github.com/taikoxyz/taiko-mono/issues/18020)) ([434bf3c](https://github.com/taikoxyz/taiko-mono/commit/434bf3ccc1715171b8cd4e7581b282f85744ebe3)) +* **protocol:** update Hekla deployment ([#17845](https://github.com/taikoxyz/taiko-mono/issues/17845)) ([d95cc36](https://github.com/taikoxyz/taiko-mono/commit/d95cc36260ee4bf2aaf69181fa6444f419cc44af)) +* **protocol:** update Hekla deployment ([#17924](https://github.com/taikoxyz/taiko-mono/issues/17924)) ([46a3e00](https://github.com/taikoxyz/taiko-mono/commit/46a3e00659534a715fb315859463bd05bbdb65a9)) +* **protocol:** update Hekla deployments ([#17975](https://github.com/taikoxyz/taiko-mono/issues/17975)) ([c96627f](https://github.com/taikoxyz/taiko-mono/commit/c96627fcdd9ba91f26eeea2b329f0eb96dd36660)) +* **protocol:** update L1 deployment ([#17789](https://github.com/taikoxyz/taiko-mono/issues/17789)) ([a889f1a](https://github.com/taikoxyz/taiko-mono/commit/a889f1a3e6c27b6758e873572c371ac9399a3d9a)) +* **protocol:** update L1 deployment ([#17804](https://github.com/taikoxyz/taiko-mono/issues/17804)) ([25ace9b](https://github.com/taikoxyz/taiko-mono/commit/25ace9bd2b18d91cbf165968cc27d34ccbd7067a)) +* **protocol:** update L1 deployment ([#17812](https://github.com/taikoxyz/taiko-mono/issues/17812)) ([5b43df1](https://github.com/taikoxyz/taiko-mono/commit/5b43df170b6f97cb89360e2d210d4a768d9247c3)) +* **protocol:** update L1 deployment ([#17817](https://github.com/taikoxyz/taiko-mono/issues/17817)) ([311c948](https://github.com/taikoxyz/taiko-mono/commit/311c948850e8b4d46218fd4aba92d03bc6349445)) +* **protocol:** update mainnet deployment ([#17846](https://github.com/taikoxyz/taiko-mono/issues/17846)) ([ba6bf94](https://github.com/taikoxyz/taiko-mono/commit/ba6bf942213468310c6233051a90356268dea70f)) +* **protocol:** update mainnet deployment ([#17847](https://github.com/taikoxyz/taiko-mono/issues/17847)) ([92344df](https://github.com/taikoxyz/taiko-mono/commit/92344dfb8c97bae370d722f887fb2c603f96c480)) +* **protocol:** upgrade sp1 verifier in hekla ([#18027](https://github.com/taikoxyz/taiko-mono/issues/18027)) ([de27e6e](https://github.com/taikoxyz/taiko-mono/commit/de27e6e586e14410c309e68ce6b81504b9ba9a5b)) + + +### Code Refactoring + +* **protocol:** add MainnetGuardianProver ([#17805](https://github.com/taikoxyz/taiko-mono/issues/17805)) ([6f68316](https://github.com/taikoxyz/taiko-mono/commit/6f68316e89373670cf2c58bde5e64de196b9c139)) +* **protocol:** add MainnetSgxVerifier ([#17803](https://github.com/taikoxyz/taiko-mono/issues/17803)) ([a4be247](https://github.com/taikoxyz/taiko-mono/commit/a4be247e181861300d79af6454b3fd3776100b48)) +* **protocol:** added cached version of the bridge and vaults ([#17801](https://github.com/taikoxyz/taiko-mono/issues/17801)) ([b70cc57](https://github.com/taikoxyz/taiko-mono/commit/b70cc57704d750081a62a7e8e44f68f32efdc4c1)) +* **protocol:** avoid writing `livenessBond`, `proposedAt`, and `proposedIn` to storage ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** convert metadata from V2 to V1 only once ([#17842](https://github.com/taikoxyz/taiko-mono/issues/17842)) ([55ced31](https://github.com/taikoxyz/taiko-mono/commit/55ced319d68fe40fe82d1c7e0a268735c3545923)) +* **protocol:** delete packages/protocol/contracts/compiled ([#17849](https://github.com/taikoxyz/taiko-mono/issues/17849)) ([1fd907c](https://github.com/taikoxyz/taiko-mono/commit/1fd907cc81807027e730c0e27e258230670522df)) +* **protocol:** extract an IBlockHash interface from TaikoL2 ([#18045](https://github.com/taikoxyz/taiko-mono/issues/18045)) ([bff481e](https://github.com/taikoxyz/taiko-mono/commit/bff481e8a2898fab8396d368de84f8f343c532f0)) +* **protocol:** improve mainnet gas efficiency with addresses cached ([#17791](https://github.com/taikoxyz/taiko-mono/issues/17791)) ([b12227d](https://github.com/taikoxyz/taiko-mono/commit/b12227d4d2b2636fb80e04ee7ebc2dec3c17faa8)) +* **protocol:** improve MainnetSgxVerifier ([#17811](https://github.com/taikoxyz/taiko-mono/issues/17811)) ([4e7a421](https://github.com/taikoxyz/taiko-mono/commit/4e7a421967a4cea897f1ffbeeae254fbcad27117)) +* **protocol:** introduce BlockV2 for client-side compability ([#17935](https://github.com/taikoxyz/taiko-mono/issues/17935)) ([e46cf29](https://github.com/taikoxyz/taiko-mono/commit/e46cf294862c293b73b817574669115b85e973a7)) +* **protocol:** name address manager param clearer ([#17806](https://github.com/taikoxyz/taiko-mono/issues/17806)) ([1d5a6ff](https://github.com/taikoxyz/taiko-mono/commit/1d5a6ff191e8457ee12c96cb73c074560c556a2a)) +* **protocol:** refactor TierProvider implementations ([ee464ca](https://github.com/taikoxyz/taiko-mono/commit/ee464caef68fdec325aa22758bb69e17dd039794)) +* **protocol:** remove ProposerAccess for easier composability ([#17994](https://github.com/taikoxyz/taiko-mono/issues/17994)) ([80176a1](https://github.com/taikoxyz/taiko-mono/commit/80176a1525c374039256c779f4a2408971759d22)) +* **protocol:** remove the receive function from TaikoL1.sol ([#17865](https://github.com/taikoxyz/taiko-mono/issues/17865)) ([3542420](https://github.com/taikoxyz/taiko-mono/commit/35424204d9f41d49f4a12869ed4410b6de7f577e)) +* **protocol:** remove uncessary init2() from TaikoL2 ([#17973](https://github.com/taikoxyz/taiko-mono/issues/17973)) ([4e08881](https://github.com/taikoxyz/taiko-mono/commit/4e0888190e172c950dc5e81a5115ee0fb6df3f11)) +* **protocol:** restructure solidity code to match compilation targets ([#18059](https://github.com/taikoxyz/taiko-mono/issues/18059)) ([adc47f4](https://github.com/taikoxyz/taiko-mono/commit/adc47f408282c25c7a50c26e31130fc495734dcc)) +* **protocol:** simplify mainnet address caching ([ee464ca](https://github.com/taikoxyz/taiko-mono/commit/ee464caef68fdec325aa22758bb69e17dd039794)) +* **protocol:** use npm to manage third-party solidity dependency ([#17881](https://github.com/taikoxyz/taiko-mono/issues/17881)) ([d524e69](https://github.com/taikoxyz/taiko-mono/commit/d524e693449de9d65154471786fa4f5e8c45a381)) + + +### Tests + +* **protocol:** add test case of risc0 groth16 ([#17904](https://github.com/taikoxyz/taiko-mono/issues/17904)) ([90bc01d](https://github.com/taikoxyz/taiko-mono/commit/90bc01dfbef1129be1bd94e85c9ecd7c7b28b1da)) +* **taiko-client:** use env names which defined in flag configs ([#17921](https://github.com/taikoxyz/taiko-mono/issues/17921)) ([196b74e](https://github.com/taikoxyz/taiko-mono/commit/196b74eb2b4498bc3e6511915e011a885fcc530f)) + + +### Workflow + +* **protocol:** upgrade to use solc 0.8.27 ([#18037](https://github.com/taikoxyz/taiko-mono/issues/18037)) ([3a56b57](https://github.com/taikoxyz/taiko-mono/commit/3a56b5788b3e2473381429e5fddfaac2f10fa174)) + + +### Build + +* **deps:** bump merkletreejs from 0.3.11 to 0.4.0 ([#17942](https://github.com/taikoxyz/taiko-mono/issues/17942)) ([1624b71](https://github.com/taikoxyz/taiko-mono/commit/1624b711e3fe1862f000e1d2970d6aee1b8990c9)) + +## [1.8.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v1.7.0...protocol-v1.8.0) (2024-07-11) + + +### Features + +* **protocol:** allow TAIKO token bonds deposits and withdrawal ([#17725](https://github.com/taikoxyz/taiko-mono/issues/17725)) ([e505392](https://github.com/taikoxyz/taiko-mono/commit/e505392068084faa37b4b0d138ac79012256c692)) +* **protocol:** emit CalldataTxList when calldata is used for DA ([#17657](https://github.com/taikoxyz/taiko-mono/issues/17657)) ([f49aae8](https://github.com/taikoxyz/taiko-mono/commit/f49aae828e7c0695be359305c9d618977014c5af)) +* **protocol:** update `tier_router` address in `L1RollupAddressManager` ([#17717](https://github.com/taikoxyz/taiko-mono/issues/17717)) ([57c8dc0](https://github.com/taikoxyz/taiko-mono/commit/57c8dc0f0cae430b54d47b12939f1484d6c87184)) + + +### Bug Fixes + +* **protocol:** fix an issue in DelegateOwner then refactor the code ([#17633](https://github.com/taikoxyz/taiko-mono/issues/17633)) ([fbeb4e4](https://github.com/taikoxyz/taiko-mono/commit/fbeb4e49d0c183cc687a20b9b5ba7dae5af47d63)) +* **protocol:** revert Hekla ring buffer size changes ([#17779](https://github.com/taikoxyz/taiko-mono/issues/17779)) ([e18cb87](https://github.com/taikoxyz/taiko-mono/commit/e18cb8708b61ff1e0bdf2e99433328b1875b6a6c)) +* **protocol:** revert last change in TaikoToken.sol ([#17781](https://github.com/taikoxyz/taiko-mono/issues/17781)) ([7805fd3](https://github.com/taikoxyz/taiko-mono/commit/7805fd3a517beb0426848067fbe7f541b4ec6ed3)) +* **protocol:** use gasleft() in Bridge's retryMessage function ([#17708](https://github.com/taikoxyz/taiko-mono/issues/17708)) ([d86893c](https://github.com/taikoxyz/taiko-mono/commit/d86893cf0198a13f2710a701ea9c22e15c169de7)) + + +### Chores + +* **protocol:** check in data for the first token grant exercise ([#17707](https://github.com/taikoxyz/taiko-mono/issues/17707)) ([d2b00ce](https://github.com/taikoxyz/taiko-mono/commit/d2b00ce914076891c064fbbf280f363329c0f4cb)) +* **protocol:** give more slots for verified blocks in ring buffer ([#17762](https://github.com/taikoxyz/taiko-mono/issues/17762)) ([8d6d489](https://github.com/taikoxyz/taiko-mono/commit/8d6d489619996b2749147bebee60ef59d81ac040)) + + +### Documentation + +* **docs-site,protocol:** deploy proverset guide and scripts ([#17702](https://github.com/taikoxyz/taiko-mono/issues/17702)) ([a3e1cf7](https://github.com/taikoxyz/taiko-mono/commit/a3e1cf72bc4ad925d3652359a2f4d5fb466b79b0)) +* **docs-site,protocol:** streamline ProverSet deployment ([#17730](https://github.com/taikoxyz/taiko-mono/issues/17730)) ([919cb4c](https://github.com/taikoxyz/taiko-mono/commit/919cb4cd0064d1cfa994e53a30a73f98975cfe34)) +* **protocol:** add more token unlock contracts ([#17749](https://github.com/taikoxyz/taiko-mono/issues/17749)) ([8c8c7d2](https://github.com/taikoxyz/taiko-mono/commit/8c8c7d27501bdac99de055e9c9a032d60a20f75a)) +* **protocol:** deploy more token unlock contract ([#17763](https://github.com/taikoxyz/taiko-mono/issues/17763)) ([30631a9](https://github.com/taikoxyz/taiko-mono/commit/30631a97de10a61aef0938cbfb885af71c9f8dc1)) +* **protocol:** transfer Hekla ownerships ([#17766](https://github.com/taikoxyz/taiko-mono/issues/17766)) ([e524782](https://github.com/taikoxyz/taiko-mono/commit/e52478247806437f08af6324cf6097d384ada516)) +* **protocol:** update Hekla deployment ([#17646](https://github.com/taikoxyz/taiko-mono/issues/17646)) ([fc12586](https://github.com/taikoxyz/taiko-mono/commit/fc125862c6576ddcbce4d6b8b12161bd6882e304)) +* **protocol:** update Hekla deployment ([#17780](https://github.com/taikoxyz/taiko-mono/issues/17780)) ([b3331d3](https://github.com/taikoxyz/taiko-mono/commit/b3331d3fae73b6536a03ab94a42b03042b5c0676)) +* **protocol:** update L1 deployment ([#17736](https://github.com/taikoxyz/taiko-mono/issues/17736)) ([6fc318a](https://github.com/taikoxyz/taiko-mono/commit/6fc318afa044eb17d824b00d4d4a487eef2d15a0)) +* **protocol:** update L2 deployment ([#17689](https://github.com/taikoxyz/taiko-mono/issues/17689)) ([71eea3f](https://github.com/taikoxyz/taiko-mono/commit/71eea3ff4f4ba9fe7eab89c236cf0b4232294500)) + + +### Code Refactoring + +* **protocol:** delete duplicate event and error definition from TaikoL1 ([#17722](https://github.com/taikoxyz/taiko-mono/issues/17722)) ([0607b14](https://github.com/taikoxyz/taiko-mono/commit/0607b14f937b3e461ccc54a8ace21d545d2607e0)) +* **protocol:** refactor TaikoL1 contract ([#17678](https://github.com/taikoxyz/taiko-mono/issues/17678)) ([db6ccdf](https://github.com/taikoxyz/taiko-mono/commit/db6ccdfe0141452602ab79177d3c9aa7050ca46b)) +* **protocol:** remove unused tier fee in TaikoData ([#17741](https://github.com/taikoxyz/taiko-mono/issues/17741)) ([50abed1](https://github.com/taikoxyz/taiko-mono/commit/50abed1d3a543076cf334263904ba578e961dcd0)) + +## [1.7.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v1.6.0...protocol-v1.7.0) (2024-06-20) + + +### Features + +* **protocol:** add getLastVerifiedBlock and getLastSyncedBlock ([#17566](https://github.com/taikoxyz/taiko-mono/issues/17566)) ([cf0743f](https://github.com/taikoxyz/taiko-mono/commit/cf0743fcd48631dbf23cdba8a53343abfb7d5aae)) +* **protocol:** add new tcb & add test case ([#17622](https://github.com/taikoxyz/taiko-mono/issues/17622)) ([2384b7c](https://github.com/taikoxyz/taiko-mono/commit/2384b7c73c7b8814cb21ea276865fd92ac509fb1)) +* **protocol:** add new tcb & update related tests ([#17545](https://github.com/taikoxyz/taiko-mono/issues/17545)) ([97aa874](https://github.com/taikoxyz/taiko-mono/commit/97aa874e7637d29862f9b78af78e0c7a02bb424a)) +* **protocol:** change guardian prover cooldown windows ([#17590](https://github.com/taikoxyz/taiko-mono/issues/17590)) ([cc10b04](https://github.com/taikoxyz/taiko-mono/commit/cc10b04cefa90420325df3626ae22bf3b8149451)) +* **protocol:** improve DelegateOwner to have an optional L2 admin ([#17445](https://github.com/taikoxyz/taiko-mono/issues/17445)) ([1c59e8c](https://github.com/taikoxyz/taiko-mono/commit/1c59e8c42d71a900743ba6aaab8642297b29dc92)) +* **protocol:** lower liveness, validity, and contestation bonds by 50% ([#17616](https://github.com/taikoxyz/taiko-mono/issues/17616)) ([c9b8d40](https://github.com/taikoxyz/taiko-mono/commit/c9b8d407240720bcf6328569a3c57c830ea79d01)) +* **protocol:** persist and compare stateRoot only once per 16 blocks ([b7e12e3](https://github.com/taikoxyz/taiko-mono/commit/b7e12e3c36879361c1bb470e3d6132dfc63150ef)) +* **protocol:** remove hook support completely ([b7e12e3](https://github.com/taikoxyz/taiko-mono/commit/b7e12e3c36879361c1bb470e3d6132dfc63150ef)) +* **protocol:** require assigned prover to be the block proposer itself ([b7e12e3](https://github.com/taikoxyz/taiko-mono/commit/b7e12e3c36879361c1bb470e3d6132dfc63150ef)) +* **protocol:** update Hekla deployment ([#17560](https://github.com/taikoxyz/taiko-mono/issues/17560)) ([bfeadd8](https://github.com/taikoxyz/taiko-mono/commit/bfeadd8f44dc7284e6e8c81cd13e8433ec04e410)) +* **protocol:** verify blocks less frequently but more efficiently ([b7e12e3](https://github.com/taikoxyz/taiko-mono/commit/b7e12e3c36879361c1bb470e3d6132dfc63150ef)) + + +### Bug Fixes + +* **protocol:** fix an issue for `ProverSet.proposeBlock` ([#17521](https://github.com/taikoxyz/taiko-mono/issues/17521)) ([d3037ad](https://github.com/taikoxyz/taiko-mono/commit/d3037ad6551b5ae6353a360ae3677ec17cd00ec9)) +* **protocol:** fix Bridge forwarded gas check and `getMessageMinGasLimit` ([#17529](https://github.com/taikoxyz/taiko-mono/issues/17529)) ([0082c6a](https://github.com/taikoxyz/taiko-mono/commit/0082c6a5dd6e383edf13b8505712d20a86d99cba)) +* **protocol:** fix getLastSyncedBlock by writing the block's verifiedTransitionId ([6e07ab5](https://github.com/taikoxyz/taiko-mono/commit/6e07ab5089602ef552592985d230c879b5905312)) +* **protocol:** fix in vesting scripts ([#17581](https://github.com/taikoxyz/taiko-mono/issues/17581)) ([5d7b256](https://github.com/taikoxyz/taiko-mono/commit/5d7b256b00e3903ae097ecd24e6ed296a6a17828)) +* **protocol:** fix ProverSet permission issue ([#17527](https://github.com/taikoxyz/taiko-mono/issues/17527)) ([98b47d4](https://github.com/taikoxyz/taiko-mono/commit/98b47d421697694db1926486410c08adbf4a6155)) +* **protocol:** fix seemingly quota issue ([#17544](https://github.com/taikoxyz/taiko-mono/issues/17544)) ([d083eeb](https://github.com/taikoxyz/taiko-mono/commit/d083eeb29cf7610b733b978e3cfdd0df2d7461f8)) +* **protocol:** fix tip payment to L1 block builder ([6e07ab5](https://github.com/taikoxyz/taiko-mono/commit/6e07ab5089602ef552592985d230c879b5905312)) + + +### Chores + +* **protocol:** add assumption desc. for IBridgedERC20 ([#17546](https://github.com/taikoxyz/taiko-mono/issues/17546)) ([7fa3b55](https://github.com/taikoxyz/taiko-mono/commit/7fa3b55cc9322d79850bdbfb31def9c0501cf647)) +* **protocol:** update TAIKO symbol in protocol deployment logs ([#17555](https://github.com/taikoxyz/taiko-mono/issues/17555)) ([04bb81e](https://github.com/taikoxyz/taiko-mono/commit/04bb81e692348ca7a16bf92588379e047a1bf5f5)) + + +### Documentation + +* **protocol:** add open_zeppelin_taiko_protocol_audit_june_2024.pdf ([#17621](https://github.com/taikoxyz/taiko-mono/issues/17621)) ([03cff67](https://github.com/taikoxyz/taiko-mono/commit/03cff6788c3ce1b8b2979beb110336d5383847cf)) +* **protocol:** update Hekla deployment ([#17543](https://github.com/taikoxyz/taiko-mono/issues/17543)) ([98beab8](https://github.com/taikoxyz/taiko-mono/commit/98beab8a7de4f365ec76bd6fbffebfcc6fb4505d)) +* **protocol:** update Hekla deployment ([#17592](https://github.com/taikoxyz/taiko-mono/issues/17592)) ([6bcda30](https://github.com/taikoxyz/taiko-mono/commit/6bcda306792ff8a15339b3f0ff217929cb7684cf)) +* **protocol:** update L1 deployment ([#17513](https://github.com/taikoxyz/taiko-mono/issues/17513)) ([006e522](https://github.com/taikoxyz/taiko-mono/commit/006e522ea962adda0f42bde6e54d3d0e3f901d29)) + + +### Code Refactoring + +* **protocol:** avoid unnecessary Signal Service call ([#17516](https://github.com/taikoxyz/taiko-mono/issues/17516)) ([9fac584](https://github.com/taikoxyz/taiko-mono/commit/9fac584a5001d6b5246062cba3f24a374f6697fa)) +* **protocol:** optimize storage reads/writes in proveBlock ([#17532](https://github.com/taikoxyz/taiko-mono/issues/17532)) ([ba5c25b](https://github.com/taikoxyz/taiko-mono/commit/ba5c25b4060865b7c36cce8a3d0d86ad930cbc4c)) + ## [1.6.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v1.5.0...protocol-v1.6.0) (2024-06-07) diff --git a/packages/protocol/README.md b/packages/protocol/README.md index 371e99b6972..f71ac8c7eb1 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -1,139 +1,145 @@ # Taiko Protocol -This package contains rollup contracts on both L1 and L2, along with other assisting code. Taiko L2's chain ID is [167](https://github.com/ethereum-lists/chains/pull/1611). +This repository contains the Taiko Based Contestable Rollup (BCR) protocol and supporting tools. The project is managed using `pnpm` and `foundry`. -## Getting Started +## Prerequisites -Before compiling smart contracts, ensure all necessary dependencies are installed: +Before compiling the smart contracts, ensure the following are installed and up to date: -```sh -pnpm install +- [Foundry](https://book.getfoundry.sh/) +- [pnpm](https://pnpm.io/) + +To install dependencies: + +```bash +foundryup && pnpm install ``` -Then, compile the smart contracts: +## Compilation and Testing -```sh -pnpm compile +Taiko’s protocol is split between Layer 1 (L1) and Layer 2 (L2). The smart contracts need to be compiled and tested separately for each layer: + +### Layer 1 (Ethereum, Duncan Hardfork) + +To compile, run tests, and generate the storage layout for L1: + +```bash +pnpm compile:l1 +pnpm test:l1 +pnpm layout:l1 ``` -If you run into `Error: Unknown version provided`, you should upgrade your foundry installation by running `curl -L https://foundry.paradigm.xyz | bash`. +### Layer 2 (Taiko, Shanghai Hardfork) -## Style Guide +Similarly, for L2: + +```bash +pnpm compile:l2 +pnpm test:l2 +pnpm layout:l2 +``` + +### Compile and Test for Both Layers + +To compile and test contracts for both L1 and L2 at once: + +```bash +pnpm compile +pnpm test +pnpm layout +``` -Please see [CONTRIBUTING.md](../../CONTRIBUTING.md) for the source code style guidelines to adhere to. +## Layer 2 Genesis Block -## Generate L2 Genesis JSON's `alloc` Field +### Generating a Dummy Genesis Block -Create a `config.js` with the following structure: +To generate dummy data for the L2 genesis block, create a configuration file at `./test/genesis/data/genesis_config.js` with the following content: ```javascript module.exports = { - // Owner address of the pre-deployed L2 contracts. contractOwner: "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", - // Chain ID of the Taiko L2 network. chainId: 167, - // Account address and pre-mint ETH amount as key-value pairs. seedAccounts: [ { "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39": 1024 }, { "0x79fcdef22feed20eddacbb2587640e45491b757f": 1024 }, ], - // Owner Chain ID, Security Council, and Timelock Controller l1ChainId: 31337, ownerSecurityCouncil: "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", ownerTimelockController: "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", - // L2 EIP-1559 baseFee calculation related fields. param1559: { gasExcess: 1, }, - // Option to pre-deploy an ERC-20 token. predeployERC20: true, }; ``` -Then, execute the generation script: +Then compile the L2 contracts and generate the genesis block: -```sh -pnpm compile && pnpm generate:genesis config.js +```bash +pnpm compile:l2 +pnpm genesis:gen ``` -The script will output two JSON files under `./deployments`: - -- `l2_genesis_alloc.json`: the `alloc` field which will be used in L2 genesis JSON file -- `l2_genesis_storage_layout.json`: the storage layout of those pre-deployed contracts - -## Using Foundry +This generates the following JSON files in `./test/genesis/data/`: -This project also integrates with Foundry for building and testing contracts. +- `l2_genesis_alloc.json`: Contains the `alloc` field for the L2 genesis block. Use this in a `geth` or `taiko-geth` genesis block following [this guide](https://geth.ethereum.org/docs/fundamentals/private-network#creating-genesis-block). +- `l2_genesis_storage_layout.json`: Displays the storage layout of the pre-deployed contracts. -- To compile using foundry: `forge build` or `pnpm compile` -- To run foundry tests: `forge test --gas-report -vvv` or `pnpm test:foundry` +To validate the genesis data: -## Generating and Running the L2 Genesis Block - -The generation of the L2 genesis block and obtaining its hash involves a series of steps, including constructing the genesis JSON, followed by the actual generation and retrieval of the genesis block hash. A test can be executed to comprehend this process. - -### Testing Genesis Block Creation - -To understand how the `genesis.json` is built from deployment files and how to generate the genesis block and its hash, you can use the `test:genesis` command. This test serves as a learning tool: - -```sh -pnpm test:genesis +```bash +pnpm genesis:test ``` -This test, defined in `./genesis/generate_genesis.test.sh`, compiles the contracts, generates the genesis JSON, and initiates a Geth node using Docker to simulate the deployment of the genesis block. Reviewing this script and its output can help you grasp the steps required to create and initiate a genesis block for the Taiko Protocol. - -### Generating the Actual Genesis Block - -After understanding the process from the test, proceed to generate the actual `genesis.json` and the genesis block: - -1. **Build the Genesis JSON:** Use the information learned from the `test:genesis` to build the `genesis.json` file from the files in the `/deployments/` directory. The `generate_genesis.test.sh` script contains the necessary commands to create this file. - -2. **Run Geth to Generate the Genesis Block:** You can use Geth to initialize and run a private network with the genesis block. You can start Geth with the following commands: +This runs tests using Docker and `taiko-geth` to simulate the L2 genesis block deployment, and generates a `genesis.json` file in `./test/genesis/data/`. - ```sh - geth --datadir ~/taiko-l2-network/node init /deployments/genesis.json - geth --datadir ~/taiko-l2-network/node --networkid 167 --http --http.addr 127.0.0.1 --http.port 8552 --http.corsdomain "*" - ``` +### Generating an Actual Genesis Block - For details refer to the Geth documentation on [creating a genesis block](https://geth.ethereum.org/docs/fundamentals/private-network#creating-genesis-block). +To generate the actual L2 genesis block, create a `genesis.json` file based on `l2_genesis_alloc.json`, following [this guide](https://geth.ethereum.org/docs/fundamentals/private-network#creating-genesis-block). -3. **Retrieve the Genesis Block Hash:** Connect to the Geth node using the command: +Next, initialize `taiko-geth` with the generated `genesis.json`: - ```sh - geth attach ~/taiko-l2-network/node/geth.ipc - ``` +```bash +geth --datadir ~/taiko-l2-network/node init test/layer2/genesis/data/genesis.json +geth --datadir ~/taiko-l2-network/node --networkid 167 --http --http.addr 127.0.0.1 --http.port 8552 --http.corsdomain "*" +``` - In the Geth console, use `eth.getBlock(0)` to obtain the hash of the genesis block. +You can retrieve the genesis block hash by attaching to the `geth` instance: -4. **Update `test_deploy_on_l1.sh` File:** Update the `L2_GENESIS_HASH` variable in the `test_deploy_on_l1.sh` script with the obtained genesis block hash. +```bash +geth attach ~/taiko-l2-network/node/geth.ipc +``` -By following these steps, you will successfully generate the L2 genesis block for the Taiko Protocol, retrieve its hash, and prepare for the L1 contract deployment. +Then run: -## Deploying the L1 Contracts +```bash +eth.getBlock(0) +``` -To deploy L1 contracts for Taiko Protocol, you can use any Ethereum network. This guide illustrates the process using a Hardhat local network, but it's adaptable to others. The deployment relies on `script/test_deploy_on_l1.sh`, which targets a node at `http://localhost:8545` by default. +Copy the genesis block hash and replace the `L2_GENESIS_HASH` variable in `deploy_protocol_on_l1.sh` with this value. -Here’s how you can proceed: +### Deploying Taiko BCR on Layer 1 -1. **Ensure Sufficient ETH:** Check that the address associated with the private key in `script/test_deploy_on_l1.sh` has enough ETH for deploying contracts on the Hardhat network. +To deploy Taiko BCR on L1, start a local L1 network: -2. **Update Contract Addresses:** After running the genesis block generation script (`pnpm test:genesis`), you will receive a list of pre-computed contract addresses. These addresses need to be added to the `test_deploy_on_l1.sh` file. Make sure to update this file with the correct contract addresses before proceeding with the deployment. +```bash +anvil --hardfork cancun +``` -3. **Start a Local Development Network:** While this guide uses Hardhat as an example, you can use any Ethereum network. If you choose to use Hardhat, start a local Ethereum network for development and testing: +Make sure you have sufficient ether for transactions, then deploy the contracts: -```sh -pnpm hardhat node +```bash +pnpm test:deploy:l1 ``` -4. **Deploy Contracts Using Foundry:** Once your network is running, open a new terminal window and execute the deployment scripts using Foundry: +This command runs the deployment script located at `script/deploy_protocol_on_l1.sh`, assuming L1 is accessible at `http://localhost:8545`. -```sh -pnpm test:deploy -``` +## Style Guide -This command will deploy the L1 contracts using the settings and addresses you’ve provided in the `test_deploy_on_l1.sh` script. +Refer to [CONTRIBUTING.md](../../CONTRIBUTING.md) for code style guidelines. -## Running slither +Before committing code, format and lint it using: -1. Install the latest [slither](https://github.com/crytic/slither?tab=readme-ov-file#how-to-install). -2. From `protocol/`, execute `slither . --checklist > checklist.md` to re-generate the checklist. +```bash +pnpm fmt:sol +``` diff --git a/packages/protocol/audit/code4rena-2024-03-taiko-final-report.md b/packages/protocol/audit/code4rena-2024-03-taiko-final-report.md index 4f700ec4272..1474e8f30a5 100644 --- a/packages/protocol/audit/code4rena-2024-03-taiko-final-report.md +++ b/packages/protocol/audit/code4rena-2024-03-taiko-final-report.md @@ -670,7 +670,7 @@ Notice how if the payment is in ERC20 tokens, the payee will be the variable \_m 1. proposer A approves the assignmentHook contract to spend a portion of their tokens, the allowance is set higher than the actual fee they will be paying. 2. proposer A proposes a block, and a fee is charged and payed to the assigned prover, but there remains allowance that the assignment hook contract can still use. -3. proposer B proposes a block and sets params.coinbase as the the address of proposer A. +3. proposer B proposes a block and sets params.coinbase as the address of proposer A. 4. proposer A address will be the payee of the fee for the assigned prover for the block proposed by proposer B. The scenario above describes how someone can be forced maliciously to pay fees for block proposals by other actors. @@ -1207,7 +1207,7 @@ When this function is called to un-suspend a message we set `proofReceipt[msgHas `bridge_watchdog` can therefore forge arbitrary messages and have them treated as proven by first suspending them and then un-suspending them. -`bride_watchdog` is supposed to only be able to ban and suspend messages, in the expected worst case `bridge_watchdog` is limited to DDOSing messages and bans until governance removes the the `bridge_watchdog`. +`bride_watchdog` is supposed to only be able to ban and suspend messages, in the expected worst case `bridge_watchdog` is limited to DDOSing messages and bans until governance removes the `bridge_watchdog`. With the privilege escalation shown here the role can instead drain the bridge of all ETH and tokens. @@ -2109,7 +2109,7 @@ A different bug report titled **_"No incentive for message non-owners to retryMe ### Impact -- Protocol can be gamed by a user to gain rewards while additionaly saving money by providing the least possible gas. +- Protocol can be gamed by a user to gain rewards while additionally saving money by providing the least possible gas. - There is no incentive for any external user now to ever provide more than `{gas: 10_897_060}` (approx figure). diff --git a/packages/protocol/audit/open_zeppelin_taiko_protocol_audit_june_2024.pdf b/packages/protocol/audit/open_zeppelin_taiko_protocol_audit_june_2024.pdf new file mode 100644 index 0000000000000000000000000000000000000000..47a48d4791dc020f04aa4c34b85de282aac33109 GIT binary patch literal 610624 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¬kU@ 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


      5`eO~)l9V-2G_Cx?DtA~saE;X;$6$<77NkKpW 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

      _U2QxQ@P>fzGGva?VePnST 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

      U*CXe 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℞37fw!;|nak;9AssM1Y=$3(E%?_5iW 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 W_D05#EOe}_Obn33#KJN^Apaj^EngG> literal 0 HcmV?d00001 diff --git a/packages/protocol/audit/open_zeppelin_taiko_protocol_ontake_audit_nov_2024.pdf.pdf b/packages/protocol/audit/open_zeppelin_taiko_protocol_ontake_audit_nov_2024.pdf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ffa07e75c8724ea74f02bda2d871e4649c2a7ec2 GIT binary patch literal 165663 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

      - +

      bTSr=LQ0MIW3C?~& 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�yPdn1--h5DaoNeR&TS;fRFpvxCMJmhNy+ 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 bytes32) | 251 | 0 | 32 | contracts/L2/TaikoL2.sol:TaikoL2 | -| publicInputHash | bytes32 | 252 | 0 | 32 | contracts/L2/TaikoL2.sol:TaikoL2 | -| gasExcess | uint64 | 253 | 0 | 8 | contracts/L2/TaikoL2.sol:TaikoL2 | -| lastSyncedBlock | uint64 | 253 | 8 | 8 | contracts/L2/TaikoL2.sol:TaikoL2 | -| __deprecated1 | uint64 | 253 | 16 | 8 | contracts/L2/TaikoL2.sol:TaikoL2 | -| __deprecated2 | uint64 | 253 | 24 | 8 | contracts/L2/TaikoL2.sol:TaikoL2 | -| l1ChainId | uint64 | 254 | 0 | 8 | contracts/L2/TaikoL2.sol:TaikoL2 | -| __gap | uint256[46] | 255 | 0 | 1472 | contracts/L2/TaikoL2.sol:TaikoL2 | - -## SignalService -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------------|------|--------|-------|--------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/signal/SignalService.sol:SignalService | -| _initializing | bool | 0 | 1 | 1 | contracts/signal/SignalService.sol:SignalService | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/signal/SignalService.sol:SignalService | -| _owner | address | 51 | 0 | 20 | contracts/signal/SignalService.sol:SignalService | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/signal/SignalService.sol:SignalService | -| _pendingOwner | address | 101 | 0 | 20 | contracts/signal/SignalService.sol:SignalService | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/signal/SignalService.sol:SignalService | -| addressManager | address | 151 | 0 | 20 | contracts/signal/SignalService.sol:SignalService | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/signal/SignalService.sol:SignalService | -| __reentry | uint8 | 201 | 0 | 1 | contracts/signal/SignalService.sol:SignalService | -| __paused | uint8 | 201 | 1 | 1 | contracts/signal/SignalService.sol:SignalService | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/signal/SignalService.sol:SignalService | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/signal/SignalService.sol:SignalService | -| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | contracts/signal/SignalService.sol:SignalService | -| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | contracts/signal/SignalService.sol:SignalService | -| __gap | uint256[48] | 253 | 0 | 1536 | contracts/signal/SignalService.sol:SignalService | - -## Bridge -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------|------|--------|-------|------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/bridge/Bridge.sol:Bridge | -| _initializing | bool | 0 | 1 | 1 | contracts/bridge/Bridge.sol:Bridge | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/bridge/Bridge.sol:Bridge | -| _owner | address | 51 | 0 | 20 | contracts/bridge/Bridge.sol:Bridge | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/bridge/Bridge.sol:Bridge | -| _pendingOwner | address | 101 | 0 | 20 | contracts/bridge/Bridge.sol:Bridge | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/bridge/Bridge.sol:Bridge | -| addressManager | address | 151 | 0 | 20 | contracts/bridge/Bridge.sol:Bridge | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/bridge/Bridge.sol:Bridge | -| __reentry | uint8 | 201 | 0 | 1 | contracts/bridge/Bridge.sol:Bridge | -| __paused | uint8 | 201 | 1 | 1 | contracts/bridge/Bridge.sol:Bridge | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/bridge/Bridge.sol:Bridge | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/bridge/Bridge.sol:Bridge | -| __reserved1 | uint64 | 251 | 0 | 8 | contracts/bridge/Bridge.sol:Bridge | -| nextMessageId | uint64 | 251 | 8 | 8 | contracts/bridge/Bridge.sol:Bridge | -| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | contracts/bridge/Bridge.sol:Bridge | -| __ctx | struct IBridge.Context | 253 | 0 | 64 | contracts/bridge/Bridge.sol:Bridge | -| __reserved2 | uint256 | 255 | 0 | 32 | contracts/bridge/Bridge.sol:Bridge | -| __reserved3 | uint256 | 256 | 0 | 32 | contracts/bridge/Bridge.sol:Bridge | -| __gap | uint256[44] | 257 | 0 | 1408 | contracts/bridge/Bridge.sol:Bridge | - -## DelegateOwner -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|----------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| _initializing | bool | 0 | 1 | 1 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| _owner | address | 51 | 0 | 20 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| _pendingOwner | address | 101 | 0 | 20 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| addressManager | address | 151 | 0 | 20 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __reentry | uint8 | 201 | 0 | 1 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __paused | uint8 | 201 | 1 | 1 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| l1ChainId | uint64 | 251 | 0 | 8 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| nextTxId | uint64 | 251 | 8 | 8 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| realOwner | address | 252 | 0 | 20 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __gap | uint256[48] | 253 | 0 | 1536 | contracts/L2/DelegateOwner.sol:DelegateOwner | - -## GuardianProver -| Name | Type | Slot | Offset | Bytes | Contract | -|-------------------------|-------------------------------------------------|------|--------|-------|--------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| _initializing | bool | 0 | 1 | 1 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| _owner | address | 51 | 0 | 20 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| _pendingOwner | address | 101 | 0 | 20 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| addressManager | address | 151 | 0 | 20 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __reentry | uint8 | 201 | 0 | 1 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __paused | uint8 | 201 | 1 | 1 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| guardianIds | mapping(address => uint256) | 251 | 0 | 32 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| approvals | mapping(uint256 => mapping(bytes32 => uint256)) | 252 | 0 | 32 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| guardians | address[] | 253 | 0 | 32 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| version | uint32 | 254 | 0 | 4 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| minGuardians | uint32 | 254 | 4 | 4 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| provingAutoPauseEnabled | bool | 254 | 8 | 1 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| latestProofHash | mapping(uint256 => mapping(uint256 => bytes32)) | 255 | 0 | 32 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __gap | uint256[45] | 256 | 0 | 1440 | contracts/L1/provers/GuardianProver.sol:GuardianProver | - -## TaikoToken -| Name | Type | Slot | Offset | Bytes | Contract | -|-----------------------------------------------------|---------------------------------------------------------------|------|--------|-------|-----------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tko/TaikoToken.sol:TaikoToken | -| _initializing | bool | 0 | 1 | 1 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tko/TaikoToken.sol:TaikoToken | -| _owner | address | 51 | 0 | 20 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tko/TaikoToken.sol:TaikoToken | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tko/TaikoToken.sol:TaikoToken | -| addressManager | address | 151 | 0 | 20 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tko/TaikoToken.sol:TaikoToken | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tko/TaikoToken.sol:TaikoToken | -| __paused | uint8 | 201 | 1 | 1 | contracts/tko/TaikoToken.sol:TaikoToken | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tko/TaikoToken.sol:TaikoToken | -| __slots_previously_used_by_ERC20SnapshotUpgradeable | uint256[50] | 251 | 0 | 1600 | contracts/tko/TaikoToken.sol:TaikoToken | -| _balances | mapping(address => uint256) | 301 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _allowances | mapping(address => mapping(address => uint256)) | 302 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _totalSupply | uint256 | 303 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _name | string | 304 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _symbol | string | 305 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[45] | 306 | 0 | 1440 | contracts/tko/TaikoToken.sol:TaikoToken | -| _hashedName | bytes32 | 351 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _hashedVersion | bytes32 | 352 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _name | string | 353 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _version | string | 354 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[48] | 355 | 0 | 1536 | contracts/tko/TaikoToken.sol:TaikoToken | -| _nonces | mapping(address => struct CountersUpgradeable.Counter) | 403 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _PERMIT_TYPEHASH_DEPRECATED_SLOT | bytes32 | 404 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[49] | 405 | 0 | 1568 | contracts/tko/TaikoToken.sol:TaikoToken | -| _delegates | mapping(address => address) | 454 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _checkpoints | mapping(address => struct ERC20VotesUpgradeable.Checkpoint[]) | 455 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _totalSupplyCheckpoints | struct ERC20VotesUpgradeable.Checkpoint[] | 456 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[47] | 457 | 0 | 1504 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[50] | 504 | 0 | 1600 | contracts/tko/TaikoToken.sol:TaikoToken | - -## BridgedTaikoToken -| Name | Type | Slot | Offset | Bytes | Contract | -|-----------------------------------------------------|---------------------------------------------------------------|------|--------|-------|-------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _initializing | bool | 0 | 1 | 1 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _owner | address | 51 | 0 | 20 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| addressManager | address | 151 | 0 | 20 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __paused | uint8 | 201 | 1 | 1 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __slots_previously_used_by_ERC20SnapshotUpgradeable | uint256[50] | 251 | 0 | 1600 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _balances | mapping(address => uint256) | 301 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _allowances | mapping(address => mapping(address => uint256)) | 302 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _totalSupply | uint256 | 303 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _name | string | 304 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _symbol | string | 305 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[45] | 306 | 0 | 1440 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _hashedName | bytes32 | 351 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _hashedVersion | bytes32 | 352 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _name | string | 353 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _version | string | 354 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[48] | 355 | 0 | 1536 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _nonces | mapping(address => struct CountersUpgradeable.Counter) | 403 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _PERMIT_TYPEHASH_DEPRECATED_SLOT | bytes32 | 404 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[49] | 405 | 0 | 1568 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _delegates | mapping(address => address) | 454 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _checkpoints | mapping(address => struct ERC20VotesUpgradeable.Checkpoint[]) | 455 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _totalSupplyCheckpoints | struct ERC20VotesUpgradeable.Checkpoint[] | 456 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[47] | 457 | 0 | 1504 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[50] | 504 | 0 | 1600 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | - -## ERC20Vault -| Name | Type | Slot | Offset | Bytes | Contract | -|--------------------|------------------------------------------------------|------|--------|-------|------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| _initializing | bool | 0 | 1 | 1 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| _owner | address | 51 | 0 | 20 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| addressManager | address | 151 | 0 | 20 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __paused | uint8 | 201 | 1 | 1 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[50] | 251 | 0 | 1600 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| bridgedToCanonical | mapping(address => struct ERC20Vault.CanonicalERC20) | 301 | 0 | 32 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| btokenDenylist | mapping(address => bool) | 303 | 0 | 32 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| lastMigrationStart | mapping(uint256 => mapping(address => uint256)) | 304 | 0 | 32 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[46] | 305 | 0 | 1472 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | - -## ERC721Vault -| Name | Type | Slot | Offset | Bytes | Contract | -|--------------------|------------------------------------------------------|------|--------|-------|--------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| _initializing | bool | 0 | 1 | 1 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| _owner | address | 51 | 0 | 20 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| addressManager | address | 151 | 0 | 20 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __paused | uint8 | 201 | 1 | 1 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[50] | 251 | 0 | 1600 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[48] | 303 | 0 | 1536 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[50] | 351 | 0 | 1600 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | - -## ERC1155Vault -| Name | Type | Slot | Offset | Bytes | Contract | -|--------------------|------------------------------------------------------|------|--------|-------|----------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| _initializing | bool | 0 | 1 | 1 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| _owner | address | 51 | 0 | 20 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| addressManager | address | 151 | 0 | 20 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __paused | uint8 | 201 | 1 | 1 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[50] | 251 | 0 | 1600 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[48] | 303 | 0 | 1536 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[50] | 351 | 0 | 1600 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[50] | 401 | 0 | 1600 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[50] | 451 | 0 | 1600 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | - -## BridgedERC20 -| Name | Type | Slot | Offset | Bytes | Contract | -|------------------|-------------------------------------------------|------|--------|-------|----------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _initializing | bool | 0 | 1 | 1 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _owner | address | 51 | 0 | 20 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| addressManager | address | 151 | 0 | 20 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __paused | uint8 | 201 | 1 | 1 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _balances | mapping(address => uint256) | 251 | 0 | 32 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _totalSupply | uint256 | 253 | 0 | 32 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _name | string | 254 | 0 | 32 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _symbol | string | 255 | 0 | 32 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[45] | 256 | 0 | 1440 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| srcToken | address | 301 | 0 | 20 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __srcDecimals | uint8 | 301 | 20 | 1 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| srcChainId | uint256 | 302 | 0 | 32 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| migratingAddress | address | 303 | 0 | 20 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| migratingInbound | bool | 303 | 20 | 1 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[47] | 304 | 0 | 1504 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | - -## BridgedERC721 -| Name | Type | Slot | Offset | Bytes | Contract | -|--------------------|----------------------------------------------|------|--------|-------|------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _initializing | bool | 0 | 1 | 1 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _owner | address | 51 | 0 | 20 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| addressManager | address | 151 | 0 | 20 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __paused | uint8 | 201 | 1 | 1 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[50] | 251 | 0 | 1600 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _name | string | 301 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _symbol | string | 302 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _owners | mapping(uint256 => address) | 303 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _balances | mapping(address => uint256) | 304 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _tokenApprovals | mapping(uint256 => address) | 305 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _operatorApprovals | mapping(address => mapping(address => bool)) | 306 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[44] | 307 | 0 | 1408 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| srcToken | address | 351 | 0 | 20 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| srcChainId | uint256 | 352 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[48] | 353 | 0 | 1536 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | - -## BridgedERC1155 -| Name | Type | Slot | Offset | Bytes | Contract | -|--------------------|-------------------------------------------------|------|--------|-------|--------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| _initializing | bool | 0 | 1 | 1 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| _owner | address | 51 | 0 | 20 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| addressManager | address | 151 | 0 | 20 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __paused | uint8 | 201 | 1 | 1 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[50] | 251 | 0 | 1600 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| _balances | mapping(uint256 => mapping(address => uint256)) | 301 | 0 | 32 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| _operatorApprovals | mapping(address => mapping(address => bool)) | 302 | 0 | 32 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| _uri | string | 303 | 0 | 32 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[47] | 304 | 0 | 1504 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| srcToken | address | 351 | 0 | 20 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| srcChainId | uint256 | 352 | 0 | 32 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| symbol | string | 353 | 0 | 32 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| name | string | 354 | 0 | 32 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[46] | 355 | 0 | 1472 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | - -## AssignmentHook -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| _initializing | bool | 0 | 1 | 1 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| _owner | address | 51 | 0 | 20 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| _pendingOwner | address | 101 | 0 | 20 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| addressManager | address | 151 | 0 | 20 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __reentry | uint8 | 201 | 0 | 1 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __paused | uint8 | 201 | 1 | 1 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __gap | uint256[50] | 251 | 0 | 1600 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | - -## ERC20Airdrop -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|--------------------------|------|--------|-------|------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| _initializing | bool | 0 | 1 | 1 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| _owner | address | 51 | 0 | 20 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| _pendingOwner | address | 101 | 0 | 20 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| addressManager | address | 151 | 0 | 20 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __reentry | uint8 | 201 | 0 | 1 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __paused | uint8 | 201 | 1 | 1 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| isClaimed | mapping(bytes32 => bool) | 251 | 0 | 32 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| merkleRoot | bytes32 | 252 | 0 | 32 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| claimStart | uint64 | 253 | 0 | 8 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| claimEnd | uint64 | 253 | 8 | 8 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[47] | 254 | 0 | 1504 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| token | address | 301 | 0 | 20 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| vault | address | 302 | 0 | 20 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[48] | 303 | 0 | 1536 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | - -## AutomataDcapV3Attestation -| Name | Type | Slot | Offset | Bytes | Contract | -|-------------------------|-------------------------------------------------|------|--------|-------|----------------------------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| _initializing | bool | 0 | 1 | 1 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| _owner | address | 51 | 0 | 20 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| _pendingOwner | address | 101 | 0 | 20 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| addressManager | address | 151 | 0 | 20 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __reentry | uint8 | 201 | 0 | 1 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __paused | uint8 | 201 | 1 | 1 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| sigVerifyLib | contract ISigVerifyLib | 251 | 0 | 20 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| pemCertLib | contract IPEMCertChainLib | 252 | 0 | 20 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| checkLocalEnclaveReport | bool | 252 | 20 | 1 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| trustedUserMrEnclave | mapping(bytes32 => bool) | 253 | 0 | 32 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| trustedUserMrSigner | mapping(bytes32 => bool) | 254 | 0 | 32 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| serialNumIsRevoked | mapping(uint256 => mapping(bytes => bool)) | 255 | 0 | 32 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| tcbInfo | mapping(string => struct TCBInfoStruct.TCBInfo) | 256 | 0 | 32 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| qeIdentity | struct EnclaveIdStruct.EnclaveId | 257 | 0 | 128 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __gap | uint256[39] | 261 | 0 | 1248 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | - -## SgxVerifier -| Name | Type | Slot | Offset | Bytes | Contract | -|-------------------|-------------------------------------------------|------|--------|-------|-------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| _initializing | bool | 0 | 1 | 1 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| _owner | address | 51 | 0 | 20 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| _pendingOwner | address | 101 | 0 | 20 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| addressManager | address | 151 | 0 | 20 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __reentry | uint8 | 201 | 0 | 1 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __paused | uint8 | 201 | 1 | 1 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| nextInstanceId | uint256 | 251 | 0 | 32 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| instances | mapping(uint256 => struct SgxVerifier.Instance) | 252 | 0 | 32 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| addressRegistered | mapping(address => bool) | 253 | 0 | 32 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __gap | uint256[47] | 254 | 0 | 1504 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | - -## RiscZeroVerifier -| Name | Type | Slot | Offset | Bytes | Contract | -|-----------------|-----------------------------------|------|--------|-------|-----------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| _initializing | bool | 0 | 1 | 1 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| _owner | address | 51 | 0 | 20 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| _pendingOwner | address | 101 | 0 | 20 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| addressManager | address | 151 | 0 | 20 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __reentry | uint8 | 201 | 0 | 1 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __paused | uint8 | 201 | 1 | 1 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| receiptVerifier | contract IRiscZeroReceiptVerifier | 251 | 0 | 20 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| isImageTrusted | mapping(bytes32 => bool) | 252 | 0 | 32 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __gap | uint256[48] | 253 | 0 | 1536 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | - -## QuotaManager -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------------|------|--------|-------|------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/bridge/QuotaManager.sol:QuotaManager | -| _initializing | bool | 0 | 1 | 1 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/bridge/QuotaManager.sol:QuotaManager | -| _owner | address | 51 | 0 | 20 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/bridge/QuotaManager.sol:QuotaManager | -| _pendingOwner | address | 101 | 0 | 20 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/bridge/QuotaManager.sol:QuotaManager | -| addressManager | address | 151 | 0 | 20 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __reentry | uint8 | 201 | 0 | 1 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __paused | uint8 | 201 | 1 | 1 | contracts/bridge/QuotaManager.sol:QuotaManager | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/bridge/QuotaManager.sol:QuotaManager | -| tokenQuota | mapping(address => struct QuotaManager.Quota) | 251 | 0 | 32 | contracts/bridge/QuotaManager.sol:QuotaManager | -| quotaPeriod | uint24 | 252 | 0 | 3 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __gap | uint256[48] | 253 | 0 | 1536 | contracts/bridge/QuotaManager.sol:QuotaManager | - -## ProverSet -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|--------------------------|------|--------|-------|------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/team/proving/ProverSet.sol:ProverSet | -| _initializing | bool | 0 | 1 | 1 | contracts/team/proving/ProverSet.sol:ProverSet | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/team/proving/ProverSet.sol:ProverSet | -| _owner | address | 51 | 0 | 20 | contracts/team/proving/ProverSet.sol:ProverSet | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/team/proving/ProverSet.sol:ProverSet | -| _pendingOwner | address | 101 | 0 | 20 | contracts/team/proving/ProverSet.sol:ProverSet | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/team/proving/ProverSet.sol:ProverSet | -| addressManager | address | 151 | 0 | 20 | contracts/team/proving/ProverSet.sol:ProverSet | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/team/proving/ProverSet.sol:ProverSet | -| __reentry | uint8 | 201 | 0 | 1 | contracts/team/proving/ProverSet.sol:ProverSet | -| __paused | uint8 | 201 | 1 | 1 | contracts/team/proving/ProverSet.sol:ProverSet | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/team/proving/ProverSet.sol:ProverSet | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/team/proving/ProverSet.sol:ProverSet | -| isProver | mapping(address => bool) | 251 | 0 | 32 | contracts/team/proving/ProverSet.sol:ProverSet | -| admin | address | 252 | 0 | 20 | contracts/team/proving/ProverSet.sol:ProverSet | -| __gap | uint256[48] | 253 | 0 | 1536 | contracts/team/proving/ProverSet.sol:ProverSet | - -## TokenUnlock -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|--------------------------|------|--------|-------|--------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| _initializing | bool | 0 | 1 | 1 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| _owner | address | 51 | 0 | 20 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| _pendingOwner | address | 101 | 0 | 20 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| addressManager | address | 151 | 0 | 20 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __reentry | uint8 | 201 | 0 | 1 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __paused | uint8 | 201 | 1 | 1 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| amountVested | uint256 | 251 | 0 | 32 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| recipient | address | 252 | 0 | 20 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| tgeTimestamp | uint64 | 252 | 20 | 8 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| isProverSet | mapping(address => bool) | 253 | 0 | 32 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __gap | uint256[47] | 254 | 0 | 1504 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | - diff --git a/packages/protocol/contract_layout_layer1.md b/packages/protocol/contract_layout_layer1.md new file mode 100644 index 00000000000..c5392a2e241 --- /dev/null +++ b/packages/protocol/contract_layout_layer1.md @@ -0,0 +1,1828 @@ +## ERC1155Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+-----------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| **gap | uint256[48] | 303 | 0 | 1536 | +| +| **gap | uint256[50] | 351 | 0 | 1600 | +| +| **gap | uint256[50] | 401 | 0 | 1600 | +| +| \_\_gap | uint256[50] | 451 | 0 | 1600 | +╰--------------------+------------------------------------------------------+------+--------+-------+-----------------------------------------------------------╯ + +## ERC20Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+-------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct ERC20Vault.CanonicalERC20) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| btokenDenylist | mapping(address => bool) | 303 | 0 | 32 | +| +| lastMigrationStart | mapping(uint256 => mapping(address => uint256)) | 304 | 0 | 32 | +| +| **gap | uint256[46] | 305 | 0 | 1472 | +╰--------------------+------------------------------------------------------+------+--------+-------+-------------------------------------------------------╯ + +## ERC721Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+---------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| **gap | uint256[48] | 303 | 0 | 1536 | +| +| \_\_gap | uint256[50] | 351 | 0 | 1600 | +╰--------------------+------------------------------------------------------+------+--------+-------+---------------------------------------------------------╯ + +## BridgedERC20 + +╭------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_balances | mapping(address => uint256) | 251 | 0 | 32 | +| +| \_allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | +| +| \_totalSupply | uint256 | 253 | 0 | 32 | +| +| \_name | string | 254 | 0 | 32 | +| +| \_symbol | string | 255 | 0 | 32 | +| +| **gap | uint256[45] | 256 | 0 | 1440 | +| +| srcToken | address | 301 | 0 | 20 | +| +| **srcDecimals | uint8 | 301 | 20 | 1 | +| +| srcChainId | uint256 | 302 | 0 | 32 | +| +| migratingAddress | address | 303 | 0 | 20 | +| +| migratingInbound | bool | 303 | 20 | 1 | +| +| \_\_gap | uint256[47] | 304 | 0 | 1504 | +╰------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╯ + +## BridgedERC20V2 + +╭------------------+--------------------------------------------------------+------+--------+-------+---------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_balances | mapping(address => uint256) | 251 | 0 | 32 | +| +| \_allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | +| +| \_totalSupply | uint256 | 253 | 0 | 32 | +| +| \_name | string | 254 | 0 | 32 | +| +| \_symbol | string | 255 | 0 | 32 | +| +| **gap | uint256[45] | 256 | 0 | 1440 | +| +| srcToken | address | 301 | 0 | 20 | +| +| **srcDecimals | uint8 | 301 | 20 | 1 | +| +| srcChainId | uint256 | 302 | 0 | 32 | +| +| migratingAddress | address | 303 | 0 | 20 | +| +| migratingInbound | bool | 303 | 20 | 1 | +| +| **gap | uint256[47] | 304 | 0 | 1504 | +| +| \_hashedName | bytes32 | 351 | 0 | 32 | +| +| \_hashedVersion | bytes32 | 352 | 0 | 32 | +| +| \_name | string | 353 | 0 | 32 | +| +| \_version | string | 354 | 0 | 32 | +| +| **gap | uint256[48] | 355 | 0 | 1536 | +| +| \_nonces | mapping(address => struct CountersUpgradeable.Counter) | 403 | 0 | 32 | +| +| \_\_gap | uint256[49] | 404 | 0 | 1568 | +╰------------------+--------------------------------------------------------+------+--------+-------+---------------------------------------------------------------╯ + +## BridgedERC721 + +╭--------------------+----------------------------------------------+------+--------+-------+-------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| \_name | string | 301 | 0 | 32 | +| +| \_symbol | string | 302 | 0 | 32 | +| +| \_owners | mapping(uint256 => address) | 303 | 0 | 32 | +| +| \_balances | mapping(address => uint256) | 304 | 0 | 32 | +| +| \_tokenApprovals | mapping(uint256 => address) | 305 | 0 | 32 | +| +| \_operatorApprovals | mapping(address => mapping(address => bool)) | 306 | 0 | 32 | +| +| **gap | uint256[44] | 307 | 0 | 1408 | +| +| srcToken | address | 351 | 0 | 20 | +| +| srcChainId | uint256 | 352 | 0 | 32 | +| +| \_\_gap | uint256[48] | 353 | 0 | 1536 | +╰--------------------+----------------------------------------------+------+--------+-------+-------------------------------------------------------------╯ + +## BridgedERC1155 + +╭--------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| \_balances | mapping(uint256 => mapping(address => uint256)) | 301 | 0 | 32 | +| +| \_operatorApprovals | mapping(address => mapping(address => bool)) | 302 | 0 | 32 | +| +| \_uri | string | 303 | 0 | 32 | +| +| **gap | uint256[47] | 304 | 0 | 1504 | +| +| srcToken | address | 351 | 0 | 20 | +| +| srcChainId | uint256 | 352 | 0 | 32 | +| +| symbol | string | 353 | 0 | 32 | +| +| name | string | 354 | 0 | 32 | +| +| \_\_gap | uint256[46] | 355 | 0 | 1472 | +╰--------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------╯ + +## Bridge + +╭------------------+-----------------------------------------+------+--------+-------+-------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **reserved1 | uint64 | 251 | 0 | 8 | +| +| nextMessageId | uint64 | 251 | 8 | 8 | +| +| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | +| +| **ctx | struct IBridge.Context | 253 | 0 | 64 | +| +| **reserved2 | uint256 | 255 | 0 | 32 | +| +| **reserved3 | uint256 | 256 | 0 | 32 | +| +| \_\_gap | uint256[44] | 257 | 0 | 1408 | +╰------------------+-----------------------------------------+------+--------+-------+-------------------------------------------╯ + +## QuotaManager + +╭------------------+-----------------------------------------------+------+--------+-------+-------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| tokenQuota | mapping(address => struct QuotaManager.Quota) | 251 | 0 | 32 | +| +| quotaPeriod | uint24 | 252 | 0 | 3 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+-----------------------------------------------+------+--------+-------+-------------------------------------------------------╯ + +## AddressManager + +╭------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | +| +| **gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╯ + +## AddressResolver + +╭----------------+-------------+------+--------+-------+-------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++====================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| addressManager | address | 0 | 2 | 20 | +| +| \_\_gap | uint256[49] | 1 | 0 | 1568 | +╰----------------+-------------+------+--------+-------+-------------------------------------------------------------╯ + +## EssentialContract + +╭------------------+-------------+------+--------+-------+-----------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==========================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +╰------------------+-------------+------+--------+-------+-----------------------------------------------------------------╯ + +## SignalService + +╭------------------+-----------------------------------------------+------+--------+-------+---------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++====================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | +| +| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+-----------------------------------------------+------+--------+-------+---------------------------------------------------------╯ + +## TaikoToken + +╭-----------------------------------------------------+---------------------------------------------------------------+------+--------+-------+--------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **slots_previously_used_by_ERC20SnapshotUpgradeable | uint256[50] | 251 | 0 | 1600 | +| +| \_balances | mapping(address => uint256) | 301 | 0 | 32 | +| +| \_allowances | mapping(address => mapping(address => uint256)) | 302 | 0 | 32 | +| +| \_totalSupply | uint256 | 303 | 0 | 32 | +| +| \_name | string | 304 | 0 | 32 | +| +| \_symbol | string | 305 | 0 | 32 | +| +| **gap | uint256[45] | 306 | 0 | 1440 | +| +| \_hashedName | bytes32 | 351 | 0 | 32 | +| +| \_hashedVersion | bytes32 | 352 | 0 | 32 | +| +| \_name | string | 353 | 0 | 32 | +| +| \_version | string | 354 | 0 | 32 | +| +| **gap | uint256[48] | 355 | 0 | 1536 | +| +| \_nonces | mapping(address => struct CountersUpgradeable.Counter) | 403 | 0 | 32 | +| +| \_PERMIT_TYPEHASH_DEPRECATED_SLOT | bytes32 | 404 | 0 | 32 | +| +| **gap | uint256[49] | 405 | 0 | 1568 | +| +| \_delegates | mapping(address => address) | 454 | 0 | 32 | +| +| \_checkpoints | mapping(address => struct ERC20VotesUpgradeable.Checkpoint[]) | 455 | 0 | 32 | +| +| \_totalSupplyCheckpoints | struct ERC20VotesUpgradeable.Checkpoint[] | 456 | 0 | 32 | +| +| **gap | uint256[47] | 457 | 0 | 1504 | +| +| **gap | uint256[50] | 504 | 0 | 1600 | +╰-----------------------------------------------------+---------------------------------------------------------------+------+--------+-------+--------------------------------------------------╯ + +## ComposeVerifier + +╭------------------+-------------+------+--------+-------+------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_\_gap | uint256[50] | 251 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+------------------------------------------------------------------------╯ + +## TeeAnyVerifier + +╭------------------+-------------+------+--------+-------+----------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| **gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+----------------------------------------------------------------------╯ + +## ZkAndTeeVerifier + +╭------------------+-------------+------+--------+-------+--------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| **gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+--------------------------------------------------------------------------╯ + +## ZkAnyVerifier + +╭------------------+-------------+------+--------+-------+--------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=============================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| **gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+--------------------------------------------------------------------╯ + +## Risc0Verifier + +╭------------------+--------------------------+------+--------+-------+------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| isImageTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | +| +| \_\_gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+--------------------------+------+--------+-------+------------------------------------------------------------╯ + +## SP1Verifier + +╭------------------+--------------------------+------+--------+-------+--------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==============================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| isProgramTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | +| +| \_\_gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+--------------------------+------+--------+-------+--------------------------------------------------------╯ + +## SgxVerifier + +╭-------------------+-------------------------------------------------+------+--------+-------+--------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++======================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| nextInstanceId | uint256 | 251 | 0 | 32 | +| +| instances | mapping(uint256 => struct SgxVerifier.Instance) | 252 | 0 | 32 | +| +| addressRegistered | mapping(address => bool) | 253 | 0 | 32 | +| +| \_\_gap | uint256[47] | 254 | 0 | 1504 | +╰-------------------+-------------------------------------------------+------+--------+-------+--------------------------------------------------------╯ + +## AutomataDcapV3Attestation + +╭-------------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===================================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| sigVerifyLib | contract ISigVerifyLib | 251 | 0 | 20 | +| +| pemCertLib | contract IPEMCertChainLib | 252 | 0 | 20 | +| +| checkLocalEnclaveReport | bool | 252 | 20 | 1 | +| +| trustedUserMrEnclave | mapping(bytes32 => bool) | 253 | 0 | 32 | +| +| trustedUserMrSigner | mapping(bytes32 => bool) | 254 | 0 | 32 | +| +| serialNumIsRevoked | mapping(uint256 => mapping(bytes => bool)) | 255 | 0 | 32 | +| +| tcbInfo | mapping(string => struct TCBInfoStruct.TCBInfo) | 256 | 0 | 32 | +| +| qeIdentity | struct EnclaveIdStruct.EnclaveId | 257 | 0 | 128 | +| +| \_\_gap | uint256[39] | 261 | 0 | 1248 | +╰-------------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------------------------------------------╯ + +## TaikoL1 + +╭------------------+------------------------+------+--------+-------+--------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| state | struct TaikoData.State | 251 | 0 | 1600 | +| +| \_\_gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+------------------------+------+--------+-------+--------------------------------------------╯ + +## HeklaTaikoL1 + +╭------------------+------------------------+------+--------+-------+------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==========================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| state | struct TaikoData.State | 251 | 0 | 1600 | +| +| \_\_gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+------------------------+------+--------+-------+------------------------------------------------------╯ + +## HeklaTierRouter + +╭------+------+------+--------+-------+----------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================+ +╰------+------+------+--------+-------+----------╯ + +## MainnetBridge + +╭------------------+-----------------------------------------+------+--------+-------+----------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **reserved1 | uint64 | 251 | 0 | 8 | +| +| nextMessageId | uint64 | 251 | 8 | 8 | +| +| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | +| +| **ctx | struct IBridge.Context | 253 | 0 | 64 | +| +| **reserved2 | uint256 | 255 | 0 | 32 | +| +| **reserved3 | uint256 | 256 | 0 | 32 | +| +| \_\_gap | uint256[44] | 257 | 0 | 1408 | +╰------------------+-----------------------------------------+------+--------+-------+----------------------------------------------------------------------╯ + +## MainnetSignalService + +╭------------------+-----------------------------------------------+------+--------+-------+------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | +| +| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+-----------------------------------------------+------+--------+-------+------------------------------------------------------------------------------------╯ + +## MainnetERC20Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct ERC20Vault.CanonicalERC20) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| btokenDenylist | mapping(address => bool) | 303 | 0 | 32 | +| +| lastMigrationStart | mapping(uint256 => mapping(address => uint256)) | 304 | 0 | 32 | +| +| **gap | uint256[46] | 305 | 0 | 1472 | +╰--------------------+------------------------------------------------------+------+--------+-------+------------------------------------------------------------------------------╯ + +## MainnetERC1155Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+----------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++======================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| **gap | uint256[48] | 303 | 0 | 1536 | +| +| **gap | uint256[50] | 351 | 0 | 1600 | +| +| **gap | uint256[50] | 401 | 0 | 1600 | +| +| \_\_gap | uint256[50] | 451 | 0 | 1600 | +╰--------------------+------------------------------------------------------+------+--------+-------+----------------------------------------------------------------------------------╯ + +## MainnetERC721Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+--------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++====================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| **gap | uint256[48] | 303 | 0 | 1536 | +| +| \_\_gap | uint256[50] | 351 | 0 | 1600 | +╰--------------------+------------------------------------------------------+------+--------+-------+--------------------------------------------------------------------------------╯ + +## MainnetSharedAddressManager + +╭------------------+-------------------------------------------------+------+--------+-------+--------------------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | +| +| **gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+-------------------------------------------------+------+--------+-------+--------------------------------------------------------------------------------------------------╯ + +## RollupAddressCache + +╭------+------+------+--------+-------+----------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================+ +╰------+------+------+--------+-------+----------╯ + +## SharedAddressCache + +╭------+------+------+--------+-------+----------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================+ +╰------+------+------+--------+-------+----------╯ + +## AddressCache + +╭------+------+------+--------+-------+----------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================+ +╰------+------+------+--------+-------+----------╯ + +## MainnetSgxVerifier + +╭-------------------+-------------------------------------------------+------+--------+-------+-------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| nextInstanceId | uint256 | 251 | 0 | 32 | +| +| instances | mapping(uint256 => struct SgxVerifier.Instance) | 252 | 0 | 32 | +| +| addressRegistered | mapping(address => bool) | 253 | 0 | 32 | +| +| \_\_gap | uint256[47] | 254 | 0 | 1504 | +╰-------------------+-------------------------------------------------+------+--------+-------+-------------------------------------------------------------------------------------╯ + +## MainnetSP1Verifier + +╭------------------+--------------------------+------+--------+-------+-------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| isProgramTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | +| +| \_\_gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+--------------------------+------+--------+-------+-------------------------------------------------------------------------------------╯ + +## MainnetZkAnyVerifier + +╭------------------+-------------+------+--------+-------+-----------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| **gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+-----------------------------------------------------------------------------------------╯ + +## MainnetRisc0Verifier + +╭------------------+--------------------------+------+--------+-------+-----------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| isImageTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | +| +| \_\_gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+--------------------------+------+--------+-------+-----------------------------------------------------------------------------------------╯ + +## MainnetZkAndTeeVerifier + +╭------------------+-------------+------+--------+-------+-----------------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| **gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+-----------------------------------------------------------------------------------------------╯ + +## MainnetTeeAnyVerifier + +╭------------------+-------------+------+--------+-------+-------------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++====================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| **gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+-------------------------------------------------------------------------------------------╯ + +## MainnetGuardianProver + +╭-------------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=====================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| guardianIds | mapping(address => uint256) | 251 | 0 | 32 | +| +| approvals | mapping(uint256 => mapping(bytes32 => uint256)) | 252 | 0 | 32 | +| +| guardians | address[] | 253 | 0 | 32 | +| +| version | uint32 | 254 | 0 | 4 | +| +| minGuardians | uint32 | 254 | 4 | 4 | +| +| provingAutoPauseEnabled | bool | 254 | 8 | 1 | +| +| latestProofHash | mapping(uint256 => mapping(uint256 => bytes32)) | 255 | 0 | 32 | +| +| \_\_gap | uint256[45] | 256 | 0 | 1440 | +╰-------------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------------------------╯ + +## MainnetTaikoL1 + +╭------------------+------------------------+------+--------+-------+-------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=======================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| state | struct TaikoData.State | 251 | 0 | 1600 | +| +| \_\_gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+------------------------+------+--------+-------+-------------------------------------------------------------------╯ + +## MainnetRollupAddressManager + +╭------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==========================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | +| +| **gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------------------------------------╯ + +## MainnetTierRouter + +╭------+------+------+--------+-------+----------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================+ +╰------+------+------+--------+-------+----------╯ + +## MainnetProverSet + +╭------------------+--------------------------+------+--------+-------+-----------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=============================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| isProver | mapping(address => bool) | 251 | 0 | 32 | +| +| admin | address | 252 | 0 | 20 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+--------------------------+------+--------+-------+-----------------------------------------------------------------------╯ + +## TokenUnlock + +╭------------------+--------------------------+------+--------+-------+---------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=====================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| amountVested | uint256 | 251 | 0 | 32 | +| +| recipient | address | 252 | 0 | 20 | +| +| tgeTimestamp | uint64 | 252 | 20 | 8 | +| +| isProverSet | mapping(address => bool) | 253 | 0 | 32 | +| +| \_\_gap | uint256[47] | 254 | 0 | 1504 | +╰------------------+--------------------------+------+--------+-------+---------------------------------------------------------------╯ + +## ProverSet + +╭------------------+--------------------------+------+--------+-------+--------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++========================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| isProver | mapping(address => bool) | 251 | 0 | 32 | +| +| admin | address | 252 | 0 | 20 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+--------------------------+------+--------+-------+--------------------------------------------------╯ + +## GuardianProver + +╭-------------------------+-------------------------------------------------+------+--------+-------+------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| guardianIds | mapping(address => uint256) | 251 | 0 | 32 | +| +| approvals | mapping(uint256 => mapping(bytes32 => uint256)) | 252 | 0 | 32 | +| +| guardians | address[] | 253 | 0 | 32 | +| +| version | uint32 | 254 | 0 | 4 | +| +| minGuardians | uint32 | 254 | 4 | 4 | +| +| provingAutoPauseEnabled | bool | 254 | 8 | 1 | +| +| latestProofHash | mapping(uint256 => mapping(uint256 => bytes32)) | 255 | 0 | 32 | +| +| \_\_gap | uint256[45] | 256 | 0 | 1440 | +╰-------------------------+-------------------------------------------------+------+--------+-------+------------------------------------------------------------╯ + +## ForkManager + +╭---------------+-------------+------+--------+-------+---------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=========================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| \_\_gap | uint256[49] | 102 | 0 | 1568 | +╰---------------+-------------+------+--------+-------+---------------------------------------------------╯ diff --git a/packages/protocol/contract_layout_layer2.md b/packages/protocol/contract_layout_layer2.md new file mode 100644 index 00000000000..d71e2364207 --- /dev/null +++ b/packages/protocol/contract_layout_layer2.md @@ -0,0 +1,825 @@ +## ERC1155Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+-----------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| **gap | uint256[48] | 303 | 0 | 1536 | +| +| **gap | uint256[50] | 351 | 0 | 1600 | +| +| **gap | uint256[50] | 401 | 0 | 1600 | +| +| \_\_gap | uint256[50] | 451 | 0 | 1600 | +╰--------------------+------------------------------------------------------+------+--------+-------+-----------------------------------------------------------╯ + +## ERC20Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+-------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct ERC20Vault.CanonicalERC20) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| btokenDenylist | mapping(address => bool) | 303 | 0 | 32 | +| +| lastMigrationStart | mapping(uint256 => mapping(address => uint256)) | 304 | 0 | 32 | +| +| **gap | uint256[46] | 305 | 0 | 1472 | +╰--------------------+------------------------------------------------------+------+--------+-------+-------------------------------------------------------╯ + +## ERC721Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+---------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| **gap | uint256[48] | 303 | 0 | 1536 | +| +| \_\_gap | uint256[50] | 351 | 0 | 1600 | +╰--------------------+------------------------------------------------------+------+--------+-------+---------------------------------------------------------╯ + +## BridgedERC20 + +╭------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_balances | mapping(address => uint256) | 251 | 0 | 32 | +| +| \_allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | +| +| \_totalSupply | uint256 | 253 | 0 | 32 | +| +| \_name | string | 254 | 0 | 32 | +| +| \_symbol | string | 255 | 0 | 32 | +| +| **gap | uint256[45] | 256 | 0 | 1440 | +| +| srcToken | address | 301 | 0 | 20 | +| +| **srcDecimals | uint8 | 301 | 20 | 1 | +| +| srcChainId | uint256 | 302 | 0 | 32 | +| +| migratingAddress | address | 303 | 0 | 20 | +| +| migratingInbound | bool | 303 | 20 | 1 | +| +| \_\_gap | uint256[47] | 304 | 0 | 1504 | +╰------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╯ + +## BridgedERC20V2 + +╭------------------+--------------------------------------------------------+------+--------+-------+---------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_balances | mapping(address => uint256) | 251 | 0 | 32 | +| +| \_allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | +| +| \_totalSupply | uint256 | 253 | 0 | 32 | +| +| \_name | string | 254 | 0 | 32 | +| +| \_symbol | string | 255 | 0 | 32 | +| +| **gap | uint256[45] | 256 | 0 | 1440 | +| +| srcToken | address | 301 | 0 | 20 | +| +| **srcDecimals | uint8 | 301 | 20 | 1 | +| +| srcChainId | uint256 | 302 | 0 | 32 | +| +| migratingAddress | address | 303 | 0 | 20 | +| +| migratingInbound | bool | 303 | 20 | 1 | +| +| **gap | uint256[47] | 304 | 0 | 1504 | +| +| \_hashedName | bytes32 | 351 | 0 | 32 | +| +| \_hashedVersion | bytes32 | 352 | 0 | 32 | +| +| \_name | string | 353 | 0 | 32 | +| +| \_version | string | 354 | 0 | 32 | +| +| **gap | uint256[48] | 355 | 0 | 1536 | +| +| \_nonces | mapping(address => struct CountersUpgradeable.Counter) | 403 | 0 | 32 | +| +| \_\_gap | uint256[49] | 404 | 0 | 1568 | +╰------------------+--------------------------------------------------------+------+--------+-------+---------------------------------------------------------------╯ + +## BridgedERC721 + +╭--------------------+----------------------------------------------+------+--------+-------+-------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| \_name | string | 301 | 0 | 32 | +| +| \_symbol | string | 302 | 0 | 32 | +| +| \_owners | mapping(uint256 => address) | 303 | 0 | 32 | +| +| \_balances | mapping(address => uint256) | 304 | 0 | 32 | +| +| \_tokenApprovals | mapping(uint256 => address) | 305 | 0 | 32 | +| +| \_operatorApprovals | mapping(address => mapping(address => bool)) | 306 | 0 | 32 | +| +| **gap | uint256[44] | 307 | 0 | 1408 | +| +| srcToken | address | 351 | 0 | 20 | +| +| srcChainId | uint256 | 352 | 0 | 32 | +| +| \_\_gap | uint256[48] | 353 | 0 | 1536 | +╰--------------------+----------------------------------------------+------+--------+-------+-------------------------------------------------------------╯ + +## BridgedERC1155 + +╭--------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| \_balances | mapping(uint256 => mapping(address => uint256)) | 301 | 0 | 32 | +| +| \_operatorApprovals | mapping(address => mapping(address => bool)) | 302 | 0 | 32 | +| +| \_uri | string | 303 | 0 | 32 | +| +| **gap | uint256[47] | 304 | 0 | 1504 | +| +| srcToken | address | 351 | 0 | 20 | +| +| srcChainId | uint256 | 352 | 0 | 32 | +| +| symbol | string | 353 | 0 | 32 | +| +| name | string | 354 | 0 | 32 | +| +| \_\_gap | uint256[46] | 355 | 0 | 1472 | +╰--------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------╯ + +## Bridge + +╭------------------+-----------------------------------------+------+--------+-------+-------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **reserved1 | uint64 | 251 | 0 | 8 | +| +| nextMessageId | uint64 | 251 | 8 | 8 | +| +| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | +| +| **ctx | struct IBridge.Context | 253 | 0 | 64 | +| +| **reserved2 | uint256 | 255 | 0 | 32 | +| +| **reserved3 | uint256 | 256 | 0 | 32 | +| +| \_\_gap | uint256[44] | 257 | 0 | 1408 | +╰------------------+-----------------------------------------+------+--------+-------+-------------------------------------------╯ + +## QuotaManager + +╭------------------+-----------------------------------------------+------+--------+-------+-------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| tokenQuota | mapping(address => struct QuotaManager.Quota) | 251 | 0 | 32 | +| +| quotaPeriod | uint24 | 252 | 0 | 3 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+-----------------------------------------------+------+--------+-------+-------------------------------------------------------╯ + +## AddressManager + +╭------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | +| +| **gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╯ + +## AddressResolver + +╭----------------+-------------+------+--------+-------+-------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++====================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| addressManager | address | 0 | 2 | 20 | +| +| \_\_gap | uint256[49] | 1 | 0 | 1568 | +╰----------------+-------------+------+--------+-------+-------------------------------------------------------------╯ + +## EssentialContract + +╭------------------+-------------+------+--------+-------+-----------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==========================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +╰------------------+-------------+------+--------+-------+-----------------------------------------------------------------╯ + +## SignalService + +╭------------------+-----------------------------------------------+------+--------+-------+---------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++====================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | +| +| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+-----------------------------------------------+------+--------+-------+---------------------------------------------------------╯ + +## BridgedTaikoToken + +╭-----------------------------------------------------+---------------------------------------------------------------+------+--------+-------+----------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==============================================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **slots_previously_used_by_ERC20SnapshotUpgradeable | uint256[50] | 251 | 0 | 1600 | +| +| \_balances | mapping(address => uint256) | 301 | 0 | 32 | +| +| \_allowances | mapping(address => mapping(address => uint256)) | 302 | 0 | 32 | +| +| \_totalSupply | uint256 | 303 | 0 | 32 | +| +| \_name | string | 304 | 0 | 32 | +| +| \_symbol | string | 305 | 0 | 32 | +| +| **gap | uint256[45] | 306 | 0 | 1440 | +| +| \_hashedName | bytes32 | 351 | 0 | 32 | +| +| \_hashedVersion | bytes32 | 352 | 0 | 32 | +| +| \_name | string | 353 | 0 | 32 | +| +| \_version | string | 354 | 0 | 32 | +| +| **gap | uint256[48] | 355 | 0 | 1536 | +| +| \_nonces | mapping(address => struct CountersUpgradeable.Counter) | 403 | 0 | 32 | +| +| \_PERMIT_TYPEHASH_DEPRECATED_SLOT | bytes32 | 404 | 0 | 32 | +| +| **gap | uint256[49] | 405 | 0 | 1568 | +| +| \_delegates | mapping(address => address) | 454 | 0 | 32 | +| +| \_checkpoints | mapping(address => struct ERC20VotesUpgradeable.Checkpoint[]) | 455 | 0 | 32 | +| +| \_totalSupplyCheckpoints | struct ERC20VotesUpgradeable.Checkpoint[] | 456 | 0 | 32 | +| +| **gap | uint256[47] | 457 | 0 | 1504 | +| +| **gap | uint256[50] | 504 | 0 | 1600 | +╰-----------------------------------------------------+---------------------------------------------------------------+------+--------+-------+----------------------------------------------------------------╯ + +## DelegateOwner + +╭------------------+-------------+------+--------+-------+--------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===========================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| remoteChainId | uint64 | 251 | 0 | 8 | +| +| admin | address | 251 | 8 | 20 | +| +| nextTxId | uint64 | 252 | 0 | 8 | +| +| remoteOwner | address | 252 | 8 | 20 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+-------------+------+--------+-------+--------------------------------------------------╯ + +## TaikoL2 + +╭------------------+-----------------------------+------+--------+-------+--------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=====================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_blockhashes | mapping(uint256 => bytes32) | 251 | 0 | 32 | +| +| publicInputHash | bytes32 | 252 | 0 | 32 | +| +| parentGasExcess | uint64 | 253 | 0 | 8 | +| +| lastSyncedBlock | uint64 | 253 | 8 | 8 | +| +| parentTimestamp | uint64 | 253 | 16 | 8 | +| +| parentGasTarget | uint64 | 253 | 24 | 8 | +| +| l1ChainId | uint64 | 254 | 0 | 8 | +| +| \_\_gap | uint256[46] | 255 | 0 | 1472 | +╰------------------+-----------------------------+------+--------+-------+--------------------------------------------╯ + +## HeklaTaikoL2 + +╭------------------+-----------------------------+------+--------+-------+------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_blockhashes | mapping(uint256 => bytes32) | 251 | 0 | 32 | +| +| publicInputHash | bytes32 | 252 | 0 | 32 | +| +| parentGasExcess | uint64 | 253 | 0 | 8 | +| +| lastSyncedBlock | uint64 | 253 | 8 | 8 | +| +| parentTimestamp | uint64 | 253 | 16 | 8 | +| +| parentGasTarget | uint64 | 253 | 24 | 8 | +| +| l1ChainId | uint64 | 254 | 0 | 8 | +| +| \_\_gap | uint256[46] | 255 | 0 | 1472 | +╰------------------+-----------------------------+------+--------+-------+------------------------------------------------------╯ + +## MainnetTaikoL2 + +╭------------------+-----------------------------+------+--------+-------+------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=====================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_blockhashes | mapping(uint256 => bytes32) | 251 | 0 | 32 | +| +| publicInputHash | bytes32 | 252 | 0 | 32 | +| +| parentGasExcess | uint64 | 253 | 0 | 8 | +| +| lastSyncedBlock | uint64 | 253 | 8 | 8 | +| +| parentTimestamp | uint64 | 253 | 16 | 8 | +| +| parentGasTarget | uint64 | 253 | 24 | 8 | +| +| l1ChainId | uint64 | 254 | 0 | 8 | +| +| \_\_gap | uint256[46] | 255 | 0 | 1472 | +╰------------------+-----------------------------+------+--------+-------+------------------------------------------------------------╯ diff --git a/packages/protocol/contracts/L1/ITaikoL1.sol b/packages/protocol/contracts/L1/ITaikoL1.sol deleted file mode 100644 index 2663c8b532e..00000000000 --- a/packages/protocol/contracts/L1/ITaikoL1.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "./TaikoData.sol"; - -/// @title ITaikoL1 -/// @custom:security-contact security@taiko.xyz -interface ITaikoL1 { - /// @notice Proposes a Taiko L2 block. - /// @param _params Block parameters, currently an encoded BlockParams object. - /// @param _txList txList data if calldata is used for DA. - /// @return meta_ The metadata of the proposed L2 block. - /// @return deposits_ The Ether deposits processed. - function proposeBlock( - bytes calldata _params, - bytes calldata _txList - ) - external - payable - returns (TaikoData.BlockMetadata memory meta_, TaikoData.EthDeposit[] memory deposits_); - - /// @notice Proves or contests a block transition. - /// @param _blockId The index of the block to prove. This is also used to - /// select the right implementation version. - /// @param _input An abi-encoded (TaikoData.BlockMetadata, TaikoData.Transition, - /// TaikoData.TierProof) tuple. - function proveBlock(uint64 _blockId, bytes calldata _input) external; - - /// @notice Verifies up to a certain number of blocks. - /// @param _maxBlocksToVerify Max number of blocks to verify. - function verifyBlocks(uint64 _maxBlocksToVerify) external; - - /// @notice Pause block proving. - /// @param _pause True if paused. - function pauseProving(bool _pause) external; - - /// @notice Gets the configuration of the TaikoL1 contract. - /// @return Config struct containing configuration parameters. - function getConfig() external view returns (TaikoData.Config memory); -} diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol deleted file mode 100644 index 9e93278828c..00000000000 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ /dev/null @@ -1,173 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @title TaikoData -/// @notice This library defines various data structures used in the Taiko -/// protocol. -/// @custom:security-contact security@taiko.xyz -library TaikoData { - /// @dev Struct holding Taiko configuration parameters. See {TaikoConfig}. - struct Config { - // --------------------------------------------------------------------- - // Group 1: General configs - // --------------------------------------------------------------------- - // The chain ID of the network where Taiko contracts are deployed. - uint64 chainId; - // --------------------------------------------------------------------- - // Group 2: Block level configs - // --------------------------------------------------------------------- - // The maximum number of proposals allowed in a single block. - uint64 blockMaxProposals; - // Size of the block ring buffer, allowing extra space for proposals. - uint64 blockRingBufferSize; - // The maximum number of verifications allowed when a block is proposed. - uint64 maxBlocksToVerifyPerProposal; - // The maximum gas limit allowed for a block. - uint32 blockMaxGasLimit; - // --------------------------------------------------------------------- - // Group 3: Proof related configs - // --------------------------------------------------------------------- - // The amount of Taiko token as a prover liveness bond - uint96 livenessBond; - // --------------------------------------------------------------------- - // Group 4: Cross-chain sync - // --------------------------------------------------------------------- - // The max number of L2 blocks that can stay unsynced on L1 - uint8 blockSyncThreshold; - bool checkEOAForCalldataDA; - } - - /// @dev Struct representing prover fees per given tier - struct TierFee { - uint16 tier; - uint128 fee; - } - - /// @dev A proof and the tier of proof it belongs to - struct TierProof { - uint16 tier; - bytes data; - } - - /// @dev Hook and it's data (currently used only during proposeBlock) - struct HookCall { - address hook; - bytes data; - } - - /// @dev Represents proposeBlock's _data input parameter - struct BlockParams { - address assignedProver; - address coinbase; - bytes32 extraData; - bytes32 parentMetaHash; - HookCall[] hookCalls; - bytes signature; - } - - /// @dev Struct containing data only required for proving a block - /// Note: On L2, `block.difficulty` is the pseudo name of - /// `block.prevrandao`, which returns a random number provided by the layer - /// 1 chain. - struct BlockMetadata { - bytes32 l1Hash; - bytes32 difficulty; - bytes32 blobHash; //or txListHash (if Blob not yet supported) - bytes32 extraData; - bytes32 depositsHash; - address coinbase; // L2 coinbase, - uint64 id; - uint32 gasLimit; - uint64 timestamp; - uint64 l1Height; - uint16 minTier; - bool blobUsed; - bytes32 parentMetaHash; - address sender; // a.k.a proposer - } - - /// @dev Struct representing transition to be proven. - struct Transition { - bytes32 parentHash; - bytes32 blockHash; - bytes32 stateRoot; - bytes32 graffiti; // Arbitrary data that the prover can use for various purposes. - } - - /// @dev Struct representing state transition data. - /// 10 slots reserved for upgradability, 6 slots used. - struct TransitionState { - bytes32 key; // slot 1, only written/read for the 1st state transition. - bytes32 blockHash; // slot 2 - bytes32 stateRoot; // slot 3 - address prover; // slot 4 - uint96 validityBond; - address contester; // slot 5 - uint96 contestBond; - uint64 timestamp; // slot 6 (90 bits) - uint16 tier; - uint8 __reserved1; - } - - /// @dev Struct containing data required for verifying a block. - /// 3 slots used. - struct Block { - bytes32 metaHash; // slot 1 - address assignedProver; // slot 2 - uint96 livenessBond; - uint64 blockId; // slot 3 - uint64 proposedAt; // timestamp - uint64 proposedIn; // L1 block number, required/used by node/client. - uint32 nextTransitionId; - uint32 verifiedTransitionId; - } - - /// @dev Struct representing an Ethereum deposit. - /// 2 slot used. Currently removed from protocol, but to be backwards compatible, the struct and - /// return values stayed for now. - struct EthDeposit { - address recipient; - uint96 amount; - uint64 id; - } - - /// @dev Forge is only able to run coverage in case the contracts by default - /// capable of compiling without any optimization (neither optimizer runs, - /// no compiling --via-ir flag). - /// In order to resolve stack too deep without optimizations, we needed to - /// introduce outsourcing vars into structs below. - struct SlotA { - uint64 genesisHeight; - uint64 genesisTimestamp; - uint64 lastSyncedBlockId; - uint64 lastSynecdAt; // typo! - } - - struct SlotB { - uint64 numBlocks; - uint64 lastVerifiedBlockId; - bool provingPaused; - uint8 __reservedB1; - uint16 __reservedB2; - uint32 __reservedB3; - uint64 lastUnpausedAt; - } - - /// @dev Struct holding the state variables for the {TaikoL1} contract. - struct State { - // Ring buffer for proposed blocks and a some recent verified blocks. - mapping(uint64 blockId_mod_blockRingBufferSize => Block blk) blocks; - // Indexing to transition ids (ring buffer not possible) - mapping(uint64 blockId => mapping(bytes32 parentHash => uint32 transitionId)) transitionIds; - // Ring buffer for transitions - mapping( - uint64 blockId_mod_blockRingBufferSize - => mapping(uint32 transitionId => TransitionState ts) - ) transitions; - // Ring buffer for Ether deposits - bytes32 __reserve1; - SlotA slotA; // slot 5 - SlotB slotB; // slot 6 - uint256[44] __gap; - } -} diff --git a/packages/protocol/contracts/L1/TaikoErrors.sol b/packages/protocol/contracts/L1/TaikoErrors.sol deleted file mode 100644 index b5779fe8472..00000000000 --- a/packages/protocol/contracts/L1/TaikoErrors.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @title TaikoErrors -/// @notice This abstract contract provides custom error declarations used in -/// the Taiko protocol. Each error corresponds to specific situations where -/// exceptions might be thrown. -/// @dev The errors defined here must match the definitions in the corresponding -/// L1 libraries. -/// @custom:security-contact security@taiko.xyz -abstract contract TaikoErrors { - error L1_ALREADY_CONTESTED(); - error L1_ALREADY_PROVED(); - error L1_BLOB_NOT_AVAILABLE(); - error L1_BLOB_NOT_FOUND(); - error L1_BLOCK_MISMATCH(); - error L1_CANNOT_CONTEST(); - error L1_INVALID_BLOCK_ID(); - error L1_INVALID_CONFIG(); - error L1_INVALID_GENESIS_HASH(); - error L1_INVALID_HOOK(); - error L1_INVALID_PARAM(); - error L1_INVALID_PAUSE_STATUS(); - error L1_INVALID_PROVER(); - error L1_INVALID_SIG(); - error L1_INVALID_TIER(); - error L1_INVALID_TRANSITION(); - error L1_LIVENESS_BOND_NOT_RECEIVED(); - error L1_NOT_ASSIGNED_PROVER(); - error L1_NO_HOOKS(); - error L1_PROVING_PAUSED(); - error L1_RECEIVE_DISABLED(); - error L1_TOO_LATE(); - error L1_TOO_MANY_BLOCKS(); - error L1_TRANSITION_ID_ZERO(); - error L1_TRANSITION_NOT_FOUND(); - error L1_UNEXPECTED_PARENT(); - error L1_UNEXPECTED_TRANSITION_ID(); -} diff --git a/packages/protocol/contracts/L1/TaikoEvents.sol b/packages/protocol/contracts/L1/TaikoEvents.sol deleted file mode 100644 index 454c621f3e6..00000000000 --- a/packages/protocol/contracts/L1/TaikoEvents.sol +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "./TaikoData.sol"; - -/// @title TaikoEvents -/// @notice This abstract contract provides event declarations for the Taiko -/// protocol, which are emitted during block proposal, proof, verification, and -/// Ethereum deposit processes. -/// @dev The events defined here must match the definitions in the corresponding -/// L1 libraries. -/// @custom:security-contact security@taiko.xyz -abstract contract TaikoEvents { - /// @dev Emitted when a block is proposed. - /// @param blockId The ID of the proposed block. - /// @param assignedProver The block's assigned prover. - /// @param livenessBond The bond in Taiko token from the assigned prover. - /// @param meta The block metadata containing information about the proposed - /// block. - /// @param depositsProcessed Ether deposits processed. - event BlockProposed( - uint256 indexed blockId, - address indexed assignedProver, - uint96 livenessBond, - TaikoData.BlockMetadata meta, - TaikoData.EthDeposit[] depositsProcessed - ); - /// @dev Emitted when a block is verified. - /// @param blockId The ID of the verified block. - /// @param prover The prover whose transition is used for verifying the - /// block. - /// @param blockHash The hash of the verified block. - /// @param stateRoot The block's state root. - /// @param tier The tier ID of the proof. - event BlockVerified( - uint256 indexed blockId, - address indexed prover, - bytes32 blockHash, - bytes32 stateRoot, - uint16 tier - ); - - /// @notice Emitted when some state variable values changed. - /// @dev This event is currently used by Taiko node/client for block proposal/proving. - /// @param slotB The SlotB data structure. - event StateVariablesUpdated(TaikoData.SlotB slotB); - - /// @dev Emitted when a block transition is proved or re-proved. - /// @param blockId The ID of the proven block. - /// @param tran The verified transition. - /// @param prover The prover address. - /// @param validityBond The validity bond amount. - /// @param tier The tier ID of the proof. - event TransitionProved( - uint256 indexed blockId, - TaikoData.Transition tran, - address prover, - uint96 validityBond, - uint16 tier - ); - - /// @dev Emitted when a block transition is contested. - /// @param blockId The ID of the proven block. - /// @param tran The verified transition. - /// @param contester The contester address. - /// @param contestBond The contesting bond amount. - /// @param tier The tier ID of the proof. - event TransitionContested( - uint256 indexed blockId, - TaikoData.Transition tran, - address contester, - uint96 contestBond, - uint16 tier - ); - - /// @dev Emitted when proving has been paused - /// @param paused True if paused, false if unpaused. - event ProvingPaused(bool paused); -} diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol deleted file mode 100644 index 7f68cafc9fb..00000000000 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ /dev/null @@ -1,248 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../common/EssentialContract.sol"; -import "./libs/LibProposing.sol"; -import "./libs/LibProving.sol"; -import "./libs/LibVerifying.sol"; -import "./ITaikoL1.sol"; -import "./TaikoErrors.sol"; -import "./TaikoEvents.sol"; - -/// @title TaikoL1 -/// @notice This contract serves as the "base layer contract" of the Taiko protocol, providing -/// functionalities for proposing, proving, and verifying blocks. The term "base layer contract" -/// means that although this is usually deployed on L1, it can also be deployed on L2s to create -/// L3 "inception layers". The contract also handles the deposit and withdrawal of Taiko tokens -/// and Ether. Additionally, this contract doesn't hold any Ether. Ether deposited to L2 are held -/// by the Bridge contract. -/// @dev Labeled in AddressResolver as "taiko" -/// @custom:security-contact security@taiko.xyz -contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents, TaikoErrors { - /// @notice The TaikoL1 state. - TaikoData.State public state; - - uint256[50] private __gap; - - modifier whenProvingNotPaused() { - if (state.slotB.provingPaused) revert L1_PROVING_PAUSED(); - _; - } - - modifier emitEventForClient() { - _; - LibVerifying.emitEventForClient(state); - } - - /// @dev Allows for receiving Ether from Hooks - receive() external payable { - if (!inNonReentrant()) revert L1_RECEIVE_DISABLED(); - } - - /// @notice Initializes the contract. - /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - /// @param _genesisBlockHash The block hash of the genesis block. - /// @param _toPause true to pause the contract by default. - function init( - address _owner, - address _addressManager, - bytes32 _genesisBlockHash, - bool _toPause - ) - external - initializer - { - __Essential_init(_owner, _addressManager); - LibVerifying.init(state, getConfig(), _genesisBlockHash); - if (_toPause) _pause(); - } - - function init2() external onlyOwner reinitializer(2) { - // reset some previously used slots for future reuse - state.slotB.__reservedB1 = 0; - state.slotB.__reservedB2 = 0; - state.slotB.__reservedB3 = 0; - state.__reserve1 = 0; - } - - function resetGenesisHash(bytes32 _genesisBlockHash) external onlyOwner { - LibVerifying.resetGenesisHash(state, _genesisBlockHash); - } - - /// @inheritdoc ITaikoL1 - function proposeBlock( - bytes calldata _params, - bytes calldata _txList - ) - external - payable - whenNotPaused - nonReentrant - emitEventForClient - returns (TaikoData.BlockMetadata memory meta_, TaikoData.EthDeposit[] memory deposits_) - { - TaikoData.Config memory config = getConfig(); - IERC20 tko = IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)); - - (meta_, deposits_) = LibProposing.proposeBlock(state, tko, config, this, _params, _txList); - - if (!state.slotB.provingPaused) { - LibVerifying.verifyBlocks(state, tko, config, this, config.maxBlocksToVerifyPerProposal); - } - } - - /// @inheritdoc ITaikoL1 - function proveBlock( - uint64 _blockId, - bytes calldata _input - ) - external - whenNotPaused - whenProvingNotPaused - nonReentrant - emitEventForClient - { - ( - TaikoData.BlockMetadata memory meta, - TaikoData.Transition memory tran, - TaikoData.TierProof memory proof - ) = abi.decode(_input, (TaikoData.BlockMetadata, TaikoData.Transition, TaikoData.TierProof)); - - if (_blockId != meta.id) revert L1_INVALID_BLOCK_ID(); - - TaikoData.Config memory config = getConfig(); - IERC20 tko = IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)); - - uint8 maxBlocksToVerify = LibProving.proveBlock(state, tko, config, this, meta, tran, proof); - LibVerifying.verifyBlocks(state, tko, config, this, maxBlocksToVerify); - } - - /// @inheritdoc ITaikoL1 - function verifyBlocks(uint64 _maxBlocksToVerify) - external - whenNotPaused - whenProvingNotPaused - nonReentrant - emitEventForClient - { - LibVerifying.verifyBlocks( - state, - IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)), - getConfig(), - this, - _maxBlocksToVerify - ); - } - - /// @inheritdoc ITaikoL1 - function pauseProving(bool _pause) external { - _authorizePause(msg.sender, _pause); - LibProving.pauseProving(state, _pause); - } - - /// @inheritdoc EssentialContract - function unpause() public override { - super.unpause(); // permission checked inside - state.slotB.lastUnpausedAt = uint64(block.timestamp); - } - - /// @notice Gets the details of a block. - /// @param _blockId Index of the block. - /// @return blk_ The block. - function getBlock(uint64 _blockId) public view returns (TaikoData.Block memory blk_) { - (blk_,) = LibUtils.getBlock(state, getConfig(), _blockId); - } - - /// @notice Gets the state transition for a specific block. - /// @param _blockId Index of the block. - /// @param _parentHash Parent hash of the block. - /// @return The state transition data of the block. - function getTransition( - uint64 _blockId, - bytes32 _parentHash - ) - public - view - returns (TaikoData.TransitionState memory) - { - return LibUtils.getTransition(state, getConfig(), _blockId, _parentHash); - } - - /// @notice Gets the state transition for a specific block. - /// @param _blockId Index of the block. - /// @param _tid The transition id. - /// @return The state transition data of the block. - function getTransition( - uint64 _blockId, - uint32 _tid - ) - public - view - returns (TaikoData.TransitionState memory) - { - return LibUtils.getTransition(state, getConfig(), _blockId, _tid); - } - /// @notice Gets the state variables of the TaikoL1 contract. - /// @dev This method can be deleted once node/client stops using it. - /// @return State variables stored at SlotA. - /// @return State variables stored at SlotB. - - function getStateVariables() - public - view - returns (TaikoData.SlotA memory, TaikoData.SlotB memory) - { - return (state.slotA, state.slotB); - } - - /// @notice Gets SlotA - /// @return State variables stored at SlotA. - function slotA() public view returns (TaikoData.SlotA memory) { - return state.slotA; - } - - /// @notice Gets SlotB - /// @return State variables stored at SlotB. - function slotB() public view returns (TaikoData.SlotB memory) { - return state.slotB; - } - - /// @inheritdoc ITaikoL1 - function getConfig() public view virtual override returns (TaikoData.Config memory) { - // All hard-coded configurations: - // - treasury: the actual TaikoL2 address. - // - anchorGasLimit: 250_000 (based on internal devnet, its ~220_000 - // after 256 L2 blocks) - return TaikoData.Config({ - chainId: LibNetwork.TAIKO, - // Assume the block time is 3s, the protocol will allow ~90 days of - // new blocks without any verification. - blockMaxProposals: 324_000, // = 45*86400/12, 45 days, 12 seconds avg block time - blockRingBufferSize: 324_512, - // Can be overridden by the tier config. - maxBlocksToVerifyPerProposal: 10, - // This value is set based on `gasTargetPerL1Block = 15_000_000 * 4` in TaikoL2. - // We use 8x rather than 4x here to handle the scenario where the average number of - // Taiko blocks proposed per Ethereum block is smaller than 1. - // There is 250_000 additional gas for the anchor tx. Therefore, on explorers, you'll - // read Taiko's gas limit to be 240_250_000. - blockMaxGasLimit: 240_000_000, - livenessBond: 250e18, // 250 Taiko token - blockSyncThreshold: 16, - checkEOAForCalldataDA: true - }); - } - - /// @dev chain_pauser is supposed to be a cold wallet. - function _authorizePause( - address, - bool - ) - internal - view - virtual - override - onlyFromOwnerOrNamed(LibStrings.B_CHAIN_WATCHDOG) - { } -} diff --git a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol deleted file mode 100644 index adef51ea434..00000000000 --- a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol +++ /dev/null @@ -1,194 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol"; -import "../../common/EssentialContract.sol"; -import "../../common/LibStrings.sol"; -import "../../libs/LibAddress.sol"; -import "../ITaikoL1.sol"; -import "./IHook.sol"; - -/// @title AssignmentHook -/// @notice A hook that handles prover assignment verification and fee processing. -/// @custom:security-contact security@taiko.xyz -contract AssignmentHook is EssentialContract, IHook { - using LibAddress for address; - using SignatureChecker for address; - using SafeERC20 for IERC20; - - struct ProverAssignment { - address feeToken; - uint64 expiry; - uint64 maxBlockId; - uint64 maxProposedIn; - bytes32 metaHash; - bytes32 parentMetaHash; - TaikoData.TierFee[] tierFees; - bytes signature; - } - - struct Input { - ProverAssignment assignment; - uint256 tip; // A tip to L1 block builder - } - - event EtherPaymentFailed(address to, uint256 maxGas); - - /// @notice Max gas paying the prover. - /// @dev This should be large enough to prevent the worst cases for the prover. - /// To assure a trustless relationship between the proposer and the prover it's - /// the prover's job to make sure it can get paid within this limit. - uint256 public constant MAX_GAS_PAYING_PROVER = 50_000; - - uint256[50] private __gap; - - error HOOK_ASSIGNMENT_EXPIRED(); - error HOOK_ASSIGNMENT_INVALID_SIG(); - error HOOK_TIER_NOT_FOUND(); - - /// @notice Initializes the contract. - /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); - } - - /// @inheritdoc IHook - function onBlockProposed( - TaikoData.Block calldata _blk, - TaikoData.BlockMetadata calldata _meta, - bytes calldata _data - ) - external - payable - onlyFromNamed(LibStrings.B_TAIKO) - nonReentrant - { - // Note that - // - 'msg.sender' is the TaikoL1 contract address - // - 'block.coinbase' is the L1 block builder - // - 'meta.coinbase' is the L2 block proposer (chosen by block's proposer) - - Input memory input = abi.decode(_data, (Input)); - ProverAssignment memory assignment = input.assignment; - - // Check assignment validity - if ( - block.timestamp > assignment.expiry - || assignment.metaHash != 0 && _blk.metaHash != assignment.metaHash - || assignment.parentMetaHash != 0 && _meta.parentMetaHash != assignment.parentMetaHash - || assignment.maxBlockId != 0 && _meta.id > assignment.maxBlockId - || assignment.maxProposedIn != 0 && block.number > assignment.maxProposedIn - ) { - revert HOOK_ASSIGNMENT_EXPIRED(); - } - - // Hash the assignment with the blobHash, this hash will be signed by - // the prover, therefore, we add a string as a prefix. - - // msg.sender is taikoL1Address - bytes32 hash = hashAssignment( - assignment, msg.sender, _meta.sender, _blk.assignedProver, _meta.blobHash - ); - - if (!_blk.assignedProver.isValidSignatureNow(hash, assignment.signature)) { - revert HOOK_ASSIGNMENT_INVALID_SIG(); - } - - // Send the liveness bond to the Taiko contract - IERC20 tko = IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)); - - // Note that we don't have to worry about - // https://github.com/crytic/slither/wiki/Detector-Documentation#arbitrary-from-in-transferfrom - // as `assignedProver` has provided a signature above to authorize this hook. - tko.safeTransferFrom(_blk.assignedProver, msg.sender, _blk.livenessBond); - - // Find the prover fee using the minimal tier - uint256 proverFee = _getProverFee(assignment.tierFees, _meta.minTier); - - // The proposer irrevocably pays a fee to the assigned prover, either in - // Ether or ERC20 tokens. - if (assignment.feeToken == address(0)) { - // Paying Ether even when proverFee is 0 to trigger a potential receive() function call. - // Note that this payment may fail if it cost more gas - bool success = _blk.assignedProver.sendEther(proverFee, MAX_GAS_PAYING_PROVER, ""); - if (!success) emit EtherPaymentFailed(_blk.assignedProver, MAX_GAS_PAYING_PROVER); - } else if (proverFee != 0 && _meta.sender != _blk.assignedProver) { - // Paying ERC20 tokens - IERC20(assignment.feeToken).safeTransferFrom( - _meta.sender, _blk.assignedProver, proverFee - ); - } - - // block.coinbase can be address(0) in tests - if (input.tip != 0 && block.coinbase != address(0)) { - address(block.coinbase).sendEtherAndVerify(input.tip); - } - - // Send all remaining Ether back to TaikoL1 contract - if (address(this).balance != 0) { - msg.sender.sendEtherAndVerify(address(this).balance); - } - } - - /// @notice Hashes the prover assignment. - /// @param _assignment The prover assignment. - /// @param _taikoL1Address The address of the TaikoL1 contract. - /// @param _blockProposer The block proposer address. - /// @param _assignedProver The assigned prover address. - /// @param _blobHash The blob hash. - /// @return The hash of the prover assignment. - function hashAssignment( - ProverAssignment memory _assignment, - address _taikoL1Address, - address _blockProposer, - address _assignedProver, - bytes32 _blobHash - ) - public - view - returns (bytes32) - { - // split up into two parts otherwise stack is too deep - bytes32 hash = keccak256( - abi.encode( - _assignment.metaHash, - _assignment.parentMetaHash, - _assignment.feeToken, - _assignment.expiry, - _assignment.maxBlockId, - _assignment.maxProposedIn, - _assignment.tierFees - ) - ); - - return keccak256( - abi.encodePacked( - LibStrings.B_PROVER_ASSIGNMENT, - ITaikoL1(_taikoL1Address).getConfig().chainId, - _taikoL1Address, - _blockProposer, - _assignedProver, - _blobHash, - hash, - address(this) - ) - ); - } - - function _getProverFee( - TaikoData.TierFee[] memory _tierFees, - uint16 _tierId - ) - private - pure - returns (uint256) - { - for (uint256 i; i < _tierFees.length; ++i) { - if (_tierFees[i].tier == _tierId) return _tierFees[i].fee; - } - revert HOOK_TIER_NOT_FOUND(); - } -} diff --git a/packages/protocol/contracts/L1/hooks/IHook.sol b/packages/protocol/contracts/L1/hooks/IHook.sol deleted file mode 100644 index d78109f5447..00000000000 --- a/packages/protocol/contracts/L1/hooks/IHook.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../TaikoData.sol"; - -/// @title IHook -/// @custom:security-contact security@taiko.xyz -interface IHook { - /// @notice Called when a block is proposed. - /// @param _blk The proposed block. - /// @param _meta The metadata of the proposed block. - /// @param _data The data of the proposed block. - function onBlockProposed( - TaikoData.Block calldata _blk, - TaikoData.BlockMetadata calldata _meta, - bytes calldata _data - ) - external - payable; -} diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol deleted file mode 100644 index 9c8244e3439..00000000000 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ /dev/null @@ -1,233 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import "../../libs/LibAddress.sol"; -import "../../libs/LibNetwork.sol"; -import "../hooks/IHook.sol"; -import "./LibUtils.sol"; - -/// @title LibProposing -/// @notice A library for handling block proposals in the Taiko protocol. -/// @custom:security-contact security@taiko.xyz -library LibProposing { - using LibAddress for address; - - // = keccak256(abi.encode(new TaikoData.EthDeposit[](0))) - bytes32 private constant _EMPTY_ETH_DEPOSIT_HASH = - 0x569e75fc77c1a856f6daaf9e69d8a9566ca34aa47f9133711ce065a571af0cfd; - - // Warning: Any events defined here must also be defined in TaikoEvents.sol. - /// @notice Emitted when a block is proposed. - /// @param blockId The ID of the proposed block. - /// @param assignedProver The address of the assigned prover. - /// @param livenessBond The liveness bond of the proposed block. - /// @param meta The metadata of the proposed block. - /// @param depositsProcessed The EthDeposit array about processed deposits in this proposed - /// block. - event BlockProposed( - uint256 indexed blockId, - address indexed assignedProver, - uint96 livenessBond, - TaikoData.BlockMetadata meta, - TaikoData.EthDeposit[] depositsProcessed - ); - - // Warning: Any errors defined here must also be defined in TaikoErrors.sol. - error L1_BLOB_NOT_AVAILABLE(); - error L1_BLOB_NOT_FOUND(); - error L1_INVALID_HOOK(); - error L1_INVALID_PROVER(); - error L1_INVALID_SIG(); - error L1_LIVENESS_BOND_NOT_RECEIVED(); - error L1_NOT_SAME_ADDRESS(); - error L1_TOO_MANY_BLOCKS(); - error L1_UNEXPECTED_PARENT(); - - /// @dev Proposes a Taiko L2 block. - /// @param _state Current TaikoData.State. - /// @param _tko The taiko token. - /// @param _config Actual TaikoData.Config. - /// @param _resolver Address resolver interface. - /// @param _data Encoded data bytes containing the block params. - /// @param _txList Transaction list bytes (if not blob). - /// @return meta_ The constructed block's metadata. - function proposeBlock( - TaikoData.State storage _state, - IERC20 _tko, - TaikoData.Config memory _config, - IAddressResolver _resolver, - bytes calldata _data, - bytes calldata _txList - ) - internal - returns (TaikoData.BlockMetadata memory meta_, TaikoData.EthDeposit[] memory deposits_) - { - TaikoData.BlockParams memory params = abi.decode(_data, (TaikoData.BlockParams)); - - // We need a prover that will submit proofs after the block has been submitted - if (params.assignedProver == address(0)) { - revert L1_INVALID_PROVER(); - } - - if (params.coinbase == address(0)) { - params.coinbase = msg.sender; - } - - // Taiko, as a Based Rollup, enables permissionless block proposals. - TaikoData.SlotB memory b = _state.slotB; - - // It's essential to ensure that the ring buffer for proposed blocks - // still has space for at least one more block. - if (b.numBlocks >= b.lastVerifiedBlockId + _config.blockMaxProposals + 1) { - revert L1_TOO_MANY_BLOCKS(); - } - - bytes32 parentMetaHash = - _state.blocks[(b.numBlocks - 1) % _config.blockRingBufferSize].metaHash; - // assert(parentMetaHash != 0); - - // Check if parent block has the right meta hash. This is to allow the proposer to make sure - // the block builds on the expected latest chain state. - if (params.parentMetaHash != 0 && parentMetaHash != params.parentMetaHash) { - revert L1_UNEXPECTED_PARENT(); - } - - // Initialize metadata to compute a metaHash, which forms a part of - // the block data to be stored on-chain for future integrity checks. - // If we choose to persist all data fields in the metadata, it will - // require additional storage slots. - unchecked { - meta_ = TaikoData.BlockMetadata({ - l1Hash: blockhash(block.number - 1), - difficulty: 0, // to be initialized below - blobHash: 0, // to be initialized below - extraData: params.extraData, - depositsHash: _EMPTY_ETH_DEPOSIT_HASH, - coinbase: params.coinbase, - id: b.numBlocks, - gasLimit: _config.blockMaxGasLimit, - timestamp: uint64(block.timestamp), - l1Height: uint64(block.number - 1), - minTier: 0, // to be initialized below - blobUsed: _txList.length == 0, - parentMetaHash: parentMetaHash, - sender: msg.sender - }); - } - - // Update certain meta fields - if (meta_.blobUsed) { - if (!LibNetwork.isDencunSupported(block.chainid)) revert L1_BLOB_NOT_AVAILABLE(); - - // Always use the first blob in this transaction. If the - // proposeBlock functions are called more than once in the same - // L1 transaction, these multiple L2 blocks will share the same - // blob. - meta_.blobHash = blobhash(0); - if (meta_.blobHash == 0) revert L1_BLOB_NOT_FOUND(); - } else { - meta_.blobHash = keccak256(_txList); - - // This function must be called as the outmost transaction (not an internal one) for - // the node to extract the calldata easily. - // We cannot rely on `msg.sender != tx.origin` for EOA check, as it will break after EIP - // 7645: Alias ORIGIN to SENDER - if ( - _config.checkEOAForCalldataDA - && ECDSA.recover(meta_.blobHash, params.signature) != msg.sender - ) { - revert L1_INVALID_SIG(); - } - } - - // Following the Merge, the L1 mixHash incorporates the - // prevrandao value from the beacon chain. Given the possibility - // of multiple Taiko blocks being proposed within a single - // Ethereum block, we choose to introduce a salt to this random - // number as the L2 mixHash. - meta_.difficulty = keccak256(abi.encodePacked(block.prevrandao, b.numBlocks, block.number)); - - { - ITierRouter tierRouter = ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); - ITierProvider tierProvider = ITierProvider(tierRouter.getProvider(b.numBlocks)); - - // Use the difficulty as a random number - meta_.minTier = tierProvider.getMinTier(uint256(meta_.difficulty)); - } - - // Create the block that will be stored onchain - TaikoData.Block memory blk = TaikoData.Block({ - metaHash: keccak256(abi.encode(meta_)), - // Safeguard the liveness bond to ensure its preservation, - // particularly in scenarios where it might be altered after the - // block's proposal but before it has been proven or verified. - livenessBond: _config.livenessBond, - blockId: b.numBlocks, - proposedAt: meta_.timestamp, - proposedIn: uint64(block.number), - // For a new block, the next transition ID is always 1, not 0. - nextTransitionId: 1, - // For unverified block, its verifiedTransitionId is always 0. - verifiedTransitionId: 0, - assignedProver: params.assignedProver - }); - - // Store the block in the ring buffer - _state.blocks[b.numBlocks % _config.blockRingBufferSize] = blk; - - // Increment the counter (cursor) by 1. - unchecked { - ++_state.slotB.numBlocks; - } - - if (params.hookCalls.length == 0) { - if (params.assignedProver != msg.sender) revert L1_NOT_SAME_ADDRESS(); - _tko.transferFrom(msg.sender, address(this), _config.livenessBond); - } else { - uint256 tkoBalance = _tko.balanceOf(address(this)); - - // Run all hooks. - // Note that address(this).balance has been updated with msg.value, - // prior to any code in this function has been executed. - address prevHook; - for (uint256 i; i < params.hookCalls.length; ++i) { - if (uint160(prevHook) >= uint160(params.hookCalls[i].hook)) { - revert L1_INVALID_HOOK(); - } - - // When a hook is called, all ether in this contract will be sent to the hook. - // If the ether sent to the hook is not used entirely, the hook shall send the Ether - // back to this contract for the next hook to use. - // Proposers shall choose to use extra hooks wisely. - IHook(params.hookCalls[i].hook).onBlockProposed{ value: address(this).balance }( - blk, meta_, params.hookCalls[i].data - ); - - prevHook = params.hookCalls[i].hook; - } - - // Check that after hooks, the Taiko Token balance of this contract - // have increased by the same amount as _config.livenessBond (to prevent) - // multiple draining payments by a malicious proposer nesting the same - // hook. - if (_tko.balanceOf(address(this)) != tkoBalance + _config.livenessBond) { - revert L1_LIVENESS_BOND_NOT_RECEIVED(); - } - } - - // Refund Ether - if (address(this).balance != 0) { - msg.sender.sendEtherAndVerify(address(this).balance); - } - - deposits_ = new TaikoData.EthDeposit[](0); - emit BlockProposed({ - blockId: blk.blockId, - assignedProver: blk.assignedProver, - livenessBond: _config.livenessBond, - meta: meta_, - depositsProcessed: deposits_ - }); - } -} diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol deleted file mode 100644 index 210525f7ddb..00000000000 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ /dev/null @@ -1,468 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../verifiers/IVerifier.sol"; -import "./LibUtils.sol"; - -/// @title LibProving -/// @notice A library for handling block contestation and proving in the Taiko -/// protocol. -/// @custom:security-contact security@taiko.xyz -library LibProving { - using LibMath for uint256; - - // A struct to get around stack too deep issue and to cache state variables for multiple reads. - struct Local { - TaikoData.SlotB b; - ITierProvider.Tier tier; - ITierProvider.Tier minTier; - bytes32 metaHash; - address assignedProver; - uint64 slot; - uint64 blockId; - uint32 tid; - bool lastUnpausedAt; - bool isTopTier; - bool inProvingWindow; - bool sameTransition; - } - - // Warning: Any events defined here must also be defined in TaikoEvents.sol. - /// @notice Emitted when a transition is proved. - /// @param blockId The block ID. - /// @param tran The transition data. - /// @param prover The prover's address. - /// @param validityBond The validity bond amount. - /// @param tier The tier of the proof. - event TransitionProved( - uint256 indexed blockId, - TaikoData.Transition tran, - address prover, - uint96 validityBond, - uint16 tier - ); - - /// @notice Emitted when a transition is contested. - /// @param blockId The block ID. - /// @param tran The transition data. - /// @param contester The contester's address. - /// @param contestBond The contest bond amount. - /// @param tier The tier of the proof. - event TransitionContested( - uint256 indexed blockId, - TaikoData.Transition tran, - address contester, - uint96 contestBond, - uint16 tier - ); - - /// @notice Emitted when proving is paused or unpaused. - /// @param paused The pause status. - event ProvingPaused(bool paused); - - // Warning: Any errors defined here must also be defined in TaikoErrors.sol. - error L1_ALREADY_CONTESTED(); - error L1_ALREADY_PROVED(); - error L1_BLOCK_MISMATCH(); - error L1_CANNOT_CONTEST(); - error L1_INVALID_BLOCK_ID(); - error L1_INVALID_PAUSE_STATUS(); - error L1_INVALID_TIER(); - error L1_INVALID_TRANSITION(); - error L1_NOT_ASSIGNED_PROVER(); - - /// @notice Pauses or unpauses the proving process. - /// @param _state Current TaikoData.State. - /// @param _pause The pause status. - function pauseProving(TaikoData.State storage _state, bool _pause) internal { - if (_state.slotB.provingPaused == _pause) revert L1_INVALID_PAUSE_STATUS(); - _state.slotB.provingPaused = _pause; - - if (!_pause) { - _state.slotB.lastUnpausedAt = uint64(block.timestamp); - } - emit ProvingPaused(_pause); - } - - /// @dev Proves or contests a block transition. - /// @param _state Current TaikoData.State. - /// @param _tko The taiko token. - /// @param _config Actual TaikoData.Config. - /// @param _resolver Address resolver interface. - /// @param _meta The block's metadata. - /// @param _tran The transition data. - /// @param _proof The proof. - /// @return The number of blocks to be verified with this transaction. - function proveBlock( - TaikoData.State storage _state, - IERC20 _tko, - TaikoData.Config memory _config, - IAddressResolver _resolver, - TaikoData.BlockMetadata memory _meta, - TaikoData.Transition memory _tran, - TaikoData.TierProof memory _proof - ) - internal - returns (uint8) - { - // Make sure parentHash is not zero - // To contest an existing transition, simply use any non-zero value as - // the blockHash and stateRoot. - if (_tran.parentHash == 0 || _tran.blockHash == 0 || _tran.stateRoot == 0) { - revert L1_INVALID_TRANSITION(); - } - - Local memory local; - local.b = _state.slotB; - - // Check that the block has been proposed but has not yet been verified. - if (_meta.id <= local.b.lastVerifiedBlockId || _meta.id >= local.b.numBlocks) { - revert L1_INVALID_BLOCK_ID(); - } - - local.slot = _meta.id % _config.blockRingBufferSize; - TaikoData.Block storage blk = _state.blocks[local.slot]; - - local.blockId = blk.blockId; - local.assignedProver = blk.assignedProver; - local.metaHash = blk.metaHash; - - // Check the integrity of the block data. It's worth noting that in - // theory, this check may be skipped, but it's included for added - // caution. - if (local.blockId != _meta.id || local.metaHash != keccak256(abi.encode(_meta))) { - revert L1_BLOCK_MISMATCH(); - } - - // Each transition is uniquely identified by the parentHash, with the - // blockHash and stateRoot open for later updates as higher-tier proofs - // become available. In cases where a transition with the specified - // parentHash does not exist, the transition ID (tid) will be set to 0. - TaikoData.TransitionState storage ts; - (local.tid, ts) = _fetchOrCreateTransition(_state, blk, _tran, local); - - // The new proof must meet or exceed the minimum tier required by the - // block or the previous proof; it cannot be on a lower tier. - if (_proof.tier == 0 || _proof.tier < _meta.minTier || _proof.tier < ts.tier) { - revert L1_INVALID_TIER(); - } - - // Retrieve the tier configurations. If the tier is not supported, the - // subsequent action will result in a revert. - { - ITierRouter tierRouter = ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); - ITierProvider tierProvider = ITierProvider(tierRouter.getProvider(local.blockId)); - - local.tier = tierProvider.getTier(_proof.tier); - local.minTier = tierProvider.getTier(_meta.minTier); - } - - local.inProvingWindow = !LibUtils.isPostDeadline({ - _tsTimestamp: ts.timestamp, - _lastUnpausedAt: local.b.lastUnpausedAt, - _windowMinutes: local.minTier.provingWindow - }); - - // Checks if only the assigned prover is permissioned to prove the block. - // The assigned prover is granted exclusive permission to prove only the first - // transition. - if ( - local.tier.contestBond != 0 && ts.contester == address(0) && local.tid == 1 - && ts.tier == 0 && local.inProvingWindow - ) { - if (msg.sender != local.assignedProver) revert L1_NOT_ASSIGNED_PROVER(); - } - // We must verify the proof, and any failure in proof verification will - // result in a revert. - // - // It's crucial to emphasize that the proof can be assessed in two - // potential modes: "proving mode" and "contesting mode." However, the - // precise verification logic is defined within each tier's IVerifier - // contract implementation. We simply specify to the verifier contract - // which mode it should utilize - if the new tier is higher than the - // previous tier, we employ the proving mode; otherwise, we employ the - // contesting mode (the new tier cannot be lower than the previous tier, - // this has been checked above). - // - // It's obvious that proof verification is entirely decoupled from - // Taiko's core protocol. - if (local.tier.verifierName != "") { - address verifier = _resolver.resolve(local.tier.verifierName, false); - bool isContesting = _proof.tier == ts.tier && local.tier.contestBond != 0; - - IVerifier.Context memory ctx = IVerifier.Context({ - metaHash: local.metaHash, - blobHash: _meta.blobHash, - // Separate msgSender to allow the prover to be any address in the future. - prover: msg.sender, - msgSender: msg.sender, - blockId: local.blockId, - isContesting: isContesting, - blobUsed: _meta.blobUsed - }); - - IVerifier(verifier).verifyProof(ctx, _tran, _proof); - } - - local.isTopTier = local.tier.contestBond == 0; - local.sameTransition = _tran.blockHash == ts.blockHash && _tran.stateRoot == ts.stateRoot; - - if (_proof.tier > ts.tier) { - // Handles the case when an incoming tier is higher than the current transition's tier. - // Reverts when the incoming proof tries to prove the same transition - // (L1_ALREADY_PROVED). - _overrideWithHigherProof(blk, ts, _tran, _proof, local, _tko); - - emit TransitionProved({ - blockId: local.blockId, - tran: _tran, - prover: msg.sender, - validityBond: local.tier.validityBond, - tier: _proof.tier - }); - } else { - // New transition and old transition on the same tier - and if this transaction tries to - // prove the same, it reverts - if (local.sameTransition) revert L1_ALREADY_PROVED(); - - if (local.isTopTier) { - // The top tier prover re-proves. - assert(local.tier.validityBond == 0); - assert(ts.validityBond == 0 && ts.contester == address(0)); - - ts.prover = msg.sender; - ts.blockHash = _tran.blockHash; - ts.stateRoot = _tran.stateRoot; - - emit TransitionProved({ - blockId: local.blockId, - tran: _tran, - prover: msg.sender, - validityBond: 0, - tier: _proof.tier - }); - } else { - // Contesting but not on the highest tier - if (ts.contester != address(0)) revert L1_ALREADY_CONTESTED(); - - // Making it a non-sliding window, relative when ts.timestamp was registered (or to - // lastUnpaused if that one is bigger) - if ( - LibUtils.isPostDeadline( - ts.timestamp, local.b.lastUnpausedAt, local.tier.cooldownWindow - ) - ) { - revert L1_CANNOT_CONTEST(); - } - - // _checkIfContestable(/*_state,*/ tier.cooldownWindow, ts.timestamp); - // Burn the contest bond from the prover. - _tko.transferFrom(msg.sender, address(this), local.tier.contestBond); - - // We retain the contest bond within the transition, just in - // case this configuration is altered to a different value - // before the contest is resolved. - // - // It's worth noting that the previous value of ts.contestBond - // doesn't have any significance. - ts.contestBond = local.tier.contestBond; - ts.contester = msg.sender; - - emit TransitionContested({ - blockId: local.blockId, - tran: _tran, - contester: msg.sender, - contestBond: local.tier.contestBond, - tier: _proof.tier - }); - } - } - - ts.timestamp = uint64(block.timestamp); - return local.tier.maxBlocksToVerifyPerProof; - } - - /// @dev Handle the transition initialization logic - function _fetchOrCreateTransition( - TaikoData.State storage _state, - TaikoData.Block storage _blk, - TaikoData.Transition memory _tran, - Local memory _local - ) - private - returns (uint32 tid_, TaikoData.TransitionState storage ts_) - { - tid_ = LibUtils.getTransitionId(_state, _blk, _local.slot, _tran.parentHash); - - if (tid_ == 0) { - // In cases where a transition with the provided parentHash is not - // found, we must essentially "create" one and set it to its initial - // state. This initial state can be viewed as a special transition - // on tier-0. - // - // Subsequently, we transform this tier-0 transition into a - // non-zero-tier transition with a proof. This approach ensures that - // the same logic is applicable for both 0-to-non-zero transition - // updates and non-zero-to-non-zero transition updates. - unchecked { - // Unchecked is safe: Not realistic 2**32 different fork choice - // per block will be proven and none of them is valid - tid_ = _blk.nextTransitionId++; - } - - // Keep in mind that state.transitions are also reusable storage - // slots, so it's necessary to reinitialize all transition fields - // below. - ts_ = _state.transitions[_local.slot][tid_]; - ts_.blockHash = 0; - ts_.stateRoot = 0; - ts_.validityBond = 0; - ts_.contester = address(0); - ts_.contestBond = 1; // to save gas - ts_.timestamp = _blk.proposedAt; - ts_.tier = 0; - ts_.__reserved1 = 0; - - if (tid_ == 1) { - // This approach serves as a cost-saving technique for the - // majority of blocks, where the first transition is expected to - // be the correct one. Writing to `transitions` is more economical - // since it resides in the ring buffer, whereas writing to - // `transitionIds` is not as cost-effective. - ts_.key = _tran.parentHash; - - // In the case of this first transition, the block's assigned - // prover has the privilege to re-prove it, but only when the - // assigned prover matches the previous prover. To ensure this, - // we establish the transition's prover as the block's assigned - // prover. Consequently, when we carry out a 0-to-non-zero - // transition update, the previous prover will consistently be - // the block's assigned prover. - // - // While alternative implementations are possible, introducing - // such changes would require additional if-else logic. - ts_.prover = _local.assignedProver; - } else { - // In scenarios where this transition is not the first one, we - // straightforwardly reset the transition prover to address - // zero. - ts_.prover = address(0); - - // Furthermore, we index the transition for future retrieval. - // It's worth emphasizing that this mapping for indexing is not - // reusable. However, given that the majority of blocks will - // only possess one transition — the correct one — we don't need - // to be concerned about the cost in this case. - _state.transitionIds[_local.blockId][_tran.parentHash] = tid_; - - // There is no need to initialize ts.key here because it's only used when tid == 1 - } - } else { - // A transition with the provided parentHash has been located. - ts_ = _state.transitions[_local.slot][tid_]; - } - } - - /// @dev Handles what happens when either the first transition is being proven or there is a - /// higher tier proof incoming - /// - /// Assume Alice is the initial prover, Bob is the contester, and Cindy is the subsequent - /// prover. The validity bond `V` is set at 100, and the contestation bond `C` at 500. If Bob - /// successfully contests, he receives a reward of 65.625, calculated as 3/4 of 7/8 of 100. Cindy - /// receives 21.875, which is 1/4 of 7/8 of 100, while the protocol retains 12.5 as friction. - /// Bob's Return on Investment (ROI) is 13.125%, calculated from 65.625 divided by 500. - // To establish the expected ROI `r` for valid contestations, where the contestation bond `C` to - // validity bond `V` ratio is `C/V = 21/(32*r)`, and if `r` set at 10%, the C/V ratio will be - // 6.5625. - function _overrideWithHigherProof( - TaikoData.Block storage _blk, - TaikoData.TransitionState storage _ts, - TaikoData.Transition memory _tran, - TaikoData.TierProof memory _proof, - Local memory _local, - IERC20 _tko - ) - private - { - // Higher tier proof overwriting lower tier proof - uint256 reward; // reward to the new (current) prover - - if (_ts.contester != address(0)) { - // assert(_blk.livenessBond == 0); - - if (_local.sameTransition) { - // The contested transition is proven to be valid, contester loses the game - reward = _rewardAfterFriction(_ts.contestBond); - - // We return the validity bond back, but the original prover doesn't get any reward. - _tko.transfer(_ts.prover, _ts.validityBond); - } else { - // The contested transition is proven to be invalid, contester wins the game. - // Contester gets 3/4 of reward, the new prover gets 1/4. - reward = _rewardAfterFriction(_ts.validityBond) >> 2; - - _tko.transfer(_ts.contester, _ts.contestBond + reward * 3); - } - } else { - if (_local.sameTransition) revert L1_ALREADY_PROVED(); - - // The code below will be executed if - // - 1) the transition is proved for the fist time, or - // - 2) the transition is contested. - reward = _rewardAfterFriction(_ts.validityBond); - - uint256 livenessBond = _blk.livenessBond; - if (livenessBond != 0) { - // After the first proof, the block's liveness bond will always be reset to 0. - // This means liveness bond will be handled only once for any given block. - _blk.livenessBond = 0; - - if (_returnLivenessBond(_local, _proof.data)) { - if (_blk.assignedProver == msg.sender) { - reward += livenessBond; - } else { - _tko.transfer(_blk.assignedProver, livenessBond); - } - } - } - } - - unchecked { - if (reward > _local.tier.validityBond) { - _tko.transfer(msg.sender, reward - _local.tier.validityBond); - } else if (reward < _local.tier.validityBond) { - _tko.transferFrom(msg.sender, address(this), _local.tier.validityBond - reward); - } - } - - _ts.validityBond = _local.tier.validityBond; - _ts.contestBond = 1; // to save gas - _ts.contester = address(0); - _ts.prover = msg.sender; - _ts.tier = _proof.tier; - - if (!_local.sameTransition) { - _ts.blockHash = _tran.blockHash; - _ts.stateRoot = _tran.stateRoot; - } - } - - /// @dev Returns the reward after applying 12.5% friction. - function _rewardAfterFriction(uint256 _amount) private pure returns (uint256) { - return _amount == 0 ? 0 : (_amount * 7) >> 3; - } - - /// @dev Returns if the liveness bond shall be returned. - function _returnLivenessBond( - Local memory _local, - bytes memory _proofData - ) - private - pure - returns (bool) - { - return _local.inProvingWindow && _local.tid == 1 - || _local.isTopTier && _proofData.length == 32 - && bytes32(_proofData) == LibStrings.H_RETURN_LIVENESS_BOND; - } -} diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol deleted file mode 100644 index 1d033cd00ba..00000000000 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -import "../../common/IAddressResolver.sol"; -import "../../common/LibStrings.sol"; -import "../../libs/LibMath.sol"; -import "../tiers/ITierProvider.sol"; -import "../tiers/ITierRouter.sol"; -import "../TaikoData.sol"; - -/// @title LibUtils -/// @notice A library that offers helper functions. -/// @custom:security-contact security@taiko.xyz -library LibUtils { - using LibMath for uint256; - - // Warning: Any errors defined here must also be defined in TaikoErrors.sol. - error L1_BLOCK_MISMATCH(); - error L1_INVALID_BLOCK_ID(); - error L1_TRANSITION_NOT_FOUND(); - error L1_UNEXPECTED_TRANSITION_ID(); - - /// @notice This function will revert if the transition is not found. - /// @dev Retrieves the transition with a given parentHash. - /// @param _state Current TaikoData.State. - /// @param _config Actual TaikoData.Config. - /// @param _blockId Id of the block. - /// @param _parentHash Parent hash of the block. - /// @return The state transition data of the block. - function getTransition( - TaikoData.State storage _state, - TaikoData.Config memory _config, - uint64 _blockId, - bytes32 _parentHash - ) - internal - view - returns (TaikoData.TransitionState storage) - { - (TaikoData.Block storage blk, uint64 slot) = getBlock(_state, _config, _blockId); - - uint32 tid = getTransitionId(_state, blk, slot, _parentHash); - if (tid == 0) revert L1_TRANSITION_NOT_FOUND(); - - return _state.transitions[slot][tid]; - } - - /// @notice This function will revert if the transition is not found. - /// @dev Retrieves the transition with a given parentHash. - /// @param _state Current TaikoData.State. - /// @param _config Actual TaikoData.Config. - /// @param _blockId Id of the block. - /// @param _tid The transition id. - /// @return The state transition data of the block. - function getTransition( - TaikoData.State storage _state, - TaikoData.Config memory _config, - uint64 _blockId, - uint32 _tid - ) - internal - view - returns (TaikoData.TransitionState storage) - { - (TaikoData.Block storage blk, uint64 slot) = getBlock(_state, _config, _blockId); - - if (_tid == 0 || _tid >= blk.nextTransitionId) revert L1_TRANSITION_NOT_FOUND(); - return _state.transitions[slot][_tid]; - } - - /// @dev Retrieves a block based on its ID. - /// @param _state Current TaikoData.State. - /// @param _config Actual TaikoData.Config. - /// @param _blockId Id of the block. - function getBlock( - TaikoData.State storage _state, - TaikoData.Config memory _config, - uint64 _blockId - ) - internal - view - returns (TaikoData.Block storage blk_, uint64 slot_) - { - slot_ = _blockId % _config.blockRingBufferSize; - blk_ = _state.blocks[slot_]; - if (blk_.blockId != _blockId) revert L1_INVALID_BLOCK_ID(); - } - - /// @dev Retrieves the ID of the transition with a given parentHash. - /// This function will return 0 if the transition is not found. - function getTransitionId( - TaikoData.State storage _state, - TaikoData.Block storage _blk, - uint64 _slot, - bytes32 _parentHash - ) - internal - view - returns (uint32 tid_) - { - if (_state.transitions[_slot][1].key == _parentHash) { - tid_ = 1; - if (tid_ >= _blk.nextTransitionId) revert L1_UNEXPECTED_TRANSITION_ID(); - } else { - tid_ = _state.transitionIds[_blk.blockId][_parentHash]; - if (tid_ != 0 && tid_ >= _blk.nextTransitionId) revert L1_UNEXPECTED_TRANSITION_ID(); - } - } - - function isPostDeadline( - uint256 _tsTimestamp, - uint256 _lastUnpausedAt, - uint256 _windowMinutes - ) - internal - view - returns (bool) - { - unchecked { - uint256 deadline = _tsTimestamp.max(_lastUnpausedAt) + _windowMinutes * 60; - return block.timestamp >= deadline; - } - } -} diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol deleted file mode 100644 index 69ac3bcfe17..00000000000 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ /dev/null @@ -1,262 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../signal/ISignalService.sol"; -import "./LibUtils.sol"; - -/// @title LibVerifying -/// @notice A library for handling block verification in the Taiko protocol. -/// @custom:security-contact security@taiko.xyz -library LibVerifying { - using LibMath for uint256; - - // Warning: Any events defined here must also be defined in TaikoEvents.sol. - /// @notice Emitted when a block is verified. - /// @param blockId The block ID. - /// @param prover The actual prover of the block. - /// @param blockHash The block hash. - /// @param stateRoot The state root. - /// @param tier The tier of the transition used for verification. - event BlockVerified( - uint256 indexed blockId, - address indexed prover, - bytes32 blockHash, - bytes32 stateRoot, - uint16 tier - ); - - /// @notice Emitted when some state variable values changed. - /// @dev This event is currently used by Taiko node/client for block proposal/proving. - /// @param slotB The SlotB data structure. - event StateVariablesUpdated(TaikoData.SlotB slotB); - - // Warning: Any errors defined here must also be defined in TaikoErrors.sol. - error L1_BLOCK_MISMATCH(); - error L1_INVALID_CONFIG(); - error L1_INVALID_GENESIS_HASH(); - error L1_TRANSITION_ID_ZERO(); - error L1_TOO_LATE(); - - /// @notice Initializes the Taiko protocol state. - /// @param _state The state to initialize. - /// @param _config The configuration for the Taiko protocol. - /// @param _genesisBlockHash The block hash of the genesis block. - function init( - TaikoData.State storage _state, - TaikoData.Config memory _config, - bytes32 _genesisBlockHash - ) - internal - { - if (!_isConfigValid(_config)) revert L1_INVALID_CONFIG(); - - _setupGenesisBlock(_state, _genesisBlockHash); - } - - function resetGenesisHash(TaikoData.State storage _state, bytes32 _genesisBlockHash) internal { - if (_state.slotB.numBlocks != 1) revert L1_TOO_LATE(); - - _setupGenesisBlock(_state, _genesisBlockHash); - } - - /// @dev Verifies up to N blocks. - function verifyBlocks( - TaikoData.State storage _state, - IERC20 _tko, - TaikoData.Config memory _config, - IAddressResolver _resolver, - uint64 _maxBlocksToVerify - ) - internal - { - if (_maxBlocksToVerify == 0) { - return; - } - - // Retrieve the latest verified block and the associated transition used - // for its verification. - TaikoData.SlotB memory b = _state.slotB; - uint64 blockId = b.lastVerifiedBlockId; - - uint64 slot = blockId % _config.blockRingBufferSize; - - TaikoData.Block storage blk = _state.blocks[slot]; - if (blk.blockId != blockId) revert L1_BLOCK_MISMATCH(); - - uint32 tid = blk.verifiedTransitionId; - - // The following scenario should never occur but is included as a - // precaution. - if (tid == 0) revert L1_TRANSITION_ID_ZERO(); - - // The `blockHash` variable represents the most recently trusted - // blockHash on L2. - bytes32 blockHash = _state.transitions[slot][tid].blockHash; - bytes32 stateRoot; - uint64 numBlocksVerified; - ITierRouter tierRouter; - - // Unchecked is safe: - // - assignment is within ranges - // - blockId and numBlocksVerified values incremented will still be OK in the - // next 584K years if we verifying one block per every second - unchecked { - ++blockId; - - while (blockId < b.numBlocks && numBlocksVerified < _maxBlocksToVerify) { - slot = blockId % _config.blockRingBufferSize; - - blk = _state.blocks[slot]; - if (blk.blockId != blockId) revert L1_BLOCK_MISMATCH(); - - tid = LibUtils.getTransitionId(_state, blk, slot, blockHash); - // When `tid` is 0, it indicates that there is no proven - // transition with its parentHash equal to the blockHash of the - // most recently verified block. - if (tid == 0) break; - - // A transition with the correct `parentHash` has been located. - TaikoData.TransitionState storage ts = _state.transitions[slot][tid]; - - // It's not possible to verify this block if either the - // transition is contested and awaiting higher-tier proof or if - // the transition is still within its cooldown period. - uint16 tier = ts.tier; - - if (ts.contester != address(0)) { - break; - } else { - if (tierRouter == ITierRouter(address(0))) { - tierRouter = ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); - } - - if ( - !LibUtils.isPostDeadline( - ts.timestamp, - b.lastUnpausedAt, - ITierProvider(tierRouter.getProvider(blockId)).getTier(tier) - .cooldownWindow - ) - ) { - // If cooldownWindow is 0, the block can theoretically - // be proved and verified within the same L1 block. - break; - } - } - - // Mark this block as verified - blk.verifiedTransitionId = tid; - - // Update variables - blockHash = ts.blockHash; - stateRoot = ts.stateRoot; - - address prover = ts.prover; - _tko.transfer(prover, ts.validityBond); - - // Note: We exclusively address the bonds linked to the - // transition used for verification. While there may exist - // other transitions for this block, we disregard them entirely. - // The bonds for these other transitions are burned (more precisely held in custody) - // either when the transitions are generated or proven. In such cases, both the - // provers and contesters of those transitions forfeit their bonds. - - emit BlockVerified({ - blockId: blockId, - prover: prover, - blockHash: blockHash, - stateRoot: stateRoot, - tier: tier - }); - - ++blockId; - ++numBlocksVerified; - } - - if (numBlocksVerified != 0) { - uint64 lastVerifiedBlockId = b.lastVerifiedBlockId + numBlocksVerified; - - // Update protocol level state variables - _state.slotB.lastVerifiedBlockId = lastVerifiedBlockId; - - // Sync chain data - _syncChainData(_state, _config, _resolver, lastVerifiedBlockId, stateRoot); - } - } - } - - /// @notice Emit events used by client/node. - function emitEventForClient(TaikoData.State storage _state) internal { - emit StateVariablesUpdated({ slotB: _state.slotB }); - } - - function _setupGenesisBlock( - TaikoData.State storage _state, - bytes32 _genesisBlockHash - ) - private - { - if (_genesisBlockHash == 0) revert L1_INVALID_GENESIS_HASH(); - // Init state - _state.slotA.genesisHeight = uint64(block.number); - _state.slotA.genesisTimestamp = uint64(block.timestamp); - _state.slotB.numBlocks = 1; - - // Init the genesis block - TaikoData.Block storage blk = _state.blocks[0]; - blk.nextTransitionId = 2; - blk.proposedAt = uint64(block.timestamp); - blk.verifiedTransitionId = 1; - blk.metaHash = bytes32(uint256(1)); // Give the genesis metahash a non-zero value. - - // Init the first state transition - TaikoData.TransitionState storage ts = _state.transitions[0][1]; - ts.blockHash = _genesisBlockHash; - ts.prover = address(0); - ts.timestamp = uint64(block.timestamp); - - emit BlockVerified({ - blockId: 0, - prover: address(0), - blockHash: _genesisBlockHash, - stateRoot: 0, - tier: 0 - }); - } - - function _syncChainData( - TaikoData.State storage _state, - TaikoData.Config memory _config, - IAddressResolver _resolver, - uint64 _lastVerifiedBlockId, - bytes32 _stateRoot - ) - private - { - ISignalService signalService = - ISignalService(_resolver.resolve(LibStrings.B_SIGNAL_SERVICE, false)); - - uint64 lastSyncedBlock = - signalService.getSyncedChainHeight(_config.chainId, LibStrings.H_STATE_ROOT); - - if (_lastVerifiedBlockId > lastSyncedBlock + _config.blockSyncThreshold) { - _state.slotA.lastSyncedBlockId = _lastVerifiedBlockId; - _state.slotA.lastSynecdAt = uint64(block.timestamp); - - signalService.syncChainData( - _config.chainId, LibStrings.H_STATE_ROOT, _lastVerifiedBlockId, _stateRoot - ); - } - } - - function _isConfigValid(TaikoData.Config memory _config) private view returns (bool) { - if ( - _config.chainId <= 1 || _config.chainId == block.chainid // - || _config.blockMaxProposals <= 1 - || _config.blockRingBufferSize <= _config.blockMaxProposals + 1 - || _config.blockMaxGasLimit == 0 || _config.livenessBond == 0 - ) return false; - - return true; - } -} diff --git a/packages/protocol/contracts/L1/tiers/TierProviderBase.sol b/packages/protocol/contracts/L1/tiers/TierProviderBase.sol deleted file mode 100644 index 00d457c735c..00000000000 --- a/packages/protocol/contracts/L1/tiers/TierProviderBase.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../common/LibStrings.sol"; -import "./ITierProvider.sol"; - -/// @title TierProviderBase -/// @custom:security-contact security@taiko.xyz -abstract contract TierProviderBase is ITierProvider { - /// @inheritdoc ITierProvider - function getTier(uint16 _tierId) - public - pure - virtual - override - returns (ITierProvider.Tier memory) - { - if (_tierId == LibTiers.TIER_OPTIMISTIC) { - return ITierProvider.Tier({ - verifierName: "", - validityBond: 250 ether, // TKO - contestBond: 500 ether, // TKO - cooldownWindow: 1440, //24 hours - provingWindow: 30, // 0.5 hours - maxBlocksToVerifyPerProof: 16 - }); - } - - if (_tierId == LibTiers.TIER_SGX) { - return ITierProvider.Tier({ - verifierName: LibStrings.B_TIER_SGX, - validityBond: 250 ether, // TKO - contestBond: 1640 ether, // =250TKO * 6.5625 - cooldownWindow: 1440, //24 hours - provingWindow: 60, // 1 hours - maxBlocksToVerifyPerProof: 8 - }); - } - - if (_tierId == LibTiers.TIER_SGX_ZKVM) { - return ITierProvider.Tier({ - verifierName: LibStrings.B_TIER_SGX_ZKVM, - validityBond: 500 ether, // TKO - contestBond: 3280 ether, // =500TKO * 6.5625 - cooldownWindow: 1440, //24 hours - provingWindow: 240, // 4 hours - maxBlocksToVerifyPerProof: 4 - }); - } - - if (_tierId == LibTiers.TIER_GUARDIAN_MINORITY) { - return ITierProvider.Tier({ - verifierName: LibStrings.B_TIER_GUARDIAN_MINORITY, - validityBond: 500 ether, // TKO - contestBond: 3280 ether, // =500TKO * 6.5625 - cooldownWindow: 1440, //24 hours - provingWindow: 2880, // 48 hours - maxBlocksToVerifyPerProof: 16 - }); - } - - if (_tierId == LibTiers.TIER_GUARDIAN) { - return ITierProvider.Tier({ - verifierName: LibStrings.B_TIER_GUARDIAN, - validityBond: 0, // must be 0 for top tier - contestBond: 0, // must be 0 for top tier - cooldownWindow: 60, //1 hours - provingWindow: 2880, // 48 hours - maxBlocksToVerifyPerProof: 16 - }); - } - - revert TIER_NOT_FOUND(); - } -} diff --git a/packages/protocol/contracts/L1/tiers/TierProviderV2.sol b/packages/protocol/contracts/L1/tiers/TierProviderV2.sol deleted file mode 100644 index bab18f51823..00000000000 --- a/packages/protocol/contracts/L1/tiers/TierProviderV2.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "./TierProviderBase.sol"; - -/// @title TierProviderV2 -/// @custom:security-contact security@taiko.xyz -contract TierProviderV2 is TierProviderBase { - /// @inheritdoc ITierProvider - function getTierIds() public pure override returns (uint16[] memory tiers_) { - tiers_ = new uint16[](3); - tiers_[0] = LibTiers.TIER_SGX; - tiers_[1] = LibTiers.TIER_GUARDIAN_MINORITY; - tiers_[2] = LibTiers.TIER_GUARDIAN; - } - - /// @inheritdoc ITierProvider - function getMinTier(uint256) public pure override returns (uint16) { - return LibTiers.TIER_SGX; - } -} diff --git a/packages/protocol/contracts/L1/tiers/TierProviderV3.sol b/packages/protocol/contracts/L1/tiers/TierProviderV3.sol deleted file mode 100644 index d8e6555a65b..00000000000 --- a/packages/protocol/contracts/L1/tiers/TierProviderV3.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "./TierProviderBase.sol"; - -/// @title TierProviderV3 -/// @custom:security-contact security@taiko.xyz -contract TierProviderV3 is TierProviderBase { - /// @inheritdoc ITierProvider - function getTierIds() public pure override returns (uint16[] memory tiers_) { - tiers_ = new uint16[](4); - tiers_[0] = LibTiers.TIER_SGX; - tiers_[1] = LibTiers.TIER_SGX_ZKVM; - tiers_[2] = LibTiers.TIER_GUARDIAN_MINORITY; - tiers_[3] = LibTiers.TIER_GUARDIAN; - } - - /// @inheritdoc ITierProvider - function getMinTier(uint256 _rand) public pure override returns (uint16) { - // 0.1% require SGX + ZKVM; all others require SGX - if (_rand % 1000 == 0) return LibTiers.TIER_SGX_ZKVM; - else return LibTiers.TIER_SGX; - } -} diff --git a/packages/protocol/contracts/L1/tiers/TierRouter.sol b/packages/protocol/contracts/L1/tiers/TierRouter.sol deleted file mode 100644 index aa4c68033c1..00000000000 --- a/packages/protocol/contracts/L1/tiers/TierRouter.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "./ITierRouter.sol"; - -/// @title TierRouter -/// @dev Labeled in AddressResolver as "tier_router" -/// @custom:security-contact security@taiko.xyz -contract TierRouter is ITierRouter { - /// @inheritdoc ITierRouter - function getProvider(uint256 /*_blockId*/ ) external pure returns (address) { - return 0x4cffe56C947E26D07C14020499776DB3e9AE3a23; - } -} diff --git a/packages/protocol/contracts/L2/DelegateOwner.sol b/packages/protocol/contracts/L2/DelegateOwner.sol deleted file mode 100644 index fafff269dc6..00000000000 --- a/packages/protocol/contracts/L2/DelegateOwner.sol +++ /dev/null @@ -1,118 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../common/EssentialContract.sol"; -import "../common/LibStrings.sol"; -import "../libs/LibAddress.sol"; -import "../libs/LibBytes.sol"; -import "../bridge/IBridge.sol"; - -/// @title DelegateOwner -/// @notice This contract will be the owner of all essential contracts deployed on the L2 chain. -/// @dev Notice that when sending the message on the owner chain, the gas limit of the message must -/// not be zero, so on this chain, some EOA can help execute this transaction. -/// @custom:security-contact security@taiko.xyz -contract DelegateOwner is EssentialContract, IMessageInvocable { - /// @notice The owner chain ID. - uint64 public l1ChainId; - - /// @notice The next transaction ID. - uint64 public nextTxId; - - /// @notice The real owner on L1, supposedly the DAO. - address public realOwner; - - uint256[48] private __gap; - - struct Call { - uint64 txId; - address target; - bool isDelegateCall; - bytes txdata; - } - - /// @notice Emitted when a message is invoked. - /// @param txId The transaction ID. - /// @param target The target address. - /// @param isDelegateCall True if the call is a `delegatecall`. - /// @param selector The function selector. - event MessageInvoked( - uint64 indexed txId, address indexed target, bool isDelegateCall, bytes4 indexed selector - ); - - error DO_DRYRUN_SUCCEEDED(); - error DO_INVALID_PARAM(); - error DO_INVALID_TARGET(); - error DO_INVALID_TX_ID(); - error DO_PERMISSION_DENIED(); - - /// @notice Initializes the contract. - /// @param _realOwner The real owner on L1 that can send a cross-chain message to invoke - /// `onMessageInvocation`. - /// @param _addressManager The address of the {AddressManager} contract. - /// @param _l1ChainId The L1 chain's ID. - function init( - address _realOwner, - address _addressManager, - uint64 _l1ChainId - ) - external - initializer - { - // This contract's owner will be itself. - __Essential_init(address(this), _addressManager); - - if (_realOwner == address(0) || _l1ChainId == 0 || _l1ChainId == block.chainid) { - revert DO_INVALID_PARAM(); - } - - realOwner = _realOwner; - l1ChainId = _l1ChainId; - } - - /// @inheritdoc IMessageInvocable - function onMessageInvocation(bytes calldata _data) - external - payable - onlyFromNamed(LibStrings.B_BRIDGE) - { - IBridge.Context memory ctx = IBridge(msg.sender).context(); - if (ctx.srcChainId != l1ChainId || ctx.from != realOwner) { - revert DO_PERMISSION_DENIED(); - } - _invokeCall(_data, true); - } - - /// @notice Dryruns a message invocation but always revert. - /// If this tx is reverted with DO_TRY_RUN_SUCCEEDED, the try run is successful. - /// Note that this function shall not be used in transaction and is designed for offchain - /// simulation only. - function dryrunMessageInvocation(bytes calldata _data) external payable { - _invokeCall(_data, false); - revert DO_DRYRUN_SUCCEEDED(); - } - - function acceptOwnership(address target) external { - Ownable2StepUpgradeable(target).acceptOwnership(); - } - - function transferOwnership(address) public pure override notImplemented { } - - function _authorizePause(address, bool) internal pure override notImplemented { } - - function _invokeCall(bytes calldata _data, bool _verifyTxId) internal { - Call memory call = abi.decode(_data, (Call)); - - if (_verifyTxId && call.txId != nextTxId++) revert DO_INVALID_TX_ID(); - - // By design, the target must be a contract address if the txdata is not empty - if (call.txdata.length != 0 && !Address.isContract(call.target)) revert DO_INVALID_TARGET(); - - (bool success, bytes memory result) = call.isDelegateCall // - ? call.target.delegatecall(call.txdata) - : call.target.call{ value: msg.value }(call.txdata); - - if (!success) LibBytes.revertWithExtractedError(result); - emit MessageInvoked(call.txId, call.target, call.isDelegateCall, bytes4(call.txdata)); - } -} diff --git a/packages/protocol/contracts/L2/Lib1559Math.sol b/packages/protocol/contracts/L2/Lib1559Math.sol deleted file mode 100644 index 4b5316c28f6..00000000000 --- a/packages/protocol/contracts/L2/Lib1559Math.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../thirdparty/solmate/LibFixedPointMath.sol"; -import "../libs/LibMath.sol"; - -/// @title Lib1559Math -/// @notice Implements e^(x) based bonding curve for EIP-1559 -/// @dev See https://ethresear.ch/t/make-eip-1559-more-like-an-amm-curve/9082 but some minor -/// difference as stated in docs/eip1559_on_l2.md. -/// @custom:security-contact security@taiko.xyz -library Lib1559Math { - using LibMath for uint256; - - error EIP1559_INVALID_PARAMS(); - - function calc1559BaseFee( - uint32 _gasTargetPerL1Block, - uint8 _adjustmentQuotient, - uint64 _gasExcess, - uint64 _gasIssuance, - uint32 _parentGasUsed - ) - internal - pure - returns (uint256 basefee_, uint64 gasExcess_) - { - // We always add the gas used by parent block to the gas excess - // value as this has already happened - uint256 excess = uint256(_gasExcess) + _parentGasUsed; - excess = excess > _gasIssuance ? excess - _gasIssuance : 1; - gasExcess_ = uint64(excess.min(type(uint64).max)); - - // The base fee per gas used by this block is the spot price at the - // bonding curve, regardless the actual amount of gas used by this - // block, however, this block's gas used will affect the next - // block's base fee. - basefee_ = basefee(gasExcess_, uint256(_adjustmentQuotient) * _gasTargetPerL1Block); - - // Always make sure basefee is nonzero, this is required by the node. - if (basefee_ == 0) basefee_ = 1; - } - - /// @dev eth_qty(excess_gas_issued) / (TARGET * ADJUSTMENT_QUOTIENT) - /// @param _gasExcess The gas excess value - /// @param _adjustmentFactor The product of gasTarget and adjustmentQuotient - function basefee( - uint256 _gasExcess, - uint256 _adjustmentFactor - ) - internal - pure - returns (uint256) - { - if (_adjustmentFactor == 0) { - revert EIP1559_INVALID_PARAMS(); - } - return _ethQty(_gasExcess, _adjustmentFactor) / LibFixedPointMath.SCALING_FACTOR; - } - - /// @dev exp(gas_qty / TARGET / ADJUSTMENT_QUOTIENT) - function _ethQty( - uint256 _gasExcess, - uint256 _adjustmentFactor - ) - private - pure - returns (uint256) - { - uint256 input = _gasExcess * LibFixedPointMath.SCALING_FACTOR / _adjustmentFactor; - if (input > LibFixedPointMath.MAX_EXP_INPUT) { - input = LibFixedPointMath.MAX_EXP_INPUT; - } - return uint256(LibFixedPointMath.exp(int256(input))); - } -} diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol deleted file mode 100644 index 896376c1bdc..00000000000 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ /dev/null @@ -1,263 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; - -import "../common/EssentialContract.sol"; -import "../common/LibStrings.sol"; -import "../libs/LibAddress.sol"; -import "../signal/ISignalService.sol"; -import "./Lib1559Math.sol"; -import "./LibL2Config.sol"; - -/// @title TaikoL2 -/// @notice Taiko L2 is a smart contract that handles cross-layer message -/// verification and manages EIP-1559 gas pricing for Layer 2 (L2) operations. -/// It is used to anchor the latest L1 block details to L2 for cross-layer -/// communication, manage EIP-1559 parameters for gas pricing, and store -/// verified L1 block information. -/// @custom:security-contact security@taiko.xyz -contract TaikoL2 is EssentialContract { - using LibAddress for address; - using SafeERC20 for IERC20; - - /// @notice Golden touch address is the only address that can do the anchor transaction. - address public constant GOLDEN_TOUCH_ADDRESS = 0x0000777735367b36bC9B61C50022d9D0700dB4Ec; - - /// @notice Mapping from L2 block numbers to their block hashes. All L2 block hashes will - /// be saved in this mapping. - mapping(uint256 blockId => bytes32 blockHash) public l2Hashes; - - /// @notice A hash to check the integrity of public inputs. - /// @dev Slot 2. - bytes32 public publicInputHash; - - /// @notice The gas excess value used to calculate the base fee. - /// @dev Slot 3. - uint64 public gasExcess; - - /// @notice The last synced L1 block height. - uint64 public lastSyncedBlock; - - uint64 private __deprecated1; // was parentTimestamp - uint64 private __deprecated2; // was __currentBlockTimestamp - - /// @notice The L1's chain ID. - uint64 public l1ChainId; - - uint256[46] private __gap; - - /// @notice Emitted when the latest L1 block details are anchored to L2. - /// @param parentHash The hash of the parent block. - /// @param gasExcess The gas excess value used to calculate the base fee. - event Anchored(bytes32 parentHash, uint64 gasExcess); - - error L2_BASEFEE_MISMATCH(); - error L2_INVALID_L1_CHAIN_ID(); - error L2_INVALID_L2_CHAIN_ID(); - error L2_INVALID_PARAM(); - error L2_INVALID_SENDER(); - error L2_PUBLIC_INPUT_HASH_MISMATCH(); - error L2_TOO_LATE(); - - /// @notice Initializes the contract. - /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - /// @param _l1ChainId The ID of the base layer. - /// @param _gasExcess The initial gasExcess. - function init( - address _owner, - address _addressManager, - uint64 _l1ChainId, - uint64 _gasExcess - ) - external - initializer - { - __Essential_init(_owner, _addressManager); - - if (_l1ChainId == 0 || _l1ChainId == block.chainid) { - revert L2_INVALID_L1_CHAIN_ID(); - } - if (block.chainid <= 1 || block.chainid > type(uint64).max) { - revert L2_INVALID_L2_CHAIN_ID(); - } - - if (block.number == 0) { - // This is the case in real L2 genesis - } else if (block.number == 1) { - // This is the case in tests - uint256 parentHeight = block.number - 1; - l2Hashes[parentHeight] = blockhash(parentHeight); - } else { - revert L2_TOO_LATE(); - } - - l1ChainId = _l1ChainId; - gasExcess = _gasExcess; - (publicInputHash,) = _calcPublicInputHash(block.number); - } - - /// @notice Anchors the latest L1 block details to L2 for cross-layer - /// message verification. - /// @dev This function can be called freely as the golden touch private key is publicly known, - /// but the Taiko node guarantees the first transaction of each block is always this anchor - /// transaction, and any subsequent calls will revert with L2_PUBLIC_INPUT_HASH_MISMATCH. - /// @param _l1BlockHash The latest L1 block hash when this block was - /// proposed. - /// @param _l1StateRoot The latest L1 block's state root. - /// @param _l1BlockId The latest L1 block height when this block was proposed. - /// @param _parentGasUsed The gas used in the parent block. - function anchor( - bytes32 _l1BlockHash, - bytes32 _l1StateRoot, - uint64 _l1BlockId, - uint32 _parentGasUsed - ) - external - nonReentrant - { - if ( - _l1BlockHash == 0 || _l1StateRoot == 0 || _l1BlockId == 0 - || (block.number != 1 && _parentGasUsed == 0) - ) { - revert L2_INVALID_PARAM(); - } - - if (msg.sender != GOLDEN_TOUCH_ADDRESS) revert L2_INVALID_SENDER(); - - uint256 parentId; - unchecked { - parentId = block.number - 1; - } - - // Verify ancestor hashes - (bytes32 publicInputHashOld, bytes32 publicInputHashNew) = _calcPublicInputHash(parentId); - if (publicInputHash != publicInputHashOld) { - revert L2_PUBLIC_INPUT_HASH_MISMATCH(); - } - - // Verify the base fee per gas is correct - (uint256 _basefee, uint64 _gasExcess) = getBasefee(_l1BlockId, _parentGasUsed); - - if (!skipFeeCheck() && block.basefee != _basefee) { - revert L2_BASEFEE_MISMATCH(); - } - - if (_l1BlockId > lastSyncedBlock) { - // Store the L1's state root as a signal to the local signal service to - // allow for multi-hop bridging. - ISignalService(resolve(LibStrings.B_SIGNAL_SERVICE, false)).syncChainData( - l1ChainId, LibStrings.H_STATE_ROOT, _l1BlockId, _l1StateRoot - ); - - lastSyncedBlock = _l1BlockId; - } - - // Update state variables - bytes32 _parentHash = blockhash(parentId); - l2Hashes[parentId] = _parentHash; - publicInputHash = publicInputHashNew; - gasExcess = _gasExcess; - - emit Anchored(_parentHash, _gasExcess); - } - - /// @notice Withdraw token or Ether from this address - /// @param _token Token address or address(0) if Ether. - /// @param _to Withdraw to address. - function withdraw( - address _token, - address _to - ) - external - whenNotPaused - onlyFromOwnerOrNamed(LibStrings.B_WITHDRAWER) - nonReentrant - { - if (_to == address(0)) revert L2_INVALID_PARAM(); - if (_token == address(0)) { - _to.sendEtherAndVerify(address(this).balance); - } else { - IERC20(_token).safeTransfer(_to, IERC20(_token).balanceOf(address(this))); - } - } - - /// @notice Gets the basefee and gas excess using EIP-1559 configuration for - /// the given parameters. - /// @param _l1BlockId The synced L1 height in the next Taiko block - /// @param _parentGasUsed Gas used in the parent block. - /// @return basefee_ The calculated EIP-1559 base fee per gas. - /// @return gasExcess_ The new gasExcess value. - function getBasefee( - uint64 _l1BlockId, - uint32 _parentGasUsed - ) - public - view - returns (uint256 basefee_, uint64 gasExcess_) - { - LibL2Config.Config memory config = getConfig(); - uint64 gasIssuance = uint64(_l1BlockId - lastSyncedBlock) * config.gasTargetPerL1Block; - - (basefee_, gasExcess_) = Lib1559Math.calc1559BaseFee( - config.gasTargetPerL1Block, - config.basefeeAdjustmentQuotient, - gasExcess, - gasIssuance, - _parentGasUsed - ); - } - - /// @notice Retrieves the block hash for the given L2 block number. - /// @param _blockId The L2 block number to retrieve the block hash for. - /// @return The block hash for the specified L2 block id, or zero if the - /// block id is greater than or equal to the current block number. - function getBlockHash(uint64 _blockId) public view returns (bytes32) { - if (_blockId >= block.number) return 0; - if (_blockId + 256 >= block.number) return blockhash(_blockId); - return l2Hashes[_blockId]; - } - - /// @notice Returns EIP1559 related configurations. - /// @return config_ struct containing configuration parameters. - function getConfig() public view virtual returns (LibL2Config.Config memory) { - return LibL2Config.get(); - } - - /// @notice Tells if we need to validate basefee (for simulation). - /// @return Returns true to skip checking basefee mismatch. - function skipFeeCheck() public pure virtual returns (bool) { - return false; - } - - function _calcPublicInputHash(uint256 _blockId) - private - view - returns (bytes32 publicInputHashOld, bytes32 publicInputHashNew) - { - bytes32[256] memory inputs; - - // Unchecked is safe because it cannot overflow. - unchecked { - // Put the previous 255 blockhashes (excluding the parent's) into a - // ring buffer. - for (uint256 i; i < 255 && _blockId >= i + 1; ++i) { - uint256 j = _blockId - i - 1; - inputs[j % 255] = blockhash(j); - } - } - - inputs[255] = bytes32(block.chainid); - - assembly { - publicInputHashOld := keccak256(inputs, 8192 /*mul(256, 32)*/ ) - } - - inputs[_blockId % 255] = blockhash(_blockId); - assembly { - publicInputHashNew := keccak256(inputs, 8192 /*mul(256, 32)*/ ) - } - } -} diff --git a/packages/protocol/contracts/automata-attestation/README.md b/packages/protocol/contracts/automata-attestation/README.md deleted file mode 100644 index 13f897ca957..00000000000 --- a/packages/protocol/contracts/automata-attestation/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Readme - -Original code (main branch) forked from https://github.com/automata-network/automata-dcap-v3-attestation and applied some gas optimizations here: https://github.com/smtmfft/automata-dcap-v3-attestation/tree/parse-quote-offline, which then got merged into taiko-mono. -The corresponding upstream PR is: https://github.com/automata-network/automata-dcap-v3-attestation/pull/6, waiting to be merged. diff --git a/packages/protocol/contracts/compiled/FiatTokenProxy.json b/packages/protocol/contracts/compiled/FiatTokenProxy.json deleted file mode 100644 index cebc9f3ceca..00000000000 --- a/packages/protocol/contracts/compiled/FiatTokenProxy.json +++ /dev/null @@ -1,552 +0,0 @@ -{ - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "implementationContract", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "AdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "inputs": [], - "name": "admin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "changeAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "implementation", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", - "type": "function" - } - ], - "bytecode": { - "object": "0x608060405234801561001057600080fd5b506040516108a93803806108a98339818101604052602081101561003357600080fd5b5051808061004081610051565b5061004a336100c3565b5050610123565b610064816100e760201b61042a1760201c565b61009f5760405162461bcd60e51b815260040180806020018281038252603b81526020018061086e603b913960400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c355565b7f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b55565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061011b57508115155b949350505050565b61073c806101326000396000f3fe60806040526004361061005a5760003560e01c80635c60da1b116100435780635c60da1b146101315780638f2839701461016f578063f851a440146101af5761005a565b80633659cfe6146100645780634f1ef286146100a4575b6100626101c4565b005b34801561007057600080fd5b506100626004803603602081101561008757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101de565b610062600480360360408110156100ba57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691908101906040810160208201356401000000008111156100f257600080fd5b82018360208201111561010457600080fd5b8035906020019184600183028401116401000000008311171561012657600080fd5b509092509050610232565b34801561013d57600080fd5b50610146610309565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561017b57600080fd5b506100626004803603602081101561019257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610318565b3480156101bb57600080fd5b50610146610420565b6101cc610466565b6101dc6101d76104fa565b61051f565b565b6101e6610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102275761022281610568565b61022f565b61022f6101c4565b50565b61023a610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102fc5761027683610568565b60003073ffffffffffffffffffffffffffffffffffffffff16348484604051808383808284376040519201945060009350909150508083038185875af1925050503d80600081146102e3576040519150601f19603f3d011682016040523d82523d6000602084013e6102e8565b606091505b50509050806102f657600080fd5b50610304565b6103046101c4565b505050565b60006103136104fa565b905090565b610320610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102275773ffffffffffffffffffffffffffffffffffffffff81166103bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806106966036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e8610543565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301528051918290030190a1610222816105bd565b6000610313610543565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061045e57508115155b949350505050565b61046e610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156104f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806106646032913960400191505060405180910390fd5b6101dc6101dc565b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c35490565b3660008037600080366000845af43d6000803e80801561053e573d6000f35b3d6000fd5b7f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b5490565b610571816105e1565b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9181900360200190a150565b7f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b55565b6105ea8161042a565b61063f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001806106cc603b913960400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c35556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a264697066735822122001b610efbebc57927addec087895f40a32b15707f9bbcd4d028e2ffcc8cd241f64736f6c634300060c003343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373", - "sourceMap": "1385:182:20:-:0;;;1443:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1443:122:20;;;2686:42:19;2705:22;2686:18;:42::i;:::-;-1:-1:-1;3044:21:17::1;3054:10;3044:9;:21::i;:::-;2847:225:::0;1443:122:20;1385:182;;3492:342:19;3586:37;3605:17;3586:18;;;;;:37;;:::i;:::-;3565:143;;;;-1:-1:-1;;;3565:143:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2298:66;3787:31;3773:55::o;5448:153:17:-;2256:66;5563:22;5549:46::o;718:610:21:-;778:4;1239:20;;1084:66;1278:23;;;;;;:42;;-1:-1:-1;1305:15:21;;;1278:42;1270:51;718:610;-1:-1:-1;;;;718:610:21:o;1385:182:20:-;;;;;;;", - "linkReferences": {} - }, - "deployedBytecode": { - "object": "0x60806040526004361061005a5760003560e01c80635c60da1b116100435780635c60da1b146101315780638f2839701461016f578063f851a440146101af5761005a565b80633659cfe6146100645780634f1ef286146100a4575b6100626101c4565b005b34801561007057600080fd5b506100626004803603602081101561008757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101de565b610062600480360360408110156100ba57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691908101906040810160208201356401000000008111156100f257600080fd5b82018360208201111561010457600080fd5b8035906020019184600183028401116401000000008311171561012657600080fd5b509092509050610232565b34801561013d57600080fd5b50610146610309565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561017b57600080fd5b506100626004803603602081101561019257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610318565b3480156101bb57600080fd5b50610146610420565b6101cc610466565b6101dc6101d76104fa565b61051f565b565b6101e6610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102275761022281610568565b61022f565b61022f6101c4565b50565b61023a610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102fc5761027683610568565b60003073ffffffffffffffffffffffffffffffffffffffff16348484604051808383808284376040519201945060009350909150508083038185875af1925050503d80600081146102e3576040519150601f19603f3d011682016040523d82523d6000602084013e6102e8565b606091505b50509050806102f657600080fd5b50610304565b6103046101c4565b505050565b60006103136104fa565b905090565b610320610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102275773ffffffffffffffffffffffffffffffffffffffff81166103bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806106966036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e8610543565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301528051918290030190a1610222816105bd565b6000610313610543565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061045e57508115155b949350505050565b61046e610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156104f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806106646032913960400191505060405180910390fd5b6101dc6101dc565b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c35490565b3660008037600080366000845af43d6000803e80801561053e573d6000f35b3d6000fd5b7f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b5490565b610571816105e1565b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9181900360200190a150565b7f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b55565b6105ea8161042a565b61063f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001806106cc603b913960400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c35556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a264697066735822122001b610efbebc57927addec087895f40a32b15707f9bbcd4d028e2ffcc8cd241f64736f6c634300060c0033", - "sourceMap": "1385:182:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1836:11:18;:9;:11::i;:::-;1385:182:20;4049:109:17;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4049:109:17;;;;:::i;4702:406::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4702:406:17;;-1:-1:-1;4702:406:17;-1:-1:-1;4702:406:17;:::i;3294:99::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3581:272;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3581:272:17;;;;:::i;3141:81::-;;;;;;;;;;;;;:::i;3688:100:18:-;3728:15;:13;:15::i;:::-;3753:28;3763:17;:15;:17::i;:::-;3753:9;:28::i;:::-;3688:100::o;4049:109:17:-;2571:8;:6;:8::i;:::-;2557:22;;:10;:22;;;2553:96;;;4122:29:::1;4133:17;4122:10;:29::i;:::-;2553:96:::0;;;2627:11;:9;:11::i;:::-;4049:109;:::o;4702:406::-;2571:8;:6;:8::i;:::-;2557:22;;:10;:22;;;2553:96;;;4839:29:::1;4850:17;4839:10;:29::i;:::-;4965:12;4990:4;4982:18;;5008:9;5019:4;;4982:42;;;;;;;;;;::::0;;::::1;::::0;-1:-1:-1;4982:42:17::1;::::0;-1:-1:-1;4982:42:17;;-1:-1:-1;;4982:42:17;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4964:60;;;5093:7;5085:16;;;::::0;::::1;;2595:1;2553:96:::0;;;2627:11;:9;:11::i;:::-;4702:406;;;:::o;3294:99::-;3343:7;3369:17;:15;:17::i;:::-;3362:24;;3294:99;:::o;3581:272::-;2571:8;:6;:8::i;:::-;2557:22;;:10;:22;;;2553:96;;;3668:22:::1;::::0;::::1;3647:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3785:32;3798:8;:6;:8::i;:::-;3785:32;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;3827:19;3837:8;3827:9;:19::i;3141:81::-:0;3181:7;3207:8;:6;:8::i;718:610:21:-;778:4;1239:20;;1084:66;1278:23;;;;;;:42;;-1:-1:-1;1305:15:21;;;1278:42;1270:51;718:610;-1:-1:-1;;;;718:610:21:o;5684:210:17:-;5772:8;:6;:8::i;:::-;5758:22;;:10;:22;;;;5737:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5866:21;:19;:21::i;2863:185:19:-;2298:66;3021:11;;2999:43::o;2293:1025:18:-;2623:14;2620:1;2617;2604:34;2934:1;2915;2883:14;2864:1;2832:14;2809:5;2779:170;3023:16;3020:1;3017;3002:38;3061:6;3136:74;;;;3267:16;3264:1;3257:27;3136:74;3175:16;3172:1;3165:27;5165:157:17;2256:66;5295:11;;5274:42::o;3193:152:19:-;3259:37;3278:17;3259:18;:37::i;:::-;3311:27;;;;;;;;;;;;;;;;;;;3193:152;:::o;5448:153:17:-;2256:66;5563:22;5549:46::o;3492:342:19:-;3586:37;3605:17;3586:18;:37::i;:::-;3565:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2298:66;3787:31;3773:55::o", - "linkReferences": {} - }, - "methodIdentifiers": { - "admin()": "f851a440", - "changeAdmin(address)": "8f283970", - "implementation()": "5c60da1b", - "upgradeTo(address)": "3659cfe6", - "upgradeToAndCall(address,bytes)": "4f1ef286" - }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementationContract\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"changeAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract proxies FiatToken calls and enables FiatToken upgrades\",\"kind\":\"dev\",\"methods\":{\"admin()\":{\"returns\":{\"_0\":\"The address of the proxy admin.\"}},\"changeAdmin(address)\":{\"details\":\"Changes the admin of the proxy. Only the current admin can call this function.\",\"params\":{\"newAdmin\":\"Address to transfer proxy administration to.\"}},\"implementation()\":{\"returns\":{\"_0\":\"The address of the implementation.\"}},\"upgradeTo(address)\":{\"details\":\"Upgrade the backing implementation of the proxy. Only the admin can call this function.\",\"params\":{\"newImplementation\":\"Address of the new implementation.\"}},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the backing implementation of the proxy and call a function on the new implementation. This is useful to initialize the proxied contract.\",\"params\":{\"data\":\"Data to send as msg.data in the low level call. It should include the signature and the parameters of the function to be called, as described in https://solidity.readthedocs.io/en/develop/abi-spec.html#function-selector-and-argument-encoding.\",\"newImplementation\":\"Address of the new implementation.\"}}},\"title\":\"FiatTokenProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/FiatTokenProxy/centre-tokens/contracts/v1/FiatTokenProxy.sol\":\"FiatTokenProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000000},\"remappings\":[\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"src/FiatTokenProxy/centre-tokens/contracts/upgradeability/AdminUpgradeabilityProxy.sol\":{\"keccak256\":\"0xc93cb352d8b777ea96e743124af5386eeee32a9fdef0b2fbd89623988e66caad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d0407b40cd936bdf6f6ae141fef3da54824a786affc9a459cd6cd83478043683\",\"dweb:/ipfs/QmQh2LjAVdU2HKc7w1fXxuPEfFvTcBifHiYzgdrZtDB9rk\"]},\"src/FiatTokenProxy/centre-tokens/contracts/upgradeability/Proxy.sol\":{\"keccak256\":\"0x6cc252e2b80c8ecaf6d29b950ba3591e4366caf06c3ccba89a8f9cbd2ee807e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d60d210ae173d21b90b989e69c50789fb09dc27ccb0736b41907471248ee3087\",\"dweb:/ipfs/QmQbijUGm48UDyqnefEJExWsxBViKj1M5TAWY82Jn6sJW7\"]},\"src/FiatTokenProxy/centre-tokens/contracts/upgradeability/UpgradeabilityProxy.sol\":{\"keccak256\":\"0x3086b8904fb474eb3d8d701f8ec6991796c5e8a7345ace9c3aabc140973f6c85\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cde7d942bb42ee3fb09ed643751151bc192522a1dc9ccb5d28aff7fdadf8b9e6\",\"dweb:/ipfs/QmQBVbxYcZjRFH66R1ZByXx8rQym3Sx7jjFtFKRWhLXxdg\"]},\"src/FiatTokenProxy/centre-tokens/contracts/v1/FiatTokenProxy.sol\":{\"keccak256\":\"0x7e640892ac0fd6efafe4a9dc08cbc7ba5e825dafe8a6a8ebf717e7026b8fb69f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2e84a985f3271652e16eec4df9be1829f042a98b5723db5b87aeeb8eadc9c207\",\"dweb:/ipfs/QmU4JWGMzd3rA64BiDVejhnapKRJG4WHLuw3g866hFPLTx\"]},\"src/FiatTokenProxy/openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xdfb4f812600ba4ce6738c35584ceb8c9433472583051b48ba5b1f66cb758a498\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df02dffe1c1de089d9b4f6192f0dcf464526f2230f420b3deec4645e0cdd2bff\",\"dweb:/ipfs/QmcqXGAU3KJqwrgUVoGJ2W8osomhSJ4R5kdsRpbuW3fELS\"]}},\"version\":1}", - "metadata": { - "compiler": { - "version": "0.6.12+commit.27d51765" - }, - "language": "Solidity", - "output": { - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "implementationContract", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "previousAdmin", - "type": "address", - "indexed": false - }, - { - "internalType": "address", - "name": "newAdmin", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "AdminChanged", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "implementation", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "Upgraded", - "anonymous": false - }, - { - "inputs": [], - "stateMutability": "payable", - "type": "fallback" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "admin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "changeAdmin" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "implementation", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "upgradeTo" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "stateMutability": "payable", - "type": "function", - "name": "upgradeToAndCall" - } - ], - "devdoc": { - "kind": "dev", - "methods": { - "admin()": { - "returns": { - "_0": "The address of the proxy admin." - } - }, - "changeAdmin(address)": { - "details": "Changes the admin of the proxy. Only the current admin can call this function.", - "params": { - "newAdmin": "Address to transfer proxy administration to." - } - }, - "implementation()": { - "returns": { - "_0": "The address of the implementation." - } - }, - "upgradeTo(address)": { - "details": "Upgrade the backing implementation of the proxy. Only the admin can call this function.", - "params": { - "newImplementation": "Address of the new implementation." - } - }, - "upgradeToAndCall(address,bytes)": { - "details": "Upgrade the backing implementation of the proxy and call a function on the new implementation. This is useful to initialize the proxied contract.", - "params": { - "data": "Data to send as msg.data in the low level call. It should include the signature and the parameters of the function to be called, as described in https://solidity.readthedocs.io/en/develop/abi-spec.html#function-selector-and-argument-encoding.", - "newImplementation": "Address of the new implementation." - } - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - } - }, - "settings": { - "remappings": [ - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/" - ], - "optimizer": { - "enabled": true, - "runs": 10000000 - }, - "metadata": { - "bytecodeHash": "ipfs" - }, - "compilationTarget": { - "src/FiatTokenProxy/centre-tokens/contracts/v1/FiatTokenProxy.sol": "FiatTokenProxy" - }, - "libraries": {} - }, - "sources": { - "src/FiatTokenProxy/centre-tokens/contracts/upgradeability/AdminUpgradeabilityProxy.sol": { - "keccak256": "0xc93cb352d8b777ea96e743124af5386eeee32a9fdef0b2fbd89623988e66caad", - "urls": [ - "bzz-raw://d0407b40cd936bdf6f6ae141fef3da54824a786affc9a459cd6cd83478043683", - "dweb:/ipfs/QmQh2LjAVdU2HKc7w1fXxuPEfFvTcBifHiYzgdrZtDB9rk" - ], - "license": "MIT" - }, - "src/FiatTokenProxy/centre-tokens/contracts/upgradeability/Proxy.sol": { - "keccak256": "0x6cc252e2b80c8ecaf6d29b950ba3591e4366caf06c3ccba89a8f9cbd2ee807e3", - "urls": [ - "bzz-raw://d60d210ae173d21b90b989e69c50789fb09dc27ccb0736b41907471248ee3087", - "dweb:/ipfs/QmQbijUGm48UDyqnefEJExWsxBViKj1M5TAWY82Jn6sJW7" - ], - "license": "MIT" - }, - "src/FiatTokenProxy/centre-tokens/contracts/upgradeability/UpgradeabilityProxy.sol": { - "keccak256": "0x3086b8904fb474eb3d8d701f8ec6991796c5e8a7345ace9c3aabc140973f6c85", - "urls": [ - "bzz-raw://cde7d942bb42ee3fb09ed643751151bc192522a1dc9ccb5d28aff7fdadf8b9e6", - "dweb:/ipfs/QmQBVbxYcZjRFH66R1ZByXx8rQym3Sx7jjFtFKRWhLXxdg" - ], - "license": "MIT" - }, - "src/FiatTokenProxy/centre-tokens/contracts/v1/FiatTokenProxy.sol": { - "keccak256": "0x7e640892ac0fd6efafe4a9dc08cbc7ba5e825dafe8a6a8ebf717e7026b8fb69f", - "urls": [ - "bzz-raw://2e84a985f3271652e16eec4df9be1829f042a98b5723db5b87aeeb8eadc9c207", - "dweb:/ipfs/QmU4JWGMzd3rA64BiDVejhnapKRJG4WHLuw3g866hFPLTx" - ], - "license": "MIT" - }, - "src/FiatTokenProxy/openzeppelin/contracts/utils/Address.sol": { - "keccak256": "0xdfb4f812600ba4ce6738c35584ceb8c9433472583051b48ba5b1f66cb758a498", - "urls": [ - "bzz-raw://df02dffe1c1de089d9b4f6192f0dcf464526f2230f420b3deec4645e0cdd2bff", - "dweb:/ipfs/QmcqXGAU3KJqwrgUVoGJ2W8osomhSJ4R5kdsRpbuW3fELS" - ], - "license": "MIT" - } - }, - "version": 1 - }, - "ast": { - "absolutePath": "src/FiatTokenProxy/centre-tokens/contracts/v1/FiatTokenProxy.sol", - "id": 40713, - "exportedSymbols": { - "FiatTokenProxy": [40712] - }, - "nodeType": "SourceUnit", - "src": "1154:414:20", - "nodes": [ - { - "id": 40697, - "nodeType": "PragmaDirective", - "src": "1154:23:20", - "nodes": [], - "literals": ["solidity", "0.6", ".12"] - }, - { - "id": 40699, - "nodeType": "ImportDirective", - "src": "1179:94:20", - "nodes": [], - "absolutePath": "src/FiatTokenProxy/centre-tokens/contracts/upgradeability/AdminUpgradeabilityProxy.sol", - "file": "../upgradeability/AdminUpgradeabilityProxy.sol", - "scope": 40713, - "sourceUnit": 40566, - "symbolAliases": [ - { - "foreign": { - "argumentTypes": null, - "id": 40698, - "name": "AdminUpgradeabilityProxy", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": null, - "src": "1192:24:20", - "typeDescriptions": { - "typeIdentifier": null, - "typeString": null - } - }, - "local": null - } - ], - "unitAlias": "" - }, - { - "id": 40712, - "nodeType": "ContractDefinition", - "src": "1385:182:20", - "nodes": [ - { - "id": 40711, - "nodeType": "FunctionDefinition", - "src": "1443:122:20", - "nodes": [], - "body": { - "id": 40710, - "nodeType": "Block", - "src": "1563:2:20", - "nodes": [], - "statements": [] - }, - "documentation": null, - "implemented": true, - "kind": "constructor", - "modifiers": [ - { - "arguments": [ - { - "argumentTypes": null, - "id": 40707, - "name": "implementationContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 40704, - "src": "1535:22:20", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "id": 40708, - "modifierName": { - "argumentTypes": null, - "id": 40706, - "name": "AdminUpgradeabilityProxy", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 40565, - "src": "1510:24:20", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_AdminUpgradeabilityProxy_$40565_$", - "typeString": "type(contract AdminUpgradeabilityProxy)" - } - }, - "nodeType": "ModifierInvocation", - "src": "1510:48:20" - } - ], - "name": "", - "overrides": null, - "parameters": { - "id": 40705, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 40704, - "mutability": "mutable", - "name": "implementationContract", - "nodeType": "VariableDeclaration", - "overrides": null, - "scope": 40711, - "src": "1455:30:20", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 40703, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1455:7:20", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1454:32:20" - }, - "returnParameters": { - "id": 40709, - "nodeType": "ParameterList", - "parameters": [], - "src": "1563:0:20" - }, - "scope": 40712, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "public" - } - ], - "abstract": false, - "baseContracts": [ - { - "arguments": null, - "baseName": { - "contractScope": null, - "id": 40701, - "name": "AdminUpgradeabilityProxy", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 40565, - "src": "1412:24:20", - "typeDescriptions": { - "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$40565", - "typeString": "contract AdminUpgradeabilityProxy" - } - }, - "id": 40702, - "nodeType": "InheritanceSpecifier", - "src": "1412:24:20" - } - ], - "contractDependencies": [40565, 40609, 40695], - "contractKind": "contract", - "documentation": { - "id": 40700, - "nodeType": "StructuredDocumentation", - "src": "1275:109:20", - "text": " @title FiatTokenProxy\n @dev This contract proxies FiatToken calls and enables FiatToken upgrades" - }, - "fullyImplemented": true, - "linearizedBaseContracts": [40712, 40565, 40695, 40609], - "name": "FiatTokenProxy", - "scope": 40713 - } - ], - "license": "MIT" - }, - "id": 20 -} diff --git a/packages/protocol/contracts/compiled/FiatTokenV2_1.json b/packages/protocol/contracts/compiled/FiatTokenV2_1.json deleted file mode 100644 index ecde2cf6579..00000000000 --- a/packages/protocol/contracts/compiled/FiatTokenV2_1.json +++ /dev/null @@ -1,3852 +0,0 @@ -{ - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "name": "AuthorizationCanceled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "name": "AuthorizationUsed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "Blacklisted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newBlacklister", - "type": "address" - } - ], - "name": "BlacklisterChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "burner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Burn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newMasterMinter", - "type": "address" - } - ], - "name": "MasterMinterChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Mint", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "minterAllowedAmount", - "type": "uint256" - } - ], - "name": "MinterConfigured", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "oldMinter", - "type": "address" - } - ], - "name": "MinterRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "Pause", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "PauserChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newRescuer", - "type": "address" - } - ], - "name": "RescuerChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "UnBlacklisted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "Unpause", - "type": "event" - }, - { - "inputs": [], - "name": "CANCEL_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PERMIT_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RECEIVE_WITH_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TRANSFER_WITH_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "name": "authorizationState", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "blacklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "blacklister", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "cancelAuthorization", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "internalType": "uint256", - "name": "minterAllowedAmount", - "type": "uint256" - } - ], - "name": "configureMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "currency", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "decrement", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "increment", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "tokenName", - "type": "string" - }, - { - "internalType": "string", - "name": "tokenSymbol", - "type": "string" - }, - { - "internalType": "string", - "name": "tokenCurrency", - "type": "string" - }, - { - "internalType": "uint8", - "name": "tokenDecimals", - "type": "uint8" - }, - { - "internalType": "address", - "name": "newMasterMinter", - "type": "address" - }, - { - "internalType": "address", - "name": "newPauser", - "type": "address" - }, - { - "internalType": "address", - "name": "newBlacklister", - "type": "address" - }, - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "newName", - "type": "string" - } - ], - "name": "initializeV2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "lostAndFound", - "type": "address" - } - ], - "name": "initializeV2_1", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "isBlacklisted", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "isMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "masterMinter", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "mint", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - } - ], - "name": "minterAllowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pauser", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validAfter", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validBefore", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "receiveWithAuthorization", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - } - ], - "name": "removeMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IERC20", - "name": "tokenContract", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "rescueERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rescuer", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validAfter", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validBefore", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "transferWithAuthorization", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "unBlacklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newBlacklister", - "type": "address" - } - ], - "name": "updateBlacklister", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newMasterMinter", - "type": "address" - } - ], - "name": "updateMasterMinter", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newPauser", - "type": "address" - } - ], - "name": "updatePauser", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newRescuer", - "type": "address" - } - ], - "name": "updateRescuer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "version", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": { - "object": "0x60806040526001805460ff60a01b191690556000600b553480156200002357600080fd5b506200002f3362000035565b62000057565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6153eb80620000676000396000f3fe608060405234801561001057600080fd5b50600436106103365760003560e01c80637f2eecc3116101b2578063b2118a8d116100f9578063e3ee160e116100a2578063ef55bec61161007c578063ef55bec614610cc1578063f2fde38b14610d2d578063f9f92be414610d60578063fe575a8714610d9357610336565b8063e3ee160e14610c14578063e5a6b10f14610c80578063e94a010214610c8857610336565b8063d608ea64116100d3578063d608ea6414610b61578063d916948714610bd1578063dd62ed3e14610bd957610336565b8063b2118a8d14610ab8578063bd10243014610afb578063d505accf14610b0357610336565b8063a0cc6a681161015b578063aa20e1e411610135578063aa20e1e414610a1f578063aa271e1a14610a52578063ad38bf2214610a8557610336565b8063a0cc6a68146109a5578063a457c2d7146109ad578063a9059cbb146109e657610336565b80638da5cb5b1161018c5780638da5cb5b1461098d57806395d89b41146109955780639fd0506d1461099d57610336565b80637f2eecc31461094a5780638456cb59146109525780638a6db9c31461095a57610336565b80633644e515116102815780634e44d9561161022a5780635a049a70116102045780635a049a701461088e5780635c975abb146108dc57806370a08231146108e45780637ecebe001461091757610336565b80634e44d9561461081a57806354fd4d5014610853578063554bab3c1461085b57610336565b80633f4ba83a1161025b5780633f4ba83a146107bc57806340c10f19146107c457806342966c68146107fd57610336565b80633644e5151461077357806338a631831461077b578063395093511461078357610336565b80632fc81e09116102e3578063313ce567116102bd578063313ce567146105385780633357162b1461055657806335d99f351461074257610336565b80632fc81e09146104ca5780633092afd5146104fd57806330adf81f1461053057610336565b80631a895266116103145780631a8952661461041f57806323b872dd146104545780632ab600451461049757610336565b806306fdde031461033b578063095ea7b3146103b857806318160ddd14610405575b600080fd5b610343610dc6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037d578181015183820152602001610365565b50505050905090810190601f1680156103aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f1600480360360408110156103ce57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610e72565b604080519115158252519081900360200190f35b61040d610fff565b60408051918252519081900360200190f35b6104526004803603602081101561043557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611005565b005b6103f16004803603606081101561046a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356110e9565b610452600480360360208110156104ad57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113ef565b610452600480360360208110156104e057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611550565b6103f16004803603602081101561051357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166115ce565b61040d6116c7565b6105406116eb565b6040805160ff9092168252519081900360200190f35b610452600480360361010081101561056d57600080fd5b81019060208101813564010000000081111561058857600080fd5b82018360208201111561059a57600080fd5b803590602001918460018302840111640100000000831117156105bc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561060f57600080fd5b82018360208201111561062157600080fd5b8035906020019184600183028401116401000000008311171561064357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561069657600080fd5b8201836020820111156106a857600080fd5b803590602001918460018302840111640100000000831117156106ca57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff16925050602081013573ffffffffffffffffffffffffffffffffffffffff908116916040810135821691606082013581169160800135166116f4565b61074a611a36565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61040d611a52565b61074a611a58565b6103f16004803603604081101561079957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611a74565b610452611bf6565b6103f1600480360360408110156107da57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611cb9565b6104526004803603602081101561081357600080fd5b50356120ee565b6103f16004803603604081101561083057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356123a8565b61034361253b565b6104526004803603602081101561087157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612572565b610452600480360360a08110156108a457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060208101359060ff60408201351690606081013590608001356126d9565b6103f1612777565b61040d600480360360208110156108fa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612798565b61040d6004803603602081101561092d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166127c0565b61040d6127e8565b61045261280c565b61040d6004803603602081101561097057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166128e6565b61074a61290e565b61034361292a565b61074a6129a3565b61040d6129bf565b6103f1600480360360408110156109c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356129e3565b6103f1600480360360408110156109fc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612b65565b61045260048036036020811015610a3557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612ce7565b6103f160048036036020811015610a6857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e4e565b61045260048036036020811015610a9b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e79565b61045260048036036060811015610ace57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135612fe0565b61074a613076565b610452600480360360e0811015610b1957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135613092565b61045260048036036020811015610b7757600080fd5b810190602081018135640100000000811115610b9257600080fd5b820183602082011115610ba457600080fd5b80359060200191846001830284011164010000000083111715610bc657600080fd5b509092509050613238565b61040d613321565b61040d60048036036040811015610bef57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516613345565b6104526004803603610120811015610c2b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e081013590610100013561337d565b610343613527565b6103f160048036036040811015610c9e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356135a0565b6104526004803603610120811015610cd857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e08101359061010001356135d8565b61045260048036036020811015610d4357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613775565b61045260048036036020811015610d7657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166138c8565b6103f160048036036020811015610da957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166139af565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b820191906000526020600020905b815481529060010190602001808311610e4d57829003601f168201915b505050505081565b60015460009074010000000000000000000000000000000000000000900460ff1615610eff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615610f68576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615610fe9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff43386866139da565b506001949350505050565b600b5490565b60025473ffffffffffffffffffffffffffffffffffffffff163314611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061506b602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b60015460009074010000000000000000000000000000000000000000900460ff161561117657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff16156111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859060ff1615611260576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859060ff16156112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a6020908152604080832033845290915290205485111561136a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806151316028913960400191505060405180910390fd5b611375878787613b21565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a602090815260408083203384529091529020546113b09086613d4c565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600a60209081526040808320338452909152902055600193505050509392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461147557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166114e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614fc9602a913960400191505060405180910390fd5b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b60125460ff1660011461156257600080fd5b30600090815260096020526040902054801561158357611583308383613b21565b505030600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116600117909155601280549091166002179055565b60085460009073ffffffffffffffffffffffffffffffffffffffff163314611641576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806150426029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600d909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a2506001919050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60065460ff1681565b60085474010000000000000000000000000000000000000000900460ff1615611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806151ac602a913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166117d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806150de602f913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316611840576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614fa06029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166118ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615159602e913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116611918576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806152bf6028913960400191505060405180910390fd5b875161192b9060049060208b0190614d50565b50865161193f9060059060208a0190614d50565b508551611953906007906020890190614d50565b50600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8716179055600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff87811691909117909255600180548216868416179055600280549091169184169190911790556119ed81613d95565b5050600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b600e5473ffffffffffffffffffffffffffffffffffffffff1690565b60015460009074010000000000000000000000000000000000000000900460ff1615611b0157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615611b6a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615611beb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff4338686613ddc565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061524d6022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60015460009074010000000000000000000000000000000000000000900460ff1615611d4657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff16611dae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806150bd6021913960400191505060405180910390fd5b3360008181526003602052604090205460ff1615611e17576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615611e98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516611f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614f0f6023913960400191505060405180910390fd5b60008411611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614ff36029913960400191505060405180910390fd5b336000908152600d602052604090205480851115611fc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061521f602e913960400191505060405180910390fd5b600b54611fd39086613e26565b600b5573ffffffffffffffffffffffffffffffffffffffff86166000908152600960205260409020546120069086613e26565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600960205260409020556120368186613d4c565b336000818152600d6020908152604091829020939093558051888152905173ffffffffffffffffffffffffffffffffffffffff8a16937fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8928290030190a360408051868152905173ffffffffffffffffffffffffffffffffffffffff8816916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600195945050505050565b60015474010000000000000000000000000000000000000000900460ff161561217857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff166121e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806150bd6021913960400191505060405180910390fd5b3360008181526003602052604090205460ff1615612249576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b33600090815260096020526040902054826122af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614ee66029913960400191505060405180910390fd5b82811015612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806150976026913960400191505060405180910390fd5b600b546123159084613d4c565b600b556123228184613d4c565b33600081815260096020908152604091829020939093558051868152905191927fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca592918290030190a260408051848152905160009133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b60015460009074010000000000000000000000000000000000000000900460ff161561243557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b60085473ffffffffffffffffffffffffffffffffffffffff1633146124a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806150426029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600d825291829020859055815185815291517f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d209281900390910190a250600192915050565b60408051808201909152600181527f3200000000000000000000000000000000000000000000000000000000000000602082015290565b60005473ffffffffffffffffffffffffffffffffffffffff1633146125f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612664576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614e936028913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b60015474010000000000000000000000000000000000000000900460ff161561276357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b6127708585858585613e9a565b5050505050565b60015474010000000000000000000000000000000000000000900460ff1681565b73ffffffffffffffffffffffffffffffffffffffff1660009081526009602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526011602052604090205490565b7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b60015473ffffffffffffffffffffffffffffffffffffffff16331461287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061524d6022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b73ffffffffffffffffffffffffffffffffffffffff166000908152600d602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6005805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b60015460009074010000000000000000000000000000000000000000900460ff1615612a7057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615612ad9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615612b5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff4338686614023565b60015460009074010000000000000000000000000000000000000000900460ff1615612bf257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615612c5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615612cdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff4338686613b21565b60005473ffffffffffffffffffffffffffffffffffffffff163314612d6d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612dd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806150de602f913960400191505060405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e690600090a250565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c602052604090205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314612eff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612f6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806153156032913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b600e5473ffffffffffffffffffffffffffffffffffffffff163314613050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061510d6024913960400191505060405180910390fd5b61307173ffffffffffffffffffffffffffffffffffffffff8416838361407f565b505050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60015474010000000000000000000000000000000000000000900460ff161561311c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8716600090815260036020526040902054879060ff161561319d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716600090815260036020526040902054879060ff161561321e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b61322d8989898989898961410c565b505050505050505050565b60085474010000000000000000000000000000000000000000900460ff168015613265575060125460ff16155b61326e57600080fd5b61327a60048383614dce565b506132ef82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600181527f3200000000000000000000000000000000000000000000000000000000000000602082015291506142b59050565b600f555050601280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600a6020908152604080832093909416825291909152205490565b60015474010000000000000000000000000000000000000000900460ff161561340757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613488576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613509576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b61351a8b8b8b8b8b8b8b8b8b614327565b5050505050505050505050565b6007805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152601060209081526040808320938352929052205460ff1690565b60015474010000000000000000000000000000000000000000900460ff161561366257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff16156136e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613764576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b61351a8b8b8b8b8b8b8b8b8b614469565b60005473ffffffffffffffffffffffffffffffffffffffff1633146137fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613867576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614f586026913960400191505060405180910390fd5b6000546040805173ffffffffffffffffffffffffffffffffffffffff9283168152918316602083015280517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09281900390910190a16138c581613d95565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314613938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061506b602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff8316613a46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806151fb6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614f7e6022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000818152600a6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316613b8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806151d66025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614e706023913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260096020526040902054811115613c77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061501c6026913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260096020526040902054613ca79082613d4c565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600960205260408082209390935590841681522054613ce39082613e26565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526009602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000613d8e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614576565b9392505050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600a60209081526040808320938616835292905220546130719084908490613e219085613e26565b6139da565b600082820183811015613d8e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b613ea48585614627565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429602082015273ffffffffffffffffffffffffffffffffffffffff87168183018190526060828101889052835180840390910181526080909201909252600f54909190613f1890868686866146b5565b73ffffffffffffffffffffffffffffffffffffffff1614613f9a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8616600081815260106020908152604080832089845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518792917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050505050565b6130718383613e21846040518060600160405280602581526020016153916025913973ffffffffffffffffffffffffffffffffffffffff808a166000908152600a60209081526040808320938c16835292905220549190614576565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052613071908490614727565b4284101561417b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a207065726d697420697320657870697265640000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff80881660008181526011602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c992810192909252818301849052938a1660608201526080810189905260a081019390935260c08084018890528151808503909101815260e09093019052600f5461421e90868686866146b5565b73ffffffffffffffffffffffffffffffffffffffff16146142a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f454950323631323a20696e76616c6964207369676e6174757265000000000000604482015290519081900360640190fd5b6142ab8888886139da565b5050505050505050565b8151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b614333898588886147ff565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f549091906143c690868686866146b5565b73ffffffffffffffffffffffffffffffffffffffff161461444857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6144528a866148bf565b61445d8a8a8a613b21565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff881633146144d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806151876025913960400191505060405180910390fd5b6144e3898588886147ff565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de8602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f549091906143c690868686866146b5565b6000818484111561461f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145e45781810151838201526020016145cc565b50505050905090810190601f1680156146115780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260106020908152604080832084845290915290205460ff16156146b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806152e7602e913960400191505060405180910390fd5b5050565b8051602080830191909120604080517f19010000000000000000000000000000000000000000000000000000000000008185015260228101899052604280820193909352815180820390930183526062019052805191012060009061471c81878787614944565b979650505050505050565b6060614789826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614b419092919063ffffffff16565b805190915015613071578080602001905160208110156147a857600080fd5b5051613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615295602a913960400191505060405180910390fd5b814211614857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614ebb602b913960400191505060405180910390fd5b8042106148af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061536c6025913960400191505060405180910390fd5b6148b98484614627565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260106020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156149bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061526f6026913960400191505060405180910390fd5b8360ff16601b141580156149d757508360ff16601c14155b15614a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614f326026913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614a89573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116614b3657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45435265636f7665723a20696e76616c6964207369676e617475726500000000604482015290519081900360640190fd5b90505b949350505050565b6060614b3984846000856060614b5685614d17565b614bc157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310614c2b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614bee565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614c8d576040519150601f19603f3d011682016040523d82523d6000602084013e614c92565b606091505b50915091508115614ca6579150614b399050565b805115614cb65780518082602001fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528651602484015286518793919283926044019190850190808383600083156145e45781810151838201526020016145cc565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590614b39575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614d9157805160ff1916838001178555614dbe565b82800160010185558215614dbe579182015b82811115614dbe578251825591602001919060010190614da3565b50614dca929150614e5a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614e2d578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555614dbe565b82800160010185558215614dbe579182015b82811115614dbe578235825591602001919060010190614e3f565b5b80821115614dca5760008155600101614e5b56fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573735061757361626c653a206e65772070617573657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e206973206e6f74207965742076616c696446696174546f6b656e3a206275726e20616d6f756e74206e6f742067726561746572207468616e203046696174546f6b656e3a206d696e7420746f20746865207a65726f206164647265737345435265636f7665723a20696e76616c6964207369676e6174757265202776272076616c75654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737346696174546f6b656e3a206e65772070617573657220697320746865207a65726f2061646472657373526573637561626c653a206e6577207265736375657220697320746865207a65726f206164647265737346696174546f6b656e3a206d696e7420616d6f756e74206e6f742067726561746572207468616e203045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d61737465724d696e746572426c61636b6c69737461626c653a2063616c6c6572206973206e6f742074686520626c61636b6c697374657246696174546f6b656e3a206275726e20616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e74657246696174546f6b656e3a206e6577206d61737465724d696e74657220697320746865207a65726f2061646472657373526573637561626c653a2063616c6c6572206973206e6f7420746865207265736375657245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636546696174546f6b656e3a206e657720626c61636b6c697374657220697320746865207a65726f206164647265737346696174546f6b656e56323a2063616c6c6572206d7573742062652074686520706179656546696174546f6b656e3a20636f6e747261637420697320616c726561647920696e697469616c697a656445524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737346696174546f6b656e3a206d696e7420616d6f756e742065786365656473206d696e746572416c6c6f77616e63655061757361626c653a2063616c6c6572206973206e6f74207468652070617573657245435265636f7665723a20696e76616c6964207369676e6174757265202773272076616c75655361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656446696174546f6b656e3a206e6577206f776e657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e2069732075736564206f722063616e63656c6564426c61636b6c69737461626c653a206e657720626c61636b6c697374657220697320746865207a65726f2061646472657373426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c697374656446696174546f6b656e56323a20617574686f72697a6174696f6e206973206578706972656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203ccc7055acd0820f4e7d094fa75ff2d3b0c27bdd446079aeef6bd6d02c56938e64736f6c634300060c0033", - "sourceMap": "1362:764:41:-:0;;;2106:26:35;;;-1:-1:-1;2106:26:35;;;-1:-1:-1;1940:33:33;;1362:764:41;;;;;;;;;-1:-1:-1;2223:20:34;2232:10;2223:8;:20::i;:::-;1362:764:41;;2493:79:34;2548:6;:17;;-1:-1:-1;2548:17:34;-1:-1:-1;2548:17:34;;;;;;;;;;2493:79::o;1362:764:41:-;;;;;;;", - "linkReferences": {} - }, - "deployedBytecode": { - "object": "0x608060405234801561001057600080fd5b50600436106103365760003560e01c80637f2eecc3116101b2578063b2118a8d116100f9578063e3ee160e116100a2578063ef55bec61161007c578063ef55bec614610cc1578063f2fde38b14610d2d578063f9f92be414610d60578063fe575a8714610d9357610336565b8063e3ee160e14610c14578063e5a6b10f14610c80578063e94a010214610c8857610336565b8063d608ea64116100d3578063d608ea6414610b61578063d916948714610bd1578063dd62ed3e14610bd957610336565b8063b2118a8d14610ab8578063bd10243014610afb578063d505accf14610b0357610336565b8063a0cc6a681161015b578063aa20e1e411610135578063aa20e1e414610a1f578063aa271e1a14610a52578063ad38bf2214610a8557610336565b8063a0cc6a68146109a5578063a457c2d7146109ad578063a9059cbb146109e657610336565b80638da5cb5b1161018c5780638da5cb5b1461098d57806395d89b41146109955780639fd0506d1461099d57610336565b80637f2eecc31461094a5780638456cb59146109525780638a6db9c31461095a57610336565b80633644e515116102815780634e44d9561161022a5780635a049a70116102045780635a049a701461088e5780635c975abb146108dc57806370a08231146108e45780637ecebe001461091757610336565b80634e44d9561461081a57806354fd4d5014610853578063554bab3c1461085b57610336565b80633f4ba83a1161025b5780633f4ba83a146107bc57806340c10f19146107c457806342966c68146107fd57610336565b80633644e5151461077357806338a631831461077b578063395093511461078357610336565b80632fc81e09116102e3578063313ce567116102bd578063313ce567146105385780633357162b1461055657806335d99f351461074257610336565b80632fc81e09146104ca5780633092afd5146104fd57806330adf81f1461053057610336565b80631a895266116103145780631a8952661461041f57806323b872dd146104545780632ab600451461049757610336565b806306fdde031461033b578063095ea7b3146103b857806318160ddd14610405575b600080fd5b610343610dc6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037d578181015183820152602001610365565b50505050905090810190601f1680156103aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f1600480360360408110156103ce57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610e72565b604080519115158252519081900360200190f35b61040d610fff565b60408051918252519081900360200190f35b6104526004803603602081101561043557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611005565b005b6103f16004803603606081101561046a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356110e9565b610452600480360360208110156104ad57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113ef565b610452600480360360208110156104e057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611550565b6103f16004803603602081101561051357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166115ce565b61040d6116c7565b6105406116eb565b6040805160ff9092168252519081900360200190f35b610452600480360361010081101561056d57600080fd5b81019060208101813564010000000081111561058857600080fd5b82018360208201111561059a57600080fd5b803590602001918460018302840111640100000000831117156105bc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561060f57600080fd5b82018360208201111561062157600080fd5b8035906020019184600183028401116401000000008311171561064357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561069657600080fd5b8201836020820111156106a857600080fd5b803590602001918460018302840111640100000000831117156106ca57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff16925050602081013573ffffffffffffffffffffffffffffffffffffffff908116916040810135821691606082013581169160800135166116f4565b61074a611a36565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61040d611a52565b61074a611a58565b6103f16004803603604081101561079957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611a74565b610452611bf6565b6103f1600480360360408110156107da57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611cb9565b6104526004803603602081101561081357600080fd5b50356120ee565b6103f16004803603604081101561083057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356123a8565b61034361253b565b6104526004803603602081101561087157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612572565b610452600480360360a08110156108a457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060208101359060ff60408201351690606081013590608001356126d9565b6103f1612777565b61040d600480360360208110156108fa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612798565b61040d6004803603602081101561092d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166127c0565b61040d6127e8565b61045261280c565b61040d6004803603602081101561097057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166128e6565b61074a61290e565b61034361292a565b61074a6129a3565b61040d6129bf565b6103f1600480360360408110156109c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356129e3565b6103f1600480360360408110156109fc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612b65565b61045260048036036020811015610a3557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612ce7565b6103f160048036036020811015610a6857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e4e565b61045260048036036020811015610a9b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e79565b61045260048036036060811015610ace57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135612fe0565b61074a613076565b610452600480360360e0811015610b1957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135613092565b61045260048036036020811015610b7757600080fd5b810190602081018135640100000000811115610b9257600080fd5b820183602082011115610ba457600080fd5b80359060200191846001830284011164010000000083111715610bc657600080fd5b509092509050613238565b61040d613321565b61040d60048036036040811015610bef57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516613345565b6104526004803603610120811015610c2b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e081013590610100013561337d565b610343613527565b6103f160048036036040811015610c9e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356135a0565b6104526004803603610120811015610cd857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e08101359061010001356135d8565b61045260048036036020811015610d4357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613775565b61045260048036036020811015610d7657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166138c8565b6103f160048036036020811015610da957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166139af565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b820191906000526020600020905b815481529060010190602001808311610e4d57829003601f168201915b505050505081565b60015460009074010000000000000000000000000000000000000000900460ff1615610eff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615610f68576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615610fe9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff43386866139da565b506001949350505050565b600b5490565b60025473ffffffffffffffffffffffffffffffffffffffff163314611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061506b602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b60015460009074010000000000000000000000000000000000000000900460ff161561117657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff16156111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859060ff1615611260576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859060ff16156112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a6020908152604080832033845290915290205485111561136a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806151316028913960400191505060405180910390fd5b611375878787613b21565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a602090815260408083203384529091529020546113b09086613d4c565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600a60209081526040808320338452909152902055600193505050509392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461147557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166114e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614fc9602a913960400191505060405180910390fd5b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b60125460ff1660011461156257600080fd5b30600090815260096020526040902054801561158357611583308383613b21565b505030600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116600117909155601280549091166002179055565b60085460009073ffffffffffffffffffffffffffffffffffffffff163314611641576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806150426029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600d909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a2506001919050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60065460ff1681565b60085474010000000000000000000000000000000000000000900460ff1615611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806151ac602a913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166117d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806150de602f913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316611840576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614fa06029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166118ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615159602e913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116611918576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806152bf6028913960400191505060405180910390fd5b875161192b9060049060208b0190614d50565b50865161193f9060059060208a0190614d50565b508551611953906007906020890190614d50565b50600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8716179055600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff87811691909117909255600180548216868416179055600280549091169184169190911790556119ed81613d95565b5050600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b600e5473ffffffffffffffffffffffffffffffffffffffff1690565b60015460009074010000000000000000000000000000000000000000900460ff1615611b0157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615611b6a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615611beb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff4338686613ddc565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061524d6022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60015460009074010000000000000000000000000000000000000000900460ff1615611d4657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff16611dae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806150bd6021913960400191505060405180910390fd5b3360008181526003602052604090205460ff1615611e17576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615611e98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516611f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614f0f6023913960400191505060405180910390fd5b60008411611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614ff36029913960400191505060405180910390fd5b336000908152600d602052604090205480851115611fc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061521f602e913960400191505060405180910390fd5b600b54611fd39086613e26565b600b5573ffffffffffffffffffffffffffffffffffffffff86166000908152600960205260409020546120069086613e26565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600960205260409020556120368186613d4c565b336000818152600d6020908152604091829020939093558051888152905173ffffffffffffffffffffffffffffffffffffffff8a16937fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8928290030190a360408051868152905173ffffffffffffffffffffffffffffffffffffffff8816916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600195945050505050565b60015474010000000000000000000000000000000000000000900460ff161561217857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff166121e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806150bd6021913960400191505060405180910390fd5b3360008181526003602052604090205460ff1615612249576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b33600090815260096020526040902054826122af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614ee66029913960400191505060405180910390fd5b82811015612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806150976026913960400191505060405180910390fd5b600b546123159084613d4c565b600b556123228184613d4c565b33600081815260096020908152604091829020939093558051868152905191927fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca592918290030190a260408051848152905160009133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b60015460009074010000000000000000000000000000000000000000900460ff161561243557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b60085473ffffffffffffffffffffffffffffffffffffffff1633146124a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806150426029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600d825291829020859055815185815291517f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d209281900390910190a250600192915050565b60408051808201909152600181527f3200000000000000000000000000000000000000000000000000000000000000602082015290565b60005473ffffffffffffffffffffffffffffffffffffffff1633146125f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612664576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614e936028913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b60015474010000000000000000000000000000000000000000900460ff161561276357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b6127708585858585613e9a565b5050505050565b60015474010000000000000000000000000000000000000000900460ff1681565b73ffffffffffffffffffffffffffffffffffffffff1660009081526009602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526011602052604090205490565b7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b60015473ffffffffffffffffffffffffffffffffffffffff16331461287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061524d6022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b73ffffffffffffffffffffffffffffffffffffffff166000908152600d602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6005805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b60015460009074010000000000000000000000000000000000000000900460ff1615612a7057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615612ad9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615612b5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff4338686614023565b60015460009074010000000000000000000000000000000000000000900460ff1615612bf257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615612c5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615612cdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff4338686613b21565b60005473ffffffffffffffffffffffffffffffffffffffff163314612d6d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612dd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806150de602f913960400191505060405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e690600090a250565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c602052604090205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314612eff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612f6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806153156032913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b600e5473ffffffffffffffffffffffffffffffffffffffff163314613050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061510d6024913960400191505060405180910390fd5b61307173ffffffffffffffffffffffffffffffffffffffff8416838361407f565b505050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60015474010000000000000000000000000000000000000000900460ff161561311c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8716600090815260036020526040902054879060ff161561319d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716600090815260036020526040902054879060ff161561321e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b61322d8989898989898961410c565b505050505050505050565b60085474010000000000000000000000000000000000000000900460ff168015613265575060125460ff16155b61326e57600080fd5b61327a60048383614dce565b506132ef82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600181527f3200000000000000000000000000000000000000000000000000000000000000602082015291506142b59050565b600f555050601280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600a6020908152604080832093909416825291909152205490565b60015474010000000000000000000000000000000000000000900460ff161561340757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613488576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613509576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b61351a8b8b8b8b8b8b8b8b8b614327565b5050505050505050505050565b6007805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152601060209081526040808320938352929052205460ff1690565b60015474010000000000000000000000000000000000000000900460ff161561366257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff16156136e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613764576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b61351a8b8b8b8b8b8b8b8b8b614469565b60005473ffffffffffffffffffffffffffffffffffffffff1633146137fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613867576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614f586026913960400191505060405180910390fd5b6000546040805173ffffffffffffffffffffffffffffffffffffffff9283168152918316602083015280517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09281900390910190a16138c581613d95565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314613938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061506b602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff8316613a46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806151fb6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614f7e6022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000818152600a6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316613b8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806151d66025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614e706023913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260096020526040902054811115613c77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061501c6026913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260096020526040902054613ca79082613d4c565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600960205260408082209390935590841681522054613ce39082613e26565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526009602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000613d8e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614576565b9392505050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600a60209081526040808320938616835292905220546130719084908490613e219085613e26565b6139da565b600082820183811015613d8e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b613ea48585614627565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429602082015273ffffffffffffffffffffffffffffffffffffffff87168183018190526060828101889052835180840390910181526080909201909252600f54909190613f1890868686866146b5565b73ffffffffffffffffffffffffffffffffffffffff1614613f9a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8616600081815260106020908152604080832089845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518792917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050505050565b6130718383613e21846040518060600160405280602581526020016153916025913973ffffffffffffffffffffffffffffffffffffffff808a166000908152600a60209081526040808320938c16835292905220549190614576565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052613071908490614727565b4284101561417b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a207065726d697420697320657870697265640000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff80881660008181526011602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c992810192909252818301849052938a1660608201526080810189905260a081019390935260c08084018890528151808503909101815260e09093019052600f5461421e90868686866146b5565b73ffffffffffffffffffffffffffffffffffffffff16146142a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f454950323631323a20696e76616c6964207369676e6174757265000000000000604482015290519081900360640190fd5b6142ab8888886139da565b5050505050505050565b8151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b614333898588886147ff565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f549091906143c690868686866146b5565b73ffffffffffffffffffffffffffffffffffffffff161461444857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6144528a866148bf565b61445d8a8a8a613b21565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff881633146144d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806151876025913960400191505060405180910390fd5b6144e3898588886147ff565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de8602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f549091906143c690868686866146b5565b6000818484111561461f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145e45781810151838201526020016145cc565b50505050905090810190601f1680156146115780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260106020908152604080832084845290915290205460ff16156146b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806152e7602e913960400191505060405180910390fd5b5050565b8051602080830191909120604080517f19010000000000000000000000000000000000000000000000000000000000008185015260228101899052604280820193909352815180820390930183526062019052805191012060009061471c81878787614944565b979650505050505050565b6060614789826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614b419092919063ffffffff16565b805190915015613071578080602001905160208110156147a857600080fd5b5051613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615295602a913960400191505060405180910390fd5b814211614857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614ebb602b913960400191505060405180910390fd5b8042106148af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061536c6025913960400191505060405180910390fd5b6148b98484614627565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260106020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156149bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061526f6026913960400191505060405180910390fd5b8360ff16601b141580156149d757508360ff16601c14155b15614a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614f326026913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614a89573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116614b3657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45435265636f7665723a20696e76616c6964207369676e617475726500000000604482015290519081900360640190fd5b90505b949350505050565b6060614b3984846000856060614b5685614d17565b614bc157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310614c2b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614bee565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614c8d576040519150601f19603f3d011682016040523d82523d6000602084013e614c92565b606091505b50915091508115614ca6579150614b399050565b805115614cb65780518082602001fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528651602484015286518793919283926044019190850190808383600083156145e45781810151838201526020016145cc565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590614b39575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614d9157805160ff1916838001178555614dbe565b82800160010185558215614dbe579182015b82811115614dbe578251825591602001919060010190614da3565b50614dca929150614e5a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614e2d578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555614dbe565b82800160010185558215614dbe579182015b82811115614dbe578235825591602001919060010190614e3f565b5b80821115614dca5760008155600101614e5b56fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573735061757361626c653a206e65772070617573657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e206973206e6f74207965742076616c696446696174546f6b656e3a206275726e20616d6f756e74206e6f742067726561746572207468616e203046696174546f6b656e3a206d696e7420746f20746865207a65726f206164647265737345435265636f7665723a20696e76616c6964207369676e6174757265202776272076616c75654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737346696174546f6b656e3a206e65772070617573657220697320746865207a65726f2061646472657373526573637561626c653a206e6577207265736375657220697320746865207a65726f206164647265737346696174546f6b656e3a206d696e7420616d6f756e74206e6f742067726561746572207468616e203045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d61737465724d696e746572426c61636b6c69737461626c653a2063616c6c6572206973206e6f742074686520626c61636b6c697374657246696174546f6b656e3a206275726e20616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e74657246696174546f6b656e3a206e6577206d61737465724d696e74657220697320746865207a65726f2061646472657373526573637561626c653a2063616c6c6572206973206e6f7420746865207265736375657245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636546696174546f6b656e3a206e657720626c61636b6c697374657220697320746865207a65726f206164647265737346696174546f6b656e56323a2063616c6c6572206d7573742062652074686520706179656546696174546f6b656e3a20636f6e747261637420697320616c726561647920696e697469616c697a656445524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737346696174546f6b656e3a206d696e7420616d6f756e742065786365656473206d696e746572416c6c6f77616e63655061757361626c653a2063616c6c6572206973206e6f74207468652070617573657245435265636f7665723a20696e76616c6964207369676e6174757265202773272076616c75655361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656446696174546f6b656e3a206e6577206f776e657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e2069732075736564206f722063616e63656c6564426c61636b6c69737461626c653a206e657720626c61636b6c697374657220697320746865207a65726f2061646472657373426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c697374656446696174546f6b656e56323a20617574686f72697a6174696f6e206973206578706972656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203ccc7055acd0820f4e7d094fa75ff2d3b0c27bdd446079aeef6bd6d02c56938e64736f6c634300060c0033", - "sourceMap": "1362:764:41:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1649:18:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6725:273;;;;;;;;;;;;;;;;-1:-1:-1;6725:273:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6132:100;;;:::i;:::-;;;;;;;;;;;;;;;;2772:148:32;;;;;;;;;;;;;;;;-1:-1:-1;2772:148:32;;;;:::i;:::-;;7776:536:33;;;;;;;;;;;;;;;;-1:-1:-1;7776:536:33;;;;;;;;;;;;;;;;;;:::i;2466:264:30:-;;;;;;;;;;;;;;;;-1:-1:-1;2466:264:30;;;;:::i;1528:398:41:-;;;;;;;;;;;;;;;;-1:-1:-1;1528:398:41;;;;:::i;10209:239:33:-;;;;;;;;;;;;;;;;-1:-1:-1;10209:239:33;;;;:::i;1612:116:37:-;;;:::i;1699:21:33:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2413:1160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2413:1160:33;;;;;;;;-1:-1:-1;2413:1160:33;;-1:-1:-1;;2413:1160:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2413:1160:33;;;;;;;;-1:-1:-1;2413:1160:33;;-1:-1:-1;;2413:1160:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2413:1160:33;;-1:-1:-1;;;2413:1160:33;;;;;-1:-1:-1;;2413:1160:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1754:27::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1291:31:39;;;:::i;1636:83:30:-;;;:::i;2269:284:40:-;;;;;;;;;;;;;;;;-1:-1:-1;2269:284:40;;;;;;;;;:::i;2802:94:35:-;;;:::i;4097:840:33:-;;;;;;;;;;;;;;;;-1:-1:-1;4097:840:33;;;;;;;;;:::i;10737:538::-;;;;;;;;;;;;;;;;-1:-1:-1;10737:538:33;;:::i;9703:334::-;;;;;;;;;;;;;;;;-1:-1:-1;9703:334:33;;;;;;;;;:::i;2040:84:41:-;;;:::i;2953:254:35:-;;;;;;;;;;;;;;;;-1:-1:-1;2953:254:35;;;;:::i;5782:229:40:-;;;;;;;;;;;;;;;;-1:-1:-1;5782:229:40;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2106:26:35:-;;;:::i;6340:154:33:-;;;;;;;;;;;;;;;;-1:-1:-1;6340:154:33;;;;:::i;1921:107:37:-;;;;;;;;;;;;;;;;-1:-1:-1;1921:107:37;;;;:::i;2068:136:38:-;;;:::i;2623:89:35:-;;;:::i;5318:118:33:-;;;;;;;;;;;;;;;;-1:-1:-1;5318:118:33;;;;:::i;2355:79:34:-;;;:::i;1673:20:33:-;;;:::i;2079:21:35:-;;;:::i;1787:137:38:-;;;:::i;2766:284:40:-;;;;;;;;;;;;;;;;-1:-1:-1;2766:284:40;;;;;;;;;:::i;8487:260:33:-;;;;;;;;;;;;;;;;-1:-1:-1;8487:260:33;;;;;;;;;:::i;11281:303::-;;;;;;;;;;;;;;;;-1:-1:-1;11281:303:33;;;;:::i;5543:104::-;;;;;;;;;;;;;;;;-1:-1:-1;5543:104:33;;;;:::i;2926:299:32:-;;;;;;;;;;;;;;;;-1:-1:-1;2926:299:32;;;;:::i;2161:177:30:-;;;;;;;;;;;;;;;;-1:-1:-1;2161:177:30;;;;;;;;;;;;;;;;;;:::i;1365:26:32:-;;;:::i;6439:309:40:-;;;;;;;;;;;;;;;;-1:-1:-1;6439:309:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1758:298::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1758:298:40;;-1:-1:-1;1758:298:40;-1:-1:-1;1758:298:40;:::i;2285:130:38:-;;;:::i;5898:175:33:-;;;;;;;;;;;;;;;;-1:-1:-1;5898:175:33;;;;;;;;;;;:::i;3621:523:40:-;;;;;;;;;;;;;;;;-1:-1:-1;3621:523:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1726:22:33:-;;;:::i;3088:183:38:-;;;;;;;;;;;;;;;;-1:-1:-1;3088:183:38;;;;;;;;;:::i;4883:521:40:-;;;;;;;;;;;;;;;;-1:-1:-1;4883:521:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2945:269:34:-;;;;;;;;;;;;;;;;-1:-1:-1;2945:269:34;;;;:::i;2500:143:32:-;;;;;;;;;;;;;;;;-1:-1:-1;2500:143:32;;;;:::i;2277:115::-;;;;;;;;;;;;;;;;-1:-1:-1;2277:115:32;;;;:::i;1649:18:33:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6725:273::-;2286:6:35;;6914:4:33;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6853:10:33::1;2064:21:32;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;6888:7:33;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6934:36:33::3;6943:10;6955:7;6964:5;6934:8;:36::i;:::-;-1:-1:-1::0;6987:4:33::3;::::0;6725:273;-1:-1:-1;;;;6725:273:33:o;6132:100::-;6213:12;;6132:100;:::o;2772:148:32:-;1771:11;;;;1757:10;:25;1736:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2846:21:::1;::::0;::::1;2870:5;2846:21:::0;;;:11:::1;:21;::::0;;;;;:29;;;::::1;::::0;;2890:23;::::1;::::0;2870:5;2890:23:::1;2772:148:::0;:::o;7776:536:33:-;2286:6:35;;8033:4:33;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7948:10:33::1;2064:21:32;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;7983:4:33;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::3;::::0;::::3;;::::0;;;:11:::3;:21;::::0;;;;;8012:2:33;;2064:21:32::3;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8083:13:33::4;::::0;::::4;;::::0;;;:7:::4;:13;::::0;;;;;;;8097:10:::4;8083:25:::0;;;;;;;;8074:34;::::4;;8053:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8184:26;8194:4;8200:2;8204:5;8184:9;:26::i;:::-;8248:13;::::0;::::4;;::::0;;;:7:::4;:13;::::0;;;;;;;8262:10:::4;8248:25:::0;;;;;;;;:36:::4;::::0;8278:5;8248:29:::4;:36::i;:::-;8220:13;::::0;::::4;;::::0;;;:7:::4;:13;::::0;;;;;;;8234:10:::4;8220:25:::0;;;;;;;:64;8301:4:::4;::::0;-1:-1:-1;2158:1:32::3;::::2;2323::35::1;7776:536:33::0;;;;;:::o;2466:264:30:-;2713:6:34;;;;2699:10;:20;2691:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2559:24:30::1;::::0;::::1;2538:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2661:8;:21:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;2697:26:::1;::::0;::::1;::::0;-1:-1:-1;;2697:26:30::1;2466:264:::0;:::o;1528:398:41:-;1652:19;;;;;:24;1644:33;;;;;;1728:4;1688:20;1711:23;;;:8;:23;;;;;;1748:16;;1744:99;;1780:52;1798:4;1805:12;1819;1780:9;:52::i;:::-;-1:-1:-1;;1872:4:41;1852:26;;;;:11;:26;;;;;:33;;;;;;1881:4;1852:33;;;;1896:19;:23;;;;;1918:1;1896:23;;;1528:398::o;10209:239:33:-;5104:12;;10306:4;;5104:12;;5090:10;:26;5069:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10326:15:::1;::::0;::::1;10344:5;10326:15:::0;;;:7:::1;:15;::::0;;;;;;;:23;;;::::1;::::0;;10359:13:::1;:21:::0;;;;;;:25;;;10399:21;::::1;::::0;10344:5;10399:21:::1;-1:-1:-1::0;10437:4:33::1;10209:239:::0;;;:::o;1612:116:37:-;1662:66;1612:116;:::o;1699:21:33:-;;;;;;:::o;2413:1160::-;2717:11;;;;;;;2716:12;2708:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2806:29;;;2785:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2939:23;;;2918:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3060:28;;;3039:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3191:22;;;3170:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3290:16;;;;:4;;:16;;;;;:::i;:::-;-1:-1:-1;3316:20:33;;;;:6;;:20;;;;;:::i;:::-;-1:-1:-1;3346:24:33;;;;:8;;:24;;;;;:::i;:::-;-1:-1:-1;3380:8:33;:24;;;;;;;;;;3414:12;:30;;;;;;;;;;;;;;;;;-1:-1:-1;3454:18:33;;;;;;;;;;3482:11;:28;;;;;;;;;;;;;;3520:18;3529:8;3520;:18::i;:::-;-1:-1:-1;;3548:11:33;:18;;;;;;;;-1:-1:-1;;;;;;2413:1160:33:o;1754:27::-;;;;;;:::o;1291:31:39:-;;;;:::o;1636:83:30:-;1704:8;;;;1636:83;:::o;2269:284:40:-;2286:6:35;;2455:4:40;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2394:10:40::1;2064:21:32;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;2429:7:40;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2475:50:40::3;2494:10;2506:7;2515:9;2475:18;:50::i;2802:94:35:-:0;2473:6;;;;2459:10;:20;2451:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2851:6:::1;:14:::0;;;::::1;::::0;;2880:9:::1;::::0;::::1;::::0;2860:5:::1;::::0;2880:9:::1;2802:94::o:0;4097:840:33:-;2286:6:35;;4280:4:33;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3708:10:33::1;3700:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;3692:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4223:10:::2;2064:21:32;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::3;::::0;::::3;;::::0;;;:11:::3;:21;::::0;;;;;4258:3:33;;2064:21:32::3;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4308:17:33::4;::::0;::::4;4300:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4393:1;4383:7;:11;4375:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4496:10;4451:28;4482:25:::0;;;:13:::4;:25;::::0;;;;;4538:31;;::::4;;4517:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4667:12;::::0;:25:::4;::::0;4684:7;4667:16:::4;:25::i;:::-;4652:12;:40:::0;4718:13:::4;::::0;::::4;;::::0;;;:8:::4;:13;::::0;;;;;:26:::4;::::0;4736:7;4718:17:::4;:26::i;:::-;4702:13;::::0;::::4;;::::0;;;:8:::4;:13;::::0;;;;:42;4782:33:::4;:20:::0;4807:7;4782:24:::4;:33::i;:::-;4768:10;4754:25;::::0;;;:13:::4;:25;::::0;;;;;;;;:61;;;;4830:30;;;;;;;4754:25:::4;4830:30:::0;::::4;::::0;::::4;::::0;;;;;;::::4;4875:34;::::0;;;;;;;::::4;::::0;::::4;::::0;4892:1:::4;::::0;4875:34:::4;::::0;;;;::::4;::::0;;::::4;-1:-1:-1::0;4926:4:33::4;::::0;4097:840;-1:-1:-1;;;;;4097:840:33:o;10737:538::-;2286:6:35;;;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3708:10:33::1;3700:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;3692:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10850:10:::2;2064:21:32;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10903:10:33::3;10876:15;10894:20:::0;;;:8:::3;:20;::::0;;;;;10932:11;10924:65:::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11018:7;11007;:18;;10999:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11094:12;::::0;:25:::3;::::0;11111:7;11094:16:::3;:25::i;:::-;11079:12;:40:::0;11152:20:::3;:7:::0;11164;11152:11:::3;:20::i;:::-;11138:10;11129:20;::::0;;;:8:::3;:20;::::0;;;;;;;;:43;;;;11187:25;;;;;;;11138:10;;11187:25:::3;::::0;;;;;;;::::3;11227:41;::::0;;;;;;;11256:1:::3;::::0;11236:10:::3;::::0;11227:41:::3;::::0;;;;::::3;::::0;;::::3;2158:1:32;3767::33::2;10737:538:::0;:::o;9703:334::-;2286:6:35;;9854:4:33;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5104:12:33::1;::::0;::::1;;5090:10;:26;5069:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9874:15:::2;::::0;::::2;;::::0;;;:7:::2;:15;::::0;;;;;;;:22;;;::::2;9892:4;9874:22;::::0;;9906:13:::2;:21:::0;;;;;;:43;;;9964:45;;;;;;;::::2;::::0;;;;;;;;::::2;-1:-1:-1::0;10026:4:33::2;9703:334:::0;;;;:::o;2040:84:41:-;2107:10;;;;;;;;;;;;;;;;;2040:84;:::o;2953:254:35:-;2713:6:34;;;;2699:10;:20;2691:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3045:24:35::1;::::0;::::1;3024:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3145:6;:19:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;;3179:21:::1;::::0;3193:6;::::1;::::0;3179:21:::1;::::0;-1:-1:-1;;3179:21:35::1;2953:254:::0;:::o;5782:229:40:-;2286:6:35;;;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5956:48:40::1;5977:10;5989:5;5996:1;5999;6002;5956:20;:48::i;:::-;5782:229:::0;;;;;:::o;2106:26:35:-;;;;;;;;;:::o;6340:154:33:-;6470:17;;6440:7;6470:17;;;:8;:17;;;;;;;6340:154::o;1921:107:37:-;2001:20;;1975:7;2001:20;;;:13;:20;;;;;;;1921:107::o;2068:136:38:-;2138:66;2068:136;:::o;2623:89:35:-;2473:6;;;;2459:10;:20;2451:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2679:4:::1;2670:13:::0;;;::::1;::::0;::::1;::::0;;2698:7:::1;::::0;::::1;::::0;2670:13;;2698:7:::1;2623:89::o:0;5318:118:33:-;5408:21;;5382:7;5408:21;;;:13;:21;;;;;;;5318:118::o;2355:79:34:-;2395:7;2421:6;;;2355:79;:::o;1673:20:33:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2079:21:35;;;;;;:::o;1787:137:38:-;1858:66;1787:137;:::o;2766:284:40:-;2286:6:35;;2952:4:40;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2891:10:40::1;2064:21:32;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;2926:7:40;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2972:50:40::3;2991:10;3003:7;3012:9;2972:18;:50::i;8487:260:33:-:0;2286:6:35;;8667:4:33;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8611:10:33::1;2064:21:32;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;8646:2:33;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8687:32:33::3;8697:10;8709:2;8713:5;8687:9;:32::i;11281:303::-:0;2713:6:34;;;;2699:10;:20;2691:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11385:30:33::1;::::0;::::1;11364:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11498:12;:31:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;;11544:33:::1;::::0;11564:12;::::1;::::0;11544:33:::1;::::0;-1:-1:-1;;11544:33:33::1;11281:303:::0;:::o;5543:104::-;5624:16;;5601:4;5624:16;;;:7;:16;;;;;;;;;5543:104::o;2926:299:32:-;2713:6:34;;;;2699:10;:20;2691:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3028:29:32::1;::::0;::::1;3007:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3143:11;:29:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;;3187:31:::1;::::0;3206:11;::::1;::::0;3187:31:::1;::::0;-1:-1:-1;;3187:31:32::1;2926:299:::0;:::o;2161:177:30:-;1867:8;;;;1853:10;:22;1845:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2293:38:::1;:26;::::0;::::1;2320:2:::0;2324:6;2293:26:::1;:38::i;:::-;2161:177:::0;;;:::o;1365:26:32:-;;;;;;:::o;6439:309:40:-;2286:6:35;;;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:32::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;6651:5:40;;2064:21:32::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;6673:7:40;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6692:49:40::3;6700:5;6707:7;6716:5;6723:8;6733:1;6736;6739;6692:7;:49::i;:::-;2158:1:32::2;2323::35::1;6439:309:40::0;;;;;;;:::o;1758:298::-;1883:11;;;;;;;:39;;;;-1:-1:-1;1898:19:40;;;;:24;1883:39;1875:48;;;;;;1933:14;:4;1940:7;;1933:14;:::i;:::-;;1976:40;2003:7;;1976:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1976:40:40;;;;;;;;;;;;;;;;;;-1:-1:-1;1976:26:40;;-1:-1:-1;1976:40:40:i;:::-;1957:16;:59;-1:-1:-1;;2026:19:40;:23;;;;2048:1;2026:23;;;1758:298::o;2285:130:38:-;2349:66;2285:130;:::o;5898:175:33:-;6043:14;;;;6013:7;6043:14;;;:7;:14;;;;;;;;:23;;;;;;;;;;;;;5898:175::o;3621:523:40:-;2286:6:35;;;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:32::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;3900:4:40;;2064:21:32::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;3921:2:40;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3935:202:40::3;3975:4;3993:2;4009:5;4028:10;4052:11;4077:5;4096:1;4111;4126;3935:26;:202::i;:::-;2158:1:32::2;2323::35::1;3621:523:40::0;;;;;;;;;:::o;1726:22:33:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3088:183:38;3225:32;;;;;3198:4;3225:32;;;:20;:32;;;;;;;;:39;;;;;;;;;;;3088:183::o;4883:521:40:-;2286:6:35;;;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:32::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;5161:4:40;;2064:21:32::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;5182:2:40;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5196:201:40::3;5235:4;5253:2;5269:5;5288:10;5312:11;5337:5;5356:1;5371;5386;5196:25;:201::i;2945:269:34:-:0;2713:6;;;;2699:10;:20;2691:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3040:22:::1;::::0;::::1;3019:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3162:6;::::0;3141:38:::1;::::0;;3162:6:::1;::::0;;::::1;3141:38:::0;;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;3189:18;3198:8;3189;:18::i;:::-;2945:269:::0;:::o;2500:143:32:-;1771:11;;;;1757:10;:25;1736:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2572:21:::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;:28;;;::::1;2596:4;2572:28;::::0;;2615:21;::::1;::::0;2572;2615::::1;2500:143:::0;:::o;2277:115::-;2364:21;;2341:4;2364:21;;;:11;:21;;;;;;;;;2277:115::o;7196:363:33:-;7327:19;;;7319:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7405:21;;;7397:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7475:14;;;;;;;;:7;:14;;;;;;;;:23;;;;;;;;;;;;;:31;;;7521;;;;;;;;;;;;;;;;;7196:363;;;:::o;8931:526::-;9057:18;;;9049:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9135:16;;;9127:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9231:14;;;;;;;:8;:14;;;;;;9222:23;;;9201:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9337:14;;;;;;;:8;:14;;;;;;:25;;9356:5;9337:18;:25::i;:::-;9320:14;;;;;;;;:8;:14;;;;;;:42;;;;9387:12;;;;;;;:23;;9404:5;9387:16;:23::i;:::-;9372:12;;;;;;;;:8;:12;;;;;;;;;:38;;;;9425:25;;;;;;;9372:12;;9425:25;;;;;;;;;;;;;8931:526;;;:::o;1321:134:42:-;1379:7;1405:43;1409:1;1412;1405:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1398:50;1321:134;-1:-1:-1;;;1321:134:42:o;2493:79:34:-;2548:6;:17;;;;;;;;;;;;;;;2493:79::o;6981:208:40:-;7143:14;;;;;;;;:7;:14;;;;;;;;:23;;;;;;;;;;7118:64;;7127:5;;7134:7;;7143:38;;7171:9;7143:27;:38::i;:::-;7118:8;:64::i;874:176:42:-;932:7;963:5;;;986:6;;;;978:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6532:611:38;6693:46;6721:10;6733:5;6693:27;:46::i;:::-;6770:106;;;2349:66;6770:106;;;;;;;;;;;;;6750:17;6770:106;;;;;;;;;;;;;;;;;;;;;;;6922:16;;6770:106;;;6907:47;;6940:1;6943;6946;6770:106;6907:14;:47::i;:::-;:61;;;6886:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7035:32;;;;;;;:20;:32;;;;;;;;:39;;;;;;;;;:46;;;;7077:4;7035:46;;;7096:40;7068:5;;7035:32;7096:40;;;6532:611;;;;;;:::o;7422:341:40:-;7559:197;7581:5;7600:7;7621:125;7666:9;7621:125;;;;;;;;;;;;;;;;;:14;;;;;;;;:7;:14;;;;;;;;:23;;;;;;;;;;;:125;:27;:125::i;696:175:44:-;805:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;828:23;805:58;;;778:86;;798:5;;778:19;:86::i;2459:637:37:-;2673:3;2661:8;:15;;2653:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2854:20;;;;2766:15;2854:20;;;:13;:20;;;;;;;;;:22;;;;;;;;2742:166;;1662:66;2742:166;;;;;;;;;;;;;;;;2722:17;2742:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2954:16;;2939:47;;2972:1;2975;2978;2742:166;2939:14;:47::i;:::-;:56;;;2918:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3058:31;3067:5;3074:7;3083:5;3058:8;:31::i;:::-;2459:637;;;;;;;;:::o;1501:686:28:-;2015:22;;;;;;;2059:25;;;;;;;;;1776:390;;;1927:66;1776:390;;;;;;;;;;;;;;;;;;1702:9;1776:390;;;;2143:4;1776:390;;;;;;;;;;;;;;;;;;;;;;;;1749:431;;;;;;1501:686::o;3842:780:38:-;4103:64;4130:4;4136:5;4143:10;4155:11;4103:26;:64::i;:::-;4198:191;;;1858:66;4198:191;;;;;;;;;;;;;;;;;4178:17;4198:191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4435:16;;4198:191;;;4420:47;;4453:1;4456;4459;4198:191;4420:14;:47::i;:::-;:55;;;4399:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4542:37;4567:4;4573:5;4542:24;:37::i;:::-;4589:26;4599:4;4605:2;4609:5;4589:9;:26::i;:::-;3842:780;;;;;;;;;;:::o;5361:854::-;5629:16;;;5635:10;5629:16;5621:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5697:64;5724:4;5730:5;5737:10;5749:11;5697:26;:64::i;:::-;5792:190;;;2138:66;5792:190;;;;;;;;;;;;;;;;;5772:17;5792:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6028:16;;5792:190;;;6013:47;;6046:1;6049;6052;5792:190;6013:14;:47::i;1746:187:42:-;1832:7;1867:12;1859:6;;;;1851:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1902:5:42;;;1746:187::o;7322:255:38:-;7459:32;;;;;;;:20;:32;;;;;;;;:39;;;;;;;;;;;7458:40;7437:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7322:255;;:::o;2572:434:28:-;2898:26;;;;;;;;;;2803:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2780:168;;;;;2744:7;;2965:34;2780:168;2991:1;2994;2997;2965:17;:34::i;:::-;2958:41;2572:434;-1:-1:-1;;;;;;;2572:434:28:o;2959:751:44:-;3378:23;3404:69;3432:4;3404:69;;;;;;;;;;;;;;;;;3412:5;3404:27;;;;:69;;;;;:::i;:::-;3487:17;;3378:95;;-1:-1:-1;3487:21:44;3483:221;;3627:10;3616:30;;;;;;;;;;;;;;;-1:-1:-1;3616:30:44;3608:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7903:419:38;8103:10;8097:3;:16;8076:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8206:11;8200:3;:17;8192:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8269:46;8297:10;8309:5;8269:27;:46::i;:::-;7903:419;;;;:::o;8493:203::-;8592:32;;;;;;;:20;:32;;;;;;;;:39;;;;;;;;;:46;;;;8634:4;8592:46;;;8653:36;8625:5;;8592:32;8653:36;;;8493:203;;:::o;1872:1556:27:-;1997:7;2932:66;2907:91;;2890:192;;;3023:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2890:192;3096:1;:7;;3101:2;3096:7;;:18;;;;;3107:1;:7;;3112:2;3107:7;;3096:18;3092:97;;;3130:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3092:97;3283:14;3300:26;3310:6;3318:1;3321;3324;3300:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3300:26:27;;;;;;-1:-1:-1;;3344:20:27;;;3336:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3415:6;-1:-1:-1;1872:1556:27;;;;;;;:::o;3770:194:45:-;3873:12;3904:53;3927:6;3935:4;3941:1;3944:12;5247;5279:18;5290:6;5279:10;:18::i;:::-;5271:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5402:12;5416:23;5443:6;:11;;5463:8;5474:4;5443:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5401:78;;;;5493:7;5489:580;;;5523:10;-1:-1:-1;5516:17:45;;-1:-1:-1;5516:17:45;5489:580;5634:17;;:21;5630:429;;5892:10;5886:17;5952:15;5939:10;5935:2;5931:19;5924:44;5841:145;6024:20;;;;;;;;;;;;;;;;;;;;6031:12;;6024:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;718:610;778:4;1239:20;;1084:66;1278:23;;;;;;:42;;-1:-1:-1;;1305:15:45;;;1270:51;-1:-1:-1;;718:610:45:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", - "linkReferences": {} - }, - "methodIdentifiers": { - "CANCEL_AUTHORIZATION_TYPEHASH()": "d9169487", - "DOMAIN_SEPARATOR()": "3644e515", - "PERMIT_TYPEHASH()": "30adf81f", - "RECEIVE_WITH_AUTHORIZATION_TYPEHASH()": "7f2eecc3", - "TRANSFER_WITH_AUTHORIZATION_TYPEHASH()": "a0cc6a68", - "allowance(address,address)": "dd62ed3e", - "approve(address,uint256)": "095ea7b3", - "authorizationState(address,bytes32)": "e94a0102", - "balanceOf(address)": "70a08231", - "blacklist(address)": "f9f92be4", - "blacklister()": "bd102430", - "burn(uint256)": "42966c68", - "cancelAuthorization(address,bytes32,uint8,bytes32,bytes32)": "5a049a70", - "configureMinter(address,uint256)": "4e44d956", - "currency()": "e5a6b10f", - "decimals()": "313ce567", - "decreaseAllowance(address,uint256)": "a457c2d7", - "increaseAllowance(address,uint256)": "39509351", - "initialize(string,string,string,uint8,address,address,address,address)": "3357162b", - "initializeV2(string)": "d608ea64", - "initializeV2_1(address)": "2fc81e09", - "isBlacklisted(address)": "fe575a87", - "isMinter(address)": "aa271e1a", - "masterMinter()": "35d99f35", - "mint(address,uint256)": "40c10f19", - "minterAllowance(address)": "8a6db9c3", - "name()": "06fdde03", - "nonces(address)": "7ecebe00", - "owner()": "8da5cb5b", - "pause()": "8456cb59", - "paused()": "5c975abb", - "pauser()": "9fd0506d", - "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "d505accf", - "receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)": "ef55bec6", - "removeMinter(address)": "3092afd5", - "rescueERC20(address,address,uint256)": "b2118a8d", - "rescuer()": "38a63183", - "symbol()": "95d89b41", - "totalSupply()": "18160ddd", - "transfer(address,uint256)": "a9059cbb", - "transferFrom(address,address,uint256)": "23b872dd", - "transferOwnership(address)": "f2fde38b", - "transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)": "e3ee160e", - "unBlacklist(address)": "1a895266", - "unpause()": "3f4ba83a", - "updateBlacklister(address)": "ad38bf22", - "updateMasterMinter(address)": "aa20e1e4", - "updatePauser(address)": "554bab3c", - "updateRescuer(address)": "2ab60045", - "version()": "54fd4d50" - }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"authorizer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"nonce\",\"type\":\"bytes32\"}],\"name\":\"AuthorizationCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"authorizer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"nonce\",\"type\":\"bytes32\"}],\"name\":\"AuthorizationUsed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"Blacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newBlacklister\",\"type\":\"address\"}],\"name\":\"BlacklisterChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newMasterMinter\",\"type\":\"address\"}],\"name\":\"MasterMinterChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minterAllowedAmount\",\"type\":\"uint256\"}],\"name\":\"MinterConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldMinter\",\"type\":\"address\"}],\"name\":\"MinterRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAddress\",\"type\":\"address\"}],\"name\":\"PauserChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRescuer\",\"type\":\"address\"}],\"name\":\"RescuerChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"UnBlacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CANCEL_AUTHORIZATION_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PERMIT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RECEIVE_WITH_AUTHORIZATION_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TRANSFER_WITH_AUTHORIZATION_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"authorizer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"nonce\",\"type\":\"bytes32\"}],\"name\":\"authorizationState\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"blacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blacklister\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"authorizer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"nonce\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"cancelAuthorization\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minterAllowedAmount\",\"type\":\"uint256\"}],\"name\":\"configureMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currency\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenCurrency\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"newMasterMinter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newPauser\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newBlacklister\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newName\",\"type\":\"string\"}],\"name\":\"initializeV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"lostAndFound\",\"type\":\"address\"}],\"name\":\"initializeV2_1\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isBlacklisted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterMinter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"minterAllowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pauser\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"validAfter\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"validBefore\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"nonce\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"receiveWithAuthorization\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"removeMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"rescueERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rescuer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"validAfter\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"validBefore\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"nonce\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"transferWithAuthorization\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"unBlacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newBlacklister\",\"type\":\"address\"}],\"name\":\"updateBlacklister\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newMasterMinter\",\"type\":\"address\"}],\"name\":\"updateMasterMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newPauser\",\"type\":\"address\"}],\"name\":\"updatePauser\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRescuer\",\"type\":\"address\"}],\"name\":\"updateRescuer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"owner\":\"Token owner's address\",\"spender\":\"Spender's address\"},\"returns\":{\"_0\":\"Allowance amount\"}},\"approve(address,uint256)\":{\"params\":{\"spender\":\"Spender's address\",\"value\":\"Allowance amount\"},\"returns\":{\"_0\":\"True if successful\"}},\"authorizationState(address,bytes32)\":{\"details\":\"Nonces are randomly generated 32-byte data unique to the authorizer's address\",\"params\":{\"authorizer\":\"Authorizer's address\",\"nonce\":\"Nonce of the authorization\"},\"returns\":{\"_0\":\"True if the nonce is used\"}},\"balanceOf(address)\":{\"details\":\"Get token balance of an account\",\"params\":{\"account\":\"address The account\"}},\"blacklist(address)\":{\"details\":\"Adds account to blacklist\",\"params\":{\"_account\":\"The address to blacklist\"}},\"burn(uint256)\":{\"details\":\"allows a minter to burn some of its own tokens Validates that caller is a minter and that sender is not blacklisted amount is less than or equal to the minter's account balance\",\"params\":{\"_amount\":\"uint256 the amount of tokens to be burned\"}},\"cancelAuthorization(address,bytes32,uint8,bytes32,bytes32)\":{\"details\":\"Works only if the authorization is not yet used.\",\"params\":{\"authorizer\":\"Authorizer's address\",\"nonce\":\"Nonce of the authorization\",\"r\":\"r of the signature\",\"s\":\"s of the signature\",\"v\":\"v of the signature\"}},\"configureMinter(address,uint256)\":{\"details\":\"Function to add/update a new minter\",\"params\":{\"minter\":\"The address of the minter\",\"minterAllowedAmount\":\"The minting amount allowed for the minter\"},\"returns\":{\"_0\":\"True if the operation was successful.\"}},\"decreaseAllowance(address,uint256)\":{\"params\":{\"decrement\":\"Amount of decrease in allowance\",\"spender\":\"Spender's address\"},\"returns\":{\"_0\":\"True if successful\"}},\"increaseAllowance(address,uint256)\":{\"params\":{\"increment\":\"Amount of increase in allowance\",\"spender\":\"Spender's address\"},\"returns\":{\"_0\":\"True if successful\"}},\"initializeV2(string)\":{\"params\":{\"newName\":\"New token name\"}},\"initializeV2_1(address)\":{\"params\":{\"lostAndFound\":\"The address to which the locked funds are sent\"}},\"isBlacklisted(address)\":{\"details\":\"Checks if account is blacklisted\",\"params\":{\"_account\":\"The address to check\"}},\"isMinter(address)\":{\"details\":\"Checks if account is a minter\",\"params\":{\"account\":\"The address to check\"}},\"mint(address,uint256)\":{\"details\":\"Function to mint tokens\",\"params\":{\"_amount\":\"The amount of tokens to mint. Must be less than or equal to the minterAllowance of the caller.\",\"_to\":\"The address that will receive the minted tokens.\"},\"returns\":{\"_0\":\"A boolean that indicates if the operation was successful.\"}},\"minterAllowance(address)\":{\"details\":\"Get minter allowance for an account\",\"params\":{\"minter\":\"The address of the minter\"}},\"nonces(address)\":{\"params\":{\"owner\":\"Token owner's address (Authorizer)\"},\"returns\":{\"_0\":\"Next nonce\"}},\"owner()\":{\"details\":\"Tells the address of the owner\",\"returns\":{\"_0\":\"the address of the owner\"}},\"pause()\":{\"details\":\"called by the owner to pause, triggers stopped state\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"params\":{\"deadline\":\"Expiration time, seconds since the epoch\",\"owner\":\"Token owner's address (Authorizer)\",\"r\":\"r of the signature\",\"s\":\"s of the signature\",\"spender\":\"Spender's address\",\"v\":\"v of the signature\",\"value\":\"Amount of allowance\"}},\"receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)\":{\"details\":\"This has an additional check to ensure that the payee's address matches the caller of this function to prevent front-running attacks.\",\"params\":{\"from\":\"Payer's address (Authorizer)\",\"nonce\":\"Unique nonce\",\"r\":\"r of the signature\",\"s\":\"s of the signature\",\"to\":\"Payee's address\",\"v\":\"v of the signature\",\"validAfter\":\"The time after which this is valid (unix time)\",\"validBefore\":\"The time before which this is valid (unix time)\",\"value\":\"Amount to be transferred\"}},\"removeMinter(address)\":{\"details\":\"Function to remove a minter\",\"params\":{\"minter\":\"The address of the minter to remove\"},\"returns\":{\"_0\":\"True if the operation was successful.\"}},\"rescueERC20(address,address,uint256)\":{\"params\":{\"amount\":\"Amount to withdraw\",\"to\":\"Recipient address\",\"tokenContract\":\"ERC20 token contract address\"}},\"rescuer()\":{\"returns\":{\"_0\":\"Rescuer's address\"}},\"totalSupply()\":{\"details\":\"Get totalSupply of token\"},\"transfer(address,uint256)\":{\"params\":{\"to\":\"Payee's address\",\"value\":\"Transfer amount\"},\"returns\":{\"_0\":\"True if successful\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"from\":\"Payer's address\",\"to\":\"Payee's address\",\"value\":\"Transfer amount\"},\"returns\":{\"_0\":\"True if successful\"}},\"transferOwnership(address)\":{\"details\":\"Allows the current owner to transfer control of the contract to a newOwner.\",\"params\":{\"newOwner\":\"The address to transfer ownership to.\"}},\"transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)\":{\"params\":{\"from\":\"Payer's address (Authorizer)\",\"nonce\":\"Unique nonce\",\"r\":\"r of the signature\",\"s\":\"s of the signature\",\"to\":\"Payee's address\",\"v\":\"v of the signature\",\"validAfter\":\"The time after which this is valid (unix time)\",\"validBefore\":\"The time before which this is valid (unix time)\",\"value\":\"Amount to be transferred\"}},\"unBlacklist(address)\":{\"details\":\"Removes account from blacklist\",\"params\":{\"_account\":\"The address to remove from the blacklist\"}},\"unpause()\":{\"details\":\"called by the owner to unpause, returns to normal state\"},\"updatePauser(address)\":{\"details\":\"update the pauser role\"},\"updateRescuer(address)\":{\"params\":{\"newRescuer\":\"New rescuer's address\"}},\"version()\":{\"returns\":{\"_0\":\"Version string\"}}},\"title\":\"FiatToken V2.1\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowance(address,address)\":{\"notice\":\"Amount of remaining tokens spender is allowed to transfer on behalf of the token owner\"},\"approve(address,uint256)\":{\"notice\":\"Set spender's allowance over the caller's tokens to be a given value.\"},\"authorizationState(address,bytes32)\":{\"notice\":\"Returns the state of an authorization\"},\"cancelAuthorization(address,bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Attempt to cancel an authorization\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decrease the allowance by a given decrement\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increase the allowance by a given increment\"},\"initializeV2(string)\":{\"notice\":\"Initialize v2\"},\"initializeV2_1(address)\":{\"notice\":\"Initialize v2.1\"},\"nonces(address)\":{\"notice\":\"Nonces for permit\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Update allowance with a signed permit\"},\"receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Receive a transfer with a signed authorization from the payer\"},\"rescueERC20(address,address,uint256)\":{\"notice\":\"Rescue ERC20 tokens locked up in this contract.\"},\"rescuer()\":{\"notice\":\"Returns current rescuer\"},\"transfer(address,uint256)\":{\"notice\":\"Transfer tokens from the caller\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfer tokens by spending allowance\"},\"transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Execute a transfer with a signed authorization\"},\"updateRescuer(address)\":{\"notice\":\"Assign the rescuer role to a given address.\"},\"version()\":{\"notice\":\"Version string for the EIP712 domain separator\"}},\"notice\":\"ERC20 Token backed by fiat reserves, version 2.1\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2_1.sol\":\"FiatTokenV2_1\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000000},\"remappings\":[\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"src/FiatTokenV2_1/centre-tokens/contracts/util/ECRecover.sol\":{\"keccak256\":\"0xb4e623304daaf25e40292e60a814ae60a60745d10003f1881a36be763dbc09aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6ef83bd777bfb13b0968b9cadd971216a95150427fa5d6b50f984e4b7268d31\",\"dweb:/ipfs/QmZS5TeT6n7tM36PBdYZNJW3wgYgAZE9zMcouNs4FuEDKj\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/util/EIP712.sol\":{\"keccak256\":\"0x39319612a776e16f355d5ab71575b68c427a058839544f032733df228b5debd1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d5ac6450e881a4275f4b5baf7b5d6e15c0a0c7c2039edf39f106e0b821c9829d\",\"dweb:/ipfs/QmShHneDasAXQzjA8iKWXk3sbZgxbQGPiMQ1MUpJGF64N8\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1.1/FiatTokenV1_1.sol\":{\"keccak256\":\"0xa5f8fc4b5e739ddcafe52dd76ebb7605e09eb9d52a5c1d77e48dd88e83106308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://24543f05d3eb4768ee9798768cb6c9ce8b88d30606a5def83118ad1ba9382ac8\",\"dweb:/ipfs/QmYREtrAvoxn6DKXehJPP1pbs8vciqMvRHVk2eFKLtmKVT\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1.1/Rescuable.sol\":{\"keccak256\":\"0x8c02b979e06aa4133c93e47c743ebebd56d120dd10aeaf56b2da2a36f06b68b1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9d73d6f98bd494500a414ca616eabe9ad6e99f283e00a471bddd7f8ac5825334\",\"dweb:/ipfs/QmXesAuMcXJiG3r2og7adeT5wBcY6ntFncVUFjNPfEhJC9\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1/AbstractFiatTokenV1.sol\":{\"keccak256\":\"0xb81ae053cff8eced79f29c3542b7693763ed2bfdd9a25d6b150439d21b3fa57d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e16ce40aef6188334cd0dbc2e3aead22c1f89101d782df821821061d5efa891b\",\"dweb:/ipfs/QmW2WnaMTzpUityk5Mpv7FFdKCh2CeueJaDneoABGVowVm\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1/Blacklistable.sol\":{\"keccak256\":\"0xc4ff3bfe34c8ecf9f2c333f8373c111fdd4640ed15677c4891bb9cf3cbff9554\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://91cfc583d47eda58f356783698a130c1c6adf797c4ba55461598c0bac8159f33\",\"dweb:/ipfs/QmeWfmhcwUE7H5Ge8TVhWkJ4kDwDY8a4kExMaufukLqsh1\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1/FiatTokenV1.sol\":{\"keccak256\":\"0xaed130ecb4b0714a887dccaaff61321915f2afbf0839ee8af10673507a010471\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3961d2ed8f4f2c69cc4ce0fdb2346b8bd5c09d644627704181fa03b82231ff31\",\"dweb:/ipfs/Qmb7sdix44isYUaD4TD4QsVmR8d86NN4koiFE6SsjRagGQ\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1/Ownable.sol\":{\"keccak256\":\"0x654e645d6d09616fde908eba4d29abf318fede7e8cc3e31705203fc1d2599217\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fce1ff1458e817aaa5f87d3ef4207fbbdeb25e548d460f47d9cca4fb80175390\",\"dweb:/ipfs/QmfY7E5xfTyeiuU2nDXEdYfy5LKjGRh69fuKK4HV6YTv9v\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1/Pausable.sol\":{\"keccak256\":\"0x873ce4f17eb8694cd0420ef6682c2da54290fe6e243f21ead37e90f211ac91b6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7df712210c8bb5fc08e0ff7b684ee4035530cd67b21f20d81766a17407606a3c\",\"dweb:/ipfs/QmYPFYAw4W8VdcBdknLhqfNfiUuGhGJD3ZZ7rAjrKjhtXd\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v2/AbstractFiatTokenV2.sol\":{\"keccak256\":\"0x5d393663d48e4bbb730630c117c2b703dd3c9968833e66dbbb18c92eab207afe\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b0ce642b7ab095d970e3e5d031e5de6b2a98a7ddd20fd94123a42ed81e21757e\",\"dweb:/ipfs/QmbPixwbbpHS7zBRcJV1idzhaSd1SPRm3LjpywxFnXxR8A\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v2/EIP2612.sol\":{\"keccak256\":\"0x8ed169be2f6423b8e7002241857d719e9eb9545f5dbad5209a8f6445132bdbe0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0646f70d57d072c0569ccbd9b02c922bbb183e6052f94c241c4fef9a267e73bc\",\"dweb:/ipfs/QmZK3D3qqTMenkdc5EpZSiyxETMpTVpRke61uuRH75ctVk\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v2/EIP3009.sol\":{\"keccak256\":\"0x74a81d5b1682cb6716f60c27254e8a15463797e1772b37c884390eb9c7985070\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1d3a6e220c2b8aab8c5070312cc9320ce2b79955b0bddafd99e5feec13851016\",\"dweb:/ipfs/QmQwc2nZtMKyDcGT8Scnv1R4ThP2Va9trUHnRiqMz4G2WN\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v2/EIP712Domain.sol\":{\"keccak256\":\"0x56d8c0259e7f0baa5bb0d0d94810f25d001fb2dbe4eaf54dbe369ba0f1b8fd2b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9356cfa1d42bfb8c4f84a3db535ab75b2088975bfbda30834d79c3eb678047ea\",\"dweb:/ipfs/QmSBeiLwNGEC4vnr82EWQinGZFZemxKwxvwLZ9bu48FWF2\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2.sol\":{\"keccak256\":\"0x59654e02023dd9d712bb160545854eae6cba80d707a547f6abfaadcd830af2e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e22c43b71ea393e9910bd91a355f711803d6971be25e9dabc702aaefac2a597f\",\"dweb:/ipfs/QmRjopnHgyKh1mXBDETBaXaom3NJSaacGEJweB5b28BdSE\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2_1.sol\":{\"keccak256\":\"0x6328091a86a3ab02471fba7ff3bf44200f6daf9f0ff3b61fe4043ee14cc1a4f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4fed880853c249f6f812ddfa37bf99633b688f0bfd734e03372e4523f6cd2af9\",\"dweb:/ipfs/QmUMD1SvykvTJ8jmAjnsW13Yo3Wt6KH5dfKRPKCRogLki8\"]},\"src/FiatTokenV2_1/openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x9a9cf02622cd7a64261b10534fc3260449da25c98c9e96d1b4ae8110a20e5806\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2df142592d1dc267d9549049ee3317fa190d2f87eaa565f86ab05ec83f7ab8f5\",\"dweb:/ipfs/QmSkJtcfWo7c42KnL5hho6GFxK6HRNV91XABx1P7xDtfLV\"]},\"src/FiatTokenV2_1/openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x5c26b39d26f7ed489e555d955dcd3e01872972e71fdd1528e93ec164e4f23385\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://efdc632af6960cf865dbc113665ea1f5b90eab75cc40ec062b2f6ae6da582017\",\"dweb:/ipfs/QmfAZFDuG62vxmAN9DnXApv7e7PMzPqi4RkqqZHLMSQiY5\"]},\"src/FiatTokenV2_1/openzeppelin/contracts/token/ERC20/SafeERC20.sol\":{\"keccak256\":\"0xf3b30f8a49631420635a8c35daacfcaa338012755f18a76fdd118730256f9a27\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0d7de652204c2ee291a61aa984103dfc7ae4392d651fbbc44a0079caee7c69a3\",\"dweb:/ipfs/Qmcw1cQnq9eWDnrCBwU3TNyqLfTMUFg5YKpYUkELoMPuUE\"]},\"src/FiatTokenV2_1/openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xdfb4f812600ba4ce6738c35584ceb8c9433472583051b48ba5b1f66cb758a498\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df02dffe1c1de089d9b4f6192f0dcf464526f2230f420b3deec4645e0cdd2bff\",\"dweb:/ipfs/QmcqXGAU3KJqwrgUVoGJ2W8osomhSJ4R5kdsRpbuW3fELS\"]}},\"version\":1}", - "metadata": { - "compiler": { - "version": "0.6.12+commit.27d51765" - }, - "language": "Solidity", - "output": { - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address", - "indexed": true - }, - { - "internalType": "address", - "name": "spender", - "type": "address", - "indexed": true - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256", - "indexed": false - } - ], - "type": "event", - "name": "Approval", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address", - "indexed": true - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32", - "indexed": true - } - ], - "type": "event", - "name": "AuthorizationCanceled", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address", - "indexed": true - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32", - "indexed": true - } - ], - "type": "event", - "name": "AuthorizationUsed", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "Blacklisted", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newBlacklister", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "BlacklisterChanged", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "burner", - "type": "address", - "indexed": true - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256", - "indexed": false - } - ], - "type": "event", - "name": "Burn", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newMasterMinter", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "MasterMinterChanged", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address", - "indexed": true - }, - { - "internalType": "address", - "name": "to", - "type": "address", - "indexed": true - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256", - "indexed": false - } - ], - "type": "event", - "name": "Mint", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address", - "indexed": true - }, - { - "internalType": "uint256", - "name": "minterAllowedAmount", - "type": "uint256", - "indexed": false - } - ], - "type": "event", - "name": "MinterConfigured", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "oldMinter", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "MinterRemoved", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "previousOwner", - "type": "address", - "indexed": false - }, - { - "internalType": "address", - "name": "newOwner", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "OwnershipTransferred", - "anonymous": false - }, - { - "inputs": [], - "type": "event", - "name": "Pause", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newAddress", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "PauserChanged", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newRescuer", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "RescuerChanged", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address", - "indexed": true - }, - { - "internalType": "address", - "name": "to", - "type": "address", - "indexed": true - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256", - "indexed": false - } - ], - "type": "event", - "name": "Transfer", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "UnBlacklisted", - "anonymous": false - }, - { - "inputs": [], - "type": "event", - "name": "Unpause", - "anonymous": false - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "CANCEL_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "DOMAIN_SEPARATOR", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "PERMIT_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "RECEIVE_WITH_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "TRANSFER_WITH_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function", - "name": "authorizationState", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "blacklist" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "blacklister", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "burn" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "cancelAuthorization" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "internalType": "uint256", - "name": "minterAllowedAmount", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "configureMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "currency", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "decrement", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "increment", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "string", - "name": "tokenName", - "type": "string" - }, - { - "internalType": "string", - "name": "tokenSymbol", - "type": "string" - }, - { - "internalType": "string", - "name": "tokenCurrency", - "type": "string" - }, - { - "internalType": "uint8", - "name": "tokenDecimals", - "type": "uint8" - }, - { - "internalType": "address", - "name": "newMasterMinter", - "type": "address" - }, - { - "internalType": "address", - "name": "newPauser", - "type": "address" - }, - { - "internalType": "address", - "name": "newBlacklister", - "type": "address" - }, - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "initialize" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "newName", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "initializeV2" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "lostAndFound", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "initializeV2_1" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "isBlacklisted", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "isMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "masterMinter", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "mint", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "minterAllowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "function", - "name": "pause" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "pauser", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "permit" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validAfter", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validBefore", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "receiveWithAuthorization" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "removeMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "contract IERC20", - "name": "tokenContract", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "rescueERC20" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "rescuer", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "transferOwnership" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validAfter", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validBefore", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "transferWithAuthorization" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "unBlacklist" - }, - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "function", - "name": "unpause" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newBlacklister", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "updateBlacklister" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newMasterMinter", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "updateMasterMinter" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newPauser", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "updatePauser" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newRescuer", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "updateRescuer" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "version", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ] - } - ], - "devdoc": { - "kind": "dev", - "methods": { - "allowance(address,address)": { - "params": { - "owner": "Token owner's address", - "spender": "Spender's address" - }, - "returns": { - "_0": "Allowance amount" - } - }, - "approve(address,uint256)": { - "params": { - "spender": "Spender's address", - "value": "Allowance amount" - }, - "returns": { - "_0": "True if successful" - } - }, - "authorizationState(address,bytes32)": { - "details": "Nonces are randomly generated 32-byte data unique to the authorizer's address", - "params": { - "authorizer": "Authorizer's address", - "nonce": "Nonce of the authorization" - }, - "returns": { - "_0": "True if the nonce is used" - } - }, - "balanceOf(address)": { - "details": "Get token balance of an account", - "params": { - "account": "address The account" - } - }, - "blacklist(address)": { - "details": "Adds account to blacklist", - "params": { - "_account": "The address to blacklist" - } - }, - "burn(uint256)": { - "details": "allows a minter to burn some of its own tokens Validates that caller is a minter and that sender is not blacklisted amount is less than or equal to the minter's account balance", - "params": { - "_amount": "uint256 the amount of tokens to be burned" - } - }, - "cancelAuthorization(address,bytes32,uint8,bytes32,bytes32)": { - "details": "Works only if the authorization is not yet used.", - "params": { - "authorizer": "Authorizer's address", - "nonce": "Nonce of the authorization", - "r": "r of the signature", - "s": "s of the signature", - "v": "v of the signature" - } - }, - "configureMinter(address,uint256)": { - "details": "Function to add/update a new minter", - "params": { - "minter": "The address of the minter", - "minterAllowedAmount": "The minting amount allowed for the minter" - }, - "returns": { - "_0": "True if the operation was successful." - } - }, - "decreaseAllowance(address,uint256)": { - "params": { - "decrement": "Amount of decrease in allowance", - "spender": "Spender's address" - }, - "returns": { - "_0": "True if successful" - } - }, - "increaseAllowance(address,uint256)": { - "params": { - "increment": "Amount of increase in allowance", - "spender": "Spender's address" - }, - "returns": { - "_0": "True if successful" - } - }, - "initializeV2(string)": { - "params": { - "newName": "New token name" - } - }, - "initializeV2_1(address)": { - "params": { - "lostAndFound": "The address to which the locked funds are sent" - } - }, - "isBlacklisted(address)": { - "details": "Checks if account is blacklisted", - "params": { - "_account": "The address to check" - } - }, - "isMinter(address)": { - "details": "Checks if account is a minter", - "params": { - "account": "The address to check" - } - }, - "mint(address,uint256)": { - "details": "Function to mint tokens", - "params": { - "_amount": "The amount of tokens to mint. Must be less than or equal to the minterAllowance of the caller.", - "_to": "The address that will receive the minted tokens." - }, - "returns": { - "_0": "A boolean that indicates if the operation was successful." - } - }, - "minterAllowance(address)": { - "details": "Get minter allowance for an account", - "params": { - "minter": "The address of the minter" - } - }, - "nonces(address)": { - "params": { - "owner": "Token owner's address (Authorizer)" - }, - "returns": { - "_0": "Next nonce" - } - }, - "owner()": { - "details": "Tells the address of the owner", - "returns": { - "_0": "the address of the owner" - } - }, - "pause()": { - "details": "called by the owner to pause, triggers stopped state" - }, - "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { - "params": { - "deadline": "Expiration time, seconds since the epoch", - "owner": "Token owner's address (Authorizer)", - "r": "r of the signature", - "s": "s of the signature", - "spender": "Spender's address", - "v": "v of the signature", - "value": "Amount of allowance" - } - }, - "receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)": { - "details": "This has an additional check to ensure that the payee's address matches the caller of this function to prevent front-running attacks.", - "params": { - "from": "Payer's address (Authorizer)", - "nonce": "Unique nonce", - "r": "r of the signature", - "s": "s of the signature", - "to": "Payee's address", - "v": "v of the signature", - "validAfter": "The time after which this is valid (unix time)", - "validBefore": "The time before which this is valid (unix time)", - "value": "Amount to be transferred" - } - }, - "removeMinter(address)": { - "details": "Function to remove a minter", - "params": { - "minter": "The address of the minter to remove" - }, - "returns": { - "_0": "True if the operation was successful." - } - }, - "rescueERC20(address,address,uint256)": { - "params": { - "amount": "Amount to withdraw", - "to": "Recipient address", - "tokenContract": "ERC20 token contract address" - } - }, - "rescuer()": { - "returns": { - "_0": "Rescuer's address" - } - }, - "totalSupply()": { - "details": "Get totalSupply of token" - }, - "transfer(address,uint256)": { - "params": { - "to": "Payee's address", - "value": "Transfer amount" - }, - "returns": { - "_0": "True if successful" - } - }, - "transferFrom(address,address,uint256)": { - "params": { - "from": "Payer's address", - "to": "Payee's address", - "value": "Transfer amount" - }, - "returns": { - "_0": "True if successful" - } - }, - "transferOwnership(address)": { - "details": "Allows the current owner to transfer control of the contract to a newOwner.", - "params": { - "newOwner": "The address to transfer ownership to." - } - }, - "transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)": { - "params": { - "from": "Payer's address (Authorizer)", - "nonce": "Unique nonce", - "r": "r of the signature", - "s": "s of the signature", - "to": "Payee's address", - "v": "v of the signature", - "validAfter": "The time after which this is valid (unix time)", - "validBefore": "The time before which this is valid (unix time)", - "value": "Amount to be transferred" - } - }, - "unBlacklist(address)": { - "details": "Removes account from blacklist", - "params": { - "_account": "The address to remove from the blacklist" - } - }, - "unpause()": { - "details": "called by the owner to unpause, returns to normal state" - }, - "updatePauser(address)": { - "details": "update the pauser role" - }, - "updateRescuer(address)": { - "params": { - "newRescuer": "New rescuer's address" - } - }, - "version()": { - "returns": { - "_0": "Version string" - } - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "allowance(address,address)": { - "notice": "Amount of remaining tokens spender is allowed to transfer on behalf of the token owner" - }, - "approve(address,uint256)": { - "notice": "Set spender's allowance over the caller's tokens to be a given value." - }, - "authorizationState(address,bytes32)": { - "notice": "Returns the state of an authorization" - }, - "cancelAuthorization(address,bytes32,uint8,bytes32,bytes32)": { - "notice": "Attempt to cancel an authorization" - }, - "decreaseAllowance(address,uint256)": { - "notice": "Decrease the allowance by a given decrement" - }, - "increaseAllowance(address,uint256)": { - "notice": "Increase the allowance by a given increment" - }, - "initializeV2(string)": { - "notice": "Initialize v2" - }, - "initializeV2_1(address)": { - "notice": "Initialize v2.1" - }, - "nonces(address)": { - "notice": "Nonces for permit" - }, - "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { - "notice": "Update allowance with a signed permit" - }, - "receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)": { - "notice": "Receive a transfer with a signed authorization from the payer" - }, - "rescueERC20(address,address,uint256)": { - "notice": "Rescue ERC20 tokens locked up in this contract." - }, - "rescuer()": { - "notice": "Returns current rescuer" - }, - "transfer(address,uint256)": { - "notice": "Transfer tokens from the caller" - }, - "transferFrom(address,address,uint256)": { - "notice": "Transfer tokens by spending allowance" - }, - "transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)": { - "notice": "Execute a transfer with a signed authorization" - }, - "updateRescuer(address)": { - "notice": "Assign the rescuer role to a given address." - }, - "version()": { - "notice": "Version string for the EIP712 domain separator" - } - }, - "version": 1 - } - }, - "settings": { - "remappings": [ - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/" - ], - "optimizer": { - "enabled": true, - "runs": 10000000 - }, - "metadata": { - "bytecodeHash": "ipfs" - }, - "compilationTarget": { - "src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2_1.sol": "FiatTokenV2_1" - }, - "libraries": {} - }, - "sources": { - "src/FiatTokenV2_1/centre-tokens/contracts/util/ECRecover.sol": { - "keccak256": "0xb4e623304daaf25e40292e60a814ae60a60745d10003f1881a36be763dbc09aa", - "urls": [ - "bzz-raw://d6ef83bd777bfb13b0968b9cadd971216a95150427fa5d6b50f984e4b7268d31", - "dweb:/ipfs/QmZS5TeT6n7tM36PBdYZNJW3wgYgAZE9zMcouNs4FuEDKj" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/util/EIP712.sol": { - "keccak256": "0x39319612a776e16f355d5ab71575b68c427a058839544f032733df228b5debd1", - "urls": [ - "bzz-raw://d5ac6450e881a4275f4b5baf7b5d6e15c0a0c7c2039edf39f106e0b821c9829d", - "dweb:/ipfs/QmShHneDasAXQzjA8iKWXk3sbZgxbQGPiMQ1MUpJGF64N8" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1.1/FiatTokenV1_1.sol": { - "keccak256": "0xa5f8fc4b5e739ddcafe52dd76ebb7605e09eb9d52a5c1d77e48dd88e83106308", - "urls": [ - "bzz-raw://24543f05d3eb4768ee9798768cb6c9ce8b88d30606a5def83118ad1ba9382ac8", - "dweb:/ipfs/QmYREtrAvoxn6DKXehJPP1pbs8vciqMvRHVk2eFKLtmKVT" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1.1/Rescuable.sol": { - "keccak256": "0x8c02b979e06aa4133c93e47c743ebebd56d120dd10aeaf56b2da2a36f06b68b1", - "urls": [ - "bzz-raw://9d73d6f98bd494500a414ca616eabe9ad6e99f283e00a471bddd7f8ac5825334", - "dweb:/ipfs/QmXesAuMcXJiG3r2og7adeT5wBcY6ntFncVUFjNPfEhJC9" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1/AbstractFiatTokenV1.sol": { - "keccak256": "0xb81ae053cff8eced79f29c3542b7693763ed2bfdd9a25d6b150439d21b3fa57d", - "urls": [ - "bzz-raw://e16ce40aef6188334cd0dbc2e3aead22c1f89101d782df821821061d5efa891b", - "dweb:/ipfs/QmW2WnaMTzpUityk5Mpv7FFdKCh2CeueJaDneoABGVowVm" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1/Blacklistable.sol": { - "keccak256": "0xc4ff3bfe34c8ecf9f2c333f8373c111fdd4640ed15677c4891bb9cf3cbff9554", - "urls": [ - "bzz-raw://91cfc583d47eda58f356783698a130c1c6adf797c4ba55461598c0bac8159f33", - "dweb:/ipfs/QmeWfmhcwUE7H5Ge8TVhWkJ4kDwDY8a4kExMaufukLqsh1" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1/FiatTokenV1.sol": { - "keccak256": "0xaed130ecb4b0714a887dccaaff61321915f2afbf0839ee8af10673507a010471", - "urls": [ - "bzz-raw://3961d2ed8f4f2c69cc4ce0fdb2346b8bd5c09d644627704181fa03b82231ff31", - "dweb:/ipfs/Qmb7sdix44isYUaD4TD4QsVmR8d86NN4koiFE6SsjRagGQ" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1/Ownable.sol": { - "keccak256": "0x654e645d6d09616fde908eba4d29abf318fede7e8cc3e31705203fc1d2599217", - "urls": [ - "bzz-raw://fce1ff1458e817aaa5f87d3ef4207fbbdeb25e548d460f47d9cca4fb80175390", - "dweb:/ipfs/QmfY7E5xfTyeiuU2nDXEdYfy5LKjGRh69fuKK4HV6YTv9v" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1/Pausable.sol": { - "keccak256": "0x873ce4f17eb8694cd0420ef6682c2da54290fe6e243f21ead37e90f211ac91b6", - "urls": [ - "bzz-raw://7df712210c8bb5fc08e0ff7b684ee4035530cd67b21f20d81766a17407606a3c", - "dweb:/ipfs/QmYPFYAw4W8VdcBdknLhqfNfiUuGhGJD3ZZ7rAjrKjhtXd" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v2/AbstractFiatTokenV2.sol": { - "keccak256": "0x5d393663d48e4bbb730630c117c2b703dd3c9968833e66dbbb18c92eab207afe", - "urls": [ - "bzz-raw://b0ce642b7ab095d970e3e5d031e5de6b2a98a7ddd20fd94123a42ed81e21757e", - "dweb:/ipfs/QmbPixwbbpHS7zBRcJV1idzhaSd1SPRm3LjpywxFnXxR8A" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v2/EIP2612.sol": { - "keccak256": "0x8ed169be2f6423b8e7002241857d719e9eb9545f5dbad5209a8f6445132bdbe0", - "urls": [ - "bzz-raw://0646f70d57d072c0569ccbd9b02c922bbb183e6052f94c241c4fef9a267e73bc", - "dweb:/ipfs/QmZK3D3qqTMenkdc5EpZSiyxETMpTVpRke61uuRH75ctVk" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v2/EIP3009.sol": { - "keccak256": "0x74a81d5b1682cb6716f60c27254e8a15463797e1772b37c884390eb9c7985070", - "urls": [ - "bzz-raw://1d3a6e220c2b8aab8c5070312cc9320ce2b79955b0bddafd99e5feec13851016", - "dweb:/ipfs/QmQwc2nZtMKyDcGT8Scnv1R4ThP2Va9trUHnRiqMz4G2WN" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v2/EIP712Domain.sol": { - "keccak256": "0x56d8c0259e7f0baa5bb0d0d94810f25d001fb2dbe4eaf54dbe369ba0f1b8fd2b", - "urls": [ - "bzz-raw://9356cfa1d42bfb8c4f84a3db535ab75b2088975bfbda30834d79c3eb678047ea", - "dweb:/ipfs/QmSBeiLwNGEC4vnr82EWQinGZFZemxKwxvwLZ9bu48FWF2" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2.sol": { - "keccak256": "0x59654e02023dd9d712bb160545854eae6cba80d707a547f6abfaadcd830af2e7", - "urls": [ - "bzz-raw://e22c43b71ea393e9910bd91a355f711803d6971be25e9dabc702aaefac2a597f", - "dweb:/ipfs/QmRjopnHgyKh1mXBDETBaXaom3NJSaacGEJweB5b28BdSE" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2_1.sol": { - "keccak256": "0x6328091a86a3ab02471fba7ff3bf44200f6daf9f0ff3b61fe4043ee14cc1a4f0", - "urls": [ - "bzz-raw://4fed880853c249f6f812ddfa37bf99633b688f0bfd734e03372e4523f6cd2af9", - "dweb:/ipfs/QmUMD1SvykvTJ8jmAjnsW13Yo3Wt6KH5dfKRPKCRogLki8" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/openzeppelin/contracts/math/SafeMath.sol": { - "keccak256": "0x9a9cf02622cd7a64261b10534fc3260449da25c98c9e96d1b4ae8110a20e5806", - "urls": [ - "bzz-raw://2df142592d1dc267d9549049ee3317fa190d2f87eaa565f86ab05ec83f7ab8f5", - "dweb:/ipfs/QmSkJtcfWo7c42KnL5hho6GFxK6HRNV91XABx1P7xDtfLV" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/openzeppelin/contracts/token/ERC20/IERC20.sol": { - "keccak256": "0x5c26b39d26f7ed489e555d955dcd3e01872972e71fdd1528e93ec164e4f23385", - "urls": [ - "bzz-raw://efdc632af6960cf865dbc113665ea1f5b90eab75cc40ec062b2f6ae6da582017", - "dweb:/ipfs/QmfAZFDuG62vxmAN9DnXApv7e7PMzPqi4RkqqZHLMSQiY5" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/openzeppelin/contracts/token/ERC20/SafeERC20.sol": { - "keccak256": "0xf3b30f8a49631420635a8c35daacfcaa338012755f18a76fdd118730256f9a27", - "urls": [ - "bzz-raw://0d7de652204c2ee291a61aa984103dfc7ae4392d651fbbc44a0079caee7c69a3", - "dweb:/ipfs/Qmcw1cQnq9eWDnrCBwU3TNyqLfTMUFg5YKpYUkELoMPuUE" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/openzeppelin/contracts/utils/Address.sol": { - "keccak256": "0xdfb4f812600ba4ce6738c35584ceb8c9433472583051b48ba5b1f66cb758a498", - "urls": [ - "bzz-raw://df02dffe1c1de089d9b4f6192f0dcf464526f2230f420b3deec4645e0cdd2bff", - "dweb:/ipfs/QmcqXGAU3KJqwrgUVoGJ2W8osomhSJ4R5kdsRpbuW3fELS" - ], - "license": "MIT" - } - }, - "version": 1 - }, - "ast": { - "absolutePath": "src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2_1.sol", - "id": 47381, - "exportedSymbols": { - "FiatTokenV2_1": [47380] - }, - "nodeType": "SourceUnit", - "src": "1154:973:41", - "nodes": [ - { - "id": 47316, - "nodeType": "PragmaDirective", - "src": "1154:23:41", - "nodes": [], - "literals": ["solidity", "0.6", ".12"] - }, - { - "id": 47318, - "nodeType": "ImportDirective", - "src": "1179:48:41", - "nodes": [], - "absolutePath": "src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2.sol", - "file": "./FiatTokenV2.sol", - "scope": 47381, - "sourceUnit": 47315, - "symbolAliases": [ - { - "foreign": { - "argumentTypes": null, - "id": 47317, - "name": "FiatTokenV2", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": null, - "src": "1188:11:41", - "typeDescriptions": { - "typeIdentifier": null, - "typeString": null - } - }, - "local": null - } - ], - "unitAlias": "" - }, - { - "id": 47380, - "nodeType": "ContractDefinition", - "src": "1362:764:41", - "nodes": [ - { - "id": 47370, - "nodeType": "FunctionDefinition", - "src": "1528:398:41", - "nodes": [], - "body": { - "id": 47369, - "nodeType": "Block", - "src": "1583:343:41", - "nodes": [], - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint8", - "typeString": "uint8" - }, - "id": 47330, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 47328, - "name": "_initializedVersion", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 47025, - "src": "1652:19:41", - "typeDescriptions": { - "typeIdentifier": "t_uint8", - "typeString": "uint8" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "hexValue": "31", - "id": 47329, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1675:1:41", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - }, - "src": "1652:24:41", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - ], - "id": 47327, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [-18, -18], - "referencedDeclaration": -18, - "src": "1644:7:41", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", - "typeString": "function (bool) pure" - } - }, - "id": 47331, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1644:33:41", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 47332, - "nodeType": "ExpressionStatement", - "src": "1644:33:41" - }, - { - "assignments": [47334], - "declarations": [ - { - "constant": false, - "id": 47334, - "mutability": "mutable", - "name": "lockedAmount", - "nodeType": "VariableDeclaration", - "overrides": null, - "scope": 47369, - "src": "1688:20:41", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 47333, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1688:7:41", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 47341, - "initialValue": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 47335, - "name": "balances", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 45622, - "src": "1711:8:41", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", - "typeString": "mapping(address => uint256)" - } - }, - "id": 47340, - "indexExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 47338, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -28, - "src": "1728:4:41", - "typeDescriptions": { - "typeIdentifier": "t_contract$_FiatTokenV2_1_$47380", - "typeString": "contract FiatTokenV2_1" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_FiatTokenV2_1_$47380", - "typeString": "contract FiatTokenV2_1" - } - ], - "id": 47337, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "1720:7:41", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": { - "id": 47336, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1720:7:41", - "typeDescriptions": { - "typeIdentifier": null, - "typeString": null - } - } - }, - "id": 47339, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1720:13:41", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "1711:23:41", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "1688:46:41" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 47344, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 47342, - "name": "lockedAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 47334, - "src": "1748:12:41", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 47343, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1763:1:41", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "1748:16:41", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 47355, - "nodeType": "IfStatement", - "src": "1744:99:41", - "trueBody": { - "id": 47354, - "nodeType": "Block", - "src": "1766:77:41", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 47348, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -28, - "src": "1798:4:41", - "typeDescriptions": { - "typeIdentifier": "t_contract$_FiatTokenV2_1_$47380", - "typeString": "contract FiatTokenV2_1" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_FiatTokenV2_1_$47380", - "typeString": "contract FiatTokenV2_1" - } - ], - "id": 47347, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "1790:7:41", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": { - "id": 47346, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1790:7:41", - "typeDescriptions": { - "typeIdentifier": null, - "typeString": null - } - } - }, - "id": 47349, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1790:13:41", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 47350, - "name": "lostAndFound", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 47324, - "src": "1805:12:41", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 47351, - "name": "lockedAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 47334, - "src": "1819:12:41", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 47345, - "name": "_transfer", - "nodeType": "Identifier", - "overloadedDeclarations": [46200], - "referencedDeclaration": 46200, - "src": "1780:9:41", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", - "typeString": "function (address,address,uint256)" - } - }, - "id": 47352, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1780:52:41", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 47353, - "nodeType": "ExpressionStatement", - "src": "1780:52:41" - } - ] - } - }, - { - "expression": { - "argumentTypes": null, - "id": 47363, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 47356, - "name": "blacklisted", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 45464, - "src": "1852:11:41", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 47361, - "indexExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 47359, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -28, - "src": "1872:4:41", - "typeDescriptions": { - "typeIdentifier": "t_contract$_FiatTokenV2_1_$47380", - "typeString": "contract FiatTokenV2_1" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_FiatTokenV2_1_$47380", - "typeString": "contract FiatTokenV2_1" - } - ], - "id": 47358, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "1864:7:41", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": { - "id": 47357, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1864:7:41", - "typeDescriptions": { - "typeIdentifier": null, - "typeString": null - } - } - }, - "id": 47360, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1864:13:41", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "nodeType": "IndexAccess", - "src": "1852:26:41", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "74727565", - "id": 47362, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1881:4:41", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "true" - }, - "src": "1852:33:41", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 47364, - "nodeType": "ExpressionStatement", - "src": "1852:33:41" - }, - { - "expression": { - "argumentTypes": null, - "id": 47367, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 47365, - "name": "_initializedVersion", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 47025, - "src": "1896:19:41", - "typeDescriptions": { - "typeIdentifier": "t_uint8", - "typeString": "uint8" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "32", - "id": 47366, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1918:1:41", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_2_by_1", - "typeString": "int_const 2" - }, - "value": "2" - }, - "src": "1896:23:41", - "typeDescriptions": { - "typeIdentifier": "t_uint8", - "typeString": "uint8" - } - }, - "id": 47368, - "nodeType": "ExpressionStatement", - "src": "1896:23:41" - } - ] - }, - "documentation": { - "id": 47322, - "nodeType": "StructuredDocumentation", - "src": "1406:117:41", - "text": " @notice Initialize v2.1\n @param lostAndFound The address to which the locked funds are sent" - }, - "functionSelector": "2fc81e09", - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "initializeV2_1", - "overrides": null, - "parameters": { - "id": 47325, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 47324, - "mutability": "mutable", - "name": "lostAndFound", - "nodeType": "VariableDeclaration", - "overrides": null, - "scope": 47370, - "src": "1552:20:41", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 47323, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1552:7:41", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1551:22:41" - }, - "returnParameters": { - "id": 47326, - "nodeType": "ParameterList", - "parameters": [], - "src": "1583:0:41" - }, - "scope": 47380, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 47379, - "nodeType": "FunctionDefinition", - "src": "2040:84:41", - "nodes": [], - "body": { - "id": 47378, - "nodeType": "Block", - "src": "2097:27:41", - "nodes": [], - "statements": [ - { - "expression": { - "argumentTypes": null, - "hexValue": "32", - "id": 47376, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2114:3:41", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_ad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", - "typeString": "literal_string \"2\"" - }, - "value": "2" - }, - "functionReturnParameters": 47375, - "id": 47377, - "nodeType": "Return", - "src": "2107:10:41" - } - ] - }, - "documentation": { - "id": 47371, - "nodeType": "StructuredDocumentation", - "src": "1932:103:41", - "text": " @notice Version string for the EIP712 domain separator\n @return Version string" - }, - "functionSelector": "54fd4d50", - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "version", - "overrides": null, - "parameters": { - "id": 47372, - "nodeType": "ParameterList", - "parameters": [], - "src": "2056:2:41" - }, - "returnParameters": { - "id": 47375, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 47374, - "mutability": "mutable", - "name": "", - "nodeType": "VariableDeclaration", - "overrides": null, - "scope": 47379, - "src": "2082:13:41", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_string_memory_ptr", - "typeString": "string" - }, - "typeName": { - "id": 47373, - "name": "string", - "nodeType": "ElementaryTypeName", - "src": "2082:6:41", - "typeDescriptions": { - "typeIdentifier": "t_string_storage_ptr", - "typeString": "string" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "2081:15:41" - }, - "scope": 47380, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - } - ], - "abstract": false, - "baseContracts": [ - { - "arguments": null, - "baseName": { - "contractScope": null, - "id": 47320, - "name": "FiatTokenV2", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 47314, - "src": "1388:11:41", - "typeDescriptions": { - "typeIdentifier": "t_contract$_FiatTokenV2_$47314", - "typeString": "contract FiatTokenV2" - } - }, - "id": 47321, - "nodeType": "InheritanceSpecifier", - "src": "1388:11:41" - } - ], - "contractDependencies": [ - 45337, 45426, 45451, 45582, 46359, 46443, 46543, 46568, 46663, 46995, - 47002, 47314, 47654 - ], - "contractKind": "contract", - "documentation": { - "id": 47319, - "nodeType": "StructuredDocumentation", - "src": "1269:92:41", - "text": " @title FiatToken V2.1\n @notice ERC20 Token backed by fiat reserves, version 2.1" - }, - "fullyImplemented": true, - "linearizedBaseContracts": [ - 47380, 47314, 46663, 46995, 47002, 46568, 45337, 45426, 46359, 45582, - 46543, 46443, 45451, 47654 - ], - "name": "FiatTokenV2_1", - "scope": 47381 - } - ], - "license": "MIT" - }, - "id": 41 -} diff --git a/packages/protocol/contracts/compiled/README.md b/packages/protocol/contracts/compiled/README.md deleted file mode 100644 index f8767494803..00000000000 --- a/packages/protocol/contracts/compiled/README.md +++ /dev/null @@ -1,24 +0,0 @@ -## About the compiled contracts - -Following Circle's recommendation for native token support (USDC, EURC), one needs to follow the standard proposed below: - -https://github.com/circlefin/stablecoin-evm/blob/master/doc/bridged_USDC_standard.md - -According to this document: - -> The third-party team’s bridged USDC token contract is expected to be identical to native USDC token contracts on other EVM blockchains. USDC uses a proxy pattern, so the standard applies to both the implementation contract code and the token proxy. -> -> Using identical code facilitates trustless contract verification by Circle and supports a seamless integration with existing USDC services. To facilitate this, the third-party team may choose one of the following: -> -> Copy previously deployed bytecode from a recent, native USDC token contract deployment (both proxy and implementation) on an EVM blockchain, for example Arbitrum, Base, OP Mainnet, or Polygon PoS Note that you must supply different constructor and initializer parameters where needed. -> -> Build the FiatToken contracts from source. In this case, the compiler metadata must be published or made available to support full contract verification. Various suggested compiler settings that Circle uses can be found here, which will allow the third-party team to reach the same bytecode if followed consistently. - -Following the recommendations the contracts were built with the same compiler settings (version + optimization) and they have bytecode equivalence with the other contracts (mentioned in the doc, and can be found on links below (Arbitrum, Scroll, Polygon, etc.)). - -For reference, here are Arbitrum's proxy + token contracts: - -- Proxy: https://arbiscan.io/token/0xaf88d065e77c8cc2239327c5edb3a432268e5831#code -- Implementation: https://arbiscan.io/address/0x0f4fb9474303d10905AB86aA8d5A65FE44b6E04A#code - -As a cross-reference, one can compare the bytecode of the ones present on arbiscan and here in the .json files (under bytcode key), the additional (meta)data could be helpful for contracts verification. diff --git a/packages/protocol/contracts/automata-attestation/AutomataDcapV3Attestation.sol b/packages/protocol/contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol similarity index 95% rename from packages/protocol/contracts/automata-attestation/AutomataDcapV3Attestation.sol rename to packages/protocol/contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol index 900ade36002..4b019c4723c 100644 --- a/packages/protocol/contracts/automata-attestation/AutomataDcapV3Attestation.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol @@ -1,23 +1,18 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import { V3Struct } from "./lib/QuoteV3Auth/V3Struct.sol"; -import { V3Parser } from "./lib/QuoteV3Auth/V3Parser.sol"; -import { IPEMCertChainLib } from "./lib/interfaces/IPEMCertChainLib.sol"; -import { PEMCertChainLib } from "./lib/PEMCertChainLib.sol"; -import { TCBInfoStruct } from "./lib/TCBInfoStruct.sol"; -import { EnclaveIdStruct } from "./lib/EnclaveIdStruct.sol"; -import { IAttestation } from "./interfaces/IAttestation.sol"; - -// Internal Libraries -import { Base64 } from "solady/src/utils/Base64.sol"; -import { LibString } from "solady/src/utils/LibString.sol"; -import { BytesUtils } from "./utils/BytesUtils.sol"; - -// External Libraries -import { ISigVerifyLib } from "./interfaces/ISigVerifyLib.sol"; - -import { EssentialContract } from "../common/EssentialContract.sol"; +pragma solidity ^0.8.24; + +import "solady/src/utils/Base64.sol"; +import "solady/src/utils/LibString.sol"; +import "src/shared/common/EssentialContract.sol"; +import "./lib/QuoteV3Auth/V3Struct.sol"; +import "./lib/QuoteV3Auth/V3Parser.sol"; +import "./lib/interfaces/IPEMCertChainLib.sol"; +import "./lib/PEMCertChainLib.sol"; +import "./lib/TCBInfoStruct.sol"; +import "./lib/EnclaveIdStruct.sol"; +import "./interfaces/IAttestation.sol"; +import "./utils/BytesUtils.sol"; +import "./interfaces/ISigVerifyLib.sol"; /// @title AutomataDcapV3Attestation /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/layer1/automata-attestation/README.md b/packages/protocol/contracts/layer1/automata-attestation/README.md new file mode 100644 index 00000000000..473a73033de --- /dev/null +++ b/packages/protocol/contracts/layer1/automata-attestation/README.md @@ -0,0 +1,4 @@ +# Readme + +Original code (main branch) forked from https://github.com/automata-network/automata-dcap-v3-attestation and applying some gas optimizations here: https://github.com/smtmfft/automata-dcap-v3-attestation/tree/parse-quote-offline, which then was merged into taiko-mono. +The corresponding upstream PR is: https://github.com/automata-network/automata-dcap-v3-attestation/pull/6, waiting to be merged. diff --git a/packages/protocol/contracts/automata-attestation/interfaces/IAttestation.sol b/packages/protocol/contracts/layer1/automata-attestation/interfaces/IAttestation.sol similarity index 80% rename from packages/protocol/contracts/automata-attestation/interfaces/IAttestation.sol rename to packages/protocol/contracts/layer1/automata-attestation/interfaces/IAttestation.sol index 7f918de6e2c..8059b9216b3 100644 --- a/packages/protocol/contracts/automata-attestation/interfaces/IAttestation.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/interfaces/IAttestation.sol @@ -1,7 +1,7 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import { V3Struct } from "../lib/QuoteV3Auth/V3Struct.sol"; +import "../lib/QuoteV3Auth/V3Struct.sol"; /// @title IAttestation /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/interfaces/ISigVerifyLib.sol b/packages/protocol/contracts/layer1/automata-attestation/interfaces/ISigVerifyLib.sol similarity index 92% rename from packages/protocol/contracts/automata-attestation/interfaces/ISigVerifyLib.sol rename to packages/protocol/contracts/layer1/automata-attestation/interfaces/ISigVerifyLib.sol index 5f407625cad..3170d0649a9 100644 --- a/packages/protocol/contracts/automata-attestation/interfaces/ISigVerifyLib.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/interfaces/ISigVerifyLib.sol @@ -1,5 +1,5 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title ISigVerifyLib /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/lib/EnclaveIdStruct.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/EnclaveIdStruct.sol similarity index 96% rename from packages/protocol/contracts/automata-attestation/lib/EnclaveIdStruct.sol rename to packages/protocol/contracts/layer1/automata-attestation/lib/EnclaveIdStruct.sol index 3e889e084e5..d41be6d9671 100644 --- a/packages/protocol/contracts/automata-attestation/lib/EnclaveIdStruct.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/EnclaveIdStruct.sol @@ -1,5 +1,5 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title EnclaveIdStruct /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/lib/PEMCertChainLib.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/PEMCertChainLib.sol similarity index 97% rename from packages/protocol/contracts/automata-attestation/lib/PEMCertChainLib.sol rename to packages/protocol/contracts/layer1/automata-attestation/lib/PEMCertChainLib.sol index f69c3e0200c..768861942e0 100644 --- a/packages/protocol/contracts/automata-attestation/lib/PEMCertChainLib.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/PEMCertChainLib.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import { LibString } from "solady/src/utils/LibString.sol"; -import { Asn1Decode, NodePtr } from "../utils/Asn1Decode.sol"; -import { BytesUtils } from "../utils/BytesUtils.sol"; -import { X509DateUtils } from "../utils/X509DateUtils.sol"; -import { IPEMCertChainLib } from "./interfaces/IPEMCertChainLib.sol"; +import "solady/src/utils/LibString.sol"; +import "../utils/Asn1Decode.sol"; +import "../utils/BytesUtils.sol"; +import "../utils/X509DateUtils.sol"; +import "./interfaces/IPEMCertChainLib.sol"; /// @title PEMCertChainLib /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/lib/QuoteV3Auth/V3Parser.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol similarity index 97% rename from packages/protocol/contracts/automata-attestation/lib/QuoteV3Auth/V3Parser.sol rename to packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol index 4e574b7eec9..773c07d551c 100644 --- a/packages/protocol/contracts/automata-attestation/lib/QuoteV3Auth/V3Parser.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol @@ -1,10 +1,10 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import { Base64 } from "solady/src/utils/Base64.sol"; -import { BytesUtils } from "../../utils/BytesUtils.sol"; -import { IPEMCertChainLib, PEMCertChainLib } from "../../lib/PEMCertChainLib.sol"; -import { V3Struct } from "./V3Struct.sol"; +import "solady/src/utils/Base64.sol"; +import "../../utils/BytesUtils.sol"; +import "../../lib/PEMCertChainLib.sol"; +import "./V3Struct.sol"; /// @title V3Parser /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/lib/QuoteV3Auth/V3Struct.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol similarity index 98% rename from packages/protocol/contracts/automata-attestation/lib/QuoteV3Auth/V3Struct.sol rename to packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol index 3fbf799c8fc..9ecb7572947 100644 --- a/packages/protocol/contracts/automata-attestation/lib/QuoteV3Auth/V3Struct.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol @@ -1,5 +1,5 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title V3Struct /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/lib/TCBInfoStruct.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/TCBInfoStruct.sol similarity index 96% rename from packages/protocol/contracts/automata-attestation/lib/TCBInfoStruct.sol rename to packages/protocol/contracts/layer1/automata-attestation/lib/TCBInfoStruct.sol index f40c05bdef5..b450853c5b4 100644 --- a/packages/protocol/contracts/automata-attestation/lib/TCBInfoStruct.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/TCBInfoStruct.sol @@ -1,5 +1,5 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title TCBInfoStruct /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/lib/interfaces/IPEMCertChainLib.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/interfaces/IPEMCertChainLib.sol similarity index 97% rename from packages/protocol/contracts/automata-attestation/lib/interfaces/IPEMCertChainLib.sol rename to packages/protocol/contracts/layer1/automata-attestation/lib/interfaces/IPEMCertChainLib.sol index 7f728558bda..eeca3b92947 100644 --- a/packages/protocol/contracts/automata-attestation/lib/interfaces/IPEMCertChainLib.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/interfaces/IPEMCertChainLib.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IPEMCertChainLib /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/utils/Asn1Decode.sol b/packages/protocol/contracts/layer1/automata-attestation/utils/Asn1Decode.sol similarity index 99% rename from packages/protocol/contracts/automata-attestation/utils/Asn1Decode.sol rename to packages/protocol/contracts/layer1/automata-attestation/utils/Asn1Decode.sol index 94b165c6c76..30edd958e7f 100644 --- a/packages/protocol/contracts/automata-attestation/utils/Asn1Decode.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/utils/Asn1Decode.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT // Original source: https://github.com/JonahGroendal/asn1-decode -pragma solidity 0.8.24; +pragma solidity ^0.8.24; // Inspired by PufferFinance/rave - Apache-2.0 license // https://github.com/JonahGroendal/asn1-decode/blob/5c2d1469fc678513753786acb441e597969192ec/contracts/Asn1Decode.sol diff --git a/packages/protocol/contracts/automata-attestation/utils/BytesUtils.sol b/packages/protocol/contracts/layer1/automata-attestation/utils/BytesUtils.sol similarity index 99% rename from packages/protocol/contracts/automata-attestation/utils/BytesUtils.sol rename to packages/protocol/contracts/layer1/automata-attestation/utils/BytesUtils.sol index f1711842248..22469685e0d 100644 --- a/packages/protocol/contracts/automata-attestation/utils/BytesUtils.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/utils/BytesUtils.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD 2-Clause License -pragma solidity 0.8.24; +pragma solidity ^0.8.24; // Inspired by ensdomains/dnssec-oracle - BSD-2-Clause license // https://github.com/ensdomains/dnssec-oracle/blob/master/contracts/BytesUtils.sol diff --git a/packages/protocol/contracts/automata-attestation/utils/SHA1.sol b/packages/protocol/contracts/layer1/automata-attestation/utils/SHA1.sol similarity index 99% rename from packages/protocol/contracts/automata-attestation/utils/SHA1.sol rename to packages/protocol/contracts/layer1/automata-attestation/utils/SHA1.sol index 856e841f90a..6c39a7d25dc 100644 --- a/packages/protocol/contracts/automata-attestation/utils/SHA1.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/utils/SHA1.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: BSD 2-Clause License -pragma solidity 0.8.24; +pragma solidity ^0.8.24; // Inspired by ensdomains/solsha1 - BSD 2-Clause License // https://github.com/ensdomains/solsha1/blob/master/contracts/SHA1.sol diff --git a/packages/protocol/contracts/automata-attestation/utils/SigVerifyLib.sol b/packages/protocol/contracts/layer1/automata-attestation/utils/SigVerifyLib.sol similarity index 98% rename from packages/protocol/contracts/automata-attestation/utils/SigVerifyLib.sol rename to packages/protocol/contracts/layer1/automata-attestation/utils/SigVerifyLib.sol index 80c99cb0b9e..85bae00b99d 100644 --- a/packages/protocol/contracts/automata-attestation/utils/SigVerifyLib.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/utils/SigVerifyLib.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../interfaces/ISigVerifyLib.sol"; import "./BytesUtils.sol"; diff --git a/packages/protocol/contracts/automata-attestation/utils/X509DateUtils.sol b/packages/protocol/contracts/layer1/automata-attestation/utils/X509DateUtils.sol similarity index 99% rename from packages/protocol/contracts/automata-attestation/utils/X509DateUtils.sol rename to packages/protocol/contracts/layer1/automata-attestation/utils/X509DateUtils.sol index dbbcb44ae71..ac7ef6bc961 100644 --- a/packages/protocol/contracts/automata-attestation/utils/X509DateUtils.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/utils/X509DateUtils.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title X509DateUtils /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/layer1/based/ITaikoL1.sol b/packages/protocol/contracts/layer1/based/ITaikoL1.sol new file mode 100644 index 00000000000..a3d1d02e660 --- /dev/null +++ b/packages/protocol/contracts/layer1/based/ITaikoL1.sol @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoData.sol"; + +/// @title ITaikoL1 +/// @custom:security-contact security@taiko.xyz +interface ITaikoL1 { + /// @notice Proposes a Taiko L2 block (version 2) + /// @param _params Block parameters, an encoded BlockParamsV2 object. + /// @param _txList txList data if calldata is used for DA. + /// @return meta_ The metadata of the proposed L2 block. + function proposeBlockV2( + bytes calldata _params, + bytes calldata _txList + ) + external + returns (TaikoData.BlockMetadataV2 memory meta_); + + /// @notice Proposes multiple Taiko L2 blocks (version 2) + /// @param _paramsArr A list of encoded BlockParamsV2 objects. + /// @param _txListArr A list of txList. + /// @return metaArr_ The metadata objects of the proposed L2 blocks. + function proposeBlocksV2( + bytes[] calldata _paramsArr, + bytes[] calldata _txListArr + ) + external + returns (TaikoData.BlockMetadataV2[] memory metaArr_); + + /// @notice Proves or contests a block transition. + /// @param _blockId Index of the block to prove. This is also used to select the right + /// implementation version. + /// @param _input ABI-encoded (TaikoData.BlockMetadata, TaikoData.Transition, + /// TaikoData.TierProof) tuple. + function proveBlock(uint64 _blockId, bytes calldata _input) external; + + /// @notice Proves or contests multiple block transitions (version 2) + /// @param _blockIds The indices of the blocks to prove. + /// @param _inputs An list of abi-encoded (TaikoData.BlockMetadata, TaikoData.Transition, + /// TaikoData.TierProof) tuples. + /// @param _batchProof An abi-encoded TaikoData.TierProof that contains the batch/aggregated + /// proof for the given blocks. + function proveBlocks( + uint64[] calldata _blockIds, + bytes[] calldata _inputs, + bytes calldata _batchProof + ) + external; + + /// @notice Verifies up to a specified number of blocks. + /// @param _maxBlocksToVerify Maximum number of blocks to verify. + function verifyBlocks(uint64 _maxBlocksToVerify) external; + + /// @notice Pauses or unpauses block proving. + /// @param _pause True to pause, false to unpause. + function pauseProving(bool _pause) external; + + /// @notice Deposits bond ERC20 token or Ether. + /// @param _amount The amount of Taiko token to deposit. + function depositBond(uint256 _amount) external payable; + + /// @notice Withdraws bond ERC20 token or Ether. + /// @param _amount Amount of Taiko tokens to withdraw. + function withdrawBond(uint256 _amount) external; + + /// @notice Gets the prover that actually proved a verified block. + /// @param _blockId Index of the block. + /// @return The prover's address. If the block is not verified yet, address(0) will be returned. + function getVerifiedBlockProver(uint64 _blockId) external view returns (address); + + /// @notice Gets the details of a block. + /// @param _blockId Index of the block. + /// @return blk_ The block. + function getBlockV2(uint64 _blockId) external view returns (TaikoData.BlockV2 memory blk_); + + /// @notice Gets the state transition for a specific block. + /// @param _blockId Index of the block. + /// @param _tid The transition id. + /// @return The state transition data of the block. The transition's state root will be zero if + /// the block is not a sync-block. + function getTransition( + uint64 _blockId, + uint32 _tid + ) + external + view + returns (TaikoData.TransitionState memory); + + /// @notice Retrieves the ID of the L1 block where the most recent L2 block was proposed. + /// @return The ID of the Li block where the most recent block was proposed. + function lastProposedIn() external view returns (uint56); + + /// @notice Gets the configuration of the TaikoL1 contract. + /// @return Config struct containing configuration parameters. + function getConfig() external pure returns (TaikoData.Config memory); +} diff --git a/packages/protocol/contracts/layer1/based/LibBonds.sol b/packages/protocol/contracts/layer1/based/LibBonds.sol new file mode 100644 index 00000000000..64aceb36e94 --- /dev/null +++ b/packages/protocol/contracts/layer1/based/LibBonds.sol @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import "src/shared/common/IAddressResolver.sol"; +import "src/shared/common/LibAddress.sol"; +import "src/shared/common/LibStrings.sol"; +import "./TaikoData.sol"; + +/// @title LibBonds +/// @notice A library that offers helper functions to handle bonds. +/// @custom:security-contact security@taiko.xyz +library LibBonds { + /// @dev Emitted when tokens are deposited into a user's bond balance. + /// @param user The address of the user who deposited the tokens. + /// @param amount The amount of tokens deposited. + event BondDeposited(address indexed user, uint256 amount); + + /// @dev Emitted when tokens are withdrawn from a user's bond balance. + /// @param user The address of the user who withdrew the tokens. + /// @param amount The amount of tokens withdrawn. + event BondWithdrawn(address indexed user, uint256 amount); + + /// @dev Emitted when a token is credited back to a user's bond balance. + /// @param user The address of the user whose bond balance is credited. + /// @param blockId The ID of the block to credit for. + /// @param amount The amount of tokens credited. + event BondCredited(address indexed user, uint256 blockId, uint256 amount); + + /// @dev Emitted when a token is debited from a user's bond balance. + /// @param user The address of the user whose bond balance is debited. + /// @param blockId The ID of the block to debit for. + /// @param amount The amount of tokens debited. + event BondDebited(address indexed user, uint256 blockId, uint256 amount); + + error L1_INVALID_MSG_VALUE(); + error L1_ETH_NOT_PAID_AS_BOND(); + + /// @dev Deposits TAIKO tokens to be used as bonds. + /// @param _state Pointer to the protocol's storage. + /// @param _resolver The address resolver. + /// @param _amount The amount of tokens to deposit. + function depositBond( + TaikoData.State storage _state, + IAddressResolver _resolver, + uint256 _amount + ) + public + { + _state.bondBalance[msg.sender] += _amount; + _handleDeposit(_resolver, msg.sender, _amount); + } + + /// @dev Withdraws TAIKO tokens. + /// @param _state Pointer to the protocol's storage. + /// @param _resolver The address resolver. + /// @param _amount The amount of tokens to withdraw. + function withdrawBond( + TaikoData.State storage _state, + IAddressResolver _resolver, + uint256 _amount + ) + public + { + emit BondWithdrawn(msg.sender, _amount); + _state.bondBalance[msg.sender] -= _amount; + + address bondToken = _bondToken(_resolver); + if (bondToken != address(0)) { + IERC20(bondToken).transfer(msg.sender, _amount); + } else { + LibAddress.sendEtherAndVerify(msg.sender, _amount); + } + } + + /// @dev Gets a user's current TAIKO token bond balance. + /// @param _state Pointer to the protocol's storage. + /// @param _user The address of the user. + /// @return The current token balance. + function bondBalanceOf( + TaikoData.State storage _state, + address _user + ) + public + view + returns (uint256) + { + return _state.bondBalance[_user]; + } + + /// @dev Debits TAIKO tokens as bonds. + /// @param _state Pointer to the protocol's storage. + /// @param _resolver The address resolver. + /// @param _user The address of the user to debit. + /// @param _blockId The ID of the block to debit for. + /// @param _amount The amount of tokens to debit. + function debitBond( + TaikoData.State storage _state, + IAddressResolver _resolver, + address _user, + uint256 _blockId, + uint256 _amount + ) + internal + { + if (_amount == 0) return; + + uint256 balance = _state.bondBalance[_user]; + if (balance >= _amount) { + unchecked { + _state.bondBalance[_user] = balance - _amount; + } + } else { + // Note that the following function call will revert if bond asset is Ether. + _handleDeposit(_resolver, _user, _amount); + } + emit BondDebited(_user, _blockId, _amount); + } + + /// @dev Credits TAIKO tokens to a user's bond balance. + /// @param _state Pointer to the protocol's storage. + /// @param _user The address of the user to credit. + /// @param _blockId The ID of the block to credit for. + /// @param _amount The amount of tokens to credit. + function creditBond( + TaikoData.State storage _state, + address _user, + uint256 _blockId, + uint256 _amount + ) + internal + { + if (_amount == 0) return; + unchecked { + _state.bondBalance[_user] += _amount; + } + emit BondCredited(_user, _blockId, _amount); + } + + /// @dev Handles the deposit of bond tokens or Ether. + /// @param _resolver The address resolver. + /// @param _user The user who made the deposit + /// @param _amount The amount of tokens or Ether to deposit. + function _handleDeposit(IAddressResolver _resolver, address _user, uint256 _amount) private { + address bondToken = _bondToken(_resolver); + + if (bondToken != address(0)) { + require(msg.value == 0, L1_INVALID_MSG_VALUE()); + IERC20(bondToken).transferFrom(_user, address(this), _amount); + } else { + require(msg.value == _amount, L1_ETH_NOT_PAID_AS_BOND()); + } + emit BondDeposited(_user, _amount); + } + + /// @dev Resolves the bond token address using the address resolver, returns address(0) if Ether + /// is used as bond asset. + /// @param _resolver The address resolver. + /// @return The IERC20 interface of the TAIKO token. + function _bondToken(IAddressResolver _resolver) private view returns (address) { + return _resolver.resolve(LibStrings.B_BOND_TOKEN, true); + } +} diff --git a/packages/protocol/contracts/layer1/based/LibData.sol b/packages/protocol/contracts/layer1/based/LibData.sol new file mode 100644 index 00000000000..c6881f67a49 --- /dev/null +++ b/packages/protocol/contracts/layer1/based/LibData.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../verifiers/IVerifier.sol"; +import "./TaikoData.sol"; + +/// @title LibData +/// @notice A library that offers helper functions for data conversion. +/// @custom:security-contact security@taiko.xyz +library LibData { + /// @dev Converts a BlockV2 struct to a Block struct. + /// @param _v2 The BlockV2 struct to convert. + /// @return The converted Block struct. + function blockV2ToV1(TaikoData.BlockV2 memory _v2) + public + pure + returns (TaikoData.Block memory) + { + return TaikoData.Block({ + metaHash: _v2.metaHash, + assignedProver: address(0), // assigned prover is now meta.proposer. + livenessBond: 0, // liveness bond is now meta.livenessBond + blockId: _v2.blockId, + proposedAt: 0, + proposedIn: 0, + nextTransitionId: _v2.nextTransitionId, + verifiedTransitionId: _v2.verifiedTransitionId + }); + } + + /// @dev Converts a ContextV2 struct to a Context struct. + /// @param _v2 The ContextV2 struct to convert. + /// @return The converted Context struct. + function verifierContextV2ToV1(IVerifier.ContextV2 memory _v2) + internal + pure + returns (IVerifier.Context memory) + { + return IVerifier.Context({ + metaHash: _v2.metaHash, + blobHash: _v2.blobHash, + prover: _v2.prover, + blockId: _v2.blockId, + isContesting: _v2.isContesting, + blobUsed: _v2.blobUsed, + msgSender: _v2.msgSender + }); + } +} diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol new file mode 100644 index 00000000000..4f6788a480b --- /dev/null +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -0,0 +1,312 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibAddress.sol"; +import "src/shared/common/LibNetwork.sol"; +import "./LibBonds.sol"; +import "./LibData.sol"; +import "./LibUtils.sol"; +import "./LibVerifying.sol"; + +/// @title LibProposing +/// @notice A library that offers helper functions for block proposals. +/// @custom:security-contact security@taiko.xyz +library LibProposing { + using LibAddress for address; + + uint256 internal constant SECONDS_PER_BLOCK = 12; + + struct Local { + TaikoData.SlotB b; + TaikoData.BlockParamsV2 params; + ITierProvider tierProvider; + bytes32 parentMetaHash; + bool allowCustomProposer; + } + + /// @dev Emitted when a block is proposed. + /// @param blockId The ID of the proposed block. + /// @param meta The metadata of the proposed block. + event BlockProposedV2(uint256 indexed blockId, TaikoData.BlockMetadataV2 meta); + + /// @dev Emitted when a block's txList is in the calldata. + /// @param blockId The ID of the proposed block. + /// @param txList The txList. + event CalldataTxList(uint256 indexed blockId, bytes txList); + + error L1_BLOB_NOT_AVAILABLE(); + error L1_BLOB_NOT_FOUND(); + error L1_FORK_HEIGHT_ERROR(); + error L1_INVALID_ANCHOR_BLOCK(); + error L1_INVALID_CUSTOM_PROPOSER(); + error L1_INVALID_PARAMS(); + error L1_INVALID_PROPOSER(); + error L1_INVALID_TIMESTAMP(); + error L1_TOO_MANY_BLOCKS(); + error L1_UNEXPECTED_PARENT(); + + /// @dev Proposes multiple Taiko L2 blocks. + /// @param _state Pointer to the protocol's storage. + /// @param _config The configuration parameters for the Taiko protocol. + /// @param _resolver The address resolver. + /// @param _paramsArr An array of encoded data bytes containing the block parameters. + /// @param _txListArr An array of transaction list bytes (if not blob). + /// @return metas_ An array of metadata objects for the proposed L2 blocks (version 2). + function proposeBlocks( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + bytes[] calldata _paramsArr, + bytes[] calldata _txListArr + ) + internal + returns (TaikoData.BlockMetadataV2[] memory metas_) + { + if (_paramsArr.length == 0 || _paramsArr.length != _txListArr.length) { + revert L1_INVALID_PARAMS(); + } + + metas_ = new TaikoData.BlockMetadataV2[](_paramsArr.length); + + for (uint256 i; i < _paramsArr.length; ++i) { + metas_[i] = _proposeBlock(_state, _config, _resolver, _paramsArr[i], _txListArr[i]); + } + + if (!_state.slotB.provingPaused) { + for (uint256 i; i < _paramsArr.length; ++i) { + if (LibUtils.shouldVerifyBlocks(_config, metas_[i].id, false)) { + LibVerifying.verifyBlocks(_state, _config, _resolver, _config.maxBlocksToVerify); + } + } + } + } + + /// @dev Proposes a single Taiko L2 block. + /// @param _state Pointer to the protocol's storage. + /// @param _config The configuration parameters for the Taiko protocol. + /// @param _resolver The address resolver. + /// @param _params Encoded data bytes containing the block parameters. + /// @param _txList Transaction list bytes (if not blob). + /// @return meta_ The metadata of the proposed block (version 2). + function proposeBlock( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + bytes calldata _params, + bytes calldata _txList + ) + internal + returns (TaikoData.BlockMetadataV2 memory meta_) + { + meta_ = _proposeBlock(_state, _config, _resolver, _params, _txList); + + if (!_state.slotB.provingPaused) { + if (LibUtils.shouldVerifyBlocks(_config, meta_.id, false)) { + LibVerifying.verifyBlocks(_state, _config, _resolver, _config.maxBlocksToVerify); + } + } + } + + /// @dev Proposes a single Taiko L2 block. + /// @param _state Pointer to the protocol's storage. + /// @param _config The configuration parameters for the Taiko protocol. + /// @param _resolver The address resolver. + /// @param _params Encoded data bytes containing the block parameters. + /// @param _txList Transaction list bytes (if not blob). + /// @return meta_ The metadata of the proposed block (version 2). + function _proposeBlock( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + bytes calldata _params, + bytes calldata _txList + ) + private + returns (TaikoData.BlockMetadataV2 memory meta_) + { + // Checks proposer access. + Local memory local; + local.b = _state.slotB; + + // It's essential to ensure that the ring buffer for proposed blocks still has space for at + // least one more block. + require(local.b.numBlocks >= _config.ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); + + unchecked { + require( + local.b.numBlocks < local.b.lastVerifiedBlockId + _config.blockMaxProposals + 1, + L1_TOO_MANY_BLOCKS() + ); + } + + address preconfTaskManager = _resolver.resolve(LibStrings.B_PRECONF_TASK_MANAGER, true); + if (preconfTaskManager != address(0)) { + require(preconfTaskManager == msg.sender, L1_INVALID_PROPOSER()); + local.allowCustomProposer = true; + } + + if (_params.length != 0) { + local.params = abi.decode(_params, (TaikoData.BlockParamsV2)); + } + + _validateParams(_state, _config, local); + + // Initialize metadata to compute a metaHash, which forms a part of the block data to be + // stored on-chain for future integrity checks. If we choose to persist all data fields in + // the metadata, it will require additional storage slots. + meta_ = TaikoData.BlockMetadataV2({ + anchorBlockHash: blockhash(local.params.anchorBlockId), + difficulty: keccak256(abi.encode("TAIKO_DIFFICULTY", local.b.numBlocks)), + blobHash: 0, // to be initialized below + // Encode _config.baseFeeConfig into extraData to allow L2 block execution without + // metadata. Metadata might be unavailable until the block is proposed on-chain. In + // preconfirmation scenarios, multiple blocks may be built but not yet proposed, making + // metadata unavailable. + extraData: _encodeBaseFeeConfig(_config.baseFeeConfig), + coinbase: local.params.coinbase, + id: local.b.numBlocks, + gasLimit: _config.blockMaxGasLimit, + timestamp: local.params.timestamp, + anchorBlockId: local.params.anchorBlockId, + minTier: 0, // to be initialized below + blobUsed: _txList.length == 0, + parentMetaHash: local.params.parentMetaHash, + proposer: local.params.proposer, + livenessBond: _config.livenessBond, + proposedAt: uint64(block.timestamp), + proposedIn: uint64(block.number), + blobTxListOffset: local.params.blobTxListOffset, + blobTxListLength: local.params.blobTxListLength, + blobIndex: local.params.blobIndex, + baseFeeConfig: _config.baseFeeConfig + }); + + // Update certain meta fields + if (meta_.blobUsed) { + require(LibNetwork.isDencunSupported(block.chainid), L1_BLOB_NOT_AVAILABLE()); + meta_.blobHash = blobhash(local.params.blobIndex); + require(meta_.blobHash != 0, L1_BLOB_NOT_FOUND()); + } else { + meta_.blobHash = keccak256(_txList); + emit CalldataTxList(meta_.id, _txList); + } + + local.tierProvider = ITierProvider( + ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)).getProvider( + local.b.numBlocks + ) + ); + + // Use the difficulty as a random number + meta_.minTier = local.tierProvider.getMinTier(meta_.proposer, uint256(meta_.difficulty)); + + // Create the block that will be stored onchain + TaikoData.BlockV2 memory blk = TaikoData.BlockV2({ + metaHash: keccak256(abi.encode(meta_)), + assignedProver: address(0), + livenessBond: 0, + blockId: local.b.numBlocks, + proposedAt: local.params.timestamp, // = params.timestamp post Ontake + proposedIn: local.params.anchorBlockId, // = params.anchorBlockId post Ontake + nextTransitionId: 1, // For a new block, the next transition ID is always 1, not 0. + livenessBondReturned: false, + // For unverified block, its verifiedTransitionId is always 0. + verifiedTransitionId: 0 + }); + + // Store the block in the ring buffer + _state.blocks[local.b.numBlocks % _config.blockRingBufferSize] = blk; + + // Increment the counter (cursor) by 1. + unchecked { + ++_state.slotB.numBlocks; + } + _state.slotB.lastProposedIn = uint56(block.number); + + LibBonds.debitBond(_state, _resolver, local.params.proposer, meta_.id, _config.livenessBond); + + emit BlockProposedV2(meta_.id, meta_); + } + + /// @dev Validates the parameters for proposing a block. + /// @param _state Pointer to the protocol's storage. + /// @param _config The configuration parameters for the Taiko protocol. + /// @param _local The local struct. + function _validateParams( + TaikoData.State storage _state, + TaikoData.Config memory _config, + Local memory _local + ) + private + view + { + unchecked { + if (_local.params.proposer == address(0)) { + _local.params.proposer = msg.sender; + } else { + require( + _local.params.proposer == msg.sender || _local.allowCustomProposer, + L1_INVALID_CUSTOM_PROPOSER() + ); + } + + if (_local.params.coinbase == address(0)) { + _local.params.coinbase = _local.params.proposer; + } + + if (_local.params.anchorBlockId == 0) { + _local.params.anchorBlockId = uint64(block.number - 1); + } + + if (_local.params.timestamp == 0) { + _local.params.timestamp = uint64(block.timestamp); + } + } + + // Verify params against the parent block. + TaikoData.BlockV2 storage parentBlk; + unchecked { + parentBlk = _state.blocks[(_local.b.numBlocks - 1) % _config.blockRingBufferSize]; + } + + // Verify the passed in L1 state block number to anchor. + require( + _local.params.anchorBlockId + _config.maxAnchorHeightOffset >= block.number, + L1_INVALID_ANCHOR_BLOCK() + ); + require(_local.params.anchorBlockId < block.number, L1_INVALID_ANCHOR_BLOCK()); + + // parentBlk.proposedIn is actually parent's params.anchorBlockId + require(_local.params.anchorBlockId >= parentBlk.proposedIn, L1_INVALID_ANCHOR_BLOCK()); + + // Verify the provided timestamp to anchor. Note that local.params.anchorBlockId and + // local.params.timestamp may not correspond to the same L1 block. + require( + _local.params.timestamp + _config.maxAnchorHeightOffset * SECONDS_PER_BLOCK + >= block.timestamp, + L1_INVALID_TIMESTAMP() + ); + require(_local.params.timestamp <= block.timestamp, L1_INVALID_TIMESTAMP()); + + // parentBlk.proposedAt is actually parent's params.timestamp + require(_local.params.timestamp >= parentBlk.proposedAt, L1_INVALID_TIMESTAMP()); + + // Check if parent block has the right meta hash. This is to allow the proposer to make sure + // the block builds on the expected latest chain state. + require( + _local.params.parentMetaHash == 0 || _local.params.parentMetaHash == parentBlk.metaHash, + L1_UNEXPECTED_PARENT() + ); + } + + /// @dev Encodes the base fee configuration into a bytes32. + /// @param _baseFeeConfig The base fee configuration. + /// @return The encoded base fee configuration. + function _encodeBaseFeeConfig(LibSharedData.BaseFeeConfig memory _baseFeeConfig) + private + pure + returns (bytes32) + { + return bytes32(uint256(_baseFeeConfig.sharingPctg)); + } +} diff --git a/packages/protocol/contracts/layer1/based/LibProving.sol b/packages/protocol/contracts/layer1/based/LibProving.sol new file mode 100644 index 00000000000..d5b26727daf --- /dev/null +++ b/packages/protocol/contracts/layer1/based/LibProving.sol @@ -0,0 +1,575 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../verifiers/IVerifier.sol"; +import "./LibBonds.sol"; +import "./LibData.sol"; +import "./LibUtils.sol"; +import "./LibVerifying.sol"; + +/// @title LibProving +/// @notice A library that offers helper functions for proving and contesting block transitions. +/// @custom:security-contact security@taiko.xyz +library LibProving { + using LibMath for uint256; + + // A struct to get around stack too deep issue and to cache state variables for multiple reads. + struct Local { + TaikoData.SlotB b; + ITierProvider.Tier tier; + ITierProvider.Tier minTier; + TaikoData.BlockMetadataV2 meta; + TaikoData.TierProof proof; + bytes32 metaHash; + uint64 slot; + uint64 blockId; + uint24 tid; + bool lastUnpausedAt; + bool isTopTier; + bool inProvingWindow; + bool sameTransition; + } + + /// @dev Emitted when a transition is proved. + /// @param blockId The block ID. + /// @param tran The transition data. + /// @param prover The prover's address. + /// @param validityBond The validity bond amount. + /// @param tier The tier of the proof. + /// @param proposedIn The L1 block in which a transition is proved. + event TransitionProvedV2( + uint256 indexed blockId, + TaikoData.Transition tran, + address prover, + uint96 validityBond, + uint16 tier, + uint64 proposedIn + ); + + /// @dev Emitted when a transition is contested. + /// @param blockId The block ID. + /// @param tran The transition data. + /// @param contester The contester's address. + /// @param contestBond The contest bond amount. + /// @param tier The tier of the proof. + /// @param proposedIn The L1 block in which this L2 block is proposed. + event TransitionContestedV2( + uint256 indexed blockId, + TaikoData.Transition tran, + address contester, + uint96 contestBond, + uint16 tier, + uint64 proposedIn + ); + + /// @dev Emitted when proving is paused or unpaused. + /// @param paused The pause status. + event ProvingPaused(bool paused); + + error L1_ALREADY_CONTESTED(); + error L1_ALREADY_PROVED(); + error L1_BLOCK_MISMATCH(); + error L1_CANNOT_CONTEST(); + error L1_DIFF_VERIFIER(); + error L1_INVALID_BLOCK_ID(); + error L1_INVALID_PARAMS(); + error L1_INVALID_PAUSE_STATUS(); + error L1_INVALID_TIER(); + error L1_INVALID_TRANSITION(); + error L1_NOT_ASSIGNED_PROVER(); + error L1_PROVING_PAUSED(); + + /// @dev Pauses or unpauses the proving process. + /// @param _state Pointer to the protocol's storage. + /// @param _pause The pause status. + function pauseProving(TaikoData.State storage _state, bool _pause) public { + require(_state.slotB.provingPaused != _pause, L1_INVALID_PAUSE_STATUS()); + _state.slotB.provingPaused = _pause; + + if (!_pause) { + _state.slotB.lastUnpausedAt = uint64(block.timestamp); + } + emit ProvingPaused(_pause); + } + + /// @dev Proves or contests multiple Taiko L2 blocks. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _resolver The address resolver. + /// @param _blockIds The index of the block to prove. This is also used to select the right + /// implementation version. + /// @param _inputs A list of abi-encoded (TaikoData.BlockMetadataV2, TaikoData.Transition, + /// TaikoData.TierProof) tuple. + /// @param _batchProof A list of abi-encoded TaikoData.TierProof that contains the + /// batch/aggregated proof for the given blocks. + function proveBlocks( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + uint64[] calldata _blockIds, + bytes[] calldata _inputs, + bytes calldata _batchProof + ) + public // Will reach contract size limit if changed to `internal` + { + require(_blockIds.length != 0, L1_INVALID_PARAMS()); + require(_blockIds.length == _inputs.length, L1_INVALID_PARAMS()); + + TaikoData.TierProof memory batchProof; + if (_batchProof.length != 0) { + batchProof = abi.decode(_batchProof, (TaikoData.TierProof)); + require(batchProof.tier != 0, L1_INVALID_TIER()); + } + + IVerifier.ContextV2[] memory ctxs = new IVerifier.ContextV2[](_blockIds.length); + bytes32 batchVerifierName; + bool batchVerifierNameSet; + + // This loop iterates over each block ID in the _blockIds array. For each block ID, it calls + // the _proveBlock function to get the context and verifier. + for (uint256 i; i < _blockIds.length; ++i) { + bytes32 _verifierName; + (ctxs[i], _verifierName) = + _proveBlock(_state, _config, _resolver, _blockIds[i], _inputs[i], batchProof); + + // Verify that if batchProof is used, the verifier is the same for all blocks. + if (batchProof.tier != 0) { + if (!batchVerifierNameSet) { + batchVerifierNameSet = true; + batchVerifierName = _verifierName; + } else { + require(batchVerifierName == _verifierName, L1_DIFF_VERIFIER()); + } + } + } + + // If batch verifier name is not empty, verify the batch proof. + if (batchVerifierName != LibStrings.B_TIER_OPTIMISTIC) { + IVerifier(_resolver.resolve(batchVerifierName, false)).verifyBatchProof( + ctxs, batchProof + ); + } + } + + /// @dev Proves or contests a single Taiko L2 block. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _resolver The address resolver. + /// @param _blockId The index of the block to prove. This is also used to select the right + /// implementation version. + /// @param _input An abi-encoded (TaikoData.BlockMetadataV2, TaikoData.Transition, + /// TaikoData.TierProof) tuple. + function proveBlock( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + uint64 _blockId, + bytes calldata _input + ) + public // Will reach contract size limit if changed to `internal` + { + TaikoData.TierProof memory noBatchProof; + _proveBlock(_state, _config, _resolver, _blockId, _input, noBatchProof); + } + + /// @dev Proves or contests a single Taiko L2 block. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _resolver The address resolver. + /// @param _blockId The index of the block to prove. This is also used to select the right + /// implementation version. + /// @param _input An abi-encoded (TaikoData.BlockMetadataV2, TaikoData.Transition, + /// TaikoData.TierProof) tuple. + /// @param _batchProof An abi-encoded TaikoData.TierProof that contains the batch/aggregated + /// proof for the given blocks. + /// @return ctx_ The context of the verifier. + /// @return verifierName_ The name of the verifier. + function _proveBlock( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + uint64 _blockId, + bytes calldata _input, + TaikoData.TierProof memory _batchProof + ) + private + returns (IVerifier.ContextV2 memory ctx_, bytes32 verifierName_) + { + Local memory local; + local.b = _state.slotB; + local.blockId = _blockId; + + if (_batchProof.tier == 0) { + // No batch proof is available, each transition is proving using a separate proof. + (local.meta, ctx_.tran, local.proof) = abi.decode( + _input, (TaikoData.BlockMetadataV2, TaikoData.Transition, TaikoData.TierProof) + ); + } else { + // All transitions are proving using the batch proof. + (local.meta, ctx_.tran) = + abi.decode(_input, (TaikoData.BlockMetadataV2, TaikoData.Transition)); + local.proof = _batchProof; + } + + require(ctx_.tran.parentHash != 0, L1_INVALID_TRANSITION()); + require(ctx_.tran.blockHash != 0, L1_INVALID_TRANSITION()); + require(ctx_.tran.stateRoot != 0, L1_INVALID_TRANSITION()); + + // Check that the block has been proposed but has not yet been verified. + require(_blockId == local.meta.id, L1_INVALID_BLOCK_ID()); + require(local.meta.id > local.b.lastVerifiedBlockId, L1_INVALID_BLOCK_ID()); + require(local.meta.id < local.b.numBlocks, L1_INVALID_BLOCK_ID()); + + local.slot = local.meta.id % _config.blockRingBufferSize; + TaikoData.BlockV2 storage blk = _state.blocks[local.slot]; + + local.metaHash = blk.metaHash; + + // Check the integrity of the block data. It's worth noting that in theory, this check may + // be skipped, but it's included for added caution. + require(local.metaHash == keccak256(abi.encode(local.meta)), L1_BLOCK_MISMATCH()); + + // Each transition is uniquely identified by the parentHash, with the blockHash and + // stateRoot open for later updates as higher-tier proofs become available. In cases where a + // transition with the specified parentHash does not exist, a new transition will be + // created. + TaikoData.TransitionState memory ts; + (local.tid, ts) = _fetchOrCreateTransition(_state, blk, ctx_.tran, local); + + // Reset a deprecated field. + ts.__reserved1 = 0; + + // The new proof must meet or exceed the minimum tier required by the block or the previous + // proof; it cannot be on a lower tier. + require(local.proof.tier != 0, L1_INVALID_TIER()); + require(local.proof.tier >= local.meta.minTier, L1_INVALID_TIER()); + require(local.proof.tier >= ts.tier, L1_INVALID_TIER()); + + // Retrieve the tier configurations. If the tier is not supported, the subsequent action + // will result in a revert. + { + ITierRouter tierRouter = ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); + ITierProvider tierProvider = ITierProvider(tierRouter.getProvider(local.blockId)); + + local.tier = tierProvider.getTier(local.proof.tier); + local.minTier = tierProvider.getTier(local.meta.minTier); + local.isTopTier = local.tier.contestBond == 0; + } + + local.inProvingWindow = !LibUtils.isPostDeadline({ + _tsTimestamp: ts.timestamp, + _lastUnpausedAt: local.b.lastUnpausedAt, + _windowMinutes: local.minTier.provingWindow + }); + + // Checks if only the assigned prover is permissioned to prove the block. The assigned + // prover is granted exclusive permission to prove only the first transition. + if ( + !local.isTopTier && ts.contester == address(0) && local.tid == 1 && ts.tier == 0 + && local.inProvingWindow + ) { + require(msg.sender == local.meta.proposer, L1_NOT_ASSIGNED_PROVER()); + } + // We must verify the proof, and any failure in proof verification will result in a revert. + // It's crucial to emphasize that the proof can be assessed in two potential modes: "proving + // mode" and "contesting mode." However, the precise verification logic is defined within + // each tier's IVerifier contract implementation. We simply specify to the verifier contract + // which mode it should utilize - if the new tier is higher than the previous tier, we + // employ the proving mode; otherwise, we employ the contesting mode (the new tier cannot be + // lower than the previous tier, this has been checked above). It's obvious that proof + // verification is entirely decoupled from Taiko's core protocol. + if (local.tier.verifierName != "") { + ctx_ = IVerifier.ContextV2({ + metaHash: local.metaHash, + blobHash: local.meta.blobHash, + // Separate msgSender to allow the prover to be any address in the future. + prover: msg.sender, + msgSender: msg.sender, + blockId: local.blockId, + isContesting: local.proof.tier == ts.tier && !local.isTopTier, + blobUsed: local.meta.blobUsed, + tran: ctx_.tran + }); + + verifierName_ = local.tier.verifierName; + + if (_batchProof.tier == 0) { + // In the case of per-transition proof, we verify the proof. + IVerifier(_resolver.resolve(local.tier.verifierName, false)).verifyProof( + LibData.verifierContextV2ToV1(ctx_), ctx_.tran, local.proof + ); + } + } + + if (LibUtils.isSyncBlock(_config.stateRootSyncInternal, local.blockId)) { + local.sameTransition = + ctx_.tran.blockHash == ts.blockHash && ctx_.tran.stateRoot == ts.stateRoot; + } else { + local.sameTransition = ctx_.tran.blockHash == ts.blockHash; + + // For non sync-block, we set the stateRoot to 0 before emitting it in events + ctx_.tran.stateRoot = 0; + } + + if (local.proof.tier > ts.tier) { + // Handles the case when an incoming tier is higher than the current transition's tier. + // Reverts when the incoming proof tries to prove the same transition + // (L1_ALREADY_PROVED). + _overrideWithHigherProof(_state, _resolver, blk, ts, ctx_.tran, local.proof, local); + + emit TransitionProvedV2({ + blockId: local.blockId, + tran: ctx_.tran, + prover: msg.sender, + validityBond: local.tier.validityBond, + tier: local.proof.tier, + proposedIn: local.meta.proposedIn + }); + } else { + // New transition and old transition on the same tier - and if this transaction tries to + // prove the same, it reverts + require(!local.sameTransition, L1_ALREADY_PROVED()); + + if (local.isTopTier) { + // The top tier prover re-proves. + assert(local.tier.validityBond == 0); + assert(ts.validityBond == 0 && ts.contester == address(0)); + + ts.prover = msg.sender; + ts.blockHash = ctx_.tran.blockHash; + ts.stateRoot = ctx_.tran.stateRoot; + + emit TransitionProvedV2({ + blockId: local.blockId, + tran: ctx_.tran, + prover: msg.sender, + validityBond: 0, + tier: local.proof.tier, + proposedIn: local.meta.proposedIn + }); + } else { + // Contesting but not on the highest tier + require(ts.contester == address(0), L1_ALREADY_CONTESTED()); + + // Making it a non-sliding window, relative when ts.timestamp was registered (or to + // lastUnpaused if that one is bigger) + require( + !LibUtils.isPostDeadline( + ts.timestamp, local.b.lastUnpausedAt, local.tier.cooldownWindow + ), + L1_CANNOT_CONTEST() + ); + + // Burn the contest bond from the prover. + LibBonds.debitBond( + _state, _resolver, msg.sender, local.blockId, local.tier.contestBond + ); + + // We retain the contest bond within the transition, just in case this configuration + // is altered to a different value before the contest is resolved. It's worth noting + // that the previous value of ts.contestBond doesn't have any significance. + ts.contestBond = local.tier.contestBond; + ts.contester = msg.sender; + + emit TransitionContestedV2({ + blockId: local.blockId, + tran: ctx_.tran, + contester: msg.sender, + contestBond: local.tier.contestBond, + tier: local.proof.tier, + proposedIn: local.meta.proposedIn + }); + } + } + + ts.timestamp = uint64(block.timestamp); + _state.transitions[local.slot][local.tid] = ts; + + if ( + !_state.slotB.provingPaused && LibUtils.shouldVerifyBlocks(_config, local.meta.id, true) + ) { + LibVerifying.verifyBlocks(_state, _config, _resolver, _config.maxBlocksToVerify); + } + } + + /// @dev Handle the transition initialization logic. + /// @param _state Pointer to the protocol's storage. + /// @param _blk Current TaikoData.BlockV2. + /// @param _tran Current TaikoData.Transition. + /// @param _local Current Local struct. + /// @return tid_ The transition ID. + /// @return ts_ The transition state. + function _fetchOrCreateTransition( + TaikoData.State storage _state, + TaikoData.BlockV2 storage _blk, + TaikoData.Transition memory _tran, + Local memory _local + ) + private + returns (uint24 tid_, TaikoData.TransitionState memory ts_) + { + tid_ = LibUtils.getTransitionId(_state, _blk, _local.slot, _tran.parentHash); + + if (tid_ == 0) { + // In cases where a transition with the provided parentHash is not found, we must + // essentially "create" one and set it to its initial state. This initial state can be + // viewed as a special transition on tier-0. Subsequently, we transform this tier-0 + // transition into a non-zero-tier transition with a proof. This approach ensures that + // the same logic is applicable for both 0-to-non-zero transition updates and + // non-zero-to-non-zero transition updates. + unchecked { + // Unchecked is safe: Not realistic 2**32 different fork choice per block will be + // proven and none of them is valid + tid_ = _blk.nextTransitionId++; + } + + // Keep in mind that state.transitions are also reusable storage slots, so it's + // necessary to reinitialize all transition fields below. + ts_.timestamp = _local.meta.proposedAt; + + if (tid_ == 1) { + // This approach serves as a cost-saving technique for the majority of blocks, where + // the first transition is expected to be the correct one. Writing to `transitions` + // is more economical since it resides in the ring buffer, whereas writing to + // `transitionIds` is not as cost-effective. + ts_.key = _tran.parentHash; + + // In the case of this first transition, the block's assigned prover has the + // privilege to re-prove it, but only when the assigned prover matches the previous + // prover. To ensure this, we establish the transition's prover as the block's + // assigned prover. Consequently, when we carry out a 0-to-non-zero transition + // update, the previous prover will consistently be the block's assigned prover. + // While alternative implementations are possible, introducing such changes would + // require additional if-else logic. + ts_.prover = _local.meta.proposer; + } else { + // Furthermore, we index the transition for future retrieval. It's worth emphasizing + // that this mapping for indexing is not reusable. However, given that the majority + // of blocks will only possess one transition — the correct one — we don't need + // to be concerned about the cost in this case. + + // There is no need to initialize ts.key here because it's only used when tid == 1 + _state.transitionIds[_local.blockId][_tran.parentHash] = tid_; + } + } else { + // A transition with the provided parentHash has been located. + ts_ = _state.transitions[_local.slot][tid_]; + } + } + + /// @dev Handles what happens when either the first transition is being proven or there is a + /// higher tier proof incoming. + /// @param _state Pointer to the protocol's storage. + /// @param _resolver The address resolver. + /// @param _blk Current TaikoData.BlockV2. + /// @param _ts Current TaikoData.TransitionState. + /// @param _tran Current TaikoData.Transition. + /// @param _proof Current TaikoData.TierProof. + /// @param _local Current Local struct. + function _overrideWithHigherProof( + TaikoData.State storage _state, + IAddressResolver _resolver, + TaikoData.BlockV2 storage _blk, + TaikoData.TransitionState memory _ts, + TaikoData.Transition memory _tran, + TaikoData.TierProof memory _proof, + Local memory _local + ) + private + { + // Higher tier proof overwriting lower tier proof + uint256 reward; // reward to the new (current) prover + + if (_ts.contester != address(0)) { + if (_local.sameTransition) { + // The contested transition is proven to be valid, contester loses the game + reward = _rewardAfterFriction(_ts.contestBond); + + // We return the validity bond back, but the original prover doesn't get any reward. + LibBonds.creditBond(_state, _ts.prover, _local.blockId, _ts.validityBond); + } else { + // The contested transition is proven to be invalid, contester wins the game. + // Contester gets 3/4 of reward, the new prover gets 1/4. + reward = _rewardAfterFriction(_ts.validityBond) >> 2; + unchecked { + LibBonds.creditBond( + _state, _ts.contester, _local.blockId, _ts.contestBond + reward * 3 + ); + } + } + } else { + require(!_local.sameTransition, L1_ALREADY_PROVED()); + + // The code below will be executed if 1) the transition is proved for the first time + // or 2) the transition is contested. + reward = _rewardAfterFriction(_ts.validityBond); + + if (!_blk.livenessBondReturned) { + _blk.livenessBondReturned = true; + + if (_returnLivenessBond(_local, _proof.data)) { + if (_local.meta.proposer == msg.sender) { + unchecked { + reward += _local.meta.livenessBond; + } + } else { + LibBonds.creditBond( + _state, _local.meta.proposer, _local.blockId, _local.meta.livenessBond + ); + } + } else { + // Reward a majority of liveness bond to the actual prover + unchecked { + reward += _rewardAfterFriction(_local.meta.livenessBond); + } + } + } + } + + unchecked { + if (reward > _local.tier.validityBond) { + LibBonds.creditBond( + _state, msg.sender, _local.blockId, reward - _local.tier.validityBond + ); + } else if (reward < _local.tier.validityBond) { + LibBonds.debitBond( + _state, _resolver, msg.sender, _local.blockId, _local.tier.validityBond - reward + ); + } + } + + _ts.validityBond = _local.tier.validityBond; + _ts.contester = address(0); + _ts.prover = msg.sender; + _ts.tier = _proof.tier; + + if (!_local.sameTransition) { + _ts.blockHash = _tran.blockHash; + _ts.stateRoot = _tran.stateRoot; + } + } + + /// @dev Returns the reward after applying 12.5% friction. + /// @param _amount The amount to apply friction to. + /// @return The reward after applying friction. + function _rewardAfterFriction(uint256 _amount) private pure returns (uint256) { + return (_amount * 7) >> 3; + } + + /// @dev Returns if the liveness bond shall be returned. + /// @param _local Current Local struct. + /// @param _proofData The proof data. + /// @return True if the liveness bond shall be returned, false otherwise. + function _returnLivenessBond( + Local memory _local, + bytes memory _proofData + ) + private + pure + returns (bool) + { + return _local.inProvingWindow && _local.tid == 1 + || _local.isTopTier && _proofData.length == 32 + && bytes32(_proofData) == LibStrings.H_RETURN_LIVENESS_BOND; + } +} diff --git a/packages/protocol/contracts/layer1/based/LibUtils.sol b/packages/protocol/contracts/layer1/based/LibUtils.sol new file mode 100644 index 00000000000..def7f9ca00c --- /dev/null +++ b/packages/protocol/contracts/layer1/based/LibUtils.sol @@ -0,0 +1,285 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/IAddressResolver.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibMath.sol"; +import "../tiers/ITierProvider.sol"; +import "../tiers/ITierRouter.sol"; +import "./TaikoData.sol"; + +/// @title LibUtils +/// @notice A library that offers utility helper functions. +/// @custom:security-contact security@taiko.xyz +library LibUtils { + using LibMath for uint256; + + uint256 internal constant SECONDS_IN_MINUTE = 60; + + /// @dev Emitted when a block is verified. + /// @param blockId The ID of the verified block. + /// @param prover The prover whose transition is used for verifying the block. + /// @param blockHash The hash of the verified block. + /// @param tier The tier ID of the proof. + event BlockVerifiedV2( + uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier + ); + + error L1_INVALID_BLOCK_ID(); + error L1_INVALID_PARAMS(); + error L1_INVALID_GENESIS_HASH(); + error L1_TRANSITION_NOT_FOUND(); + error L1_UNEXPECTED_TRANSITION_ID(); + + /// @dev Initializes the Taiko protocol state. + /// @param _state The state to initialize. + /// @param _genesisBlockHash The block hash of the genesis block. + function init(TaikoData.State storage _state, bytes32 _genesisBlockHash) public { + require(_genesisBlockHash != 0, L1_INVALID_GENESIS_HASH()); + // Init state + _state.slotA.genesisHeight = uint64(block.number); + _state.slotA.genesisTimestamp = uint64(block.timestamp); + _state.slotB.numBlocks = 1; + + // Init the genesis block + TaikoData.BlockV2 storage blk = _state.blocks[0]; + blk.nextTransitionId = 2; + blk.proposedAt = uint64(block.timestamp); + blk.proposedIn = uint64(block.number); + blk.verifiedTransitionId = 1; + blk.metaHash = bytes32(uint256(1)); // Give the genesis metahash a non-zero value. + + // Init the first state transition + TaikoData.TransitionState storage ts = _state.transitions[0][1]; + ts.blockHash = _genesisBlockHash; + ts.prover = address(0); + ts.timestamp = uint64(block.timestamp); + + emit BlockVerifiedV2({ + blockId: 0, + prover: address(0), + blockHash: _genesisBlockHash, + tier: 0 + }); + } + + /// @dev Retrieves a block's block hash and state root. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _blockId Id of the block. + /// @return blockHash_ The block's block hash. + /// @return stateRoot_ The block's storage root. + /// @return verifiedAt_ The timestamp when the block was proven at. + function getBlockInfo( + TaikoData.State storage _state, + TaikoData.Config memory _config, + uint64 _blockId + ) + public + view + returns (bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) + { + (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockId); + + if (blk.verifiedTransitionId != 0) { + TaikoData.TransitionState storage transition = + _state.transitions[slot][blk.verifiedTransitionId]; + + blockHash_ = transition.blockHash; + stateRoot_ = transition.stateRoot; + verifiedAt_ = transition.timestamp; + } + } + + /// @dev Gets the state transitions for a batch of block. For transition that doesn't exist, the + /// corresponding transition state will be empty. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _blockIds Id array of the blocks. + /// @param _parentHashes Parent hashes of the blocks. + /// @return transitions_ The state transition pointer array. + function getTransitions( + TaikoData.State storage _state, + TaikoData.Config memory _config, + uint64[] calldata _blockIds, + bytes32[] calldata _parentHashes + ) + public + view + returns (TaikoData.TransitionState[] memory transitions_) + { + require(_blockIds.length != 0, L1_INVALID_PARAMS()); + require(_blockIds.length == _parentHashes.length, L1_INVALID_PARAMS()); + transitions_ = new TaikoData.TransitionState[](_blockIds.length); + for (uint256 i; i < _blockIds.length; ++i) { + (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockIds[i]); + uint24 tid = getTransitionId(_state, blk, slot, _parentHashes[i]); + if (tid != 0) { + transitions_[i] = _state.transitions[slot][tid]; + } + } + } + + /// @dev Retrieves the transition with a given parentHash. + /// @dev This function will revert if the transition is not found. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _blockId Id of the block. + /// @param _parentHash Parent hash of the block. + /// @return The state transition pointer. + function getTransitionByParentHash( + TaikoData.State storage _state, + TaikoData.Config memory _config, + uint64 _blockId, + bytes32 _parentHash + ) + public + view + returns (TaikoData.TransitionState storage) + { + (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockId); + + uint24 tid = getTransitionId(_state, blk, slot, _parentHash); + require(tid != 0, L1_TRANSITION_NOT_FOUND()); + + return _state.transitions[slot][tid]; + } + + /// @dev Retrieves a block based on its ID. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _blockId Id of the block. + /// @return blk_ The block storage pointer. + /// @return slot_ The slot value. + function getBlock( + TaikoData.State storage _state, + TaikoData.Config memory _config, + uint64 _blockId + ) + internal + view + returns (TaikoData.BlockV2 storage blk_, uint64 slot_) + { + slot_ = _blockId % _config.blockRingBufferSize; + blk_ = _state.blocks[slot_]; + require(blk_.blockId == _blockId, L1_INVALID_BLOCK_ID()); + } + + /// @dev Retrieves the transition with a transition ID. + /// @dev This function will revert if the transition is not found. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _blockId Id of the block. + /// @param _tid The transition id. + /// @return The state transition pointer. + function getTransitionById( + TaikoData.State storage _state, + TaikoData.Config memory _config, + uint64 _blockId, + uint24 _tid + ) + internal + view + returns (TaikoData.TransitionState storage) + { + (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockId); + + require(_tid != 0, L1_TRANSITION_NOT_FOUND()); + require(_tid < blk.nextTransitionId, L1_TRANSITION_NOT_FOUND()); + return _state.transitions[slot][_tid]; + } + + /// @dev Retrieves the ID of the transition with a given parentHash. This function will return 0 + /// if the transition is not found. + /// @param _state Pointer to the protocol's storage. + /// @param _blk The block storage pointer. + /// @param _slot The slot value. + /// @param _parentHash The parent hash of the block. + /// @return tid_ The transition ID. + function getTransitionId( + TaikoData.State storage _state, + TaikoData.BlockV2 storage _blk, + uint64 _slot, + bytes32 _parentHash + ) + internal + view + returns (uint24 tid_) + { + if (_state.transitions[_slot][1].key == _parentHash) { + tid_ = 1; + require(tid_ < _blk.nextTransitionId, L1_UNEXPECTED_TRANSITION_ID()); + } else { + tid_ = _state.transitionIds[_blk.blockId][_parentHash]; + require(tid_ == 0 || tid_ < _blk.nextTransitionId, L1_UNEXPECTED_TRANSITION_ID()); + } + } + + /// @dev Checks if the current timestamp is past the deadline. + /// @param _tsTimestamp The timestamp to check. + /// @param _lastUnpausedAt The last unpaused timestamp. + /// @param _windowMinutes The window in minutes. + /// @return True if the current timestamp is past the deadline, false otherwise. + function isPostDeadline( + uint256 _tsTimestamp, + uint256 _lastUnpausedAt, + uint256 _windowMinutes + ) + internal + view + returns (bool) + { + unchecked { + uint256 deadline = + _tsTimestamp.max(_lastUnpausedAt) + _windowMinutes * SECONDS_IN_MINUTE; + return block.timestamp >= deadline; + } + } + + /// @dev Determines if blocks should be verified based on the configuration and block ID. + /// @param _config The TaikoData.Config. + /// @param _blockId The ID of the block. + /// @param _isBlockProposed Whether the block is proposed. + /// @return True if blocks should be verified, false otherwise. + function shouldVerifyBlocks( + TaikoData.Config memory _config, + uint64 _blockId, + bool _isBlockProposed + ) + internal + pure + returns (bool) + { + if (_config.maxBlocksToVerify == 0) return false; + // If maxBlocksToVerify = 16, segmentSize = 8, verification will be triggered by + // proposeBlock(s) for blocks 0, 8, 16, 24, ..., and by proveBlock(s) for blocks 4, 12, 20, + // 28, ... + uint256 segmentSize = _config.maxBlocksToVerify >> 1; + + if (segmentSize <= 1) return true; + + return _blockId % segmentSize == (_isBlockProposed ? 0 : segmentSize >> 1); + } + + /// @dev Determines if the state root should be synchronized based on the configuration and + /// block ID. + /// @param _stateRootSyncInternal The state root sync interval. + /// @param _blockId The ID of the block. + /// @return True if the state root should be synchronized, false otherwise. + function isSyncBlock( + uint256 _stateRootSyncInternal, + uint256 _blockId + ) + internal + pure + returns (bool) + { + if (_stateRootSyncInternal <= 1) return true; + unchecked { + // We could use `_blockId % _stateRootSyncInternal == 0`, but this will break many unit + // tests as in most of these tests, we test block#1, so by setting + // config._stateRootSyncInternal = 2, we can keep the tests unchanged. + return _blockId % _stateRootSyncInternal == _stateRootSyncInternal - 1; + } + } +} diff --git a/packages/protocol/contracts/layer1/based/LibVerifying.sol b/packages/protocol/contracts/layer1/based/LibVerifying.sol new file mode 100644 index 00000000000..a4a8833f0aa --- /dev/null +++ b/packages/protocol/contracts/layer1/based/LibVerifying.sol @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/signal/ISignalService.sol"; +import "./LibBonds.sol"; +import "./LibUtils.sol"; + +/// @title LibVerifying +/// @notice A library that offers helper functions for verifying blocks. +/// @custom:security-contact security@taiko.xyz +library LibVerifying { + using LibMath for uint256; + + struct Local { + TaikoData.SlotB b; + uint64 blockId; + uint64 slot; + uint64 numBlocksVerified; + uint24 tid; + uint24 lastVerifiedTransitionId; + uint16 tier; + bytes32 blockHash; + bytes32 syncStateRoot; + uint64 syncBlockId; + uint24 syncTransitionId; + address prover; + ITierRouter tierRouter; + } + + error L1_BLOCK_MISMATCH(); + error L1_TRANSITION_ID_ZERO(); + + /// @dev Verifies up to N blocks. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _resolver The address resolver. + /// @param _maxBlocksToVerify The maximum number of blocks to verify. + function verifyBlocks( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + uint64 _maxBlocksToVerify + ) + internal + { + if (_maxBlocksToVerify == 0) { + return; + } + + Local memory local; + local.b = _state.slotB; + local.blockId = local.b.lastVerifiedBlockId; + local.slot = local.blockId % _config.blockRingBufferSize; + + TaikoData.BlockV2 storage blk = _state.blocks[local.slot]; + require(blk.blockId == local.blockId, L1_BLOCK_MISMATCH()); + + local.lastVerifiedTransitionId = blk.verifiedTransitionId; + local.tid = local.lastVerifiedTransitionId; + + // The following scenario should never occur but is included as a precaution. + require(local.tid != 0, L1_TRANSITION_ID_ZERO()); + + // The `blockHash` variable represents the most recently trusted blockHash on L2. + local.blockHash = _state.transitions[local.slot][local.tid].blockHash; + + // Unchecked is safe: - assignment is within ranges - blockId and numBlocksVerified values + // incremented will still be OK in the next 584K years if we verify one block per every + // second + unchecked { + ++local.blockId; + + while ( + local.blockId < local.b.numBlocks && local.numBlocksVerified < _maxBlocksToVerify + ) { + local.slot = local.blockId % _config.blockRingBufferSize; + + blk = _state.blocks[local.slot]; + require(blk.blockId == local.blockId, L1_BLOCK_MISMATCH()); + + local.tid = LibUtils.getTransitionId(_state, blk, local.slot, local.blockHash); + // When `tid` is 0, it indicates that there is no proven transition with its + // parentHash equal to the blockHash of the most recently verified block. + if (local.tid == 0) break; + + // A transition with the correct `parentHash` has been located. + TaikoData.TransitionState storage ts = _state.transitions[local.slot][local.tid]; + + // It's not possible to verify this block if either the transition is contested and + // awaiting higher-tier proof or if the transition is still within its cooldown + // period. + local.tier = ts.tier; + + if (ts.contester != address(0)) { + break; + } + + if (local.tierRouter == ITierRouter(address(0))) { + local.tierRouter = + ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); + } + + uint24 cooldown = ITierProvider(local.tierRouter.getProvider(local.blockId)).getTier( + local.tier + ).cooldownWindow; + + if (!LibUtils.isPostDeadline(ts.timestamp, local.b.lastUnpausedAt, cooldown)) { + // If cooldownWindow is 0, the block can theoretically be proved and verified + // within the same L1 block. + break; + } + + // Update variables + local.lastVerifiedTransitionId = local.tid; + local.blockHash = ts.blockHash; + local.prover = ts.prover; + + LibBonds.creditBond(_state, local.prover, local.blockId, ts.validityBond); + + // Note: We exclusively address the bonds linked to the transition used for + // verification. While there may exist other transitions for this block, we + // disregard them entirely. The bonds for these other transitions are burned (more + // precisely held in custody) either when the transitions are generated or proven. In + // such cases, both the provers and contesters of those transitions forfeit their + // bonds. + + emit LibUtils.BlockVerifiedV2({ + blockId: local.blockId, + prover: local.prover, + blockHash: local.blockHash, + tier: local.tier + }); + + if (LibUtils.isSyncBlock(_config.stateRootSyncInternal, local.blockId)) { + bytes32 stateRoot = ts.stateRoot; + if (stateRoot != 0) { + local.syncStateRoot = stateRoot; + local.syncBlockId = local.blockId; + local.syncTransitionId = local.tid; + } + } + + ++local.blockId; + ++local.numBlocksVerified; + } + + if (local.numBlocksVerified != 0) { + uint64 lastVerifiedBlockId = local.b.lastVerifiedBlockId + local.numBlocksVerified; + local.slot = lastVerifiedBlockId % _config.blockRingBufferSize; + + _state.slotB.lastVerifiedBlockId = lastVerifiedBlockId; + _state.blocks[local.slot].verifiedTransitionId = local.lastVerifiedTransitionId; + + if (local.syncStateRoot != 0) { + _state.slotA.lastSyncedBlockId = local.syncBlockId; + _state.slotA.lastSynecdAt = uint64(block.timestamp); + + // We write the synced block's verifiedTransitionId to storage + if (local.syncBlockId != lastVerifiedBlockId) { + local.slot = local.syncBlockId % _config.blockRingBufferSize; + _state.blocks[local.slot].verifiedTransitionId = local.syncTransitionId; + } + + // Ask signal service to write cross chain signal + ISignalService(_resolver.resolve(LibStrings.B_SIGNAL_SERVICE, false)) + .syncChainData( + _config.chainId, + LibStrings.H_STATE_ROOT, + local.syncBlockId, + local.syncStateRoot + ); + } + } + } + } + + /// @dev Retrieves the prover of a verified block. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _blockId The ID of the block. + /// @return The address of the prover. + function getVerifiedBlockProver( + TaikoData.State storage _state, + TaikoData.Config memory _config, + uint64 _blockId + ) + internal + view + returns (address) + { + (TaikoData.BlockV2 storage blk,) = LibUtils.getBlock(_state, _config, _blockId); + + uint24 tid = blk.verifiedTransitionId; + if (tid == 0) return address(0); + + return LibUtils.getTransitionById(_state, _config, _blockId, tid).prover; + } +} diff --git a/packages/protocol/contracts/layer1/based/TaikoData.sol b/packages/protocol/contracts/layer1/based/TaikoData.sol new file mode 100644 index 00000000000..893e6c7cb3c --- /dev/null +++ b/packages/protocol/contracts/layer1/based/TaikoData.sol @@ -0,0 +1,215 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/data/LibSharedData.sol"; + +/// @title TaikoData +/// @notice This library defines various data structures used in the Taiko protocol. +/// @custom:security-contact security@taiko.xyz +library TaikoData { + /// @notice Struct holding Taiko configuration parameters. See {TaikoConfig}. + struct Config { + /// @notice The chain ID of the network where Taiko contracts are deployed. + uint64 chainId; + /// @notice The maximum number of verifications allowed when a block is proposed or proved. + uint64 blockMaxProposals; + /// @notice Size of the block ring buffer, allowing extra space for proposals. + uint64 blockRingBufferSize; + /// @notice The maximum number of verifications allowed when a block is proposed or proved. + uint64 maxBlocksToVerify; + /// @notice The maximum gas limit allowed for a block. + uint32 blockMaxGasLimit; + /// @notice The amount of Taiko token as a prover liveness bond. + uint96 livenessBond; + /// @notice The number of L2 blocks between each L2-to-L1 state root sync. + uint8 stateRootSyncInternal; + /// @notice The max differences of the anchor height and the current block number. + uint64 maxAnchorHeightOffset; + /// @notice Base fee configuration + LibSharedData.BaseFeeConfig baseFeeConfig; + /// @notie The Ontake fork height on L2. + uint64 ontakeForkHeight; + } + + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice A proof and the tier of proof it belongs to. + struct TierProof { + uint16 tier; + bytes data; + } + + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Hook and its data (currently used only during proposeBlock) + struct HookCall { + address hook; + bytes data; + } + + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Represents proposeBlock's _data input parameter + struct BlockParams { + address assignedProver; // DEPRECATED, value ignored. + address coinbase; + bytes32 extraData; + bytes32 parentMetaHash; + HookCall[] hookCalls; // DEPRECATED, value ignored. + bytes signature; // DEPRECATED, value ignored. + } + + struct BlockParamsV2 { + address proposer; + address coinbase; + bytes32 parentMetaHash; + uint64 anchorBlockId; // NEW + uint64 timestamp; // NEW + uint32 blobTxListOffset; // NEW + uint32 blobTxListLength; // NEW + uint8 blobIndex; // NEW + } + + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Struct containing data only required for proving a block + /// @notice Note: On L2, `block.difficulty` is the pseudo name of `block.prevrandao`, which + /// returns a random number provided by the layer 1 chain. + struct BlockMetadata { + bytes32 l1Hash; + bytes32 difficulty; + bytes32 blobHash; //or txListHash (if Blob not yet supported) + bytes32 extraData; + bytes32 depositsHash; + address coinbase; // L2 coinbase, + uint64 id; + uint32 gasLimit; + uint64 timestamp; + uint64 l1Height; + uint16 minTier; + bool blobUsed; + bytes32 parentMetaHash; + address sender; // a.k.a proposer + } + + struct BlockMetadataV2 { + bytes32 anchorBlockHash; // `_l1BlockHash` in TaikoL2's anchor tx. + bytes32 difficulty; + bytes32 blobHash; + bytes32 extraData; + address coinbase; + uint64 id; + uint32 gasLimit; + uint64 timestamp; + uint64 anchorBlockId; // `_l1BlockId` in TaikoL2's anchor tx. + uint16 minTier; + bool blobUsed; + bytes32 parentMetaHash; + address proposer; + uint96 livenessBond; + uint64 proposedAt; // Used by node/client post block proposal. + uint64 proposedIn; // Used by node/client post block proposal. + uint32 blobTxListOffset; + uint32 blobTxListLength; + uint8 blobIndex; + LibSharedData.BaseFeeConfig baseFeeConfig; + } + + /// @notice Struct representing transition to be proven. + struct Transition { + bytes32 parentHash; + bytes32 blockHash; + bytes32 stateRoot; + bytes32 graffiti; // Arbitrary data that the prover can use for various purposes. + } + + /// @notice Struct representing state transition data. + /// @notice 6 slots used. + struct TransitionState { + bytes32 key; // slot 1, only written/read for the 1st state transition. + bytes32 blockHash; // slot 2 + bytes32 stateRoot; // slot 3 + address prover; // slot 4 + uint96 validityBond; + address contester; // slot 5 + uint96 contestBond; + uint64 timestamp; // slot 6 (88 bits) + uint16 tier; + uint8 __reserved1; + } + + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Struct containing data required for verifying a block. + /// @notice 3 slots used. + struct Block { + bytes32 metaHash; // slot 1 + address assignedProver; + uint96 livenessBond; + uint64 blockId; // slot 3 + uint64 proposedAt; + uint64 proposedIn; + uint32 nextTransitionId; + // The ID of the transaction that is used to verify this block. However, if this block is + // not verified as the last block in a batch, verifiedTransitionId will remain zero. + uint32 verifiedTransitionId; + } + + /// @notice Struct containing data required for verifying a block. + /// @notice 3 slots used. + struct BlockV2 { + bytes32 metaHash; // slot 1 + address assignedProver; // DEPRECATED!!! + uint96 livenessBond; // DEPRECATED!!! + uint64 blockId; // slot 3 + uint64 proposedAt; // Now represents L2 block's timestamp + uint64 proposedIn; // Now represents L2 block's anchorBlockId + uint24 nextTransitionId; + bool livenessBondReturned; + // The ID of the transaction that is used to verify this block. However, if this block is + // not verified as the last block in a batch, verifiedTransitionId will remain zero. + uint24 verifiedTransitionId; + } + + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Struct representing an Ethereum deposit. + /// @notice 2 slot used. Currently removed from protocol, but to be backwards compatible, the + /// struct and return values stayed for now. + struct EthDeposit { + address recipient; + uint96 amount; + uint64 id; + } + + /// @notice Forge is only able to run coverage in case the contracts by default capable of + /// compiling without any optimization (neither optimizer runs, no compiling --via-ir flag). + /// @notice In order to resolve stack too deep without optimizations, we needed to introduce + /// outsourcing vars into structs below. + struct SlotA { + uint64 genesisHeight; + uint64 genesisTimestamp; + uint64 lastSyncedBlockId; + uint64 lastSynecdAt; // known typo (lastSyncedAt) + } + + struct SlotB { + uint64 numBlocks; + uint64 lastVerifiedBlockId; + bool provingPaused; + uint56 lastProposedIn; + uint64 lastUnpausedAt; + } + + /// @notice Struct holding the state variables for the {TaikoL1} contract. + struct State { + // Ring buffer for proposed blocks and a some recent verified blocks. + mapping(uint64 blockId_mod_blockRingBufferSize => BlockV2 blk) blocks; + // Indexing to transition ids (ring buffer not possible) + mapping(uint64 blockId => mapping(bytes32 parentHash => uint24 transitionId)) transitionIds; + // Ring buffer for transitions + mapping( + uint64 blockId_mod_blockRingBufferSize + => mapping(uint24 transitionId => TransitionState ts) + ) transitions; + bytes32 __reserve1; // Used as a ring buffer for Ether deposits + SlotA slotA; // slot 5 + SlotB slotB; // slot 6 + mapping(address account => uint256 bond) bondBalance; + uint256[43] __gap; + } +} diff --git a/packages/protocol/contracts/layer1/based/TaikoEvents.sol b/packages/protocol/contracts/layer1/based/TaikoEvents.sol new file mode 100644 index 00000000000..9abfb9d6888 --- /dev/null +++ b/packages/protocol/contracts/layer1/based/TaikoEvents.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoData.sol"; + +/// @title TaikoEvents +/// @notice This abstract contract provides event declarations for the Taiko protocol, which are +/// emitted during block proposal, proof, verification, and Ethereum deposit processes. +/// @dev The events defined here must match the definitions in the corresponding L1 libraries. +/// @custom:security-contact security@taiko.xyz +abstract contract TaikoEvents { + /// @notice Emitted when tokens are deposited into a user's bond balance. + /// @param user The address of the user who deposited the tokens. + /// @param amount The amount of tokens deposited. + event BondDeposited(address indexed user, uint256 amount); + + /// @notice Emitted when tokens are withdrawn from a user's bond balance. + /// @param user The address of the user who withdrew the tokens. + /// @param amount The amount of tokens withdrawn. + event BondWithdrawn(address indexed user, uint256 amount); + + /// @notice Emitted when a token is credited back to a user's bond balance. + /// @param user The address of the user whose bond balance is credited. + /// @param blockId The ID of the block to credit for. + /// @param amount The amount of tokens credited. + event BondCredited(address indexed user, uint256 blockId, uint256 amount); + + /// @notice Emitted when a token is debited from a user's bond balance. + /// @param user The address of the user whose bond balance is debited. + /// @param blockId The ID of the block to debit for. + /// @param amount The amount of tokens debited. + event BondDebited(address indexed user, uint256 blockId, uint256 amount); + + /// @notice DEPRECATED but used by node/client for syncing old blocks. Emitted when a block is + /// proposed. + /// @param blockId The ID of the proposed block. + /// @param assignedProver The address of the assigned prover. + /// @param livenessBond The liveness bond of the proposed block. + /// @param meta The metadata of the proposed block. + /// @param depositsProcessed The EthDeposit array about processed deposits in this proposed + /// block. + event BlockProposed( + uint256 indexed blockId, + address indexed assignedProver, + uint96 livenessBond, + TaikoData.BlockMetadata meta, + TaikoData.EthDeposit[] depositsProcessed + ); + + /// @notice Emitted when a block is proposed. + /// @param blockId The ID of the proposed block. + /// @param meta The metadata of the proposed block. + event BlockProposedV2(uint256 indexed blockId, TaikoData.BlockMetadataV2 meta); + + /// @notice Emitted when a block's txList is in the calldata. + /// @param blockId The ID of the proposed block. + /// @param txList The txList. + event CalldataTxList(uint256 indexed blockId, bytes txList); + + /// @notice DEPRECATED but used by node/client for syncing old blocks. Emitted when a transition + /// is proved. + /// @param blockId The block ID. + /// @param tran The transition data. + /// @param prover The prover's address. + /// @param validityBond The validity bond amount. + /// @param tier The tier of the proof. + event TransitionProved( + uint256 indexed blockId, + TaikoData.Transition tran, + address prover, + uint96 validityBond, + uint16 tier + ); + + /// @notice Emitted when a transition is proved. + /// @param blockId The block ID. + /// @param tran The transition data. + /// @param prover The prover's address. + /// @param validityBond The validity bond amount. + /// @param tier The tier of the proof. + /// @param proposedIn The L1 block in which a transition is proved. + event TransitionProvedV2( + uint256 indexed blockId, + TaikoData.Transition tran, + address prover, + uint96 validityBond, + uint16 tier, + uint64 proposedIn + ); + + /// @notice DEPRECATED but used by node/client for syncing old blocks. Emitted when a transition + /// is contested. + /// @param blockId The block ID. + /// @param tran The transition data. + /// @param contester The contester's address. + /// @param contestBond The contest bond amount. + /// @param tier The tier of the proof. + event TransitionContested( + uint256 indexed blockId, + TaikoData.Transition tran, + address contester, + uint96 contestBond, + uint16 tier + ); + + /// @notice Emitted when a transition is contested. + /// @param blockId The block ID. + /// @param tran The transition data. + /// @param contester The contester's address. + /// @param contestBond The contest bond amount. + /// @param tier The tier of the proof. + /// @param proposedIn The L1 block in which this L2 block is proposed. + event TransitionContestedV2( + uint256 indexed blockId, + TaikoData.Transition tran, + address contester, + uint96 contestBond, + uint16 tier, + uint64 proposedIn + ); + + /// @notice Emitted when proving is paused or unpaused. + /// @param paused The pause status. + event ProvingPaused(bool paused); + + /// @notice DEPRECATED but used by node/client for syncing old blocks. Emitted when a block is + /// verified. + /// @param blockId The ID of the verified block. + /// @param prover The prover whose transition is used for verifying the block. + /// @param blockHash The hash of the verified block. + /// @param stateRoot Deprecated and is always zero. + /// @param tier The tier ID of the proof. + event BlockVerified( + uint256 indexed blockId, + address indexed prover, + bytes32 blockHash, + bytes32 stateRoot, + uint16 tier + ); + + /// @notice Emitted when a block is verified. + /// @param blockId The ID of the verified block. + /// @param prover The prover whose transition is used for verifying the block. + /// @param blockHash The hash of the verified block. + /// @param tier The tier ID of the proof. + event BlockVerifiedV2( + uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier + ); + + /// @notice Emitted when some state variable values changed. + /// @dev This event is currently used by Taiko node/client for block proposal/proving. + /// @param slotB The SlotB data structure. + event StateVariablesUpdated(TaikoData.SlotB slotB); +} diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol new file mode 100644 index 00000000000..0a1175e5fce --- /dev/null +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -0,0 +1,325 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; +import "src/shared/common/EssentialContract.sol"; +import "./LibData.sol"; +import "./LibProposing.sol"; +import "./LibProving.sol"; +import "./LibVerifying.sol"; +import "./TaikoEvents.sol"; +import "./ITaikoL1.sol"; + +/// @title TaikoL1 +/// @notice This contract serves as the "base layer contract" of the Taiko protocol, providing +/// functionalities for proposing, proving, and verifying blocks. The term "base layer contract" +/// means that although this is usually deployed on L1, it can also be deployed on L2s to create +/// L3s. The contract also handles the deposit and withdrawal of Taiko tokens and Ether. +/// Additionally, this contract doesn't hold any Ether. Ether deposited to L2 are held by the Bridge +/// contract. +/// @dev Labeled in AddressResolver as "taiko" +/// @custom:security-contact security@taiko.xyz +contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { + /// @notice The TaikoL1 state. + TaikoData.State public state; + + uint256[50] private __gap; + + error L1_FORK_HEIGHT_ERROR(); + + modifier whenProvingNotPaused() { + require(!state.slotB.provingPaused, LibProving.L1_PROVING_PAUSED()); + _; + } + + modifier emitEventForClient() { + _; + emit StateVariablesUpdated(state.slotB); + } + + /// @notice Initializes the contract. + /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. + /// @param _rollupAddressManager The address of the {AddressManager} contract. + /// @param _genesisBlockHash The block hash of the genesis block. + /// @param _toPause true to pause the contract by default. + function init( + address _owner, + address _rollupAddressManager, + bytes32 _genesisBlockHash, + bool _toPause + ) + external + initializer + { + __Essential_init(_owner, _rollupAddressManager); + LibUtils.init(state, _genesisBlockHash); + if (_toPause) _pause(); + } + + /// @notice This function shall be called by previously deployed contracts. + function init2() external onlyOwner reinitializer(2) { + state.__reserve1 = 0; + } + + /// @notice This function shall be called by previously deployed contracts. + function init3() external onlyOwner reinitializer(3) { + // this value from EssentialContract is no longer used. + __lastUnpausedAt = 0; + } + + /// @inheritdoc ITaikoL1 + function proposeBlockV2( + bytes calldata _params, + bytes calldata _txList + ) + external + whenNotPaused + nonReentrant + emitEventForClient + returns (TaikoData.BlockMetadataV2 memory meta_) + { + TaikoData.Config memory config = getConfig(); + return LibProposing.proposeBlock(state, config, this, _params, _txList); + } + + /// @inheritdoc ITaikoL1 + function proposeBlocksV2( + bytes[] calldata _paramsArr, + bytes[] calldata _txListArr + ) + external + whenNotPaused + nonReentrant + emitEventForClient + returns (TaikoData.BlockMetadataV2[] memory metaArr_) + { + TaikoData.Config memory config = getConfig(); + return LibProposing.proposeBlocks(state, config, this, _paramsArr, _txListArr); + } + + /// @inheritdoc ITaikoL1 + function proveBlock( + uint64 _blockId, + bytes calldata _input + ) + external + whenNotPaused + whenProvingNotPaused + nonReentrant + emitEventForClient + { + LibProving.proveBlock(state, getConfig(), this, _blockId, _input); + } + + /// @inheritdoc ITaikoL1 + function proveBlocks( + uint64[] calldata _blockIds, + bytes[] calldata _inputs, + bytes calldata _batchProof + ) + external + whenNotPaused + whenProvingNotPaused + nonReentrant + emitEventForClient + { + LibProving.proveBlocks(state, getConfig(), this, _blockIds, _inputs, _batchProof); + } + + /// @inheritdoc ITaikoL1 + function verifyBlocks(uint64 _maxBlocksToVerify) + external + whenNotPaused + whenProvingNotPaused + nonReentrant + emitEventForClient + { + LibVerifying.verifyBlocks(state, getConfig(), this, _maxBlocksToVerify); + } + + /// @inheritdoc ITaikoL1 + function pauseProving(bool _pause) external { + _authorizePause(msg.sender, _pause); + LibProving.pauseProving(state, _pause); + } + + /// @inheritdoc ITaikoL1 + function depositBond(uint256 _amount) external payable whenNotPaused { + LibBonds.depositBond(state, this, _amount); + } + + /// @inheritdoc ITaikoL1 + function withdrawBond(uint256 _amount) external whenNotPaused { + LibBonds.withdrawBond(state, this, _amount); + } + + /// @notice Unpauses the contract. + function unpause() public override whenPaused { + _authorizePause(msg.sender, false); + __paused = _FALSE; + state.slotB.lastUnpausedAt = uint64(block.timestamp); + emit Unpaused(msg.sender); + } + + /// @notice Gets the current bond balance of a given address. + /// @param _user The address of the user. + /// @return The current bond balance. + function bondBalanceOf(address _user) external view returns (uint256) { + return LibBonds.bondBalanceOf(state, _user); + } + + /// @inheritdoc ITaikoL1 + function getVerifiedBlockProver(uint64 _blockId) external view returns (address prover_) { + return LibVerifying.getVerifiedBlockProver(state, getConfig(), _blockId); + } + + /// @notice Gets the details of a block. + /// @param _blockId Index of the block. + /// @return blk_ The block. + function getBlock(uint64 _blockId) external view returns (TaikoData.Block memory blk_) { + require(_blockId < getConfig().ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); + + (TaikoData.BlockV2 memory blk,) = LibUtils.getBlock(state, getConfig(), _blockId); + blk_ = LibData.blockV2ToV1(blk); + } + + /// @inheritdoc ITaikoL1 + function getBlockV2(uint64 _blockId) external view returns (TaikoData.BlockV2 memory blk_) { + require(_blockId >= getConfig().ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); + + (blk_,) = LibUtils.getBlock(state, getConfig(), _blockId); + } + + /// @notice This function will revert if the transition is not found. This function will revert + /// if the transition is not found. + /// @param _blockId Index of the block. + /// @param _parentHash Parent hash of the block. + /// @return The state transition data of the block. + function getTransition( + uint64 _blockId, + bytes32 _parentHash + ) + external + view + returns (TaikoData.TransitionState memory) + { + return LibUtils.getTransitionByParentHash(state, getConfig(), _blockId, _parentHash); + } + + /// @notice Gets the state transitions for a batch of block. For transition that doesn't exist, + /// the corresponding transition state will be empty. + /// @param _blockIds Index of the blocks. + /// @param _parentHashes Parent hashes of the blocks. + /// @return The state transition array of the blocks. Note that a transition's state root will + /// be zero if the block is not a sync-block. + function getTransitions( + uint64[] calldata _blockIds, + bytes32[] calldata _parentHashes + ) + external + view + returns (TaikoData.TransitionState[] memory) + { + return LibUtils.getTransitions(state, getConfig(), _blockIds, _parentHashes); + } + + /// @inheritdoc ITaikoL1 + function getTransition( + uint64 _blockId, + uint32 _tid + ) + external + view + returns (TaikoData.TransitionState memory) + { + return LibUtils.getTransitionById( + state, getConfig(), _blockId, SafeCastUpgradeable.toUint24(_tid) + ); + } + + /// @notice Returns information about the last verified block. + /// @return blockId_ The last verified block's ID. + /// @return blockHash_ The last verified block's blockHash. + /// @return stateRoot_ The last verified block's stateRoot. + /// @return verifiedAt_ The timestamp this block is proven at. + function getLastVerifiedBlock() + external + view + returns (uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) + { + blockId_ = state.slotB.lastVerifiedBlockId; + (blockHash_, stateRoot_, verifiedAt_) = LibUtils.getBlockInfo(state, getConfig(), blockId_); + } + + /// @notice Returns information about the last synchronized block. + /// @return blockId_ The last verified block's ID. + /// @return blockHash_ The last verified block's blockHash. + /// @return stateRoot_ The last verified block's stateRoot. + /// @return verifiedAt_ The timestamp this block is proven at. + function getLastSyncedBlock() + external + view + returns (uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) + { + blockId_ = state.slotA.lastSyncedBlockId; + (blockHash_, stateRoot_, verifiedAt_) = LibUtils.getBlockInfo(state, getConfig(), blockId_); + } + + /// @notice Gets the state variables of the TaikoL1 contract. + /// @dev This method can be deleted once node/client stops using it. + /// @return State variables stored at SlotA. + /// @return State variables stored at SlotB. + function getStateVariables() + external + view + returns (TaikoData.SlotA memory, TaikoData.SlotB memory) + { + return (state.slotA, state.slotB); + } + + /// @notice Returns the timestamp of the last unpaused state. + /// @return The timestamp of the last unpaused state. + function lastUnpausedAt() public view override returns (uint64) { + return state.slotB.lastUnpausedAt; + } + + /// @notice Retrieves the ID of the L1 block where the most recent L2 block was proposed. + /// @return The ID of the Li block where the most recent block was proposed. + function lastProposedIn() external view returns (uint56) { + return state.slotB.lastProposedIn; + } + + /// @inheritdoc ITaikoL1 + function getConfig() public pure virtual returns (TaikoData.Config memory) { + return TaikoData.Config({ + chainId: LibNetwork.TAIKO_MAINNET, + blockMaxProposals: 324_000, // = 7200 * 45 + blockRingBufferSize: 360_000, // = 7200 * 50 + maxBlocksToVerify: 16, + blockMaxGasLimit: 240_000_000, + livenessBond: 125e18, // 125 Taiko token + stateRootSyncInternal: 16, + maxAnchorHeightOffset: 64, + baseFeeConfig: LibSharedData.BaseFeeConfig({ + adjustmentQuotient: 8, + sharingPctg: 75, + gasIssuancePerSecond: 5_000_000, + minGasExcess: 1_340_000_000, + maxGasIssuancePerBlock: 600_000_000 // two minutes + }), + ontakeForkHeight: 0 + }); + } + + /// @dev chain watchdog is supposed to be a cold wallet. + function _authorizePause( + address, + bool + ) + internal + view + virtual + override + onlyFromOwnerOrNamed(LibStrings.B_CHAIN_WATCHDOG) + { } +} diff --git a/packages/protocol/contracts/layer1/devnet/DevnetTaikoL1.sol b/packages/protocol/contracts/layer1/devnet/DevnetTaikoL1.sol new file mode 100644 index 00000000000..f5f7ce2b21b --- /dev/null +++ b/packages/protocol/contracts/layer1/devnet/DevnetTaikoL1.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../based/TaikoL1.sol"; + +/// @title DevnetTaikoL1 +/// @dev Labeled in AddressResolver as "taiko" +/// @custom:security-contact security@taiko.xyz +contract DevnetTaikoL1 is TaikoL1 { + /// @inheritdoc ITaikoL1 + function getConfig() public pure override returns (TaikoData.Config memory) { + return TaikoData.Config({ + chainId: 167_001, + blockMaxProposals: 324_000, + blockRingBufferSize: 360_000, + maxBlocksToVerify: 16, + blockMaxGasLimit: 240_000_000, + livenessBond: 125e18, // 125 Taiko token + stateRootSyncInternal: 16, + maxAnchorHeightOffset: 64, + baseFeeConfig: LibSharedData.BaseFeeConfig({ + adjustmentQuotient: 8, + sharingPctg: 75, + gasIssuancePerSecond: 5_000_000, + minGasExcess: 1_340_000_000, + maxGasIssuancePerBlock: 600_000_000 + }), + ontakeForkHeight: 0 + }); + } +} diff --git a/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol b/packages/protocol/contracts/layer1/devnet/DevnetTierRouter.sol similarity index 60% rename from packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol rename to packages/protocol/contracts/layer1/devnet/DevnetTierRouter.sol index 3f89772d41e..134265349a6 100644 --- a/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol +++ b/packages/protocol/contracts/layer1/devnet/DevnetTierRouter.sol @@ -1,19 +1,19 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "./TierProviderBase.sol"; -import "./ITierRouter.sol"; +import "../tiers/TierProviderBase.sol"; +import "../tiers/ITierRouter.sol"; -/// @title DevnetTierProvider +/// @title DevnetTierRouter /// @custom:security-contact security@taiko.xyz -contract DevnetTierProvider is TierProviderBase, ITierRouter { +contract DevnetTierRouter is TierProviderBase, ITierRouter { /// @inheritdoc ITierRouter function getProvider(uint256) external view returns (address) { return address(this); } /// @inheritdoc ITierProvider - function getTierIds() public pure override returns (uint16[] memory tiers_) { + function getTierIds() external pure returns (uint16[] memory tiers_) { tiers_ = new uint16[](3); tiers_[0] = LibTiers.TIER_OPTIMISTIC; tiers_[1] = LibTiers.TIER_GUARDIAN_MINORITY; @@ -21,7 +21,7 @@ contract DevnetTierProvider is TierProviderBase, ITierRouter { } /// @inheritdoc ITierProvider - function getMinTier(uint256) public pure override returns (uint16) { + function getMinTier(address, uint256) public pure override returns (uint16) { return LibTiers.TIER_OPTIMISTIC; } } diff --git a/packages/protocol/contracts/layer1/fork/ForkManager.sol b/packages/protocol/contracts/layer1/fork/ForkManager.sol new file mode 100644 index 00000000000..3dd21f882ba --- /dev/null +++ b/packages/protocol/contracts/layer1/fork/ForkManager.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; + +/// @title ForkManager +/// @custom:security-contact security@taiko.xyz +/// @notice This contract serves as a base contract for managing up to two forks within the Taiko +/// protocol. By default, all function calls are routed to the newFork address. +/// Sub-contracts should override the shouldRouteToOldFork function to route specific function calls +/// to the old fork address. +/// These sub-contracts should be placed between a proxy and the actual fork implementations. When +/// calling upgradeTo, the proxy should always upgrade to a new ForkManager implementation, not an +/// actual fork implementation. +/// It is strongly advised to name functions differently for the same functionality across the two +/// forks, as it is not possible to route the same function to two different forks. +/// +/// +--> newFork +/// PROXY -> FORK_MANAGER --| +/// +--> oldFork +contract ForkManager is UUPSUpgradeable, Ownable2StepUpgradeable { + address public immutable oldFork; + address public immutable newFork; + + error ForkAddressIsZero(); + error InvalidParams(); + + constructor(address _oldFork, address _currFork) { + require(_currFork != address(0) && _currFork != _oldFork, InvalidParams()); + oldFork = _oldFork; + newFork = _currFork; + } + + fallback() external payable virtual { + _fallback(); + } + + receive() external payable virtual { + _fallback(); + } + + function isForkManager() public pure returns (bool) { + return true; + } + + function _fallback() internal virtual { + address fork = shouldRouteToOldFork(msg.sig) ? oldFork : newFork; + require(fork != address(0), ForkAddressIsZero()); + + assembly { + calldatacopy(0, 0, calldatasize()) + let result := delegatecall(gas(), fork, 0, calldatasize(), 0, 0) + returndatacopy(0, 0, returndatasize()) + + switch result + case 0 { revert(0, returndatasize()) } + default { return(0, returndatasize()) } + } + } + + function _authorizeUpgrade(address) internal virtual override onlyOwner { } + + /// @notice Determines if the call should be routed to the old fork. + /// @dev This function is intended to be overridden in derived contracts to provide custom + /// routing logic. + /// @param _selector The function selector of the call. + /// @return A boolean value indicating whether the call should be routed to the old fork. + function shouldRouteToOldFork(bytes4 _selector) internal pure virtual returns (bool) { } +} diff --git a/packages/protocol/contracts/layer1/hekla/HeklaTaikoL1.sol b/packages/protocol/contracts/layer1/hekla/HeklaTaikoL1.sol new file mode 100644 index 00000000000..162ca9e930c --- /dev/null +++ b/packages/protocol/contracts/layer1/hekla/HeklaTaikoL1.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../based/TaikoL1.sol"; + +/// @title HeklaTaikoL1 +/// @dev Labeled in AddressResolver as "taiko" +/// @custom:security-contact security@taiko.xyz +contract HeklaTaikoL1 is TaikoL1 { + /// @inheritdoc ITaikoL1 + function getConfig() public pure override returns (TaikoData.Config memory) { + return TaikoData.Config({ + chainId: LibNetwork.TAIKO_HEKLA, + // Never change this value as ring buffer is being reused!!! + blockMaxProposals: 324_000, + // Never change this value as ring buffer is being reused!!! + blockRingBufferSize: 324_512, + maxBlocksToVerify: 16, + blockMaxGasLimit: 240_000_000, + livenessBond: 125e18, // 125 Taiko token + stateRootSyncInternal: 16, + maxAnchorHeightOffset: 64, + baseFeeConfig: LibSharedData.BaseFeeConfig({ + adjustmentQuotient: 8, + sharingPctg: 75, + gasIssuancePerSecond: 5_000_000, + minGasExcess: 1_340_000_000, + maxGasIssuancePerBlock: 600_000_000 // two minutes + }), + ontakeForkHeight: 840_512 + }); + } +} diff --git a/packages/protocol/contracts/layer1/hekla/HeklaTaikoToken.sol b/packages/protocol/contracts/layer1/hekla/HeklaTaikoToken.sol new file mode 100644 index 00000000000..bd8eff2892a --- /dev/null +++ b/packages/protocol/contracts/layer1/hekla/HeklaTaikoToken.sol @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20SnapshotUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; +import "src/shared/common/EssentialContract.sol"; + +/// @title HeklaTaikoToken +/// @notice Taiko token for Taiko Hekla testnet. +/// @dev Labeled in AddressResolver as "taiko_token". +/// @dev Due to historical reasons, the Taiko Token on Hekla has a different storage layout compared +/// to the mainnet token contract. Therefore, we need to maintain this file. +/// @custom:security-contact security@taiko.xyz +contract HeklaTaikoToken is EssentialContract, ERC20SnapshotUpgradeable, ERC20VotesUpgradeable { + uint256[50] private __gap; + + error TKO_INVALID_ADDR(); + error TT_INVALID_PARAM(); + + /// @notice Initializes the contract. + /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. + /// @param _name The name of the token. + /// @param _symbol The symbol of the token. + /// @param _recipient The address to receive initial token minting. + /// @param _addressManager The AddressManager address. + function init( + address _owner, + string calldata _name, + string calldata _symbol, + address _recipient, + address _addressManager + ) + public + initializer + { + __Essential_init(_owner, _addressManager); + __ERC20_init(_name, _symbol); + __ERC20Snapshot_init(); + __ERC20Votes_init(); + __ERC20Permit_init(_name); + + // Mint 1 billion tokens + _mint(_recipient, 1_000_000_000 ether); + } + + /// @notice Burns tokens from the specified address. + /// @param _from The address to burn tokens from. + /// @param _amount The amount of tokens to burn. + function burn(address _from, uint256 _amount) public onlyOwner { + return _burn(_from, _amount); + } + + /// @notice Creates a new token snapshot. + function snapshot() public onlyFromOwnerOrNamed("snapshooter") returns (uint256) { + return _snapshot(); + } + + /// @notice Transfers tokens to a specified address. + /// @param _to The address to transfer tokens to. + /// @param _amount The amount of tokens to transfer. + /// @return A boolean indicating whether the transfer was successful or not. + function transfer(address _to, uint256 _amount) public override returns (bool) { + if (_to == address(this)) revert TKO_INVALID_ADDR(); + return super.transfer(_to, _amount); + } + + /// @notice Transfers tokens from one address to another. + /// @param _from The address to transfer tokens from. + /// @param _to The address to transfer tokens to. + /// @param _amount The amount of tokens to transfer. + /// @return A boolean indicating whether the transfer was successful or not. + function transferFrom( + address _from, + address _to, + uint256 _amount + ) + public + override + returns (bool) + { + if (_to == address(this)) revert TKO_INVALID_ADDR(); + return super.transferFrom(_from, _to, _amount); + } + + function clock() public view override returns (uint48) { + return SafeCastUpgradeable.toUint48(block.timestamp); + } + + // solhint-disable-next-line func-name-mixedcase + function CLOCK_MODE() public pure override returns (string memory) { + // See https://eips.ethereum.org/EIPS/eip-6372 + return "mode=timestamp"; + } + + function name() public pure override returns (string memory) { + return "Taiko Token"; + } + + function symbol() public pure override returns (string memory) { + return "TAIKO"; + } + + function _beforeTokenTransfer( + address _from, + address _to, + uint256 _amount + ) + internal + override(ERC20Upgradeable, ERC20SnapshotUpgradeable) + { + return super._beforeTokenTransfer(_from, _to, _amount); + } + + function _afterTokenTransfer( + address _from, + address _to, + uint256 _amount + ) + internal + override(ERC20Upgradeable, ERC20VotesUpgradeable) + { + return super._afterTokenTransfer(_from, _to, _amount); + } + + function _mint( + address _to, + uint256 _amount + ) + internal + override(ERC20Upgradeable, ERC20VotesUpgradeable) + { + return super._mint(_to, _amount); + } + + function _burn( + address _from, + uint256 _amount + ) + internal + override(ERC20Upgradeable, ERC20VotesUpgradeable) + { + return super._burn(_from, _amount); + } + + /// @notice Batch transfers tokens + /// @param recipients The list of addresses to transfer tokens to. + /// @param amounts The list of amounts for transfer. + /// @return true if the transfer is successful. + function batchTransfer( + address[] calldata recipients, + uint256[] calldata amounts + ) + external + returns (bool) + { + if (recipients.length != amounts.length) revert TT_INVALID_PARAM(); + for (uint256 i; i < recipients.length; ++i) { + _transfer(msg.sender, recipients[i], amounts[i]); + } + return true; + } +} diff --git a/packages/protocol/contracts/layer1/hekla/HeklaTierRouter.sol b/packages/protocol/contracts/layer1/hekla/HeklaTierRouter.sol new file mode 100644 index 00000000000..2c77b524c95 --- /dev/null +++ b/packages/protocol/contracts/layer1/hekla/HeklaTierRouter.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../tiers/TierProviderBase.sol"; +import "../tiers/ITierRouter.sol"; + +/// @title HeklaTierRouter +/// @dev Any changes to the configuration in this file must be announced and documented on our site. +/// Ensure all modifications are reviewed by the devrel team. +/// @custom:security-contact security@taiko.xyz +contract HeklaTierRouter is TierProviderBase, ITierRouter { + address public immutable DAO_FALLBACK_PROPOSER; + + constructor(address _daoFallbackProposer) { + // 0xD3f681bD6B49887A48cC9C9953720903967E9DC0 + DAO_FALLBACK_PROPOSER = _daoFallbackProposer; + } + + /// @inheritdoc ITierRouter + function getProvider(uint256) external view returns (address) { + return address(this); + } + + /// @inheritdoc ITierProvider + function getTierIds() external pure returns (uint16[] memory tiers_) { + tiers_ = new uint16[](6); + tiers_[0] = LibTiers.TIER_OPTIMISTIC; + tiers_[1] = LibTiers.TIER_SGX; + tiers_[2] = LibTiers.TIER_ZKVM_RISC0; + tiers_[3] = LibTiers.TIER_ZKVM_SP1; + tiers_[4] = LibTiers.TIER_GUARDIAN_MINORITY; + tiers_[5] = LibTiers.TIER_GUARDIAN; + } + + /// @inheritdoc ITierProvider + function getMinTier(address _proposer, uint256 _rand) public view override returns (uint16) { + if (_proposer == DAO_FALLBACK_PROPOSER) { + if (_rand % 1000 == 0) return LibTiers.TIER_ZKVM_RISC0; + else if (_rand % 1000 == 1) return LibTiers.TIER_ZKVM_SP1; + else return LibTiers.TIER_SGX; + } + + return _rand % 2 == 0 ? LibTiers.TIER_SGX : LibTiers.TIER_OPTIMISTIC; + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/README.md b/packages/protocol/contracts/layer1/mainnet/README.md new file mode 100644 index 00000000000..1f73bd10883 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/README.md @@ -0,0 +1,5 @@ +# Optimized Smart Contracts for Taiko Mainnet + +## Overview + +This directory contains optimized versions of smart contracts for deployment on Ethereum for Taiko mainnet. While some of these contracts may be used on Taiko L2, deployment on Layer 2 is not recommended due to lack of testing. diff --git a/packages/protocol/contracts/layer1/mainnet/addrcache/AddressCache.sol b/packages/protocol/contracts/layer1/mainnet/addrcache/AddressCache.sol new file mode 100644 index 00000000000..6dfc98aae8e --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/addrcache/AddressCache.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title AddressCache +/// @custom:security-contact security@taiko.xyz +abstract contract AddressCache { + /// @notice This function retrieves the address associated with a given chain ID and name. + /// If the address is not found in the cache, it falls back to the provided function. + /// @param _chainId The chain ID for which the address is to be retrieved. + /// @param _name The name associated with the address to be retrieved. + /// @param _fallbackFunc The fallback function to be used if the address is not found in the + /// cache. + /// @return The address associated with the given chain ID and name. + function getAddress( + uint64 _chainId, + bytes32 _name, + function (uint64, bytes32) view returns (address) _fallbackFunc + ) + internal + view + returns (address) + { + (bool found, address addr) = getCachedAddress(_chainId, _name); + return found ? addr : _fallbackFunc(_chainId, _name); + } + + /// @notice This function retrieves the cached address associated with a given chain ID and + /// name. + /// @dev This function is virtual and should be overridden in derived contracts. + /// @param _chainId The chain ID for which the address is to be retrieved. + /// @param _name The name associated with the address to be retrieved. + /// @return found_ A boolean indicating whether the address was found in the cache. + /// @return addr_ The address associated with the given chain ID and name, if found in the + /// cache. + function getCachedAddress( + uint64 _chainId, + bytes32 _name + ) + internal + pure + virtual + returns (bool found_, address addr_); +} diff --git a/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol b/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol new file mode 100644 index 00000000000..003cc333e52 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibNetwork.sol"; +import "./AddressCache.sol"; + +/// @title RollupAddressCache +/// @custom:security-contact security@taiko.xyz +contract RollupAddressCache is AddressCache { + function getCachedAddress( + uint64 _chainId, + bytes32 _name + ) + internal + pure + override + returns (bool found, address addr) + { + if (_chainId != LibNetwork.ETHEREUM_MAINNET) { + return (false, address(0)); + } + + if (_name == LibStrings.B_BOND_TOKEN) { + return (true, 0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800); + } + if (_name == LibStrings.B_TAIKO_TOKEN) { + return (true, 0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800); + } + if (_name == LibStrings.B_SIGNAL_SERVICE) { + return (true, 0x9e0a24964e5397B566c1ed39258e21aB5E35C77C); + } + if (_name == LibStrings.B_BRIDGE) { + return (true, 0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC); + } + if (_name == LibStrings.B_TAIKO) { + return (true, 0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a); + } + if (_name == LibStrings.B_TIER_ROUTER) { + return (true, 0x8a4c692F12d3a9750E744A4CE24a1d351bE52E66); + } + if (_name == LibStrings.B_TIER_SGX) { + return (true, 0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81); + } + if (_name == LibStrings.B_TIER_GUARDIAN_MINORITY) { + return (true, 0x579A8d63a2Db646284CBFE31FE5082c9989E985c); + } + if (_name == LibStrings.B_TIER_GUARDIAN) { + return (true, 0xE3D777143Ea25A6E031d1e921F396750885f43aC); + } + if (_name == LibStrings.B_AUTOMATA_DCAP_ATTESTATION) { + return (true, 0x8d7C954960a36a7596d7eA4945dDf891967ca8A3); + } + if (_name == LibStrings.B_PRECONF_TASK_MANAGER) { + return (true, address(0)); + } + if (_name == LibStrings.B_CHAIN_WATCHDOG) { + return (true, 0xE3D777143Ea25A6E031d1e921F396750885f43aC); + } + return (false, address(0)); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/addrcache/SharedAddressCache.sol b/packages/protocol/contracts/layer1/mainnet/addrcache/SharedAddressCache.sol new file mode 100644 index 00000000000..b870f54aeeb --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/addrcache/SharedAddressCache.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibNetwork.sol"; +import "./AddressCache.sol"; + +/// @title SharedAddressCache +/// @custom:security-contact security@taiko.xyz +contract SharedAddressCache is AddressCache { + function getCachedAddress( + uint64 _chainId, + bytes32 _name + ) + internal + pure + override + returns (bool found, address addr) + { + if (_chainId == LibNetwork.ETHEREUM_MAINNET) { + if (_name == LibStrings.B_TAIKO_TOKEN) { + return (true, 0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800); + } + if (_name == LibStrings.B_QUOTA_MANAGER) { + return (true, 0x91f67118DD47d502B1f0C354D0611997B022f29E); + } + if (_name == LibStrings.B_BRIDGE) { + return (true, 0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC); + } + if (_name == LibStrings.B_BRIDGED_ERC20) { + return (true, 0x65666141a541423606365123Ed280AB16a09A2e1); + } + if (_name == LibStrings.B_BRIDGED_ERC721) { + return (true, 0xC3310905E2BC9Cfb198695B75EF3e5B69C6A1Bf7); + } + if (_name == LibStrings.B_BRIDGED_ERC1155) { + return (true, 0x3c90963cFBa436400B0F9C46Aa9224cB379c2c40); + } + if (_name == LibStrings.B_ERC20_VAULT) { + return (true, 0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab); + } + if (_name == LibStrings.B_ERC721_VAULT) { + return (true, 0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa); + } + if (_name == LibStrings.B_ERC1155_VAULT) { + return (true, 0xaf145913EA4a56BE22E120ED9C24589659881702); + } + if (_name == LibStrings.B_SIGNAL_SERVICE) { + return (true, 0x9e0a24964e5397B566c1ed39258e21aB5E35C77C); + } + } else if (_chainId == LibNetwork.TAIKO_MAINNET) { + if (_name == LibStrings.B_BRIDGE) { + return (true, 0x1670000000000000000000000000000000000001); + } + if (_name == LibStrings.B_ERC20_VAULT) { + return (true, 0x1670000000000000000000000000000000000002); + } + if (_name == LibStrings.B_ERC721_VAULT) { + return (true, 0x1670000000000000000000000000000000000003); + } + if (_name == LibStrings.B_ERC1155_VAULT) { + return (true, 0x1670000000000000000000000000000000000004); + } + if (_name == LibStrings.B_SIGNAL_SERVICE) { + return (true, 0x1670000000000000000000000000000000000005); + } + } + + return (false, address(0)); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetBridge.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetBridge.sol new file mode 100644 index 00000000000..bc7877c5660 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetBridge.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/bridge/Bridge.sol"; +import "../addrcache/SharedAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetBridge +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. In theory, the contract can also be deplyed on Taiko L2 but this is +/// not well testee nor necessary. +/// @notice See the documentation in {Bridge}. +/// @custom:security-contact security@taiko.xyz +contract MainnetBridge is Bridge, SharedAddressCache { + /// @dev The slot in transient storage of the call context. This is the keccak256 hash + /// of "bridge.ctx_slot" + bytes32 private constant _CTX_SLOT = + 0xe4ece82196de19aabe639620d7f716c433d1348f96ce727c9989a982dbadc2b9; + + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } + + /// @inheritdoc Bridge + function _storeContext(bytes32 _msgHash, address _from, uint64 _srcChainId) internal override { + assembly { + tstore(_CTX_SLOT, _msgHash) + tstore(add(_CTX_SLOT, 1), _from) + tstore(add(_CTX_SLOT, 2), _srcChainId) + } + } + + /// @inheritdoc Bridge + function _loadContext() internal view override returns (Context memory) { + bytes32 msgHash; + address from; + uint64 srcChainId; + assembly { + msgHash := tload(_CTX_SLOT) + from := tload(add(_CTX_SLOT, 1)) + srcChainId := tload(add(_CTX_SLOT, 2)) + } + return Context(msgHash, from, srcChainId); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol new file mode 100644 index 00000000000..e44b1efb69c --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/tokenvault/ERC1155Vault.sol"; +import "../addrcache/SharedAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetERC1155Vault +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. In theory, the contract can also be deplyed on Taiko L2 but this is +/// not well testee nor necessary. +/// @notice See the documentation in {ER1155Vault}. +/// @custom:security-contact security@taiko.xyz +contract MainnetERC1155Vault is ERC1155Vault, SharedAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol new file mode 100644 index 00000000000..605b40932b5 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/tokenvault/ERC20Vault.sol"; +import "../addrcache/SharedAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetERC20Vault +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. In theory, the contract can also be deplyed on Taiko L2 but this is +/// not well testee nor necessary. +/// @notice See the documentation in {ER20Vault}. +/// @custom:security-contact security@taiko.xyz +contract MainnetERC20Vault is ERC20Vault, SharedAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol new file mode 100644 index 00000000000..f4ab9bec3a3 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/tokenvault/ERC721Vault.sol"; +import "../addrcache/SharedAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetERC721Vault +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. In theory, the contract can also be deplyed on Taiko L2 but this is +/// not well testee nor necessary. +/// @notice See the documentation in {ER721Vault}. +/// @custom:security-contact security@taiko.xyz +contract MainnetERC721Vault is ERC721Vault, SharedAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol new file mode 100644 index 00000000000..9a2c3cfa3f8 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/AddressManager.sol"; +import "src/shared/common/LibStrings.sol"; +import "../addrcache/SharedAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetSharedAddressManager +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {IAddressManager}. +/// @custom:security-contact security@taiko.xyz +contract MainnetSharedAddressManager is AddressManager, SharedAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSignalService.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSignalService.sol new file mode 100644 index 00000000000..b5958753f14 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSignalService.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/signal/SignalService.sol"; +import "../addrcache/SharedAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetSignalService +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. In theory, the contract can also be deplyed on Taiko L2 but this is +/// not well testee nor necessary. +/// @notice See the documentation in {SignalService}. +/// @custom:security-contact security@taiko.xyz +contract MainnetSignalService is SignalService, SharedAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/reentrylock/LibFasterReentryLock.sol b/packages/protocol/contracts/layer1/mainnet/reentrylock/LibFasterReentryLock.sol new file mode 100644 index 00000000000..cfa3d7c066e --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/reentrylock/LibFasterReentryLock.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title LibFasterReentryLock +/// @custom:security-contact security@taiko.xyz +library LibFasterReentryLock { + /// @dev The slot in transient storage of the reentry lock. + /// This is the result of keccak256("ownerUUPS.reentry_slot") plus 1. The addition aims to + /// prevent hash collisions with slots defined in EIP-1967, where slots are derived by + /// keccak256("something") - 1, and with slots in SignalService, calculated directly with + /// keccak256("something"). + bytes32 private constant _REENTRY_SLOT = + 0xa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b; + + function storeReentryLock(uint8 _reentry) internal { + assembly { + tstore(_REENTRY_SLOT, _reentry) + } + } + + function loadReentryLock() internal view returns (uint8 reentry_) { + assembly { + reentry_ := tload(_REENTRY_SLOT) + } + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol new file mode 100644 index 00000000000..baf50487d03 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/provers/GuardianProver.sol"; +import "../addrcache/RollupAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; +/// @title MainnetGuardianProver +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {GuardianProver}. +/// @custom:security-contact security@taiko.xyz + +contract MainnetGuardianProver is GuardianProver, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetProverSet.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetProverSet.sol new file mode 100644 index 00000000000..27c0de89bf2 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetProverSet.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/provers/ProverSet.sol"; +import "../addrcache/RollupAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetProverSet +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. In theory, the contract can also be deplyed on Taiko L2 but this is +/// not well testee nor necessary. +/// @notice See the documentation in {ProverSet}. +/// @custom:security-contact security@taiko.xyz +contract MainnetProverSet is ProverSet, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetRollupAddressManager.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetRollupAddressManager.sol new file mode 100644 index 00000000000..74728ba20a5 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetRollupAddressManager.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/AddressManager.sol"; +import "src/shared/common/LibStrings.sol"; +import "../addrcache/RollupAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetRollupAddressManager +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {IAddressManager}. +/// @custom:security-contact security@taiko.xyz +contract MainnetRollupAddressManager is AddressManager, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol new file mode 100644 index 00000000000..8c43054d500 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/based/TaikoL1.sol"; +import "../addrcache/RollupAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetTaikoL1 +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {TaikoL1}. +/// @custom:security-contact security@taiko.xyz +contract MainnetTaikoL1 is TaikoL1, RollupAddressCache { + /// @inheritdoc ITaikoL1 + function getConfig() public pure override returns (TaikoData.Config memory) { + // All hard-coded configurations: + // - treasury: the actual TaikoL2 address. + // - anchorGasLimit: 250_000 (based on internal devnet, its ~220_000 + // after 256 L2 blocks) + return TaikoData.Config({ + chainId: LibNetwork.TAIKO_MAINNET, + // Ring buffers are being reused on the mainnet, therefore the following two + // configuration values must NEVER be changed!!! + blockMaxProposals: 324_000, // DO NOT CHANGE!!! + blockRingBufferSize: 360_000, // DO NOT CHANGE!!! + maxBlocksToVerify: 16, + blockMaxGasLimit: 240_000_000, + livenessBond: 125e18, // 125 Taiko token + stateRootSyncInternal: 16, + maxAnchorHeightOffset: 64, + baseFeeConfig: LibSharedData.BaseFeeConfig({ + adjustmentQuotient: 8, + sharingPctg: 75, + gasIssuancePerSecond: 5_000_000, + minGasExcess: 1_340_000_000, // correspond to 0.008847185 gwei basefee + maxGasIssuancePerBlock: 600_000_000 // two minutes: 5_000_000 * 120 + }), + ontakeForkHeight: 538_304 + }); + } + + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol new file mode 100644 index 00000000000..282d65e8342 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/tiers/ITierRouter.sol"; +import "src/layer1/tiers/TierProviderBase.sol"; + +/// @title MainnetTierRouter +/// @dev Any changes to the configuration in this file must be announced and documented on our site. +/// Ensure all modifications are reviewed by the devrel team. +/// @dev Labeled in AddressResolver as "tier_router" +/// @custom:security-contact security@taiko.xyz +contract MainnetTierRouter is ITierRouter, TierProviderBase { + address public immutable DAO_FALLBACK_PROPOSER; + + constructor(address _daoFallbackProposer) { + // 0x68d30f47F19c07bCCEf4Ac7FAE2Dc12FCa3e0dC9 + DAO_FALLBACK_PROPOSER = _daoFallbackProposer; + } + + /// @inheritdoc ITierRouter + function getProvider(uint256) external view returns (address) { + return address(this); + } + + /// @inheritdoc ITierProvider + function getTierIds() external pure returns (uint16[] memory tiers_) { + tiers_ = new uint16[](5); + tiers_[0] = LibTiers.TIER_SGX; + tiers_[1] = LibTiers.TIER_ZKVM_RISC0; + tiers_[2] = LibTiers.TIER_ZKVM_SP1; + tiers_[3] = LibTiers.TIER_GUARDIAN_MINORITY; + tiers_[4] = LibTiers.TIER_GUARDIAN; + } + + /// @inheritdoc ITierProvider + function getMinTier(address _proposer, uint256 _rand) public view override returns (uint16) { + if (_proposer == DAO_FALLBACK_PROPOSER) { + if (_rand % 1000 == 0) return LibTiers.TIER_ZKVM_RISC0; + else if (_rand % 1000 < 29) return LibTiers.TIER_ZKVM_SP1; + else return LibTiers.TIER_SGX; + } + return LibTiers.TIER_SGX; + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetRisc0Verifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetRisc0Verifier.sol new file mode 100644 index 00000000000..538831547d3 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetRisc0Verifier.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/Risc0Verifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetRisc0Verifier +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {Risc0Verifier}. +/// @custom:security-contact security@taiko.xyz +contract MainnetRisc0Verifier is Risc0Verifier, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSP1Verifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSP1Verifier.sol new file mode 100644 index 00000000000..2954d8dc3b7 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSP1Verifier.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/SP1Verifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetSP1Verifier +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {RiscZeroVerifier}. +/// @custom:security-contact security@taiko.xyz +contract MainnetSP1Verifier is SP1Verifier, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } + + function taikoChainId() internal pure override returns (uint64) { + return LibNetwork.TAIKO_MAINNET; + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol new file mode 100644 index 00000000000..4d57e8a596e --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/SgxVerifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetSgxVerifier +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {SgxVerifier}. +/// @custom:security-contact security@taiko.xyz +contract MainnetSgxVerifier is SgxVerifier, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol new file mode 100644 index 00000000000..48e69932402 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/compose/TeeAnyVerifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetTeeAnyVerifier +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @custom:security-contact security@taiko.xyz +contract MainnetTeeAnyVerifier is TeeAnyVerifier, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol new file mode 100644 index 00000000000..609789ba250 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/compose/ZkAndTeeVerifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetZkAndTeeVerifier +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @custom:security-contact security@taiko.xyz +contract MainnetZkAndTeeVerifier is ZkAndTeeVerifier, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol new file mode 100644 index 00000000000..bbb107268d8 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/compose/ZkAnyVerifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetZkAnyVerifier +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @custom:security-contact security@taiko.xyz +contract MainnetZkAnyVerifier is ZkAnyVerifier, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/README.md b/packages/protocol/contracts/layer1/preconf/README.md new file mode 100644 index 00000000000..ea72bc235bf --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/README.md @@ -0,0 +1,3 @@ +# README + +This folder contains the contracts migrated from github.com/NethermindEth/Taiko-Preconf-AVS diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol new file mode 100644 index 00000000000..f49db7dfa20 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "../iface/IPreconfServiceManager.sol"; +import "./iface/ISlasher.sol"; +import "./iface/IAVSDirectory.sol"; + +/// @title PreconfServiceManager +/// @dev This contract would serve as the address of the AVS w.r.t the restaking platform being +/// used. Currently, this is based on a mock version of Eigenlayer that we have created solely for a +/// POC. +/// @custom:security-contact security@taiko.xyz +contract PreconfServiceManager is IPreconfServiceManager, ReentrancyGuard { + address internal immutable preconfRegistry; + address internal immutable preconfTaskManager; + IAVSDirectory internal immutable avsDirectory; + ISlasher internal immutable slasher; + + /// @dev This is currently just a flag and not actually being used to lock the stake. + mapping(address operator => uint256 timestamp) public stakeLockedUntil; + + uint256[49] private __gap; // 50 - 1 + + constructor( + address _preconfRegistry, + address _preconfTaskManager, + IAVSDirectory _avsDirectory, + ISlasher _slasher + ) { + preconfRegistry = _preconfRegistry; + preconfTaskManager = _preconfTaskManager; + avsDirectory = _avsDirectory; + slasher = _slasher; + } + + modifier onlyCallableBy(address allowedSender) { + require(msg.sender == allowedSender, SenderIsNotAllowed()); + _; + } + + /// @dev Simply relays the call to the AVS directory + function registerOperatorToAVS( + address operator, + bytes calldata operatorSignature + ) + external + nonReentrant + onlyCallableBy(preconfRegistry) + { + IAVSDirectory.SignatureWithSaltAndExpiry memory sig = + abi.decode(operatorSignature, (IAVSDirectory.SignatureWithSaltAndExpiry)); + avsDirectory.registerOperatorToAVS(operator, sig); + } + + /// @dev Simply relays the call to the AVS directory + function deregisterOperatorFromAVS(address operator) + external + nonReentrant + onlyCallableBy(preconfRegistry) + { + avsDirectory.deregisterOperatorFromAVS(operator); + } + + /// @dev This not completely functional until Eigenlayer decides the logic of their Slasher. + /// for now this simply sets a value in the storage and releases an event. + function lockStakeUntil( + address operator, + uint256 timestamp + ) + external + nonReentrant + onlyCallableBy(preconfTaskManager) + { + stakeLockedUntil[operator] = timestamp; + emit StakeLockedUntil(operator, timestamp); + } + + /// @dev This not completely functional until Eigenlayer decides the logic of their Slasher. + function slashOperator(address operator) + external + nonReentrant + onlyCallableBy(preconfTaskManager) + { + require(!slasher.isOperatorSlashed(operator), OperatorAlreadySlashed()); + slasher.slashOperator(operator); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol new file mode 100644 index 00000000000..ad4922b5174 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title IAVSDirectory +/// @custom:security-contact security@taiko.xyz +interface IAVSDirectory { + struct SignatureWithSaltAndExpiry { + // the signature itself, formatted as a single bytes object + bytes signature; + // the salt used to generate the signature + bytes32 salt; + // the expiration timestamp (UTC) of the signature + uint256 expiry; + } + + /// @dev This function will be left without implementation in the MVP + function registerOperatorToAVS( + address operator, + SignatureWithSaltAndExpiry memory operatorSignature + ) + external; + + /// @dev This function will be left without implementation in the MVP + function deregisterOperatorFromAVS(address operator) external; + + /// @dev This function will have the implementation in the MVP so that the node can pull the + /// message + /// to be signed + function calculateOperatorAVSRegistrationDigestHash( + address operator, + address avs, + bytes32 salt, + uint256 expiry + ) + external + view + returns (bytes32); +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol new file mode 100644 index 00000000000..d786a0d7537 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title IDelegationManager +/// @custom:security-contact security@taiko.xyz +interface IDelegationManager { + event OperatorSharesIncreased( + address indexed operator, address staker, address strategy, uint256 shares + ); + + /// @dev Called internally in EL by Strategy Manager + function increaseDelegatedShares(address operator, address strategy, uint256 shares) external; + + /// @dev Called by the AVS Stake Registry + function getOperatorShares( + address operator, + address[] memory strategies + ) + external + view + returns (uint256[] memory); +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol new file mode 100644 index 00000000000..5e399835e54 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title ISlasher +/// @custom:security-contact security@taiko.xyz +interface ISlasher { + event OperatorSlashed(address indexed operator, address indexed avs); + event OptedIntoSlashing(address indexed operator, address indexed avs); + + /// @dev Called externally by the AVS operator client to allow AVS to slash the operator in the + /// future + function optIntoSlashing(address avs) external; + + /// @dev Called internally by the AVS (specifically the Service Manager) to slash the operator + function slashOperator(address operator) external; + + function isOperatorSlashed(address operator) external view returns (bool); +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol new file mode 100644 index 00000000000..dda27f58ce1 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title IStrategyManager +/// @custom:security-contact security@taiko.xyz +interface IStrategyManager { + event Deposit(address staker, address token, address strategy, uint256 shares); + + /// @dev In EL this function is non-payable and solely for staking ERC20 tokens + function depositIntoStrategy( + address strategy, + address token, + uint256 amount + ) + external + payable + returns (uint256 shares); +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/AVSDirectory.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/AVSDirectory.sol new file mode 100644 index 00000000000..3b24d2b8fdc --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/AVSDirectory.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../iface/IAVSDirectory.sol"; + +contract AVSDirectory is IAVSDirectory { + bytes32 private constant DOMAIN_TYPEHASH = + keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); + bytes32 private constant OPERATOR_AVS_REGISTRATION_TYPEHASH = keccak256( + "OperatorAVSRegistration(address operator,address avs,bytes32 salt,uint256 expiry)" + ); + + function registerOperatorToAVS( + address operator, + IAVSDirectory.SignatureWithSaltAndExpiry memory operatorSignature + ) + external + { } + + function deregisterOperatorFromAVS(address operator) external { } + + function calculateOperatorAVSRegistrationDigestHash( + address operator, + address avs, + bytes32 salt, + uint256 expiry + ) + public + view + returns (bytes32) + { + // calculate the struct hash + bytes32 structHash = + keccak256(abi.encode(OPERATOR_AVS_REGISTRATION_TYPEHASH, operator, avs, salt, expiry)); + // calculate the digest hash + bytes32 digestHash = + keccak256(abi.encodePacked("\x19\x01", _calculateDomainSeparator(), structHash)); + return digestHash; + } + + function _calculateDomainSeparator() internal view returns (bytes32) { + return keccak256( + abi.encode( + DOMAIN_TYPEHASH, keccak256(bytes("EigenLayer")), block.chainid, address(this) + ) + ); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/DelegationManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/DelegationManager.sol new file mode 100644 index 00000000000..06fc8d9fe6f --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/DelegationManager.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../iface/IDelegationManager.sol"; +import "../iface/IStrategyManager.sol"; + +contract DelegationManager is IDelegationManager { + IStrategyManager internal immutable strategyManager; + + mapping(address operator => uint256 shares) internal operatorShares; + + constructor(IStrategyManager _strategyManager) { + strategyManager = _strategyManager; + } + + modifier onlyStrategyManager() { + require( + msg.sender == address(strategyManager), + "DelegationManager: Only Strategy Manager allowed" + ); + _; + } + + /// @dev In this MVP, operator and staker are used interchangeably + function increaseDelegatedShares( + address operator, + address strategy, + uint256 shares + ) + external + onlyStrategyManager + { + require(strategy == address(0), "DelegationManager: Only ETH strategy supported"); + operatorShares[operator] += shares; + emit OperatorSharesIncreased(operator, operator, strategy, shares); + } + + /// @dev This has been modified from the original EL implementation to accommodate for slashing + function getOperatorShares( + address operator, + address[] memory strategies + ) + external + view + returns (uint256[] memory) + { + uint256[] memory shares = new uint256[](strategies.length); + + for (uint256 i; i < strategies.length; ++i) { + require(strategies[i] == address(0), "DelegationManager: Only ETH strategy supported"); + shares[i] = operatorShares[operator]; + } + return shares; + } +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/Slasher.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/Slasher.sol new file mode 100644 index 00000000000..94a668fa4df --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/Slasher.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../iface/ISlasher.sol"; + +contract Slasher is ISlasher { + mapping(address operator => mapping(address avs => bool canSlash)) internal slashingAllowed; + mapping(address operator => bool slashed) internal isSlashed; + + modifier onlyIfSlashingAllowed(address operator, address caller) { + require( + slashingAllowed[operator][caller], + "Slasher: Caller is not allowed to slash the operator" + ); + _; + } + + function optIntoSlashing(address avs) external { + slashingAllowed[msg.sender][avs] = true; + emit OptedIntoSlashing(msg.sender, avs); + } + + function slashOperator(address operator) external onlyIfSlashingAllowed(operator, msg.sender) { + isSlashed[operator] = true; + emit OperatorSlashed(operator, msg.sender); + } + + function isOperatorSlashed(address operator) external view returns (bool) { + return isSlashed[operator]; + } +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/StrategyManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/StrategyManager.sol new file mode 100644 index 00000000000..307e3d4815e --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/StrategyManager.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../iface/IStrategyManager.sol"; +import "../iface/IDelegationManager.sol"; + +contract StrategyManager is IStrategyManager { + IDelegationManager internal immutable delegation; + + uint256 internal constant ETH_DEPOSIT = 1 ether; + + constructor(IDelegationManager _delegation) { + delegation = _delegation; + } + + function depositIntoStrategy( + address strategy, + address token, + uint256 amount + ) + external + payable + returns (uint256 shares) + { + require(strategy == address(0), "StrategyManager: Only ETH strategy supported"); + require(token == address(0), "StrategyManager: Only ETH deposits supported"); + require( + msg.value == ETH_DEPOSIT && amount == ETH_DEPOSIT, + "StrategyManager: Invalid ETH deposit" + ); + + // In the MVP, the shares equal the sent amount as we do not have any form of reward accrual + shares = amount; + + delegation.increaseDelegatedShares(msg.sender, strategy, shares); + + emit Deposit(msg.sender, token, strategy, shares); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol b/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol new file mode 100644 index 00000000000..c25da59facb --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "../iface/IPreconfServiceManager.sol"; + +/// @title PreconfServiceManager +/// @dev An implementation of IPreconfServiceManager on top of Eigenlayer restaking. +/// @custom:security-contact security@taiko.xyz +abstract contract PreconfServiceManager is IPreconfServiceManager, ReentrancyGuard { } diff --git a/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol b/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol new file mode 100644 index 00000000000..cfafe4081f6 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../libs/LibBLS12381.sol"; + +/// @title IPreconfRegistry +/// @custom:security-contact security@taiko.xyz +interface IPreconfRegistry { + struct Validator { + // Preconfer that the validator proposer blocks for + address preconfer; + // Timestamp at which the preconfer may start proposing for the preconfer + // 2 epochs from validator addition timestamp + uint40 startProposingAt; + // Timestamp at which the preconfer must stop proposing for the preconfer + // 2 epochs from validator removal timestamp + uint40 stopProposingAt; + } + // ^ Note: 40 bits are enough for UNIX timestamp. This way we also compress the data to a single + // slot. + + struct AddValidatorParam { + // The public key of the validator + LibBLS12381.G1Point pubkey; + // The signature of the validator + LibBLS12381.G2Point signature; + // The timestamp at which the above signature expires + uint256 signatureExpiry; + } + + struct RemoveValidatorParam { + // The public key of the validator + LibBLS12381.G1Point pubkey; + // The signature of the validator + LibBLS12381.G2Point signature; + // The timestamp at which the above signature expires + uint256 signatureExpiry; + } + + enum ValidatorOp { + REMOVE, + ADD + } + + event PreconferRegistered(address indexed preconfer); + event PreconferDeregistered(address indexed preconfer); + event ValidatorAdded(bytes32 indexed pubKeyHash, address indexed preconfer); + event ValidatorRemoved(bytes32 indexed pubKeyHash, address indexed preconfer); + + error PreconferAlreadyRegistered(); + error PreconferNotRegistered(); + error InvalidValidatorSignature(); + error ValidatorSignatureExpired(); + error ValidatorAlreadyActive(); + error ValidatorAlreadyInactive(); + + /// @dev Registers a preconfer by giving them a non-zero registry index + function registerPreconfer(bytes calldata operatorSignature) external; + + /// @dev Deregisters a preconfer from the registry + function deregisterPreconfer() external; + + /// @dev Adds consensus layer validators to the system by assigning preconfers to them + function addValidators(AddValidatorParam[] calldata addValidatorParams) external; + + /// @dev Removes active validators who are proposing for a preconfer + function removeValidators(RemoveValidatorParam[] calldata removeValidatorParams) external; + + /// @dev Returns the message that the validator must sign to add or remove themselves from a + /// preconfer + function getMessageToSign( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + external + view + returns (bytes memory); + + /// @dev Returns the index of the next preconfer + function getNextPreconferIndex() external view returns (uint256); + + /// @dev Returns the index of the preconfer + function getPreconferIndex(address preconfer) external view returns (uint256); + + /// @dev Returns the preconfer at the given index + function getPreconferAtIndex(uint256 index) external view returns (address); + + /// @dev Returns a validator who is proposing for a registered preconfer + function getValidator(bytes32 pubKeyHash) external view returns (Validator memory); +} diff --git a/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol b/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol new file mode 100644 index 00000000000..d47951d76e5 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title IPreconfServiceManager +/// @custom:security-contact security@taiko.xyz +interface IPreconfServiceManager { + event StakeLockedUntil(address indexed operator, uint256 timestamp); + + error SenderIsNotAllowed(); + error OperatorAlreadySlashed(); + + /// @dev Only callable by the registry + function registerOperatorToAVS(address operator, bytes calldata operatorSignature) external; + + /// @dev Only callable by the registry + function deregisterOperatorFromAVS(address operator) external; + + /// @dev Only Callable by PreconfTaskManager to prevent withdrawals of stake during preconf or + /// lookahead dispute period + function lockStakeUntil(address operator, uint256 timestamp) external; + + /// @dev Only Callable by PreconfTaskManager to slash an operator for incorrect lookahead or + /// preconfirmation + function slashOperator(address operator) external; +} diff --git a/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol b/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol new file mode 100644 index 00000000000..c381b71f34b --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../libs/LibEIP4788.sol"; + +/// @title IPreconfTaskManager +/// @custom:security-contact security@taiko.xyz +interface IPreconfTaskManager { + struct LookaheadBufferEntry { + // True when the preconfer is randomly selected + bool isFallback; + // Timestamp of the slot at which the provided preconfer is the L1 validator + uint40 timestamp; + // Timestamp of the last slot that had a valid preconfer + uint40 prevTimestamp; + // Address of the preconfer who is also the L1 validator + // The preconfer will have rights to propose a block in the range (prevTimestamp, timestamp] + address preconfer; + } + + struct LookaheadSetParam { + // The timestamp of the slot + uint256 timestamp; + // The AVS operator who is also the L1 validator for the slot and will preconf L2 + // transactions + address preconfer; + } + + event LookaheadUpdated(LookaheadSetParam[]); + + event ProvedIncorrectLookahead( + address indexed poster, uint256 indexed timestamp, address indexed disputer + ); + + /// @dev The current (or provided) timestamp does not fall in the range provided by the + /// lookahead pointer + error InvalidLookaheadPointer(); + /// @dev The block proposer is not the assigned preconfer for the current slot/timestamp + error SenderIsNotThePreconfer(); + /// @dev Preconfer is not present in the registry + error PreconferNotRegistered(); + /// @dev Epoch timestamp is incorrect + error InvalidEpochTimestamp(); + /// @dev The timestamp in the lookahead is not of a valid future slot in the present epoch + error InvalidSlotTimestamp(); + /// @dev The chain id on which the preconfirmation was signed is different from the current + /// chain's id + error PreconfirmationChainIdMismatch(); + /// @dev The dispute window for proving incorrectc lookahead or preconfirmation is over + error MissedDisputeWindow(); + /// @dev The lookahead poster for the epoch has already been slashed or there is no lookahead + /// for epoch + error PosterAlreadySlashedOrLookaheadIsEmpty(); + /// @dev The lookahead preconfer matches the one the actual validator is proposing for + error LookaheadEntryIsCorrect(); + /// @dev Cannot force push a lookahead since it is not lagging behind + error LookaheadIsNotRequired(); + /// @dev The registry does not have a single registered preconfer + error NoRegisteredPreconfer(); + + /// @dev Accepts block proposal by an operator and forwards it to TaikoL1 contract + function newBlockProposals( + bytes[] calldata blockParamsArr, + bytes[] calldata txListArr, + uint256 lookaheadPointer, + LookaheadSetParam[] calldata lookaheadSetParams + ) + external; + + /// @dev Slashes a preconfer if the validator lookahead pushed by them has an incorrect entry + function proveIncorrectLookahead( + uint256 lookaheadPointer, + uint256 slotTimestamp, + bytes calldata validatorBLSPubKey, + LibEIP4788.InclusionProof calldata validatorInclusionProof + ) + external; + + /// @dev Forces the lookahead to be set for the next epoch if it is lagging behind + function forcePushLookahead(LookaheadSetParam[] calldata lookaheadSetParams) external; + + /// @dev Returns the fallback preconfer for the given epoch + function getFallbackPreconfer(uint256 epochTimestamp) external view returns (address); + + /// @dev Returns the full 32 slot preconfer lookahead for the epoch + function getLookaheadForEpoch(uint256 epochTimestamp) + external + view + returns (address[32] memory); + + /// @dev Return the parameters required for the lookahead to be set for the given epoch + function getLookaheadParamsForEpoch( + uint256 epochTimestamp, + bytes[32] calldata validatorBLSPubKeys + ) + external + view + returns (LookaheadSetParam[] memory); + + /// @dev Returns true is a lookahead is not posted for an epoch + /// @dev In the event that a lookahead was posted but later invalidated, this returns false + function isLookaheadRequired() external view returns (bool); + + /// @dev Returns the current lookahead tail + function getLookaheadTail() external view returns (uint256); + + /// @dev Returns the entire lookahead buffer + function getLookaheadBuffer() external view returns (LookaheadBufferEntry[128] memory); + + /// @dev Returns the lookahead poster for an epoch + function getLookaheadPoster(uint256 epochTimestamp) external view returns (address); + + /// @dev Returns the preconf service manager contract address + function getPreconfServiceManager() external view returns (address); + + /// @dev Returns the preconf registry contract address + function getPreconfRegistry() external view returns (address); + + /// @dev Returns the Taiko L1 contract address + function getTaikoL1() external view returns (address); + + /// @dev Returns the beacon genesis timestamp + function getBeaconGenesis() external view returns (uint256); + + /// @dev Returns the beacon block root contract address + function getBeaconBlockRootContract() external view returns (address); +} diff --git a/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol b/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol new file mode 100644 index 00000000000..12e408bb38a --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title LibPreconfConstants +/// @custom:security-contact security@taiko.xyz +library LibPreconfConstants { + uint256 internal constant MAINNET_BEACON_GENESIS = 1_606_824_023; + uint256 internal constant SECONDS_IN_SLOT = 12; + uint256 internal constant SECONDS_IN_EPOCH = SECONDS_IN_SLOT * 32; + uint256 internal constant TWO_EPOCHS = 2 * SECONDS_IN_EPOCH; + uint256 internal constant DISPUTE_PERIOD = 2 * SECONDS_IN_EPOCH; +} diff --git a/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol b/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol new file mode 100644 index 00000000000..e3ad403436f --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol @@ -0,0 +1,246 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../iface/IPreconfRegistry.sol"; +import "../iface/IPreconfServiceManager.sol"; +import "../libs/LibBLSSignature.sol"; +import "./LibPreconfConstants.sol"; + +/// @title PreconfRegistry +/// @custom:security-contact security@taiko.xyz +contract PreconfRegistry is IPreconfRegistry, Initializable { + using LibBLS12381 for LibBLS12381.G1Point; + + IPreconfServiceManager internal immutable preconfServiceManager; + + uint256 internal nextPreconferIndex; + + // Maps the preconfer's address to an index that may change over the lifetime of a preconfer + mapping(address preconfer => uint256 index) internal preconferToIndex; + + // Maps an index to the preconfer's address + // We need this mapping to deregister a preconfer in O(1) time. + // While it may also be done by just using the above map and sending a "witness" that is + // calculated offchain, + // we ideally do not want the node to maintain historical state. + mapping(uint256 index => address preconfer) internal indexToPreconfer; + + // Maps a validator's BLS pub key hash to the validator's details + mapping(bytes32 publicKeyHash => Validator validator) internal validators; + + uint256[46] private __gap; // = 50 - 4 + + constructor(IPreconfServiceManager _preconfServiceManager) { + preconfServiceManager = _preconfServiceManager; + } + + function init() external initializer { + nextPreconferIndex = 1; + } + + /** + * @notice Registers a preconfer in the registry by giving it a non-zero index + * @dev This function internally accesses the restaking platform via the AVS service manager + * @param operatorSignature The signature of the operator in the format expected by the + * restaking platform + */ + function registerPreconfer(bytes calldata operatorSignature) external { + // Preconfer must not have registered already + require(preconferToIndex[msg.sender] == 0, PreconferAlreadyRegistered()); + + uint256 _nextPreconferIndex = nextPreconferIndex; + + preconferToIndex[msg.sender] = _nextPreconferIndex; + indexToPreconfer[_nextPreconferIndex] = msg.sender; + + unchecked { + nextPreconferIndex = _nextPreconferIndex + 1; + } + + emit PreconferRegistered(msg.sender); + + preconfServiceManager.registerOperatorToAVS(msg.sender, operatorSignature); + } + + /** + * @notice Deregisters a preconfer from the registry by setting its index to zero + * @dev It assigns the index of the last preconfer to the preconfer being removed and + * decrements the global index counter. + */ + function deregisterPreconfer() external { + // Preconfer must have registered already + uint256 removedPreconferIndex = preconferToIndex[msg.sender]; + require(removedPreconferIndex != 0, PreconferNotRegistered()); + + // Remove the preconfer and exchange its index with the last preconfer + preconferToIndex[msg.sender] = 0; + + unchecked { + // Update to the decremented index to account for the removed preconfer + uint256 lastPreconferIndex = nextPreconferIndex - 1; + nextPreconferIndex = lastPreconferIndex; + + if (removedPreconferIndex == lastPreconferIndex) { + indexToPreconfer[removedPreconferIndex] = address(0); + } else { + address lastPreconfer = indexToPreconfer[lastPreconferIndex]; + preconferToIndex[lastPreconfer] = removedPreconferIndex; + indexToPreconfer[removedPreconferIndex] = lastPreconfer; + } + } + + emit PreconferDeregistered(msg.sender); + + preconfServiceManager.deregisterOperatorFromAVS(msg.sender); + } + + /** + * @notice Assigns a validator to a preconfer + * @dev This function verifies BLS signatures which is a very expensive operation costing about + * ~350K units of gas per signature. + * @param addValidatorParams Contains the public key, signature, expiry, and preconfer + */ + function addValidators(AddValidatorParam[] calldata addValidatorParams) external { + for (uint256 i; i < addValidatorParams.length; ++i) { + // Revert if preconfer is not registered + require(preconferToIndex[msg.sender] != 0, PreconferNotRegistered()); + + // Note: BLS signature checks are commented out for the POC + + // bytes memory message = _createMessage(ValidatorOp.ADD, + // addValidatorParams[i].signatureExpiry, msg.sender); + + // Revert if any signature is invalid + // if (!verifySignature(message, addValidatorParams[i].signature, + // addValidatorParams[i].pubkey)) { + // revert InvalidValidatorSignature(); + // } + + // Revert if the signature has expired + // if (block.timestamp > addValidatorParams[i].signatureExpiry) { + // revert ValidatorSignatureExpired(); + // } + + bytes32 pubKeyHash = _hashBLSPubKey(addValidatorParams[i].pubkey); + Validator memory validator = validators[pubKeyHash]; + + // Update the validator if it has no preconfer assigned, or if it has stopped proposing + // for the former preconfer + require( + validator.preconfer == address(0) + || (validator.stopProposingAt != 0 && block.timestamp > validator.stopProposingAt), + ValidatorAlreadyActive() + ); + + unchecked { + validators[pubKeyHash] = Validator({ + preconfer: msg.sender, + // The delay is crucial in order to not contradict the lookahead + startProposingAt: uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS), + stopProposingAt: uint40(0) + }); + } + + emit ValidatorAdded(pubKeyHash, msg.sender); + } + } + + /** + * @notice Unassigns a validator from a preconfer + * @dev Instead of removing the validator immediately, we delay the removal by two epochs, + * & set the `stopProposingAt` timestamp. + * @param removeValidatorParams Contains the public key, signature and expiry + */ + function removeValidators(RemoveValidatorParam[] calldata removeValidatorParams) external { + for (uint256 i; i < removeValidatorParams.length; ++i) { + bytes32 pubKeyHash = _hashBLSPubKey(removeValidatorParams[i].pubkey); + Validator memory validator = validators[pubKeyHash]; + + // Revert if the validator is not active (or already removed, but waiting to stop + // proposing) + require(validator.preconfer != address(0), ValidatorAlreadyInactive()); + require(validator.stopProposingAt == 0, ValidatorAlreadyInactive()); + + // Note: BLS signature checks have been commented out + // Todo: It would be reasonable to remove BLS checks altogether for validator removals. + + // bytes memory message = + // _createMessage(ValidatorOp.REMOVE, removeValidatorParams[i].signatureExpiry, + // validator.preconfer); + + // // Revert if any signature is invalid + // if (!verifySignature(message, removeValidatorParams[i].signature, + // removeValidatorParams[i].pubkey)) { + // revert InvalidValidatorSignature(); + // } + + // // Revert if the signature has expired + // if (block.timestamp > removeValidatorParams[i].signatureExpiry) { + // revert ValidatorSignatureExpired(); + // } + + unchecked { + // We also need to delay the removal by two epochs to avoid contradicting the + // lookahead + validators[pubKeyHash].stopProposingAt = + uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS); + } + + emit ValidatorRemoved(pubKeyHash, validator.preconfer); + } + } + + //======= + // Views + //======= + + function getMessageToSign( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + external + view + returns (bytes memory) + { + return _createMessage(validatorOp, expiry, preconfer); + } + + function getNextPreconferIndex() external view returns (uint256) { + return nextPreconferIndex; + } + + function getPreconferIndex(address preconfer) external view returns (uint256) { + return preconferToIndex[preconfer]; + } + + function getPreconferAtIndex(uint256 index) external view returns (address) { + return indexToPreconfer[index]; + } + + function getValidator(bytes32 pubKeyHash) external view returns (Validator memory) { + return validators[pubKeyHash]; + } + + //========= + // Helpers + //========= + + function _createMessage( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + internal + view + returns (bytes memory) + { + return abi.encodePacked(block.chainid, validatorOp, expiry, preconfer); + } + + function _hashBLSPubKey(LibBLS12381.G1Point calldata pubkey) internal pure returns (bytes32) { + uint256[2] memory compressedPubKey = pubkey.compress(); + return keccak256(abi.encodePacked(compressedPubKey)); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol b/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol new file mode 100644 index 00000000000..c44bede30c5 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol @@ -0,0 +1,637 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "src/layer1/based/ITaikoL1.sol"; +import "../iface/IPreconfTaskManager.sol"; +import "../iface/IPreconfServiceManager.sol"; +import "../iface/IPreconfRegistry.sol"; +import "../libs/LibEIP4788.sol"; +import "./LibPreconfConstants.sol"; + +/// @title PreconfTaskManager +/// @custom:security-contact security@taiko.xyz +contract PreconfTaskManager is IPreconfTaskManager, Initializable { + // Cannot be kept in `LibPreconfConstants` file because solidity expects array sizes + // to be stored in the main contract file itself. + uint256 internal constant SLOTS_IN_EPOCH = 32; + uint256 internal constant LOOKAHEAD_BUFFER_SIZE = 128; + uint256 internal constant POSTER_BUFFER_SIZE = LibPreconfConstants.SECONDS_IN_EPOCH * 16; + + struct Poster { + // Address of lookahead poster + address addr; + // Start timestamp of the epoch for which the lookahead was posted + uint64 epochTimestamp; + } + + IPreconfServiceManager internal immutable preconfServiceManager; + IPreconfRegistry internal immutable preconfRegistry; + ITaikoL1 internal immutable taikoL1; + + // EIP-4788 + uint256 internal immutable beaconGenesis; + address internal immutable beaconBlockRootContract; + + // A ring buffer of upcoming preconfers (who are also the L1 validators) + uint256 internal lookaheadTail; + mapping( + uint256 lookaheadIndex_mod_LOOKAHEAD_BUFFER_SIZE + => LookaheadBufferEntry lookaheadBufferEntry + ) internal lookahead; + + // A ring buffer that maps beginning timestamp of an epoch to the lookahead poster for that + // epoch. + // If the lookahead poster has been slashed or the lookahead is not yet posted, the poster is + // the 0-address. + mapping(uint256 epochTimestamp_mod_POSTER_BUFFER_SIZE => Poster poster) internal + lookaheadPosters; + + uint256[47] private __gap; // = 50 - 3 + + constructor( + IPreconfServiceManager _serviceManager, + IPreconfRegistry _registry, + ITaikoL1 _taikoL1, + uint256 _beaconGenesis, + address _beaconBlockRootContract + ) { + preconfServiceManager = _serviceManager; + preconfRegistry = _registry; + taikoL1 = _taikoL1; + beaconGenesis = _beaconGenesis; + beaconBlockRootContract = _beaconBlockRootContract; + } + + function init(IERC20 _taikoToken) external initializer { + _taikoToken.approve(address(taikoL1), type(uint256).max); + } + + /** + * @notice Proposes a new Taiko L2 block. + * @dev The first caller in every epoch is expected to pass along the lookahead entries for the + * next epoch. + * The function reverts if the lookahead is lagging behind. This is possible if it is + * the first block proposal of the system or no lookahead was posted for the current epoch due + * to missed proposals. + * In this case, `forcePushLookahead` must be called in order to update the lookahead for the + * next epoch. + * @param blockParamsArr A list of block parameters expected by TaikoL1 contract + * @param txListArr A list of RLP encoded transaction list expected by TaikoL1 contract + * @param lookaheadPointer A pointer to the lookahead entry that may prove that the sender is + * the preconfer + * for the slot. + * @param lookaheadSetParams Collection of timestamps and preconfer addresses to be inserted in + * the lookahead + */ + function newBlockProposals( + bytes[] calldata blockParamsArr, + bytes[] calldata txListArr, + uint256 lookaheadPointer, + LookaheadSetParam[] calldata lookaheadSetParams + ) + external + { + LookaheadBufferEntry memory lookaheadEntry = _getLookaheadEntry(lookaheadPointer); + + uint256 epochTimestamp = _getEpochTimestamp(block.timestamp); + + // The current L1 block's timestamp must be within the range retrieved from the lookahead + // entry. + // The preconfer is allowed to propose a block in advanced if there are no other entries in + // the + // lookahead between the present slot and the preconfer's own slot. + // + // ------[Last slot with an entry]---[X]---[X]----[X]----[Preconfer]------- + // ------[ prevTimestamp ]---[ ]---[ ]----[ ]----[timestamp]------- + // + require(block.timestamp > lookaheadEntry.prevTimestamp, InvalidLookaheadPointer()); + require(block.timestamp <= lookaheadEntry.timestamp, InvalidLookaheadPointer()); + require(msg.sender == lookaheadEntry.preconfer, SenderIsNotThePreconfer()); + + uint256 nextEpochTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Update the lookahead for the next epoch. + // Only called during the first block proposal of the current epoch. + if (_isLookaheadRequired(epochTimestamp, nextEpochTimestamp)) { + _updateLookahead(nextEpochTimestamp, lookaheadSetParams); + } + + // Block the preconfer from withdrawing stake from the restaking service during the dispute + // window + preconfServiceManager.lockStakeUntil( + msg.sender, block.timestamp + LibPreconfConstants.DISPUTE_PERIOD + ); + + // Forward the block to Taiko's L1 contract + taikoL1.proposeBlocksV2(blockParamsArr, txListArr); + } + + /** + * @notice Proves that the lookahead for a specific slot was incorrect + * @dev The logic in this function only works once the lookahead slot has passed. This is + * because + * we pull the proposer from a past beacon block and verify if it is associated with the + * preconfer. + * @param lookaheadPointer The pointer to the lookahead entry that represents the incorrect slot + * @param slotTimestamp The timestamp of the slot for which the lookahead was incorrect + * @param validatorBLSPubKey The BLS public key of the validator who is proposed the block in + * the slot + * @param validatorInclusionProof The inclusion proof of the above validator in the Beacon state + */ + function proveIncorrectLookahead( + uint256 lookaheadPointer, + uint256 slotTimestamp, + bytes calldata validatorBLSPubKey, + LibEIP4788.InclusionProof calldata validatorInclusionProof + ) + external + { + uint256 epochTimestamp = _getEpochTimestamp(slotTimestamp); + + address poster = getLookaheadPoster(epochTimestamp); + + // Poster must not have been slashed + require(poster != address(0), PosterAlreadySlashedOrLookaheadIsEmpty()); + + // Must not have missed dispute period + require( + block.timestamp <= slotTimestamp + LibPreconfConstants.DISPUTE_PERIOD, + MissedDisputeWindow() + ); + + // Verify that the sent validator is the one in Beacon state + LibEIP4788.verifyValidator( + validatorBLSPubKey, _getBeaconBlockRoot(slotTimestamp), validatorInclusionProof + ); + + LookaheadBufferEntry memory lookaheadEntry = _getLookaheadEntry(lookaheadPointer); + + // Validate lookahead pointer + require(slotTimestamp <= lookaheadEntry.timestamp, InvalidLookaheadPointer()); + require(slotTimestamp > lookaheadEntry.prevTimestamp, InvalidLookaheadPointer()); + + // We pull the preconfer present at the required slot timestamp in the lookahead. + // If no preconfer is present for a slot, we simply use the 0-address to denote the + // preconfer. + address preconferInLookahead; + if (lookaheadEntry.timestamp == slotTimestamp && !lookaheadEntry.isFallback) { + // The slot was dedicated to a specific preconfer + preconferInLookahead = lookaheadEntry.preconfer; + } + + // Reduce validator's BLS pub key to the pub key hash expected by the registry + bytes32 validatorPubKeyHash = _getValidatorPubKeyHash(validatorBLSPubKey); + + // Retrieve the validator object + IPreconfRegistry.Validator memory validatorInRegistry = + preconfRegistry.getValidator(validatorPubKeyHash); + + // Fetch the preconfer associated with the validator from the registry + address preconferInRegistry = validatorInRegistry.preconfer; + if ( + slotTimestamp < validatorInRegistry.startProposingAt + || ( + validatorInRegistry.stopProposingAt != 0 + && slotTimestamp >= validatorInRegistry.stopProposingAt + ) + ) { + // The validator is no longer allowed to propose for the former preconfer + preconferInRegistry = address(0); + } + + // Revert if the lookahead preconfer matches the one that the validator pulled from beacon + // state + // is proposing for + require(preconferInLookahead != preconferInRegistry, LookaheadEntryIsCorrect()); + + uint256 epochEndTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + + // If it is the current epoch's lookahead being proved incorrect then insert a fallback + // preconfer + if (block.timestamp < epochEndTimestamp) { + uint256 _lookaheadTail = lookaheadTail; + + uint256 lastSlotTimestamp = epochEndTimestamp - LibPreconfConstants.SECONDS_IN_SLOT; + + // If the lookahead for next epoch is available + if (_getLookaheadEntry(_lookaheadTail).timestamp >= epochEndTimestamp) { + // Get to the entry in the next epoch that connects to a slot in the current epoch + while (_getLookaheadEntry(_lookaheadTail).prevTimestamp >= epochEndTimestamp) { + _lookaheadTail -= 1; + } + + // Switch the connection to the last slot of the current epoch + lookahead[_lookaheadTail % LOOKAHEAD_BUFFER_SIZE].prevTimestamp = + uint40(lastSlotTimestamp); + + // Head to the last entry in current epoch + _lookaheadTail -= 1; + } + + _setLookaheadEntry( + _lookaheadTail, + LookaheadBufferEntry({ + isFallback: true, + timestamp: uint40(lastSlotTimestamp), + prevTimestamp: uint40(epochTimestamp - LibPreconfConstants.SECONDS_IN_SLOT), + preconfer: getFallbackPreconfer(epochTimestamp) + }) + ); + + _lookaheadTail -= 1; + + // Nullify the rest of the lookahead entries for this epoch + while (_getLookaheadEntry(_lookaheadTail).timestamp >= epochTimestamp) { + _setLookaheadEntry( + _lookaheadTail, + LookaheadBufferEntry({ + isFallback: false, + timestamp: 0, + prevTimestamp: 0, + preconfer: address(0) + }) + ); + _lookaheadTail -= 1; + } + } + + // Slash the poster + lookaheadPosters[epochTimestamp % POSTER_BUFFER_SIZE].addr = address(0); + preconfServiceManager.slashOperator(poster); + + emit ProvedIncorrectLookahead(poster, slotTimestamp, msg.sender); + } + + /** + * @notice Forces the lookahead to be set for the next epoch if it is not already set. + * @dev This is called once when the system starts up to push the first lookahead, and later + * anytime + * when the lookahead is lagging due to missed proposals. + * @param lookaheadSetParams Collection of timestamps and preconfer addresses to be inserted in + * the lookahead + */ + function forcePushLookahead(LookaheadSetParam[] calldata lookaheadSetParams) external { + // Sender must be a preconfer + require(preconfRegistry.getPreconferIndex(msg.sender) != 0, PreconferNotRegistered()); + + // Lookahead must be missing + uint256 epochTimestamp = _getEpochTimestamp(block.timestamp); + uint256 nextEpochTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + require(_isLookaheadRequired(epochTimestamp, nextEpochTimestamp), LookaheadIsNotRequired()); + + // Update the lookahead for next epoch + _updateLookahead(nextEpochTimestamp, lookaheadSetParams); + + // Block the preconfer from withdrawing stake from Eigenlayer during the dispute window + preconfServiceManager.lockStakeUntil( + msg.sender, block.timestamp + LibPreconfConstants.DISPUTE_PERIOD + ); + } + + //========= + // Helpers + //========= + + /// @dev Updates the lookahead for an epoch + function _updateLookahead( + uint256 epochTimestamp, + LookaheadSetParam[] calldata lookaheadSetParams + ) + private + { + uint256 epochEndTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + + // The tail of the lookahead is tracked and connected to the first new lookahead entry so + // that when no more preconfers are present in the remaining slots of the current epoch, + // the next epoch's preconfer may start preconfing in advanced. + // + // --[]--[]--[p1]--[]--[]---|---[]--[]--[P2]--[]--[] + // 1 2 3 4 5 6 7 8 9 10 + // Epoch 1 Epoch 2 + // + // Here, P2 may start preconfing and proposing blocks from slot 4 itself + // + uint256 _lookaheadTail = lookaheadTail; + uint256 prevSlotTimestamp = _getLookaheadEntry(_lookaheadTail).timestamp; + + if (lookaheadSetParams.length == 0) { + // If no preconfers are present in the lookahead, we use the fallback preconfer for the + // entire epoch + address fallbackPreconfer = getFallbackPreconfer(epochTimestamp); + _lookaheadTail += 1; + + // and, insert it in the last slot of the epoch so that it may start preconfing in + // advanced + _setLookaheadEntry( + _lookaheadTail, + LookaheadBufferEntry({ + isFallback: true, + timestamp: uint40(epochEndTimestamp - LibPreconfConstants.SECONDS_IN_SLOT), + prevTimestamp: uint40(prevSlotTimestamp), + preconfer: fallbackPreconfer + }) + ); + } else { + for (uint256 i; i < lookaheadSetParams.length; ++i) { + _lookaheadTail += 1; + + address preconfer = lookaheadSetParams[i].preconfer; + uint256 slotTimestamp = lookaheadSetParams[i].timestamp; + + // Each entry must be registered in the preconf registry + require(preconfRegistry.getPreconferIndex(preconfer) != 0, PreconferNotRegistered()); + + // Ensure that the timestamps belong to a valid slot in the epoch + require((slotTimestamp - epochTimestamp) % 12 == 0, InvalidSlotTimestamp()); + require(slotTimestamp < epochEndTimestamp, InvalidSlotTimestamp()); + require(slotTimestamp > prevSlotTimestamp, InvalidSlotTimestamp()); + + // Update the lookahead entry + _setLookaheadEntry( + _lookaheadTail, + LookaheadBufferEntry({ + isFallback: false, + timestamp: uint40(slotTimestamp), + prevTimestamp: uint40(prevSlotTimestamp), + preconfer: preconfer + }) + ); + prevSlotTimestamp = slotTimestamp; + } + } + + lookaheadTail = _lookaheadTail; + lookaheadPosters[epochTimestamp % POSTER_BUFFER_SIZE] = + Poster({ addr: msg.sender, epochTimestamp: uint64(epochTimestamp) }); + + // We directly use the lookahead set params even in the case of a fallback preconfer to + // assist the nodes in identifying an incorrect lookahead. The contents of this event can be + // matched against + // the output of `getLookaheadParamsForEpoch` to verify the correctness of the lookahead. + emit LookaheadUpdated(lookaheadSetParams); + } + + /** + * @notice Computes the timestamp of the epoch containing the provided slot timestamp + */ + function _getEpochTimestamp(uint256 slotTimestamp) private view returns (uint256) { + uint256 timePassedSinceGenesis = slotTimestamp - beaconGenesis; + uint256 timeToCurrentEpochFromGenesis = ( + timePassedSinceGenesis / LibPreconfConstants.SECONDS_IN_EPOCH + ) * LibPreconfConstants.SECONDS_IN_EPOCH; + return beaconGenesis + timeToCurrentEpochFromGenesis; + } + + /** + * @notice Retrieves the beacon block root for the block at the specified timestamp + */ + function _getBeaconBlockRoot(uint256 timestamp) private view returns (bytes32) { + // At block N, we get the beacon block root for block N - 1. So, to get the block root of + // the Nth block, + // we query the root at block N + 1. If N + 1 is a missed slot, we keep querying until we + // find a block N + x + // that has the block root for Nth block. + uint256 targetTimestamp = timestamp + LibPreconfConstants.SECONDS_IN_SLOT; + while (true) { + (bool success, bytes memory result) = + beaconBlockRootContract.staticcall(abi.encode(targetTimestamp)); + if (success && result.length > 0) { + return abi.decode(result, (bytes32)); + } + + unchecked { + targetTimestamp += LibPreconfConstants.SECONDS_IN_SLOT; + } + } + return bytes32(0); + } + + function _getLookaheadEntry(uint256 index) + internal + view + returns (LookaheadBufferEntry memory) + { + return lookahead[index % LOOKAHEAD_BUFFER_SIZE]; + } + + function _setLookaheadEntry(uint256 index, LookaheadBufferEntry memory entry) internal { + lookahead[index % LOOKAHEAD_BUFFER_SIZE] = entry; + } + + function _isLookaheadRequired( + uint256 epochTimestamp, + uint256 nextEpochTimestamp + ) + internal + view + returns (bool) + { + // If it's the first slot of current epoch, we don't need the lookahead since the offchain + // node may not have access to it yet. + return block.timestamp != epochTimestamp + && getLookaheadPoster(nextEpochTimestamp) == address(0); + } + + /** + * @dev Assumes that validatorBLSPubKey is 48 bytes long. + * Puts 16 empty bytes infront to make it equivalent to 48-byte long pub key stored in + * uint256[2] + */ + function _getValidatorPubKeyHash(bytes memory validatorBLSPubKey) + internal + pure + returns (bytes32) + { + return keccak256(abi.encodePacked(bytes16(0), validatorBLSPubKey)); + } + + function _validateEpochTimestamp(uint256 epochTimestamp) internal view { + require(epochTimestamp >= beaconGenesis, InvalidEpochTimestamp()); + require( + (epochTimestamp - beaconGenesis) % LibPreconfConstants.SECONDS_IN_EPOCH == 0, + InvalidEpochTimestamp() + ); + } + + //======= + // Views + //======= + + /// @dev We use the beacon block root at the first block in the last epoch as randomness to + /// decide on the preconfer for the given epoch + function getFallbackPreconfer(uint256 epochTimestamp) public view returns (address) { + _validateEpochTimestamp(epochTimestamp); + + uint256 nextPreconferIndex = preconfRegistry.getNextPreconferIndex(); + + // Registry must have at least one preconfer + require(nextPreconferIndex != 1, NoRegisteredPreconfer()); + + // Start of the last epoch + uint256 lastEpochTimestamp = epochTimestamp - LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 randomness = uint256(_getBeaconBlockRoot(lastEpochTimestamp)); + uint256 preconferIndex = randomness % (nextPreconferIndex - 1) + 1; + + return preconfRegistry.getPreconferAtIndex(preconferIndex); + } + + /** + * @notice Returns the full 32 slot preconfer lookahead for the epoch + * @dev This function has been added as a helper for the node to get the full 32 slot lookahead + * without + * the need of deconstructing the contract storage. Due to the fact that we are deconstructing + * an efficient + * data structure to fill in all the slots, this is very heavy on gas, and onchain calls to it + * should be avoided. + * @param epochTimestamp The start timestamp of the epoch for which the lookahead is to be + * generated + */ + function getLookaheadForEpoch(uint256 epochTimestamp) + external + view + returns (address[SLOTS_IN_EPOCH] memory) + { + _validateEpochTimestamp(epochTimestamp); + + address[SLOTS_IN_EPOCH] memory lookaheadForEpoch; + + uint256 _lookaheadTail = lookaheadTail; + uint256 lastSlotTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Take the tail to the entry that fills the last slot of the epoch. + // This may be an entry in the next epoch who starts preconfing in advanced. + // This may also be an empty slot since the lookahead for next epoch is not yet posted. + while (_getLookaheadEntry(_lookaheadTail).prevTimestamp >= lastSlotTimestamp) { + _lookaheadTail -= 1; + } + + LookaheadBufferEntry memory _entry = _getLookaheadEntry(_lookaheadTail); + + // Iterate backwards and fill in the slots + for (uint256 i = SLOTS_IN_EPOCH; i > 0; --i) { + if (_entry.timestamp >= lastSlotTimestamp) { + lookaheadForEpoch[i - 1] = _entry.preconfer; + } + + lastSlotTimestamp -= LibPreconfConstants.SECONDS_IN_SLOT; + if (lastSlotTimestamp == _entry.prevTimestamp) { + _lookaheadTail -= 1; + // Reuse the memory space of _entry + _entry.preconfer = _getLookaheadEntry(_lookaheadTail).preconfer; + _entry.prevTimestamp = _getLookaheadEntry(_lookaheadTail).prevTimestamp; + } + } + + return lookaheadForEpoch; + } + + /** + * @notice Builds and returns lookahead set parameters for an epoch + * @dev This function can be used by the offchain node to create the lookahead to be posted. + * @param epochTimestamp The start timestamp of the epoch for which the lookahead is to be + * generated + * @param validatorBLSPubKeys The BLS public keys of the validators who are expected to propose + * in the epoch + * in the same sequence as they appear in the epoch. So at index n - 1, we have the validator + * for slot n in that + * epoch. + */ + function getLookaheadParamsForEpoch( + uint256 epochTimestamp, + bytes[SLOTS_IN_EPOCH] memory validatorBLSPubKeys + ) + external + view + returns (LookaheadSetParam[] memory) + { + _validateEpochTimestamp(epochTimestamp); + + uint256 index; + LookaheadSetParam[32] memory lookaheadSetParamsTemp; + + for (uint256 i = 0; i < 32; ++i) { + uint256 slotTimestamp = epochTimestamp + (i * LibPreconfConstants.SECONDS_IN_SLOT); + + // Fetch the validator object from the registry + IPreconfRegistry.Validator memory validator = + preconfRegistry.getValidator(_getValidatorPubKeyHash(validatorBLSPubKeys[i])); + + // Skip deregistered preconfers + if (preconfRegistry.getPreconferIndex(validator.preconfer) == 0) { + continue; + } + + // If the validator is allowed to propose in the epoch, add the associated preconfer to + // the lookahead + if ( + validator.preconfer != address(0) && slotTimestamp >= validator.startProposingAt + && (validator.stopProposingAt == 0 || slotTimestamp < validator.stopProposingAt) + ) { + lookaheadSetParamsTemp[index] = + LookaheadSetParam({ timestamp: slotTimestamp, preconfer: validator.preconfer }); + ++index; + } + } + + // Not very gas efficient, but is okay for a view expected to be used offchain + LookaheadSetParam[] memory lookaheadSetParams = new LookaheadSetParam[](index); + for (uint256 i; i < index; ++i) { + lookaheadSetParams[i] = lookaheadSetParamsTemp[i]; + } + + return lookaheadSetParams; + } + + /// @dev Returns true if the contract is expecting a lookahead for the next epoch + function isLookaheadRequired() external view returns (bool) { + uint256 epochTimestamp = _getEpochTimestamp(block.timestamp); + uint256 nextEpochTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + return _isLookaheadRequired(epochTimestamp, nextEpochTimestamp); + } + + function getPreconfServiceManager() external view returns (address) { + return address(preconfServiceManager); + } + + function getPreconfRegistry() external view returns (address) { + return address(preconfRegistry); + } + + function getTaikoL1() external view returns (address) { + return address(taikoL1); + } + + function getBeaconGenesis() external view returns (uint256) { + return beaconGenesis; + } + + function getBeaconBlockRootContract() external view returns (address) { + return beaconBlockRootContract; + } + + function getLookaheadTail() external view returns (uint256) { + return lookaheadTail; + } + + function getLookaheadBuffer() + external + view + returns (LookaheadBufferEntry[LOOKAHEAD_BUFFER_SIZE] memory) + { + LookaheadBufferEntry[LOOKAHEAD_BUFFER_SIZE] memory _lookahead; + for (uint256 i; i < LOOKAHEAD_BUFFER_SIZE; ++i) { + _lookahead[i] = lookahead[i]; + } + return _lookahead; + } + + function getLookaheadPoster(uint256 epochTimestamp) public view returns (address) { + _validateEpochTimestamp(epochTimestamp); + Poster memory poster = lookaheadPosters[epochTimestamp % POSTER_BUFFER_SIZE]; + return poster.epochTimestamp == epochTimestamp ? poster.addr : address(0); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol b/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol new file mode 100644 index 00000000000..835b2f029b9 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol @@ -0,0 +1,468 @@ +// SPDX-License-Identifier: MIT +// Functions in this library have been adapted from: +// https://github.com/ethyla/bls12-381-hash-to-curve/blob/main/src/HashToCurve.sol +pragma solidity ^0.8.24; + +/// @title LibBLS12381 +/// @custom:security-contact security@taiko.xyz +library LibBLS12381 { + using LibBLS12381 for *; + + struct FieldPoint2 { + uint256[2] u; + uint256[2] u_I; + } + + struct G1Point { + uint256[2] x; + uint256[2] y; + } + + struct G2Point { + uint256[2] x; + uint256[2] x_I; + uint256[2] y; + uint256[2] y_I; + } + + /// @dev Referenced from https://eips.ethereum.org/EIPS/eip-2537#curve-parameters + function baseFieldModulus() internal pure returns (uint256[2] memory) { + return [ + 0x000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd7, + 0x64774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab + ]; + } + + /// @dev Referenced from https://eips.ethereum.org/EIPS/eip-2537#curve-parameters + function negGeneratorG1() internal pure returns (G1Point memory) { + return G1Point({ + x: [ + 0x0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0f, + 0xc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb + ], + y: [ + 0x00000000000000000000000000000000114d1d6855d545a8aa7d76c8cf2e21f2, + 0x67816aef1db507c96655b9d5caac42364e6f38ba0ecb751bad54dcd6b939c2ca + ] + }); + } + + /** + * @notice Negates a G1 point, by reflecting it over the x-axis + * @dev Assumes that the Y coordinate is always less than the field modulus + * @param point The G1 point to negate + */ + function negate(G1Point memory point) internal pure returns (G1Point memory) { + uint256[2] memory fieldModulus = baseFieldModulus(); + uint256[2] memory yNeg; + + // Perform word-wise elementary subtraction + if (fieldModulus[1] < point.y[1]) { + yNeg[1] = type(uint256).max - (point.y[1] - fieldModulus[1]) + 1; + fieldModulus[0] -= 1; // borrow + } else { + yNeg[1] = fieldModulus[1] - point.y[1]; + } + yNeg[0] = fieldModulus[0] - point.y[0]; + + return G1Point({ x: point.x, y: yNeg }); + } + + /** + * @notice Transforms a sequence of bytes into a G2 point + * @dev Based on https://datatracker.ietf.org/doc/html/rfc9380 + * @param message The message to hash + * @param dst The domain separation tag + */ + function hashToCurveG2( + bytes memory message, + bytes memory dst + ) + internal + view + returns (G2Point memory r) + { + // 1. u = hash_to_field(msg, 2) + FieldPoint2[2] memory u = hashToFieldFp2(message, dst); + // 2. Q0 = map_to_curve(u[0]) + G2Point memory q0 = u[0].mapToG2(); + // 3. Q1 = map_to_curve(u[1]) + G2Point memory q1 = u[1].mapToG2(); + // 4. R = Q0 + Q1 + r = q0.plus(q1); + // 5. P = clear_cofactor(R) + // Not needed as map fp to g2 already does it + } + + /** + * @notice Transforms a sequence of bytes into an element in the FP2 field + * @dev Based on https://datatracker.ietf.org/doc/html/rfc9380 + * @param message The message to hash + * @param dst The domain separation tag + */ + function hashToFieldFp2( + bytes memory message, + bytes memory dst + ) + internal + view + returns (FieldPoint2[2] memory) + { + // 1. len_in_bytes = count * m * L + // so always 2 * 2 * 64 = 256 + uint16 lenInBytes = 256; + // 2. uniform_bytes = expand_message(msg, DST, len_in_bytes) + uint256[] memory pseudoRandomBytes = _expandMsgXmd(message, dst, lenInBytes); + FieldPoint2[2] memory u; + // No loop here saves 800 gas hardcoding offset an additional 300 + // 3. for i in (0, ..., count - 1): + // 4. for j in (0, ..., m - 1): + // 5. elm_offset = L * (j + i * m) + // 6. tv = substr(uniform_bytes, elm_offset, HTF_L) + // uint8 HTF_L = 64; + // bytes memory tv = new bytes(64); + // 7. e_j = OS2IP(tv) mod p + // 8. u_i = (e_0, ..., e_(m - 1)) + // tv = bytes.concat(pseudo_random_bytes[0], pseudo_random_bytes[1]); + u[0].u = _modfield(pseudoRandomBytes[0], pseudoRandomBytes[1]); + u[0].u_I = _modfield(pseudoRandomBytes[2], pseudoRandomBytes[3]); + u[1].u = _modfield(pseudoRandomBytes[4], pseudoRandomBytes[5]); + u[1].u_I = _modfield(pseudoRandomBytes[6], pseudoRandomBytes[7]); + // 9. return (u_0, ..., u_(count - 1)) + return u; + } + + /** + * @notice Returns a G1Point in the compressed form + * @dev Based on + * https://github.com/zcash/librustzcash/blob/6e0364cd42a2b3d2b958a54771ef51a8db79dd29/pairing/src/bls12_381/README.md#serialization + * @param point The G1 point to compress + */ + function compress(G1Point memory point) internal pure returns (uint256[2] memory) { + uint256[2] memory r = point.x; + + // Set the first MSB + r[0] = r[0] | (1 << 127); + + // Second MSB is left to be 0 since we are assuming that no infinity points are involved + + // Set the third MSB if point.y is lexicographically larger than the y in negated point + if (_greaterThan(point.y, point.negate().y)) { + r[0] = r[0] | (1 << 125); + } + + return r; + } + + //================== + // Precompile calls + //================== + + /** + * @notice Adds two G2 points using the precompile at 0x0e + */ + function plus( + G2Point memory point1, + G2Point memory point2 + ) + internal + view + returns (G2Point memory) + { + uint256[8] memory r; + + uint256[16] memory input = [ + point1.x[0], + point1.x[1], + point1.x_I[0], + point1.x_I[1], + point1.y[0], + point1.y[1], + point1.y_I[0], + point1.y_I[1], + point2.x[0], + point2.x[1], + point2.x_I[0], + point2.x_I[1], + point2.y[0], + point2.y[1], + point2.y_I[0], + point2.y_I[1] + ]; + + // ABI for G2 addition precompile + // G2 addition call expects 512 bytes as an input that is interpreted as byte concatenation + // of two G2 points (256 bytes each). Output is an encoding of addition operation result - + // single G2 point (256 bytes). + assembly { + let success := + staticcall( + sub(gas(), 2000), + /// gas should be 800 + 0x0e, // address of BLS12_G2ADD + input, //input offset + 512, // input size + r, // output offset + 256 // output size + ) + if iszero(success) { revert(0, 0) } + } + + return _resolveG2Point(r); + } + + /** + * @notice Maps an element of the FP2 field to a G2 point using the precompile at 0x13 + */ + function mapToG2(FieldPoint2 memory fp2) internal view returns (G2Point memory) { + uint256[8] memory r; + + uint256[4] memory input = [fp2.u[0], fp2.u[1], fp2.u_I[0], fp2.u_I[1]]; + + // ABI for mapping Fp2 element to G2 point precompile + // Field-to-curve call expects 128 bytes an an input that is interpreted as a an element of + // the quadratic extension field. Output of this call is 256 bytes and is G2 point following + // respective encoding rules. + assembly { + let success := + staticcall( + sub(gas(), 2000), + /// gas should be 75000 + 0x13, // address of BLS12_MAP_FP2_TO_G2 + input, //input offset + 128, // input size + r, // output offset + 256 // output size + ) + if iszero(success) { revert(0, 0) } + } + + return _resolveG2Point(r); + } + + /** + * @notice Pairing check using the precompile at 0x11 + */ + function pairing( + G1Point memory a1, + G2Point memory b1, + G1Point memory a2, + G2Point memory b2 + ) + internal + view + returns (bool) + { + bool[1] memory r; + + uint256[24] memory input = [ + a1.x[0], + a1.x[1], + a1.y[0], + a1.y[1], + b1.x[0], + b1.x[1], + b1.x_I[0], + b1.x_I[1], + b1.y[0], + b1.y[1], + b1.y_I[0], + b1.y_I[1], + a2.x[0], + a2.x[1], + a2.y[0], + a2.y[1], + b2.x[0], + b2.x[1], + b2.x_I[0], + b2.x_I[1], + b2.y[0], + b2.y[1], + b2.y_I[0], + b2.y_I[1] + ]; + + // ABI for pairing precompile + // Pairing expects 384 (G1Point = 128 bytes, G2Point = 256 bytes) * k bytes as input. + // In this case, since two pairs of points are being passed, the input size is 384 * 2 = 768 + // bytes. + assembly { + let success := + staticcall( + sub(gas(), 2000), + /// gas should be 151000 + 0x11, // address of BLS12_PAIRING + input, //input offset + 768, // input size + r, // output offset + 32 // output size + ) + if iszero(success) { revert(0, 0) } + } + + return r[0]; + } + + //========= + // Helpers + //========= + + function _expandMsgXmd( + bytes memory message, + bytes memory dst, + uint16 lenInBytes + ) + internal + pure + returns (uint256[] memory) + { + // 1. ell = ceil(len_in_bytes / b_in_bytes) + // b_in_bytes seems to be 32 for sha256 + // ceil the division + uint256 ell = (lenInBytes - 1) / 32 + 1; + + // 2. ABORT if ell > 255 or len_in_bytes > 65535 or len(DST) > 255 + require(ell <= 255, "len_in_bytes too large for sha256"); + // Not really needed because of parameter type + // require(lenInBytes <= 65535, "len_in_bytes too large"); + // no length normalizing via hashing + require(dst.length <= 255, "dst too long"); + + bytes memory dstPrime = bytes.concat(dst, bytes1(uint8(dst.length))); + + // 4. Z_pad = I2OSP(0, s_in_bytes) + // this should be sha256 blocksize so 64 bytes + bytes memory zPad = + hex"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + + // 5. l_i_b_str = I2OSP(len_in_bytes, 2) + // length in byte string? + bytes2 libStr = bytes2(lenInBytes); + + // 6. msg_prime = Z_pad || msg || l_i_b_str || I2OSP(0, 1) || DST_prime + bytes memory msgPrime = bytes.concat(zPad, message, libStr, hex"00", dstPrime); + + uint256 b_0; + uint256[] memory b = new uint256[](ell); + + // 7. b_0 = H(msg_prime) + b_0 = uint256(sha256(msgPrime)); + + // 8. b_1 = H(b_0 || I2OSP(1, 1) || DST_prime) + b[0] = uint256(sha256(bytes.concat(bytes32(b_0), hex"01", dstPrime))); + + // 9. for i in (2, ..., ell): + for (uint8 i = 2; i <= ell; i++) { + // 10. b_i = H(strxor(b_0, b_(i - 1)) || I2OSP(i, 1) || DST_prime) + bytes memory tmp = abi.encodePacked(b_0 ^ b[i - 2], i, dstPrime); + b[i - 1] = uint256(sha256(tmp)); + } + // 11. uniform_bytes = b_1 || ... || b_ell + // 12. return substr(uniform_bytes, 0, len_in_bytes) + // Here we don't need the uniform_bytes because b is already properly formed + return b; + } + + function _modfield(uint256 _b1, uint256 _b2) internal view returns (uint256[2] memory r) { + assembly { + let bl := 0x40 + let ml := 0x40 + + let freemem := mload(0x40) // Free memory pointer is always stored at 0x40 + + // arg[0] = base.length @ +0 + mstore(freemem, bl) + // arg[1] = exp.length @ +0x20 + mstore(add(freemem, 0x20), 0x20) + // arg[2] = mod.length @ +0x40 + mstore(add(freemem, 0x40), ml) + + // arg[3] = base.bits @ + 0x60 + // places the first 32 bytes of _b1 and the last 32 bytes of _b2 + mstore(add(freemem, 0x60), _b1) + mstore(add(freemem, 0x80), _b2) + + // arg[4] = exp.bits @ +0x60+base.length + // exponent always 1 + mstore(add(freemem, 0xa0), 1) + + // arg[5] = mod.bits @ +96+base.length+exp.length + // this field_modulus as hex + // 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787 + // we add the 0 prefix so that the result will be exactly 64 bytes + // saves 300 gas per call instead of sending it along every time + // places the first 32 bytes and the last 32 bytes of the field modulus + mstore( + add(freemem, 0xc0), + 0x000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd7 + ) + mstore( + add(freemem, 0xe0), + 0x64774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab + ) + + // Invoke contract 0x5, put return value right after mod.length, @ 0x60 + let success := + staticcall( + sub(gas(), 1350), // gas + 0x5, // mpdexp precompile + freemem, //input offset + 0x100, // input size = 0x60+base.length+exp.length+mod.length + add(freemem, 0x60), // output offset + ml // output size + ) + if iszero(success) { revert(0, 0) } + + // point to mod length, result was placed immediately after + r := add(freemem, 0x60) + //adjust freemem pointer + mstore(0x40, add(add(freemem, 0x60), ml)) + } + } + + /** + * @notice Returns true if `a` is lexicographically greater than `b` + * @dev It makes the comparison bit-wise. + * This functions also assumes that the passed values are 48-byte long BLS pub keys that have + * 16 functional bytes in the first word, and 32 bytes in the second. + */ + function _greaterThan(uint256[2] memory a, uint256[2] memory b) internal pure returns (bool) { + uint256 wordA; + uint256 wordB; + uint256 mask; + + // Only compare the unequal words + if (a[0] == b[0]) { + wordA = a[1]; + wordB = b[1]; + mask = 1 << 255; + } else { + wordA = a[0]; + wordB = b[0]; + mask = 1 << 127; // Only check for lower 16 bytes in the first word + } + + // We may safely set the control value to be less than 256 since it is guaranteed that the + // the loop returns if the first words are different. + for (uint256 i; i < 256; ++i) { + uint256 x = wordA & mask; + uint256 y = wordB & mask; + + if (x == 0 && y != 0) return false; + if (x != 0 && y == 0) return true; + + mask = mask >> 1; + } + + return false; + } + + function _resolveG2Point(uint256[8] memory flattened) internal pure returns (G2Point memory) { + return G2Point({ + x: [flattened[0], flattened[1]], + x_I: [flattened[2], flattened[3]], + y: [flattened[4], flattened[5]], + y_I: [flattened[6], flattened[7]] + }); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol b/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol new file mode 100644 index 00000000000..1b2255450ba --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./LibBLS12381.sol"; + +/// @title LibBLSSignature +/// @custom:security-contact security@taiko.xyz +library LibBLSSignature { + using LibBLS12381 for *; + + /// @dev The domain separation tag for the BLS signature + function dst() internal pure returns (bytes memory) { + // Set based on the recommendations of RFC9380 + return bytes("Taiko Based Rollup Preconfirmation v0.1.0"); + } + + /** + * @notice Returns `true` if the BLS signature on the message matches against the public key + * @param message The message bytes + * @param sig The BLS signature + * @param pubkey The BLS public key of the expected signer + */ + function verifySignature( + bytes memory message, + LibBLS12381.G2Point memory sig, + LibBLS12381.G1Point memory pubkey + ) + public + view + returns (bool) + { + // Hash the message bytes into a G2 point + LibBLS12381.G2Point memory msgG2 = message.hashToCurveG2(dst()); + + // Return the pairing check that denotes the correctness of the signature + return LibBLS12381.pairing(pubkey, msgG2, LibBLS12381.negGeneratorG1(), sig); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol b/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol new file mode 100644 index 00000000000..153cb582131 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: MIT + +// Referenced from: https://ethresear.ch/t/slashing-proofoor-on-chain-slashed-validator-proofs/19421 +pragma solidity ^0.8.24; + +import "./LibMerkleUtils.sol"; + +/// @title LibEIP4788 +/// @custom:security-contact security@taiko.xyz +library LibEIP4788 { + struct InclusionProof { + // `Chunks` of the SSZ encoded validator + bytes32[8] validator; + // Index of the validator in the beacon state validator list + uint256 validatorIndex; + // Proof of inclusion of validator in beacon state validator list + bytes32[] validatorProof; + // Root of the validator list in the beacon state + bytes32 validatorsRoot; + // Proof of inclusion of validator list in the beacon state + bytes32[] beaconStateProof; + // Root of the beacon state + bytes32 beaconStateRoot; + // Proof of inclusion of beacon state in the beacon block + bytes32[] beaconBlockProofForState; + // Proof of inclusion of the validator index in the beacon block + bytes32[] beaconBlockProofForProposerIndex; + } + + /// @dev The validator pub key failed verification against the pub key hash tree root in the + /// validator chunks + error InvalidValidatorBLSPubKey(); + /// @dev The proof that the validator is a part of the validator list is invalid. + error ValidatorProofFailed(); + /// @dev The proof that the validator list is a part of the beacon state is invalid. + error BeaconStateProofFailed(); + /// @dev The proof that the beacon state is a part of the beacon block is invalid. + error BeaconBlockProofForStateFailed(); + /// @dev The proof that the actual validator index is a part of the beacon is invalid. + error BeaconBlockProofForProposerIndex(); + + function verifyValidator( + bytes memory validatorBLSPubKey, + bytes32 beaconBlockRoot, + InclusionProof memory inclusionProof + ) + internal + pure + { + // Validator's BLS public key is verified against the hash tree root within Validator chunks + bytes32 pubKeyHashTreeRoot = sha256(abi.encodePacked(validatorBLSPubKey, bytes16(0))); + require(pubKeyHashTreeRoot == inclusionProof.validator[0], InvalidValidatorBLSPubKey()); + + // Validator is verified against the validator list in the beacon state + bytes32 validatorHashTreeRoot = LibMerkleUtils.merkleize(inclusionProof.validator); + require( + LibMerkleUtils.verifyProof( + inclusionProof.validatorProof, + inclusionProof.validatorsRoot, + validatorHashTreeRoot, + inclusionProof.validatorIndex + ), + ValidatorProofFailed() + ); + + require( + LibMerkleUtils.verifyProof( + inclusionProof.beaconStateProof, + inclusionProof.beaconStateRoot, + inclusionProof.validatorsRoot, + 11 + ), + BeaconStateProofFailed() + ); + + // Beacon state is verified against the beacon block + require( + LibMerkleUtils.verifyProof( + inclusionProof.beaconBlockProofForState, + beaconBlockRoot, + inclusionProof.beaconStateRoot, + 3 + ), + BeaconBlockProofForStateFailed() + ); + + // Validator index is verified against the beacon block + require( + LibMerkleUtils.verifyProof( + inclusionProof.beaconBlockProofForProposerIndex, + beaconBlockRoot, + LibMerkleUtils.toLittleEndian(inclusionProof.validatorIndex), + 1 + ), + BeaconBlockProofForProposerIndex() + ); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol b/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol new file mode 100644 index 00000000000..c9a962edea4 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.24; + +/// @title LibMerkleUtils +/// @custom:security-contact security@taiko.xyz +library LibMerkleUtils { + uint256 internal constant CHUNKS_LENGTH = 8; + uint256 internal constant TMP_LENGTH = 4; + + function hash(bytes32 a, bytes32 b) internal pure returns (bytes32) { + return sha256(abi.encodePacked(a, b)); + } + + function merkleize(bytes32[CHUNKS_LENGTH] memory chunks) internal pure returns (bytes32) { + bytes32[] memory tmp = new bytes32[](TMP_LENGTH); + + for (uint256 i; i < CHUNKS_LENGTH; ++i) { + merge(tmp, i, chunks[i]); + } + + return tmp[TMP_LENGTH - 1]; + } + + function merge(bytes32[] memory tmp, uint256 index, bytes32 chunk) internal pure { + bytes32 h = chunk; + uint256 j = 0; + while (true) { + if (index & 1 << j == 0) { + break; + } else { + h = hash(tmp[j], h); + } + j += 1; + } + tmp[j] = h; + } + + function verifyProof( + bytes32[] memory proof, + bytes32 root, + bytes32 leaf, + uint256 leafIndex + ) + internal + pure + returns (bool) + { + bytes32 h = leaf; + uint256 index = leafIndex; + + for (uint256 i = 0; i < proof.length; i++) { + bytes32 proofElement = proof[i]; + + if (index % 2 == 0) { + h = sha256(bytes.concat(h, proofElement)); + } else { + h = sha256(bytes.concat(proofElement, h)); + } + + index = index / 2; + } + + return h == root; + } + + function toLittleEndian(uint256 n) internal pure returns (bytes32) { + uint256 v = n; + v = ((v & 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00) >> 8) + | ((v & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) << 8); + v = ((v & 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000) >> 16) + | ((v & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) << 16); + v = ((v & 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000) >> 32) + | ((v & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32); + v = ((v & 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF0000000000000000) >> 64) + | ((v & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64); + v = (v >> 128) | (v << 128); + return bytes32(v); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol b/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol new file mode 100644 index 00000000000..0bb360711ca --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol @@ -0,0 +1,245 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../impl/LibPreconfConstants.sol"; +import "../libs/LibBLSSignature.sol"; +import "../iface/IPreconfRegistry.sol"; +import "../iface/IPreconfServiceManager.sol"; +import "../avs-mvp/iface/IAVSDirectory.sol"; + +contract MockPreconfRegistry is IPreconfRegistry, Initializable { + using LibBLS12381 for LibBLS12381.G1Point; + + IPreconfServiceManager internal immutable preconfServiceManager; + + uint256 internal nextPreconferIndex; + + // Maps the preconfer's address to an index that may change over the lifetime of a preconfer + mapping(address preconfer => uint256 index) internal preconferToIndex; + + // Maps an index to the preconfer's address + // We need this mapping to deregister a preconfer in O(1) time. + // While it may also be done by just using the above map and sending a "witness" that is + // calculated offchain, + // we ideally do not want the node to maintain historical state. + mapping(uint256 index => address preconfer) internal indexToPreconfer; + + // Maps a validator's BLS pub key hash to the validator's details + mapping(bytes32 publicKeyHash => Validator validator) internal validators; + + constructor(IPreconfServiceManager _preconfServiceManager) { + preconfServiceManager = _preconfServiceManager; + } + + function init() external initializer { + nextPreconferIndex = 1; + } + + /** + * @notice Registers a preconfer in the registry by giving it a non-zero index + * @dev This function internally accesses Eigenlayer via the AVS service manager + * @param operatorSignature The signature of the operator in the format expected by Eigenlayer + */ + function registerPreconfer(bytes calldata operatorSignature) external { + // Preconfer must not have registered already + require(preconferToIndex[msg.sender] == 0, PreconferAlreadyRegistered()); + + uint256 _nextPreconferIndex = nextPreconferIndex; + + preconferToIndex[msg.sender] = _nextPreconferIndex; + indexToPreconfer[_nextPreconferIndex] = msg.sender; + + unchecked { + nextPreconferIndex = _nextPreconferIndex + 1; + } + + emit PreconferRegistered(msg.sender); + + preconfServiceManager.registerOperatorToAVS(msg.sender, operatorSignature); + } + + /** + * @notice Deregisters a preconfer from the registry by setting its index to zero + * @dev It assigns the index of the last preconfer to the preconfer being removed and + * decrements the global index counter. + */ + function deregisterPreconfer() external { + // Preconfer must have registered already + require(preconferToIndex[msg.sender] != 0, PreconferNotRegistered()); + + unchecked { + uint256 _nextPreconferIndex = nextPreconferIndex - 1; + + // Update to the decremented index to account for the removed preconfer + nextPreconferIndex = _nextPreconferIndex; + + uint256 removedPreconferIndex = preconferToIndex[msg.sender]; + address lastPreconfer = indexToPreconfer[_nextPreconferIndex]; + + // Remove the preconfer and exchange its index with the last preconfer + preconferToIndex[msg.sender] = 0; + preconferToIndex[lastPreconfer] = removedPreconferIndex; + indexToPreconfer[removedPreconferIndex] = lastPreconfer; + } + + emit PreconferDeregistered(msg.sender); + + preconfServiceManager.deregisterOperatorFromAVS(msg.sender); + } + + /** + * @notice Assigns a validator to a preconfer + * @dev The function allows different validators to be assigned to different preconfers, but + * generally, it will be called by a preconfer to assign validators to itself. + * @param addValidatorParams Contains the public key, signature, expiry, and preconfer + */ + function addValidators(AddValidatorParam[] calldata addValidatorParams) external { + for (uint256 i; i < addValidatorParams.length; ++i) { + // Revert if preconfer is not registered + require(preconferToIndex[msg.sender] != 0, PreconferNotRegistered()); + + // bytes memory message = _createMessage(ValidatorOp.ADD, + // addValidatorParams[i].signatureExpiry, msg.sender); + + // Revert if any signature is invalid + //if (!verifySignature(message, addValidatorParams[i].signature, + // addValidatorParams[i].pubkey)) { + // revert InvalidValidatorSignature(); + //} + + // Revert if the signature has expired + require( + block.timestamp <= addValidatorParams[i].signatureExpiry, + ValidatorSignatureExpired() + ); + + // Point compress the public key just how it is done on the consensus layer + uint256[2] memory compressedPubKey = addValidatorParams[i].pubkey.compress(); + // Use the hash for ease of mapping + bytes32 pubKeyHash = keccak256(abi.encodePacked(compressedPubKey)); + + Validator memory validator = validators[pubKeyHash]; + + // Update the validator if it has no preconfer assigned, or if it has stopped proposing + // for the former preconfer + require( + validator.preconfer == address(0) + || (validator.stopProposingAt != 0 && block.timestamp > validator.stopProposingAt), + ValidatorAlreadyActive() + ); + + unchecked { + validators[pubKeyHash] = Validator({ + preconfer: msg.sender, + // The delay is crucial in order to not contradict the lookahead + startProposingAt: uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS), + stopProposingAt: uint40(0) + }); + } + + emit ValidatorAdded(pubKeyHash, msg.sender); + } + } + + /** + * @notice Unassigns a validator from a preconfer + * @dev Instead of removing the validator immediately, we delay the removal by two epochs, + * & set the `stopProposingAt` timestamp. + * @param removeValidatorParams Contains the public key, signature and expiry + */ + function removeValidators(RemoveValidatorParam[] calldata removeValidatorParams) external { + for (uint256 i; i < removeValidatorParams.length; ++i) { + // Point compress the public key just how it is done on the consensus layer + uint256[2] memory compressedPubKey = removeValidatorParams[i].pubkey.compress(); + // Use the hash for ease of mapping + bytes32 pubKeyHash = keccak256(abi.encodePacked(compressedPubKey)); + + Validator memory validator = validators[pubKeyHash]; + + // Revert if the validator is not active (or already removed, but waiting to stop + // proposing) + require(validator.preconfer != address(0), ValidatorAlreadyInactive()); + require(validator.stopProposingAt == 0, ValidatorAlreadyInactive()); + + bytes memory message = _createMessage( + ValidatorOp.REMOVE, removeValidatorParams[i].signatureExpiry, validator.preconfer + ); + + // Revert if any signature is invalid + require( + LibBLSSignature.verifySignature( + message, removeValidatorParams[i].signature, removeValidatorParams[i].pubkey + ), + InvalidValidatorSignature() + ); + + // Revert if the signature has expired + require( + block.timestamp <= removeValidatorParams[i].signatureExpiry, + ValidatorSignatureExpired() + ); + + unchecked { + // We also need to delay the removal by two epochs to avoid contradicting the + // lookahead + validators[pubKeyHash].stopProposingAt = + uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS); + } + + emit ValidatorRemoved(pubKeyHash, validator.preconfer); + } + } + + //======= + // Views + //======= + + function getMessageToSign( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + external + view + returns (bytes memory) + { + return _createMessage(validatorOp, expiry, preconfer); + } + + function getPreconfServiceManager() external view returns (address) { + return address(preconfServiceManager); + } + + function getNextPreconferIndex() external view returns (uint256) { + return nextPreconferIndex; + } + + function getPreconferIndex(address preconfer) external view returns (uint256) { + return preconferToIndex[preconfer]; + } + + function getPreconferAtIndex(uint256 index) external view returns (address) { + return indexToPreconfer[index]; + } + + function getValidator(bytes32 pubKeyHash) external view returns (Validator memory) { + return validators[pubKeyHash]; + } + + //========= + // Helpers + //========= + + function _createMessage( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + internal + view + returns (bytes memory) + { + return abi.encodePacked(block.chainid, validatorOp, expiry, preconfer); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/mock/MockTaikoToken.sol b/packages/protocol/contracts/layer1/preconf/mock/MockTaikoToken.sol new file mode 100644 index 00000000000..2f6d915e32e --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/mock/MockTaikoToken.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +contract MockTaikoToken { + address public lastAddr; + uint256 public lastAmount; + + function approve(address spender, uint256 amount) external returns (bool) { + lastAddr = spender; + lastAmount = amount; + return true; + } +} diff --git a/packages/protocol/contracts/L1/provers/GuardianProver.sol b/packages/protocol/contracts/layer1/provers/GuardianProver.sol similarity index 51% rename from packages/protocol/contracts/L1/provers/GuardianProver.sol rename to packages/protocol/contracts/layer1/provers/GuardianProver.sol index eec69566ca1..542dc25481e 100644 --- a/packages/protocol/contracts/L1/provers/GuardianProver.sol +++ b/packages/protocol/contracts/layer1/provers/GuardianProver.sol @@ -1,12 +1,13 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import "../../common/EssentialContract.sol"; -import "../../common/LibStrings.sol"; -import "../../verifiers/IVerifier.sol"; -import "../ITaikoL1.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibAddress.sol"; +import "src/shared/common/LibStrings.sol"; +import "../verifiers/IVerifier.sol"; +import "../based/ITaikoL1.sol"; /// @title GuardianProver /// This prover uses itself as the verifier. @@ -54,22 +55,22 @@ contract GuardianProver is IVerifier, EssentialContract { bytes proofData ); - /// @notice Emitted when the set of guardians is updated - /// @param version The new version - /// @param guardians The new set of guardians + /// @notice Emitted when the set of guardians is updated. + /// @param version The new version. + /// @param guardians The new set of guardians. event GuardiansUpdated(uint32 version, address[] guardians); - /// @notice Emitted when an approval is made - /// @param operationId The operation ID - /// @param approvalBits The new approval bits - /// @param minGuardiansReached If the proof was submitted + /// @notice Emitted when an approval is made. + /// @param operationId The operation ID. + /// @param approvalBits The new approval bits. + /// @param minGuardiansReached If the proof was submitted. event Approved(uint256 indexed operationId, uint256 approvalBits, bool minGuardiansReached); - /// @notice Emitted when a guardian prover submit a different proof for the same block - /// @param blockId The block ID - /// @param guardian The guardian prover address - /// @param currentProofHash The existing proof hash - /// @param newProofHash The new and different proof hash + /// @notice Emitted when a guardian prover submits a different proof for the same block. + /// @param blockId The block ID. + /// @param guardian The guardian prover address. + /// @param currentProofHash The existing proof hash. + /// @param newProofHash The new and different proof hash. /// @param provingPaused True if TaikoL1's proving is paused. event ConflictingProofs( uint256 indexed blockId, @@ -83,6 +84,7 @@ contract GuardianProver is IVerifier, EssentialContract { /// @param enabled True if TaikoL1 proving auto-pause is enabled. event ProvingAutoPauseEnabled(bool indexed enabled); + error GP_BOND_NOT_ERC20(); error GP_INVALID_GUARDIAN(); error GP_INVALID_GUARDIAN_SET(); error GP_INVALID_MIN_GUARDIANS(); @@ -92,15 +94,15 @@ contract GuardianProver is IVerifier, EssentialContract { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @param _rollupAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _rollupAddressManager) external initializer { + __Essential_init(_owner, _rollupAddressManager); } - /// @notice Set the set of guardians - /// @param _newGuardians The new set of guardians - /// @param _minGuardians The minimum required to sign - /// @param _clearData true to invalidate all existing data. + /// @notice Sets the set of guardians. + /// @param _newGuardians The new set of guardians. + /// @param _minGuardians The minimum required to sign. + /// @param _clearData True to invalidate all existing data. function setGuardians( address[] memory _newGuardians, uint8 _minGuardians, @@ -110,14 +112,12 @@ contract GuardianProver is IVerifier, EssentialContract { onlyOwner { // We need at most 255 guardians (so the approval bits fit in a uint256) - if (_newGuardians.length == 0 || _newGuardians.length > type(uint8).max) { - revert GP_INVALID_GUARDIAN_SET(); - } + require(_newGuardians.length != 0, GP_INVALID_GUARDIAN_SET()); + require(_newGuardians.length <= type(uint8).max, GP_INVALID_GUARDIAN_SET()); // Minimum number of guardians to approve is at least equal or greater than half the // guardians (rounded up) and less or equal than the total number of guardians - if (_minGuardians == 0 || _minGuardians > _newGuardians.length) { - revert GP_INVALID_MIN_GUARDIANS(); - } + require(_minGuardians != 0, GP_INVALID_MIN_GUARDIANS()); + require(_minGuardians <= _newGuardians.length, GP_INVALID_MIN_GUARDIANS()); // Delete the current guardians for (uint256 i; i < guardians.length; ++i) { @@ -128,9 +128,9 @@ contract GuardianProver is IVerifier, EssentialContract { // Set the new guardians for (uint256 i; i < _newGuardians.length; ++i) { address guardian = _newGuardians[i]; - if (guardian == address(0)) revert GP_INVALID_GUARDIAN(); + require(guardian != address(0), GP_INVALID_GUARDIAN()); // This makes sure there are not duplicate addresses - if (guardianIds[guardian] != 0) revert GP_INVALID_GUARDIAN_SET(); + require(guardianIds[guardian] == 0, GP_INVALID_GUARDIAN_SET()); // Save and index the guardian guardians.push(guardian); @@ -144,91 +144,69 @@ contract GuardianProver is IVerifier, EssentialContract { emit GuardiansUpdated(version, _newGuardians); } - /// @dev Enables or disables proving auto pause. - /// @param _enable true to enable, false to disable. + /// @notice Enables or disables proving auto pause. + /// @param _enable True to enable, false to disable. function enableProvingAutoPause(bool _enable) external onlyOwner { - if (provingAutoPauseEnabled == _enable) revert GP_INVALID_STATUS(); + require(provingAutoPauseEnabled != _enable, GP_INVALID_STATUS()); provingAutoPauseEnabled = _enable; emit ProvingAutoPauseEnabled(_enable); } /// @notice Enables unlimited allowance for Taiko L1 contract. - /// param _enable true if unlimited allowance is approved, false to set the allowance to 0. - function enableTaikoTokenAllowance(bool _enable) external onlyOwner { - address tko = resolve(LibStrings.B_TAIKO_TOKEN, false); + /// @param _enable True if unlimited allowance is approved, false to set the allowance to 0. + function enableBondAllowance(bool _enable) external onlyOwner { + address bondToken = resolve(LibStrings.B_BOND_TOKEN, true); + require(bondToken != address(0), GP_BOND_NOT_ERC20()); + address taiko = resolve(LibStrings.B_TAIKO, false); - IERC20(tko).approve(taiko, _enable ? type(uint256).max : 0); + IERC20(bondToken).approve(taiko, _enable ? type(uint256).max : 0); } - /// @dev Withdraws Taiko Token to a given address. + /// @notice Withdraws bond asset to a given address. /// @param _to The recipient address. /// @param _amount The amount of Taiko token to withdraw. Use 0 for all balance. - function withdrawTaikoToken(address _to, uint256 _amount) external onlyOwner { - if (_to == address(0)) revert GV_ZERO_ADDRESS(); + function withdrawBond(address _to, uint256 _amount) external onlyOwner { + require(_to != address(0), GV_ZERO_ADDRESS()); - IERC20 tko = IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)); - uint256 amount = _amount == 0 ? tko.balanceOf(address(this)) : _amount; - tko.transfer(_to, amount); + address bondToken = resolve(LibStrings.B_BOND_TOKEN, true); + if (bondToken != address(0)) { + uint256 amount = _amount == 0 ? IERC20(bondToken).balanceOf(address(this)) : _amount; + IERC20(bondToken).transfer(_to, amount); + } else { + LibAddress.sendEtherAndVerify(_to, address(this).balance); + } } - /// @dev Called by guardians to approve a guardian proof - /// @param _meta The block's metadata. + /// @notice Called by guardians to approve a guardian proof (version 2). + /// @param _metaV2 The block's metadata (version 2). /// @param _tran The valid transition. /// @param _proof The tier proof. - /// @return approved_ True if the minimum number of approval is acquired, false otherwise. - function approve( - TaikoData.BlockMetadata calldata _meta, + /// @return approved_ True if the minimum number of approvals is acquired, false otherwise. + function approveV2( + TaikoData.BlockMetadataV2 calldata _metaV2, TaikoData.Transition calldata _tran, TaikoData.TierProof calldata _proof ) external whenNotPaused nonReentrant - returns (bool approved_) + returns (bool) { - bytes32 proofHash = keccak256(abi.encode(_meta, _tran, _proof.data)); - uint256 _version = version; - bytes32 currProofHash = latestProofHash[_version][_meta.id]; - - if (currProofHash == 0) { - latestProofHash[_version][_meta.id] = proofHash; - currProofHash = proofHash; - } - - bool conflicting = currProofHash != proofHash; - bool pauseProving = conflicting && provingAutoPauseEnabled - && address(this) == resolve(LibStrings.B_CHAIN_WATCHDOG, true); - - if (conflicting) { - latestProofHash[_version][_meta.id] = proofHash; - emit ConflictingProofs(_meta.id, msg.sender, currProofHash, proofHash, pauseProving); - } - - if (pauseProving) { - ITaikoL1(resolve(LibStrings.B_TAIKO, false)).pauseProving(true); - } else { - approved_ = _approve(_meta.id, proofHash); - emit GuardianApproval(msg.sender, _meta.id, _tran.blockHash, approved_, _proof.data); - - if (approved_) { - delete approvals[_version][proofHash]; - delete latestProofHash[_version][_meta.id]; - - ITaikoL1(resolve(LibStrings.B_TAIKO, false)).proveBlock( - _meta.id, abi.encode(_meta, _tran, _proof) - ); - } - } + return _approve({ + _blockId: _metaV2.id, + _proofHash: keccak256(abi.encode(_metaV2, _tran, _proof.data)), + _blockHash: _tran.blockHash, + _data: abi.encode(_metaV2, _tran, _proof), + _proofData: _proof.data + }); } /// @notice Pauses chain proving and verification. function pauseTaikoProving() external whenNotPaused { - if (guardianIds[msg.sender] == 0) revert GP_INVALID_GUARDIAN(); + require(guardianIds[msg.sender] != 0, GP_INVALID_GUARDIAN()); - if (address(this) != resolve(LibStrings.B_CHAIN_WATCHDOG, true)) { - revert GV_PERMISSION_DENIED(); - } + require(address(this) == resolve(LibStrings.B_CHAIN_WATCHDOG, true), GV_PERMISSION_DENIED()); ITaikoL1(resolve(LibStrings.B_TAIKO, false)).pauseProving(true); } @@ -242,18 +220,90 @@ contract GuardianProver is IVerifier, EssentialContract { external view { - if (_ctx.msgSender != address(this)) revert GV_PERMISSION_DENIED(); + require(_ctx.msgSender == address(this), GV_PERMISSION_DENIED()); + } + + /// @inheritdoc IVerifier + function verifyBatchProof( + ContextV2[] calldata _ctxs, + TaikoData.TierProof calldata /*_proof*/ + ) + external + view + { + for (uint256 i; i < _ctxs.length; ++i) { + require(_ctxs[i].msgSender == address(this), GV_PERMISSION_DENIED()); + } } - /// @notice Returns the number of guardians - /// @return The number of guardians + /// @notice Returns the number of guardians. + /// @return The number of guardians. function numGuardians() public view returns (uint256) { return guardians.length; } - function _approve(uint256 _blockId, bytes32 _proofHash) internal returns (bool approved_) { + /// @notice Internal function to handle the approval process. + /// @param _blockId The block ID. + /// @param _proofHash The proof hash. + /// @param _blockHash The block hash. + /// @param _data The encoded data. + /// @param _proofData The proof data. + /// @return approved_ True if the minimum number of approvals is acquired, false otherwise. + function _approve( + uint64 _blockId, + bytes32 _proofHash, + bytes32 _blockHash, + bytes memory _data, + bytes memory _proofData + ) + internal + returns (bool approved_) + { + uint256 _version = version; + bytes32 currProofHash = latestProofHash[_version][_blockId]; + + if (currProofHash == 0) { + latestProofHash[_version][_blockId] = _proofHash; + currProofHash = _proofHash; + } + + bool conflicting = currProofHash != _proofHash; + bool pauseProving = conflicting && provingAutoPauseEnabled + && address(this) == resolve(LibStrings.B_CHAIN_WATCHDOG, true); + + if (conflicting) { + latestProofHash[_version][_blockId] = _proofHash; + emit ConflictingProofs(_blockId, msg.sender, currProofHash, _proofHash, pauseProving); + } + + if (pauseProving) { + ITaikoL1(resolve(LibStrings.B_TAIKO, false)).pauseProving(true); + } else { + approved_ = _saveApproval(_blockId, _proofHash); + emit GuardianApproval(msg.sender, _blockId, _blockHash, approved_, _proofData); + + if (approved_) { + delete approvals[_version][_proofHash]; + delete latestProofHash[_version][_blockId]; + + ITaikoL1(resolve(LibStrings.B_TAIKO, false)).proveBlock(_blockId, _data); + } + } + } + + /// @notice Internal function to save the approval. + /// @param _blockId The block ID. + /// @param _proofHash The proof hash. + /// @return approved_ True if the minimum number of approvals is acquired, false otherwise. + function _saveApproval( + uint256 _blockId, + bytes32 _proofHash + ) + internal + returns (bool approved_) + { uint256 id = guardianIds[msg.sender]; - if (id == 0) revert GP_INVALID_GUARDIAN(); + require(id != 0, GP_INVALID_GUARDIAN()); uint256 _version = version; @@ -266,6 +316,9 @@ contract GuardianProver is IVerifier, EssentialContract { emit Approved(_blockId, _approval, approved_); } + /// @notice Internal function to check if the minimum number of approvals is reached. + /// @param _approvalBits The approval bits. + /// @return True if the minimum number of approvals is reached, false otherwise. function _isApproved(uint256 _approvalBits) private view returns (bool) { uint256 count; uint256 bits = _approvalBits; diff --git a/packages/protocol/contracts/layer1/provers/ProverSet.sol b/packages/protocol/contracts/layer1/provers/ProverSet.sol new file mode 100644 index 00000000000..36eb638eb00 --- /dev/null +++ b/packages/protocol/contracts/layer1/provers/ProverSet.sol @@ -0,0 +1,185 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; +import "@openzeppelin/contracts/interfaces/IERC1271.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibAddress.sol"; +import "../based/ITaikoL1.sol"; + +interface IHasRecipient { + function recipient() external view returns (address); +} + +/// @title ProverSet +/// @notice A contract that holds TAIKO token and acts as a Taiko prover. This contract will simply +/// relay `proveBlock` calls to TaikoL1 so msg.sender doesn't need to hold any TAIKO. +/// @custom:security-contact security@taiko.xyz +contract ProverSet is EssentialContract, IERC1271 { + bytes4 private constant _EIP1271_MAGICVALUE = 0x1626ba7e; + + mapping(address prover => bool isProver) public isProver; // slot 1 + address public admin; // slot 2 + + uint256[48] private __gap; + + event ProverEnabled(address indexed prover, bool indexed enabled); + + error INVALID_STATUS(); + error INVALID_BOND_TOKEN(); + error PERMISSION_DENIED(); + error NOT_FIRST_PROPOSAL(); + + modifier onlyAuthorized() { + require( + msg.sender == admin || msg.sender == IHasRecipient(admin).recipient(), + PERMISSION_DENIED() + ); + _; + } + + modifier onlyProver() { + require(isProver[msg.sender], PERMISSION_DENIED()); + _; + } + + /// @notice Initializes the contract. + function init( + address _owner, + address _admin, + address _rollupAddressManager + ) + external + nonZeroAddr(_admin) + initializer + { + __Essential_init(_owner, _rollupAddressManager); + admin = _admin; + + address _bondToken = bondToken(); + if (_bondToken != address(0)) { + IERC20(_bondToken).approve(taikoL1(), type(uint256).max); + } + } + + function approveAllowance(address _address, uint256 _allowance) external onlyOwner { + address _bondToken = bondToken(); + require(_bondToken != address(0), INVALID_BOND_TOKEN()); + IERC20(_bondToken).approve(_address, _allowance); + } + + /// @notice Enables or disables a prover. + function enableProver(address _prover, bool _isProver) external onlyAuthorized { + require(isProver[_prover] != _isProver, INVALID_STATUS()); + isProver[_prover] = _isProver; + + emit ProverEnabled(_prover, _isProver); + } + + /// @notice Withdraws Taiko tokens back to the admin address. + function withdrawToAdmin(uint256 _amount) external onlyAuthorized { + address _bondToken = bondToken(); + if (_bondToken != address(0)) { + IERC20(_bondToken).transfer(admin, _amount); + } else { + LibAddress.sendEtherAndVerify(admin, _amount); + } + } + + /// @notice Withdraws ETH back to the owner address. + function withdrawEtherToAdmin(uint256 _amount) external onlyAuthorized { + LibAddress.sendEtherAndVerify(admin, _amount); + } + + /// @notice Proposes a batch blocks only when it is the first batch blocks proposal in the + /// current L1 block. + function proposeBlocksV2Conditionally( + bytes[] calldata _params, + bytes[] calldata _txList + ) + external + onlyProver + { + ITaikoL1 taiko = ITaikoL1(taikoL1()); + // Ensure this block is the first block proposed in the current L1 block. + require(taiko.lastProposedIn() != block.number, NOT_FIRST_PROPOSAL()); + taiko.proposeBlocksV2(_params, _txList); + } + + /// @notice Propose a Taiko block. + function proposeBlockV2(bytes calldata _params, bytes calldata _txList) external onlyProver { + ITaikoL1(taikoL1()).proposeBlockV2(_params, _txList); + } + + /// @notice Propose multiple Taiko blocks. + function proposeBlocksV2( + bytes[] calldata _paramsArr, + bytes[] calldata _txListArr + ) + external + onlyProver + { + ITaikoL1(taikoL1()).proposeBlocksV2(_paramsArr, _txListArr); + } + + /// @notice Proves or contests a Taiko block. + function proveBlock(uint64 _blockId, bytes calldata _input) external onlyProver { + ITaikoL1(taikoL1()).proveBlock(_blockId, _input); + } + + /// @notice Batch proves or contests Taiko blocks. + function proveBlocks( + uint64[] calldata _blockId, + bytes[] calldata _input, + bytes calldata _batchProof + ) + external + onlyProver + { + ITaikoL1(taikoL1()).proveBlocks(_blockId, _input, _batchProof); + } + + /// @notice Deposits Taiko token to TaikoL1 contract. + function depositBond(uint256 _amount) external onlyAuthorized { + ITaikoL1(taikoL1()).depositBond(_amount); + } + + /// @notice Withdraws Taiko token from TaikoL1 contract. + function withdrawBond(uint256 _amount) external onlyAuthorized { + ITaikoL1(taikoL1()).withdrawBond(_amount); + } + + /// @notice Delegates token voting right to a delegatee. + /// @param _delegatee The delegatee to receive the voting right. + function delegate(address _delegatee) external onlyAuthorized nonReentrant { + address _bondToken = bondToken(); + require(_bondToken != address(0), INVALID_BOND_TOKEN()); + ERC20VotesUpgradeable(_bondToken).delegate(_delegatee); + } + + // This function is necessary for this contract to become an assigned prover. + function isValidSignature( + bytes32 _hash, + bytes calldata _signature + ) + external + view + returns (bytes4 magicValue_) + { + (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(_hash, _signature); + if (error == ECDSA.RecoverError.NoError && isProver[recovered]) { + magicValue_ = _EIP1271_MAGICVALUE; + } + } + + function taikoL1() internal view virtual returns (address) { + return resolve(LibStrings.B_TAIKO, false); + } + + function bondToken() internal view virtual returns (address) { + return resolve(LibStrings.B_BOND_TOKEN, true); + } +} diff --git a/packages/protocol/contracts/team/airdrop/ERC20Airdrop.sol b/packages/protocol/contracts/layer1/team/airdrop/ERC20Airdrop.sol similarity index 98% rename from packages/protocol/contracts/team/airdrop/ERC20Airdrop.sol rename to packages/protocol/contracts/layer1/team/airdrop/ERC20Airdrop.sol index 108c329e9e1..469a0618e51 100644 --- a/packages/protocol/contracts/team/airdrop/ERC20Airdrop.sol +++ b/packages/protocol/contracts/layer1/team/airdrop/ERC20Airdrop.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; diff --git a/packages/protocol/contracts/team/airdrop/MerkleClaimable.sol b/packages/protocol/contracts/layer1/team/airdrop/MerkleClaimable.sol similarity index 97% rename from packages/protocol/contracts/team/airdrop/MerkleClaimable.sol rename to packages/protocol/contracts/layer1/team/airdrop/MerkleClaimable.sol index 2ed3d6a7e34..38eba9238f2 100644 --- a/packages/protocol/contracts/team/airdrop/MerkleClaimable.sol +++ b/packages/protocol/contracts/layer1/team/airdrop/MerkleClaimable.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; -import "../../common/EssentialContract.sol"; +import "src/shared/common/EssentialContract.sol"; /// @title MerkleClaimable /// @notice Contract for managing Taiko token airdrop for eligible users diff --git a/packages/protocol/contracts/team/tokenunlock/TokenUnlock.sol b/packages/protocol/contracts/layer1/team/tokenunlock/TokenUnlock.sol similarity index 83% rename from packages/protocol/contracts/team/tokenunlock/TokenUnlock.sol rename to packages/protocol/contracts/layer1/team/tokenunlock/TokenUnlock.sol index e7d6c8be987..1a2dad9cf12 100644 --- a/packages/protocol/contracts/team/tokenunlock/TokenUnlock.sol +++ b/packages/protocol/contracts/layer1/team/tokenunlock/TokenUnlock.sol @@ -1,15 +1,15 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import "../../common/EssentialContract.sol"; -import "../../common/LibStrings.sol"; -import "../../libs/LibMath.sol"; -import "../proving/ProverSet.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibMath.sol"; +import "../../provers/ProverSet.sol"; /// @title TokenUnlock /// @notice Manages the linear unlocking of Taiko tokens over a four-year period. @@ -60,31 +60,37 @@ contract TokenUnlock is EssentialContract { error NOT_WITHDRAWABLE(); error NOT_PROVER_SET(); error PERMISSION_DENIED(); + error TAIKO_TOKEN_NOT_USED_AS_BOND_TOKEN(); modifier onlyRecipient() { if (msg.sender != recipient) revert PERMISSION_DENIED(); _; } + modifier onlyRecipientOrOwner() { + if (msg.sender != recipient && msg.sender != owner()) revert PERMISSION_DENIED(); + _; + } + /// @notice Initializes the contract. /// @param _owner The contract owner address. - /// @param _addressManager The rollup address manager. + /// @param _rollupAddressManager The rollup address manager. /// @param _recipient Who will be the grantee for this contract. /// @param _tgeTimestamp The token generation event timestamp. function init( address _owner, - address _addressManager, + address _rollupAddressManager, address _recipient, uint64 _tgeTimestamp ) external nonZeroAddr(_recipient) - nonZeroValue(bytes32(uint256(_tgeTimestamp))) + nonZeroValue(_tgeTimestamp) initializer { if (_owner == _recipient) revert INVALID_PARAM(); - __Essential_init(_owner, _addressManager); + __Essential_init(_owner, _rollupAddressManager); recipient = _recipient; tgeTimestamp = _tgeTimestamp; @@ -105,6 +111,11 @@ contract TokenUnlock is EssentialContract { /// @notice Create a new prover set. function createProverSet() external onlyRecipient returns (address proverSet_) { + require( + resolve(LibStrings.B_BOND_TOKEN, false) == resolve(LibStrings.B_TAIKO_TOKEN, false), + TAIKO_TOKEN_NOT_USED_AS_BOND_TOKEN() + ); + bytes memory data = abi.encodeCall(ProverSet.init, (owner(), address(this), addressManager)); proverSet_ = address(new ERC1967Proxy(resolve(LibStrings.B_PROVER_SET, false), data)); @@ -117,7 +128,7 @@ contract TokenUnlock is EssentialContract { uint256 _amount ) external - nonZeroValue(bytes32(_amount)) + nonZeroValue(_amount) onlyRecipient { if (!isProverSet[_proverSet]) revert NOT_PROVER_SET(); @@ -126,7 +137,7 @@ contract TokenUnlock is EssentialContract { IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)).safeTransfer(_proverSet, _amount); } - /// @notice Withdraws all withdrawable tokens. + /// @notice Withdraws tokens by the recipient. /// @param _to The address the token will be sent to. /// @param _amount The amount of tokens to withdraw. function withdraw( @@ -135,18 +146,23 @@ contract TokenUnlock is EssentialContract { ) external nonZeroAddr(_to) - nonZeroValue(bytes32(_amount)) + nonZeroValue(_amount) onlyRecipient nonReentrant { if (_amount > amountWithdrawable()) revert NOT_WITHDRAWABLE(); - emit TokenWithdrawn(_to, _amount); - IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)).safeTransfer(_to, _amount); } - function changeRecipient(address _newRecipient) external onlyRecipient { + /// @notice Withdraws all tokens to the recipient address. + function withdraw() external nonReentrant { + uint256 amount = amountWithdrawable(); + emit TokenWithdrawn(recipient, amount); + IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)).safeTransfer(recipient, amount); + } + + function changeRecipient(address _newRecipient) external onlyRecipientOrOwner { if (_newRecipient == address(0) || _newRecipient == recipient) { revert INVALID_PARAM(); } diff --git a/packages/protocol/contracts/L1/tiers/ITierProvider.sol b/packages/protocol/contracts/layer1/tiers/ITierProvider.sol similarity index 63% rename from packages/protocol/contracts/L1/tiers/ITierProvider.sol rename to packages/protocol/contracts/layer1/tiers/ITierProvider.sol index c8fc464cef4..1e74dbcf25d 100644 --- a/packages/protocol/contracts/L1/tiers/ITierProvider.sol +++ b/packages/protocol/contracts/layer1/tiers/ITierProvider.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title ITierProvider /// @notice Defines interface to return tier configuration. @@ -11,7 +11,7 @@ interface ITierProvider { uint96 contestBond; uint24 cooldownWindow; // in minutes uint16 provingWindow; // in minutes - uint8 maxBlocksToVerifyPerProof; + uint8 maxBlocksToVerifyPerProof; // DEPRECATED } error TIER_NOT_FOUND(); @@ -28,25 +28,8 @@ interface ITierProvider { function getTierIds() external view returns (uint16[] memory); /// @dev Determines the minimal tier for a block based on a random input. + /// @param proposer The address of the block proposer. /// @param rand A pseudo-random number. /// @return The tier id. - function getMinTier(uint256 rand) external view returns (uint16); -} - -/// @dev Tier ID cannot be zero! -library LibTiers { - /// @notice Optimistic tier ID. - uint16 public constant TIER_OPTIMISTIC = 100; - - /// @notice SGX tier ID. - uint16 public constant TIER_SGX = 200; - - /// @notice SGX + ZKVM tier ID. - uint16 public constant TIER_SGX_ZKVM = 300; - - /// @notice Guardian tier ID with minority approval. - uint16 public constant TIER_GUARDIAN_MINORITY = 900; - - /// @notice Guardian tier ID with majority approval. - uint16 public constant TIER_GUARDIAN = 1000; + function getMinTier(address proposer, uint256 rand) external view returns (uint16); } diff --git a/packages/protocol/contracts/L1/tiers/ITierRouter.sol b/packages/protocol/contracts/layer1/tiers/ITierRouter.sol similarity index 94% rename from packages/protocol/contracts/L1/tiers/ITierRouter.sol rename to packages/protocol/contracts/layer1/tiers/ITierRouter.sol index 00454883985..3b8863a021a 100644 --- a/packages/protocol/contracts/L1/tiers/ITierRouter.sol +++ b/packages/protocol/contracts/layer1/tiers/ITierRouter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title ITierRouter /// @notice Defines interface to return an ITierProvider diff --git a/packages/protocol/contracts/layer1/tiers/LibTiers.sol b/packages/protocol/contracts/layer1/tiers/LibTiers.sol new file mode 100644 index 00000000000..fd70d7eaf04 --- /dev/null +++ b/packages/protocol/contracts/layer1/tiers/LibTiers.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title LibTiers +/// @dev Tier ID cannot be zero and must be unique. +/// @custom:security-contact security@taiko.xyz +library LibTiers { + /// @notice Optimistic tier ID. + uint16 public constant TIER_OPTIMISTIC = 100; + + /// @notice TEE tiers + /// Although these tiers have diffeerent IDs, at most one should be selected in a verifier. + uint16 public constant TIER_SGX = 200; + uint16 public constant TIER_TDX = 201; + uint16 public constant TIER_TEE_ANY = 202; + + /// @notice ZK Tiers. + /// Although these tiers have diffeerent IDs, at most one should be selected in a verifier. + uint16 public constant TIER_ZKVM_RISC0 = 250; + uint16 public constant TIER_ZKVM_SP1 = 251; + uint16 public constant TIER_ZKVM_ANY = 252; + + /// @notice Any ZKVM+TEE proof + uint16 public constant TIER_ZKVM_AND_TEE = 300; + + /// @notice Guardian tier ID with minority approval. + uint16 public constant TIER_GUARDIAN_MINORITY = 900; + + /// @notice Guardian tier ID with majority approval. + uint16 public constant TIER_GUARDIAN = 1000; +} diff --git a/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol new file mode 100644 index 00000000000..b1eadb72334 --- /dev/null +++ b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibStrings.sol"; +import "./ITierProvider.sol"; +import "./LibTiers.sol"; + +/// @title TierProviderBase +/// @dev Any changes to the configuration in this file must be announced and documented on our site. +/// Ensure all modifications are reviewed by the devrel team. +/// @custom:security-contact security@taiko.xyz +abstract contract TierProviderBase is ITierProvider { + uint96 public constant BOND_UNIT = 50 ether; // TAIKO tokens + + /// @inheritdoc ITierProvider + /// @notice Each tier, except the top tier, has a validity bond that is 75 TAIKO higher than the + /// previous tier. Additionally, each tier's contest bond is 6.5625 times its validity bond. + function getTier(uint16 _tierId) public pure virtual returns (ITierProvider.Tier memory) { + if (_tierId == LibTiers.TIER_OPTIMISTIC) { + return _buildTier(LibStrings.B_TIER_OPTIMISTIC, 1, 1440, 60); + } + + // TEE Tiers + if (_tierId == LibTiers.TIER_SGX) { + // cooldownWindow is 240 minutes and provingWindow is 60 minutes + return _buildTier(LibStrings.B_TIER_SGX, 2, 240, 60); + } + if (_tierId == LibTiers.TIER_TDX) { + // cooldownWindow is 240 minutes and provingWindow is 60 minutes + return _buildTier(LibStrings.B_TIER_TDX, 2, 240, 60); + } + if (_tierId == LibTiers.TIER_TEE_ANY) { + // cooldownWindow is 240 minutes and provingWindow is 60 minutes + return _buildTier(LibStrings.B_TIER_TEE_ANY, 2, 240, 60); + } + + // ZKVM Tiers: Allowing 120 minutes for proof aggregation. + if (_tierId == LibTiers.TIER_ZKVM_RISC0) { + // cooldownWindow is 240 minutes and provingWindow is 120 minutes + return _buildTier(LibStrings.B_TIER_ZKVM_RISC0, 3, 240, 120); + } + if (_tierId == LibTiers.TIER_ZKVM_SP1) { + // cooldownWindow is 240 minutes and provingWindow is 120 minutes + return _buildTier(LibStrings.B_TIER_ZKVM_SP1, 3, 240, 120); + } + if (_tierId == LibTiers.TIER_ZKVM_ANY) { + // cooldownWindow is 240 minutes and provingWindow is 90 minutes + return _buildTier(LibStrings.B_TIER_ZKVM_ANY, 3, 240, 120); + } + if (_tierId == LibTiers.TIER_ZKVM_AND_TEE) { + // cooldownWindow is 240 minutes and provingWindow is 90 minutes + return _buildTier(LibStrings.B_TIER_ZKVM_AND_TEE, 3, 240, 120); + } + + // Guardian Minority Tiers + if (_tierId == LibTiers.TIER_GUARDIAN_MINORITY) { + // cooldownWindow is 60 minutes and provingWindow is 120 minutes + return _buildTier(LibStrings.B_TIER_GUARDIAN_MINORITY, 4, 240, 120); + } + + // Guardian Major Tiers + if (_tierId == LibTiers.TIER_GUARDIAN) { + // cooldownWindow is 480 minutes + return _buildTier(LibStrings.B_TIER_GUARDIAN, 0, 480, 0); + } + + revert TIER_NOT_FOUND(); + } + + /// @dev Builds a generic tier with specified parameters. + /// @param _verifierName The name of the verifier. + /// @param _validityBondUnits The units of validity bonds. + /// @param _cooldownWindow The cooldown window duration in minutes. + /// @param _provingWindow The proving window duration in minutes. + /// @return A Tier struct with the provided parameters. + function _buildTier( + bytes32 _verifierName, + uint8 _validityBondUnits, + uint16 _cooldownWindow, + uint16 _provingWindow + ) + private + pure + returns (ITierProvider.Tier memory) + { + uint96 validityBond = BOND_UNIT * _validityBondUnits; + return ITierProvider.Tier({ + verifierName: _verifierName, + validityBond: validityBond, + contestBond: validityBond / 10_000 * 65_625, + cooldownWindow: _cooldownWindow, + provingWindow: _provingWindow, + maxBlocksToVerifyPerProof: 0 + }); + } +} diff --git a/packages/protocol/contracts/tko/TaikoToken.sol b/packages/protocol/contracts/layer1/token/TaikoToken.sol similarity index 65% rename from packages/protocol/contracts/tko/TaikoToken.sol rename to packages/protocol/contracts/layer1/token/TaikoToken.sol index 5643acac3f1..94a126138f2 100644 --- a/packages/protocol/contracts/tko/TaikoToken.sol +++ b/packages/protocol/contracts/layer1/token/TaikoToken.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "./TaikoTokenBase.sol"; +import "src/shared/token/TaikoTokenBase.sol"; /// @title TaikoToken /// @notice The TaikoToken (TKO), in the protocol is used for prover collateral @@ -14,19 +14,38 @@ contract TaikoToken is TaikoTokenBase { address private constant _TAIKO_L1 = 0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a; address private constant _ERC20_VAULT = 0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab; + error TT_INVALID_PARAM(); + /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. /// @param _recipient The address to receive initial token minting. - function init(address _owner, address _recipient) public initializer { __Essential_init(_owner); - __ERC20_init("Taiko Token", "TKO"); + __ERC20_init("Taiko Token", "TAIKO"); __ERC20Votes_init(); __ERC20Permit_init("Taiko Token"); // Mint 1 billion tokens _mint(_recipient, 1_000_000_000 ether); } + /// @notice Batch transfers tokens + /// @param recipients The list of addresses to transfer tokens to. + /// @param amounts The list of amounts for transfer. + /// @return true if the transfer is successful. + function batchTransfer( + address[] calldata recipients, + uint256[] calldata amounts + ) + external + returns (bool) + { + if (recipients.length != amounts.length) revert TT_INVALID_PARAM(); + for (uint256 i; i < recipients.length; ++i) { + _transfer(msg.sender, recipients[i], amounts[i]); + } + return true; + } + function delegates(address account) public view virtual override returns (address) { // Special checks to avoid reading from storage slots if (account == _TAIKO_L1 || account == _ERC20_VAULT) return address(0); diff --git a/packages/protocol/contracts/verifiers/IVerifier.sol b/packages/protocol/contracts/layer1/verifiers/IVerifier.sol similarity index 55% rename from packages/protocol/contracts/verifiers/IVerifier.sol rename to packages/protocol/contracts/layer1/verifiers/IVerifier.sol index a3e0091fcd2..ae9e91cbfe7 100644 --- a/packages/protocol/contracts/verifiers/IVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/IVerifier.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../L1/TaikoData.sol"; +import "../based/TaikoData.sol"; /// @title IVerifier /// @notice Defines the function that handles proof verification. @@ -17,6 +17,17 @@ interface IVerifier { address msgSender; } + struct ContextV2 { + bytes32 metaHash; + bytes32 blobHash; + address prover; + uint64 blockId; + bool isContesting; + bool blobUsed; + address msgSender; + TaikoData.Transition tran; + } + /// @notice Verifies a proof. /// @param _ctx The context of the proof verification. /// @param _tran The transition to verify. @@ -27,4 +38,13 @@ interface IVerifier { TaikoData.TierProof calldata _proof ) external; + + /// @notice Verifies multiple proofs. + /// @param _ctxs The array of contexts for the proof verifications. + /// @param _proof The batch proof to verify. + function verifyBatchProof( + ContextV2[] calldata _ctxs, + TaikoData.TierProof calldata _proof + ) + external; } diff --git a/packages/protocol/contracts/verifiers/libs/LibPublicInput.sol b/packages/protocol/contracts/layer1/verifiers/LibPublicInput.sol similarity index 94% rename from packages/protocol/contracts/verifiers/libs/LibPublicInput.sol rename to packages/protocol/contracts/layer1/verifiers/LibPublicInput.sol index 4bf3a6b7d1a..d85205fd53f 100644 --- a/packages/protocol/contracts/verifiers/libs/LibPublicInput.sol +++ b/packages/protocol/contracts/layer1/verifiers/LibPublicInput.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../../L1/TaikoData.sol"; +import "../../layer1/based/TaikoData.sol"; /// @title LibPublicInput /// @notice A library for handling hashing the so-called public input hash, used by sgx and zk diff --git a/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol b/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol new file mode 100644 index 00000000000..2700c1cefe7 --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@risc0/contracts/IRiscZeroVerifier.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "../based/ITaikoL1.sol"; +import "./LibPublicInput.sol"; +import "./IVerifier.sol"; + +/// @title Risc0Verifier +/// @custom:security-contact security@taiko.xyz +contract Risc0Verifier is EssentialContract, IVerifier { + // [32, 0, 0, 0] -- big-endian uint32(32) for hash bytes len + bytes private constant FIXED_JOURNAL_HEADER = hex"20000000"; + + /// @notice Trusted imageId mapping + mapping(bytes32 imageId => bool trusted) public isImageTrusted; + + uint256[49] private __gap; + + /// @dev Emitted when a trusted image is set / unset. + /// @param imageId The id of the image + /// @param trusted True if trusted, false otherwise + event ImageTrusted(bytes32 imageId, bool trusted); + + /// @dev Emitted when a proof is verified + event ProofVerified(bytes32 metaHash, bytes32 publicInputHash); + + error RISC_ZERO_INVALID_BLOCK_PROOF_IMAGE_ID(); + error RISC_ZERO_INVALID_AGGREGATION_IMAGE_ID(); + error RISC_ZERO_INVALID_PROOF(); + + /// @notice Initializes the contract with the provided address manager. + /// @param _owner The address of the owner. + /// @param _rollupAddressManager The address of the AddressManager. + function init(address _owner, address _rollupAddressManager) external initializer { + __Essential_init(_owner, _rollupAddressManager); + } + + /// @notice Sets/unsets an the imageId as trusted entity + /// @param _imageId The id of the image. + /// @param _trusted True if trusted, false otherwise. + function setImageIdTrusted(bytes32 _imageId, bool _trusted) external onlyOwner { + isImageTrusted[_imageId] = _trusted; + + emit ImageTrusted(_imageId, _trusted); + } + + /// @inheritdoc IVerifier + function verifyProof( + Context calldata _ctx, + TaikoData.Transition calldata _tran, + TaikoData.TierProof calldata _proof + ) + external + view + { + // Do not run proof verification to contest an existing proof + if (_ctx.isContesting) return; + + // Decode will throw if not proper length/encoding + (bytes memory seal, bytes32 imageId) = abi.decode(_proof.data, (bytes, bytes32)); + + require(isImageTrusted[imageId], RISC_ZERO_INVALID_BLOCK_PROOF_IMAGE_ID()); + + bytes32 publicInputHash = LibPublicInput.hashPublicInputs( + _tran, address(this), address(0), _ctx.prover, _ctx.metaHash, taikoChainId() + ); + + // journalDigest is the sha256 hash of the hashed public input + bytes32 journalDigest = sha256(bytes.concat(FIXED_JOURNAL_HEADER, publicInputHash)); + + // call risc0 verifier contract + (bool success,) = resolve(LibStrings.B_RISCZERO_GROTH16_VERIFIER, false).staticcall( + abi.encodeCall(IRiscZeroVerifier.verify, (seal, imageId, journalDigest)) + ); + require(success, RISC_ZERO_INVALID_PROOF()); + } + + /// @inheritdoc IVerifier + function verifyBatchProof( + ContextV2[] calldata _ctxs, + TaikoData.TierProof calldata _proof + ) + external + { + // Decode will throw if not proper length/encoding + (bytes memory seal, bytes32 blockImageId, bytes32 aggregationImageId) = + abi.decode(_proof.data, (bytes, bytes32, bytes32)); + + // Check if the aggregation program is trusted + require(isImageTrusted[aggregationImageId], RISC_ZERO_INVALID_AGGREGATION_IMAGE_ID()); + // Check if the block proving program is trusted + require(isImageTrusted[blockImageId], RISC_ZERO_INVALID_BLOCK_PROOF_IMAGE_ID()); + + // Collect public inputs + bytes32[] memory publicInputs = new bytes32[](_ctxs.length + 1); + // First public input is the block proving program key + publicInputs[0] = blockImageId; + // All other inputs are the block program public inputs (a single 32 byte value) + for (uint256 i; i < _ctxs.length; ++i) { + publicInputs[i + 1] = LibPublicInput.hashPublicInputs( + _ctxs[i].tran, + address(this), + address(0), + _ctxs[i].prover, + _ctxs[i].metaHash, + taikoChainId() + ); + emit ProofVerified(_ctxs[i].metaHash, publicInputs[i + 1]); + } + + // journalDigest is the sha256 hash of the hashed public input + bytes32 journalDigest = sha256(abi.encodePacked(publicInputs)); + + // call risc0 verifier contract + (bool success,) = resolve(LibStrings.B_RISCZERO_GROTH16_VERIFIER, false).staticcall( + abi.encodeCall(IRiscZeroVerifier.verify, (seal, aggregationImageId, journalDigest)) + ); + require(success, RISC_ZERO_INVALID_PROOF()); + } + + function taikoChainId() internal view virtual returns (uint64) { + return ITaikoL1(resolve(LibStrings.B_TAIKO, false)).getConfig().chainId; + } +} diff --git a/packages/protocol/contracts/layer1/verifiers/SP1Verifier.sol b/packages/protocol/contracts/layer1/verifiers/SP1Verifier.sol new file mode 100644 index 00000000000..cd3e62af336 --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/SP1Verifier.sol @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@sp1-contracts/src/ISP1Verifier.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "../based/ITaikoL1.sol"; +import "./LibPublicInput.sol"; +import "./IVerifier.sol"; + +/// @title SP1Verifier +/// @custom:security-contact security@taiko.xyz +contract SP1Verifier is EssentialContract, IVerifier { + /// @notice The verification keys mappings for the proving programs. + mapping(bytes32 provingProgramVKey => bool trusted) public isProgramTrusted; + + uint256[49] private __gap; + + /// @dev Emitted when a trusted image is set / unset. + /// @param programVKey The id of the image + /// @param trusted The block's assigned prover. + event ProgramTrusted(bytes32 programVKey, bool trusted); + + error SP1_INVALID_PROGRAM_VKEY(); + error SP1_INVALID_AGGREGATION_VKEY(); + error SP1_INVALID_PARAMS(); + error SP1_INVALID_PROOF(); + + /// @notice Initializes the contract with the provided address manager. + /// @param _owner The address of the owner. + /// @param _addressManager The address of the AddressManager. + function init(address _owner, address _addressManager) external initializer { + __Essential_init(_owner, _addressManager); + } + + /// @notice Sets/unsets an the program's verification key as trusted entity + /// @param _programVKey The verification key of the program. + /// @param _trusted True if trusted, false otherwise. + function setProgramTrusted(bytes32 _programVKey, bool _trusted) external onlyOwner { + isProgramTrusted[_programVKey] = _trusted; + + emit ProgramTrusted(_programVKey, _trusted); + } + + /// @inheritdoc IVerifier + function verifyProof( + Context calldata _ctx, + TaikoData.Transition calldata _tran, + TaikoData.TierProof calldata _proof + ) + external + view + { + // Do not run proof verification to contest an existing proof + if (_ctx.isContesting) return; + + // Avoid in-memory decoding, so in-place decode with slicing. + // e.g.: bytes32 programVKey = bytes32(_proof.data[0:32]); + require(isProgramTrusted[bytes32(_proof.data[0:32])], SP1_INVALID_PROGRAM_VKEY()); + + // Need to be converted from bytes32 to bytes + bytes32 hashedPublicInput = LibPublicInput.hashPublicInputs( + _tran, address(this), address(0), _ctx.prover, _ctx.metaHash, taikoChainId() + ); + + // _proof.data[32:] is the succinct's proof position + (bool success,) = sp1RemoteVerifier().staticcall( + abi.encodeCall( + ISP1Verifier.verifyProof, + (bytes32(_proof.data[0:32]), abi.encode(hashedPublicInput), _proof.data[32:]) + ) + ); + + require(success, SP1_INVALID_PROOF()); + } + + /// @inheritdoc IVerifier + function verifyBatchProof( + ContextV2[] calldata _ctxs, + TaikoData.TierProof calldata _proof + ) + external + view + { + require(_ctxs.length != 0 && _proof.data.length > 64, SP1_INVALID_PARAMS()); + // Extract the necessary data + bytes32 aggregationProgram = bytes32(_proof.data[0:32]); + bytes32 blockProvingProgram = bytes32(_proof.data[32:64]); + + // Check if the aggregation program is trusted + require(isProgramTrusted[aggregationProgram], SP1_INVALID_AGGREGATION_VKEY()); + // Check if the block proving program is trusted + require(isProgramTrusted[blockProvingProgram], SP1_INVALID_PROGRAM_VKEY()); + + // Collect public inputs + bytes32[] memory publicInputs = new bytes32[](_ctxs.length + 1); + // First public input is the block proving program key + publicInputs[0] = blockProvingProgram; + // All other inputs are the block program public inputs (a single 32 byte value) + for (uint256 i; i < _ctxs.length; ++i) { + publicInputs[i + 1] = LibPublicInput.hashPublicInputs( + _ctxs[i].tran, + address(this), + address(0), + _ctxs[i].prover, + _ctxs[i].metaHash, + taikoChainId() + ); + } + + // _proof.data[64:] is the succinct's proof position + (bool success,) = sp1RemoteVerifier().staticcall( + abi.encodeCall( + ISP1Verifier.verifyProof, + (aggregationProgram, abi.encodePacked(publicInputs), _proof.data[64:]) + ) + ); + + require(success, SP1_INVALID_PROOF()); + } + + function taikoChainId() internal view virtual returns (uint64) { + return ITaikoL1(resolve(LibStrings.B_TAIKO, false)).getConfig().chainId; + } + + function sp1RemoteVerifier() public view virtual returns (address) { + return resolve(LibStrings.B_SP1_REMOTE_VERIFIER, false); + } +} diff --git a/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol b/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol new file mode 100644 index 00000000000..1044bec19b4 --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol @@ -0,0 +1,265 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "../automata-attestation/interfaces/IAttestation.sol"; +import "../automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import "../based/ITaikoL1.sol"; +import "../based/TaikoData.sol"; +import "./LibPublicInput.sol"; +import "./IVerifier.sol"; + +/// @title SgxVerifier +/// @notice This contract is the implementation of verifying SGX signature proofs +/// onchain. +/// @dev Please see references below: +/// - Reference #1: https://ethresear.ch/t/2fa-zk-rollups-using-sgx/14462 +/// - Reference #2: https://github.com/gramineproject/gramine/discussions/1579 +/// @custom:security-contact security@taiko.xyz +contract SgxVerifier is EssentialContract, IVerifier { + /// @dev Each public-private key pair (Ethereum address) is generated within + /// the SGX program when it boots up. The off-chain remote attestation + /// ensures the validity of the program hash and has the capability of + /// bootstrapping the network with trustworthy instances. + struct Instance { + address addr; + uint64 validSince; + } + + /// @notice The expiry time for the SGX instance. + uint64 public constant INSTANCE_EXPIRY = 365 days; + + /// @notice A security feature, a delay until an instance is enabled when using onchain RA + /// verification + uint64 public constant INSTANCE_VALIDITY_DELAY = 0; + + /// @dev For gas savings, we shall assign each SGX instance with an id that when we need to + /// set a new pub key, just write storage once. + /// Slot 1. + uint256 public nextInstanceId; + + /// @dev One SGX instance is uniquely identified (on-chain) by it's ECDSA public key + /// (or rather ethereum address). Once that address is used (by proof verification) it has to be + /// overwritten by a new one (representing the same instance). This is due to side-channel + /// protection. Also this public key shall expire after some time + /// (for now it is a long enough 6 months setting). + /// Slot 2. + mapping(uint256 instanceId => Instance instance) public instances; + + /// @dev One address shall be registered (during attestation) only once, otherwise it could + /// bypass this contract's expiry check by always registering with the same attestation and + /// getting multiple valid instanceIds. While during proving, it is technically possible to + /// register the old addresses, it is less of a problem, because the instanceId would be the + /// same for those addresses and if deleted - the attestation cannot be reused anyways. + /// Slot 3. + mapping(address instanceAddress => bool alreadyAttested) public addressRegistered; + + uint256[47] private __gap; + + /// @notice Emitted when a new SGX instance is added to the registry, or replaced. + /// @param id The ID of the SGX instance. + /// @param instance The address of the SGX instance. + /// @param replaced The address of the SGX instance that was replaced. If it is the first + /// instance, this value is zero address. + /// @param validSince The time since the instance is valid. + event InstanceAdded( + uint256 indexed id, address indexed instance, address indexed replaced, uint256 validSince + ); + + /// @notice Emitted when an SGX instance is deleted from the registry. + /// @param id The ID of the SGX instance. + /// @param instance The address of the SGX instance. + event InstanceDeleted(uint256 indexed id, address indexed instance); + + error SGX_ALREADY_ATTESTED(); + error SGX_INVALID_ATTESTATION(); + error SGX_INVALID_INSTANCE(); + error SGX_INVALID_PROOF(); + error SGX_RA_NOT_SUPPORTED(); + + /// @notice Initializes the contract. + /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. + /// @param _rollupAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _rollupAddressManager) external initializer { + __Essential_init(_owner, _rollupAddressManager); + } + + /// @notice Adds trusted SGX instances to the registry. + /// @param _instances The address array of trusted SGX instances. + /// @return The respective instanceId array per addresses. + function addInstances(address[] calldata _instances) + external + onlyOwner + returns (uint256[] memory) + { + return _addInstances(_instances, true); + } + + /// @notice Deletes SGX instances from the registry. + /// @param _ids The ids array of SGX instances. + function deleteInstances(uint256[] calldata _ids) + external + onlyFromOwnerOrNamed(LibStrings.B_SGX_WATCHDOG) + { + for (uint256 i; i < _ids.length; ++i) { + uint256 idx = _ids[i]; + + require(instances[idx].addr != address(0), SGX_INVALID_INSTANCE()); + + emit InstanceDeleted(idx, instances[idx].addr); + + delete instances[idx]; + } + } + + /// @notice Adds an SGX instance after the attestation is verified + /// @param _attestation The parsed attestation quote. + /// @return The respective instanceId + function registerInstance(V3Struct.ParsedV3QuoteStruct calldata _attestation) + external + returns (uint256) + { + address automataDcapAttestation = resolve(LibStrings.B_AUTOMATA_DCAP_ATTESTATION, true); + + require(automataDcapAttestation != address(0), SGX_RA_NOT_SUPPORTED()); + + (bool verified,) = IAttestation(automataDcapAttestation).verifyParsedQuote(_attestation); + + require(verified, SGX_INVALID_ATTESTATION()); + + address[] memory addresses = new address[](1); + addresses[0] = address(bytes20(_attestation.localEnclaveReport.reportData)); + + return _addInstances(addresses, false)[0]; + } + + /// @inheritdoc IVerifier + function verifyProof( + Context calldata _ctx, + TaikoData.Transition calldata _tran, + TaikoData.TierProof calldata _proof + ) + external + onlyFromNamedEither(LibStrings.B_TAIKO, LibStrings.B_TIER_TEE_ANY) + { + // Do not run proof verification to contest an existing proof + if (_ctx.isContesting) return; + + // Size is: 89 bytes + // 4 bytes + 20 bytes + 65 bytes (signature) = 89 + require(_proof.data.length == 89, SGX_INVALID_PROOF()); + + uint32 id = uint32(bytes4(_proof.data[:4])); + address newInstance = address(bytes20(_proof.data[4:24])); + + address oldInstance = ECDSA.recover( + LibPublicInput.hashPublicInputs( + _tran, address(this), newInstance, _ctx.prover, _ctx.metaHash, taikoChainId() + ), + _proof.data[24:] + ); + + require(_isInstanceValid(id, oldInstance), SGX_INVALID_INSTANCE()); + + if (newInstance != oldInstance && newInstance != address(0)) { + _replaceInstance(id, oldInstance, newInstance); + } + } + + /// @inheritdoc IVerifier + function verifyBatchProof( + ContextV2[] calldata _ctxs, + TaikoData.TierProof calldata _proof + ) + external + onlyFromNamedEither(LibStrings.B_TAIKO, LibStrings.B_TIER_TEE_ANY) + { + // Size is: 109 bytes + // 4 bytes + 20 bytes + 20 bytes + 65 bytes (signature) = 109 + require(_proof.data.length == 109, SGX_INVALID_PROOF()); + + uint32 id = uint32(bytes4(_proof.data[:4])); + address oldInstance = address(bytes20(_proof.data[4:24])); + address newInstance = address(bytes20(_proof.data[24:44])); + bytes memory signature = _proof.data[44:]; + + // Collect public inputs + bytes32[] memory publicInputs = new bytes32[](_ctxs.length + 2); + // First public input is the current instance public key + publicInputs[0] = bytes32(uint256(uint160(oldInstance))); + publicInputs[1] = bytes32(uint256(uint160(newInstance))); + // All other inputs are the block program public inputs (a single 32 byte value) + for (uint256 i; i < _ctxs.length; ++i) { + // TODO: For now this assumes the new instance public key to remain the same + publicInputs[i + 2] = LibPublicInput.hashPublicInputs( + _ctxs[i].tran, + address(this), + newInstance, + _ctxs[i].prover, + _ctxs[i].metaHash, + taikoChainId() + ); + } + + bytes32 signatureHash = keccak256(abi.encodePacked(publicInputs)); + // Verify the blocks + require(oldInstance == ECDSA.recover(signatureHash, signature), SGX_INVALID_PROOF()); + + require(_isInstanceValid(id, oldInstance), SGX_INVALID_INSTANCE()); + + if (newInstance != oldInstance && newInstance != address(0)) { + _replaceInstance(id, oldInstance, newInstance); + } + } + + function taikoChainId() internal view virtual returns (uint64) { + return ITaikoL1(resolve(LibStrings.B_TAIKO, false)).getConfig().chainId; + } + + function _addInstances( + address[] memory _instances, + bool instantValid + ) + private + returns (uint256[] memory ids) + { + ids = new uint256[](_instances.length); + + uint64 validSince = uint64(block.timestamp); + + if (!instantValid) { + validSince += INSTANCE_VALIDITY_DELAY; + } + + for (uint256 i; i < _instances.length; ++i) { + require(!addressRegistered[_instances[i]], SGX_ALREADY_ATTESTED()); + + addressRegistered[_instances[i]] = true; + + require(_instances[i] != address(0), SGX_INVALID_INSTANCE()); + + instances[nextInstanceId] = Instance(_instances[i], validSince); + ids[i] = nextInstanceId; + + emit InstanceAdded(nextInstanceId, _instances[i], address(0), validSince); + + ++nextInstanceId; + } + } + + function _replaceInstance(uint256 id, address oldInstance, address newInstance) private { + // Replacing an instance means, it went through a cooldown (if added by on-chain RA) so no + // need to have a cooldown + instances[id] = Instance(newInstance, uint64(block.timestamp)); + emit InstanceAdded(id, newInstance, oldInstance, block.timestamp); + } + + function _isInstanceValid(uint256 id, address instance) private view returns (bool) { + require(instance != address(0), SGX_INVALID_INSTANCE()); + require(instance == instances[id].addr, SGX_INVALID_INSTANCE()); + return instances[id].validSince <= block.timestamp + && block.timestamp <= instances[id].validSince + INSTANCE_EXPIRY; + } +} diff --git a/packages/protocol/contracts/verifiers/SgxVerifier.sol b/packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol similarity index 68% rename from packages/protocol/contracts/verifiers/SgxVerifier.sol rename to packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol index f8472371a5b..451d88604a3 100644 --- a/packages/protocol/contracts/verifiers/SgxVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol @@ -1,23 +1,18 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import "../L1/ITaikoL1.sol"; -import "../common/EssentialContract.sol"; -import "../common/LibStrings.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; import "../automata-attestation/interfaces/IAttestation.sol"; import "../automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; -import "./libs/LibPublicInput.sol"; -import "./IVerifier.sol"; -/// @title SgxVerifier -/// @notice This contract is the implementation of verifying SGX signature proofs -/// onchain. +/// @title SgxVerifierBase /// @dev Please see references below: /// - Reference #1: https://ethresear.ch/t/2fa-zk-rollups-using-sgx/14462 /// - Reference #2: https://github.com/gramineproject/gramine/discussions/1579 /// @custom:security-contact security@taiko.xyz -contract SgxVerifier is EssentialContract, IVerifier { +abstract contract SgxVerifierBase is EssentialContract { /// @dev Each public-private key pair (Ethereum address) is generated within /// the SGX program when it boots up. The off-chain remote attestation /// ensures the validity of the program hash and has the capability of @@ -78,11 +73,25 @@ contract SgxVerifier is EssentialContract, IVerifier { error SGX_INVALID_PROOF(); error SGX_RA_NOT_SUPPORTED(); - /// @notice Initializes the contract. - /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @notice Register an SGX instance after the attestation is verified + /// @param _attestation The parsed attestation quote. + /// @return The respective instanceId + function registerInstance(V3Struct.ParsedV3QuoteStruct calldata _attestation) + external + returns (uint256) + { + address automataDcapAttestation = resolve(LibStrings.B_AUTOMATA_DCAP_ATTESTATION, true); + + require(automataDcapAttestation != address(0), SGX_RA_NOT_SUPPORTED()); + + (bool verified,) = IAttestation(automataDcapAttestation).verifyParsedQuote(_attestation); + + require(verified, SGX_INVALID_ATTESTATION()); + + address[] memory addresses = new address[](1); + addresses[0] = address(bytes20(_attestation.localEnclaveReport.reportData)); + + return _addInstances(addresses, false)[0]; } /// @notice Adds trusted SGX instances to the registry. @@ -105,7 +114,7 @@ contract SgxVerifier is EssentialContract, IVerifier { for (uint256 i; i < _ids.length; ++i) { uint256 idx = _ids[i]; - if (instances[idx].addr == address(0)) revert SGX_INVALID_INSTANCE(); + require(instances[idx].addr != address(0), SGX_INVALID_INSTANCE()); emit InstanceDeleted(idx, instances[idx].addr); @@ -113,69 +122,11 @@ contract SgxVerifier is EssentialContract, IVerifier { } } - /// @notice Adds an SGX instance after the attestation is verified - /// @param _attestation The parsed attestation quote. - /// @return The respective instanceId - function registerInstance(V3Struct.ParsedV3QuoteStruct calldata _attestation) - external - returns (uint256) - { - address automataDcapAttestation = resolve(LibStrings.B_AUTOMATA_DCAP_ATTESTATION, true); - - if (automataDcapAttestation == address(0)) { - revert SGX_RA_NOT_SUPPORTED(); - } - - (bool verified,) = IAttestation(automataDcapAttestation).verifyParsedQuote(_attestation); - - if (!verified) revert SGX_INVALID_ATTESTATION(); - - address[] memory _address = new address[](1); - _address[0] = address(bytes20(_attestation.localEnclaveReport.reportData)); - - return _addInstances(_address, false)[0]; - } - - /// @inheritdoc IVerifier - function verifyProof( - Context calldata _ctx, - TaikoData.Transition calldata _tran, - TaikoData.TierProof calldata _proof - ) - external - onlyFromNamed(LibStrings.B_TAIKO) - { - // Do not run proof verification to contest an existing proof - if (_ctx.isContesting) return; - - // Size is: 89 bytes - // 4 bytes + 20 bytes + 65 bytes (signature) = 89 - if (_proof.data.length != 89) revert SGX_INVALID_PROOF(); - - uint32 id = uint32(bytes4(_proof.data[:4])); - address newInstance = address(bytes20(_proof.data[4:24])); - - uint64 chainId = ITaikoL1(resolve(LibStrings.B_TAIKO, false)).getConfig().chainId; - - address oldInstance = ECDSA.recover( - LibPublicInput.hashPublicInputs( - _tran, address(this), newInstance, _ctx.prover, _ctx.metaHash, chainId - ), - _proof.data[24:] - ); - - if (!_isInstanceValid(id, oldInstance)) revert SGX_INVALID_INSTANCE(); - - if (oldInstance != newInstance) { - _replaceInstance(id, oldInstance, newInstance); - } - } - function _addInstances( address[] memory _instances, bool instantValid ) - private + internal returns (uint256[] memory ids) { ids = new uint256[](_instances.length); @@ -187,11 +138,11 @@ contract SgxVerifier is EssentialContract, IVerifier { } for (uint256 i; i < _instances.length; ++i) { - if (addressRegistered[_instances[i]]) revert SGX_ALREADY_ATTESTED(); + require(!addressRegistered[_instances[i]], SGX_ALREADY_ATTESTED()); addressRegistered[_instances[i]] = true; - if (_instances[i] == address(0)) revert SGX_INVALID_INSTANCE(); + require(_instances[i] != address(0), SGX_INVALID_INSTANCE()); instances[nextInstanceId] = Instance(_instances[i], validSince); ids[i] = nextInstanceId; @@ -202,14 +153,14 @@ contract SgxVerifier is EssentialContract, IVerifier { } } - function _replaceInstance(uint256 id, address oldInstance, address newInstance) private { + function _replaceInstance(uint256 id, address oldInstance, address newInstance) internal { // Replacing an instance means, it went through a cooldown (if added by on-chain RA) so no // need to have a cooldown instances[id] = Instance(newInstance, uint64(block.timestamp)); emit InstanceAdded(id, newInstance, oldInstance, block.timestamp); } - function _isInstanceValid(uint256 id, address instance) private view returns (bool) { + function _isInstanceValid(uint256 id, address instance) internal view returns (bool) { if (instance == address(0)) return false; if (instance != instances[id].addr) return false; return instances[id].validSince <= block.timestamp diff --git a/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol new file mode 100644 index 00000000000..da4d2ef4bda --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "../IVerifier.sol"; + +/// @title ComposeVerifier +/// @notice This contract is an abstract verifier that composes multiple sub-verifiers to validate +/// proofs. +/// It ensures that a set of sub-proofs are verified by their respective verifiers before +/// considering the overall proof as valid. +/// @custom:security-contact security@taiko.xyz +abstract contract ComposeVerifier is EssentialContract, IVerifier { + uint256[50] private __gap; + + struct SubProof { + address verifier; + bytes proof; + } + + error CV_INVALID_CALLER(); + error CV_INVALID_SUB_VERIFIER(); + error CV_INVALID_SUBPROOF_LENGTH(); + error CV_SUB_VERIFIER_NOT_FOUND(); + + modifier onlyAuthorizedCaller() { + require(isCallerAuthorized(msg.sender), CV_INVALID_CALLER()); + _; + } + + /// @notice Initializes the contract. + /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. + /// @param _rollupAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _rollupAddressManager) external initializer { + __Essential_init(_owner, _rollupAddressManager); + } + + /// @inheritdoc IVerifier + function verifyProof( + Context calldata _ctx, + TaikoData.Transition calldata _tran, + TaikoData.TierProof calldata _proof + ) + external + onlyAuthorizedCaller + nonReentrant + { + (address[] memory verifiers, uint256 numSubProofs_) = getSubVerifiersAndThreshold(); + + SubProof[] memory subProofs = abi.decode(_proof.data, (SubProof[])); + require(subProofs.length == numSubProofs_, CV_INVALID_SUBPROOF_LENGTH()); + + for (uint256 i; i < subProofs.length; ++i) { + require(subProofs[i].verifier != address(0), CV_INVALID_SUB_VERIFIER()); + + // find the verifier + bool verifierFound; + for (uint256 j; j < verifiers.length; ++j) { + if (verifiers[j] == subProofs[i].verifier) { + verifierFound = true; + verifiers[j] = address(0); + } + } + + require(verifierFound, CV_SUB_VERIFIER_NOT_FOUND()); + + IVerifier(subProofs[i].verifier).verifyProof( + _ctx, _tran, TaikoData.TierProof(_proof.tier, subProofs[i].proof) + ); + } + } + + /// @inheritdoc IVerifier + function verifyBatchProof( + ContextV2[] calldata _ctxs, + TaikoData.TierProof calldata _proof + ) + external + onlyAuthorizedCaller + nonReentrant + { + (address[] memory verifiers, uint256 numSubProofs_) = getSubVerifiersAndThreshold(); + + SubProof[] memory subProofs = abi.decode(_proof.data, (SubProof[])); + require(subProofs.length == numSubProofs_, CV_INVALID_SUBPROOF_LENGTH()); + + for (uint256 i; i < subProofs.length; ++i) { + require(subProofs[i].verifier != address(0), CV_INVALID_SUB_VERIFIER()); + + // find the verifier + bool verifierFound; + for (uint256 j; j < verifiers.length; ++j) { + if (verifiers[j] == subProofs[i].verifier) { + verifierFound = true; + verifiers[j] = address(0); + } + } + + require(verifierFound, CV_SUB_VERIFIER_NOT_FOUND()); + + IVerifier(subProofs[i].verifier).verifyBatchProof( + _ctxs, TaikoData.TierProof(_proof.tier, subProofs[i].proof) + ); + } + } + + /// @notice Returns the list of sub-verifiers and calculates the threshold. + /// @return verifiers_ An array of addresses of sub-verifiers. + /// @return numSubProofs_ The number of sub proofs required. + function getSubVerifiersAndThreshold() + public + view + virtual + returns (address[] memory verifiers_, uint256 numSubProofs_); + + /// @notice Checks if the caller is authorized. + /// @param _caller The address of the caller to be checked. + /// @return A boolean value indicating whether the caller is authorized. + function isCallerAuthorized(address _caller) public view virtual returns (bool) { + return _caller == resolve(LibStrings.B_TAIKO, false); + } +} diff --git a/packages/protocol/contracts/layer1/verifiers/compose/TeeAnyVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/TeeAnyVerifier.sol new file mode 100644 index 00000000000..5b22fa94c2e --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/compose/TeeAnyVerifier.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibStrings.sol"; +import "./ComposeVerifier.sol"; + +/// @title TeeAnyVerifier +/// @custom:security-contact security@taiko.xyz +contract TeeAnyVerifier is ComposeVerifier { + uint256[50] private __gap; + + /// @inheritdoc ComposeVerifier + function isCallerAuthorized(address _caller) public view override returns (bool) { + return _caller == resolve(LibStrings.B_TAIKO, false) + || _caller == resolve(LibStrings.B_TIER_ZKVM_AND_TEE, true); + } + + /// @inheritdoc ComposeVerifier + function getSubVerifiersAndThreshold() + public + view + override + returns (address[] memory verifiers_, uint256 numSubProofs_) + { + verifiers_ = new address[](2); + verifiers_[0] = resolve(LibStrings.B_TIER_SGX, true); + verifiers_[1] = resolve(LibStrings.B_TIER_TDX, true); + numSubProofs_ = 1; + } +} diff --git a/packages/protocol/contracts/layer1/verifiers/compose/ZkAndTeeVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/ZkAndTeeVerifier.sol new file mode 100644 index 00000000000..58293f60c06 --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/compose/ZkAndTeeVerifier.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibStrings.sol"; +import "./ComposeVerifier.sol"; + +/// @title ZkAndTeeVerifier +/// @custom:security-contact security@taiko.xyz +contract ZkAndTeeVerifier is ComposeVerifier { + uint256[50] private __gap; + + /// @inheritdoc ComposeVerifier + function getSubVerifiersAndThreshold() + public + view + override + returns (address[] memory verifiers_, uint256 numSubProofs_) + { + verifiers_ = new address[](2); + verifiers_[0] = resolve(LibStrings.B_TIER_TEE_ANY, false); + verifiers_[1] = resolve(LibStrings.B_TIER_ZKVM_ANY, false); + numSubProofs_ = 2; + } +} diff --git a/packages/protocol/contracts/layer1/verifiers/compose/ZkAnyVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/ZkAnyVerifier.sol new file mode 100644 index 00000000000..2dd0e5f6a04 --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/compose/ZkAnyVerifier.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibStrings.sol"; +import "./ComposeVerifier.sol"; + +/// @title ZkAnyVerifier +/// @custom:security-contact security@taiko.xyz +contract ZkAnyVerifier is ComposeVerifier { + uint256[50] private __gap; + + /// @inheritdoc ComposeVerifier + function isCallerAuthorized(address _caller) public view override returns (bool) { + return _caller == resolve(LibStrings.B_TAIKO, false) + || _caller == resolve(LibStrings.B_TIER_ZKVM_AND_TEE, true); + } + + /// @inheritdoc ComposeVerifier + function getSubVerifiersAndThreshold() + public + view + override + returns (address[] memory verifiers_, uint256 numSubProofs_) + { + verifiers_ = new address[](2); + verifiers_[0] = resolve(LibStrings.B_TIER_ZKVM_RISC0, true); + verifiers_[1] = resolve(LibStrings.B_TIER_ZKVM_SP1, true); + numSubProofs_ = 1; + } +} diff --git a/packages/protocol/contracts/layer2/DelegateOwner.sol b/packages/protocol/contracts/layer2/DelegateOwner.sol new file mode 100644 index 00000000000..182e24d533a --- /dev/null +++ b/packages/protocol/contracts/layer2/DelegateOwner.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../shared/common/EssentialContract.sol"; +import "../shared/common/LibStrings.sol"; +import "../shared/common/LibAddress.sol"; +import "../shared/common/LibBytes.sol"; +import "../shared/bridge/IBridge.sol"; + +/// @title DelegateOwner +/// @notice This contract will be the owner of all essential contracts deployed on the L2 chain. +/// @dev Notice that when sending the message on the owner chain, the gas limit of the message must +/// not be zero, so on this chain, some EOA can help execute this transaction. +/// @custom:security-contact security@taiko.xyz +contract DelegateOwner is EssentialContract, IMessageInvocable { + /// @notice The owner chain ID. + uint64 public remoteChainId; // slot 1 + + /// @notice The admin who can directly call `invokeCall`. + address public admin; + + /// @notice The next transaction ID. + uint64 public nextTxId; // slot 2 + + /// @notice The real owner on L1, supposedly the DAO. + address public remoteOwner; + + uint256[48] private __gap; + + struct Call { + uint64 txId; + address target; + bool isDelegateCall; + bytes txdata; + } + + /// @notice Emitted when a message is invoked. + /// @param txId The transaction ID. + /// @param target The target address. + /// @param isDelegateCall True if the call is a `delegatecall`. + /// @param txdata The transaction data. + event MessageInvoked( + uint64 indexed txId, address indexed target, bool isDelegateCall, bytes txdata + ); + + /// @notice Emitted when the admin has been changed. + /// @param oldAdmin The old admin address. + /// @param newAdmin The new admin address. + event AdminUpdated(address indexed oldAdmin, address indexed newAdmin); + + error DO_DRYRUN_SUCCEEDED(); + error DO_INVALID_PARAM(); + error DO_INVALID_SENDER(); + error DO_INVALID_TARGET(); + error DO_INVALID_TX_ID(); + error DO_PERMISSION_DENIED(); + + modifier onlyAdminOrRemoteOwner() { + if (!_isAdminOrRemoteOwner(msg.sender)) revert DO_PERMISSION_DENIED(); + _; + } + + /// @notice Initializes the contract. + /// @param _remoteOwner The real owner on L1 that can send a cross-chain message to invoke + /// `onMessageInvocation`. + /// @param _remoteChainId The L1 chain's ID. + /// @param _sharedAddressManager The address of the {AddressManager} contract. + /// @param _admin The admin address. + function init( + address _remoteOwner, + address _sharedAddressManager, + uint64 _remoteChainId, + address _admin + ) + external + initializer + { + // This contract's owner will be itself. + __Essential_init(address(this), _sharedAddressManager); + + if (_remoteOwner == address(0) || _remoteChainId == 0 || _remoteChainId == block.chainid) { + revert DO_INVALID_PARAM(); + } + + remoteChainId = _remoteChainId; + remoteOwner = _remoteOwner; + admin = _admin; + } + + /// @inheritdoc IMessageInvocable + function onMessageInvocation(bytes calldata _data) external payable onlyAdminOrRemoteOwner { + _invokeCall(_data, true); + } + + /// @notice Dryruns a message invocation but always revert. + /// If this tx is reverted with DO_TRY_RUN_SUCCEEDED, the try run is successful. + /// Note that this function shall not be used in transaction and is designed for offchain + /// simulation only. + function dryrunInvocation(bytes calldata _data) external payable { + _invokeCall(_data, false); + revert DO_DRYRUN_SUCCEEDED(); + } + + /// @dev Updates the admin address. + /// @param _admin The new admin address. + function setAdmin(address _admin) external nonReentrant onlyOwner { + if (_admin == admin || _admin == address(this)) revert DO_INVALID_PARAM(); + + emit AdminUpdated(admin, _admin); + admin = _admin; + } + + /// @dev Accepts contract ownership + /// @param _target Target addresses. + function acceptOwnership(address _target) external nonReentrant onlyOwner { + Ownable2StepUpgradeable(_target).acceptOwnership(); + } + + function transferOwnership(address) public pure override notImplemented { } + + function _authorizePause(address, bool) internal pure override notImplemented { } + + function _invokeCall(bytes calldata _data, bool _verifyTxId) private { + Call memory call = abi.decode(_data, (Call)); + + if (call.txId == 0) { + call.txId = nextTxId; + } else if (_verifyTxId && call.txId != nextTxId) { + revert DO_INVALID_TX_ID(); + } + + nextTxId += 1; + + // By design, the target must be a contract address if the txdata is not empty + if (call.txdata.length != 0 && !Address.isContract(call.target)) revert DO_INVALID_TARGET(); + + (bool success, bytes memory result) = call.isDelegateCall // + ? call.target.delegatecall(call.txdata) + : call.target.call{ value: msg.value }(call.txdata); + + if (!success) LibBytes.revertWithExtractedError(result); + emit MessageInvoked(call.txId, call.target, call.isDelegateCall, call.txdata); + } + + function _isAdminOrRemoteOwner(address _sender) private view returns (bool) { + if (_sender == admin) return true; + if (_sender != resolve(LibStrings.B_BRIDGE, false)) return false; + + IBridge.Context memory ctx = IBridge(_sender).context(); + return ctx.srcChainId == remoteChainId && ctx.from == remoteOwner; + } +} diff --git a/packages/protocol/contracts/layer2/based/IBlockHash.sol b/packages/protocol/contracts/layer2/based/IBlockHash.sol new file mode 100644 index 00000000000..21f57452034 --- /dev/null +++ b/packages/protocol/contracts/layer2/based/IBlockHash.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title IBlockHash +/// @notice Interface for retrieving block hashes. +interface IBlockHash { + /// @notice Retrieves the block hash for a given block ID. + /// @param _blockId The ID of the block whose hash is being requested. + /// @return The block hash of the specified block ID, or 0 if no hash is found. + function getBlockHash(uint256 _blockId) external view returns (bytes32); +} diff --git a/packages/protocol/contracts/layer2/based/LibEIP1559.sol b/packages/protocol/contracts/layer2/based/LibEIP1559.sol new file mode 100644 index 00000000000..b1c57926ff3 --- /dev/null +++ b/packages/protocol/contracts/layer2/based/LibEIP1559.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@solady/src/utils/FixedPointMathLib.sol"; +import "src/shared/common/LibMath.sol"; + +/// @title LibEIP1559 +/// @notice Implements e^(x) based bonding curve for EIP-1559 +/// @dev See https://ethresear.ch/t/make-eip-1559-more-like-an-amm-curve/9082 but some minor +/// difference as stated in docs/eip1559_on_l2.md. +/// @custom:security-contact security@taiko.xyz +library LibEIP1559 { + using LibMath for uint256; + + /// @notice The maximum allowable input value for the exp() function. + uint128 public constant MAX_EXP_INPUT = 135_305_999_368_893_231_588; + + /// @notice Calculates the base fee and gas excess for EIP-1559 + /// @param _gasTarget The target gas usage + /// @param _gasExcess The current gas excess + /// @param _gasIssuance The gas issuance + /// @param _parentGasUsed The gas used by the parent block + /// @param _minGasExcess The minimum gas excess + /// @return basefee_ The calculated base fee + /// @return gasExcess_ The calculated gas excess + function calc1559BaseFee( + uint64 _gasTarget, + uint64 _gasExcess, + uint64 _gasIssuance, + uint32 _parentGasUsed, + uint64 _minGasExcess + ) + internal + pure + returns (uint256 basefee_, uint64 gasExcess_) + { + // We always add the gas used by parent block to the gas excess + // value as this has already happened + uint256 excess = uint256(_gasExcess) + _parentGasUsed; + excess = excess > _gasIssuance ? excess - _gasIssuance : 1; + gasExcess_ = uint64(excess.max(_minGasExcess).min(type(uint64).max)); + + // The base fee per gas used by this block is the spot price at the + // bonding curve, regardless the actual amount of gas used by this + // block, however, this block's gas used will affect the next + // block's base fee. + basefee_ = basefee(_gasTarget, gasExcess_); + } + + /// @dev Adjusts the gas excess to maintain the same base fee when the gas target changes. + /// The formula used for adjustment is: + /// `_newGasTarget*ln(_newGasTarget/_gasTarget)+_gasExcess*_newGasTarget/_gasTarget` + /// @param _oldGasTarget The current gas target. + /// @param _newGasTarget The new gas target. + /// @param _oldGasExcess The current gas excess. + /// @return newGasTarget_ The new gas target value. + /// @return newGasExcess_ The new gas excess value. + function adjustExcess( + uint64 _oldGasTarget, + uint64 _newGasTarget, + uint64 _oldGasExcess + ) + internal + pure + returns (uint64 newGasTarget_, uint64 newGasExcess_) + { + uint256 f = FixedPointMathLib.WAD; + + if (_oldGasTarget == 0) { + return (_newGasTarget, _oldGasExcess); + } + + if ( + _newGasTarget == 0 || _oldGasTarget == _newGasTarget + || _newGasTarget >= type(uint256).max / f + ) { + return (_oldGasTarget, _oldGasExcess); + } + + uint256 ratio = f * _newGasTarget / _oldGasTarget; + if (ratio == 0 || ratio > uint256(type(int256).max)) { + return (_newGasTarget, _oldGasExcess); + } + + int256 lnRatio = FixedPointMathLib.lnWad(int256(ratio)); // may be negative + uint256 newGasExcess; + + assembly { + // compute x = (_newGasTarget * lnRatio + _gasExcess * ratio) + let x := add(mul(_newGasTarget, lnRatio), mul(_oldGasExcess, ratio)) + + // If x < 0, set newGasExcess to 0, otherwise calculate newGasExcess = x / f + switch slt(x, 0) + case 1 { newGasExcess := 0 } + default { newGasExcess := div(x, f) } + } + + return (_newGasTarget, newGasExcess.capToUint64()); + } + + /// @dev Calculates the base fee using the formula: exp(_gasExcess/_gasTarget)/_gasTarget + /// @param _gasTarget The current gas target. + /// @param _gasExcess The current gas excess. + /// @return The calculated base fee. + function basefee(uint64 _gasTarget, uint64 _gasExcess) internal pure returns (uint256) { + if (_gasTarget == 0) return 1; + + return (ethQty(_gasTarget, _gasExcess) / _gasTarget).max(1); + } + + /// @dev Calculates the exponential of the ratio of gas excess to gas target. + /// @param _gasTarget The current gas target. + /// @param _gasExcess The current gas excess. + /// @return The calculated exponential value. + function ethQty(uint64 _gasTarget, uint64 _gasExcess) internal pure returns (uint256) { + assert(_gasTarget != 0); + uint256 input = FixedPointMathLib.WAD * _gasExcess / _gasTarget; + if (input > MAX_EXP_INPUT) { + input = MAX_EXP_INPUT; + } + return uint256(FixedPointMathLib.expWad(int256(input))) / FixedPointMathLib.WAD; + } +} diff --git a/packages/protocol/contracts/L2/LibL2Config.sol b/packages/protocol/contracts/layer2/based/LibL2Config.sol similarity index 88% rename from packages/protocol/contracts/L2/LibL2Config.sol rename to packages/protocol/contracts/layer2/based/LibL2Config.sol index 70af37013b8..f1a7586d7f7 100644 --- a/packages/protocol/contracts/L2/LibL2Config.sol +++ b/packages/protocol/contracts/layer2/based/LibL2Config.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; +/// @dev DEPRECATED but used by node/client for syncing old blocks /// @title LibL2Config library LibL2Config { struct Config { diff --git a/packages/protocol/contracts/layer2/based/TaikoL2.sol b/packages/protocol/contracts/layer2/based/TaikoL2.sol new file mode 100644 index 00000000000..e9baedd74aa --- /dev/null +++ b/packages/protocol/contracts/layer2/based/TaikoL2.sol @@ -0,0 +1,341 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibAddress.sol"; +import "src/shared/common/LibMath.sol"; +import "src/shared/signal/ISignalService.sol"; +import "./LibEIP1559.sol"; +import "./LibL2Config.sol"; +import "./IBlockHash.sol"; +import "./TaikoL2Deprecated.sol"; + +/// @title TaikoL2 +/// @notice Taiko L2 is a smart contract that handles cross-layer message +/// verification and manages EIP-1559 gas pricing for Layer 2 (L2) operations. +/// It is used to anchor the latest L1 block details to L2 for cross-layer +/// communication, manage EIP-1559 parameters for gas pricing, and store +/// verified L1 block information. +/// @custom:security-contact security@taiko.xyz +contract TaikoL2 is EssentialContract, IBlockHash, TaikoL2Deprecated { + using LibAddress for address; + using LibMath for uint256; + using SafeERC20 for IERC20; + + /// @notice Golden touch address is the only address that can do the anchor transaction. + address public constant GOLDEN_TOUCH_ADDRESS = 0x0000777735367b36bC9B61C50022d9D0700dB4Ec; + + /// @notice Mapping from L2 block numbers to their block hashes. All L2 block hashes will + /// be saved in this mapping. + mapping(uint256 blockId => bytes32 blockHash) private _blockhashes; + + /// @notice A hash to check the integrity of public inputs. + /// @dev Slot 2. + bytes32 public publicInputHash; + + /// @notice The gas excess value used to calculate the base fee. + /// @dev Slot 3. + uint64 public parentGasExcess; + + /// @notice The last synced L1 block height. + uint64 public lastSyncedBlock; + + /// @notice The last L2 block's timestamp. + uint64 public parentTimestamp; + + /// @notice The last L2 block's gas target. + uint64 public parentGasTarget; + + /// @notice The L1's chain ID. + uint64 public l1ChainId; + + uint256[46] private __gap; + + /// @notice Emitted when the latest L1 block details are anchored to L2. + /// @param parentHash The hash of the parent block. + /// @param parentGasExcess The gas excess value used to calculate the base fee. + event Anchored(bytes32 parentHash, uint64 parentGasExcess); + + /// @notice Emitted when the gas target has been updated. + /// @param oldGasTarget The previous gas target. + /// @param newGasTarget The new gas target. + /// @param oldGasExcess The previous gas excess. + /// @param newGasExcess The new gas excess. + /// @param basefee The base fee in this block. + event EIP1559Update( + uint64 oldGasTarget, + uint64 newGasTarget, + uint64 oldGasExcess, + uint64 newGasExcess, + uint256 basefee + ); + + error L2_BASEFEE_MISMATCH(); + error L2_FORK_ERROR(); + error L2_INVALID_L1_CHAIN_ID(); + error L2_INVALID_L2_CHAIN_ID(); + error L2_INVALID_PARAM(); + error L2_INVALID_SENDER(); + error L2_PUBLIC_INPUT_HASH_MISMATCH(); + error L2_TOO_LATE(); + + modifier onlyGoldenTouch() { + require(msg.sender == GOLDEN_TOUCH_ADDRESS, L2_INVALID_SENDER()); + _; + } + + /// @notice Initializes the contract. + /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. + /// @param _rollupAddressManager The address of the {AddressManager} contract. + /// @param _l1ChainId The ID of the base layer. + /// @param _initialGasExcess The initial parentGasExcess. + function init( + address _owner, + address _rollupAddressManager, + uint64 _l1ChainId, + uint64 _initialGasExcess + ) + external + initializer + { + __Essential_init(_owner, _rollupAddressManager); + + require(_l1ChainId != 0, L2_INVALID_L1_CHAIN_ID()); + require(_l1ChainId != block.chainid, L2_INVALID_L1_CHAIN_ID()); + require(block.chainid > 1, L2_INVALID_L2_CHAIN_ID()); + require(block.chainid <= type(uint64).max, L2_INVALID_L2_CHAIN_ID()); + + if (block.number == 0) { + // This is the case in real L2 genesis + } else if (block.number == 1) { + // This is the case in tests + uint256 parentHeight = block.number - 1; + _blockhashes[parentHeight] = blockhash(parentHeight); + } else { + revert L2_TOO_LATE(); + } + + l1ChainId = _l1ChainId; + parentGasExcess = _initialGasExcess; + (publicInputHash,) = _calcPublicInputHash(block.number); + } + + /// @notice Anchors the latest L1 block details to L2 for cross-layer + /// message verification. + /// @dev This function can be called freely as the golden touch private key is publicly known, + /// but the Taiko node guarantees the first transaction of each block is always this anchor + /// transaction, and any subsequent calls will revert with L2_PUBLIC_INPUT_HASH_MISMATCH. + /// @param _anchorBlockId The `anchorBlockId` value in this block's metadata. + /// @param _anchorStateRoot The state root for the L1 block with id equals `_anchorBlockId`. + /// @param _parentGasUsed The gas used in the parent block. + /// @param _baseFeeConfig The base fee configuration. + function anchorV2( + uint64 _anchorBlockId, + bytes32 _anchorStateRoot, + uint32 _parentGasUsed, + LibSharedData.BaseFeeConfig calldata _baseFeeConfig + ) + external + nonZeroBytes32(_anchorStateRoot) + nonZeroValue(_anchorBlockId) + nonZeroValue(_baseFeeConfig.gasIssuancePerSecond) + nonZeroValue(_baseFeeConfig.adjustmentQuotient) + onlyGoldenTouch + nonReentrant + { + require(block.number >= ontakeForkHeight(), L2_FORK_ERROR()); + + uint256 parentId = block.number - 1; + _verifyAndUpdatePublicInputHash(parentId); + _verifyBaseFeeAndUpdateGasExcess(_parentGasUsed, _baseFeeConfig); + _syncChainData(_anchorBlockId, _anchorStateRoot); + _updateParentHashAndTimestamp(parentId); + } + + /// @notice Withdraw token or Ether from this address. + /// Note: This contract receives a portion of L2 base fees, while the remainder is directed to + /// L2 block's coinbase address. + /// @param _token Token address or address(0) if Ether. + /// @param _to Withdraw to address. + function withdraw( + address _token, + address _to + ) + external + nonZeroAddr(_to) + whenNotPaused + onlyFromOwnerOrNamed(LibStrings.B_WITHDRAWER) + nonReentrant + { + if (_token == address(0)) { + _to.sendEtherAndVerify(address(this).balance); + } else { + IERC20(_token).safeTransfer(_to, IERC20(_token).balanceOf(address(this))); + } + } + + /// @notice Calculates the base fee and gas excess using EIP-1559 configuration for the given + /// parameters. + /// @param _parentGasUsed Gas used in the parent block. + /// @param _baseFeeConfig Configuration parameters for base fee calculation. + /// @return basefee_ The calculated EIP-1559 base fee per gas. + /// @return newGasTarget_ The new gas target value. + /// @return newGasExcess_ The new gas excess value. + function getBasefeeV2( + uint32 _parentGasUsed, + uint64 _blockTimestamp, + LibSharedData.BaseFeeConfig calldata _baseFeeConfig + ) + public + view + returns (uint256 basefee_, uint64 newGasTarget_, uint64 newGasExcess_) + { + // uint32 * uint8 will never overflow + uint64 newGasTarget = + uint64(_baseFeeConfig.gasIssuancePerSecond) * _baseFeeConfig.adjustmentQuotient; + + (newGasTarget_, newGasExcess_) = + LibEIP1559.adjustExcess(parentGasTarget, newGasTarget, parentGasExcess); + + uint64 gasIssuance = + (_blockTimestamp - parentTimestamp) * _baseFeeConfig.gasIssuancePerSecond; + + if ( + _baseFeeConfig.maxGasIssuancePerBlock != 0 + && gasIssuance > _baseFeeConfig.maxGasIssuancePerBlock + ) { + gasIssuance = _baseFeeConfig.maxGasIssuancePerBlock; + } + + (basefee_, newGasExcess_) = LibEIP1559.calc1559BaseFee( + newGasTarget_, newGasExcess_, gasIssuance, _parentGasUsed, _baseFeeConfig.minGasExcess + ); + } + + /// @inheritdoc IBlockHash + function getBlockHash(uint256 _blockId) public view returns (bytes32) { + if (_blockId >= block.number) return 0; + if (_blockId + 256 >= block.number) return blockhash(_blockId); + return _blockhashes[_blockId]; + } + + /// @notice Tells if we need to validate basefee (for simulation). + /// @return Returns true to skip checking basefee mismatch. + function skipFeeCheck() public pure virtual returns (bool) { + return false; + } + + /// @notice Returns the Ontake fork height. + /// @return The Ontake fork height. + function ontakeForkHeight() public pure virtual returns (uint64) { + return 0; + } + + /// @dev Synchronizes chain data with the given anchor block ID and state root. + /// @param _anchorBlockId The ID of the anchor block. + /// @param _anchorStateRoot The state root of the anchor block. + function _syncChainData(uint64 _anchorBlockId, bytes32 _anchorStateRoot) private { + /// @dev If the anchor block ID is less than or equal to the last synced block, return + /// early. + if (_anchorBlockId <= lastSyncedBlock) return; + + /// @dev Store the L1's state root as a signal to the local signal service to + /// allow for multi-hop bridging. + ISignalService(resolve(LibStrings.B_SIGNAL_SERVICE, false)).syncChainData( + l1ChainId, LibStrings.H_STATE_ROOT, _anchorBlockId, _anchorStateRoot + ); + + /// @dev Update the last synced block to the current anchor block ID. + lastSyncedBlock = _anchorBlockId; + } + + /// @dev Updates the parent block hash and timestamp. + /// @param _parentId The ID of the parent block. + function _updateParentHashAndTimestamp(uint256 _parentId) private { + // Get the block hash of the parent block. + bytes32 parentHash = blockhash(_parentId); + + // Store the parent block hash in the _blockhashes mapping. + _blockhashes[_parentId] = parentHash; + + // Update the parent timestamp to the current block timestamp. + parentTimestamp = uint64(block.timestamp); + + // Emit an event to signal that the parent hash and gas excess have been anchored. + emit Anchored(parentHash, parentGasExcess); + } + + /// @dev Verifies the current ancestor block hash and updates it with a new aggregated hash. + /// @param _parentId The ID of the parent block. + function _verifyAndUpdatePublicInputHash(uint256 _parentId) private { + // Calculate the current and new ancestor hashes based on the parent block ID. + (bytes32 currPublicInputHash_, bytes32 newPublicInputHash_) = + _calcPublicInputHash(_parentId); + + // Ensure the current ancestor block hash matches the expected value. + require(publicInputHash == currPublicInputHash_, L2_PUBLIC_INPUT_HASH_MISMATCH()); + + // Update the ancestor block hash to the new calculated value. + publicInputHash = newPublicInputHash_; + } + + /// @dev Verifies that the base fee per gas is correct and updates the gas excess. + /// @param _parentGasUsed The gas used by the parent block. + /// @param _baseFeeConfig The configuration parameters for calculating the base fee. + function _verifyBaseFeeAndUpdateGasExcess( + uint32 _parentGasUsed, + LibSharedData.BaseFeeConfig calldata _baseFeeConfig + ) + private + { + (uint256 basefee, uint64 newGasTarget, uint64 newGasExcess) = + getBasefeeV2(_parentGasUsed, uint64(block.timestamp), _baseFeeConfig); + + require(block.basefee == basefee || skipFeeCheck(), L2_BASEFEE_MISMATCH()); + + emit EIP1559Update(parentGasTarget, newGasTarget, parentGasExcess, newGasExcess, basefee); + + parentGasTarget = newGasTarget; + parentGasExcess = newGasExcess; + } + + /// @dev Calculates the aggregated ancestor block hash for the given block ID. + /// @dev This function computes two public input hashes: one for the previous state and one for + /// the new state. + /// It uses a ring buffer to store the previous 255 block hashes and the current chain ID. + /// @param _blockId The ID of the block for which the public input hash is calculated. + /// @return currPublicInputHash_ The public input hash for the previous state. + /// @return newPublicInputHash_ The public input hash for the new state. + function _calcPublicInputHash(uint256 _blockId) + private + view + returns (bytes32 currPublicInputHash_, bytes32 newPublicInputHash_) + { + bytes32[256] memory inputs; + + // Unchecked is safe because it cannot overflow. + unchecked { + // Put the previous 255 blockhashes (excluding the parent's) into a + // ring buffer. + for (uint256 i; i < 255 && _blockId >= i + 1; ++i) { + uint256 j = _blockId - i - 1; + inputs[j % 255] = blockhash(j); + } + } + + inputs[255] = bytes32(block.chainid); + + assembly { + currPublicInputHash_ := keccak256(inputs, 8192 /*mul(256, 32)*/ ) + } + + inputs[_blockId % 255] = blockhash(_blockId); + assembly { + newPublicInputHash_ := keccak256(inputs, 8192 /*mul(256, 32)*/ ) + } + } +} diff --git a/packages/protocol/contracts/layer2/based/TaikoL2Deprecated.sol b/packages/protocol/contracts/layer2/based/TaikoL2Deprecated.sol new file mode 100644 index 00000000000..0cf9ea1dffc --- /dev/null +++ b/packages/protocol/contracts/layer2/based/TaikoL2Deprecated.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/data/LibSharedData.sol"; + +/// @title TaikoL2Deprecated +/// @notice This contract includes deprecated functions whose ABI are still used by client for old +/// blocks. +/// @custom:security-contact security@taiko.xyz +abstract contract TaikoL2Deprecated { + error L2_DEPRECATED_METHOD(); + + modifier deprecated() { + revert L2_DEPRECATED_METHOD(); + _; + } + + function anchor( + bytes32 _l1BlockHash, + bytes32 _l1StateRoot, + uint64 _l1BlockId, + uint32 _parentGasUsed + ) + external + deprecated + { } + + function getBasefee( + uint64 _anchorBlockId, + uint32 _parentGasUsed + ) + public + pure + deprecated + returns (uint256 basefee_, uint64 parentGasExcess_) + { } + + function adjustExcess( + uint64 _currGasExcess, + uint64 _currGasTarget, + uint64 _newGasTarget + ) + public + pure + deprecated + returns (uint64 newGasExcess_) + { } + + function calculateBaseFee( + LibSharedData.BaseFeeConfig calldata _baseFeeConfig, + uint64 _blocktime, + uint64 _parentGasExcess, + uint32 _parentGasUsed + ) + public + pure + deprecated + returns (uint256 basefee_, uint64 parentGasExcess_) + { } +} diff --git a/packages/protocol/contracts/layer2/devnet/DevnetTaikoL2.sol b/packages/protocol/contracts/layer2/devnet/DevnetTaikoL2.sol new file mode 100644 index 00000000000..129438bc756 --- /dev/null +++ b/packages/protocol/contracts/layer2/devnet/DevnetTaikoL2.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../based/TaikoL2.sol"; + +/// @title DevnetTaikoL2 +/// @custom:security-contact security@taiko.xyz +contract DevnetTaikoL2 is TaikoL2 { + function ontakeForkHeight() public pure override returns (uint64) { + return 0; + } +} diff --git a/packages/protocol/contracts/layer2/hekla/HeklaTaikoL2.sol b/packages/protocol/contracts/layer2/hekla/HeklaTaikoL2.sol new file mode 100644 index 00000000000..f1af6519eb4 --- /dev/null +++ b/packages/protocol/contracts/layer2/hekla/HeklaTaikoL2.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../based/TaikoL2.sol"; + +/// @title HeklaTaikoL2 +/// @custom:security-contact security@taiko.xyz +contract HeklaTaikoL2 is TaikoL2 { + function ontakeForkHeight() public pure override returns (uint64) { + return 840_512; + } +} diff --git a/packages/protocol/contracts/layer2/mainnet/MainnetTaikoL2.sol b/packages/protocol/contracts/layer2/mainnet/MainnetTaikoL2.sol new file mode 100644 index 00000000000..956c193fdab --- /dev/null +++ b/packages/protocol/contracts/layer2/mainnet/MainnetTaikoL2.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../based/TaikoL2.sol"; + +/// @title MainnetTaikoL2 +/// @custom:security-contact security@taiko.xyz +contract MainnetTaikoL2 is TaikoL2 { + function ontakeForkHeight() public pure override returns (uint64) { + return 538_304; + } +} diff --git a/packages/protocol/contracts/tko/BridgedTaikoToken.sol b/packages/protocol/contracts/layer2/token/BridgedTaikoToken.sol similarity index 79% rename from packages/protocol/contracts/tko/BridgedTaikoToken.sol rename to packages/protocol/contracts/layer2/token/BridgedTaikoToken.sol index c847dda6665..0fa1d8a7d23 100644 --- a/packages/protocol/contracts/tko/BridgedTaikoToken.sol +++ b/packages/protocol/contracts/layer2/token/BridgedTaikoToken.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../tokenvault/IBridgedERC20.sol"; -import "./TaikoTokenBase.sol"; +import "src/shared/tokenvault/IBridgedERC20.sol"; +import "src/shared/token/TaikoTokenBase.sol"; /// @title BridgedTaikoToken /// @notice The TaikoToken on L2 to support checkpoints and voting. For testnets, we do not need to @@ -11,10 +11,10 @@ import "./TaikoTokenBase.sol"; contract BridgedTaikoToken is TaikoTokenBase, IBridgedERC20 { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address manager address. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); - __ERC20_init("Taiko Token", "TKO"); + /// @param _sharedAddressManager The address manager address. + function init(address _owner, address _sharedAddressManager) external initializer { + __Essential_init(_owner, _sharedAddressManager); + __ERC20_init("Taiko Token", "TAIKO"); __ERC20Votes_init(); __ERC20Permit_init("Taiko Token"); } diff --git a/packages/protocol/contracts/mainnet/L1RollupAddressManager.sol b/packages/protocol/contracts/mainnet/L1RollupAddressManager.sol deleted file mode 100644 index b6ad942929f..00000000000 --- a/packages/protocol/contracts/mainnet/L1RollupAddressManager.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../common/AddressManager.sol"; -import "../common/LibStrings.sol"; - -/// @title L1RollupAddressManager -/// @notice See the documentation in {IAddressManager}. -/// @dev This contract shall NOT be used to upgrade existing implementation unless the name-address -/// registration becomes stable in 0x579f40D0BE111b823962043702cabe6Aaa290780. -/// @custom:security-contact security@taiko.xyz -contract L1RollupAddressManager is AddressManager { - /// @notice Gets the address mapped to a specific chainId-name pair. - /// @dev Sub-contracts can override this method to avoid reading from storage. - /// Some names are not cached as they are not used frequently or - /// its address is likely to change. - function _getOverride( - uint64 _chainId, - bytes32 _name - ) - internal - pure - override - returns (address addr_) - { - if (_chainId == 1) { - if (_name == LibStrings.B_TAIKO_TOKEN) { - return 0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800; - } - if (_name == LibStrings.B_SIGNAL_SERVICE) { - return 0x9e0a24964e5397B566c1ed39258e21aB5E35C77C; - } - if (_name == LibStrings.B_BRIDGE) { - return 0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC; - } - if (_name == LibStrings.B_TAIKO) { - return 0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a; - } - if (_name == LibStrings.B_TIER_SGX) { - return 0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81; - } - if (_name == LibStrings.B_TIER_GUARDIAN_MINORITY) { - return 0x579A8d63a2Db646284CBFE31FE5082c9989E985c; - } - if (_name == LibStrings.B_TIER_GUARDIAN) { - return 0xE3D777143Ea25A6E031d1e921F396750885f43aC; - } - if (_name == LibStrings.B_AUTOMATA_DCAP_ATTESTATION) { - return 0x8d7C954960a36a7596d7eA4945dDf891967ca8A3; - } - if (_name == LibStrings.B_TIER_ROUTER) { - return 0xa8e5D3a2E2052bea7f10bE6a0386454b721d1f9F; - } - } - return address(0); - } -} diff --git a/packages/protocol/contracts/mainnet/L1SharedAddressManager.sol b/packages/protocol/contracts/mainnet/L1SharedAddressManager.sol deleted file mode 100644 index 32677bafa95..00000000000 --- a/packages/protocol/contracts/mainnet/L1SharedAddressManager.sol +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../common/AddressManager.sol"; -import "../common/LibStrings.sol"; - -/// @title L1SharedAddressManager -/// @notice See the documentation in {IAddressManager}. -/// @dev This contract shall NOT be used to upgrade existing implementation unless the name-address -/// registration becomes stable in 0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa. -/// @custom:security-contact security@taiko.xyz -contract L1SharedAddressManager is AddressManager { - /// @notice Gets the address mapped to a specific chainId-name pair. - /// @dev Sub-contracts can override this method to avoid reading from storage. - /// Some names are not cached as they are not used frequently or - /// its address is likely to change. - function _getOverride( - uint64 _chainId, - bytes32 _name - ) - internal - pure - override - returns (address addr_) - { - if (_chainId == 1) { - if (_name == LibStrings.B_TAIKO_TOKEN) { - return 0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800; - } - if (_name == LibStrings.B_SIGNAL_SERVICE) { - return 0x9e0a24964e5397B566c1ed39258e21aB5E35C77C; - } - if (_name == LibStrings.B_BRIDGE) { - return 0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC; - } - if (_name == LibStrings.B_ERC20_VAULT) { - return 0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab; - } - if (_name == LibStrings.B_ERC721_VAULT) { - return 0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa; - } - if (_name == LibStrings.B_ERC1155_VAULT) { - return 0xaf145913EA4a56BE22E120ED9C24589659881702; - } - if (_name == LibStrings.B_QUOTA_MANAGER) { - return 0x91f67118DD47d502B1f0C354D0611997B022f29E; - } - } else if (_chainId == 167_000) { - if (_name == LibStrings.B_BRIDGE) { - return 0x1670000000000000000000000000000000000001; - } - if (_name == LibStrings.B_ERC20_VAULT) { - return 0x1670000000000000000000000000000000000002; - } - if (_name == LibStrings.B_ERC721_VAULT) { - return 0x1670000000000000000000000000000000000003; - } - if (_name == LibStrings.B_ERC1155_VAULT) { - return 0x1670000000000000000000000000000000000004; - } - if (_name == LibStrings.B_SIGNAL_SERVICE) { - return 0x1670000000000000000000000000000000000005; - } - } - - return address(0); - } -} diff --git a/packages/protocol/contracts/bridge/Bridge.sol b/packages/protocol/contracts/shared/bridge/Bridge.sol similarity index 80% rename from packages/protocol/contracts/bridge/Bridge.sol rename to packages/protocol/contracts/shared/bridge/Bridge.sol index d5f6abb2a0f..eb18c5ef7a6 100644 --- a/packages/protocol/contracts/bridge/Bridge.sol +++ b/packages/protocol/contracts/shared/bridge/Bridge.sol @@ -1,11 +1,12 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; import "../common/EssentialContract.sol"; import "../common/LibStrings.sol"; -import "../libs/LibAddress.sol"; -import "../libs/LibMath.sol"; +import "../common/LibAddress.sol"; +import "../common/LibMath.sol"; +import "../common/LibNetwork.sol"; import "../signal/ISignalService.sol"; import "./IBridge.sol"; import "./IQuotaManager.sol"; @@ -43,17 +44,9 @@ contract Bridge is EssentialContract, IBridge { ///@dev The max proof size for a message to be processable by a relayer. uint256 public constant RELAYER_MAX_PROOF_BYTES = 200_000; - ///@dev The 32bytes padded 11 fields in Message struct (11 * 32) - uint256 public constant CALLDATA_MESSAGE_SIZE_BYTES = 352; - /// @dev The amount of gas not to charge fee per cache operation. uint256 private constant _GAS_REFUND_PER_CACHE_OPERATION = 20_000; - /// @dev The slot in transient storage of the call context. This is the keccak256 hash - /// of "bridge.ctx_slot" - bytes32 private constant _CTX_SLOT = - 0xe4ece82196de19aabe639620d7f716c433d1348f96ce727c9989a982dbadc2b9; - /// @dev Gas limit for sending Ether. // - EOA gas used is < 21000 // - For Loopring smart wallet, gas used is about 23000 @@ -110,11 +103,12 @@ contract Bridge is EssentialContract, IBridge { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @param _sharedAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _sharedAddressManager) external initializer { + __Essential_init(_owner, _sharedAddressManager); } + /// @notice This function shall be called by previously deployed contracts. function init2() external onlyOwner reinitializer(2) { // reset some previously used slots for future reuse __reserved1 = 0; @@ -206,7 +200,9 @@ contract Bridge is EssentialContract, IBridge { ); // Must reset the context after the message call - _resetContext(); + _storeContext( + bytes32(_PLACEHOLDER), address(uint160(_PLACEHOLDER)), uint64(_PLACEHOLDER) + ); } else { _message.srcOwner.sendEtherAndVerify(_message.value, _SEND_ETHER_GAS_LIMIT); } @@ -292,10 +288,10 @@ contract Bridge is EssentialContract, IBridge { // Taking into account the encoded message calldata cost, and can count with 16 // gas per bytes (vs. checking each and every byte if zero or non-zero) stats.gasUsedInFeeCalc = uint32( - GAS_OVERHEAD + gasStart - + (uint32(_message.data.length + CALLDATA_MESSAGE_SIZE_BYTES) << 4) + GAS_OVERHEAD + gasStart + _messageCalldataCost(_message.data.length) - gasleft() ); + uint256 gasCharged = refund.max(stats.gasUsedInFeeCalc) - refund; uint256 maxFee = gasCharged * _message.fee / _message.gasLimit; uint256 baseFee = gasCharged * block.basefee; @@ -334,17 +330,12 @@ contract Bridge is EssentialContract, IBridge { if (_unableToInvokeMessageCall(_message, resolve(LibStrings.B_SIGNAL_SERVICE, false))) { succeeded = _message.destOwner.sendEther(_message.value, _SEND_ETHER_GAS_LIMIT, ""); } else { - uint256 invocationGasLimit; - if (msg.sender != _message.destOwner) { - if (_message.gasLimit == 0 || _isLastAttempt) revert B_PERMISSION_DENIED(); - invocationGasLimit = _invocationGasLimit(_message); - } else { - // The owner uses all gas left in message invocation - invocationGasLimit = gasleft(); + if ((_message.gasLimit == 0 || _isLastAttempt) && msg.sender != _message.destOwner) { + revert B_PERMISSION_DENIED(); } // Attempt to invoke the messageCall. - succeeded = _invokeMessageCall(_message, msgHash, invocationGasLimit, false); + succeeded = _invokeMessageCall(_message, msgHash, gasleft(), false); } if (succeeded) { @@ -471,25 +462,14 @@ contract Bridge is EssentialContract, IBridge { /// @param dataLength The length of message.data. /// @return The minimal gas limit required for sending this message. function getMessageMinGasLimit(uint256 dataLength) public pure returns (uint32) { - unchecked { - // The abi encoding of A = (Message calldata msg) is 10 * 32 bytes - // + 32 bytes (A is a dynamic tuple, offset to first elements) - // + 32 bytes (offset to last bytes element of Message) - // + 32 bytes (padded encoding of length of Message.data + dataLength (padded to 32 - // bytes) - // = 13 * 32 + (dataLength / 32 * 32) + 32. - // non-zero calldata cost per byte is 16. - - uint256 dataCost = (dataLength / 32 * 32 + 448) << 4; - return SafeCastUpgradeable.toUint32(dataCost + GAS_RESERVE); - } + return _messageCalldataCost(dataLength) + GAS_RESERVE; } /// @notice Checks if the given address can pause and/or unpause the bridge. /// @dev Considering that the watchdog is a hot wallet, in case its private key is leaked, we /// only allow watchdog to pause the bridge, but does not allow it to unpause the bridge. function _authorizePause(address addr, bool toPause) internal view override { - // Owner and chain_pauser can pause/unpause the bridge. + // Owner and chain watchdog can pause/unpause the bridge. if (addr == owner() || addr == resolve(LibStrings.B_CHAIN_WATCHDOG, true)) return; // bridge_watchdog can pause the bridge, but cannot unpause it. @@ -501,7 +481,8 @@ contract Bridge is EssentialContract, IBridge { /// @notice Invokes a call message on the Bridge. /// @param _message The call message to be invoked. /// @param _msgHash The hash of the message. - /// @param _checkGasleft True to check gasleft is sufficient for target function invocation. + /// @param _shouldCheckForwardedGas True to check gasleft is sufficient for target function + /// invocation. /// @return success_ A boolean value indicating whether the message call was successful. /// @dev This function updates the context in the state before and after the /// message call. @@ -509,21 +490,33 @@ contract Bridge is EssentialContract, IBridge { Message calldata _message, bytes32 _msgHash, uint256 _gasLimit, - bool _checkGasleft + bool _shouldCheckForwardedGas ) private returns (bool success_) { assert(_message.from != address(this)); + if (_message.value == 0 && _message.data.length == 0) return true; + if (_gasLimit == 0) return false; _storeContext(_msgHash, _message.from, _message.srcChainId); - if (_checkGasleft && _hasInsufficientGas(_gasLimit, _message.data.length)) { - revert B_INSUFFICIENT_GAS(); + + address to = _message.to; + uint256 value = _message.value; + bytes memory data = _message.data; + uint256 gasLeft; + + assembly { + success_ := call(_gasLimit, to, value, add(data, 0x20), mload(data), 0, 0) + gasLeft := gas() } - success_ = _message.to.sendEther(_message.value, _gasLimit, _message.data); - _resetContext(); + + if (_shouldCheckForwardedGas) { + _checkForwardedGas(gasLeft, _gasLimit); + } + _storeContext(bytes32(_PLACEHOLDER), address(uint160(_PLACEHOLDER)), uint64(_PLACEHOLDER)); } /// @notice Updates the status of a bridge message. @@ -537,31 +530,12 @@ contract Bridge is EssentialContract, IBridge { emit MessageStatusChanged(_msgHash, _status); } - /// @notice Resets the call context - function _resetContext() private { - if (LibNetwork.isDencunSupported(block.chainid)) { - _storeContext(bytes32(0), address(0), uint64(0)); - } else { - _storeContext( - bytes32(_PLACEHOLDER), address(uint160(_PLACEHOLDER)), uint64(_PLACEHOLDER) - ); - } - } - /// @notice Stores the call context /// @param _msgHash The message hash. /// @param _from The sender's address. /// @param _srcChainId The source chain ID. - function _storeContext(bytes32 _msgHash, address _from, uint64 _srcChainId) private { - if (LibNetwork.isDencunSupported(block.chainid)) { - assembly { - tstore(_CTX_SLOT, _msgHash) - tstore(add(_CTX_SLOT, 1), _from) - tstore(add(_CTX_SLOT, 2), _srcChainId) - } - } else { - __ctx = Context(_msgHash, _from, _srcChainId); - } + function _storeContext(bytes32 _msgHash, address _from, uint64 _srcChainId) internal virtual { + __ctx = Context(_msgHash, _from, _srcChainId); } /// @notice Checks if the signal was received and caches cross-chain data if requested. @@ -605,20 +579,8 @@ contract Bridge is EssentialContract, IBridge { /// @notice Loads and returns the call context. /// @return ctx_ The call context. - function _loadContext() private view returns (Context memory) { - if (LibNetwork.isDencunSupported(block.chainid)) { - bytes32 msgHash; - address from; - uint64 srcChainId; - assembly { - msgHash := tload(_CTX_SLOT) - from := tload(add(_CTX_SLOT, 1)) - srcChainId := tload(add(_CTX_SLOT, 2)) - } - return Context(msgHash, from, srcChainId); - } else { - return __ctx; - } + function _loadContext() internal view virtual returns (Context memory) { + return __ctx; } /// @notice Checks if the signal was received. @@ -647,29 +609,6 @@ contract Bridge is EssentialContract, IBridge { } } - ///@dev This implementation was suggested by OpenZeppelin in an audit to replace the previous. - function _hasInsufficientGas( - uint256 _minGas, - uint256 _dataLength - ) - private - view - returns (bool result_) - { - unchecked { - // https://github.com/ethereum/execution-specs/blob/master/src/ethereum/cancun/vm/gas.py#L128 - uint256 words = _dataLength / 32 + 1; - uint256 memoryGasCost = words * 3 + words * words / 512; - - // Need to add the gas cost of accessing the message.to account. This currently - // corresponds to 2600 gas if the account is cold, and 100 otherwise. - - // Also need to add the cost of transferring a nonzero msg.value. This cost is currently - // 9000, but provides a 2300 gas stipend to the called contract. - result_ = gasleft() * 63 < _minGas * 64 + (memoryGasCost + 9300) * 63; - } - } - function _checkStatus(bytes32 _msgHash, Status _expectedStatus) private view { if (messageStatus[_msgHash] != _expectedStatus) revert B_INVALID_STATUS(); } @@ -697,4 +636,73 @@ contract Bridge is EssentialContract, IBridge { return minGasRequired.max(_message.gasLimit) - minGasRequired; } } + + function _messageCalldataCost(uint256 dataLength) private pure returns (uint32) { + // The abi encoding of A = (Message calldata msg) is 10 * 32 bytes + // + 32 bytes (A is a dynamic tuple, offset to first elements) + // + 32 bytes (offset to last bytes element of Message) + // + 32 bytes (padded encoding of length of Message.data + dataLength + // (padded to 32 // bytes) = 13 * 32 + ((dataLength + 31) / 32 * 32). + // Non-zero calldata cost per byte is 16. + unchecked { + return uint32(((dataLength + 31) / 32 * 32 + 416) << 4); + } + } + + /// @dev Suggested by OpenZeppelin and copied from + /// https://github.com/OpenZeppelin/openzeppelin-contracts/ + /// blob/83c7e45092dac350b070c421cd2bf7105616cf1a/contracts/ + /// metatx/ERC2771Forwarder.sol#L327C1-L370C6 + /// + /// @dev Checks if the requested gas was correctly forwarded to the callee. + /// As a consequence of https://eips.ethereum.org/EIPS/eip-150[EIP-150]: + /// - At most `gasleft() - floor(gasleft() / 64)` is forwarded to the callee. + /// - At least `floor(gasleft() / 64)` is kept in the caller. + /// + /// It reverts consuming all the available gas if the forwarded gas is not the requested gas. + /// + /// IMPORTANT: The `gasLeft` parameter should be measured exactly at the end of the forwarded + /// call. + /// Any gas consumed in between will make room for bypassing this check. + function _checkForwardedGas(uint256 _gasLeft, uint256 _gasRequested) private pure { + // To avoid insufficient gas griefing attacks, as referenced in + // https://ronan.eth.limo/blog/ethereum-gas-dangers/ + // + // A malicious relayer can attempt to shrink the gas forwarded so that the underlying call + // reverts out-of-gas + // but the forwarding itself still succeeds. In order to make sure that the subcall received + // sufficient gas, + // we will inspect gasleft() after the forwarding. + // + // Let X be the gas available before the subcall, such that the subcall gets at most X * 63 + // / 64. + // We can't know X after CALL dynamic costs, but we want it to be such that X * 63 / 64 >= + // req.gas. + // Let Y be the gas used in the subcall. gasleft() measured immediately after the subcall + // will be gasleft() = X - Y. + // If the subcall ran out of gas, then Y = X * 63 / 64 and gasleft() = X - Y = X / 64. + // Under this assumption req.gas / 63 > gasleft() is true is true if and only if + // req.gas / 63 > X / 64, or equivalently req.gas > X * 63 / 64. + // This means that if the subcall runs out of gas we are able to detect that insufficient + // gas was passed. + // + // We will now also see that req.gas / 63 > gasleft() implies that req.gas >= X * 63 / 64. + // The contract guarantees Y <= req.gas, thus gasleft() = X - Y >= X - req.gas. + // - req.gas / 63 > gasleft() + // - req.gas / 63 >= X - req.gas + // - req.gas >= X * 63 / 64 + // In other words if req.gas < X * 63 / 64 then req.gas / 63 <= gasleft(), thus if the + // relayer behaves honestly + // the forwarding does not revert. + if (_gasLeft < _gasRequested / 63) { + // We explicitly trigger invalid opcode to consume all gas and bubble-up the effects, + // since + // neither revert or assert consume all gas since Solidity 0.8.20 + // https://docs.soliditylang.org/en/v0.8.20/control-structures.html#panic-via-assert-and-error-via-require + /// @solidity memory-safe-assembly + assembly { + invalid() + } + } + } } diff --git a/packages/protocol/contracts/bridge/IBridge.sol b/packages/protocol/contracts/shared/bridge/IBridge.sol similarity index 99% rename from packages/protocol/contracts/bridge/IBridge.sol rename to packages/protocol/contracts/shared/bridge/IBridge.sol index 99af78b249f..23e6eecee0f 100644 --- a/packages/protocol/contracts/bridge/IBridge.sol +++ b/packages/protocol/contracts/shared/bridge/IBridge.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IBridge /// @notice The bridge used in conjunction with the {ISignalService}. diff --git a/packages/protocol/contracts/bridge/IQuotaManager.sol b/packages/protocol/contracts/shared/bridge/IQuotaManager.sol similarity index 97% rename from packages/protocol/contracts/bridge/IQuotaManager.sol rename to packages/protocol/contracts/shared/bridge/IQuotaManager.sol index 3091e019315..02b28292e7c 100644 --- a/packages/protocol/contracts/bridge/IQuotaManager.sol +++ b/packages/protocol/contracts/shared/bridge/IQuotaManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IQuotaManager /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/bridge/QuotaManager.sol b/packages/protocol/contracts/shared/bridge/QuotaManager.sol similarity index 93% rename from packages/protocol/contracts/bridge/QuotaManager.sol rename to packages/protocol/contracts/shared/bridge/QuotaManager.sol index b5bf55ecfd8..293eeb7ca8d 100644 --- a/packages/protocol/contracts/bridge/QuotaManager.sol +++ b/packages/protocol/contracts/shared/bridge/QuotaManager.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../common/EssentialContract.sol"; import "../common/LibStrings.sol"; -import "../libs/LibMath.sol"; +import "../common/LibMath.sol"; import "./IQuotaManager.sol"; /// @title QuotaManager @@ -31,17 +31,17 @@ contract QuotaManager is EssentialContract, IQuotaManager { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. + /// @param _sharedAddressManager The address of the {AddressManager} contract. /// @param _quotaPeriod The time required to restore all quota. function init( address _owner, - address _addressManager, + address _sharedAddressManager, uint24 _quotaPeriod ) external initializer { - __Essential_init(_owner, _addressManager); + __Essential_init(_owner, _sharedAddressManager); _setQuotaPeriod(_quotaPeriod); } diff --git a/packages/protocol/contracts/bridge/README.md b/packages/protocol/contracts/shared/bridge/README.md similarity index 100% rename from packages/protocol/contracts/bridge/README.md rename to packages/protocol/contracts/shared/bridge/README.md diff --git a/packages/protocol/contracts/common/AddressManager.sol b/packages/protocol/contracts/shared/common/AddressManager.sol similarity index 73% rename from packages/protocol/contracts/common/AddressManager.sol rename to packages/protocol/contracts/shared/common/AddressManager.sol index 91ab17e86da..ac0ab0ae7ea 100644 --- a/packages/protocol/contracts/common/AddressManager.sol +++ b/packages/protocol/contracts/shared/common/AddressManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./EssentialContract.sol"; @@ -24,12 +24,12 @@ contract AddressManager is EssentialContract, IAddressManager { error AM_ADDRESS_ALREADY_SET(); /// @notice Initializes the contract. - /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. + /// @param _owner The owner of this contract. function init(address _owner) external initializer { - __Essential_init(_owner); - addressManager = address(this); + __Essential_init(_owner, address(this)); } + /// @notice This function shall be called by previously deployed contracts. function init2() external onlyOwner reinitializer(2) { addressManager = address(this); } @@ -48,21 +48,15 @@ contract AddressManager is EssentialContract, IAddressManager { onlyOwner { address oldAddress = __addresses[_chainId][_name]; - if (_newAddress == oldAddress) revert AM_ADDRESS_ALREADY_SET(); + require(_newAddress != oldAddress, AM_ADDRESS_ALREADY_SET()); __addresses[_chainId][_name] = _newAddress; emit AddressSet(_chainId, _name, _newAddress, oldAddress); } /// @inheritdoc IAddressManager function getAddress(uint64 _chainId, bytes32 _name) external view override returns (address) { - address addr = _getOverride(_chainId, _name); - if (addr != address(0)) return addr; - else return __addresses[_chainId][_name]; + return __addresses[_chainId][_name]; } - /// @notice Gets the address mapped to a specific chainId-name pair. - /// @dev Sub-contracts can override this method to avoid reading from storage. - function _getOverride(uint64 _chainId, bytes32 _name) internal pure virtual returns (address) { } - function _authorizePause(address, bool) internal pure override notImplemented { } } diff --git a/packages/protocol/contracts/common/AddressResolver.sol b/packages/protocol/contracts/shared/common/AddressResolver.sol similarity index 66% rename from packages/protocol/contracts/common/AddressResolver.sol rename to packages/protocol/contracts/shared/common/AddressResolver.sol index 27f88b2a221..ebfaec3a8be 100644 --- a/packages/protocol/contracts/common/AddressResolver.sol +++ b/packages/protocol/contracts/shared/common/AddressResolver.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "./IAddressManager.sol"; @@ -22,7 +22,16 @@ abstract contract AddressResolver is IAddressResolver, Initializable { /// name. /// @param _name The name to check against. modifier onlyFromNamed(bytes32 _name) { - if (msg.sender != resolve(_name, true)) revert RESOLVER_DENIED(); + require(msg.sender == resolve(_name, true), RESOLVER_DENIED()); + _; + } + + /// @dev Modifier that ensures the caller is the resolved address of a given + /// name, if the name is set. + /// @param _name The name to check against. + modifier onlyFromOptionalNamed(bytes32 _name) { + address addr = resolve(_name, true); + require(addr == address(0) || msg.sender == addr, RESOLVER_DENIED()); _; } @@ -31,9 +40,10 @@ abstract contract AddressResolver is IAddressResolver, Initializable { /// @param _name1 The first name to check against. /// @param _name2 The second name to check against. modifier onlyFromNamedEither(bytes32 _name1, bytes32 _name2) { - if (msg.sender != resolve(_name1, true) && msg.sender != resolve(_name2, true)) { - revert RESOLVER_DENIED(); - } + require( + msg.sender == resolve(_name1, true) || msg.sender == resolve(_name2, true), + RESOLVER_DENIED() + ); _; } @@ -43,15 +53,7 @@ abstract contract AddressResolver is IAddressResolver, Initializable { } /// @inheritdoc IAddressResolver - function resolve( - bytes32 _name, - bool _allowZeroAddress - ) - public - view - virtual - returns (address payable) - { + function resolve(bytes32 _name, bool _allowZeroAddress) public view virtual returns (address) { return _resolve(uint64(block.chainid), _name, _allowZeroAddress); } @@ -64,7 +66,7 @@ abstract contract AddressResolver is IAddressResolver, Initializable { public view virtual - returns (address payable) + returns (address) { return _resolve(_chainId, _name, _allowZeroAddress); } @@ -72,9 +74,8 @@ abstract contract AddressResolver is IAddressResolver, Initializable { /// @dev Initialization method for setting up AddressManager reference. /// @param _addressManager Address of the AddressManager. function __AddressResolver_init(address _addressManager) internal virtual onlyInitializing { - if (block.chainid > type(uint64).max) { - revert RESOLVER_UNEXPECTED_CHAINID(); - } + require(block.chainid <= type(uint64).max, RESOLVER_UNEXPECTED_CHAINID()); + addressManager = _addressManager; } @@ -90,17 +91,19 @@ abstract contract AddressResolver is IAddressResolver, Initializable { bytes32 _name, bool _allowZeroAddress ) - private + internal view - returns (address payable addr_) + returns (address addr_) { - address _addressManager = addressManager; - if (_addressManager == address(0)) revert RESOLVER_INVALID_MANAGER(); + addr_ = _getAddress(_chainId, _name); + + require(_allowZeroAddress || addr_ != address(0), RESOLVER_ZERO_ADDR(_chainId, _name)); + } - addr_ = payable(IAddressManager(_addressManager).getAddress(_chainId, _name)); + function _getAddress(uint64 _chainId, bytes32 _name) internal view virtual returns (address) { + address _addressManager = addressManager; + require(_addressManager != address(0), RESOLVER_INVALID_MANAGER()); - if (!_allowZeroAddress && addr_ == address(0)) { - revert RESOLVER_ZERO_ADDR(_chainId, _name); - } + return IAddressManager(_addressManager).getAddress(_chainId, _name); } } diff --git a/packages/protocol/contracts/common/EssentialContract.sol b/packages/protocol/contracts/shared/common/EssentialContract.sol similarity index 70% rename from packages/protocol/contracts/common/EssentialContract.sol rename to packages/protocol/contracts/shared/common/EssentialContract.sol index 3bb20817366..70320ea9623 100644 --- a/packages/protocol/contracts/common/EssentialContract.sol +++ b/packages/protocol/contracts/shared/common/EssentialContract.sol @@ -1,30 +1,20 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; import "./AddressResolver.sol"; -import "../libs/LibNetwork.sol"; /// @title EssentialContract /// @custom:security-contact security@taiko.xyz abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, AddressResolver { - uint8 private constant _FALSE = 1; - - uint8 private constant _TRUE = 2; - - /// @dev The slot in transient storage of the reentry lock. - /// This is the result of keccak256("ownerUUPS.reentry_slot") plus 1. The addition aims to - /// prevent hash collisions with slots defined in EIP-1967, where slots are derived by - /// keccak256("something") - 1, and with slots in SignalService, calculated directly with - /// keccak256("something"). - bytes32 private constant _REENTRY_SLOT = - 0xa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b; + uint8 internal constant _FALSE = 1; + uint8 internal constant _TRUE = 2; /// @dev Slot 1. - uint8 private __reentry; - uint8 private __paused; - uint64 public lastUnpausedAt; + uint8 internal __reentry; + uint8 internal __paused; + uint64 internal __lastUnpausedAt; uint256[49] private __gap; @@ -45,7 +35,7 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, /// @dev Modifier that ensures the caller is the owner or resolved address of a given name. /// @param _name The name to check against. modifier onlyFromOwnerOrNamed(bytes32 _name) { - if (msg.sender != owner() && msg.sender != resolve(_name, true)) revert RESOLVER_DENIED(); + require(msg.sender == owner() || msg.sender == resolve(_name, true), RESOLVER_DENIED()); _; } @@ -55,29 +45,34 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, } modifier nonReentrant() { - if (_loadReentryLock() == _TRUE) revert REENTRANT_CALL(); + require(_loadReentryLock() != _TRUE, REENTRANT_CALL()); _storeReentryLock(_TRUE); _; _storeReentryLock(_FALSE); } modifier whenPaused() { - if (!paused()) revert INVALID_PAUSE_STATUS(); + require(paused(), INVALID_PAUSE_STATUS()); _; } modifier whenNotPaused() { - if (paused()) revert INVALID_PAUSE_STATUS(); + require(!paused(), INVALID_PAUSE_STATUS()); _; } modifier nonZeroAddr(address _addr) { - if (_addr == address(0)) revert ZERO_ADDRESS(); + require(_addr != address(0), ZERO_ADDRESS()); _; } - modifier nonZeroValue(bytes32 _value) { - if (_value == 0) revert ZERO_VALUE(); + modifier nonZeroValue(uint256 _value) { + require(_value != 0, ZERO_VALUE()); + _; + } + + modifier nonZeroBytes32(bytes32 _value) { + require(_value != 0, ZERO_VALUE()); _; } @@ -112,6 +107,10 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, return __paused == _TRUE; } + function lastUnpausedAt() public view virtual returns (uint64) { + return __lastUnpausedAt; + } + function inNonReentrant() public view returns (bool) { return _loadReentryLock() == _TRUE; } @@ -143,7 +142,7 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, function _unpause() internal whenPaused { __paused = _FALSE; - lastUnpausedAt = uint64(block.timestamp); + __lastUnpausedAt = uint64(block.timestamp); emit Unpaused(msg.sender); } @@ -153,23 +152,11 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, // Stores the reentry lock function _storeReentryLock(uint8 _reentry) internal virtual { - if (LibNetwork.isDencunSupported(block.chainid)) { - assembly { - tstore(_REENTRY_SLOT, _reentry) - } - } else { - __reentry = _reentry; - } + __reentry = _reentry; } // Loads the reentry lock function _loadReentryLock() internal view virtual returns (uint8 reentry_) { - if (LibNetwork.isDencunSupported(block.chainid)) { - assembly { - reentry_ := tload(_REENTRY_SLOT) - } - } else { - reentry_ = __reentry; - } + reentry_ = __reentry; } } diff --git a/packages/protocol/contracts/common/IAddressManager.sol b/packages/protocol/contracts/shared/common/IAddressManager.sol similarity index 96% rename from packages/protocol/contracts/common/IAddressManager.sol rename to packages/protocol/contracts/shared/common/IAddressManager.sol index f88933462fe..46ee1478156 100644 --- a/packages/protocol/contracts/common/IAddressManager.sol +++ b/packages/protocol/contracts/shared/common/IAddressManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IAddressManager /// @notice Manages a mapping of (chainId, name) pairs to Ethereum addresses. diff --git a/packages/protocol/contracts/common/IAddressResolver.sol b/packages/protocol/contracts/shared/common/IAddressResolver.sol similarity index 87% rename from packages/protocol/contracts/common/IAddressResolver.sol rename to packages/protocol/contracts/shared/common/IAddressResolver.sol index 886e123e1ba..efeae4a73d6 100644 --- a/packages/protocol/contracts/common/IAddressResolver.sol +++ b/packages/protocol/contracts/shared/common/IAddressResolver.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IAddressResolver /// @notice This contract acts as a bridge for name-to-address resolution. @@ -16,13 +16,7 @@ interface IAddressResolver { /// @param _allowZeroAddress If set to true, does not throw if the resolved /// address is `address(0)`. /// @return Address associated with the given name. - function resolve( - bytes32 _name, - bool _allowZeroAddress - ) - external - view - returns (address payable); + function resolve(bytes32 _name, bool _allowZeroAddress) external view returns (address); /// @notice Resolves a name to its address deployed on a specified chain. /// @param _chainId The chainId of interest. @@ -38,5 +32,5 @@ interface IAddressResolver { ) external view - returns (address payable); + returns (address); } diff --git a/packages/protocol/contracts/libs/LibAddress.sol b/packages/protocol/contracts/shared/common/LibAddress.sol similarity index 83% rename from packages/protocol/contracts/libs/LibAddress.sol rename to packages/protocol/contracts/shared/common/LibAddress.sol index bfac8da7266..5bc0cd324ae 100644 --- a/packages/protocol/contracts/libs/LibAddress.sol +++ b/packages/protocol/contracts/shared/common/LibAddress.sol @@ -1,9 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; -import "@openzeppelin/contracts/interfaces/IERC1271.sol"; /// @title LibAddress /// @dev Provides utilities for address-related operations. @@ -29,7 +27,7 @@ library LibAddress { returns (bool success_) { // Check for zero-address transactions - if (_to == address(0)) revert ETH_TRANSFER_FAILED(); + require(_to != address(0), ETH_TRANSFER_FAILED()); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata @@ -54,9 +52,7 @@ library LibAddress { /// @param _gasLimit The max amount gas to pay for this transaction. function sendEtherAndVerify(address _to, uint256 _amount, uint256 _gasLimit) internal { if (_amount == 0) return; - if (!sendEther(_to, _amount, _gasLimit, "")) { - revert ETH_TRANSFER_FAILED(); - } + require(sendEther(_to, _amount, _gasLimit, ""), ETH_TRANSFER_FAILED()); } /// @dev Sends Ether to the specified address. This method will revert if sending ether fails. @@ -74,10 +70,10 @@ library LibAddress { view returns (bool result_) { - if (!Address.isContract(_addr)) return false; - - try IERC165(_addr).supportsInterface(_interfaceId) returns (bool _result) { - result_ = _result; - } catch { } + (bool success, bytes memory data) = + _addr.staticcall(abi.encodeCall(IERC165.supportsInterface, (_interfaceId))); + if (success && data.length == 32) { + result_ = abi.decode(data, (bool)); + } } } diff --git a/packages/protocol/contracts/libs/LibBytes.sol b/packages/protocol/contracts/shared/common/LibBytes.sol similarity index 94% rename from packages/protocol/contracts/libs/LibBytes.sol rename to packages/protocol/contracts/shared/common/LibBytes.sol index 3ddddcf2b6a..39c0bf442fb 100644 --- a/packages/protocol/contracts/libs/LibBytes.sol +++ b/packages/protocol/contracts/shared/common/LibBytes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; library LibBytes { error INNER_ERROR(bytes innerError); @@ -34,7 +34,7 @@ library LibBytes { function revertWithExtractedError(bytes memory _returnData) internal pure { // If the _res length is less than 68, then // the transaction failed with custom error or silently (without a revert message) - if (_returnData.length < 68) revert INNER_ERROR(_returnData); + require(_returnData.length >= 68, INNER_ERROR(_returnData)); assembly { // Slice the sighash. diff --git a/packages/protocol/contracts/libs/LibMath.sol b/packages/protocol/contracts/shared/common/LibMath.sol similarity index 83% rename from packages/protocol/contracts/libs/LibMath.sol rename to packages/protocol/contracts/shared/common/LibMath.sol index cbdda81a3ff..14ae1a5e14d 100644 --- a/packages/protocol/contracts/libs/LibMath.sol +++ b/packages/protocol/contracts/shared/common/LibMath.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title LibMath /// @dev This library offers additional math functions for uint256. @@ -20,4 +20,8 @@ library LibMath { function max(uint256 _a, uint256 _b) internal pure returns (uint256) { return _a > _b ? _a : _b; } + + function capToUint64(uint256 _value) internal pure returns (uint64) { + return uint64(min(_value, type(uint64).max)); + } } diff --git a/packages/protocol/contracts/libs/LibNetwork.sol b/packages/protocol/contracts/shared/common/LibNetwork.sol similarity index 59% rename from packages/protocol/contracts/libs/LibNetwork.sol rename to packages/protocol/contracts/shared/common/LibNetwork.sol index b4c3f651ecc..2806b474a13 100644 --- a/packages/protocol/contracts/libs/LibNetwork.sol +++ b/packages/protocol/contracts/shared/common/LibNetwork.sol @@ -1,25 +1,26 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title LibNetwork library LibNetwork { - uint256 internal constant MAINNET = 1; - uint256 internal constant ROPSTEN = 2; - uint256 internal constant RINKEBY = 4; - uint256 internal constant GOERLI = 5; - uint256 internal constant KOVAN = 42; - uint256 internal constant HOLESKY = 17_000; - uint256 internal constant SEPOLIA = 11_155_111; + uint256 internal constant ETHEREUM_MAINNET = 1; + uint256 internal constant ETHEREUM_ROPSTEN = 2; + uint256 internal constant ETHEREUM_RINKEBY = 4; + uint256 internal constant ETHEREUM_GOERLI = 5; + uint256 internal constant ETHEREUM_KOVAN = 42; + uint256 internal constant ETHEREUM_HOLESKY = 17_000; + uint256 internal constant ETHEREUM_SEPOLIA = 11_155_111; - uint64 internal constant TAIKO = 167_000; + uint64 internal constant TAIKO_MAINNET = 167_000; + uint64 internal constant TAIKO_HEKLA = 167_009; /// @dev Checks if the chain ID represents an Ethereum testnet. /// @param _chainId The chain ID. /// @return true if the chain ID represents an Ethereum testnet, false otherwise. function isEthereumTestnet(uint256 _chainId) internal pure returns (bool) { - return _chainId == LibNetwork.ROPSTEN || _chainId == LibNetwork.RINKEBY - || _chainId == LibNetwork.GOERLI || _chainId == LibNetwork.KOVAN - || _chainId == LibNetwork.HOLESKY || _chainId == LibNetwork.SEPOLIA; + return _chainId == LibNetwork.ETHEREUM_ROPSTEN || _chainId == LibNetwork.ETHEREUM_RINKEBY + || _chainId == LibNetwork.ETHEREUM_GOERLI || _chainId == LibNetwork.ETHEREUM_KOVAN + || _chainId == LibNetwork.ETHEREUM_HOLESKY || _chainId == LibNetwork.ETHEREUM_SEPOLIA; } /// @dev Checks if the chain ID represents an Ethereum testnet or the Etheruem mainnet. @@ -27,14 +28,14 @@ library LibNetwork { /// @return true if the chain ID represents an Ethereum testnet or the Etheruem mainnet, false /// otherwise. function isEthereumMainnetOrTestnet(uint256 _chainId) internal pure returns (bool) { - return _chainId == LibNetwork.MAINNET || isEthereumTestnet(_chainId); + return _chainId == LibNetwork.ETHEREUM_MAINNET || isEthereumTestnet(_chainId); } /// @dev Checks if the chain ID represents the Taiko L2 mainnet. /// @param _chainId The chain ID. /// @return true if the chain ID represents the Taiko L2 mainnet. function isTaikoMainnet(uint256 _chainId) internal pure returns (bool) { - return _chainId == TAIKO; + return _chainId == TAIKO_MAINNET; } /// @dev Checks if the chain ID represents an internal Taiko devnet's base layer. @@ -50,7 +51,7 @@ library LibNetwork { /// @param _chainId The chain ID. /// @return true if the chain supports Dencun hardfork, false otherwise. function isDencunSupported(uint256 _chainId) internal pure returns (bool) { - return _chainId == LibNetwork.MAINNET || _chainId == LibNetwork.HOLESKY - || _chainId == LibNetwork.SEPOLIA || isTaikoDevnet(_chainId); + return _chainId == LibNetwork.ETHEREUM_MAINNET || _chainId == LibNetwork.ETHEREUM_HOLESKY + || _chainId == LibNetwork.ETHEREUM_SEPOLIA || isTaikoDevnet(_chainId); } } diff --git a/packages/protocol/contracts/common/LibStrings.sol b/packages/protocol/contracts/shared/common/LibStrings.sol similarity index 67% rename from packages/protocol/contracts/common/LibStrings.sol rename to packages/protocol/contracts/shared/common/LibStrings.sol index 3403c683a16..e744460adba 100644 --- a/packages/protocol/contracts/common/LibStrings.sol +++ b/packages/protocol/contracts/shared/common/LibStrings.sol @@ -1,10 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title LibStrings /// @custom:security-contact security@taiko.xyz library LibStrings { bytes32 internal constant B_AUTOMATA_DCAP_ATTESTATION = bytes32("automata_dcap_attestation"); + bytes32 internal constant B_BOND_TOKEN = bytes32("bond_token"); bytes32 internal constant B_BRIDGE = bytes32("bridge"); bytes32 internal constant B_BRIDGE_WATCHDOG = bytes32("bridge_watchdog"); bytes32 internal constant B_BRIDGED_ERC1155 = bytes32("bridged_erc1155"); @@ -14,18 +15,28 @@ library LibStrings { bytes32 internal constant B_ERC1155_VAULT = bytes32("erc1155_vault"); bytes32 internal constant B_ERC20_VAULT = bytes32("erc20_vault"); bytes32 internal constant B_ERC721_VAULT = bytes32("erc721_vault"); + bytes32 internal constant B_PRECONF_TASK_MANAGER = bytes32("preconf_task_manager"); bytes32 internal constant B_PROVER_ASSIGNMENT = bytes32("PROVER_ASSIGNMENT"); bytes32 internal constant B_PROVER_SET = bytes32("prover_set"); bytes32 internal constant B_QUOTA_MANAGER = bytes32("quota_manager"); + bytes32 internal constant B_SEQUENCER_REGISTRY = bytes32("sequencer_registry"); bytes32 internal constant B_SGX_WATCHDOG = bytes32("sgx_watchdog"); bytes32 internal constant B_SIGNAL_SERVICE = bytes32("signal_service"); + bytes32 internal constant B_SP1_REMOTE_VERIFIER = bytes32("sp1_remote_verifier"); bytes32 internal constant B_TAIKO = bytes32("taiko"); bytes32 internal constant B_TAIKO_TOKEN = bytes32("taiko_token"); bytes32 internal constant B_TIER_GUARDIAN = bytes32("tier_guardian"); bytes32 internal constant B_TIER_GUARDIAN_MINORITY = bytes32("tier_guardian_minority"); + bytes32 internal constant B_TIER_OPTIMISTIC = bytes32(""); bytes32 internal constant B_TIER_ROUTER = bytes32("tier_router"); bytes32 internal constant B_TIER_SGX = bytes32("tier_sgx"); - bytes32 internal constant B_TIER_SGX_ZKVM = bytes32("tier_sgx_zkvm"); + bytes32 internal constant B_TIER_TDX = bytes32("tier_tdx"); + bytes32 internal constant B_TIER_TEE_ANY = bytes32("tier_tee_any"); + bytes32 internal constant B_TIER_ZKVM_RISC0 = bytes32("tier_zkvm_risc0"); + bytes32 internal constant B_TIER_ZKVM_SP1 = bytes32("tier_zkvm_sp1"); + bytes32 internal constant B_TIER_ZKVM_ANY = bytes32("tier_zkvm_any"); + bytes32 internal constant B_TIER_ZKVM_AND_TEE = bytes32("tier_zkvm_and_tee"); + bytes32 internal constant B_RISCZERO_GROTH16_VERIFIER = bytes32("risc0_groth16_verifier"); bytes32 internal constant B_WITHDRAWER = bytes32("withdrawer"); bytes32 internal constant H_RETURN_LIVENESS_BOND = keccak256("RETURN_LIVENESS_BOND"); bytes32 internal constant H_SIGNAL_ROOT = keccak256("SIGNAL_ROOT"); diff --git a/packages/protocol/contracts/libs/LibTrieProof.sol b/packages/protocol/contracts/shared/common/LibTrieProof.sol similarity index 83% rename from packages/protocol/contracts/libs/LibTrieProof.sol rename to packages/protocol/contracts/shared/common/LibTrieProof.sol index f28476318c8..d65e7c4f9ec 100644 --- a/packages/protocol/contracts/libs/LibTrieProof.sol +++ b/packages/protocol/contracts/shared/common/LibTrieProof.sol @@ -4,11 +4,11 @@ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../thirdparty/optimism/rlp/RLPReader.sol"; -import "../thirdparty/optimism/rlp/RLPWriter.sol"; -import "../thirdparty/optimism/trie/SecureMerkleTrie.sol"; +import "@optimism/packages/contracts-bedrock/src/libraries/rlp/RLPReader.sol"; +import "@optimism/packages/contracts-bedrock/src/libraries/rlp/RLPWriter.sol"; +import "@optimism/packages/contracts-bedrock/src/libraries/trie/SecureMerkleTrie.sol"; /// @title LibTrieProof /// @custom:security-contact security@taiko.xyz @@ -47,7 +47,7 @@ library LibTrieProof { bytes memory rlpAccount = SecureMerkleTrie.get(abi.encodePacked(_addr), _accountProof, _rootHash); - if (rlpAccount.length == 0) revert LTP_INVALID_ACCOUNT_PROOF(); + require(rlpAccount.length != 0, LTP_INVALID_ACCOUNT_PROOF()); RLPReader.RLPItem[] memory accountState = RLPReader.readList(rlpAccount); @@ -61,6 +61,6 @@ library LibTrieProof { bytes.concat(_slot), RLPWriter.writeUint(uint256(_value)), _storageProof, storageRoot_ ); - if (!verified) revert LTP_INVALID_INCLUSION_PROOF(); + require(verified, LTP_INVALID_INCLUSION_PROOF()); } } diff --git a/packages/protocol/contracts/shared/data/LibSharedData.sol b/packages/protocol/contracts/shared/data/LibSharedData.sol new file mode 100644 index 00000000000..3bf9e665fd9 --- /dev/null +++ b/packages/protocol/contracts/shared/data/LibSharedData.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +library LibSharedData { + /// @dev Struct that represents L2 basefee configurations + struct BaseFeeConfig { + uint8 adjustmentQuotient; + uint8 sharingPctg; + uint32 gasIssuancePerSecond; + uint64 minGasExcess; + uint32 maxGasIssuancePerBlock; + } +} diff --git a/packages/protocol/contracts/signal/ISignalService.sol b/packages/protocol/contracts/shared/signal/ISignalService.sol similarity index 94% rename from packages/protocol/contracts/signal/ISignalService.sol rename to packages/protocol/contracts/shared/signal/ISignalService.sol index 52638ac5e4b..f6e8cc7b81f 100644 --- a/packages/protocol/contracts/signal/ISignalService.sol +++ b/packages/protocol/contracts/shared/signal/ISignalService.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title ISignalService /// @notice The SignalService contract serves as a secure cross-chain message @@ -148,18 +148,6 @@ interface ISignalService { view returns (bool); - /// @notice Returns the given block's chain height. - /// @param _chainId Identifier of the chainId. - /// @param _kind A value to mark the data type. - /// @return blockId_ The largest synced block id. - function getSyncedChainHeight( - uint64 _chainId, - bytes32 _kind - ) - external - view - returns (uint64 blockId_); - /// @notice Returns the given block's chain data. /// @param _chainId Identifier of the chainId. /// @param _kind A value to mark the data type. diff --git a/packages/protocol/contracts/signal/SignalService.sol b/packages/protocol/contracts/shared/signal/SignalService.sol similarity index 94% rename from packages/protocol/contracts/signal/SignalService.sol rename to packages/protocol/contracts/shared/signal/SignalService.sol index 1ae6a2eb0ec..f7432392bb7 100644 --- a/packages/protocol/contracts/signal/SignalService.sol +++ b/packages/protocol/contracts/shared/signal/SignalService.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../common/EssentialContract.sol"; import "../common/LibStrings.sol"; -import "../libs/LibTrieProof.sol"; +import "../common/LibTrieProof.sol"; import "./ISignalService.sol"; /// @title SignalService @@ -41,9 +41,9 @@ contract SignalService is EssentialContract, ISignalService { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @param _sharedAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _sharedAddressManager) external initializer { + __Essential_init(_owner, _sharedAddressManager); } /// @dev Authorize or deauthorize an address for calling syncChainData. @@ -120,7 +120,7 @@ contract SignalService is EssentialContract, ISignalService { ) public view - nonZeroValue(_chainData) + nonZeroBytes32(_chainData) returns (bool) { bytes32 signal = signalForChainData(_chainId, _kind, _blockId); @@ -132,11 +132,6 @@ contract SignalService is EssentialContract, ISignalService { return _loadSignalValue(_app, _signal) != 0; } - /// @inheritdoc ISignalService - function getSyncedChainHeight(uint64 _chainId, bytes32 _kind) external view returns (uint64) { - return topBlockId[_chainId][_kind]; - } - /// @inheritdoc ISignalService function getSyncedChainData( uint64 _chainId, @@ -198,8 +193,8 @@ contract SignalService is EssentialContract, ISignalService { view virtual nonZeroAddr(_app) - nonZeroValue(_signal) - nonZeroValue(_value) + nonZeroBytes32(_signal) + nonZeroBytes32(_value) returns (bytes32) { return LibTrieProof.verifyMerkleProof( @@ -239,8 +234,8 @@ contract SignalService is EssentialContract, ISignalService { ) private nonZeroAddr(_app) - nonZeroValue(_signal) - nonZeroValue(_value) + nonZeroBytes32(_signal) + nonZeroBytes32(_value) returns (bytes32 slot_) { slot_ = getSignalSlot(uint64(block.chainid), _app, _signal); @@ -281,7 +276,7 @@ contract SignalService is EssentialContract, ISignalService { private view nonZeroAddr(_app) - nonZeroValue(_signal) + nonZeroBytes32(_signal) returns (bytes32 value_) { bytes32 slot = getSignalSlot(uint64(block.chainid), _app, _signal); @@ -300,7 +295,7 @@ contract SignalService is EssentialContract, ISignalService { private view nonZeroAddr(_app) - nonZeroValue(_signal) + nonZeroBytes32(_signal) returns (CacheAction[] memory actions) { HopProof[] memory hopProofs = abi.decode(_proof, (HopProof[])); diff --git a/packages/protocol/contracts/tko/TaikoTokenBase.sol b/packages/protocol/contracts/shared/token/TaikoTokenBase.sol similarity index 98% rename from packages/protocol/contracts/tko/TaikoTokenBase.sol rename to packages/protocol/contracts/shared/token/TaikoTokenBase.sol index 2e30a8b9547..b0f373fac6c 100644 --- a/packages/protocol/contracts/tko/TaikoTokenBase.sol +++ b/packages/protocol/contracts/shared/token/TaikoTokenBase.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; import "../common/EssentialContract.sol"; diff --git a/packages/protocol/contracts/tokenvault/BaseNFTVault.sol b/packages/protocol/contracts/shared/tokenvault/BaseNFTVault.sol similarity index 99% rename from packages/protocol/contracts/tokenvault/BaseNFTVault.sol rename to packages/protocol/contracts/shared/tokenvault/BaseNFTVault.sol index 8b4e3559533..e47075803f7 100644 --- a/packages/protocol/contracts/tokenvault/BaseNFTVault.sol +++ b/packages/protocol/contracts/shared/tokenvault/BaseNFTVault.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./BaseVault.sol"; diff --git a/packages/protocol/contracts/tokenvault/BaseVault.sol b/packages/protocol/contracts/shared/tokenvault/BaseVault.sol similarity index 98% rename from packages/protocol/contracts/tokenvault/BaseVault.sol rename to packages/protocol/contracts/shared/tokenvault/BaseVault.sol index 18d17edb551..de9db5c8314 100644 --- a/packages/protocol/contracts/tokenvault/BaseVault.sol +++ b/packages/protocol/contracts/shared/tokenvault/BaseVault.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import "../bridge/IBridge.sol"; import "../common/EssentialContract.sol"; import "../common/LibStrings.sol"; -import "../libs/LibBytes.sol"; +import "../common/LibBytes.sol"; /// @title INameSymbol /// @notice Interface for contracts that provide name() and symbol() diff --git a/packages/protocol/contracts/tokenvault/BridgedERC1155.sol b/packages/protocol/contracts/shared/tokenvault/BridgedERC1155.sol similarity index 96% rename from packages/protocol/contracts/tokenvault/BridgedERC1155.sol rename to packages/protocol/contracts/shared/tokenvault/BridgedERC1155.sol index f846fc4d5c1..2edb63ce287 100644 --- a/packages/protocol/contracts/tokenvault/BridgedERC1155.sol +++ b/packages/protocol/contracts/shared/tokenvault/BridgedERC1155.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; import "../common/EssentialContract.sol"; @@ -35,7 +35,7 @@ contract BridgedERC1155 is /// @inheritdoc IBridgedERC1155Initializable function init( address _owner, - address _addressManager, + address _sharedAddressManager, address _srcToken, uint256 _srcChainId, string calldata _symbol, @@ -48,7 +48,7 @@ contract BridgedERC1155 is // The symbol and the name can be empty for ERC1155 tokens so we use some placeholder data // for them instead. LibBridgedToken.validateInputs(_srcToken, _srcChainId); - __Essential_init(_owner, _addressManager); + __Essential_init(_owner, _sharedAddressManager); // The token URI here is not important as the client will have to read the URI from the // canonical contract to fetch meta data. diff --git a/packages/protocol/contracts/tokenvault/BridgedERC20.sol b/packages/protocol/contracts/shared/tokenvault/BridgedERC20.sol similarity index 97% rename from packages/protocol/contracts/tokenvault/BridgedERC20.sol rename to packages/protocol/contracts/shared/tokenvault/BridgedERC20.sol index e8a75b8cbe0..f8a564680dc 100644 --- a/packages/protocol/contracts/tokenvault/BridgedERC20.sol +++ b/packages/protocol/contracts/shared/tokenvault/BridgedERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; @@ -60,7 +60,7 @@ contract BridgedERC20 is /// @inheritdoc IBridgedERC20Initializable function init( address _owner, - address _addressManager, + address _sharedAddressManager, address _srcToken, uint256 _srcChainId, uint8 _decimals, @@ -68,11 +68,12 @@ contract BridgedERC20 is string calldata _name ) external + virtual initializer { // Check if provided parameters are valid LibBridgedToken.validateInputs(_srcToken, _srcChainId); - __Essential_init(_owner, _addressManager); + __Essential_init(_owner, _sharedAddressManager); __ERC20_init(_name, _symbol); // Set contract properties @@ -149,7 +150,7 @@ contract BridgedERC20 is return migratingAddress != address(0) && !migratingInbound; } - function supportsInterface(bytes4 _interfaceId) public pure returns (bool) { + function supportsInterface(bytes4 _interfaceId) public pure virtual returns (bool) { return _interfaceId == type(IBridgedERC20).interfaceId || _interfaceId == type(IBridgedERC20Initializable).interfaceId || _interfaceId == type(IBridgedERC20Migratable).interfaceId diff --git a/packages/protocol/contracts/shared/tokenvault/BridgedERC20V2.sol b/packages/protocol/contracts/shared/tokenvault/BridgedERC20V2.sol new file mode 100644 index 00000000000..85cdfafefc6 --- /dev/null +++ b/packages/protocol/contracts/shared/tokenvault/BridgedERC20V2.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/interfaces/IERC5267Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol"; +import "./BridgedERC20.sol"; + +/// @title BridgedERC20V2 +/// @notice An upgradeable ERC20 contract that represents tokens bridged from +/// another chain. This implementation adds ERC20Permit support to BridgedERC20. +/// +/// Most of the code were copied from OZ's ERC20PermitUpgradeable.sol contract. +/// +/// @custom:security-contact security@taiko.xyz +contract BridgedERC20V2 is BridgedERC20, IERC20PermitUpgradeable, EIP712Upgradeable { + using CountersUpgradeable for CountersUpgradeable.Counter; + + // solhint-disable-next-line var-name-mixedcase + bytes32 private constant _PERMIT_TYPEHASH = keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ); + + mapping(address account => CountersUpgradeable.Counter counter) private _nonces; + uint256[49] private __gap; + + error BTOKEN_DEADLINE_EXPIRED(); + error BTOKEN_INVALID_SIG(); + + /// @inheritdoc IBridgedERC20Initializable + /// @dev This function is called when the bridge deploys a new bridged ERC20 token, so this + /// function must also cover the logic in init2(), we use + /// `reinitializer(2)` instead of `initializer`. + function init( + address _owner, + address _sharedAddressManager, + address _srcToken, + uint256 _srcChainId, + uint8 _decimals, + string calldata _symbol, + string calldata _name + ) + external + virtual + override + reinitializer(2) + { + // Check if provided parameters are valid + LibBridgedToken.validateInputs(_srcToken, _srcChainId); + __Essential_init(_owner, _sharedAddressManager); + __ERC20_init(_name, _symbol); + // Set contract properties + srcToken = _srcToken; + srcChainId = _srcChainId; + __srcDecimals = _decimals; + + // Cover logics from `init2()` + __EIP712_init_unchained(_name, "1"); + } + + /// @notice This function shall be called by previously deployed contracts. + function init2() external reinitializer(2) { + __EIP712_init_unchained(name(), "1"); + } + + /// @inheritdoc IERC20PermitUpgradeable + // solhint-disable-next-line func-name-mixedcase + function DOMAIN_SEPARATOR() external view override returns (bytes32) { + return _domainSeparatorV4(); + } + + /// @inheritdoc IERC20PermitUpgradeable + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) + public + virtual + override + { + if (block.timestamp > deadline) revert BTOKEN_DEADLINE_EXPIRED(); + + bytes32 structHash = keccak256( + abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline) + ); + + bytes32 hash = _hashTypedDataV4(structHash); + + address signer = ECDSAUpgradeable.recover(hash, v, r, s); + if (signer != owner) revert BTOKEN_INVALID_SIG(); + + _approve(owner, spender, value); + } + + /// @inheritdoc IERC20PermitUpgradeable + function nonces(address owner) public view virtual override returns (uint256) { + return _nonces[owner].current(); + } + + function supportsInterface(bytes4 _interfaceId) public pure virtual override returns (bool) { + return _interfaceId == type(IERC20PermitUpgradeable).interfaceId + || _interfaceId == type(IERC5267Upgradeable).interfaceId + || super.supportsInterface(_interfaceId); + } + + /// @dev "Consume a nonce": return the current value and increment. + function _useNonce(address owner) internal virtual returns (uint256 current) { + CountersUpgradeable.Counter storage nonce = _nonces[owner]; + current = nonce.current(); + nonce.increment(); + } +} diff --git a/packages/protocol/contracts/tokenvault/BridgedERC721.sol b/packages/protocol/contracts/shared/tokenvault/BridgedERC721.sol similarity index 96% rename from packages/protocol/contracts/tokenvault/BridgedERC721.sol rename to packages/protocol/contracts/shared/tokenvault/BridgedERC721.sol index 3315c8bb56c..979aa00edb2 100644 --- a/packages/protocol/contracts/tokenvault/BridgedERC721.sol +++ b/packages/protocol/contracts/shared/tokenvault/BridgedERC721.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; import "../common/EssentialContract.sol"; @@ -30,7 +30,7 @@ contract BridgedERC721 is /// @inheritdoc IBridgedERC721Initializable function init( address _owner, - address _addressManager, + address _sharedAddressManager, address _srcToken, uint256 _srcChainId, string calldata _symbol, @@ -41,7 +41,7 @@ contract BridgedERC721 is { // Check if provided parameters are valid LibBridgedToken.validateInputs(_srcToken, _srcChainId); - __Essential_init(_owner, _addressManager); + __Essential_init(_owner, _sharedAddressManager); __ERC721_init(_name, _symbol); srcToken = _srcToken; diff --git a/packages/protocol/contracts/tokenvault/ERC1155Vault.sol b/packages/protocol/contracts/shared/tokenvault/ERC1155Vault.sol similarity index 97% rename from packages/protocol/contracts/tokenvault/ERC1155Vault.sol rename to packages/protocol/contracts/shared/tokenvault/ERC1155Vault.sol index f6b82fe1c40..d9de36a88bf 100644 --- a/packages/protocol/contracts/tokenvault/ERC1155Vault.sol +++ b/packages/protocol/contracts/shared/tokenvault/ERC1155Vault.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC1155/utils/ERC1155ReceiverUpgradeable.sol"; -import "../libs/LibAddress.sol"; +import "../common/LibAddress.sol"; import "../common/LibStrings.sol"; import "./IBridgedERC1155.sol"; import "./BaseNFTVault.sol"; @@ -20,9 +20,9 @@ contract ERC1155Vault is BaseNFTVault, ERC1155ReceiverUpgradeable { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @param _sharedAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _sharedAddressManager) external initializer { + __Essential_init(_owner, _sharedAddressManager); __ERC1155Receiver_init(); } /// @notice Transfers ERC1155 tokens to this vault and sends a message to diff --git a/packages/protocol/contracts/tokenvault/ERC20Vault.sol b/packages/protocol/contracts/shared/tokenvault/ERC20Vault.sol similarity index 98% rename from packages/protocol/contracts/tokenvault/ERC20Vault.sol rename to packages/protocol/contracts/shared/tokenvault/ERC20Vault.sol index e2e017f4ceb..b7b0b0296b2 100644 --- a/packages/protocol/contracts/tokenvault/ERC20Vault.sol +++ b/packages/protocol/contracts/shared/tokenvault/ERC20Vault.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; @@ -7,7 +7,7 @@ import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "../bridge/IQuotaManager.sol"; import "../common/LibStrings.sol"; -import "../libs/LibAddress.sol"; +import "../common/LibAddress.sol"; import "./IBridgedERC20.sol"; import "./BaseVault.sol"; @@ -160,9 +160,9 @@ contract ERC20Vault is BaseVault { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @param _sharedAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _sharedAddressManager) external initializer { + __Essential_init(_owner, _sharedAddressManager); } /// @notice Change bridged token. @@ -355,8 +355,6 @@ contract ERC20Vault is BaseVault { private returns (address token_) { - _consumeTokenQuota(token_, _amount); - if (_ctoken.chainId == block.chainid) { token_ = _ctoken.addr; IERC20(token_).safeTransfer(_to, _amount); @@ -366,6 +364,7 @@ contract ERC20Vault is BaseVault { // check. IBridgedERC20(token_).mint(_to, _amount); } + _consumeTokenQuota(token_, _amount); } /// @dev Handles the message on the source chain and returns the encoded diff --git a/packages/protocol/contracts/tokenvault/ERC721Vault.sol b/packages/protocol/contracts/shared/tokenvault/ERC721Vault.sol similarity index 96% rename from packages/protocol/contracts/tokenvault/ERC721Vault.sol rename to packages/protocol/contracts/shared/tokenvault/ERC721Vault.sol index ac07f53bb2d..2784e80d64a 100644 --- a/packages/protocol/contracts/tokenvault/ERC721Vault.sol +++ b/packages/protocol/contracts/shared/tokenvault/ERC721Vault.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; -import "../libs/LibAddress.sol"; +import "../common/LibAddress.sol"; import "../common/LibStrings.sol"; import "./IBridgedERC721.sol"; import "./BaseNFTVault.sol"; @@ -20,9 +20,9 @@ contract ERC721Vault is BaseNFTVault, IERC721Receiver { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @param _sharedAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _sharedAddressManager) external initializer { + __Essential_init(_owner, _sharedAddressManager); } /// @notice Transfers ERC721 tokens to this vault and sends a message to the diff --git a/packages/protocol/contracts/tokenvault/IBridgedERC1155.sol b/packages/protocol/contracts/shared/tokenvault/IBridgedERC1155.sol similarity index 91% rename from packages/protocol/contracts/tokenvault/IBridgedERC1155.sol rename to packages/protocol/contracts/shared/tokenvault/IBridgedERC1155.sol index 3d0ac0a93de..4c3e721782f 100644 --- a/packages/protocol/contracts/tokenvault/IBridgedERC1155.sol +++ b/packages/protocol/contracts/shared/tokenvault/IBridgedERC1155.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IBridgedERC1155 /// @notice Contract for bridging ERC1155 tokens across different chains. @@ -32,14 +32,14 @@ interface IBridgedERC1155 { interface IBridgedERC1155Initializable { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. + /// @param _sharedAddressManager The address of the {AddressManager} contract. /// @param _srcToken Address of the source token. /// @param _srcChainId Source chain ID. /// @param _symbol Symbol of the bridged token. /// @param _name Name of the bridged token. function init( address _owner, - address _addressManager, + address _sharedAddressManager, address _srcToken, uint256 _srcChainId, string calldata _symbol, diff --git a/packages/protocol/contracts/tokenvault/IBridgedERC20.sol b/packages/protocol/contracts/shared/tokenvault/IBridgedERC20.sol similarity index 61% rename from packages/protocol/contracts/tokenvault/IBridgedERC20.sol rename to packages/protocol/contracts/shared/tokenvault/IBridgedERC20.sol index 06c274c9225..b8b672b4791 100644 --- a/packages/protocol/contracts/tokenvault/IBridgedERC20.sol +++ b/packages/protocol/contracts/shared/tokenvault/IBridgedERC20.sol @@ -1,11 +1,24 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IBridgedERC20 /// @notice Interface for all bridged tokens. -/// @dev To facilitate compatibility with third-party bridged tokens, sometimes it might be -/// necessary to implement an intermediary adapter contract which should conform to this interface, -/// enabling effective interaction with third-party contracts. +/// @dev Here is the list of assumptions that guarantees that the bridged token can be bridged back +/// to it's canonical counterpart (by-default it is, but in case a third-party "native" token is set +/// and used in our bridge): +/// - The token should be ERC-20 compliant +/// - Supply increases should only be caused by mints from the vault. Notably, rebasing tokens are +/// not supported. +/// - Token balances should change by exactly the given amounts on `transfer`/`mint`/`burn`. Notable, +/// tokens with fees on transfers are not supported. +/// - If the bridged token is not directly deployed by the Bridge (ERC20Vault), - for example a USDT +/// token bytecode deployed on Taiko to support native tokens - it might be necessary to implement +/// an intermediary adapter contract which should conform mint() and burn() interfaces, so that the +/// ERC20Vault can call these actions on the adapter. +/// - If the bridged token is not directly deployed by the Bridge (ERC20Vault), but conforms the +/// mint() and burn() interface and the ERC20Vault has the right to perform these actions (has +/// minter/burner role). +/// - If the bridged token is directly deployed by our Bridge (ERC20Vault). /// @custom:security-contact security@taiko.xyz interface IBridgedERC20 { /// @notice Mints `amount` tokens and assigns them to the `account` address. @@ -39,7 +52,7 @@ interface IBridgedERC20Migratable { interface IBridgedERC20Initializable { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. + /// @param _sharedAddressManager The address of the {AddressManager} contract. /// @param _srcToken The source token address. /// @param _srcChainId The source chain ID. /// @param _decimals The number of decimal places of the source token. @@ -47,7 +60,7 @@ interface IBridgedERC20Initializable { /// @param _name The name of the token. function init( address _owner, - address _addressManager, + address _sharedAddressManager, address _srcToken, uint256 _srcChainId, uint8 _decimals, diff --git a/packages/protocol/contracts/tokenvault/IBridgedERC721.sol b/packages/protocol/contracts/shared/tokenvault/IBridgedERC721.sol similarity index 90% rename from packages/protocol/contracts/tokenvault/IBridgedERC721.sol rename to packages/protocol/contracts/shared/tokenvault/IBridgedERC721.sol index e8a2d426605..8f89632084c 100644 --- a/packages/protocol/contracts/tokenvault/IBridgedERC721.sol +++ b/packages/protocol/contracts/shared/tokenvault/IBridgedERC721.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IBridgedERC721 /// @notice Contract for bridging ERC721 tokens across different chains. @@ -25,14 +25,14 @@ interface IBridgedERC721 { interface IBridgedERC721Initializable { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. + /// @param _sharedAddressManager The address of the {AddressManager} contract. /// @param _srcToken Address of the source token. /// @param _srcChainId Source chain ID. /// @param _symbol Symbol of the bridged token. /// @param _name Name of the bridged token. function init( address _owner, - address _addressManager, + address _sharedAddressManager, address _srcToken, uint256 _srcChainId, string calldata _symbol, diff --git a/packages/protocol/contracts/tokenvault/LibBridgedToken.sol b/packages/protocol/contracts/shared/tokenvault/LibBridgedToken.sol similarity index 98% rename from packages/protocol/contracts/tokenvault/LibBridgedToken.sol rename to packages/protocol/contracts/shared/tokenvault/LibBridgedToken.sol index c81313ccb04..bf6b8125b8a 100644 --- a/packages/protocol/contracts/tokenvault/LibBridgedToken.sol +++ b/packages/protocol/contracts/shared/tokenvault/LibBridgedToken.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/utils/Strings.sol"; diff --git a/packages/protocol/contracts/team/proving/ProverSet.sol b/packages/protocol/contracts/team/proving/ProverSet.sol deleted file mode 100644 index 00ba19a7ebf..00000000000 --- a/packages/protocol/contracts/team/proving/ProverSet.sol +++ /dev/null @@ -1,125 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; -import "@openzeppelin/contracts/interfaces/IERC1271.sol"; -import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "../../common/EssentialContract.sol"; -import "../../common/LibStrings.sol"; -import "../../L1/ITaikoL1.sol"; - -interface IHasRecipient { - function recipient() external view returns (address); -} - -/// @title ProverSet -/// @notice A contract that holds TKO token and acts as a Taiko prover. This contract will simply -/// relay `proveBlock` calls to TaikoL1 so msg.sender doesn't need to hold any TKO. -/// @custom:security-contact security@taiko.xyz -contract ProverSet is EssentialContract, IERC1271 { - bytes4 private constant _EIP1271_MAGICVALUE = 0x1626ba7e; - - mapping(address prover => bool isProver) public isProver; // slot 1 - address public admin; // slot 2 - - uint256[48] private __gap; - - event ProverEnabled(address indexed prover, bool indexed enabled); - - error INVALID_STATUS(); - error PERMISSION_DENIED(); - - modifier onlyAuthorized() { - if (msg.sender != admin && msg.sender != IHasRecipient(admin).recipient()) { - revert PERMISSION_DENIED(); - } - _; - } - - modifier onlyProver() { - if (!isProver[msg.sender]) revert PERMISSION_DENIED(); - _; - } - - /// @notice Initializes the contract. - function init( - address _owner, - address _admin, - address _addressManager - ) - external - nonZeroAddr(_admin) - initializer - { - __Essential_init(_owner, _addressManager); - admin = _admin; - IERC20(tkoToken()).approve(taikoL1(), type(uint256).max); - } - - /// @notice Receives ETH as fees. - receive() external payable { } - - function approveAllowance(address _address, uint256 _allowance) external onlyOwner { - IERC20(tkoToken()).approve(_address, _allowance); - } - - /// @notice Enables or disables a prover. - function enableProver(address _prover, bool _isProver) external onlyAuthorized { - if (isProver[_prover] == _isProver) revert INVALID_STATUS(); - isProver[_prover] = _isProver; - - emit ProverEnabled(_prover, _isProver); - } - - /// @notice Withdraws Taiko tokens back to the admin address. - function withdrawToAdmin(uint256 _amount) external onlyAuthorized { - IERC20(tkoToken()).transfer(admin, _amount); - } - - /// @notice Propose a Taiko block. - function proposeBlock( - bytes calldata _params, - bytes calldata _txList - ) - external - onlyProver - nonReentrant - { - ITaikoL1(taikoL1()).proposeBlock(_params, _txList); - } - - /// @notice Proves or contests a Taiko block. - function proveBlock(uint64 _blockId, bytes calldata _input) external onlyProver nonReentrant { - ITaikoL1(taikoL1()).proveBlock(_blockId, _input); - } - - /// @notice Delegates token voting right to a delegatee. - /// @param _delegatee The delegatee to receive the voting right. - function delegate(address _delegatee) external onlyAuthorized nonReentrant { - ERC20VotesUpgradeable(tkoToken()).delegate(_delegatee); - } - - // This function is necessary for this contract to become an assigned prover. - function isValidSignature( - bytes32 _hash, - bytes calldata _signature - ) - external - view - returns (bytes4 magicValue_) - { - (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(_hash, _signature); - if (error == ECDSA.RecoverError.NoError && isProver[recovered]) { - magicValue_ = _EIP1271_MAGICVALUE; - } - } - - function taikoL1() internal view virtual returns (address) { - return resolve(LibStrings.B_TAIKO, false); - } - - function tkoToken() internal view virtual returns (address) { - return resolve(LibStrings.B_TAIKO_TOKEN, false); - } -} diff --git a/packages/protocol/contracts/thirdparty/README.md b/packages/protocol/contracts/thirdparty/README.md deleted file mode 100644 index 0102fe8cd67..00000000000 --- a/packages/protocol/contracts/thirdparty/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# ABOUT THIRDPARTY CODE - -- /optimism: code copied from `packages/contracts-bedrock/src/libraries` in https://github.com/ethereum-optimism/optimism/releases/tag/op-batcher%2Fv1.4.3 as-is with only solidity pragma changed. - -- /solmate: code copied from https://github.com/transmissions11/solmate/blob/v7/src/utils/FixedPointMathLib.sol as-is with only solidity pragma changed. - -- /nomad-xyz: code copied from https://github.com/nomad-xyz/ExcessivelySafeCall/blob/main/src/ExcessivelySafeCall.sol with unused coded removed and solidity pragma changed. - -- /risczero: interface copied from https://sepolia.etherscan.io/address/0x83c2e9cd64b2a16d3908e94c7654f3864212e2f8#code as per: https://dev.risczero.com/api/blockchain-integration/contracts/verifier diff --git a/packages/protocol/contracts/thirdparty/optimism/Bytes.sol b/packages/protocol/contracts/thirdparty/optimism/Bytes.sol deleted file mode 100644 index 6a6fba86e7d..00000000000 --- a/packages/protocol/contracts/thirdparty/optimism/Bytes.sol +++ /dev/null @@ -1,152 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @title Bytes -/// @notice Bytes is a library for manipulating byte arrays. -library Bytes { - /// @custom:attribution https://github.com/GNSPS/solidity-bytes-utils - /// @notice Slices a byte array with a given starting index and length. Returns a new byte array - /// as opposed to a pointer to the original array. Will throw if trying to slice more - /// bytes than exist in the array. - /// @param _bytes Byte array to slice. - /// @param _start Starting index of the slice. - /// @param _length Length of the slice. - /// @return Slice of the input byte array. - function slice( - bytes memory _bytes, - uint256 _start, - uint256 _length - ) - internal - pure - returns (bytes memory) - { - unchecked { - require(_length + 31 >= _length, "slice_overflow"); - require(_start + _length >= _start, "slice_overflow"); - require(_bytes.length >= _start + _length, "slice_outOfBounds"); - } - - bytes memory tempBytes; - - assembly { - switch iszero(_length) - case 0 { - // Get a location of some free memory and store it in tempBytes as - // Solidity does for memory variables. - tempBytes := mload(0x40) - - // The first word of the slice result is potentially a partial - // word read from the original array. To read it, we calculate - // the length of that partial word and start copying that many - // bytes into the array. The first word we copy will start with - // data we don't care about, but the last `lengthmod` bytes will - // land at the beginning of the contents of the new array. When - // we're done copying, we overwrite the full first word with - // the actual length of the slice. - let lengthmod := and(_length, 31) - - // The multiplication in the next line is necessary - // because when slicing multiples of 32 bytes (lengthmod == 0) - // the following copy loop was copying the origin's length - // and then ending prematurely not copying everything it should. - let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) - let end := add(mc, _length) - - for { - // The multiplication in the next line has the same exact purpose - // as the one above. - let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) - } lt(mc, end) { - mc := add(mc, 0x20) - cc := add(cc, 0x20) - } { mstore(mc, mload(cc)) } - - mstore(tempBytes, _length) - - //update free-memory pointer - //allocating the array padded to 32 bytes like the compiler does now - mstore(0x40, and(add(mc, 31), not(31))) - } - //if we want a zero-length slice let's just return a zero-length array - default { - tempBytes := mload(0x40) - - //zero out the 32 bytes slice we are about to return - //we need to do it because Solidity does not garbage collect - mstore(tempBytes, 0) - - mstore(0x40, add(tempBytes, 0x20)) - } - } - - return tempBytes; - } - - /// @notice Slices a byte array with a given starting index up to the end of the original byte - /// array. Returns a new array rather than a pointer to the original. - /// @param _bytes Byte array to slice. - /// @param _start Starting index of the slice. - /// @return Slice of the input byte array. - function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) { - if (_start >= _bytes.length) { - return bytes(""); - } - return slice(_bytes, _start, _bytes.length - _start); - } - - /// @notice Converts a byte array into a nibble array by splitting each byte into two nibbles. - /// Resulting nibble array will be exactly twice as long as the input byte array. - /// @param _bytes Input byte array to convert. - /// @return Resulting nibble array. - function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) { - bytes memory _nibbles; - assembly { - // Grab a free memory offset for the new array - _nibbles := mload(0x40) - - // Load the length of the passed bytes array from memory - let bytesLength := mload(_bytes) - - // Calculate the length of the new nibble array - // This is the length of the input array times 2 - let nibblesLength := shl(0x01, bytesLength) - - // Update the free memory pointer to allocate memory for the new array. - // To do this, we add the length of the new array + 32 bytes for the array length - // rounded up to the nearest 32 byte boundary to the current free memory pointer. - mstore(0x40, add(_nibbles, and(not(0x1F), add(nibblesLength, 0x3F)))) - - // Store the length of the new array in memory - mstore(_nibbles, nibblesLength) - - // Store the memory offset of the _bytes array's contents on the stack - let bytesStart := add(_bytes, 0x20) - - // Store the memory offset of the nibbles array's contents on the stack - let nibblesStart := add(_nibbles, 0x20) - - // Loop through each byte in the input array - for { let i := 0x00 } lt(i, bytesLength) { i := add(i, 0x01) } { - // Get the starting offset of the next 2 bytes in the nibbles array - let offset := add(nibblesStart, shl(0x01, i)) - // Load the byte at the current index within the `_bytes` array - let b := byte(0x00, mload(add(bytesStart, i))) - - // Pull out the first nibble and store it in the new array - mstore8(offset, shr(0x04, b)) - // Pull out the second nibble and store it in the new array - mstore8(add(offset, 0x01), and(b, 0x0F)) - } - } - return _nibbles; - } - - /// @notice Compares two byte arrays by comparing their keccak256 hashes. - /// @param _bytes First byte array to compare. - /// @param _other Second byte array to compare. - /// @return true if the two byte arrays are equal, false otherwise. - function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) { - return keccak256(_bytes) == keccak256(_other); - } -} diff --git a/packages/protocol/contracts/thirdparty/optimism/rlp/RLPReader.sol b/packages/protocol/contracts/thirdparty/optimism/rlp/RLPReader.sol deleted file mode 100644 index 9164b7490ed..00000000000 --- a/packages/protocol/contracts/thirdparty/optimism/rlp/RLPReader.sol +++ /dev/null @@ -1,303 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @custom:attribution https://github.com/hamdiallam/Solidity-RLP -/// @title RLPReader -/// @notice RLPReader is a library for parsing RLP-encoded byte arrays into Solidity types. Adapted -/// from Solidity-RLP (https://github.com/hamdiallam/Solidity-RLP) by Hamdi Allam with -/// various tweaks to improve readability. (A shout-out to Optimism !) -library RLPReader { - /// @notice Custom pointer type to avoid confusion between pointers and uint256s. - type MemoryPointer is uint256; - - /// @notice RLP item types. - /// @custom:value DATA_ITEM Represents an RLP data item (NOT a list). - /// @custom:value LIST_ITEM Represents an RLP list item. - enum RLPItemType { - DATA_ITEM, - LIST_ITEM - } - - /// @notice Struct representing an RLP item. - /// @custom:field length Length of the RLP item. - /// @custom:field ptr Pointer to the RLP item in memory. - struct RLPItem { - uint256 length; - MemoryPointer ptr; - } - - /// @notice Max list length that this library will accept. - uint256 internal constant MAX_LIST_LENGTH = 32; - - /// @notice Converts bytes to a reference to memory position and length. - /// @param _in Input bytes to convert. - /// @return out_ Output memory reference. - function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory out_) { - // Empty arrays are not RLP items. - require( - _in.length > 0, - "RLPReader: length of an RLP item must be greater than zero to be decodable" - ); - - MemoryPointer ptr; - assembly { - ptr := add(_in, 32) - } - - out_ = RLPItem({ length: _in.length, ptr: ptr }); - } - - /// @notice Reads an RLP list value into a list of RLP items. - /// @param _in RLP list value. - /// @return out_ Decoded RLP list items. - function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory out_) { - (uint256 listOffset, uint256 listLength, RLPItemType itemType) = _decodeLength(_in); - - require( - itemType == RLPItemType.LIST_ITEM, - "RLPReader: decoded item type for list is not a list item" - ); - - require( - listOffset + listLength == _in.length, - "RLPReader: list item has an invalid data remainder" - ); - - // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by - // writing to the length. Since we can't know the number of RLP items without looping over - // the entire input, we'd have to loop twice to accurately size this array. It's easier to - // simply set a reasonable maximum list length and decrease the size before we finish. - out_ = new RLPItem[](MAX_LIST_LENGTH); - - uint256 itemCount = 0; - uint256 offset = listOffset; - while (offset < _in.length) { - (uint256 itemOffset, uint256 itemLength,) = _decodeLength( - RLPItem({ - length: _in.length - offset, - ptr: MemoryPointer.wrap(MemoryPointer.unwrap(_in.ptr) + offset) - }) - ); - - // We don't need to check itemCount < out.length explicitly because Solidity already - // handles this check on our behalf, we'd just be wasting gas. - out_[itemCount] = RLPItem({ - length: itemLength + itemOffset, - ptr: MemoryPointer.wrap(MemoryPointer.unwrap(_in.ptr) + offset) - }); - - itemCount += 1; - offset += itemOffset + itemLength; - } - - // Decrease the array size to match the actual item count. - assembly { - mstore(out_, itemCount) - } - } - - /// @notice Reads an RLP list value into a list of RLP items. - /// @param _in RLP list value. - /// @return out_ Decoded RLP list items. - function readList(bytes memory _in) internal pure returns (RLPItem[] memory out_) { - out_ = readList(toRLPItem(_in)); - } - - /// @notice Reads an RLP bytes value into bytes. - /// @param _in RLP bytes value. - /// @return out_ Decoded bytes. - function readBytes(RLPItem memory _in) internal pure returns (bytes memory out_) { - (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in); - - require( - itemType == RLPItemType.DATA_ITEM, - "RLPReader: decoded item type for bytes is not a data item" - ); - - require( - _in.length == itemOffset + itemLength, - "RLPReader: bytes value contains an invalid remainder" - ); - - out_ = _copy(_in.ptr, itemOffset, itemLength); - } - - /// @notice Reads an RLP bytes value into bytes. - /// @param _in RLP bytes value. - /// @return out_ Decoded bytes. - function readBytes(bytes memory _in) internal pure returns (bytes memory out_) { - out_ = readBytes(toRLPItem(_in)); - } - - /// @notice Reads the raw bytes of an RLP item. - /// @param _in RLP item to read. - /// @return out_ Raw RLP bytes. - function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory out_) { - out_ = _copy(_in.ptr, 0, _in.length); - } - - /// @notice Decodes the length of an RLP item. - /// @param _in RLP item to decode. - /// @return offset_ Offset of the encoded data. - /// @return length_ Length of the encoded data. - /// @return type_ RLP item type (LIST_ITEM or DATA_ITEM). - function _decodeLength(RLPItem memory _in) - private - pure - returns (uint256 offset_, uint256 length_, RLPItemType type_) - { - // Short-circuit if there's nothing to decode, note that we perform this check when - // the user creates an RLP item via toRLPItem, but it's always possible for them to bypass - // that function and create an RLP item directly. So we need to check this anyway. - require( - _in.length > 0, - "RLPReader: length of an RLP item must be greater than zero to be decodable" - ); - - MemoryPointer ptr = _in.ptr; - uint256 prefix; - assembly { - prefix := byte(0, mload(ptr)) - } - - if (prefix <= 0x7f) { - // Single byte. - return (0, 1, RLPItemType.DATA_ITEM); - } else if (prefix <= 0xb7) { - // Short string. - - // slither-disable-next-line variable-scope - uint256 strLen = prefix - 0x80; - - require( - _in.length > strLen, - "RLPReader: length of content must be greater than string length (short string)" - ); - - bytes1 firstByteOfContent; - assembly { - firstByteOfContent := and(mload(add(ptr, 1)), shl(248, 0xff)) - } - - require( - strLen != 1 || firstByteOfContent >= 0x80, - "RLPReader: invalid prefix, single byte < 0x80 are not prefixed (short string)" - ); - - return (1, strLen, RLPItemType.DATA_ITEM); - } else if (prefix <= 0xbf) { - // Long string. - uint256 lenOfStrLen = prefix - 0xb7; - - require( - _in.length > lenOfStrLen, - "RLPReader: length of content must be > than length of string length (long string)" - ); - - bytes1 firstByteOfContent; - assembly { - firstByteOfContent := and(mload(add(ptr, 1)), shl(248, 0xff)) - } - - require( - firstByteOfContent != 0x00, - "RLPReader: length of content must not have any leading zeros (long string)" - ); - - uint256 strLen; - assembly { - strLen := shr(sub(256, mul(8, lenOfStrLen)), mload(add(ptr, 1))) - } - - require( - strLen > 55, - "RLPReader: length of content must be greater than 55 bytes (long string)" - ); - - require( - _in.length > lenOfStrLen + strLen, - "RLPReader: length of content must be greater than total length (long string)" - ); - - return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM); - } else if (prefix <= 0xf7) { - // Short list. - // slither-disable-next-line variable-scope - uint256 listLen = prefix - 0xc0; - - require( - _in.length > listLen, - "RLPReader: length of content must be greater than list length (short list)" - ); - - return (1, listLen, RLPItemType.LIST_ITEM); - } else { - // Long list. - uint256 lenOfListLen = prefix - 0xf7; - - require( - _in.length > lenOfListLen, - "RLPReader: length of content must be > than length of list length (long list)" - ); - - bytes1 firstByteOfContent; - assembly { - firstByteOfContent := and(mload(add(ptr, 1)), shl(248, 0xff)) - } - - require( - firstByteOfContent != 0x00, - "RLPReader: length of content must not have any leading zeros (long list)" - ); - - uint256 listLen; - assembly { - listLen := shr(sub(256, mul(8, lenOfListLen)), mload(add(ptr, 1))) - } - - require( - listLen > 55, - "RLPReader: length of content must be greater than 55 bytes (long list)" - ); - - require( - _in.length > lenOfListLen + listLen, - "RLPReader: length of content must be greater than total length (long list)" - ); - - return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM); - } - } - - /// @notice Copies the bytes from a memory location. - /// @param _src Pointer to the location to read from. - /// @param _offset Offset to start reading from. - /// @param _length Number of bytes to read. - /// @return out_ Copied bytes. - function _copy( - MemoryPointer _src, - uint256 _offset, - uint256 _length - ) - private - pure - returns (bytes memory out_) - { - out_ = new bytes(_length); - if (_length == 0) { - return out_; - } - - // Mostly based on Solidity's copy_memory_to_memory: - // solhint-disable max-line-length - // https://github.com/ethereum/solidity/blob/34dd30d71b4da730488be72ff6af7083cf2a91f6/libsolidity/codegen/YulUtilFunctions.cpp#L102-L114 - uint256 src = MemoryPointer.unwrap(_src) + _offset; - assembly { - let dest := add(out_, 32) - let i := 0 - for { } lt(i, _length) { i := add(i, 32) } { mstore(add(dest, i), mload(add(src, i))) } - - if gt(i, _length) { mstore(add(dest, _length), 0) } - } - } -} diff --git a/packages/protocol/contracts/thirdparty/optimism/rlp/RLPWriter.sol b/packages/protocol/contracts/thirdparty/optimism/rlp/RLPWriter.sol deleted file mode 100644 index f6eb0bf54a1..00000000000 --- a/packages/protocol/contracts/thirdparty/optimism/rlp/RLPWriter.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @custom:attribution https://github.com/bakaoh/solidity-rlp-encode -/// @title RLPWriter -/// @author RLPWriter is a library for encoding Solidity types to RLP bytes. Adapted from Bakaoh's -/// RLPEncode library (https://github.com/bakaoh/solidity-rlp-encode) with minor -/// modifications to improve legibility. (A shout-out to Optimism !) -library RLPWriter { - /// @notice RLP encodes a byte string. - /// @param _in The byte string to encode. - /// @return out_ The RLP encoded string in bytes. - function writeBytes(bytes memory _in) internal pure returns (bytes memory out_) { - if (_in.length == 1 && uint8(_in[0]) < 128) { - out_ = _in; - } else { - out_ = abi.encodePacked(_writeLength(_in.length, 128), _in); - } - } - - /// @notice RLP encodes a uint. - /// @param _in The uint256 to encode. - /// @return out_ The RLP encoded uint256 in bytes. - function writeUint(uint256 _in) internal pure returns (bytes memory out_) { - out_ = writeBytes(_toBinary(_in)); - } - - /// @notice Encode the first byte and then the `len` in binary form if `length` is more than 55. - /// @param _len The length of the string or the payload. - /// @param _offset 128 if item is string, 192 if item is list. - /// @return out_ RLP encoded bytes. - function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory out_) { - if (_len < 56) { - out_ = new bytes(1); - out_[0] = bytes1(uint8(_len) + uint8(_offset)); - } else { - uint256 lenLen; - uint256 i = 1; - while (_len / i != 0) { - lenLen++; - i *= 256; - } - - out_ = new bytes(lenLen + 1); - out_[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55); - for (i = 1; i <= lenLen; i++) { - out_[i] = bytes1(uint8((_len / (256 ** (lenLen - i))) % 256)); - } - } - } - - /// @notice Encode integer in big endian binary form with no leading zeroes. - /// @param _x The integer to encode. - /// @return out_ RLP encoded bytes. - function _toBinary(uint256 _x) private pure returns (bytes memory out_) { - bytes memory b = abi.encodePacked(_x); - - uint256 i = 0; - for (; i < 32; i++) { - if (b[i] != 0) { - break; - } - } - - out_ = new bytes(32 - i); - for (uint256 j = 0; j < out_.length; j++) { - out_[j] = b[i++]; - } - } -} diff --git a/packages/protocol/contracts/thirdparty/optimism/trie/MerkleTrie.sol b/packages/protocol/contracts/thirdparty/optimism/trie/MerkleTrie.sol deleted file mode 100644 index 3b883d0185e..00000000000 --- a/packages/protocol/contracts/thirdparty/optimism/trie/MerkleTrie.sol +++ /dev/null @@ -1,247 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import { Bytes } from "../Bytes.sol"; -import { RLPReader } from "../rlp/RLPReader.sol"; - -/// @title MerkleTrie -/// @notice MerkleTrie is a small library for verifying standard Ethereum Merkle-Patricia trie -/// inclusion proofs. By default, this library assumes a hexary trie. One can change the -/// trie radix constant to support other trie radixes. -library MerkleTrie { - /// @notice Struct representing a node in the trie. - /// @custom:field encoded The RLP-encoded node. - /// @custom:field decoded The RLP-decoded node. - struct TrieNode { - bytes encoded; - RLPReader.RLPItem[] decoded; - } - - /// @notice Determines the number of elements per branch node. - uint256 internal constant TREE_RADIX = 16; - - /// @notice Branch nodes have TREE_RADIX elements and one value element. - uint256 internal constant BRANCH_NODE_LENGTH = TREE_RADIX + 1; - - /// @notice Leaf nodes and extension nodes have two elements, a `path` and a `value`. - uint256 internal constant LEAF_OR_EXTENSION_NODE_LENGTH = 2; - - /// @notice Prefix for even-nibbled extension node paths. - uint8 internal constant PREFIX_EXTENSION_EVEN = 0; - - /// @notice Prefix for odd-nibbled extension node paths. - uint8 internal constant PREFIX_EXTENSION_ODD = 1; - - /// @notice Prefix for even-nibbled leaf node paths. - uint8 internal constant PREFIX_LEAF_EVEN = 2; - - /// @notice Prefix for odd-nibbled leaf node paths. - uint8 internal constant PREFIX_LEAF_ODD = 3; - - /// @notice Verifies a proof that a given key/value pair is present in the trie. - /// @param _key Key of the node to search for, as a hex string. - /// @param _value Value of the node to search for, as a hex string. - /// @param _proof Merkle trie inclusion proof for the desired node. Unlike traditional Merkle - /// trees, this proof is executed top-down and consists of a list of RLP-encoded - /// nodes that make a path down to the target node. - /// @param _root Known root of the Merkle trie. Used to verify that the included proof is - /// correctly constructed. - /// @return valid_ Whether or not the proof is valid. - function verifyInclusionProof( - bytes memory _key, - bytes memory _value, - bytes[] memory _proof, - bytes32 _root - ) - internal - pure - returns (bool valid_) - { - valid_ = Bytes.equal(_value, get(_key, _proof, _root)); - } - - /// @notice Retrieves the value associated with a given key. - /// @param _key Key to search for, as hex bytes. - /// @param _proof Merkle trie inclusion proof for the key. - /// @param _root Known root of the Merkle trie. - /// @return value_ Value of the key if it exists. - function get( - bytes memory _key, - bytes[] memory _proof, - bytes32 _root - ) - internal - pure - returns (bytes memory value_) - { - require(_key.length > 0, "MerkleTrie: empty key"); - - TrieNode[] memory proof = _parseProof(_proof); - bytes memory key = Bytes.toNibbles(_key); - bytes memory currentNodeID = abi.encodePacked(_root); - uint256 currentKeyIndex = 0; - - // Proof is top-down, so we start at the first element (root). - for (uint256 i = 0; i < proof.length; i++) { - TrieNode memory currentNode = proof[i]; - - // Key index should never exceed total key length or we'll be out of bounds. - require(currentKeyIndex <= key.length, "MerkleTrie: key index exceeds total key length"); - - if (currentKeyIndex == 0) { - // First proof element is always the root node. - require( - Bytes.equal(abi.encodePacked(keccak256(currentNode.encoded)), currentNodeID), - "MerkleTrie: invalid root hash" - ); - } else if (currentNode.encoded.length >= 32) { - // Nodes 32 bytes or larger are hashed inside branch nodes. - require( - Bytes.equal(abi.encodePacked(keccak256(currentNode.encoded)), currentNodeID), - "MerkleTrie: invalid large internal hash" - ); - } else { - // Nodes smaller than 32 bytes aren't hashed. - require( - Bytes.equal(currentNode.encoded, currentNodeID), - "MerkleTrie: invalid internal node hash" - ); - } - - if (currentNode.decoded.length == BRANCH_NODE_LENGTH) { - if (currentKeyIndex == key.length) { - // Value is the last element of the decoded list (for branch nodes). There's - // some ambiguity in the Merkle trie specification because bytes(0) is a - // valid value to place into the trie, but for branch nodes bytes(0) can exist - // even when the value wasn't explicitly placed there. Geth treats a value of - // bytes(0) as "key does not exist" and so we do the same. - value_ = RLPReader.readBytes(currentNode.decoded[TREE_RADIX]); - require( - value_.length > 0, - "MerkleTrie: value length must be greater than zero (branch)" - ); - - // Extra proof elements are not allowed. - require( - i == proof.length - 1, - "MerkleTrie: value node must be last node in proof (branch)" - ); - - return value_; - } else { - // We're not at the end of the key yet. - // Figure out what the next node ID should be and continue. - uint8 branchKey = uint8(key[currentKeyIndex]); - RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey]; - currentNodeID = _getNodeID(nextNode); - currentKeyIndex += 1; - } - } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) { - bytes memory path = _getNodePath(currentNode); - uint8 prefix = uint8(path[0]); - uint8 offset = 2 - (prefix % 2); - bytes memory pathRemainder = Bytes.slice(path, offset); - bytes memory keyRemainder = Bytes.slice(key, currentKeyIndex); - uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder); - - // Whether this is a leaf node or an extension node, the path remainder MUST be a - // prefix of the key remainder (or be equal to the key remainder) or the proof is - // considered invalid. - require( - pathRemainder.length == sharedNibbleLength, - "MerkleTrie: path remainder must share all nibbles with key" - ); - - if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) { - // Prefix of 2 or 3 means this is a leaf node. For the leaf node to be valid, - // the key remainder must be exactly equal to the path remainder. We already - // did the necessary byte comparison, so it's more efficient here to check that - // the key remainder length equals the shared nibble length, which implies - // equality with the path remainder (since we already did the same check with - // the path remainder and the shared nibble length). - require( - keyRemainder.length == sharedNibbleLength, - "MerkleTrie: key remainder must be identical to path remainder" - ); - - // Our Merkle Trie is designed specifically for the purposes of the Ethereum - // state trie. Empty values are not allowed in the state trie, so we can safely - // say that if the value is empty, the key should not exist and the proof is - // invalid. - value_ = RLPReader.readBytes(currentNode.decoded[1]); - require( - value_.length > 0, - "MerkleTrie: value length must be greater than zero (leaf)" - ); - - // Extra proof elements are not allowed. - require( - i == proof.length - 1, - "MerkleTrie: value node must be last node in proof (leaf)" - ); - - return value_; - } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) { - // Prefix of 0 or 1 means this is an extension node. We move onto the next node - // in the proof and increment the key index by the length of the path remainder - // which is equal to the shared nibble length. - currentNodeID = _getNodeID(currentNode.decoded[1]); - currentKeyIndex += sharedNibbleLength; - } else { - revert("MerkleTrie: received a node with an unknown prefix"); - } - } else { - revert("MerkleTrie: received an unparseable node"); - } - } - - revert("MerkleTrie: ran out of proof elements"); - } - - /// @notice Parses an array of proof elements into a new array that contains both the original - /// encoded element and the RLP-decoded element. - /// @param _proof Array of proof elements to parse. - /// @return proof_ Proof parsed into easily accessible structs. - function _parseProof(bytes[] memory _proof) private pure returns (TrieNode[] memory proof_) { - uint256 length = _proof.length; - proof_ = new TrieNode[](length); - for (uint256 i = 0; i < length; ++i) { - proof_[i] = TrieNode({ encoded: _proof[i], decoded: RLPReader.readList(_proof[i]) }); - } - } - - /// @notice Picks out the ID for a node. Node ID is referred to as the "hash" within the - /// specification, but nodes < 32 bytes are not actually hashed. - /// @param _node Node to pull an ID for. - /// @return id_ ID for the node, depending on the size of its contents. - function _getNodeID(RLPReader.RLPItem memory _node) private pure returns (bytes memory id_) { - id_ = _node.length < 32 ? RLPReader.readRawBytes(_node) : RLPReader.readBytes(_node); - } - - /// @notice Gets the path for a leaf or extension node. - /// @param _node Node to get a path for. - /// @return nibbles_ Node path, converted to an array of nibbles. - function _getNodePath(TrieNode memory _node) private pure returns (bytes memory nibbles_) { - nibbles_ = Bytes.toNibbles(RLPReader.readBytes(_node.decoded[0])); - } - - /// @notice Utility; determines the number of nibbles shared between two nibble arrays. - /// @param _a First nibble array. - /// @param _b Second nibble array. - /// @return shared_ Number of shared nibbles. - function _getSharedNibbleLength( - bytes memory _a, - bytes memory _b - ) - private - pure - returns (uint256 shared_) - { - uint256 max = (_a.length < _b.length) ? _a.length : _b.length; - for (; shared_ < max && _a[shared_] == _b[shared_];) { - unchecked { - ++shared_; - } - } - } -} diff --git a/packages/protocol/contracts/thirdparty/optimism/trie/SecureMerkleTrie.sol b/packages/protocol/contracts/thirdparty/optimism/trie/SecureMerkleTrie.sol deleted file mode 100644 index 01808436903..00000000000 --- a/packages/protocol/contracts/thirdparty/optimism/trie/SecureMerkleTrie.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import { MerkleTrie } from "./MerkleTrie.sol"; - -/// @title SecureMerkleTrie -/// @notice SecureMerkleTrie is a thin wrapper around the MerkleTrie library that hashes the input -/// keys. Ethereum's state trie hashes input keys before storing them. -library SecureMerkleTrie { - /// @notice Verifies a proof that a given key/value pair is present in the Merkle trie. - /// @param _key Key of the node to search for, as a hex string. - /// @param _value Value of the node to search for, as a hex string. - /// @param _proof Merkle trie inclusion proof for the desired node. Unlike traditional Merkle - /// trees, this proof is executed top-down and consists of a list of RLP-encoded - /// nodes that make a path down to the target node. - /// @param _root Known root of the Merkle trie. Used to verify that the included proof is - /// correctly constructed. - /// @return valid_ Whether or not the proof is valid. - function verifyInclusionProof( - bytes memory _key, - bytes memory _value, - bytes[] memory _proof, - bytes32 _root - ) - internal - pure - returns (bool valid_) - { - bytes memory key = _getSecureKey(_key); - valid_ = MerkleTrie.verifyInclusionProof(key, _value, _proof, _root); - } - - /// @notice Retrieves the value associated with a given key. - /// @param _key Key to search for, as hex bytes. - /// @param _proof Merkle trie inclusion proof for the key. - /// @param _root Known root of the Merkle trie. - /// @return value_ Value of the key if it exists. - function get( - bytes memory _key, - bytes[] memory _proof, - bytes32 _root - ) - internal - pure - returns (bytes memory value_) - { - bytes memory key = _getSecureKey(_key); - value_ = MerkleTrie.get(key, _proof, _root); - } - - /// @notice Computes the hashed version of the input key. - /// @param _key Key to hash. - /// @return hash_ Hashed version of the key. - function _getSecureKey(bytes memory _key) private pure returns (bytes memory hash_) { - hash_ = abi.encodePacked(keccak256(_key)); - } -} diff --git a/packages/protocol/contracts/thirdparty/risczero/IRiscZeroReceiptVerifier.sol b/packages/protocol/contracts/thirdparty/risczero/IRiscZeroReceiptVerifier.sol deleted file mode 100644 index 841b1c99423..00000000000 --- a/packages/protocol/contracts/thirdparty/risczero/IRiscZeroReceiptVerifier.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @notice Verifier interface for RISC Zero receipts of execution. -/// https://github.com/risc0/risc0-ethereum/blob/release-0.7/contracts/src/IRiscZeroVerifier.sol -interface IRiscZeroReceiptVerifier { - /// @notice Verify that the given seal is a valid RISC Zero proof of execution with the - /// given image ID, post-state digest, and journal digest. - /// @dev This method additionally ensures that the input hash is all-zeros (i.e. no - /// committed input), the exit code is (Halted, 0), and there are no assumptions (i.e. the - /// receipt is unconditional). - /// @param seal The encoded cryptographic proof (i.e. SNARK). - /// @param imageId The identifier for the guest program. - /// @param postStateDigest A hash of the final memory state. Required to run the verifier, but - /// otherwise can be left unconstrained for most use cases. - /// @param journalDigest The SHA-256 digest of the journal bytes. - /// @return true if the receipt passes the verification checks. The return code must be checked. - function verify( - bytes calldata seal, - bytes32 imageId, - bytes32 postStateDigest, - bytes32 journalDigest - ) - external - view - returns (bool); -} diff --git a/packages/protocol/contracts/thirdparty/solmate/LibFixedPointMath.sol b/packages/protocol/contracts/thirdparty/solmate/LibFixedPointMath.sol deleted file mode 100644 index 2ad599363c2..00000000000 --- a/packages/protocol/contracts/thirdparty/solmate/LibFixedPointMath.sol +++ /dev/null @@ -1,82 +0,0 @@ -// SPDX-License-Identifier: MIT -// Taken from the contract below, expWad() function tailored to Taiko's need -// https://github.com/transmissions11/solmate/blob/v7/src/utils/FixedPointMathLib.sol -pragma solidity 0.8.24; - -library LibFixedPointMath { - uint128 public constant MAX_EXP_INPUT = 135_305_999_368_893_231_588; - uint256 public constant SCALING_FACTOR = 1e18; // For fixed point representation factor - - error Overflow(); - - // Computes e^x in 1e18 fixed point. - function exp(int256 x) internal pure returns (int256 r) { - unchecked { - // Input x is in fixed point format, with scale factor 1/1e18. - - // When the result is < 0.5 we return zero. This happens when - // x <= floor(log(0.5e18) * 1e18) ~ -42e18 - if (x <= -42_139_678_854_452_767_551) { - return 0; - } - - // When the result is > (2**255 - 1) / 1e18 we can not represent it - // as an int256. This happens when x >= floor(log((2**255 -1) / - // 1e18) * 1e18) ~ 135. - if (x >= 135_305_999_368_893_231_589) revert Overflow(); - - // x is now in the range (-42, 136) * 1e18. Convert to (-42, 136) * - // 2**96 - // for more intermediate precision and a binary basis. This base - // conversion - // is a multiplication by 1e18 / 2**96 = 5**18 / 2**78. - x = (x << 78) / 5 ** 18; - - // Reduce range of x to (-½ ln 2, ½ ln 2) * 2**96 by factoring out - // powers of two - // such that exp(x) = exp(x') * 2**k, where k is an integer. - // Solving this gives k = round(x / log(2)) and x' = x - k * log(2). - int256 k = ((x << 96) / 54_916_777_467_707_473_351_141_471_128 + 2 ** 95) >> 96; - x = x - k * 54_916_777_467_707_473_351_141_471_128; - // k is in the range [-61, 195]. - - // Evaluate using a (6, 7)-term rational approximation. - // p is made monic, we'll multiply by a scale factor later. - int256 y = x + 1_346_386_616_545_796_478_920_950_773_328; - y = ((y * x) >> 96) + 57_155_421_227_552_351_082_224_309_758_442; - int256 p = y + x - 94_201_549_194_550_492_254_356_042_504_812; - p = ((p * y) >> 96) + 28_719_021_644_029_726_153_956_944_680_412_240; - p = p * x + (4_385_272_521_454_847_904_659_076_985_693_276 << 96); - - // We leave p in 2**192 basis so we don't need to scale it back up - // for the division. - int256 q = x - 2_855_989_394_907_223_263_936_484_059_900; - q = ((q * x) >> 96) + 50_020_603_652_535_783_019_961_831_881_945; - q = ((q * x) >> 96) - 533_845_033_583_426_703_283_633_433_725_380; - q = ((q * x) >> 96) + 3_604_857_256_930_695_427_073_651_918_091_429; - q = ((q * x) >> 96) - 14_423_608_567_350_463_180_887_372_962_807_573; - q = ((q * x) >> 96) + 26_449_188_498_355_588_339_934_803_723_976_023; - assembly { - // Div in assembly because solidity adds a zero check despite - // the `unchecked`. - // The q polynomial is known not to have zeros in the domain. - // (All roots are complex) - // No scaling required because p is already 2**96 too large. - r := sdiv(p, q) - } - // r should be in the range (0.09, 0.25) * 2**96. - - // We now need to multiply r by - // * the scale factor s = ~6.031367120..., - // * the 2**k factor from the range reduction, and - // * the 1e18 / 2**96 factor for base conversion. - // We do all of this at once, with an intermediate result in 2**213 - // basis - // so the final right shift is always by a positive amount. - r = int256( - (uint256(r) * 3_822_833_074_963_236_453_042_738_258_902_158_003_155_416_615_667) - >> uint256(195 - k) - ); - } - } -} diff --git a/packages/protocol/contracts/verifiers/RiscZeroVerifier.sol b/packages/protocol/contracts/verifiers/RiscZeroVerifier.sol deleted file mode 100644 index 5e299802122..00000000000 --- a/packages/protocol/contracts/verifiers/RiscZeroVerifier.sol +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../common/EssentialContract.sol"; -import "../common/LibStrings.sol"; -import "../thirdparty/risczero/IRiscZeroReceiptVerifier.sol"; -import "../L1/ITaikoL1.sol"; -import "./IVerifier.sol"; -import "./libs/LibPublicInput.sol"; - -/// @title RiscZeroVerifier -/// @custom:security-contact security@taiko.xyz -contract RiscZeroVerifier is EssentialContract, IVerifier { - /// @notice RISC Zero remote verifier contract address, e.g.: - /// https://sepolia.etherscan.io/address/0x83c2e9cd64b2a16d3908e94c7654f3864212e2f8 - IRiscZeroReceiptVerifier public receiptVerifier; - /// @notice Trusted imageId mapping - mapping(bytes32 imageId => bool trusted) public isImageTrusted; - - uint256[48] private __gap; - - /// @dev Emitted when a trusted image is set / unset. - /// @param imageId The id of the image - /// @param trusted True if trusted, false otherwise - event ImageTrusted(bytes32 imageId, bool trusted); - - error RISC_ZERO_INVALID_IMAGE_ID(); - error RISC_ZERO_INVALID_PROOF(); - - /// @notice Initializes the contract with the provided address manager. - /// @param _owner The address of the owner. - /// @param _addressManager The address of the AddressManager. - /// @param _receiptVerifier The address of the risc zero receipt verifier contract. - function init( - address _owner, - address _addressManager, - address _receiptVerifier - ) - external - initializer - { - __Essential_init(_owner, _addressManager); - receiptVerifier = IRiscZeroReceiptVerifier(_receiptVerifier); - } - - /// @notice Sets/unsets an the imageId as trusted entity - /// @param _imageId The id of the image. - /// @param _trusted True if trusted, false otherwise. - function setImageIdTrusted(bytes32 _imageId, bool _trusted) external onlyOwner { - isImageTrusted[_imageId] = _trusted; - - emit ImageTrusted(_imageId, _trusted); - } - - /// @inheritdoc IVerifier - function verifyProof( - Context calldata _ctx, - TaikoData.Transition calldata _tran, - TaikoData.TierProof calldata _proof - ) - external - view - { - // Do not run proof verification to contest an existing proof - if (_ctx.isContesting) return; - - // Decode will throw if not proper length/encoding - (bytes memory seal, bytes32 imageId, bytes32 postStateDigest) = - abi.decode(_proof.data, (bytes, bytes32, bytes32)); - - if (!isImageTrusted[imageId]) { - revert RISC_ZERO_INVALID_IMAGE_ID(); - } - - uint64 chainId = ITaikoL1(resolve(LibStrings.B_TAIKO, false)).getConfig().chainId; - bytes32 hash = LibPublicInput.hashPublicInputs( - _tran, address(this), address(0), _ctx.prover, _ctx.metaHash, chainId - ); - - // journalDigest is the sha256 hash of the hashed public input - bytes32 journalDigest = sha256(bytes.concat(hash)); - - if (!receiptVerifier.verify(seal, imageId, postStateDigest, journalDigest)) { - revert RISC_ZERO_INVALID_PROOF(); - } - } -} diff --git a/packages/protocol/deployments/hekla-contract-logs.md b/packages/protocol/deployments/hekla-contract-logs.md index 4ec92a0750b..70c11e98d8e 100644 --- a/packages/protocol/deployments/hekla-contract-logs.md +++ b/packages/protocol/deployments/hekla-contract-logs.md @@ -9,64 +9,84 @@ ### shared_address_manager - proxy: `0x7D3338FD5e654CAC5B10028088624CA1D64e74f7` -- impl: `0x1B71F7014DB583Dc354d97608FAFe81e1a611c03` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0xAcA2a9f774e540CF592c07bBaAC9Ebae40e7C175` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### taiko_token - proxy: `0x6490E12d480549D333499236fF2Ba6676C296011` -- impl: `0x087f33bf5141033bbf7a2acef5d8fadce9204eca` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0xD826bb700EAEdD6E83C32681f95a35Ac7F290104` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - deployed on Mar 29, 2024 at commit `b341a68d5` + - upgraded on Jun 18, 2024, added `batchTransfer` method. + - transferred ownership on Jul 8, 2024 + - upgraded on Dec 16, 2024 at commit `ccc9500` ### signal_service - proxy: `0x6Fc2fe9D9dd0251ec5E0727e826Afbb0Db2CBe0D` -- impl: `0x7c20d41c2573A1225B361A3B2F667fe1F021A83B` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0xE6371B30e500ff38ec809a652fdFE98174011B2D` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 ### bridge - proxy: `0xA098b76a3Dd499D3F6D58D8AcCaFC8efBFd06807` -- impl: `0x74baa4826B22F7746EfEeCEc178FFbb77A2567C3` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0xE3d424D6D752dBcc6e19Dfd6755D518118f3d93b` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### erc20_vault - proxy: `0x2259662ed5dE0E09943Abe701bc5f5a108eABBAa` -- impl: `0xbE1101ED567020581127Ad065461c69c2C3A6115` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x1bf437b2f6e5959fe167210Ee2221ADa09a66846` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 ### erc721_vault - proxy: `0x046b82D9010b534c716742BE98ac3FEf3f2EC99f` -- impl: `0xBEBD9B63dED7eC68F00f98495b60FC5eEE7f154E` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x06467bab46598b887240044309A6ffE261A0E2e3` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 ### erc1155_vault - proxy: `0x9Ae5945Ab34f6182F75E16B73e037421F341fEe3` -- impl: `0xE1A60fD257De1A304a5b5d1EfDa38aFe52c0f910` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0xBFCff65554d6e89A1aC280eE1E9f87764124B833` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 ### bridged_erc20 -- impl: `0x2E062eA9f7f2D777eb67a32710BFDcE42c655B18` +- impl: `0xe3661857941E4A711fa6b4Fc080bC5c5948a70f1` - logs: - deployed on May 10, 2024 at commit `4903bec` + - deployed on Jul 25, 2024 at commit `3d89d24` ### bridged_erc721 @@ -83,128 +103,251 @@ ### rollup_address_manager - proxy: `0x1F027871F286Cf4B7F898B21298E7B3e090a8403` -- impl: `0xDd39Ad18E6B8A2696394C310D5F95700dB643D27` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x97Ece9dC33e8442ED6e61aA378bf3FdC7dF17213` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `13ad99d` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### taikoL1 - proxy: `0x79C9109b764609df928d16fC4a91e9081F7e87DB` -- impl: `0x168FEe80cD2Cc496b504A0844aBB4eA9ec32f787` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x833958CF23DAA9F19Ab418BCA114C2842819284A` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at [PR #17532](https://github.com/taikoxyz/taiko-mono/pull/17532) + - upgraded on Jun 12, 2024 at commit `07b073d` + - upgraded on Jun 12, 2024 at [PR #17553](https://github.com/taikoxyz/taiko-mono/pull/17553) + - upgraded on Jun 14, 2024 at [PR #17553](https://github.com/taikoxyz/taiko-mono/pull/17553) @commit `baed5b5` + - upgraded on Jun 19, 2024 at commit `b7e12e3` + - upgraded on Jun 20, 2024 at commit `6e07ab5` + - transferred ownership on Jul 8, 2024 + - upgraded on Jul 11, 2024 at [PR #17779](https://github.com/taikoxyz/taiko-mono/pull/17779) + - upgraded on Jul 15, 2024 at commit `45281b8` + - upgraded on Aug 15, 2024 at `protocol-v1.8.0` with [#17919](https://github.com/taikoxyz/taiko-mono/pull/17919) + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 16, 2024 at commit `233806e` + - upgraded on Oct 29, 2024 at commit `3d12cb2` + - upgraded on Nov 3, 2024 at commit `ea0158f` ### assignmentHook - proxy: `0x9e640a6aadf4f664CF467B795c31332f44AcBe6c` -- impl: `0xA35ed4FAD13C038C05aC4c8FD3353B3d90d15ea5` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0xfcb5B945dbd08AfdB08e6C358193B23b0E6eFa23` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 12, 2024 at commit `04bb81e` + - transferred ownership on Jul 8, 2024 ### tierProvider -- impl: `0x750D885DCAB712bA808D66D934CF315D0D98d04c.` +- impl: `0x9AaBba3Ae6D4aC3F5487608Da81006454e7933d3` - logs: - upgraded on May 14, 2024 at commit `0ef7b8caa` + - upgraded on Jun 14, 2024 at commit `cc10b04` + - upgraded on Jun 19, 2024 at commit `b7e12e3` + - upgraded on Aug 15, 2024 at commit `05d49b0` -### guardian_prover_minority +### tierRouter -- proxy: `` -- impl: `` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x6A666F2C56a6559dB0BD8866Bd0c0dDB9ec03c66` - logs: - - upgraded on May 10, 2024 at commit `4903bec` + - deployed on Jun 10, 2024 at commit `d5965bb` + - upgraded on Jun 14, 2024 at commit `cc10b04` + - upgraded on Jun 19, 2024 at commit `b7e12e3` + - upgraded on Aug 15, 2024 at commit `05d49b0` + - upgraded on Sep 02, 2024 at commit `9dae5c8` + - upgraded on Oct 24, 2024 at commit `78f9ac0` + - upgraded on Oct 30, 2024 at commit `63455f9` + - upgraded on Nov 4, 2024 at commit `90b2693` + - upgraded on Nov 4, 2024 at commit `8e00612` + +### prover_set + +- proxy: `0xD3f681bD6B49887A48cC9C9953720903967E9DC0` +- impl: `0x7840556da7E6E74C01a8334a9e6a6d3F4Ae094A0.` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- logs: + - deployed on Jun 17, 2024 at commit `b7e12e3` + - upgraded on Jul 11, 2024 at commit `30631a9` + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` + +### prover_set_contester + +- proxy: `0x335103c4fa2F55451975082136F1478eCFeB84B9` +- impl: `0x93Df4e369fb916ccc78e94e85017d18e367ba9B5.` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- logs: + - deployed on Jun 21, 2024 at commit `099ce22` + - upgraded on Jul 11, 2024 at commit `30631a9` + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### guardian_prover - proxy: `0x92F195a8702da2104aE8E3E10779176E7C35d6BC` -- impl: `0x3D351Ab46F79805e579E24E5cD94362758a99eb5` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x426A2DA100727d8f3e89252Ba125acbd0e048aDe` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### guardian_minority - proxy: `0x31d4d27da5c299d4b6CE19c869B8891C0002795d` -- impl: `0x22DC7e70B810822EB8DdDDb341021c252f480f2D` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x8ACaB96A6e8bf611E21A6eA332C6509c8d0b699f` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - deployed on May 20, 2024 at commit `6e56475` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` + +### tier_sgx + +- proxy : 0x532EFBf6D62720D0B2a2Bb9d11066E8588cAE6D9 +- impl : 0x3c1b6b0F179dab0dE5e11C9B2a531C5c693Fd70C +- owner : 0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190 +- logs: + - upgraded on Nov 6, 2024 at commit `0706f0a` + +### risc0_groth16_verifier + +- addr : 0x5fd84014c62D5ea28D4533D5B1B48Ca44e571057 +- logs: + - deployed on August 14, 2024 at commit `cba2a1e` + - upgraded on October 22, 2024 at commit `684a909` + +### tier_zkvm_risc0 + +- proxy : 0x4fEd801C5a876D4289e869cbEfA1E1A448b10714 +- impl : 0xAF9F3B3f9276f24e4143e6247795cf71985C4890 +- owner : 0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190 +- logs: + - deployed on August 14, 2024 at commit `cba2a1e` + - upgraded on Nov 6, 2024 at commit `0706f0a` + +### sp1_plonk_verifier + +- addr : 0xfb2d02219D065eBF3Aa8d2D1a1C52b1868EE7384 +- logs: + - deployed on September 02, 2024 at commit `16ac02e` + - upgraded on September 15, 2024 at commit `6f26434` + - upgraded on October 22, 2024 at commit `684a909` + - upgraded on Nov 8, 2024 at commit `0b11101` + +### tier_zkvm_sp1 + +- proxy : 0xFbE49f777E0078b3Fa0bae6de4794c88d6EA6DDD +- impl : 0xB83b7f7fA8f4e6332769D123b8C973F485aC4bBc. +- owner : 0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190 +- logs: + - deployed on September 02, 2024 at commit `16ac02e` + - upgraded on September 15, 2024 at commit `6f26434` + - upgraded on Nov 6, 2024 at commit `0706f0a` ## L2 Contracts ### bridge - proxy: `0x1670090000000000000000000000000000000001` -- impl: `0x8CC29961a0329D033C6A5fF5Ab915cceB53aEDce` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x50216f60163ef399E22026fa1300aEa8eebA3462` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### erc20_vault - proxy: `0x1670090000000000000000000000000000000002` -- impl: `0xFefDE79d88264E26fb1fea40f83b8C549d09075E` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x4A5AE0837cfb6C40c7DaF0885ac6c35e2EE644f1` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Aug 26, 2024 at commit `4e08881` ### erc721_vault - proxy: `0x1670090000000000000000000000000000000003` -- impl: `0x598Ee9B7EdbB2A838156823Ae28E2Ca98c0b5BB7` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x2DdAad1110F2F69238Eb834851437fc05DAb62b9` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Aug 26, 2024 at commit `4e08881` ### erc1155_vault - proxy: `0x1670090000000000000000000000000000000004` -- impl: `0x63Ff7f4Fac6275a598DF5d86cC5e1278Db2D7346` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x58366150b4E1B18dd0D3F043Ba45a9BECb53cd85` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Aug 26, 2024 at commit `4e08881` ### signal_service - proxy: `0x1670090000000000000000000000000000000005` -- impl: `0x6EFDeff4E88a24063aAaeF6f50470E3305eCf1Ce` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x4c70b7F5E153D497faFa0476575903F9299ed811` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` ### shared_address_manager - proxy: `0x1670090000000000000000000000000000000006` -- impl: `0x38969CEc9C1524D81264dE493b18988920C1f74b` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x1063F4cF9eaAA67B5dc9750d96eC0BD885D10AeE` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### taikoL2 - proxy: `0x1670090000000000000000000000000000010001` -- impl: `0x5b927DF807f84D6A993BD04f6EC0C17f7fa4cEFb` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x637B1e6E71007d033B5d4385179037C90665A203` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### rollup_address_manager - proxy: `0x1670090000000000000000000000000000010002` -- impl: `0xF74340b7E8816FA0351be5AF5fDF91b28495B99A` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x1063F4cF9eaAA67B5dc9750d96eC0BD885D10AeE` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### bridged_erc20 -- impl: `0x62Acda3Ad15B382C32B2fB21BEAc9DfB95bbb02F` +- impl: `0x1BAF1AB3686Ace2fD47E11Ac627F3Cc626aEc0FF` - logs: - deployed on May 10, 2024 at commit `4903bec` + - deployed on Jul 25, 2024 at commit `3d89d24` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### bridged_erc721 @@ -218,6 +361,11 @@ - logs: - deployed on May 10, 2024 at commit `4903bec` -## Other EOAs/Contracts +### delegate_owner -- Holesky `TimelockController`:`0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- proxy: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` +- impl: `0x36dD2d50C08Ee22553ef34583B367D86c3D44fBd` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` +- admin: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- logs: + - deployed on Aug 15, 2024 at commit `46a3e00` diff --git a/packages/protocol/deployments/mainnet-contract-logs-L1.md b/packages/protocol/deployments/mainnet-contract-logs-L1.md index 9054985c57e..89b083c9496 100644 --- a/packages/protocol/deployments/mainnet-contract-logs-L1.md +++ b/packages/protocol/deployments/mainnet-contract-logs-L1.md @@ -10,7 +10,7 @@ - ens: `sam.based.taiko.eth` - proxy: `0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa` -- impl: `0x9496502d7D121B3D5eF25cA6c58d4f7593398a17` +- impl: `0xEC1a9aa1C648F047752fe4eeDb2C21ceab0c6449` - owner: `admin.taiko.eth` - names: - taiko_token: `0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800` @@ -24,7 +24,7 @@ - erc721_vault@167000: `0x1670000000000000000000000000000000000003` - erc1155_vault: `0xaf145913EA4a56BE22E120ED9C24589659881702` - erc1155_vault@167000: `0x1670000000000000000000000000000000000004` - - bridged_erc20: `0x79BC0Aada00fcF6E7AB514Bfeb093b5Fae3653e3` + - bridged_erc20: `0x65666141a541423606365123Ed280AB16a09A2e1` - bridged_erc721: `0xC3310905E2BC9Cfb198695B75EF3e5B69C6A1Bf7` - bridged_erc1155: `0x3c90963cFBa436400B0F9C46Aa9224cB379c2c40` - quota_manager: `0x91f67118DD47d502B1f0C354D0611997B022f29E` @@ -35,39 +35,45 @@ - Upgraded from `0x9cA1Ab10c9fAc5153F8b78E67f03aAa69C9c6A15` to `0xF1cA1F1A068468E1dcF90dA6add185467de80943` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - `Init2()` called @tx`0x7311fee56f87294e336393b55939489bc1e810c402f304013475d04c90ca32a9` - Upgraded from `0xF1cA1F1A068468E1dcF90dA6add185467de80943` to `0x9496502d7D121B3D5eF25cA6c58d4f7593398a17` @commit`e79a367ad` @tx`0xe1ef58455de0b0331228e487d54720290ed8a73f709d2146bd43330d4a360bd3` + - Upgraded from `0x9496502d7D121B3D5eF25cA6c58d4f7593398a17` to `0x2f7126f78365AD54EAB26fD7faEc60435008E2fD` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - register `bridged_erc20` to `0x65666141a541423606365123Ed280AB16a09A2e1` @tx`0x0ad38201728e782a04d74c5984efedba4c2c0669c9ce791db2b010efe4f15b1d` + - Upgraded from `0x2f7126f78365AD54EAB26fD7faEc60435008E2fD` to `0xEC1a9aa1C648F047752fe4eeDb2C21ceab0c6449` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### taiko_token - ens: `token.taiko.eth` - proxy: `0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800` -- impl: `0xea53c0f4b129Cf3f3FBA896F9f23ca18246e9B3c` +- impl: `0xcfe803378D79d1180EbF030455040EA6513869dF` - owner: `admin.taiko.eth` - logs: - deployed on April 25, 2024 @commit`2f6d3c62e` - upgraded impl from `0x9ae1a067f9655dd0511390e3d70bb25933ae61eb` to `0xea53c0f4b129Cf3f3FBA896F9f23ca18246e9B3c` @commit`b90b932` and, - Changed owner from `labs.taiko.eth` to `admin.taiko.eth` @tx`0x7d82794932540ed9edd259e58f6ef8ae21a49beada7f0224638f888f7149c01c` - Accept owner @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` + - upgraded impl from `0xea53c0f4b129Cf3f3FBA896F9f23ca18246e9B3c` to `0x55833dA2962c2330ccCF043ff8037e6D2939bCF6` @commit`2b483de` @tx`0x0bbf7d1258c646f41a02a92a55825b1ebfd3659577d0f2b57b462f8895e23a04` + - upgraded impl from `0x55833dA2962c2330ccCF043ff8037e6D2939bCF6` to `0xcfe803378D79d1180EbF030455040EA6513869dF` @commit`d2b00ce` @tx`0xc9f468d33d8d55911e4e5b5c301ed244a5f81ab0f389d2b4f398eb5b89d417ef` #### signal_service - ens: `signals.based.taiko.eth` - proxy: `0x9e0a24964e5397B566c1ed39258e21aB5E35C77C` -- impl: `0x3d59c18b31A7D950EF9bd15eD285b6c182E0f0bb` +- impl: `0x45fed11Ba70D4217545F18E27DDAF7D76Ff499f3` - owner: `admin.taiko.eth` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - admin.taiko.eth accepted the ownership @tx`0x0ed114fee6de4e3e2206cea44e6632ec0c4588f73648d98d8df5dc0183b07885` - upgraded from `0xE1d91bAE44B70bD66e8b688B8421fD62dcC33c72` to `0xB11Cd7bA46a12F238b4Ad831f6F296262C1e652d` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - - upgraded from `0xB11Cd7bA46a12F238b4Ad831f6F296262C1e652d` to `0x3d59c18b31A7D950EF9bd15eD285b6c182E0f0bb` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - upgraded from `0xB11Cd7bA46a12F238b4Ad831f6F296262C1e652d` to `0x3d59c18b31A7D950EF9bd15eD285b6c182E0f0bb` @commit`a3faee0` @tx`0x13f54109cb7f7507ad03562b06ea8d8b472043186e44252302583bc64acfb20b` + - restored from `0x3d59c18b31A7D950EF9bd15eD285b6c182E0f0bb` to `0xB11Cd7bA46a12F238b4Ad831f6F296262C1e652d` @commit`b90b932` @tx`0xdb5e926c96d112ce1389da77a927fba6c7d04a711839b9e14777530ebcf83914` + - upgraded from `0xB11Cd7bA46a12F238b4Ad831f6F296262C1e652d` to `0xDF8642a1FBFc2014de27E8E87283D6f3eEF315DF` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - Upgraded from `0xDF8642a1FBFc2014de27E8E87283D6f3eEF315DF` to `0x45fed11Ba70D4217545F18E27DDAF7D76Ff499f3` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### bridge - ens: `bridge.based.taiko.eth` - proxy: `0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC` -- impl: `0x3c326483EBFabCf3252205f26dF632FE83d11108` +- impl: `0x2705B12a971dA766A3f9321a743d61ceAD67dA2F` - owner: `admin.taiko.eth` -- todo: - - upgrade the contract - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - admin.taiko.eth accepted the ownership @tx`0x0ed114fee6de4e3e2206cea44e6632ec0c4588f73648d98d8df5dc0183b07885` @@ -79,6 +85,10 @@ - upgraded from `0x02F21B4C3d4dbfF70cE851741175a727c8D782Be` to `0x71c2f41AEDe913AAEf2c62596E03702E348D6Cd0.` @commit`` in @tx`0x8a380a25d03a740d9535dfc3e2fc4f6960e22d49ad88b8d85f59af4013aedf87` - upgrade impl to `0x951B7Ae1bB26d12dB37f01748e8fB62FEf45A8B5` @commit`1bd3285` @tx`0xf21f6bf720767db3bc9b63ef69cacb20340bdedfb6589e6a4d11fe082dfa7bd6` - upgrade impl to `0x3c326483EBFabCf3252205f26dF632FE83d11108` @commit`3ae25fd` @tx`0xc0ba6558642b93ee892bee0705dbcfb5130c53637e6266bfa5e3a6501167d6f2` + - upgrade impl to `0xD28f2c26aD8bA88b0691F6BB41Ff021878052561` @commit`2b483de` @tx`0x0bbf7d1258c646f41a02a92a55825b1ebfd3659577d0f2b57b462f8895e23a04` + - upgrade impl to `0x01E7D369a619eF1B0E92563d8737F42C09789986` @commit`04d8c87` @tx`0x13f54109cb7f7507ad03562b06ea8d8b472043186e44252302583bc64acfb20b` + - Upgrade impl to `0xAc96FF285158bceBB8573D20d853e86BB2915aF3` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - Upgrade impl to `0x2705B12a971dA766A3f9321a743d61ceAD67dA2F` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### quota_manager @@ -87,9 +97,9 @@ - owner: `admin.taiko.eth` - quota: - Quota Period: 24 hours - - ETH: `64516129032258064516` 1000 ETH + - ETH: 1000 ETH - WETH(`0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`): 1000 ETH - - TKO(`0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800`): 2,000,000 + - TAIKO(`0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800`): 2,000,000 - USDT(`0xdAC17F958D2ee523a2206206994597C13D831ec7`): 4,000,000 - USDC(`0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`): 4,000,000 - logs: @@ -101,50 +111,61 @@ - ens: `v20.based.taiko.eth` - proxy: `0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab` -- impl: `0x4F750D13005444407D44dAA30922128db0374ca1` +- impl: `0xb20C8Ffc2dD49596508d262b6E8B6817e9790E63` - owner: `admin.taiko.eth` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - upgraded from `0x15D9F7e12aEa18DAEF5c651fBf97567CAd4a4BEc` to `0xC722d9f3f8D60288589F7f67a9CFAd34d3B9bf8E` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - upgraded from `0xC722d9f3f8D60288589F7f67a9CFAd34d3B9bf8E` to `0x4F750D13005444407D44dAA30922128db0374ca1` @commit`fa481c1` @tx`0x02ed558762eae5f0a930ba4a1047a02d4a793ea48890268c32df04e882f138ff` + - upgraded from `0x4F750D13005444407D44dAA30922128db0374ca1` to `0xF8bdaC4E68bA2595Be8381aaa5456917e374E737` @commit`d907359` @tx`0xdb5e926c96d112ce1389da77a927fba6c7d04a711839b9e14777530ebcf83914` + - upgraded from `0xF8bdaC4E68bA2595Be8381aaa5456917e374E737` to `0xa303784B0557BF1F1FB8b8abEF2B18a005722689` @commit`04d8c87` @tx`0x13f54109cb7f7507ad03562b06ea8d8b472043186e44252302583bc64acfb20b` + - upgraded from `0xa303784B0557BF1F1FB8b8abEF2B18a005722689` to `0x7ACFBb369a552C45d402448A4d64b9da54C3FF30` @commit`bb2abc5` @tx`0xee632b50626beb2f7db84c9c7f303f29366f86dfaccd24ddd831ceac714c20e5` + - upgraded from `0x7ACFBb369a552C45d402448A4d64b9da54C3FF30` to `0xb20C8Ffc2dD49596508d262b6E8B6817e9790E63` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### erc721_vault - ens: `v721.based.taiko.eth` - proxy: `0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa` -- impl: `0x2dfef0339009Ce10786fc118C883BB97af3163eD` +- impl: `0xA4C5c20aB33C96B1c281Dca37D03E23609274C49` - owner: `admin.taiko.eth` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - upgraded from `0xEC04849E7722Fd69797a155796Db75aC8F94f692` to `0x41A7BDD153a5AfFb10Ed1AD3D6a4e5ad001495FA` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - upgraded from `0x41A7BDD153a5AfFb10Ed1AD3D6a4e5ad001495FA` to `0x2dfef0339009Ce10786fc118C883BB97af3163eD` @commit`fa481c1` @tx`0x02ed558762eae5f0a930ba4a1047a02d4a793ea48890268c32df04e882f138ff` + - upgraded from `0x2dfef0339009Ce10786fc118C883BB97af3163eD` to `0x55B5df6B53466446221180498BfD1C59e54732c4` @commit`d907359` @tx`0xdb5e926c96d112ce1389da77a927fba6c7d04a711839b9e14777530ebcf83914` + - upgraded from `0x55B5df6B53466446221180498BfD1C59e54732c4` to `0xD961e3Ef2D7DF58cDc67BFd9055255430E5e3fEc` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - upgraded from `0xD961e3Ef2D7DF58cDc67BFd9055255430E5e3fEc` to `0xA4C5c20aB33C96B1c281Dca37D03E23609274C49` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### erc1155_vault - ens: `v1155.based.taiko.eth` - proxy: `0xaf145913EA4a56BE22E120ED9C24589659881702` -- impl: `0x097BBBef669AaD66030aB223195D200eF9A47dc3` +- impl: `0x838ed469db456b67EB3b0B74D759Be4DA999b9c8` - owner: `admin.taiko.eth` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - upgraded from `0x7748dA086A2e6EDd8Db97eD236840910013c6396` to `0xd90b5fcf8d00d333d107E4Ab7F94c0c0A41CDcfE` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - upgraded from `0xd90b5fcf8d00d333d107E4Ab7F94c0c0A41CDcfE` to `0x097BBBef669AaD66030aB223195D200eF9A47dc3` @commit`fa481c1` @tx`0x02ed558762eae5f0a930ba4a1047a02d4a793ea48890268c32df04e882f138ff` + - upgraded from `0x097BBBef669AaD66030aB223195D200eF9A47dc3` to `0xca92880829139b310B6b0CB41f66D566Db1a59C8` @commit`d907359` @tx`0xdb5e926c96d112ce1389da77a927fba6c7d04a711839b9e14777530ebcf83914` + - upgraded from `0xca92880829139b310B6b0CB41f66D566Db1a59C8` to `0x89C68Bc7028f8b1e69A91382b0a4b1825085617b` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - upgraded from `0x89C68Bc7028f8b1e69A91382b0a4b1825085617b` to `0x838ed469db456b67EB3b0B74D759Be4DA999b9c8` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### bridged_erc20 -- impl: `0xcc5d488073FA918cBbd73B9A523F3858C4de7372` +- impl: `0x65666141a541423606365123Ed280AB16a09A2e1` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` + - deployed on Jul 25, 2024 @commit`ba6bf94` #### bridged_erc721 -- impl: `0xc4096E9ff1526Bd1840B65e9f45695135aC12De7` +- impl: `0xC3310905E2BC9Cfb198695B75EF3e5B69C6A1Bf7` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` #### bridged_erc1155 -- impl: `0x39E4C1214e733639d059979079A151911e42791d` +- impl: `0x3c90963cFBa436400B0F9C46Aa9224cB379c2c40` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` @@ -154,20 +175,23 @@ - ens: `ram.based.taiko.eth` - proxy: `0x579f40D0BE111b823962043702cabe6Aaa290780` -- impl: `0x8EEf314878A7E56314E8DF285d0B0D649C903aF6` +- impl: `0x0079a79E5d8DDA67029051d505E5A11DE279B36D` - names: + - bond_token: `0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800` - taiko_token: `0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800` - signal_service: `0x9e0a24964e5397B566c1ed39258e21aB5E35C77C` - bridge: `0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC` - taiko: `0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a` - - tier_router: `0xa8e5D3a2E2052bea7f10bE6a0386454b721d1f9F` + - tier_router: `0x8a4c692F12d3a9750E744A4CE24a1d351bE52E66` - tier_sgx: `0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81` + - risc0_groth16_verifier: `0xcF706D99C265fC2349AE43c5f6BFD7931FE5308D` + - tier_zkvm_risc0: `0x55902b2D3DF2A65370A89C86Ae9dd71Ecd508edc` + - sp1_remote_verifier: `0x2D33d748644dAb8B3FB0E07642d9dE96b816d067` + - tier_zkvm_sp1: `0x5c44f2239925b0d86d2BFEe539f19CD0A08Af452` - tier_guardian_minority: `0x579A8d63a2Db646284CBFE31FE5082c9989E985c` - tier_guardian: `0xE3D777143Ea25A6E031d1e921F396750885f43aC` - automata_dcap_attestation: `0x8d7C954960a36a7596d7eA4945dDf891967ca8A3` - - prover_set: `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` - - proposer_one: `0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045` vitalik.eth - - proposer: `0x000000633b68f5d8d3a86593ebb815b4663bcbe0` + - prover_set: `0xCE5a119479337a153CA3bd1b2bF9755c78F2B15A` - chain_watchdog: `0xE3D777143Ea25A6E031d1e921F396750885f43aC` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` @@ -182,12 +206,24 @@ - upgraded from `0x8Af4669E3068Bae96b92cD73603f5D86beD07a9a` to `0x8EEf314878A7E56314E8DF285d0B0D649C903aF6` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` - register `prover_set` to `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` @tx`0xb23d9cec24a1cc14956482d9d6a77eee0d6ab6ccd5b77e2be191fb8368c2d107` - unregister `assignment_hook` @tx`0xb23d9cec24a1cc14956482d9d6a77eee0d6ab6ccd5b77e2be191fb8368c2d107` + - register `prover_set` to `0x5D528253fA14cd7F637937de847BE8D5BE0Bf5fd` @commit`2b483de` @tx`0x0bbf7d1258c646f41a02a92a55825b1ebfd3659577d0f2b57b462f8895e23a04` + - register `tier_router` to `0x6e997f1f22c40ba37f633b08f3b07e10ed43155a` @tx`0x13f54109cb7f7507ad03562b06ea8d8b472043186e44252302583bc64acfb20b` + - Upgraded from `0x8EEf314878A7E56314E8DF285d0B0D649C903aF6` to `0x29a88d60246C76E4F28806b9C8a42d2183154900` @commit`57c8dc0` @tx`0x9f787086b4c5e6887eb1d27c286069bcbbcabb1d7ed9f69ab3121c4681cf4b2c` + - register `prover_set` to `0x518845daA8870bE2C59E49620Fc262AD48953C9a` @commit`67a7a37` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` + - register `prover_set` to `0x74828E5fe803072AF9Df512B3911B4223572D652` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - upgraded from `0x29a88d60246C76E4F28806b9C8a42d2183154900` to `0x4f6D5D3109C07E77035B410602996e445b18E8E9` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - register `prover_set` to `0xCE5a119479337a153CA3bd1b2bF9755c78F2B15A` @commit`be34059` @tx`0x170617251f2345eda4bcbd29e316caa0b014602a44244c60b963382ac7da7748` + - upgraded from `0x4f6D5D3109C07E77035B410602996e445b18E8E9` to `0x3202Fc255aE09F91DbbD5b000b87dA4A2E04eE37` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` + - upgraded from `0x3202Fc255aE09F91DbbD5b000b87dA4A2E04eE37` to `0x190D5d50D98D2202a618f75B2fD9986e60E096be` @commit`4fd7b59` @tx`0xf26d0526aa4b8225c603720ce0dc016803188b959c50677d5446087d1f2c4e60` + - upgraded from `0x190D5d50D98D2202a618f75B2fD9986e60E096be` to `0x6D8e6e1a061791AD17A55De5e15a111c58f6Fb3D` @commit`2625c60` @tx`0x5d46840df79d8df508880675e7ea549e9b46137f597ca520c3e0c979439441d1` + - upgraded from `0x6D8e6e1a061791AD17A55De5e15a111c58f6Fb3D` to `0x52CA3c5566d779b3c6bb5c4f760Ea39E294Fc788` @commit`9ae9a5e` @tx`0x43353a74df973d8f6a379b5c8815ac80935a5099f8ab93a4aa204eb5ef2c663e` + - upgraded from `0x52CA3c5566d779b3c6bb5c4f760Ea39E294Fc788` to `0x0079a79E5d8DDA67029051d505E5A11DE279B36D` @commit`06128e8` @tx`0xe66aba9f8bfcd86dc0ae32416862ca61a51c47f8ec747799e65f155ef27eeb20` #### taikoL1 - ens: `based.taiko.eth` - proxy: `0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a` -- impl: `0x4b2743B869b85d5F7D8020566f92664995E4f3c5` +- impl: `0xe7c4B445D3C7C8E4D68afb85A068F9fAa18e9A5B` - owner: `admin.taiko.eth` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` @@ -199,40 +235,62 @@ - Upgraded from `0xa200c2268d77737a8Fd2CA1698dA6eeab2a85CEb` to `0x3505a0700DB72dEc7AbFF1aF231BB5D87aBF2944` on May 28 @commit`b335b70` @tx`0xa603b6d55457e64e18ddae684bfd14948452cdd7b927dd22bf0b83045e8fd028` - Upgrade to `0xE84DC8E2a21e59426542Ab040D77f81d6dB881eE` @commit`3ae25fd` @tx`0x2c455ae888a23c232bb5c7603657eda010ffadc602a74e626332bc06eaaa3b78` - Upgrade to `0x4b2743B869b85d5F7D8020566f92664995E4f3c5` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - Upgrade to `0x0468745A07de44A9a3138adAc35875ecaf7a20D5` @commit`2b483de` @tx`0x0bbf7d1258c646f41a02a92a55825b1ebfd3659577d0f2b57b462f8895e23a04` + - Upgrade to `0xB9E1E58bcF33B79CcfF99c298963546a6c334388` @commit`d907359` @tx`0xdb5e926c96d112ce1389da77a927fba6c7d04a711839b9e14777530ebcf83914` + - Upgrade to `0x5fc54737ECC1de49D58AE1195d4A296257F1E31b` @commit`04d8c87` @tx`0x13f54109cb7f7507ad03562b06ea8d8b472043186e44252302583bc64acfb20b` + - Upgrade to `0xcEe590fACd976B9BDE87BC1B7620B284c5edD2C3` @commit`2dd30ab` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` + - Upgrade to `0xBA1d90BCfA74163bFE09e8eF609b346507D83231` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - Upgrade to `0xf0E6d34937701622cA887a75c150cC23d4FFDf2F` @commit`b4f8547` @tx`0x8778064404816273804d74c97b051f3865bc03062cfa4b0e9567f4556ad31981` + - Upgrade to `0x4229d14F520848aa83760Cf748abEB8A69cdaB2d` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` + - Upgrade to `0xA3E75eDA1Be2114816f388A5cF53EbA142DCDB17` @commit`ea0158f` @tx`0x78ca7c7d9c7e5aa9c5e6ab80e0229289a8d3bc8df2c2b9ba6baa74a0f60a0703` + - Upgrade to `0xe7c4B445D3C7C8E4D68afb85A068F9fAa18e9A5B` @commit`ea0158f` with new `RollupAddressManagerCache` @commit `9ae9a5e` @tx`0x5eb57ab352b3e3c1ddbc3fe468d582901b88c6a137ce49b0d70857d5218d626d` + - Upgrade to `0xb74A66b6CF50AD63E29669F0BDE4354E11758162` @commit`06128e8` @tx`0xe66aba9f8bfcd86dc0ae32416862ca61a51c47f8ec747799e65f155ef27eeb20` + - Upgrade to `0xd4896d4537c6425aC5d89B9f122d4E4ac4D65e1c` @commit`ea0158f` with new `RollupAddressManagerCache` @commit `7394458` @tx`0x9c2f36af40c0004110041fc45d980b73b0c8dde8064713a55aeb6f69fca77a99` + - Upgrade to `0xe7c4B445D3C7C8E4D68afb85A068F9fAa18e9A5B` @commit`ea0158f` with new `RollupAddressManagerCache` @commit `9ae9a5e` @tx`0x5eb57ab352b3e3c1ddbc3fe468d582901b88c6a137ce49b0d70857d5218d626d` + +#### tier_router + +- impl: `0x8a4c692F12d3a9750E744A4CE24a1d351bE52E66` +- logs: + - deployed on Oct 24, 2024 @commit`7334b1d` + - deployed on Nov 1, 2024 @commit`f4f4796` + - deployed on Nov 2, 2024 @commit`9182fba` + - deployed on Nov 8, 2024 @commit`1fee7bb` without changes in [PR #18371](https://github.com/taikoxyz/taiko-mono/pull/18371) + - deployed on Nov 10, 2024 @commit`f24a908` without changes in [PR #18371](https://github.com/taikoxyz/taiko-mono/pull/18371) + - deployed on Dec 20, 2024 @commit`06128e8` without changes in [PR #18371](https://github.com/taikoxyz/taiko-mono/pull/18371) -#### assignment_hook +#### tier_sgx -- proxy: `0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6` -- impl: `0xe226fAd08E2f0AE68C32Eb5d8210fFeDB736Fb0d` +- proxy: `0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81` +- impl: `0x81DFEA931500cdcf0460e9EC45FA283A6B7f0838` - owner: `admin.taiko.eth` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - - Upgraded from `0x4f664222C3fF6207558A745648B568D095dDA170` to `0xe226fAd08E2f0AE68C32Eb5d8210fFeDB736Fb0d` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` -- todo: - - upgrade assignment hook (remove a large Event) + - Upgraded from `0x3f54067EF5d8B414Bdb1945cdF482BD158Aad175` to `0xf381868DD6B2aC8cca468D63B42F9040DE2257E9` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` + - Upgraded from `0xf381868DD6B2aC8cca468D63B42F9040DE2257E9` to `0xB0b782cf0fCEce896E0C041F8e54f86cA4cC8e9F` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - Upgraded from `0xB0b782cf0fCEce896E0C041F8e54f86cA4cC8e9F` to `0xEE5F6648307319263FFBaE91f68ac700b188fF24` @commit`be34059` @tx`0x170617251f2345eda4bcbd29e316caa0b014602a44244c60b963382ac7da7748` + - Upgraded from `0xEE5F6648307319263FFBaE91f68ac700b188fF24` to `0x7EE4CEF8a945639e09DDf3032e9d95c8d90f07f3` @commit`dd09223` @tx`0x2e246e4b4637c4bf13dccea873a30e35e704bafa7f02e30c877ecec7d786e662` + - Upgraded from `0x7EE4CEF8a945639e09DDf3032e9d95c8d90f07f3` to `0x81DFEA931500cdcf0460e9EC45FA283A6B7f0838` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` -#### tier_provider +#### tier_risk0 -- impl: `0x4cffe56C947E26D07C14020499776DB3e9AE3a23` +- proxy: `0x55902b2D3DF2A65370A89C86Ae9dd71Ecd508edc` +- impl: `0xefe30A0D56a5804F695f971010597262CAd9A2c3` - logs: - - deployed on May 1, 2024 @commit`56dddf2b6` - - deployed on May 15, 2024 @commit`cd5144255` + - deployed on Nov 6, 2024 @commit`bfb0386` -#### tier_sgx +#### tier_sp1 -- proxy: `0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81` -- impl: `0xB0b782cf0fCEce896E0C041F8e54f86cA4cC8e9F` -- owner: `admin.taiko.eth` +- proxy: `0x5c44f2239925b0d86d2BFEe539f19CD0A08Af452` +- impl: `0x5f5b83Ca87E2fBc513B800FeD6cCD626536d7219` - logs: - - deployed on May 1, 2024 @commit`56dddf2b6` - - Upgraded from `0x3f54067EF5d8B414Bdb1945cdF482BD158Aad175` to `0xf381868DD6B2aC8cca468D63B42F9040DE2257E9` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - - Upgraded from `0xf381868DD6B2aC8cca468D63B42F9040DE2257E9` to `0xB0b782cf0fCEce896E0C041F8e54f86cA4cC8e9F` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - deployed on Nov 8, 2024 @commit`0b11101` #### guardian_prover_minority - ens: `guardians1.based.taiko.eth` - proxy: `0x579A8d63a2Db646284CBFE31FE5082c9989E985c` -- impl: `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4` +- impl: `0xB866E9046CAf4D75e2cbCD8b5eA3f07Ea74F7B47` - owner: `admin.taiko.eth` - guardianProvers: - `0x000012dd12a6d9dd2045f5e2594f4996b99a5d33` @@ -250,13 +308,15 @@ - Upgraded from `0x717DC5E3814591790BcB1fD9259eEdA7c14ce9CF` to `0x750221E951b77a2Cb4046De41Ec5F6d1aa7942D2` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - Upgraded from `0x750221E951b77a2Cb4046De41Ec5F6d1aa7942D2` to `0x253E47F2b1e91F2001d3578aeB24C0ccF464b65e` @commit`cd5144255` @tx`0x8030569e293baddbc4e8b26688a1ecf14a231d86c90e9d02dad1e919ea2f3964` - Upgraded from `0x253E47F2b1e91F2001d3578aeB24C0ccF464b65e` to `0x468F6A9C0ad2e9C8370687D2844A9e70fE942d5c` @commit`b955e0e` @tx`0x5a60c5815947a199cc84e1bc75539e01a202597b20c1f87bd9d02f8be6453abd` - - Upgraded from `0x468F6A9C0ad2e9C8370687D2844A9e70fE942d5c` to `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4.` @commit`8a27cbe` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - Upgraded from `0x468F6A9C0ad2e9C8370687D2844A9e70fE942d5c` to `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4` @commit`8a27cbe` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - Upgraded from `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4` to `0x3c40CC51e78B4a622622F9A4Df1b40068bc8Df98` @commit`be34059` @tx`0x170617251f2345eda4bcbd29e316caa0b014602a44244c60b963382ac7da7748` + - Upgraded from `0x3c40CC51e78B4a622622F9A4Df1b40068bc8Df98` to `0xB866E9046CAf4D75e2cbCD8b5eA3f07Ea74F7B47` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### guardian_prover - ens: `guardians.based.taiko.eth` - proxy: `0xE3D777143Ea25A6E031d1e921F396750885f43aC` -- impl: `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4` +- impl: `0xB866E9046CAf4D75e2cbCD8b5eA3f07Ea74F7B47` - owner: `admin.taiko.eth` - guardianProvers: - `0x000012dd12a6d9dd2045f5e2594f4996b99a5d33` @@ -273,7 +333,9 @@ - Upgraded from `0x717DC5E3814591790BcB1fD9259eEdA7c14ce9CF` to `0x750221E951b77a2Cb4046De41Ec5F6d1aa7942D2` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - Upgraded from `0x750221E951b77a2Cb4046De41Ec5F6d1aa7942D2` to `0x253E47F2b1e91F2001d3578aeB24C0ccF464b65e` @commit`cd5144255` @tx`0x8030569e293baddbc4e8b26688a1ecf14a231d86c90e9d02dad1e919ea2f3964` - Upgraded from `0x253E47F2b1e91F2001d3578aeB24C0ccF464b65e` to `0x468F6A9C0ad2e9C8370687D2844A9e70fE942d5c` @commit`b955e0e` @tx`0x5a60c5815947a199cc84e1bc75539e01a202597b20c1f87bd9d02f8be6453abd` - - Upgraded from `0x468F6A9C0ad2e9C8370687D2844A9e70fE942d5c` to `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4.` @commit`8a27cbe` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - Upgraded from `0x468F6A9C0ad2e9C8370687D2844A9e70fE942d5c` to `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4` @commit`8a27cbe` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - Upgraded from `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4` to `0x3c40CC51e78B4a622622F9A4Df1b40068bc8Df98` @commit`be34059` @tx`0x170617251f2345eda4bcbd29e316caa0b014602a44244c60b963382ac7da7748` + - Upgraded from `0x3c40CC51e78B4a622622F9A4Df1b40068bc8Df98` to `0xB866E9046CAf4D75e2cbCD8b5eA3f07Ea74F7B47` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### p256_verifier @@ -293,6 +355,18 @@ - logs: - deployed on May 1, 2024 @commit`56dddf2b6` +#### risc0_groth16_verifier + +- impl: `0xcF706D99C265fC2349AE43c5f6BFD7931FE5308D` +- logs: + - deployed on Nov 6, 2024 @commit`bfb0386` + +#### sp1_remote_verifier + +- impl: `0x2D33d748644dAb8B3FB0E07642d9dE96b816d067` +- logs: + - deployed on Nov 8, 2024 @commit`0b11101` + #### automata_dcap_attestation - proxy: `0x8d7C954960a36a7596d7eA4945dDf891967ca8A3` @@ -306,40 +380,58 @@ - Upgraded from `0xde1b1FBe7D721af4A56651272ef91A59B7303323` to `0x5f73f0AdC7dAA6134Fe751C4a78d524f9384e0B5` @commit`3740dc0` @tx`0x46a6d47c15505a1259c64d1e09353680e525b2706dd9e095e15019dda7c1b295` - Called `configureTcbInfoJson` @commit`3740dc0` @tx`0x46a6d47c15505a1259c64d1e09353680e525b2706dd9e095e15019dda7c1b295` - Update mrenclave & mrsign on May 28, 2024 @commit`b335b70` @tx`0x6a240314c6a48f3ab58e0a3d5bf0e915668dac5eec19c694656eeb3d66c12465` + - Called `setMrEnclave` @commit`9d06958` @tx`0x0aa35e03c521f8e4b4d03662a6ecc6de5dd3e336f63e6ea00eff7b4184eae9be` ### token_unlock -- impl: `0x035AFfC82612de31E9Db2259B9482D0Dd53B7819.` +- impl: `0xD6A337D948F44bAF9Bef85e4f00A5006Fe6ff5E7` - logs: - deployed @commit`bca493f` @tx`0x0a4a63715257b766ca06e7e87ee25088d557c460e50120208b31666c83fc68bc` + - deployed @commit`3d89d24` @tx`0x28fdfb26c1409e420fe9ecce22063fa70efdbe56359aeacf9f65e68db8b8d34a` ### prover_set -- impl: `0x34f2B21107AfE3584949c184A1E6236FFDAC4f6F` +- impl: `0x518845daA8870bE2C59E49620Fc262AD48953C9a` - logs: - deployed @commit`bca493f` @tx`0xfacd0f26e3ec4bf1f949637373483fcfe9a960dfc427d6fa62b116907bac3373` + - deployed @commit`2dd30ab` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` ### labprover.taiko.eth - ens: `labprover.taiko.eth` - proxy: `0x68d30f47F19c07bCCEf4Ac7FAE2Dc12FCa3e0dC9` -- impl: `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` +- impl: `0xd0d3f025D83D7122de7eC43e86331C57c8A4F30B` - enabled provers: - `0x000000629FBCf27A347d1AEbA658435230D74a5f` + - `0x000000633b68f5d8d3a86593ebb815b4663bcbe0` - logs: - deployed @commit`bca493f`@tx`0xf3b6af477112d0a8209506c8f310f4eb0713beebb1911ef5d11162d36d93c0ff` - enabled two provers (`0x000000629FBCf27A347d1AEbA658435230D74a5f` and `0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B`) @tx`0xa0b1565473849bc753d395abd982e6899ecdd9e754014eebed67b69edadb61c5` - upgraded from `0x68d30f47F19c07bCCEf4Ac7FAE2Dc12FCa3e0dC9` to `0x500735343372Dd6c9B84dBc7a75babf4479742B9` @commit`fa481c1` @tx`0x02ed558762eae5f0a930ba4a1047a02d4a793ea48890268c32df04e882f138ff` - disable a prover (`0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B`) on May 28 @commit`b335b70` @tx`0x27c84a1dbf80d88948f96f1536c244816543fb780c81a04ba485c4c156431112` - upgraded from `0x500735343372Dd6c9B84dBc7a75babf4479742B9` to `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - upgraded from `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` to `0x5D528253fA14cd7F637937de847BE8D5BE0Bf5fd` @commit`2b483de` @tx`0x0bbf7d1258c646f41a02a92a55825b1ebfd3659577d0f2b57b462f8895e23a04` + - upgraded from `0x5D528253fA14cd7F637937de847BE8D5BE0Bf5fd` to `0xD547Ca5d6b50dC5E900a091978597eB51F18F9D1` @commit`d907359` @tx`0xb4c23d57a1f0916180d0752c57726b634e7707bb7377c93d9e95d19e3695887a` + - enabled a prover (`0x000000633b68f5d8d3a86593ebb815b4663bcbe0`) @tx`0xb4c23d57a1f0916180d0752c57726b634e7707bb7377c93d9e95d19e3695887a` + - upgraded from `0xD547Ca5d6b50dC5E900a091978597eB51F18F9D1` to `0x518845daA8870bE2C59E49620Fc262AD48953C9a` @commit`2dd30ab` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` + - upgraded from `0x518845daA8870bE2C59E49620Fc262AD48953C9a` to `0x74828E5fe803072AF9Df512B3911B4223572D652` @commit`bb2abc5` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` + - upgraded from `0x74828E5fe803072AF9Df512B3911B4223572D652` to `0xCE5a119479337a153CA3bd1b2bF9755c78F2B15A` @commit`be34059` @tx`0x170617251f2345eda4bcbd29e316caa0b014602a44244c60b963382ac7da7748` + - upgraded from `0xCE5a119479337a153CA3bd1b2bF9755c78F2B15A` to `0x3022Ed0346CCE0c08268c8ad081458AfD95E8763` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` + - upgraded from `0x3022Ed0346CCE0c08268c8ad081458AfD95E8763` to `0xd0d3f025D83D7122de7eC43e86331C57c8A4F30B` @commit`06128e8` @tx`0xe66aba9f8bfcd86dc0ae32416862ca61a51c47f8ec747799e65f155ef27eeb20` ### labcontester.taiko.eth - ens: `labcontester.taiko.eth` - proxy: `0xa01d464ca3982DAa97B19fa7F8a232eB11A9DDb3` -- impl: `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` +- impl: `0xd0d3f025D83D7122de7eC43e86331C57c8A4F30B` - enabled provers: - `0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B` - logs: - enabled a prover (`0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B`) on May 28 @commit`b335b70` @tx`0x27c84a1dbf80d88948f96f1536c244816543fb780c81a04ba485c4c156431112` - upgraded from `0x500735343372Dd6c9B84dBc7a75babf4479742B9` to `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - upgraded from `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` to `0x5D528253fA14cd7F637937de847BE8D5BE0Bf5fd` @commit`2b483de` @tx`0x0bbf7d1258c646f41a02a92a55825b1ebfd3659577d0f2b57b462f8895e23a04` + - upgraded from `0xD547Ca5d6b50dC5E900a091978597eB51F18F9D1` to `0x518845daA8870bE2C59E49620Fc262AD48953C9a` @commit`2dd30ab` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` + - upgraded from `0x518845daA8870bE2C59E49620Fc262AD48953C9a` to `0x74828E5fe803072AF9Df512B3911B4223572D652` @commit`bb2abc5` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` + - upgraded from `0x74828E5fe803072AF9Df512B3911B4223572D652` to `0xCE5a119479337a153CA3bd1b2bF9755c78F2B15A` @commit`be34059` @tx`0x170617251f2345eda4bcbd29e316caa0b014602a44244c60b963382ac7da7748` + - upgraded from `0xCE5a119479337a153CA3bd1b2bF9755c78F2B15A` to `0x3022Ed0346CCE0c08268c8ad081458AfD95E8763` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` + - upgraded from `0x3022Ed0346CCE0c08268c8ad081458AfD95E8763` to `0xd0d3f025D83D7122de7eC43e86331C57c8A4F30B` @commit`06128e8` @tx`0xe66aba9f8bfcd86dc0ae32416862ca61a51c47f8ec747799e65f155ef27eeb20` diff --git a/packages/protocol/deployments/mainnet-contract-logs-L2.md b/packages/protocol/deployments/mainnet-contract-logs-L2.md index 4088e18c654..3faba5a7b13 100644 --- a/packages/protocol/deployments/mainnet-contract-logs-L2.md +++ b/packages/protocol/deployments/mainnet-contract-logs-L2.md @@ -23,12 +23,13 @@ - erc721_vault@1: `0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa` - erc1155_vault: `0x1670000000000000000000000000000000000004` - erc1155_vault@1: `0xaf145913EA4a56BE22E120ED9C24589659881702` - - bridged_erc20: `0x0167000000000000000000000000000000010096` + - bridged_erc20: `0x98161D67f762A9E589E502348579FA38B1Ac47A8` - bridged_erc721: `0x0167000000000000000000000000000000010097` - bridged_erc1155: `0x0167000000000000000000000000000000010098` - quota_manager: `0x0000000000000000000000000000000000000000` - bridge_watchdog: `0x0000000000000000000000000000000000000000` - todo: + - deploy and register BridgedERC20V2 - change owner to DelegateOwner - logs: - deployed on May 1, 2024 @commit`56dddf2b6` @@ -40,15 +41,16 @@ - set erc1155_vault@1 to `0xaf145913EA4a56BE22E120ED9C24589659881702` @tx`0x4a16a8a7d02f696b753208bbf8e7e3501d6b70b9a764fa2b4e115add46c13cb3` - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` - register `taiko_token` to `0xA9d23408b9bA935c230493c40C73824Df71A0975` @tx`0xc77434f4e37959cdc0eac125303b78dd192d8727173373cc7a6158ca7d829dad` + - register `bridged_erc20` to `0x98161D67f762A9E589E502348579FA38B1Ac47A8` @tx`0xf377885a94467d520bd765a186d3c3524099fe28e936d05656d0da2509628e65` #### bridge - proxy: `0x1670000000000000000000000000000000000001` -- impl: `0x8fb67c2c16dc8578b6d69bc668236924f4c1b0f7` +- impl: `0x95ae2918dcbc6aFF8B4c1F1BCC1bf819b6e08B83` - owner: `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` - todo: - change owner to DelegateOwner - - upgrade the contract + - upgrade the contract:https://github.com/taikoxyz/taiko-mono/pull/17529 - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - redeployed on May 22, 2024 @commit`b955e0e` @@ -56,12 +58,14 @@ - upgraded from `0xf961854D68368cFFc86d90AEe8a19E9781dACA3e` to `0x98C5De7670aA7d47C6c0551fAD27Bfe464A6751a..` @commit`` in @tx`0x0b5d6acc9c5b8ef193920246081ec5ce7268111acfc1dce1f058bea06f3953c7` - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` - upgrade impl to `0x0893c8821Fa358D5f3630695Ce062204814359A1` @commit`1bd3285` @tx`0x4605c4ce594e996bdbdb532a9aefe4fab1ea36f7e2ef63eef56a7e8033810df3` - - upgrade impl to `0x8fb67c2c16dc8578b6d69bc668236924f4c1b0f7` @commit`3ae25fd` @tx`0xc77434f4e37959cdc0eac125303b78dd192d8727173373cc7a6158ca7d829dad` + - upgrade impl to `0x8fb67c2c16dc8578b6d69bc668236924f4c1b0f7` @commit`3ae25fd` @tx`0xd95435c742c01B0E982913BcA252173Ae96DF61d` + - upgrade impl to `0x4Ca6bE8C1Ec05beFB216bAEEF9EE36997e35E98E` @commit`a3e1cf7` @tx`0xdf0348394d5e58f801de917575aafdc1cb55533b14a6e46fd460d1437238dc02` + - upgrade impl to `0x95ae2918dcbc6aFF8B4c1F1BCC1bf819b6e08B83` @commit`9345f14` @tx`0xdbe9caf2b1282d0fecf9a752f2c1aeade8820bb66bb5ad210f0081996504173b` #### erc20_vault - proxy: `0x1670000000000000000000000000000000000002` -- impl: `0x33fBcde27fBA21e90582Df31DFB427D4dbdBefC1` +- impl: `0xb96AbB41b01E3ad519D00E80355a1c3801910F62` - owner: `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` - todo: - change owner to DelegateOwner @@ -72,11 +76,12 @@ - linked bridged TKO to `0xA9d23408b9bA935c230493c40C73824Df71A0975` @tx`0xe25d05320b95fbc3bffe0b7cbfe351dd5fa6413db307d5c28f7b70983567a43b` - linked bridged USDC to `0x07d83526730c7438048D55A4fc0b850e2aaB6f0b` @tx`0xf1752ac712779e9ae53d408abdc5eec70e63582433143d6d91a489a1e8fc4778` - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` + - upgrade impl to `0xb96AbB41b01E3ad519D00E80355a1c3801910F62` @commit`9345f14` @tx`0xdbe9caf2b1282d0fecf9a752f2c1aeade8820bb66bb5ad210f0081996504173b` #### erc721_vault - proxy: `0x1670000000000000000000000000000000000003` -- impl: `0xD68BFe63E0f2983D89cbB225BEd068a8f19f5e08` +- impl: `0xd532f20a4751156C566Da7745db95E7f80145B36` - owner: `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` - todo: - change owner to DelegateOwner @@ -85,11 +90,12 @@ - redeployed on May 22, 2024 @commit`b955e0e` - upgrade to `0xD68BFe63E0f2983D89cbB225BEd068a8f19f5e08` @`0x8705703a93cb4cfc1ae69d1277f4464f807c7615237f2b04ff010c6e45708d34` - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` + - upgrade impl to `0xd532f20a4751156C566Da7745db95E7f80145B36` @commit`9345f14` @tx`0xdbe9caf2b1282d0fecf9a752f2c1aeade8820bb66bb5ad210f0081996504173b` #### erc1155_vault - proxy: `0x1670000000000000000000000000000000000004` -- impl: `0x3918a2910C393A1A2EF7AAc807970EFE47A54b7e` +- impl: `0xBBBC4ad39488b990E095042fa6c59A90d3817846` - owner: `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` - todo: - change owner to DelegateOwner @@ -98,6 +104,7 @@ - redeployed on May 22, 2024 @commit`b955e0e` - upgrade to `0x3918a2910C393A1A2EF7AAc807970EFE47A54b7e` @tx`0x264a2a553672a5480141638c3ca00a7bdf2c54e48c53f41867ca4f64703e16d7` - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` + - upgrade impl to `0xBBBC4ad39488b990E095042fa6c59A90d3817846` @commit`9345f14` @tx`0xdbe9caf2b1282d0fecf9a752f2c1aeade8820bb66bb5ad210f0081996504173b` #### signal_service @@ -110,7 +117,6 @@ - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` - todo: - change owner to DelegateOwner - - update signal service ## Rollup Specific @@ -133,7 +139,7 @@ #### taikoL2 - proxy: `0x1670000000000000000000000000000000010001` -- impl: `0x0167000000000000000000000000000000010001` +- impl: `0x75E76c367D6be621bD90e4b1e32fBB3fF59150b6` - owner: `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` - todo: - change owner to DelegateOwner @@ -141,6 +147,7 @@ - deployed on May 1, 2024 @commit`56dddf2b6` - redeployed on May 22, 2024 @commit`b955e0e` - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` + - upgrade impl to `0x75E76c367D6be621bD90e4b1e32fBB3fF59150b6` @commit`9345f14` @tx`0xdbe9caf2b1282d0fecf9a752f2c1aeade8820bb66bb5ad210f0081996504173b` #### bridged_taiko_token diff --git a/packages/protocol/deployments/mainnet-transfer-logs-L1.md b/packages/protocol/deployments/mainnet-transfer-logs-L1.md index 53f75e6ec75..41222580562 100644 --- a/packages/protocol/deployments/mainnet-transfer-logs-L1.md +++ b/packages/protocol/deployments/mainnet-transfer-logs-L1.md @@ -12,11 +12,11 @@ #### tx`0x9ede1da0bb372fbaa210bb1847172888b30e8a3cc68c9d868ec066ca3301f480` -- labs.taiko.eth depositted 10 ETH to proposer: `0x000000633b68f5d8d3a86593ebb815b4663bcbe0` -- labs.taiko.eth depositted 10 ETH to prover: `0x000000629FBCf27A347d1AEbA658435230D74a5f` -- labs.taiko.eth depositted 5 ETH to contester: `0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B` -- labs.taiko.eth depositted 0.01 ETH to bridge watchdog: `0x00000291ab79c55dc4fcd97dfba4880df4b93624` -- labs.taiko.eth depositted 5 ETH to bridge L1 relayer: `0x0000001539d3a970c979ac67a8836a359ce4a1fc` +- labs.taiko.eth deposited 10 ETH to proposer: `0x000000633b68f5d8d3a86593ebb815b4663bcbe0` +- labs.taiko.eth deposited 10 ETH to prover: `0x000000629FBCf27A347d1AEbA658435230D74a5f` +- labs.taiko.eth deposited 5 ETH to contester: `0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B` +- labs.taiko.eth deposited 0.01 ETH to bridge watchdog: `0x00000291ab79c55dc4fcd97dfba4880df4b93624` +- labs.taiko.eth deposited 5 ETH to bridge L1 relayer: `0x0000001539d3a970c979ac67a8836a359ce4a1fc` - labs.taiko.eth transferred 5 ETH to Daniel Wang: `0x69AA0361Dbb0527d4F1e5312403Bd41788fe61Fe` #### tx`0xdb04aa0f162cd84cadae96135e471575108954d552a873d42027b579140ca182` diff --git a/packages/protocol/docs/analysis/MrPotatoMagic-Analysis.md b/packages/protocol/docs/analysis/MrPotatoMagic-Analysis.md index e9138690c4c..8e523b65c69 100644 --- a/packages/protocol/docs/analysis/MrPotatoMagic-Analysis.md +++ b/packages/protocol/docs/analysis/MrPotatoMagic-Analysis.md @@ -13,7 +13,7 @@ Day 2-7 - Reviewing base contracts (least inherited) - Adding inline bookmarks for notes -- Understanding RLP encoding, EIP-4844, +- Understanding RLP encoding, EIP-4844 Day 8-12 @@ -51,7 +51,7 @@ Day 19-21 1. The biggest trust assumption in the contract is the owner role handling all the Address manager contracts. This role can pause the contracts at anytime. 2. The second trust assumption is the guardians multisig. Currently, the guardians are trusted and will be removed over time. But since they are the highest tier, the centralization risk in the proving system exists. -3. ANother role is the bridge watchdog. This role can ban and suspend any messages at will. It is the most important risk of the bridge contracts. +3. Another role is the bridge watchdog. This role can ban and suspend any messages at will. It is the most important risk of the bridge contracts. 4. The snapshooter role has some risks associated since it takes snapshots on the TaikoToken. There are more roles in the codebase but these are the foremost and most central to the protocol. @@ -110,7 +110,7 @@ Eventually, after the best tier i.e. highest tier proof (ZK proof) is solid and 4. Benefits of Based Contestable Rollup - Abstraction of special if-else code into a tier-based proof system makes the developers aware that the team cannot just shut down the chain uasing guardian prover and does not have control over it. -- Taiko has 3 types of bonds - validity bonds, contestation bonds and liveness bonds. We've spoken about the first two. Liveness bonds are basically, le's say, I have a prover off-chain and this prover is supposed to submit the proof within 15 minutes, then if the prover does not submit the proof in that time, then the prover's liveness bond is burnt. +- Taiko has 3 types of bonds - validity bonds, contestation bonds and liveness bonds. We've spoken about the first two. Liveness bonds are basically, let's say, I have a prover off-chain and this prover is supposed to submit the proof within 15 minutes, then if the prover does not submit the proof in that time, then the prover's liveness bond is burnt. - As an app dev, you can always change your config a long way. You can just use one layer-1 transaction to go from 100% optimistic to 100% ZK rollup. - As ZK becomes more trustworthy, the team will slowly increase the % to ZK until they become fully ZK and remove the guardian prover. @@ -147,7 +147,7 @@ End game: multiple zkVMs (Guardians removed) There are a few risks associated with the protocol: -- The protocol does not have a robust on-chain fee estimation mechanism. On calling the on-chain functions, the relayers should provide the contracts with upto date prices for users or atleast maintain a default amount of gas to send across. +- The protocol does not have a robust on-chain fee estimation mechanism. On calling the on-chain functions, the relayers should provide the contracts with up to date prices for users or atleast maintain a default amount of gas to send across. - The protocol would not work perfectly with swapping protocols. This is because the bridge includes invocation delays which can cause swaps to go outdated. - There is an issue related to custom coinbase transfers which can create a risk among block proposers. diff --git a/packages/protocol/docs/analysis/Sathish9098-Analysis.md b/packages/protocol/docs/analysis/Sathish9098-Analysis.md index 44ef49b993c..64f022ad978 100644 --- a/packages/protocol/docs/analysis/Sathish9098-Analysis.md +++ b/packages/protocol/docs/analysis/Sathish9098-Analysis.md @@ -277,7 +277,7 @@ The `LibVerifying` library is part of the Taiko protocol and is designed for han - `init(TaikoData.State storage _state, TaikoData.Config memory _config, bytes32 _genesisBlockHash)` : Sets up initial protocol state using specified configuration and genesis block hash, ensuring the protocol is ready for operation from a clearly defined starting point. -- `verifyBlocks(TaikoData.State storage _state, TaikoData.Config memory _config, IAddressResolver _resolver, uint64 _maxBlocksToVerify)` : Processes and verifies up to `_maxBlocksToVerify` blocks based on established transition rules and updates their state as verified, maintaining blockchain integrity. +- `verifyBlocks(TaikoData.State storage _state, TaikoData.Config memory _config, IAddressResolver _resolver, uint64 _maxBlocksToVerifyPerProposal)` : Processes and verifies up to `_maxBlocksToVerifyPerProposal` blocks based on established transition rules and updates their state as verified, maintaining blockchain integrity. - `_syncChainData(TaikoData.Config memory _config, IAddressResolver _resolver, uint64 _lastVerifiedBlockId, bytes32 _stateRoot)` : Internally updates external systems with the latest verified blockchain data, ensuring consistency across the protocol and external references. diff --git a/packages/protocol/docs/analysis/kaveyjoe-Analysis.md b/packages/protocol/docs/analysis/kaveyjoe-Analysis.md index c02ec09ac44..0e79b3b3765 100644 --- a/packages/protocol/docs/analysis/kaveyjoe-Analysis.md +++ b/packages/protocol/docs/analysis/kaveyjoe-Analysis.md @@ -63,7 +63,7 @@ The block will then mark complete on the chain. The block status changes from gr - The block consists of a transaction list (txList) and metadata. The txList of an L2 block will eventually (when EIP-4844 is live) be part of a blob in the L1 Consensus Layer (CL). - txList is not directly accessible to L1 contracts. Therefore, a ZKP shall prove that the chosen txList is a slice of the given blob data. -- Block validity criteria that all blocks need to respect: K_maxBobSize, K_BlockMaxTxs, K_BlockMaxGasLimit and config.anchorTxGasLimit +- Block validity criteria that all blocks need to respect: K_maxBlockSize, K_BlockMaxTxs, K_BlockMaxGasLimit and config.anchorTxGasLimit - Once the block is proposed, the Taiko client checks if the block is decoded into a list of transactions - Taiko client validates each enclosed transaction and generates a tracelog for each transaction for the prover to use as witness data. If a tx is invalid, it will be dropped. - The first transaction in the Taiko L2 block is always an anchoring transaction, which verifies the 256 hashes of the latest blocks, the L2 chain ID and the EIP-1559 base fee @@ -96,7 +96,7 @@ L2 tx fee = L2 EIP-1559* base fee + L1 tx fee + prover fee + proposer fee* L2 EIP-1559 fee = L2 EIP-1559 tip (goes to the proposer) + L2 EIP-1559 base fee (goes to the Taiko DAO). -Once a proposer has collected enough transactions, most probably including and ordering them with the intent to generate a (maxim) profit, they create a block. +Once a proposer has collected enough transactions, most probably including and ordering them with the intent to generate a (maximum) profit, they create a block. - Profit means that for the proposer, the sum of transaction fees (L2 tx fees) from the block is larger than L1 tx fee + prover fee + EIP-1559 base fee. diff --git a/packages/protocol/docs/how_taiko_is_deployed.md b/packages/protocol/docs/how_taiko_is_deployed.md index 70d25938054..23ab68cfa20 100644 --- a/packages/protocol/docs/how_taiko_is_deployed.md +++ b/packages/protocol/docs/how_taiko_is_deployed.md @@ -2,6 +2,6 @@ The Taiko protocol smart contracts are deployed on L1 and L2. The L2 contracts are pre-deployed first by creating a genesis block, and then the L1 contracts are deployed using a script. The general flow is like this: -1. A `genesis.json` is generated, which includes the L2 contracts (see: [generate genesis](../utils/generate_genesis/main.ts)). +1. A `genesis.json` is generated, which includes the L2 contracts (see: [generate genesis](../utils/generate_genesis/generate.ts)). 2. The `genesis.json` is used as input to generate the genesis block (see: https://geth.ethereum.org/docs/fundamentals/private-network#creating-genesis-block). -3. The L1 smart contracts are deployed by executing the L1 deployment script, [DeployOnL1.s.sol](../script/DeployOnL1.s.sol). The L1 deployment script takes in artifacts from the L2 deployment such as the deployed contract addresses, and genesis block hash. +3. The L1 smart contracts are deployed by executing the L1 deployment script, [DeployProtocolOnL1.s.sol](../script/layer1/DeployProtocolOnL1.s.sol). The L1 deployment script takes in artifacts from the L2 deployment such as the deployed contract addresses, and genesis block hash. diff --git a/packages/protocol/docs/how_taiko_proves_blocks.md b/packages/protocol/docs/how_taiko_proves_blocks.md index 1d1dd7dcf08..6f66bc6ab02 100644 --- a/packages/protocol/docs/how_taiko_proves_blocks.md +++ b/packages/protocol/docs/how_taiko_proves_blocks.md @@ -68,7 +68,7 @@ Note that the anchor transaction emits an `Anchored` event that may help ZKP to ZKP shall also check the signature of the anchor transaction: - The signer must be _`TaikoL2.GOLDEN_TOUCH_ADDRESS`_. -- The signature must use `1` as the `k` value if the calculated `r` is not `0`, otherwise, `k` must be `2`. See [LibL2Signer.sol](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/test/L2/LibL2Signer.sol). +- The signature must use `1` as the `k` value if the calculated `r` is not `0`, otherwise, `k` must be `2`. See [LibL2Signer.sol](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/test/layer2/LibL2Signer.sol). ### Block Metadata diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml index 9e3b3b0465c..f66986cfb74 100644 --- a/packages/protocol/foundry.toml +++ b/packages/protocol/foundry.toml @@ -1,7 +1,4 @@ [profile.default] -src = "contracts" -out = "out" -test = "test" script = "script" gas_price = 10_000_000_000 # 10 Gwei gas_limit = "18446744073709551615" # u64::MAX @@ -9,15 +6,23 @@ optimizer = true optimizer_runs = 200 ffi = true memory_limit = 2_073_741_824 -solc_version = "0.8.24" -evm_version = "cancun" +solc_version = "0.8.27" remappings = [ - "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", - "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", - "solady/=node_modules/solady/", + "openzeppelin/=node_modules/@openzeppelin/", + "@openzeppelin=node_modules/@openzeppelin", + "@openzeppelin-upgrades/contracts/=node_modules/@openzeppelin/contracts-upgradeable/", + "@risc0/contracts/=node_modules/risc0-ethereum/contracts/src/", + "@solady/=node_modules/solady/", + "@optimism/=node_modules/optimism/", + "@sp1-contracts/=node_modules/sp1-contracts/contracts/", "forge-std/=node_modules/forge-std/", "ds-test/=node_modules/ds-test/src/", - "p256-verifier/=node_modules/p256-verifier/", + "@p256-verifier/contracts/=node_modules/p256-verifier/src/", + "eigenlayer-middleware/=node_modules/eigenlayer-middleware/", + "eigenlayer-contracts/=node_modules/eigenlayer-contracts/", + "src/=contracts/", + "test/=test/", + "script/=script/", ] # Do not change the block_gas_limit value, TaikoL2.t.sol depends on it. @@ -29,6 +34,7 @@ fs_permissions = [ { access = "read", path = "./out" }, { access = "read-write", path = "./deployments" }, { access = "read", path = "./test" }, + { access = "read", path = "./script/" }, { access = "read", path = "./genesis" }, ] @@ -48,5 +54,23 @@ multiline_func_header = "all" number_underscore = "thousands" wrap_comments = true +[profile.layer1] +src = "contracts/layer1" +test = "test/layer1" +script = "script/layer1" +out = "out/layer1" +evm_version = "cancun" + +[profile.layer2] +src = "contracts/layer2" +test = "test/layer2" +script = "script/layer2" +out = "out/layer2" +evm_version = "shanghai" + [profile.genesis] -test = "genesis" +src = "contracts/layer2" +test = "test/genesis" +script = "script/layer2" +out = "out/layer2" +evm_version = "shanghai" \ No newline at end of file diff --git a/packages/protocol/package.json b/packages/protocol/package.json index a57d6cf02f4..cf9f5272977 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -1,22 +1,27 @@ { "name": "@taiko/protocol", - "version": "1.6.0", + "version": "1.11.0", "private": true, "scripts": { "buildMerkle": "ts-node ./utils/airdrop/buildMerkleTree.ts ./utils/airdrop/airdrop_db/example_claimList.json", - "clean": "rm -rf abis cache* && forge clean", - "compile": "forge build --build-info --extra-output storage-layout", - "layout": "./deployments/gen-layouts.sh", - "test:deploy": "./script/download_solc.sh && ./script/test_deploy_on_l1.sh", + "clean": "rm -rf out abis cache* && forge clean", + "compile:l1": "FOUNDRY_PROFILE=layer1 forge build --build-info --extra-output storage-layout", + "compile:l2": "FOUNDRY_PROFILE=layer2 forge build --build-info --extra-output storage-layout", + "compile:genesis": "FOUNDRY_PROFILE=genesis forge build --build-info --extra-output storage-layout", + "compile": "pnpm compile:l1 && pnpm compile:l2", + "test:l1": "FOUNDRY_PROFILE=layer1 forge test -vvv --extra-output storage-layout", + "test:l2": "FOUNDRY_PROFILE=layer2 forge test -vvv --extra-output storage-layout", + "test": "pnpm test:l1 && pnpm test:l2", + "layout:l1": "./script/gen-layouts.sh layer1", + "layout:l2": "./script/gen-layouts.sh layer2", + "layout": "pnpm layout:l1 && pnpm layout:l2", + "test:deploy:l1": "./script/download_solc.sh && ./script/layer1/deploy_protocol_on_l1.sh", "eslint": "pnpm exec eslint --fix --ignore-path .eslintignore --ext .js,.ts .", - "fmt:sol": "forge fmt", - "generate:genesis": "ts-node ./utils/generate_genesis/main.ts", - "lint:sol": "forge fmt && pnpm solhint 'contracts/**/*.sol'", - "snapshot": "forge snapshot --match-path 'test/**/*.t.sol'", - "test": "forge test -vvv --match-path test/*.t.sol", + "fmt:sol": "forge fmt && pnpm solhint 'contracts/**/*.sol'", "test:coverage": "mkdir -p coverage && forge coverage --report lcov && lcov --remove ./lcov.info -o ./coverage/lcov.info 'test/' 'script/' 'contracts/thirdparty/' && genhtml coverage/lcov.info --branch-coverage --output-dir coverage --ignore-errors category && open coverage/index.html", - "test:genesis": "pnpm compile && FOUNDRY_PROFILE=genesis ./genesis/generate_genesis.test.sh", - "export:simconf": "mkdir -p simulation/out && forge test --match-test 'test_L2_NoFeeCheck_simulation' -vv > simulation/out/simconf_$(date +%s).txt" + "genesis:gen": "pnpm compile:l2 && ts-node ./test/genesis/generate/generate.ts", + "genesis:test": "./test/genesis/genesis.test.sh", + "export:simconf": "mkdir -p simulation/out && FOUNDRY_PROFILE=layer2 forge test --match-test 'test_L2_NoFeeCheck_simulation' -vv > simulation/out/simconf_$(date +%s).txt" }, "devDependencies": { "@types/node": "^20.11.30", @@ -31,7 +36,7 @@ "eslint-plugin-promise": "^6.1.1", "ethers": "^5.7.2", "solc": "0.8.24", - "solhint": "^5.0.1", + "solhint": "^5.0.3", "ts-node": "^10.9.2", "typescript": "^5.2.2" }, @@ -39,9 +44,14 @@ "@openzeppelin/contracts": "4.9.6", "@openzeppelin/contracts-upgradeable": "4.9.6", "ds-test": "github:dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0", + "eigenlayer-contracts": "github:Layr-labs/eigenlayer-contracts#dev", + "eigenlayer-middleware": "github:layr-Labs/eigenlayer-middleware#mainnet", "forge-std": "github:foundry-rs/forge-std#v1.7.5", - "merkletreejs": "^0.3.11", + "merkletreejs": "^0.4.0", + "optimism": "github:ethereum-optimism/optimism#v1.8.0", "p256-verifier": "github:taikoxyz/p256-verifier#v0.1.0", - "solady": "github:Vectorized/solady#v0.0.167" + "risc0-ethereum": "github:risc0/risc0-ethereum#v1.1.2", + "solady": "github:Vectorized/solady#v0.0.231", + "sp1-contracts": "github:succinctlabs/sp1-contracts#v3.0.0" } } diff --git a/packages/protocol/script/download_solc.sh b/packages/protocol/script/download_solc.sh index 8c77c315a8a..0f078855856 100755 --- a/packages/protocol/script/download_solc.sh +++ b/packages/protocol/script/download_solc.sh @@ -11,7 +11,7 @@ fi mkdir -p "$(dirname "${solc_bin}")" -VERSION=v0.8.24 +VERSION=v0.8.27 if [ "$(uname)" = 'Darwin' ]; then SOLC_FILE_NAME=solc-macos diff --git a/packages/protocol/script/gen-layouts.sh b/packages/protocol/script/gen-layouts.sh new file mode 100755 index 00000000000..f3e74433b8d --- /dev/null +++ b/packages/protocol/script/gen-layouts.sh @@ -0,0 +1,113 @@ +#!/bin/bash + +# Define the list of contracts to inspect +# Please try not to change the order +# Contracts shared between layer 1 and layer 2 +contracts_shared=( +"contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault" +"contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault" +"contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault" +"contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20" +"contracts/shared/tokenvault/BridgedERC20V2.sol:BridgedERC20V2" +"contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721" +"contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155" +"contracts/shared/bridge/Bridge.sol:Bridge" +"contracts/shared/bridge/QuotaManager.sol:QuotaManager" +"contracts/shared/common/AddressManager.sol:AddressManager" +"contracts/shared/common/AddressResolver.sol:AddressResolver" +"contracts/shared/common/EssentialContract.sol:EssentialContract" +"contracts/shared/signal/SignalService.sol:SignalService" +) + +# Layer 1 contracts +contracts_layer1=( +"contracts/layer1/token/TaikoToken.sol:TaikoToken" +"contracts/layer1/verifiers/compose/ComposeVerifier.sol:ComposeVerifier" +"contracts/layer1/verifiers/compose/TeeAnyVerifier.sol:TeeAnyVerifier" +"contracts/layer1/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier" +"contracts/layer1/verifiers/compose/ZkAnyVerifier.sol:ZkAnyVerifier" +"contracts/layer1/verifiers/Risc0Verifier.sol:Risc0Verifier" +"contracts/layer1/verifiers/SP1Verifier.sol:SP1Verifier" +"contracts/layer1/verifiers/SgxVerifier.sol:SgxVerifier" +"contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation" +"contracts/layer1/based/TaikoL1.sol:TaikoL1" +"contracts/layer1/hekla/HeklaTaikoL1.sol:HeklaTaikoL1" +"contracts/layer1/hekla/HeklaTierRouter.sol:HeklaTierRouter" +"contracts/layer1/mainnet/multirollup/MainnetBridge.sol:MainnetBridge" +"contracts/layer1/mainnet/multirollup/MainnetSignalService.sol:MainnetSignalService" +"contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol:MainnetERC20Vault" +"contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol:MainnetERC1155Vault" +"contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol:MainnetERC721Vault" +"contracts/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol:MainnetSharedAddressManager" +"contracts/layer1/mainnet/addrcache/RollupAddressCache.sol:RollupAddressCache" +"contracts/layer1/mainnet/addrcache/SharedAddressCache.sol:SharedAddressCache" +"contracts/layer1/mainnet/addrcache/AddressCache.sol:AddressCache" +"contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol:MainnetSgxVerifier" +"contracts/layer1/mainnet/rollup/verifiers/MainnetSP1Verifier.sol:MainnetSP1Verifier" +"contracts/layer1/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier" +"contracts/layer1/mainnet/rollup/verifiers/MainnetRisc0Verifier.sol:MainnetRisc0Verifier" +"contracts/layer1/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier" +"contracts/layer1/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier" +"contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol:MainnetGuardianProver" +"contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol:MainnetTaikoL1" +"contracts/layer1/mainnet/rollup/MainnetRollupAddressManager.sol:MainnetRollupAddressManager" +"contracts/layer1/mainnet/rollup/MainnetTierRouter.sol:MainnetTierRouter" +"contracts/layer1/mainnet/rollup/MainnetProverSet.sol:MainnetProverSet" +"contracts/layer1/team/tokenunlock/TokenUnlock.sol:TokenUnlock" +"contracts/layer1/provers/ProverSet.sol:ProverSet" +"contracts/layer1/provers/GuardianProver.sol:GuardianProver" +"contracts/layer1/fork/ForkManager.sol:ForkManager" +) + +# Layer 2 contracts +contracts_layer2=( +"contracts/layer2/token/BridgedTaikoToken.sol:BridgedTaikoToken" +"contracts/layer2/DelegateOwner.sol:DelegateOwner" +"contracts/layer2/based/TaikoL2.sol:TaikoL2" +"contracts/layer2/hekla/HeklaTaikoL2.sol:HeklaTaikoL2" +"contracts/layer2/mainnet/MainnetTaikoL2.sol:MainnetTaikoL2" +) + +profile=$1 + +if [ "$profile" == "layer1" ]; then + echo "Generating layer 1 contract layouts..." + contracts=("${contracts_shared[@]}" "${contracts_layer1[@]}") +elif [ "$profile" == "layer2" ]; then + echo "Generating layer 2 contract layouts..." + contracts=("${contracts_shared[@]}" "${contracts_layer2[@]}") +else + echo "Invalid profile. Please enter either 'layer1' or 'layer2'." + exit 1 +fi + +# Empty the output file initially +output_file="contract_layout_${profile}.md" +> $output_file + +# Loop over each contract +for contract in "${contracts[@]}"; do + # Run forge inspect and append to the file + # Ensure correct concatenation of the command without commas + echo "inspect ${contract}" + + echo "## ${contract}" >> $output_file + FORGE_DISPLAY=plain FOUNDRY_PROFILE=${profile} forge inspect -C ./contracts/${profile} -o ./out/${profile} ${contract} storagelayout --pretty >> $output_file + echo "" >> $output_file +done + +sed_pattern='s|contracts/.*/\([^/]*\)\.sol:\([^/]*\)|\2|g' + +if [[ "$(uname -s)" == "Darwin" ]]; then + sed -i '' "$sed_pattern" "$output_file" +else + sed -i "$sed_pattern" "$output_file" +fi + +# Use awk to remove the last column and write to a temporary file +temp_file="${output_file}_temp" +while IFS= read -r line; do + # Remove everything behind the second-to-last "|" + echo "$line" | sed -E 's/\|[^|]*\|[^|]*$/|/' +done < "$output_file" > "$temp_file" +mv "$temp_file" "$output_file" \ No newline at end of file diff --git a/packages/protocol/script/AddSGXVerifierInstances.s.sol b/packages/protocol/script/layer1/AddSGXVerifierInstances.s.sol similarity index 86% rename from packages/protocol/script/AddSGXVerifierInstances.s.sol rename to packages/protocol/script/layer1/AddSGXVerifierInstances.s.sol index a4abb02152f..13179a4cbd8 100644 --- a/packages/protocol/script/AddSGXVerifierInstances.s.sol +++ b/packages/protocol/script/layer1/AddSGXVerifierInstances.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/verifiers/SgxVerifier.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/verifiers/SgxVerifier.sol"; contract AddSGXVerifierInstances is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/DeployERC20Airdrop.s.sol b/packages/protocol/script/layer1/DeployERC20Airdrop.s.sol similarity index 94% rename from packages/protocol/script/DeployERC20Airdrop.s.sol rename to packages/protocol/script/layer1/DeployERC20Airdrop.s.sol index 70d0f7f3d42..c726ca9b0dd 100644 --- a/packages/protocol/script/DeployERC20Airdrop.s.sol +++ b/packages/protocol/script/layer1/DeployERC20Airdrop.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/team/airdrop/ERC20Airdrop.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/team/airdrop/ERC20Airdrop.sol"; // @KorbinianK , @2manslkh // As written also in the tests the workflow shall be the following (checklist): diff --git a/packages/protocol/script/layer1/DeployHeklaL2Contracts.s.sol b/packages/protocol/script/layer1/DeployHeklaL2Contracts.s.sol new file mode 100644 index 00000000000..94d2c612f35 --- /dev/null +++ b/packages/protocol/script/layer1/DeployHeklaL2Contracts.s.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "test/shared/DeployCapability.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/common/AddressManager.sol"; +import "../../contracts/layer2/hekla/HeklaTaikoL2.sol"; +import "../../contracts/shared/tokenvault/BridgedERC20V2.sol"; + +contract DeployHeklaL2Contracts is DeployCapability { + uint256 public privateKey = vm.envUint("PRIVATE_KEY"); + + modifier broadcast() { + require(privateKey != 0, "invalid private key"); + vm.startBroadcast(privateKey); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + // TaikoL2 + address heklaTaikoL2 = address(new HeklaTaikoL2()); + // Bridge + address bridge = address(new Bridge()); + // Address manager + address addressManager = address(new AddressManager()); + // Bridged ERC20 V2 + address bridgedERC20V2 = address(new BridgedERC20V2()); + + console2.log("> hekla_taiko_l2@", heklaTaikoL2); + console2.log("> bridge@", bridge); + console2.log("> address_manager@", addressManager); + console2.log("> bridged_erc20_v2@", bridgedERC20V2); + } +} diff --git a/packages/protocol/script/DeployLabsProverPool.s.sol b/packages/protocol/script/layer1/DeployLabsProverPool.s.sol similarity index 84% rename from packages/protocol/script/DeployLabsProverPool.s.sol rename to packages/protocol/script/layer1/DeployLabsProverPool.s.sol index b258e441e4d..a109d51c68d 100644 --- a/packages/protocol/script/DeployLabsProverPool.s.sol +++ b/packages/protocol/script/layer1/DeployLabsProverPool.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/team/proving/ProverSet.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/provers/ProverSet.sol"; contract DeployLabsProverPool is DeployCapability { address public addressManager = 0x579f40D0BE111b823962043702cabe6Aaa290780; diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/layer1/DeployProtocolOnL1.s.sol similarity index 66% rename from packages/protocol/script/DeployOnL1.s.sol rename to packages/protocol/script/layer1/DeployProtocolOnL1.s.sol index 4a6619668a3..3f97218e85e 100644 --- a/packages/protocol/script/DeployOnL1.s.sol +++ b/packages/protocol/script/layer1/DeployProtocolOnL1.s.sol @@ -1,45 +1,51 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/utils/Strings.sol"; - -import "../contracts/common/LibStrings.sol"; -import "../contracts/tko/TaikoToken.sol"; -import "../contracts/L1/TaikoL1.sol"; -import "../contracts/L1/provers/GuardianProver.sol"; -import "../contracts/L1/tiers/DevnetTierProvider.sol"; -import "../contracts/L1/tiers/TierProviderV2.sol"; -import "../contracts/L1/hooks/AssignmentHook.sol"; -import "../contracts/bridge/Bridge.sol"; -import "../contracts/tokenvault/BridgedERC20.sol"; -import "../contracts/tokenvault/BridgedERC721.sol"; -import "../contracts/tokenvault/BridgedERC1155.sol"; -import "../contracts/tokenvault/ERC20Vault.sol"; -import "../contracts/tokenvault/ERC1155Vault.sol"; -import "../contracts/tokenvault/ERC721Vault.sol"; -import "../contracts/signal/SignalService.sol"; -import "../contracts/automata-attestation/AutomataDcapV3Attestation.sol"; -import "../contracts/automata-attestation/utils/SigVerifyLib.sol"; -import "../contracts/automata-attestation/lib/PEMCertChainLib.sol"; -import "../contracts/verifiers/SgxVerifier.sol"; -import "../contracts/team/proving/ProverSet.sol"; -import "../test/common/erc20/FreeMintERC20.sol"; -import "../test/common/erc20/MayFailFreeMintERC20.sol"; -import "../test/L1/TestTierProvider.sol"; -import "../test/DeployCapability.sol"; +import "@risc0/contracts/groth16/RiscZeroGroth16Verifier.sol"; +import { SP1Verifier as SuccinctVerifier } from "@sp1-contracts/src/v3.0.0/SP1VerifierPlonk.sol"; // Actually this one is deployed already on mainnet, but we are now deploying our own (non via-ir) // version. For mainnet, it is easier to go with one of: // - https://github.com/daimo-eth/p256-verifier // - https://github.com/rdubois-crypto/FreshCryptoLib -import { P256Verifier } from "p256-verifier/src/P256Verifier.sol"; - -/// @title DeployOnL1 +import "@p256-verifier/contracts/P256Verifier.sol"; + +import "src/shared/common/LibStrings.sol"; +import "src/shared/tokenvault/BridgedERC1155.sol"; +import "src/shared/tokenvault/BridgedERC20.sol"; +import "src/shared/tokenvault/BridgedERC721.sol"; +import "src/layer1/automata-attestation/AutomataDcapV3Attestation.sol"; +import "src/layer1/automata-attestation/lib/PEMCertChainLib.sol"; +import "src/layer1/automata-attestation/utils/SigVerifyLib.sol"; +import "src/layer1/devnet/DevnetTaikoL1.sol"; +import "src/layer1/devnet/DevnetTierRouter.sol"; +import "src/layer1/mainnet/rollup/MainnetGuardianProver.sol"; +import "src/layer1/mainnet/rollup/MainnetTaikoL1.sol"; +import "src/layer1/mainnet/rollup/MainnetTierRouter.sol"; +import "src/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol"; +import "src/layer1/mainnet/multirollup/MainnetBridge.sol"; +import "src/layer1/mainnet/multirollup/MainnetERC1155Vault.sol"; +import "src/layer1/mainnet/multirollup/MainnetERC20Vault.sol"; +import "src/layer1/mainnet/multirollup/MainnetERC721Vault.sol"; +import "src/layer1/mainnet/multirollup/MainnetSignalService.sol"; +import "src/layer1/provers/GuardianProver.sol"; +import "src/layer1/provers/ProverSet.sol"; +import "src/layer1/token/TaikoToken.sol"; +import "src/layer1/verifiers/Risc0Verifier.sol"; +import "src/layer1/verifiers/SP1Verifier.sol"; +import "test/layer1/based/TestTierRouter.sol"; +import "test/shared/token/FreeMintERC20.sol"; +import "test/shared/token/MayFailFreeMintERC20.sol"; +import "test/shared/DeployCapability.sol"; + +/// @title DeployProtocolOnL1 /// @notice This script deploys the core Taiko protocol smart contract on L1, /// initializing the rollup. -contract DeployOnL1 is DeployCapability { +contract DeployProtocolOnL1 is DeployCapability { uint256 public NUM_MIN_MAJORITY_GUARDIANS = vm.envUint("NUM_MIN_MAJORITY_GUARDIANS"); uint256 public NUM_MIN_MINORITY_GUARDIANS = vm.envUint("NUM_MIN_MINORITY_GUARDIANS"); + address public DAO_FALLBACK_PROPOSER = 0xD3f681bD6B49887A48cC9C9953720903967E9DC0; address public constant MAINNET_CONTRACT_OWNER = 0x9CBeE534B5D8a6280e01a14844Ee8aF350399C7F; // admin.taiko.eth @@ -149,9 +155,17 @@ contract DeployOnL1 is DeployCapability { ), registerTo: sharedAddressManager }); + } else { + register(sharedAddressManager, "taiko_token", taikoToken); } + register(sharedAddressManager, "bond_token", taikoToken); // Deploy Bridging contracts + deployProxy({ + name: "mainnet_signal_service", + impl: address(new MainnetSignalService()), + data: abi.encodeCall(SignalService.init, (address(0), sharedAddressManager)) + }); deployProxy({ name: "signal_service", impl: address(new SignalService()), @@ -159,6 +173,11 @@ contract DeployOnL1 is DeployCapability { registerTo: sharedAddressManager }); + deployProxy({ + name: "mainnet_bridge", + impl: address(new MainnetBridge()), + data: abi.encodeCall(Bridge.init, (address(0), sharedAddressManager)) + }); address brdige = deployProxy({ name: "bridge", impl: address(new Bridge()), @@ -182,6 +201,11 @@ contract DeployOnL1 is DeployCapability { console2.log("- sharedAddressManager : ", sharedAddressManager); // Deploy Vaults + deployProxy({ + name: "mainnet_erc20_vault", + impl: address(new MainnetERC20Vault()), + data: abi.encodeCall(ERC20Vault.init, (owner, sharedAddressManager)) + }); deployProxy({ name: "erc20_vault", impl: address(new ERC20Vault()), @@ -189,6 +213,11 @@ contract DeployOnL1 is DeployCapability { registerTo: sharedAddressManager }); + deployProxy({ + name: "mainnet_erc721_vault", + impl: address(new MainnetERC721Vault()), + data: abi.encodeCall(ERC721Vault.init, (owner, sharedAddressManager)) + }); deployProxy({ name: "erc721_vault", impl: address(new ERC721Vault()), @@ -196,6 +225,11 @@ contract DeployOnL1 is DeployCapability { registerTo: sharedAddressManager }); + deployProxy({ + name: "mainnet_erc1155_vault", + impl: address(new MainnetERC1155Vault()), + data: abi.encodeCall(ERC1155Vault.init, (owner, sharedAddressManager)) + }); deployProxy({ name: "erc1155_vault", impl: address(new ERC1155Vault()), @@ -243,12 +277,34 @@ contract DeployOnL1 is DeployCapability { // --------------------------------------------------------------- // Register shared contracts in the new rollup copyRegister(rollupAddressManager, _sharedAddressManager, "taiko_token"); + copyRegister(rollupAddressManager, _sharedAddressManager, "bond_token"); copyRegister(rollupAddressManager, _sharedAddressManager, "signal_service"); - copyRegister(rollupAddressManager, _sharedAddressManager, "bridge"); + // copyRegister(rollupAddressManager, _sharedAddressManager, "bridge"); + + deployProxy({ + name: "mainnet_taiko", + impl: address(new MainnetTaikoL1()), + data: abi.encodeCall( + TaikoL1.init, + ( + owner, + rollupAddressManager, + vm.envBytes32("L2_GENESIS_HASH"), + vm.envBool("PAUSE_TAIKO_L1") + ) + ) + }); + + TaikoL1 taikoL1; + if (keccak256(abi.encode(vm.envString("TIER_ROUTER"))) == keccak256(abi.encode("devnet"))) { + taikoL1 = TaikoL1(address(new DevnetTaikoL1())); + } else { + taikoL1 = TaikoL1(address(new TaikoL1())); + } deployProxy({ name: "taiko", - impl: address(new TaikoL1()), + impl: address(taikoL1), data: abi.encodeCall( TaikoL1.init, ( @@ -262,10 +318,9 @@ contract DeployOnL1 is DeployCapability { }); deployProxy({ - name: "assignment_hook", - impl: address(new AssignmentHook()), - data: abi.encodeCall(AssignmentHook.init, (owner, rollupAddressManager)), - registerTo: rollupAddressManager + name: "mainnet_tier_sgx", + impl: address(new MainnetSgxVerifier()), + data: abi.encodeCall(SgxVerifier.init, (owner, rollupAddressManager)) }); deployProxy({ @@ -275,6 +330,12 @@ contract DeployOnL1 is DeployCapability { registerTo: rollupAddressManager }); + deployProxy({ + name: "mainnet_guardian_prover_minority", + impl: address(new MainnetGuardianProver()), + data: abi.encodeCall(GuardianProver.init, (address(0), rollupAddressManager)) + }); + address guardianProverImpl = address(new GuardianProver()); address guardianProverMinority = deployProxy({ @@ -283,7 +344,7 @@ contract DeployOnL1 is DeployCapability { data: abi.encodeCall(GuardianProver.init, (address(0), rollupAddressManager)) }); - GuardianProver(guardianProverMinority).enableTaikoTokenAllowance(true); + GuardianProver(guardianProverMinority).enableBondAllowance(true); address guardianProver = deployProxy({ name: "guardian_prover", @@ -296,7 +357,7 @@ contract DeployOnL1 is DeployCapability { register( rollupAddressManager, "tier_router", - address(deployTierProvider(vm.envString("TIER_PROVIDER"))) + address(deployTierRouter(vm.envString("TIER_ROUTER"))) ); address[] memory guardians = vm.envAddress("GUARDIAN_PROVERS", ","); @@ -322,7 +383,8 @@ contract DeployOnL1 is DeployCapability { name: "automata_dcap_attestation", impl: automateDcapV3AttestationImpl, data: abi.encodeCall( - AutomataDcapV3Attestation.init, (owner, address(sigVerifyLib), address(pemCertChainLib)) + AutomataDcapV3Attestation.init, (owner, address(sigVerifyLib), + address(pemCertChainLib)) ), registerTo: rollupAddressManager }); @@ -339,15 +401,57 @@ contract DeployOnL1 is DeployCapability { ProverSet.init, (owner, vm.envAddress("PROVER_SET_ADMIN"), rollupAddressManager) ) }); + + // Log addresses for the user to register sgx instance + console2.log("SigVerifyLib", address(sigVerifyLib)); + console2.log("PemCertChainLib", address(pemCertChainLib)); + console2.log("AutomataDcapVaAttestation", automataProxy); + + deployProxy({ + name: "prover_set", + impl: address(new ProverSet()), + data: abi.encodeCall( + ProverSet.init, (owner, vm.envAddress("PROVER_SET_ADMIN"), rollupAddressManager) + ) + }); + + deployZKVerifiers(owner, rollupAddressManager); + } + + // deploy both sp1 & risc0 verifiers. + // using function to avoid stack too deep error + function deployZKVerifiers(address owner, address rollupAddressManager) private { + // Deploy r0 groth16 verifier + RiscZeroGroth16Verifier verifier = + new RiscZeroGroth16Verifier(ControlID.CONTROL_ROOT, ControlID.BN254_CONTROL_ID); + register(rollupAddressManager, "risc0_groth16_verifier", address(verifier)); + + deployProxy({ + name: "tier_zkvm_risc0", + impl: address(new Risc0Verifier()), + data: abi.encodeCall(Risc0Verifier.init, (owner, rollupAddressManager)), + registerTo: rollupAddressManager + }); + + // Deploy sp1 plonk verifier + SuccinctVerifier succinctVerifier = new SuccinctVerifier(); + register(rollupAddressManager, "sp1_remote_verifier", address(succinctVerifier)); + + deployProxy({ + name: "tier_zkvm_sp1", + impl: address(new SP1Verifier()), + data: abi.encodeCall(SP1Verifier.init, (owner, rollupAddressManager)), + registerTo: rollupAddressManager + }); } - function deployTierProvider(string memory tierProviderName) private returns (address) { - if (keccak256(abi.encode(tierProviderName)) == keccak256(abi.encode("devnet"))) { - return address(new DevnetTierProvider()); - } else if (keccak256(abi.encode(tierProviderName)) == keccak256(abi.encode("testnet"))) { - return address(new TestTierProvider()); - } else if (keccak256(abi.encode(tierProviderName)) == keccak256(abi.encode("mainnet"))) { - return address(new TierProviderV2()); + function deployTierRouter(string memory tierRouterName) private returns (address) { + if (keccak256(abi.encode(tierRouterName)) == keccak256(abi.encode("devnet"))) { + return address(new DevnetTierRouter()); + } else if (keccak256(abi.encode(tierRouterName)) == keccak256(abi.encode("testnet"))) { + return address(new TestTierRouter()); + } else if (keccak256(abi.encode(tierRouterName)) == keccak256(abi.encode("mainnet"))) { + return address(new MainnetTierRouter(DAO_FALLBACK_PROPOSER)); } else { revert("invalid tier provider"); } diff --git a/packages/protocol/script/layer1/DeployProverSet.s.sol b/packages/protocol/script/layer1/DeployProverSet.s.sol new file mode 100644 index 00000000000..924b1d5e590 --- /dev/null +++ b/packages/protocol/script/layer1/DeployProverSet.s.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/provers/ProverSet.sol"; +import "test/shared/DeployCapability.sol"; + +contract DeployProverSet is DeployCapability { + modifier broadcast() { + vm.startBroadcast(); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + address owner = vm.envOr("PROVER_SET_OWNER", msg.sender); + address admin = vm.envOr("PROVER_SET_ADMIN", msg.sender); + address addressManager = vm.envAddress("ROLLUP_ADDRESS_MANAGER"); + + addressNotNull(owner, "invalid owner address"); + addressNotNull(admin, "invalid admin address"); + addressNotNull(addressManager, "invalid rollup address manager address"); + + address proverSet = address(new ProverSet()); + + address proxy = deployProxy({ + name: "prover_set", + impl: proverSet, + data: abi.encodeCall(ProverSet.init, (owner, admin, addressManager)) + }); + + console2.log(); + console2.log("Deployed ProverSet impl at address: %s", proverSet); + console2.log("Deployed ProverSet proxy at address: %s", proxy); + } + + function addressNotNull(address addr, string memory err) private pure { + require(addr != address(0), err); + } +} diff --git a/packages/protocol/script/DeployL1QuotaManager.s.sol b/packages/protocol/script/layer1/DeployQuotaManager.s.sol similarity index 90% rename from packages/protocol/script/DeployL1QuotaManager.s.sol rename to packages/protocol/script/layer1/DeployQuotaManager.s.sol index c28aeb3419e..77d7d1fefcc 100644 --- a/packages/protocol/script/DeployL1QuotaManager.s.sol +++ b/packages/protocol/script/layer1/DeployQuotaManager.s.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/bridge/QuotaManager.sol"; +import "test/shared/DeployCapability.sol"; +import "src/shared/bridge/QuotaManager.sol"; -contract DeployL1QuotaManager is DeployCapability { +contract DeployQuotaManager is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); // MAINNET_L1_SHARED_ADDRESS_MANAGER: 0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa address public addressManager = vm.envAddress("L1_SHARED_ADDRESS_MANAGER"); diff --git a/packages/protocol/script/layer1/DeployRisc0Verifier.s.sol b/packages/protocol/script/layer1/DeployRisc0Verifier.s.sol new file mode 100644 index 00000000000..353a5557f33 --- /dev/null +++ b/packages/protocol/script/layer1/DeployRisc0Verifier.s.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.24; + +import "@risc0/contracts/groth16/RiscZeroGroth16Verifier.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/verifiers/Risc0Verifier.sol"; + +contract DeployRisc0Verifier is DeployCapability { + uint256 public deployerPrivKey = vm.envUint("PRIVATE_KEY"); + address public rollupAddressManager = vm.envAddress("ROLLUP_ADDRESS_MANAGER"); + + function run() external { + require(deployerPrivKey != 0, "invalid deployer priv key"); + require(rollupAddressManager != address(0), "invalid rollup address manager address"); + + vm.startBroadcast(deployerPrivKey); + RiscZeroGroth16Verifier verifier = + new RiscZeroGroth16Verifier(ControlID.CONTROL_ROOT, ControlID.BN254_CONTROL_ID); + register(rollupAddressManager, "risc0_groth16_verifier", address(verifier)); + deployProxy({ + name: "tier_zkvm_risc0", + impl: address(new Risc0Verifier()), + data: abi.encodeCall(Risc0Verifier.init, (address(0), rollupAddressManager)), + registerTo: rollupAddressManager + }); + vm.stopBroadcast(); + } +} diff --git a/packages/protocol/script/layer1/DeploySP1Verifier.s.sol b/packages/protocol/script/layer1/DeploySP1Verifier.s.sol new file mode 100644 index 00000000000..9f6f5f898ae --- /dev/null +++ b/packages/protocol/script/layer1/DeploySP1Verifier.s.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import { SP1Verifier as SuccinctVerifier } from "@sp1-contracts/src/v3.0.0/SP1VerifierPlonk.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/verifiers/SP1Verifier.sol"; + +contract DeploySP1Verifier is DeployCapability { + uint256 public deployerPrivKey = vm.envUint("PRIVATE_KEY"); + address public rollupAddressManager = vm.envAddress("ROLLUP_ADDRESS_MANAGER"); + + function run() external { + require(deployerPrivKey != 0, "invalid deployer priv key"); + require(rollupAddressManager != address(0), "invalid rollup address manager address"); + + vm.startBroadcast(deployerPrivKey); + + // Deploy sp1 plonk verifier + SuccinctVerifier succinctVerifier = new SuccinctVerifier(); + register(rollupAddressManager, "sp1_remote_verifier", address(succinctVerifier)); + + deployProxy({ + name: "tier_zkvm_sp1", + impl: address(new SP1Verifier()), + data: abi.encodeCall(SP1Verifier.init, (address(0), rollupAddressManager)), + registerTo: rollupAddressManager + }); + + vm.stopBroadcast(); + } +} diff --git a/packages/protocol/script/DeployTaikoToken.s.sol b/packages/protocol/script/layer1/DeployTaikoToken.s.sol similarity index 88% rename from packages/protocol/script/DeployTaikoToken.s.sol rename to packages/protocol/script/layer1/DeployTaikoToken.s.sol index 1279aa5527c..9684aea4870 100644 --- a/packages/protocol/script/DeployTaikoToken.s.sol +++ b/packages/protocol/script/layer1/DeployTaikoToken.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/tko/TaikoToken.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/token/TaikoToken.sol"; contract DeployTaikoToken is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/layer1/SendMessageToDelegateOwner.s.sol b/packages/protocol/script/layer1/SendMessageToDelegateOwner.s.sol new file mode 100644 index 00000000000..acb6ec105f8 --- /dev/null +++ b/packages/protocol/script/layer1/SendMessageToDelegateOwner.s.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "src/shared/bridge/IBridge.sol"; +import "src/layer2/DelegateOwner.sol"; +import "test/shared/thirdparty/Multicall3.sol"; + +contract SendMessageToDelegateOwner is Script { + address public delegateOwner = 0x5995941Df88F30Ac140515AA39832db963E2f863; + address public delegateOwnerImpl = 0x1f0511cDae2fbfD93563469dA02b82dEd320C8Bd; + address public multicall3 = 0xcA11bde05977b3631167028862bE2a173976CA11; + address public l1Bridge = 0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC; + address public testAccount1 = 0x3c181965C5cFAE61a9010A283e5e0C1445649810; + + modifier broadcast() { + vm.startBroadcast(); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + Multicall3.Call3[] memory calls = new Multicall3.Call3[](2); + calls[0].target = delegateOwner; + calls[0].allowFailure = false; + calls[0].callData = abi.encodeCall(DelegateOwner.setAdmin, (testAccount1)); + + calls[1].target = delegateOwner; + calls[1].allowFailure = false; + calls[1].callData = abi.encodeCall(UUPSUpgradeable.upgradeTo, (delegateOwnerImpl)); + + DelegateOwner.Call memory dcall = DelegateOwner.Call({ + txId: 1, // Has to match with DelegateOwner's nextTxId or 0 + target: multicall3, + isDelegateCall: true, + txdata: abi.encodeCall(Multicall3.aggregate3, (calls)) + }); + + // Use https://bridge.taiko.xyz/relayer to manually trigger the message if necessary. + IBridge.Message memory message = IBridge.Message({ + id: 0, + fee: 0, + gasLimit: 1_000_000, // cannot be zero + from: msg.sender, + srcChainId: 1, + srcOwner: msg.sender, + destChainId: 167_000, + destOwner: delegateOwner, + to: delegateOwner, + value: 0, + data: abi.encodeCall(DelegateOwner.onMessageInvocation, abi.encode(dcall)) + }); + + IBridge(l1Bridge).sendMessage(message); + } +} diff --git a/packages/protocol/script/SetDcapParams.s.sol b/packages/protocol/script/layer1/SetDcapParams.s.sol similarity index 94% rename from packages/protocol/script/SetDcapParams.s.sol rename to packages/protocol/script/layer1/SetDcapParams.s.sol index 9f65aa2eaa1..9a38c703ce0 100644 --- a/packages/protocol/script/SetDcapParams.s.sol +++ b/packages/protocol/script/layer1/SetDcapParams.s.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/Script.sol"; import "forge-std/src/console2.sol"; -import "../test/automata-attestation/common/AttestationBase.t.sol"; +import "test/layer1/automata-attestation/common/AttestationBase.t.sol"; contract SetDcapParams is Script, AttestationBase { uint256 public ownerPrivateKey = vm.envUint("PRIVATE_KEY"); // Owner of the attestation contract @@ -67,7 +67,7 @@ contract SetDcapParams is Script, AttestationBase { } function _configureTcbInfoJson() internal { - tcbInfoPath = vm.envString("TCB_INFO_PATH"); + string memory tcbInfoPath = vm.envString("TCB_INFO_PATH"); string memory tcbInfoJson = vm.readFile(string.concat(vm.projectRoot(), tcbInfoPath)); configureTcbInfoJson(dcapAttestationAddress, tcbInfoJson); console2.logString("TCB_INFO_JSON set: "); diff --git a/packages/protocol/script/layer1/UpdateMainnetOntakeL1.s.sol b/packages/protocol/script/layer1/UpdateMainnetOntakeL1.s.sol new file mode 100644 index 00000000000..97d945f3a72 --- /dev/null +++ b/packages/protocol/script/layer1/UpdateMainnetOntakeL1.s.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "test/shared/DeployCapability.sol"; +import "src/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol"; +import "src/layer1/mainnet/multirollup/MainnetSignalService.sol"; +import "src/layer1/mainnet/multirollup/MainnetBridge.sol"; +import "src/layer1/mainnet/rollup/MainnetRollupAddressManager.sol"; +import "src/layer1/mainnet/rollup/MainnetTaikoL1.sol"; +import "src/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol"; +import "src/layer1/provers/GuardianProver.sol"; +import "src/layer1/mainnet/rollup/MainnetProverSet.sol"; + +contract UpgradeMainnetOntakeL1 is DeployCapability { + uint256 public privateKey = vm.envUint("PRIVATE_KEY"); + + modifier broadcast() { + require(privateKey != 0, "invalid private key"); + vm.startBroadcast(privateKey); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + // MainnetSharedAddressManager + console2.log(address(new MainnetSharedAddressManager())); + // MainnetSignalService + console2.log(address(new MainnetSignalService())); + // MainnetBridge + console2.log(address(new MainnetBridge())); + // MainnetRollupAddressManager + console2.log(address(new MainnetRollupAddressManager())); + // MainnetTaikoL1 + console2.log(address(new MainnetTaikoL1())); + // MainnetSgxVerifier + console2.log(address(new MainnetSgxVerifier())); + // GuardianProver + console2.log(address(new GuardianProver())); + // MainnetProverSet + console2.log(address(new MainnetProverSet())); + } +} diff --git a/packages/protocol/script/layer1/UpdateRisc0Verifier.s.sol b/packages/protocol/script/layer1/UpdateRisc0Verifier.s.sol new file mode 100644 index 00000000000..f63398eb35a --- /dev/null +++ b/packages/protocol/script/layer1/UpdateRisc0Verifier.s.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.24; + +import "@risc0/contracts/groth16/RiscZeroGroth16Verifier.sol"; +import "test/shared/DeployCapability.sol"; + +contract UpdateRisc0Verifier is DeployCapability { + uint256 public deployerPrivKey = vm.envUint("PRIVATE_KEY"); + address public rollupAddressManager = vm.envAddress("ROLLUP_ADDRESS_MANAGER"); + + function run() external { + require(deployerPrivKey != 0, "invalid deployer priv key"); + require(rollupAddressManager != address(0), "invalid rollup address manager address"); + + vm.startBroadcast(deployerPrivKey); + RiscZeroGroth16Verifier verifier = + new RiscZeroGroth16Verifier(ControlID.CONTROL_ROOT, ControlID.BN254_CONTROL_ID); + register(rollupAddressManager, "risc0_groth16_verifier", address(verifier)); + vm.stopBroadcast(); + } +} diff --git a/packages/protocol/script/layer1/UpdateSP1Verifier.s.sol b/packages/protocol/script/layer1/UpdateSP1Verifier.s.sol new file mode 100644 index 00000000000..a9d74e0004c --- /dev/null +++ b/packages/protocol/script/layer1/UpdateSP1Verifier.s.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@sp1-contracts/src/v3.0.0/SP1VerifierPlonk.sol"; +import "test/shared/DeployCapability.sol"; + +contract UpdateSP1Verifier is DeployCapability { + uint256 public deployerPrivKey = vm.envUint("PRIVATE_KEY"); + address public rollupAddressManager = vm.envAddress("ROLLUP_ADDRESS_MANAGER"); + + function run() external { + require(deployerPrivKey != 0, "invalid deployer priv key"); + require(rollupAddressManager != address(0), "invalid rollup address manager address"); + + vm.startBroadcast(deployerPrivKey); + + // Deploy sp1 plonk verifier + SP1Verifier sp1Verifier = new SP1Verifier(); + register(rollupAddressManager, "sp1_remote_verifier", address(sp1Verifier)); + + vm.stopBroadcast(); + } +} diff --git a/packages/protocol/script/layer1/UpgradeHeklaOntakeL1.s.sol b/packages/protocol/script/layer1/UpgradeHeklaOntakeL1.s.sol new file mode 100644 index 00000000000..4dc0498eeda --- /dev/null +++ b/packages/protocol/script/layer1/UpgradeHeklaOntakeL1.s.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/hekla/HeklaTaikoL1.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/common/AddressManager.sol"; +import "src/layer1/provers/ProverSet.sol"; +import "src/layer1/provers/GuardianProver.sol"; + +contract UpgradeHeklaOntakeL1 is DeployCapability { + uint256 public privateKey = vm.envUint("PRIVATE_KEY"); + + modifier broadcast() { + require(privateKey != 0, "invalid private key"); + vm.startBroadcast(privateKey); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + // TaikoL1 + UUPSUpgradeable(0x79C9109b764609df928d16fC4a91e9081F7e87DB).upgradeTo( + address(new HeklaTaikoL1()) + ); + // Bridge + UUPSUpgradeable(0xA098b76a3Dd499D3F6D58D8AcCaFC8efBFd06807).upgradeTo(address(new Bridge())); + // Rollup address manager + UUPSUpgradeable(0x1F027871F286Cf4B7F898B21298E7B3e090a8403).upgradeTo( + address(new AddressManager()) + ); + // Shared address manager + UUPSUpgradeable(0x7D3338FD5e654CAC5B10028088624CA1D64e74f7).upgradeTo( + address(new AddressManager()) + ); + // Prover set + UUPSUpgradeable(0xD3f681bD6B49887A48cC9C9953720903967E9DC0).upgradeTo( + address(new ProverSet()) + ); + UUPSUpgradeable(0x335103c4fa2F55451975082136F1478eCFeB84B9).upgradeTo( + address(new ProverSet()) + ); + // Guardian Prover + UUPSUpgradeable(0x92F195a8702da2104aE8E3E10779176E7C35d6BC).upgradeTo( + address(new GuardianProver()) + ); + UUPSUpgradeable(0x31d4d27da5c299d4b6CE19c869B8891C0002795d).upgradeTo( + address(new GuardianProver()) + ); + } +} diff --git a/packages/protocol/script/layer1/UpgradeHeklaOntakeL2.s.sol b/packages/protocol/script/layer1/UpgradeHeklaOntakeL2.s.sol new file mode 100644 index 00000000000..c6b7cfd815f --- /dev/null +++ b/packages/protocol/script/layer1/UpgradeHeklaOntakeL2.s.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer2/hekla/HeklaTaikoL2.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/common/AddressManager.sol"; +import "test/shared/thirdparty/Multicall3.sol"; +import "src/layer2/DelegateOwner.sol"; + +contract UpgradeHeklaOntakeL2 is DeployCapability { + address public delegateOwner = 0x95F6077C7786a58FA070D98043b16DF2B1593D2b; + address public multicall3 = 0xcA11bde05977b3631167028862bE2a173976CA11; + + uint256 public privateKey = vm.envUint("PRIVATE_KEY"); + address public newHeklaTaikoL2 = vm.envAddress("NEW_HEKLA_TAIKO_L2"); + address public newBridge = vm.envAddress("NEW_BRIDGE"); + address public newAddressManager = vm.envAddress("NEW_ADDRESS_MANAGER"); + address public newBridgedERC20 = vm.envAddress("NEW_BRIDGED_ERC20"); + + modifier broadcast() { + require(privateKey != 0, "invalid private key"); + vm.startBroadcast(privateKey); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + Multicall3.Call3[] memory calls = new Multicall3.Call3[](5); + // TaikoL2 + calls[0].target = 0x1670090000000000000000000000000000010001; + calls[0].allowFailure = false; + calls[0].callData = abi.encodeCall(UUPSUpgradeable.upgradeTo, (newHeklaTaikoL2)); + // Bridge + calls[1].target = 0x1670090000000000000000000000000000000001; + calls[1].allowFailure = false; + calls[1].callData = abi.encodeCall(UUPSUpgradeable.upgradeTo, (newBridge)); + // Rollup address manager + calls[2].target = 0x1670090000000000000000000000000000010002; + calls[2].allowFailure = false; + calls[2].callData = abi.encodeCall(UUPSUpgradeable.upgradeTo, (newAddressManager)); + // Shared address manager + calls[3].target = 0x1670090000000000000000000000000000000006; + calls[3].allowFailure = false; + calls[3].callData = abi.encodeCall(UUPSUpgradeable.upgradeTo, (newAddressManager)); + // Register Bridged ERC20 + calls[4].target = 0x1670090000000000000000000000000000000006; + calls[4].allowFailure = false; + calls[4].callData = abi.encodeCall( + AddressManager.setAddress, (167_009, bytes32(bytes("bridged_erc20")), newBridgedERC20) + ); + + DelegateOwner.Call memory dcall = DelegateOwner.Call({ + txId: 0, + target: multicall3, + isDelegateCall: true, + txdata: abi.encodeCall(Multicall3.aggregate3, (calls)) + }); + + IBridge.Message memory message = IBridge.Message({ + id: 0, + fee: 0, + gasLimit: 3_000_000, + from: msg.sender, + srcChainId: 17_000, + srcOwner: msg.sender, + destChainId: 167_009, + destOwner: delegateOwner, + to: delegateOwner, + value: 0, + data: abi.encodeCall(DelegateOwner.onMessageInvocation, abi.encode(dcall)) + }); + + IBridge(0xA098b76a3Dd499D3F6D58D8AcCaFC8efBFd06807).sendMessage(message); + } +} diff --git a/packages/protocol/script/config_dcap_sgx_verifier.sh b/packages/protocol/script/layer1/config_dcap_sgx_verifier.sh similarity index 93% rename from packages/protocol/script/config_dcap_sgx_verifier.sh rename to packages/protocol/script/layer1/config_dcap_sgx_verifier.sh index 0a115ea164d..ae55b2683a5 100755 --- a/packages/protocol/script/config_dcap_sgx_verifier.sh +++ b/packages/protocol/script/layer1/config_dcap_sgx_verifier.sh @@ -2,7 +2,7 @@ usage() { echo \ -'Run "PRIVATE_KEY=0x1234 ./script/config_dcap_sgx_verifier.sh +'Run "PRIVATE_KEY=0x1234 ./script/config_dcap_sgx_verifier.sh --tcb file_path: config tcb --eq file_path: config qe --mrenclave hex_string: config mrenclave @@ -29,11 +29,21 @@ if [ $# -eq 0 ]; then exit 1 fi -# replace with the correct address of the verifier/attester/pemCertChain. +# dev addresses of the verifier/attester/pemCertChain. +# export SGX_VERIFIER_ADDRESS=0xebB0DA61818F639f460F67940EB269b36d1F104E +# export ATTESTATION_ADDRESS=0xCFd1a900c9C0aB14443460b8F011d8076db636c2 +# export PEM_CERTCHAIN_ADDRESS=0xaa22e95F5Bf27E07c02e6cc41A700597832FA30d + +# Hekla addresses of the verifier/attester/pemCertChain. export SGX_VERIFIER_ADDRESS=0x532EFBf6D62720D0B2a2Bb9d11066E8588cAE6D9 export ATTESTATION_ADDRESS=0xC6cD3878Fc56F2b2BaB0769C580fc230A95e1398 export PEM_CERTCHAIN_ADDRESS=0x08d7865e7F534d743Aba5874A9AD04bcB223a92E +# Mainnet addresses of the verifier/attester/pemCertChain. Uncomment this and comment out the above if running for mainnet! +# export SGX_VERIFIER_ADDRESS=0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81 +# export ATTESTATION_ADDRESS=0x8d7C954960a36a7596d7eA4945dDf891967ca8A3 +# export PEM_CERTCHAIN_ADDRESS=0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169 + # default value # for setMrEnclave which should be called by the owner of the verifier MR_ENCLAVE=0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef @@ -58,7 +68,7 @@ toggle_check=0 vm_file_path() { local file_path="$1" local parent_dir=$(dirname "$file_path") - local trimmed_path="/test/automata-attestation/assets/$(basename "$parent_dir")/$(basename "$file_path")" + local trimmed_path="/test/layer1/automata-attestation/assets/$(basename "$parent_dir")/$(basename "$file_path")" echo "$trimmed_path" } @@ -142,7 +152,7 @@ MR_SIGNER=$MR_SIGNER \ QEID_PATH=$QEID_PATH \ TCB_INFO_PATH=$TCB_INFO_PATH \ V3_QUOTE_BYTES=$V3_QUOTE_BYTES \ -forge script script/SetDcapParams.s.sol:SetDcapParams \ +forge script script/layer1/SetDcapParams.s.sol:SetDcapParams \ --fork-url $FORK_URL \ --broadcast \ --evm-version cancun \ diff --git a/packages/protocol/script/layer1/deploy_protocol_on_l1.sh b/packages/protocol/script/layer1/deploy_protocol_on_l1.sh new file mode 100755 index 00000000000..53345e7f5ff --- /dev/null +++ b/packages/protocol/script/layer1/deploy_protocol_on_l1.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +# This script is only used by `pnpm test:deploy:l1`. +set -e + +forge script ./script/layer1/DeployProtocolOnL1.s.sol:DeployProtocolOnL1 \ + --fork-url $FORK_URL \ + --broadcast \ + --ffi \ + -vvvv \ + --private-key $PRIVATE_KEY \ + --block-gas-limit 200000000 + +forge script ./script/layer1/DeployTaikoToken.s.sol:DeployTaikoToken \ + --fork-url $FORK_URL \ + --broadcast \ + --skip-simulation \ + --ffi \ + -vvvv \ + --private-key $PRIVATE_KEY \ + --block-gas-limit 200000000 diff --git a/packages/protocol/script/layer1/preconf/BaseScript.sol b/packages/protocol/script/layer1/preconf/BaseScript.sol new file mode 100644 index 00000000000..e0a8926d9ae --- /dev/null +++ b/packages/protocol/script/layer1/preconf/BaseScript.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +contract BaseScript is Script { + modifier broadcast() { + uint256 privateKey = vm.envUint("PRIVATE_KEY"); + require(privateKey != 0, "BaseScript: invalid private key"); + + vm.startBroadcast(); + _; + vm.stopBroadcast(); + } + + function deployProxy( + address _impl, + address _admin, + bytes memory _data + ) + internal + returns (address) + { + TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy(_impl, _admin, _data); + return address(proxy); + } +} diff --git a/packages/protocol/script/layer1/preconf/deployment/DeployAVS.s.sol b/packages/protocol/script/layer1/preconf/deployment/DeployAVS.s.sol new file mode 100644 index 00000000000..702f4df46a4 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/DeployAVS.s.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +import "src/layer1/based/ITaikoL1.sol"; +import "src/layer1/preconf/impl/PreconfRegistry.sol"; +import "src/layer1/preconf/avs-mvp/PreconfServiceManager.sol"; +import "src/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol"; +import "src/layer1/preconf/avs-mvp/iface/ISlasher.sol"; +import "src/layer1/preconf/impl/PreconfTaskManager.sol"; + +import "../BaseScript.sol"; +import "../misc/EmptyContract.sol"; + +contract DeployAVS is BaseScript { + // Required by service manager + address public implDirectory = vm.envAddress("AVS_DIRECTORY"); + address public slasher = vm.envAddress("SLASHER"); + + // Required by task manager + address public taikoL1 = vm.envAddress("TAIKO_L1"); + address public taikoToken = vm.envAddress("TAIKO_TOKEN"); + uint256 public beaconGenesisTimestamp = vm.envUint("BEACON_GENESIS_TIMESTAMP"); + address public beaconBlockRootContract = vm.envAddress("BEACON_BLOCK_ROOT_CONTRACT"); + + function run() external broadcast { + EmptyContract emptyContract = new EmptyContract(); + ProxyAdmin proxyAdmin = new ProxyAdmin(); + + // Deploy proxies with empty implementations + address preconfRegistry = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address preconfServiceManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address preconfTaskManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + + // Deploy implementations + PreconfRegistry preconfRegistryImpl = + new PreconfRegistry(IPreconfServiceManager(preconfServiceManager)); + PreconfServiceManager preconfServiceManagerImpl = new PreconfServiceManager( + preconfRegistry, preconfTaskManager, IAVSDirectory(implDirectory), ISlasher(slasher) + ); + PreconfTaskManager preconfTaskManagerImpl = new PreconfTaskManager( + IPreconfServiceManager(preconfServiceManager), + IPreconfRegistry(preconfRegistry), + ITaikoL1(taikoL1), + beaconGenesisTimestamp, + beaconBlockRootContract + ); + + // Upgrade proxies with implementations + proxyAdmin.upgradeAndCall( + ITransparentUpgradeableProxy(preconfRegistry), + address(preconfRegistryImpl), + abi.encodeCall(PreconfRegistry.init, ()) + ); + proxyAdmin.upgrade( + ITransparentUpgradeableProxy(preconfServiceManager), address(preconfServiceManagerImpl) + ); + proxyAdmin.upgradeAndCall( + ITransparentUpgradeableProxy(preconfTaskManager), + address(preconfTaskManagerImpl), + abi.encodeCall(PreconfTaskManager.init, IERC20(taikoToken)) + ); + + console2.log("Proxy admin: ", address(proxyAdmin)); + console2.log("Preconf Registry: ", preconfRegistry); + console2.log("Preconf Service Manager: ", preconfServiceManager); + console2.log("Preconf Task Manager: ", preconfTaskManager); + } +} diff --git a/packages/protocol/script/layer1/preconf/deployment/DeployEigenlayerMVP.s.sol b/packages/protocol/script/layer1/preconf/deployment/DeployEigenlayerMVP.s.sol new file mode 100644 index 00000000000..cec20b27f87 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/DeployEigenlayerMVP.s.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +import "src/layer1/preconf/avs-mvp/impl/DelegationManager.sol"; +import "src/layer1/preconf/avs-mvp/impl/StrategyManager.sol"; +import "src/layer1/preconf/avs-mvp/impl/Slasher.sol"; +import "src/layer1/preconf/avs-mvp/impl/AVSDirectory.sol"; + +import "../BaseScript.sol"; +import "../misc/EmptyContract.sol"; + +contract DeployEigenlayerMVP is BaseScript { + function run() external broadcast { + EmptyContract emptyContract = new EmptyContract(); + ProxyAdmin proxyAdmin = new ProxyAdmin(); + + // Deploy proxies with empty implementations + address avsDirectory = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address delegationManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address strategyManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address slasher = deployProxy(address(emptyContract), address(proxyAdmin), ""); + + // Deploy implementations + AVSDirectory avsDirectoryImpl = new AVSDirectory(); + DelegationManager delegationManagerImpl = + new DelegationManager(IStrategyManager(strategyManager)); + StrategyManager strategyManagerImpl = + new StrategyManager(IDelegationManager(delegationManager)); + Slasher slasherImpl = new Slasher(); + + // Upgrade proxies with implementations + proxyAdmin.upgrade(ITransparentUpgradeableProxy(avsDirectory), address(avsDirectoryImpl)); + proxyAdmin.upgrade( + ITransparentUpgradeableProxy(delegationManager), address(delegationManagerImpl) + ); + proxyAdmin.upgrade( + ITransparentUpgradeableProxy(strategyManager), address(strategyManagerImpl) + ); + proxyAdmin.upgrade(ITransparentUpgradeableProxy(slasher), address(slasherImpl)); + + console2.log("AVS Directory: ", avsDirectory); + console2.log("Delegation Manager: ", delegationManager); + console2.log("Strategy Manager: ", strategyManager); + console2.log("Slasher: ", slasher); + } +} diff --git a/packages/protocol/script/layer1/preconf/deployment/deploy_avs.sh b/packages/protocol/script/layer1/preconf/deployment/deploy_avs.sh new file mode 100644 index 00000000000..eb494a26207 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/deploy_avs.sh @@ -0,0 +1,17 @@ +set -e + +: "${PRIVATE_KEY:?Environment variable PRIVATE_KEY is required}" +: "${FORK_URL:?Environment variable FORK_URL is required}" +: "${AVS_DIRECTORY:?Environment variable AVS_DIRECTORY is required}" +: "${SLASHER:?Environment variable SLASHER is required}" +: "${TAIKO_L1:?Environment variable TAIKO_L1 is required}" +: "${TAIKO_TOKEN:?Environment variable TAIKO_TOKEN is required}" +: "${BEACON_GENESIS_TIMESTAMP:?Environment variable BEACON_GENESIS_TIMESTAMP is required}" +: "${BEACON_BLOCK_ROOT_CONTRACT:?Environment variable BEACON_BLOCK_ROOT_CONTRACT is required}" +echo "BEACON_GENESIS_TIMESTAMP: $BEACON_GENESIS_TIMESTAMP" + +forge script scripts/deployment/DeployAVS.s.sol:DeployAVS \ + --fork-url $FORK_URL \ + --broadcast \ + --skip-simulation \ + --private-key $PRIVATE_KEY \ No newline at end of file diff --git a/packages/protocol/script/layer1/preconf/deployment/deploy_eigenlayer_mvp.sh b/packages/protocol/script/layer1/preconf/deployment/deploy_eigenlayer_mvp.sh new file mode 100644 index 00000000000..b0465281eb1 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/deploy_eigenlayer_mvp.sh @@ -0,0 +1,10 @@ +set -e + +: "${PRIVATE_KEY:?Environment variable PRIVATE_KEY is required}" +: "${FORK_URL:?Environment variable FORK_URL is required}" + +forge script scripts/deployment/DeployEigenlayerMVP.s.sol:DeployEigenlayerMVP \ + --rpc-url $FORK_URL \ + --broadcast \ + --skip-simulation \ + --private-key $PRIVATE_KEY \ No newline at end of file diff --git a/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockAVS.s.sol b/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockAVS.s.sol new file mode 100644 index 00000000000..a0dbcb9d095 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockAVS.s.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +import "src/layer1/based/ITaikoL1.sol"; +import "src/layer1/preconf/mock/MockPreconfRegistry.sol"; +import "src/layer1/preconf/impl/PreconfTaskManager.sol"; +import "src/layer1/preconf/iface/IPreconfRegistry.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; +import "src/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol"; +import "src/layer1/preconf/avs-mvp/iface/ISlasher.sol"; +import "src/layer1/preconf/avs-mvp/PreconfServiceManager.sol"; + +import "../../BaseScript.sol"; +import "../../misc/EmptyContract.sol"; + +contract DeployMockAVS is BaseScript { + // Required by service manager + address public avsDirectory = vm.envAddress("AVS_DIRECTORY"); + address public slasher = vm.envAddress("SLASHER"); + + // Required by task manager + address public taikoL1 = vm.envAddress("TAIKO_L1"); + address public taikoToken = vm.envAddress("TAIKO_TOKEN"); + uint256 public beaconGenesisTimestamp = vm.envUint("BEACON_GENESIS_TIMESTAMP"); + address public beaconBlockRootContract = vm.envAddress("BEACON_BLOCK_ROOT_CONTRACT"); + + function run() external broadcast { + EmptyContract emptyContract = new EmptyContract(); + ProxyAdmin proxyAdmin = new ProxyAdmin(); + + // Deploy proxies with empty implementations + address preconfRegistry = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address preconfServiceManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address preconfTaskManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + + // Deploy implementations + MockPreconfRegistry preconfRegistryImpl = + new MockPreconfRegistry(IPreconfServiceManager(preconfServiceManager)); + PreconfServiceManager preconfServiceManagerImpl = new PreconfServiceManager( + preconfRegistry, preconfTaskManager, IAVSDirectory(avsDirectory), ISlasher(slasher) + ); + PreconfTaskManager preconfTaskManagerImpl = new PreconfTaskManager( + IPreconfServiceManager(preconfServiceManager), + IPreconfRegistry(preconfRegistry), + ITaikoL1(taikoL1), + beaconGenesisTimestamp, + beaconBlockRootContract + ); + + // Upgrade proxies with implementations + proxyAdmin.upgradeAndCall( + ITransparentUpgradeableProxy(preconfRegistry), + address(preconfRegistryImpl), + abi.encodeCall(MockPreconfRegistry.init, ()) + ); + proxyAdmin.upgrade( + ITransparentUpgradeableProxy(preconfServiceManager), address(preconfServiceManagerImpl) + ); + proxyAdmin.upgradeAndCall( + ITransparentUpgradeableProxy(preconfTaskManager), + address(preconfTaskManagerImpl), + abi.encodeCall(PreconfTaskManager.init, IERC20(taikoToken)) + ); + + console2.log("Proxy admin: ", address(proxyAdmin)); + console2.log("Preconf Registry: ", preconfRegistry); + console2.log("Preconf Service Manager: ", preconfServiceManager); + console2.log("Preconf Task Manager: ", preconfTaskManager); + } +} diff --git a/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockTaikoToken.s.sol b/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockTaikoToken.s.sol new file mode 100644 index 00000000000..a9a8428beea --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockTaikoToken.s.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "src/layer1/preconf/mock/MockTaikoToken.sol"; +import "../../BaseScript.sol"; + +contract DeployMockTaikoToken is BaseScript { + function run() external broadcast { + MockTaikoToken myContract = new MockTaikoToken(); + console2.log("MockTaikoToken:", address(myContract)); + } +} diff --git a/packages/protocol/script/layer1/preconf/misc/EmptyContract.sol b/packages/protocol/script/layer1/preconf/misc/EmptyContract.sol new file mode 100644 index 00000000000..c1158fe8b1f --- /dev/null +++ b/packages/protocol/script/layer1/preconf/misc/EmptyContract.sol @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @dev This is solely used as a placeholder during empty proxy deployment +contract EmptyContract { } diff --git a/packages/protocol/script/tokenunlock/Deploy.data.json b/packages/protocol/script/layer1/tokenunlock/Deploy.data.json similarity index 100% rename from packages/protocol/script/tokenunlock/Deploy.data.json rename to packages/protocol/script/layer1/tokenunlock/Deploy.data.json diff --git a/packages/protocol/script/tokenunlock/Deploy.s.sol b/packages/protocol/script/layer1/tokenunlock/Deploy.s.sol similarity index 73% rename from packages/protocol/script/tokenunlock/Deploy.s.sol rename to packages/protocol/script/layer1/tokenunlock/Deploy.s.sol index 73103eb6984..c94fc0fe490 100644 --- a/packages/protocol/script/tokenunlock/Deploy.s.sol +++ b/packages/protocol/script/layer1/tokenunlock/Deploy.s.sol @@ -1,15 +1,21 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../../test/DeployCapability.sol"; -import "../../contracts/team/tokenunlock/TokenUnlock.sol"; +import "src/layer1/team/tokenunlock/TokenUnlock.sol"; +import "test/shared/DeployCapability.sol"; contract DeployTokenUnlock is DeployCapability { using stdJson for string; + // On L2 it shall be: 0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8 address public OWNER = 0x9CBeE534B5D8a6280e01a14844Ee8aF350399C7F; // admin.taiko.eth + // On L2 it shall be: 0x1670000000000000000000000000000000010002 address public ROLLUP_ADDRESS_MANAGER = 0x579f40D0BE111b823962043702cabe6Aaa290780; + // Fine as is uint64 public TGE = 1_717_588_800; // Wednesday, June 5, 2024 12:00:00 PM + // On L2 is shall be: 0x806A3D0B9540655454Dd9dd9922B1321f0cfA2ED + // Deployed (and verified) with TXN: + // https://taikoscan.io/tx/0x3100bc89ba700400f81d7823898f0f43a0dd5ce5507b13c4ad9e625dc0497909 address public TOKEN_UNLOCK_IMPL = 0x035AFfC82612de31E9Db2259B9482D0Dd53B7819; function setUp() public { } diff --git a/packages/protocol/script/tokenunlock/Vest.data.json b/packages/protocol/script/layer1/tokenunlock/Vest.data.json similarity index 100% rename from packages/protocol/script/tokenunlock/Vest.data.json rename to packages/protocol/script/layer1/tokenunlock/Vest.data.json index acaae6037ba..c97818ee7ec 100644 --- a/packages/protocol/script/tokenunlock/Vest.data.json +++ b/packages/protocol/script/layer1/tokenunlock/Vest.data.json @@ -1,17 +1,17 @@ [ { - "recipient": "0xa48dEBc18D5e63F1FB94DD513f643e412684f8a4", "proxy": "0x33A270541f383A4A48dB6C5f1f00A161b8F79e2a", + "recipient": "0xa48dEBc18D5e63F1FB94DD513f643e412684f8a4", "vestAmount": 35000 }, { - "recipient": "0xa48dEBc18D5e63F1FB94DD513f643e412684f8a4", "proxy": "0x33A270541f383A4A48dB6C5f1f00A161b8F79e2a", + "recipient": "0xa48dEBc18D5e63F1FB94DD513f643e412684f8a4", "vestAmount": 25000 }, { - "recipient": "0xa48dEBc18D5e63F1FB94DD513f643e412684f8a4", "proxy": "0x33A270541f383A4A48dB6C5f1f00A161b8F79e2a", + "recipient": "0xa48dEBc18D5e63F1FB94DD513f643e412684f8a4", "vestAmount": 15000 } ] diff --git a/packages/protocol/script/layer1/tokenunlock/Vest.s.sol b/packages/protocol/script/layer1/tokenunlock/Vest.s.sol new file mode 100644 index 00000000000..1f421602d33 --- /dev/null +++ b/packages/protocol/script/layer1/tokenunlock/Vest.s.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "forge-std/src/console2.sol"; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "src/layer1/team/tokenunlock/TokenUnlock.sol"; + +contract VestTokenUnlock is Script { + using stdJson for string; + + struct VestingItem { + address proxy; + address recipient; + uint256 vestAmount; + } + + // On L2 it shall be: 0xA9d23408b9bA935c230493c40C73824Df71A0975 + ERC20 private tko = ERC20(0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800); + + function run() external { + string memory path = "/script/tokenunlock/Vest.data.json"; + VestingItem[] memory items = abi.decode( + vm.parseJson(vm.readFile(string.concat(vm.projectRoot(), path))), (VestingItem[]) + ); + + uint256 total; + for (uint256 i; i < items.length; i++) { + address proxy = items[i].proxy; + address recipient = items[i].recipient; + uint256 vestAmount = uint256(items[i].vestAmount); + + console2.log("proxy:", proxy); + console2.log("recipient:", recipient); + console2.log("vestAmount:", vestAmount); + console2.log(""); + + TokenUnlock target = TokenUnlock(proxy); + + require(target.recipient() == recipient, "recipient mismatch"); + require(target.owner() == 0x9CBeE534B5D8a6280e01a14844Ee8aF350399C7F, "owner mismatch"); + + total += SafeCastUpgradeable.toUint128(items[i].vestAmount * 1e18); + } + + console2.log("total:", total / 1e18); + require(tko.balanceOf(msg.sender) >= total, "insufficient TKO balance"); + + vm.startBroadcast(); + for (uint256 i; i < items.length; i++) { + uint128 vestAmount = uint128(items[i].vestAmount * 1e18); + tko.approve(items[i].proxy, vestAmount); + TokenUnlock(items[i].proxy).vest(vestAmount); + } + vm.stopBroadcast(); + } +} diff --git a/packages/protocol/script/layer1/tokenunlock/exercise1.data.json b/packages/protocol/script/layer1/tokenunlock/exercise1.data.json new file mode 100644 index 00000000000..3bf88371ae4 --- /dev/null +++ b/packages/protocol/script/layer1/tokenunlock/exercise1.data.json @@ -0,0 +1,632 @@ +[ + { + "proxy": "0xe8373f13fb890a135965f4cd9766d60a7f5d81bc", + "recipient": "0x02E725B7e99091Bd4cCBf15228384e160eCdf78f", + "vestAmount": 1267615 + }, + { + "proxy": "0x4d4f7e608cd77ef04ce8b19e383445e69b5b47df", + "recipient": "0x034c33c7A7FC791F9cc3A1C6A739a6958885Cae3", + "vestAmount": 1543210 + }, + { + "proxy": "0x4c3a28c3bdaa5c789d1cce6a0ccbdaec2378c78f", + "recipient": "0x0C11eF582C87A45A7DE131367bba9B416DC90FfA", + "vestAmount": 2234567 + }, + { + "proxy": "0xA997C0850D7086b07E65d46B499Af91Cd24E72f2", + "recipient": "0x0D48D06DC186D5d5aab4705E9f358adFE6fFe2eD", + "vestAmount": 6666142 + }, + { + "proxy": "0x4984884eb4ca609fCd6a5aF880D47986BBd9F00e", + "recipient": "0x0f2f3F49964a0FA960dee19A749D7B44a3869865", + "vestAmount": 4945850 + }, + { + "proxy": "0x830194aEf3B5BD35077395ef788C3A8c0a5b88dc", + "recipient": "0x1109BFA2dae2281457639Dee11d86c3629cc4E7C", + "vestAmount": 953644 + }, + { + "proxy": "0x4570F9414a92AFd73CAA5bc1AEFb5DeB3a2ff31f", + "recipient": "0x1B499d378C5ca187F0295228b2077a188F6C49b0", + "vestAmount": 171043 + }, + { + "proxy": "0x9af4fca3378e94904c56263869DFAAC344Df69AE", + "recipient": "0x268d2E2bBE32B4Aeb84dECE49A8b88132e33A6c5", + "vestAmount": 1386432 + }, + { + "proxy": "0x4060aC8b1c346307a5e15ac78c2f45cb16e702A7", + "recipient": "0x2C80010717A818ae170643D4dAa556aCB994804C", + "vestAmount": 5335098 + }, + { + "proxy": "0xF1C162704CCcd51496E50c68B5cF5faE8f03251C", + "recipient": "0x3002c9B8B4cce5Bc5A5025D0403C6b187D35Fb85", + "vestAmount": 76753 + }, + { + "proxy": "0x61e8d5186633A0Df3569E5C40D13f607A70556b5", + "recipient": "0x31C3281eBC1046725e08dAbAb9a09356b895B991", + "vestAmount": 26006 + }, + { + "proxy": "0xB31Af0e8E21BE453c053F9D8d371CaaD83beE3fD", + "recipient": "0x31F8Cf2fFFC843D1e534875c02be57f424279c2d", + "vestAmount": 917576 + }, + { + "proxy": "0x856c55b5BC6838A134ce98F00dF2111330583f56", + "recipient": "0x34198aaD335426bd66d40842F4A13096d58d3B56", + "vestAmount": 99778 + }, + { + "proxy": "0xB0b3BAF6Ed01994eE8E3F2A3CEe0770A2ab27281", + "recipient": "0x36A7e5FC77Dd43896Fe2cF9E3FED985CAd8aF034", + "vestAmount": 1047274 + }, + { + "proxy": "0x0858B67aB18083d86F4020CC21f5cbdc1C68ED3e", + "recipient": "0x396AD8cD527d5C98255865e520b52aCC3B2e84Ac", + "vestAmount": 538093 + }, + { + "proxy": "0xC296544D2005b7f07e45F5Eb91765BF58F73FE00", + "recipient": "0x3F72FE6675dBf3428289019F1A28Da2D13de708e", + "vestAmount": 2701842 + }, + { + "proxy": "0x4077Ac1dc1B7DF8E941c1F2414363E375d94Aa73", + "recipient": "0x3fe67b9b757411b5C1db6E25A0B742902210F126", + "vestAmount": 2210123 + }, + { + "proxy": "0xE69F975488e789E40C84488de11516dc3EE604e6", + "recipient": "0x42cAD9922973B0aF9849562A1a7ADeBf6dc64517", + "vestAmount": 293578 + }, + { + "proxy": "0x61BCf27361e45a394612c2f761586bfdfE2a07E3", + "recipient": "0x42e7da399D2b2Acc2C238Dbd63072B28e7019A69", + "vestAmount": 106724 + }, + { + "proxy": "0x2d040D592085D4707595fcAfffd335b4df131d81", + "recipient": "0x44aa8FBfDD5315660565085888ceaA8B43127C8B", + "vestAmount": 2876543 + }, + { + "proxy": "0x26e58007D473AAc2f3a41DFBd1f5298266Fc3801", + "recipient": "0x49864Bb823F1e7bb8028F6E7A76e22190d55c184", + "vestAmount": 765113 + }, + { + "proxy": "0x8Ac9A867b1f87287860E2e7a8aBf6dE27ddE75eA", + "recipient": "0x4cad91EA77267D0f5290cA5Bd2685bE6399a1ccd", + "vestAmount": 3028273 + }, + { + "proxy": "0x41f2Ace12c2361ef6677dCbc8F469ECdb9bcfAb1", + "recipient": "0x4d00862721636071cb187c5e99dc51602947122c", + "vestAmount": 229874 + }, + { + "proxy": "0x14f02931B2290bE66AAcE3134AB5bfEc80cf67b4", + "recipient": "0x4f068DbC35Be594E28BbFb85976402dbE41e0011", + "vestAmount": 335403 + }, + { + "proxy": "0x979e17ff19e6EA3391bb7657F0f73D292Eaf9C03", + "recipient": "0x53c725A86547272C55A8fdb52DeBE2e9B19B01C0", + "vestAmount": 56839 + }, + { + "proxy": "0x6370D429554C7e25E6e82f3aFf7d61A950D245dD", + "recipient": "0x5b01475cfCb320737806E3330f206021386CB88a", + "vestAmount": 65150 + }, + { + "proxy": "0xd3F954f8888142c86f43eB3795659A387EDB7656", + "recipient": "0x5e84d2C5105e9966CF08e6D7f413730dFF3Bb862", + "vestAmount": 1453272 + }, + { + "proxy": "0x55df502EefF4E49845648207a3a8C7B46f8C2a26", + "recipient": "0x600324dfd716C08892A000A146d790A1Ca519913", + "vestAmount": 1987654 + }, + { + "proxy": "0x92692fBbB3663811B6DDdebFe747E9A142d4061d", + "recipient": "0x61bA99B686DE575d6faEB8B90202Dd27A061F1C9", + "vestAmount": 57375 + }, + { + "proxy": "0xE4d809e41BF1A5264CD690FdB23BDEbAb8bCbdAA", + "recipient": "0x62400E5c7239D4cFA285E460cc290dc55F130bb7", + "vestAmount": 85526 + }, + { + "proxy": "0x7ae5d5964ae38e5958bb47C777f618458503fA89", + "recipient": "0x6574a47d7c4bb89e144754432e929284c1b9b9ce", + "vestAmount": 69077 + }, + { + "proxy": "0xef9a873452cFE3e039512D0b71d84D1e21F5D61d", + "recipient": "0x674EDb847199a0B87b8d33ADE8636939d68f64cc", + "vestAmount": 38376 + }, + { + "proxy": "0xa96d402D43E419B86bC0EEa596322dEE7363Ce95", + "recipient": "0x69ad4c99fA216f26a797D3Dab0CC619DF8F3BA97", + "vestAmount": 352294 + }, + { + "proxy": "0x002de81024DE91903BdFdC331c2c8dc74Ec89473", + "recipient": "0x69E6Ec47A242B4f68AB3cd4B84737D2a570A90cf", + "vestAmount": 179632 + }, + { + "proxy": "0x42dE671f715138aE364B661fbA6755cB0daA5767", + "recipient": "0x6B6072CE402F22fDcFbA1705383D8e280717Cb87", + "vestAmount": 2273557 + }, + { + "proxy": "0x34f1ac3F8389A607994E9f3D4B11e35e965C3d16", + "recipient": "0x6cf7EaE611201Be43a12ceE4a4098ED0Fd61B04A", + "vestAmount": 293578 + }, + { + "proxy": "0xA0DD28a91c9247e6d292dfe8eD08e65b09301A1d", + "recipient": "0x6d4ee35D70AD6331000E370F079aD7df52E75005", + "vestAmount": 268634 + }, + { + "proxy": "0x7C846ff2df23189c6499d5A15c300C2E646E16dc", + "recipient": "0x6d76bef8d6ea81ea4cee5cae1bb4cc4452a078a4", + "vestAmount": 100814 + }, + { + "proxy": "0xBD5f35779a810d53feff393Ac148b755a7F578Ea", + "recipient": "0x7153C8ff9F93E50EEB7af9092ADA3d5fBf36d2b9", + "vestAmount": 1789432 + }, + { + "proxy": "0x4B816E63cf18CAA6496EEc851243a9F7AF85F94A", + "recipient": "0x7154a02BA6eEaB9300D056e25f3EEA3481680f87", + "vestAmount": 57564 + }, + { + "proxy": "0x0dfE829D9c4aEE47d575D2d8360cFA5470ee649C", + "recipient": "0x7177844d5322a31775a30A23545f56bAcd96b4c5", + "vestAmount": 2987654 + }, + { + "proxy": "0x0B9cc0d4f8F24E184Acd63AD41049b74E37B1336", + "recipient": "0x71e18C339795799fE56AaF3d5c9BD4dc93bE2842", + "vestAmount": 55498 + }, + { + "proxy": "0x73d773a39f1fBcDea9a507F18920C232109AD937", + "recipient": "0x72AD836ce0E262c3BD26F4ACc9F3D4Ece016467B", + "vestAmount": 952320 + }, + { + "proxy": "0x3E9B482b91BF5C8e633cCf8DdF6f502353E41401", + "recipient": "0x79B9EA7391614996D8FA6685a6f7b0cD42d20005", + "vestAmount": 1934928 + }, + { + "proxy": "0x1323833A0E7cffA19E5Ffe9627d5408e10D585C7", + "recipient": "0x81abBCCCF44B3102C0cD8159C1AB8B295849Df23", + "vestAmount": 537289 + }, + { + "proxy": "0xb89Af25B6e4Dd2dE0c7fc3cf4830bC2160C05DBe", + "recipient": "0x8271Ad10f05cE0e6386345C626F562531E993980", + "vestAmount": 2456789 + }, + { + "proxy": "0x7e00954241463fdEF08772403a24cc49746DC2C4", + "recipient": "0x84111cC3680c6E49F523931D91a66fE096e0e3F9", + "vestAmount": 338862 + }, + { + "proxy": "0xba1c1B16250345b2287A95B89714271960fE1436", + "recipient": "0x8Aca37F5E1CD1b04062D7e223E6ca12f83252010", + "vestAmount": 1315846 + }, + { + "proxy": "0x4D0C031173b97354c9A4481b3b992B853762F207", + "recipient": "0x90D6f6b7C3884989d8bC7C3A3b48c99E15064D19", + "vestAmount": 4719305 + }, + { + "proxy": "0xc1fC85dD478A151d841D7f0b5D0123c506EfF4D2", + "recipient": "0x93b7d75157B4642C13C8d597211d6eBEC4DdCA9a", + "vestAmount": 1294962 + }, + { + "proxy": "0xb4a1629794cb81733fC2e6686F5efdc158AC10dF", + "recipient": "0x97A8386BA97aAd10a721e81Db40C7a15DE9AB38d", + "vestAmount": 390097 + }, + { + "proxy": "0x558F2AFe2b503A80211A403978306D4803e0572D", + "recipient": "0x9aC84504eC5a11272e0AFf0250Dc3a0fDe38077B", + "vestAmount": 1044237 + }, + { + "proxy": "0x06Dc1A8DF03A37407461a5556FF616CcE74cCa52", + "recipient": "0x9c7A1909d8d85E3B127e722F6285AE82d42F50Fe", + "vestAmount": 2878901 + }, + { + "proxy": "0xafd91993D759e054d83C727C997915F711346b5f", + "recipient": "0xA5947589a26a6fF0940199dC6E9c1D5fBDEFEF82", + "vestAmount": 2046201 + }, + { + "proxy": "0xae262EAa17023Eb96Ca2e8dd7ac5F2Ffc2cdB39c", + "recipient": "0xAfad04eee0d3A2cc731173BD9Ab6c9C8ff7a2abe", + "vestAmount": 2360444 + }, + { + "proxy": "0xfcBaB371E7f8E78481E5aFd142904d26ef9Bb16D", + "recipient": "0xB33c01Ee9a0F9bBCa09aABef9475736Aadf87607", + "vestAmount": 3456789 + }, + { + "proxy": "0xf540Eb805E0F09F062fd2D8d4b5dc050698804C5", + "recipient": "0xbc003292cdd3E96614B21a262623b2C7670588E6", + "vestAmount": 2123456 + }, + { + "proxy": "0x9e69720b63F6A8A594E95979c765204C49f4B55e", + "recipient": "0xBe8683952A47717c1677b0eF2fCd780437d8358A", + "vestAmount": 115129 + }, + { + "proxy": "0x48C77361a550639c0232f75D258C5D0cAE0f786a", + "recipient": "0xc371426148b3Fb1FBE74eff7077C71403bEd3EbA", + "vestAmount": 1876543 + }, + { + "proxy": "0x000211eCC56999E716A414A2F7A5e70546B6bAAf", + "recipient": "0xCA3B8F422e22DCE4bAac134adb959BcdfC7E158f", + "vestAmount": 57564 + }, + { + "proxy": "0xB4764CdE7DD138e34Dc3f5D504df8CCabB6702D7", + "recipient": "0xCdd8f9696a8AD5036b3f2E818Efde8C53d69FC66", + "vestAmount": 2654321 + }, + { + "proxy": "0x0446f327325b74674D2FEdcaD7E4C96429061E19", + "recipient": "0xCE1614f1239dDE0c3D79386e89B6717A5a683bEB", + "vestAmount": 6541233 + }, + { + "proxy": "0xbb2D2930dc45541B882a6adaF7cf8b65Fa57991C", + "recipient": "0xe64f8aae6f57773eeb73d722fac8a59c620c6ed8", + "vestAmount": 171254 + }, + { + "proxy": "0xd662E7261235A031629eDa276ac3D752e762b8C1", + "recipient": "0xe7c66e440EdC9E3fb6c022224f6F5f5E0B294DEb", + "vestAmount": 1234567 + }, + { + "proxy": "0xb856E58D783b61b3EbD1f529AD2dA01560D0F1E2", + "recipient": "0xe870eFf00F9f2535b44e019f630bdF86990165de", + "vestAmount": 2345679 + }, + { + "proxy": "0x15ab53180D3996b35Ec0D7E274D2C7174e0Fb71A", + "recipient": "0xEafC539906f78dFab80F0f9934cbD44b85E0F009", + "vestAmount": 69077 + }, + { + "proxy": "0x492032F457b2Ccc7fde39c7325fda94ca590a09f", + "recipient": "0xee28eda7f55d67f691b188bb951ecde41560bab4", + "vestAmount": 293578 + }, + { + "proxy": "0x1eA405a8dbE04e6A2338473Bf2379b44391730fc", + "recipient": "0xeFD98C15B79031FE813aF21c707D344a68c8036c", + "vestAmount": 187391 + }, + { + "proxy": "0x98ef6BA6423Aaa9abD0780D21DCe4cE6872a0867", + "recipient": "0xF3c7A8AF7a807460b83f08ba96399C747707dAF8", + "vestAmount": 2134003 + }, + { + "proxy": "0xC144FCf7750426dFbad46EB7a14d5424584Ce4Fb", + "recipient": "0xf7E737Ec08e7152c32380f4FB2896B821D0542A6", + "vestAmount": 38376 + }, + { + "proxy": "0xC0F2516DC3174D9C1a5F02BEB6f9FE16e88ea2Fe", + "recipient": "0xF92b27de9ddfc9f3f8a0535fbdF2129fFcbc433b", + "vestAmount": 587157 + }, + { + "proxy": "0x67c52cda25B36fFf71A61819693BF8A4909aE436", + "recipient": "0xFa6f278dd30DDD4486cB384E236B0E17dC6D3bE6", + "vestAmount": 84722 + }, + { + "proxy": "0xd2601a20c2E8F5F1810b16E408c641d624b11aC2", + "recipient": "0x02331a72Fc3ADF8CAdC808BbE0D73B6D0044F439", + "vestAmount": 406507 + }, + { + "proxy": "0x5E6c193F25B83734f87918593E05d03675Fb3241", + "recipient": "0x02F23534F9DA649adC356fb18F63893fAc544158", + "vestAmount": 160003 + }, + { + "proxy": "0xEaaB2c7a21Bb8d6020adfBAf7b9cde409d340884", + "recipient": "0x07C1c2F5e5BD4319461E914b41B58CDCe8aEb4b3", + "vestAmount": 18761726 + }, + { + "proxy": "0x5E44E672BA19f947813CeEB12B04F7cC03E1843A", + "recipient": "0x094438c269efcf6f8cffb2bde4a889bb3d17d2a8", + "vestAmount": 156345 + }, + { + "proxy": "0x7Ed070524F12c2405AFc66b77118927993F3c15E", + "recipient": "0x0f63505173Fa24A4a752e08123153B879f665c57", + "vestAmount": 1094431 + }, + { + "proxy": "0x5B113b3B76fB00aE8868a5400ef0AeF9C091aDD3", + "recipient": "0x1C3E3fE0d28B22d64D76Ce30b8d51DCD9867a68a", + "vestAmount": 4264029 + }, + { + "proxy": "0xe3b5372bA89D07Dc80284e93B050a90D2910297A", + "recipient": "0x1F28F10176F89F4E9985873B84d14e75751BB3D1", + "vestAmount": 6085050 + }, + { + "proxy": "0xBcf79a834375E527024905C1FEE637c3f6F333F7", + "recipient": "0x220866b1a2219f40e72f5c628b65d54268ca3a9d", + "vestAmount": 852806 + }, + { + "proxy": "0xa35315c325131Ea6d0111cFD3476A5bcfd354aC6", + "recipient": "0x278887be139f325334e1dde087f28c4d525e7d59", + "vestAmount": 1918813 + }, + { + "proxy": "0xA78eCb16beA92bb2c8A33C231D65f430bf876895", + "recipient": "0x33Ee24a0398b8D02A562A308F4407CD93ee150d4", + "vestAmount": 1569197 + }, + { + "proxy": "0x57064365517a727D7250D14dAAe153EB1d8945bb", + "recipient": "0x399f2700CE8Ba81d10FE43C1D077365dC41017d4", + "vestAmount": 1870203 + }, + { + "proxy": "0xe84847bb619FcaeECcbCbAA05Fa343253c6BD726", + "recipient": "0x408505ec4bB812B9B649a653390a7b683CEa3D54", + "vestAmount": 196998 + }, + { + "proxy": "0x39007C8196B2b3dd83Edc3495AB40b6B4F8F7646", + "recipient": "0x4382AF750BA8a0dC2877F621e6BDF6523e33894c", + "vestAmount": 781741 + }, + { + "proxy": "0x95e4Acc3b6fb42e18bE53A03854097E4bf9a384D", + "recipient": "0x443Fd508c4992DdFACA64283975C5192dEEF6897", + "vestAmount": 1876173 + }, + { + "proxy": "0xf819370886418a277AF656B08aDa4498447276E4", + "recipient": "0x4492b21337F0664829A991DA4c8aa7E686e24A23", + "vestAmount": 3595992 + }, + { + "proxy": "0x37Dd6E027DC1cc3dCed44F71dC88C6F053850B87", + "recipient": "0x57e9210C7B2eaAA1fA9ef11e15AbB3e91d0103aC", + "vestAmount": 4406149 + }, + { + "proxy": "0x705B86fEC672A22D92aD89B54F00a347e2fB30cC", + "recipient": "0x67821e4e35d1E20c29a9Fb05748a7fe226cb142F", + "vestAmount": 156345 + }, + { + "proxy": "0x91E573Aec1c1997f1E979a6f5A5012097D6d952b", + "recipient": "0x6e0a1ddad894e6466d405bb73377f0a257278d74", + "vestAmount": 406507 + }, + { + "proxy": "0x07a7f8319fA8aA6cdc8B273255A517e6bB6a6Ce4", + "recipient": "0x713F619Ba5169a20B228901fe135c5d894f29E1F", + "vestAmount": 390866 + }, + { + "proxy": "0x12B860F2Bd797fB15270e16EC04DC4D14e176f2e", + "recipient": "0x74cf36eb5034e47974DB61D2a8EA6996cfD1e149", + "vestAmount": 234522 + }, + { + "proxy": "0x2CCB411B68aF29e5122b45A9c316A36d87Eef3Cb", + "recipient": "0x78DB576873F032A7C4749b214A8AF6966B3Be239", + "vestAmount": 1594747 + }, + { + "proxy": "0xA85F093474C081bC9FFA3784638727F57B28f656", + "recipient": "0x7F696B2D2f5ff70177E1a4c3BB76D3604aB0caEc", + "vestAmount": 272207 + }, + { + "proxy": "0x0e409A34aC3F9216BdA002Fb149A824F88213ce4", + "recipient": "0x7F73eF385FdAb454D5bfDa2d8b41C89D6e123cec", + "vestAmount": 465487 + }, + { + "proxy": "0xfb9ce64875BDC1a761Ddb51c2Aa642C204AA92BA", + "recipient": "0x839bBb11d3041359A4c43be9CB6A4AA22dDdcB1f", + "vestAmount": 781741 + }, + { + "proxy": "0x497f9F18EBDBb90193E51A4327Bc2B00f250577F", + "recipient": "0x84329866d00Ff90AEFC839A2bdFe5ce00d09cFdD", + "vestAmount": 312698 + }, + { + "proxy": "0xb11C0D761D6e164294A19D27b89E1d72D11E482B", + "recipient": "0x917c7EaEc939341014EAAE8cc024Cf81812bf852", + "vestAmount": 156345 + }, + { + "proxy": "0x38D8361e6F1585f5B37355E9d69A27e33d28b9A3", + "recipient": "0x92f39A77f57e20765F3F34C62A92BD3df312757D", + "vestAmount": 8528057 + }, + { + "proxy": "0xf98cd91ACd1c50d2793b5C0fA5e1f89f46cd1e09", + "recipient": "0x987f10f336b498d71B5e2cB22267712Bda141F96", + "vestAmount": 767525 + }, + { + "proxy": "0x2Da30e14dE6a5fcE16a5Ea72199De76cebDC876C", + "recipient": "0xf7a0cd60e3b6ab4523a5f54e9a410258895b138d", + "vestAmount": 4013867 + }, + { + "proxy": "0x38d0fECe1dC70DD8AbdCcF809C3C2DDC75643C9B", + "recipient": "0xA0E337be4b8A912be55DA9ad4CAA1fF7Ce1aF5aa", + "vestAmount": 781741 + }, + { + "proxy": "0x18F5B40B88deAa89B5126a0CeeD4BA9980828C09", + "recipient": "0xa397b03d905db7abebac9a21f5f3222e287784ea", + "vestAmount": 4264029 + }, + { + "proxy": "0x4a143794D7a4f9f5504F0997Ab7342dd1772fC42", + "recipient": "0xa4C81339127A50Dd607BAeda4fD4A7AE6e91A502", + "vestAmount": 469043 + }, + { + "proxy": "0xEFDA54D371f7115aeE324CdBf0C64c77b83755a5", + "recipient": "0xa61b8679D39A3e504840d3170ab802885BDd5Adf", + "vestAmount": 426403 + }, + { + "proxy": "0xC179213e60427ff1e0f716736115FD7A66D9C4cE", + "recipient": "0xa6EdC299f9CE65132093F3A1D73C94077E0aBD5A", + "vestAmount": 275175 + }, + { + "proxy": "0xFd44459f4a8514cf4767533e20f1Ca42039B342E", + "recipient": "0xA96c49B904922fEcCa1e7c82aa16A57F57eBe016", + "vestAmount": 312698 + }, + { + "proxy": "0x56CF6b3952606282eac95d7fD55818a3ae762e2D", + "recipient": "0xA9db645b9eE2B98372ccDa26C8eebf347c880E40", + "vestAmount": 312698 + }, + { + "proxy": "0x380B8da34766F6832d22B1684B9CE9170dE13351", + "recipient": "0xaBb44CF55E2432a230A9B2f4c829e2Ec0c55E888", + "vestAmount": 156345 + }, + { + "proxy": "0xED8aF5Beb21A80a9d34D0268D24fbB81B0223248", + "recipient": "0xae68433B53902512F46C1F3983e5CD92b593884F", + "vestAmount": 2345216 + }, + { + "proxy": "0xE4d0D3A0EF348baace39C7FAea7eDcF7ac394E9c", + "recipient": "0xAf9f957827083c7e5aeA1537BCE1C8524f9Ba533", + "vestAmount": 409628 + }, + { + "proxy": "0x4d0c7Df23Dcc4DB0C2cBa5d1e933c0b22E0e5b5d", + "recipient": "0xb39f7e1D1137BFeaf80836a1eFBbFF1ab43abf27", + "vestAmount": 2558417 + }, + { + "proxy": "0x8238bE2711c02B5CEdC161Cba94aB494dbc3fe29", + "recipient": "0xb45893511573Ff6A693759CbcA5162300550a35c", + "vestAmount": 406507 + }, + { + "proxy": "0x3858DD901cBa69ced85B168e3BF7C847BFEa31cB", + "recipient": "0xb601F9Cd345BFA714E1b9B6BB9835e8013e4FD99", + "vestAmount": 156345 + }, + { + "proxy": "0x0B80540FC0083a56E3856F3fa3F29384a17e72f4", + "recipient": "0xb826224b742ead5cf91ea432340e3763fac09cdd", + "vestAmount": 406507 + }, + { + "proxy": "0xC7C91c6c0483321F0fe28BC8aCDdFCB0bd782c3F", + "recipient": "0xB8f18645723f2B09fC951b90CCF25bB1C5AE1729", + "vestAmount": 13736431 + }, + { + "proxy": "0x081e2656DDF88ecE61F1cb9cFc4F76Ca6A0B9633", + "recipient": "0xB976fEA31067a94Be59c9378Cd0d06F52B939f3F", + "vestAmount": 4264029 + }, + { + "proxy": "0x97c82462b0FE23C629Fa6a866298aB640eC24F9c", + "recipient": "0xbCe472BcACf391E3423a16b75e0C3652e624A903", + "vestAmount": 852806 + }, + { + "proxy": "0xaFa63d505286803890f8De43D9f30aAC089b25D8", + "recipient": "0xBD525cFe28cf0d3313028066dCd239650b71e5FE", + "vestAmount": 781741 + }, + { + "proxy": "0xC9fe0C30469CA4F9BA44D85010b692d361eD82f1", + "recipient": "0xC319a9E5607F2406C2ADB844868c1C8a0fC19690", + "vestAmount": 5240773 + }, + { + "proxy": "0xeD0fE496640866DC5BCb74cD29dEa85428342CCE", + "recipient": "0xe30d11D319Be10e8e759B9d1472BB03e4DdB933f", + "vestAmount": 4264029 + }, + { + "proxy": "0xBaf6D3ccE04E95DB01bEBd66F7E3De62427Ea577", + "recipient": "0xeBd6eF43d35892d8686f294ac9550C68860D1a0d", + "vestAmount": 475303 + }, + { + "proxy": "0xEd788885b0CdD78CFDbBEC1bd96F03eFA61621fb", + "recipient": "0xf45F391DB05810a435E74dFaa9503eC29CB4C2eC", + "vestAmount": 781741 + }, + { + "proxy": "0xAd7a3867a790D38F16e485f3DB074ad069FC5c1C", + "recipient": "0xf7E737Ec08e7152c32380f4FB2896B821D0542A6", + "vestAmount": 739101 + }, + { + "proxy": "0x4CE8E8bB4ea26cabe32C5B9100Ee9eD6759C58CB", + "recipient": "0xFc207A04ff27D0865c9879f4F84B82c5a0753989", + "vestAmount": 234522 + }, + { + "proxy": "0x2Bc21D70BDe29a8E6576F7aCD979029058f2eeF9", + "recipient": "0x841F98C82Df7Eb6107a7b6A0e9Ab054a01819428", + "vestAmount": 2439024 + } +] diff --git a/packages/protocol/script/layer2/DeployDelegateOwner.s.sol b/packages/protocol/script/layer2/DeployDelegateOwner.s.sol new file mode 100644 index 00000000000..935686fb00c --- /dev/null +++ b/packages/protocol/script/layer2/DeployDelegateOwner.s.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "test/shared/DeployCapability.sol"; +import "src/layer2/DelegateOwner.sol"; + +// forge script --rpc-url https://rpc.mainnet.taiko.xyz script/DeployDelegateOwner.s.sol +contract DeployDelegateOwner is DeployCapability { + address public l2Sam = 0x1670000000000000000000000000000000000006; + address public testAccount2 = 0x3c181965C5cFAE61a9010A283e5e0C1445649810; + + address public l1Owner = testAccount2; + address public l2Admin = testAccount2; + + modifier broadcast() { + vm.startBroadcast(); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + deployProxy({ + name: "delegate_owner", + impl: address(new DelegateOwner()), + data: abi.encodeCall(DelegateOwner.init, (l1Owner, l2Sam, 1, l2Admin)) + }); + } +} diff --git a/packages/protocol/script/L2PostGenesisConfig.s.sol b/packages/protocol/script/layer2/PostGenesisConfig.s.sol similarity index 94% rename from packages/protocol/script/L2PostGenesisConfig.s.sol rename to packages/protocol/script/layer2/PostGenesisConfig.s.sol index 56beda16071..28254de3ef7 100644 --- a/packages/protocol/script/L2PostGenesisConfig.s.sol +++ b/packages/protocol/script/layer2/PostGenesisConfig.s.sol @@ -1,20 +1,20 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/Script.sol"; import "forge-std/src/console2.sol"; -import "../contracts/tokenvault/ERC20Vault.sol"; -import "../contracts/bridge/Bridge.sol"; -import "../contracts/common/AddressManager.sol"; +import "src/shared/tokenvault/ERC20Vault.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/common/AddressManager.sol"; interface USDCProxy { function configureMinter(address minter, uint256 minterAllowedAmount) external; } // Run with: -// forge script --rpc-url https://rpc.mainnet.taiko.xyz script/L2PostGenesisConfig.s.sol -contract L2PostGenesisConfig is Script { +// forge script --rpc-url https://rpc.mainnet.taiko.xyz script/PostGenesisConfig.s.sol +contract PostGenesisConfig is Script { // All following addresses are L2 addresses address public bridgedTKO = 0xA9d23408b9bA935c230493c40C73824Df71A0975; address public bridgedUSDC = 0x07d83526730c7438048D55A4fc0b850e2aaB6f0b; diff --git a/packages/protocol/script/L2PostGenesisQuery.s.sol b/packages/protocol/script/layer2/PostGenesisQuery.s.sol similarity index 93% rename from packages/protocol/script/L2PostGenesisQuery.s.sol rename to packages/protocol/script/layer2/PostGenesisQuery.s.sol index 23eac73209b..906e0961dff 100644 --- a/packages/protocol/script/L2PostGenesisQuery.s.sol +++ b/packages/protocol/script/layer2/PostGenesisQuery.s.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/common/AddressManager.sol"; -import "../contracts/bridge/Bridge.sol"; +import "test/shared/DeployCapability.sol"; +import "src/shared/common/AddressManager.sol"; +import "src/shared/bridge/Bridge.sol"; // Run with: -// forge script --rpc-url https://rpc.mainnet.taiko.xyz script/L2PostGenesisQuery.s.sol -contract L2PostGenesisQuery is DeployCapability { +// forge script --rpc-url https://rpc.mainnet.taiko.xyz script/PostGenesisQuery.s.sol +contract PostGenesisQuery is DeployCapability { uint64 taiko_id = 167_000; function run() external view { diff --git a/packages/protocol/script/layer2/UpdateMainnetOntakeL2.s.sol b/packages/protocol/script/layer2/UpdateMainnetOntakeL2.s.sol new file mode 100644 index 00000000000..d578b827771 --- /dev/null +++ b/packages/protocol/script/layer2/UpdateMainnetOntakeL2.s.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "test/shared/DeployCapability.sol"; +import "src/layer2/mainnet/MainnetTaikoL2.sol"; + +contract UpgradeMainnetOntakeL2 is DeployCapability { + uint256 public privateKey = vm.envUint("PRIVATE_KEY"); + + modifier broadcast() { + require(privateKey != 0, "invalid private key"); + vm.startBroadcast(privateKey); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + // MainnetTaikoL2 + console2.log(address(new MainnetTaikoL2())); + } +} diff --git a/packages/protocol/script/merge_contracts.py b/packages/protocol/script/merge_contracts.py deleted file mode 100644 index 7722d5d5ebd..00000000000 --- a/packages/protocol/script/merge_contracts.py +++ /dev/null @@ -1,27 +0,0 @@ -import os -import argparse - -def merge_solidity_files(root_dir, output_file='../out/taiko_protocol.md'): - with open(output_file, 'w') as outfile: - for subdir, dirs, files in os.walk(root_dir): - for file in files: - if file.endswith('.sol') and not file.endswith('.t.sol'): - file_path = os.path.join(subdir, file) - if "/test/" in file_path: - continue - print("merging ", file_path) - relative_path = os.path.relpath(file_path, root_dir) - outfile.write(f"## {relative_path}\n") - outfile.write("```solidity\n") - with open(file_path, 'r') as infile: - outfile.write(infile.read()) - outfile.write("\n```\n\n") - - -if __name__ == "__main__": - # parser = argparse.ArgumentParser(description="Merge Solidity files into a Markdown file.") - # parser.add_argument("root_dir", type=str, help="Root directory containing Solidity files") - # args = parser.parse_args() - # merge_solidity_files(args.root_dir) - merge_solidity_files("../contracts") - print("merged into ../out/taiko_protocol.md") diff --git a/packages/protocol/script/AuthorizeTaikoForMultihop.s.sol b/packages/protocol/script/shared/AuthorizeTaikoForMultihop.s.sol similarity index 85% rename from packages/protocol/script/AuthorizeTaikoForMultihop.s.sol rename to packages/protocol/script/shared/AuthorizeTaikoForMultihop.s.sol index 322d83de801..ffb76b79516 100644 --- a/packages/protocol/script/AuthorizeTaikoForMultihop.s.sol +++ b/packages/protocol/script/shared/AuthorizeTaikoForMultihop.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/signal/SignalService.sol"; +import "test/shared/DeployCapability.sol"; +import "src/shared/signal/SignalService.sol"; contract AuthorizeTaikoForMultihop is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/SetAddress.s.sol b/packages/protocol/script/shared/SetAddress.s.sol similarity index 92% rename from packages/protocol/script/SetAddress.s.sol rename to packages/protocol/script/shared/SetAddress.s.sol index a1e18a4796e..701fc32d9aa 100644 --- a/packages/protocol/script/SetAddress.s.sol +++ b/packages/protocol/script/shared/SetAddress.s.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/Script.sol"; import "forge-std/src/console2.sol"; -import "../contracts/common/AddressManager.sol"; +import "src/shared/common/AddressManager.sol"; contract SetAddress is Script { uint256 public adminPrivateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/SetRemoteBridgeSuites.s.sol b/packages/protocol/script/shared/SetRemoteBridgeSuites.s.sol similarity index 97% rename from packages/protocol/script/SetRemoteBridgeSuites.s.sol rename to packages/protocol/script/shared/SetRemoteBridgeSuites.s.sol index 2b757fb61f5..91734516a9d 100644 --- a/packages/protocol/script/SetRemoteBridgeSuites.s.sol +++ b/packages/protocol/script/shared/SetRemoteBridgeSuites.s.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; +import "test/shared/DeployCapability.sol"; contract SetRemoteBridgeSuites is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/test_deploy_on_l1.sh b/packages/protocol/script/test_deploy_on_l1.sh deleted file mode 100755 index c4df51742f9..00000000000 --- a/packages/protocol/script/test_deploy_on_l1.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/sh - -# This script is only used by `pnpm test:deploy`. -set -e - -export PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 -PROPOSER=0x0000000000000000000000000000000000000000 \ -TAIKO_TOKEN=0x0000000000000000000000000000000000000000 \ -PROPOSER_ONE=0x0000000000000000000000000000000000000000 \ -GUARDIAN_PROVERS="0x1000777700000000000000000000000000000001,0x1000777700000000000000000000000000000002,0x1000777700000000000000000000000000000003,0x1000777700000000000000000000000000000004,0x1000777700000000000000000000000000000005,0x1000777700000000000000000000000000000006,0x1000777700000000000000000000000000000007" \ -TAIKO_L2_ADDRESS=0x1000777700000000000000000000000000000001 \ -L2_SIGNAL_SERVICE=0x1000777700000000000000000000000000000007 \ -CONTRACT_OWNER=0x60997970C51812dc3A010C7d01b50e0d17dc79C8 \ -PROVER_SET_ADMIN=0x60997970C51812dc3A010C7d01b50e0d17dc79C8 \ -TAIKO_TOKEN_PREMINT_RECIPIENT=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ -TAIKO_TOKEN_NAME="Taiko Token Katla" \ -TAIKO_TOKEN_SYMBOL=TTKOk \ -SHARED_ADDRESS_MANAGER=0x0000000000000000000000000000000000000000 \ -L2_GENESIS_HASH=0xee1950562d42f0da28bd4550d88886bc90894c77c9c9eaefef775d4c8223f259 \ -PAUSE_TAIKO_L1=true \ -PAUSE_BRIDGE=true \ -NUM_MIN_MAJORITY_GUARDIANS=7 \ -NUM_MIN_MINORITY_GUARDIANS=2 \ -TIER_PROVIDER="devnet" \ -forge script script/DeployOnL1.s.sol:DeployOnL1 \ - --fork-url http://localhost:8545 \ - --broadcast \ - --ffi \ - -vvvv \ - --private-key $PRIVATE_KEY \ - --block-gas-limit 100000000 - -export PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 -SECURITY_COUNCIL=0x60997970C51812dc3A010C7d01b50e0d17dc79C8 \ -TAIKO_TOKEN_PREMINT_RECIPIENT=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ -TAIKO_TOKEN_NAME="Taiko Token" \ -TAIKO_TOKEN_SYMBOL=TTKO \ -forge script script/DeployTaikoToken.s.sol:DeployTaikoToken \ - --fork-url http://localhost:8545 \ - --broadcast \ - --ffi \ - -vvvv \ - --private-key $PRIVATE_KEY \ - --block-gas-limit 100000000 diff --git a/packages/protocol/script/tokenunlock/Vest.s.sol b/packages/protocol/script/tokenunlock/Vest.s.sol deleted file mode 100644 index 261bb205947..00000000000 --- a/packages/protocol/script/tokenunlock/Vest.s.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; - -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "../../contracts/team/tokenunlock/TokenUnlock.sol"; - -contract VestTokenUnlock is Script { - using stdJson for string; - - struct VestingItem { - address recipient; - address proxy; - uint256 vestAmount; - } - - ERC20 private tko = ERC20(0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800); - - function run() external { - vm.startBroadcast(); - - string memory path = "/script/tokenunlock/Vest.data.json"; - VestingItem[] memory items = abi.decode( - vm.parseJson(vm.readFile(string.concat(vm.projectRoot(), path))), (VestingItem[]) - ); - - for (uint256 i; i < items.length; i++) { - if (items[i].vestAmount != 0) { - address proxy = items[i].proxy; - console2.log("proxy. :", proxy); - console2.log("grantee:", items[i].recipient); - console2.log("vested :", items[i].vestAmount); - - require(TokenUnlock(proxy).owner() == msg.sender, "msg.sender not owner"); - require( - TokenUnlock(proxy).recipient() == items[i].recipient, "inconsistent recipient" - ); - - uint128 vestAmount = uint128(items[i].vestAmount * 1e18); - require(tko.balanceOf(msg.sender) >= vestAmount, "insufficient TKO balance"); - - tko.approve(proxy, vestAmount); - TokenUnlock(proxy).vest(vestAmount); - - console2.log("Vested!\n"); - } - } - - vm.stopBroadcast(); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol b/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol deleted file mode 100644 index c62a98e6035..00000000000 --- a/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/common/AddressManager.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeAddressManager is UpgradeScript { - function run() external setUp { - upgrade("AddressManager", address(new AddressManager())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeAssignmentHook.s.sol b/packages/protocol/script/upgrade/UpgradeAssignmentHook.s.sol deleted file mode 100644 index 6532fd8278a..00000000000 --- a/packages/protocol/script/upgrade/UpgradeAssignmentHook.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/L1/hooks/AssignmentHook.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeAssignmentHook is UpgradeScript { - function run() external setUp { - upgrade("AssignmentHook", address(new AssignmentHook())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeBridge.s.sol b/packages/protocol/script/upgrade/UpgradeBridge.s.sol deleted file mode 100644 index 37459f216e8..00000000000 --- a/packages/protocol/script/upgrade/UpgradeBridge.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/bridge/Bridge.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeBridge is UpgradeScript { - function run() external setUp { - upgrade("Bridge", address(new Bridge())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol b/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol deleted file mode 100644 index 5813f4e58cc..00000000000 --- a/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/tokenvault/ERC1155Vault.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeERC1155Vault is UpgradeScript { - function run() external setUp { - upgrade("ERC1155Vault", address(new ERC1155Vault())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol b/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol deleted file mode 100644 index 33a65c20e02..00000000000 --- a/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/tokenvault/ERC20Vault.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeERC20Vault is UpgradeScript { - function run() external setUp { - upgrade("ERC20Vault", address(new ERC20Vault())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol b/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol deleted file mode 100644 index 84cbdcaf9eb..00000000000 --- a/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/tokenvault/ERC721Vault.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeERC721Vault is UpgradeScript { - function run() external setUp { - upgrade("ERC721Vault", address(new ERC721Vault())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeGuardianProver.s.sol b/packages/protocol/script/upgrade/UpgradeGuardianProver.s.sol deleted file mode 100644 index e86523e49d0..00000000000 --- a/packages/protocol/script/upgrade/UpgradeGuardianProver.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/L1/provers/GuardianProver.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeGuardianProver is UpgradeScript { - function run() external setUp { - upgrade("GuardianProver", address(new GuardianProver())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeScript.s.sol b/packages/protocol/script/upgrade/UpgradeScript.s.sol deleted file mode 100644 index 3a5d70c18e1..00000000000 --- a/packages/protocol/script/upgrade/UpgradeScript.s.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; - -import "forge-std/src/console2.sol"; -import "forge-std/src/Script.sol"; - -contract UpgradeScript is Script { - uint256 public privateKey = vm.envUint("PRIVATE_KEY"); - address public proxyAddress = vm.envAddress("PROXY_ADDRESS"); - - UUPSUpgradeable proxy; - - modifier setUp() { - require(privateKey != 0, "PRIVATE_KEY not set"); - require(proxyAddress != address(0), "PROXY_ADDRESS not set"); - - proxy = UUPSUpgradeable(payable(proxyAddress)); - vm.startBroadcast(privateKey); - - _; - - vm.stopBroadcast(); - } - - function upgrade(string memory name, address newImpl) public { - console2.log("Upgrading", name, proxyAddress); - proxy.upgradeTo(newImpl); - console2.log("Upgraded", proxyAddress, "to", newImpl); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeSignalService.s.sol b/packages/protocol/script/upgrade/UpgradeSignalService.s.sol deleted file mode 100644 index 258b8a8add5..00000000000 --- a/packages/protocol/script/upgrade/UpgradeSignalService.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/signal/SignalService.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeSignalService is UpgradeScript { - function run() external setUp { - upgrade("SignalService", address(new SignalService())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol b/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol deleted file mode 100644 index 6f9b7bfd5be..00000000000 --- a/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/L1/TaikoL1.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeTaikoL1 is UpgradeScript { - function run() external setUp { - upgrade("TaikoL1", address(new TaikoL1())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeTierProvider.s.sol b/packages/protocol/script/upgrade/UpgradeTierProvider.s.sol deleted file mode 100644 index 1d9d858af8b..00000000000 --- a/packages/protocol/script/upgrade/UpgradeTierProvider.s.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../test/DeployCapability.sol"; -import "../../test/L1/TestTierProvider.sol"; - -contract UpgradeTierProvider is DeployCapability { - uint256 public privateKey = vm.envUint("PRIVATE_KEY"); - address public addressManager = vm.envAddress("ADDRESS_MANAGER_ADDRESS"); - - function run() external { - vm.startBroadcast(privateKey); - address impl = address(new TestTierProvider()); - AddressManager(addressManager).setAddress(uint64(block.chainid), "tier_provider", impl); - vm.stopBroadcast(); - console2.log("> tier_provider@", addressManager); - console2.log("\t addr : ", impl); - } -} diff --git a/packages/protocol/script/upgrade_to.sh b/packages/protocol/script/upgrade_to.sh deleted file mode 100755 index 59c920490ff..00000000000 --- a/packages/protocol/script/upgrade_to.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -set -e -: "${FORK_URL:=http://localhost:8545}" - -forge script script/upgrade/Upgrade$CONTRACT.s.sol:Upgrade$CONTRACT \ - --fork-url $FORK_URL \ - -vvvvv \ - --broadcast \ - --ffi \ diff --git a/packages/protocol/test/L1/TaikoL1TestGroup6.t.sol b/packages/protocol/test/L1/TaikoL1TestGroup6.t.sol deleted file mode 100644 index 012f7321f36..00000000000 --- a/packages/protocol/test/L1/TaikoL1TestGroup6.t.sol +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "./TaikoL1TestGroupBase.sol"; - -contract TaikoL1TestGroup6 is TaikoL1TestGroupBase { - // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block within the proving window, using the correct parent hash. - // 3. Taylor contests Bob's proof. - // 4. Bob re-proves his proof, showing Taylor is incorrect. - // 5. Bob's proof is validated and used to verify the block. - function test_taikoL1_group_6_case_1() external { - vm.warp(1_000_000); - - giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); - giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); - - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); - - console2.log("====== Bob proves the block as the assigned prover"); - bytes32 parentHash = GENESIS_BLOCK_HASH; - bytes32 blockHash = bytes32(uint256(10)); - bytes32 stateRoot = bytes32(uint256(11)); - - mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); - - console2.log("====== Taylor contests Bob"); - bytes32 blockHash2 = bytes32(uint256(20)); - bytes32 stateRoot2 = bytes32(uint256(21)); - mineAndWrap(10 seconds); - proveBlock(Taylor, meta, parentHash, blockHash2, stateRoot2, meta.minTier, ""); - - console2.log("====== Bob cannot proves himself is right"); - mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_SGX, ""); - - { - printBlockAndTrans(meta.id); - - TaikoData.Block memory blk = L1.getBlock(meta.id); - assertEq(blk.nextTransitionId, 2); - assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); - - TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); - assertEq(ts.blockHash, blockHash); - assertEq(ts.stateRoot, stateRoot); - assertEq(ts.tier, LibTiers.TIER_SGX); - assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero - assertEq(ts.validityBond, tierSgx.validityBond); - assertEq(ts.prover, Bob); - assertEq(ts.timestamp, block.timestamp); // not zero - - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); - assertEq( - tko.balanceOf(Bob), 10_000 ether - tierSgx.validityBond + tierOp.contestBond * 7 / 8 - ); - } - - console2.log("====== Verify the block"); - mineAndWrap(7 days); - verifyBlock(1); - { - printBlockAndTrans(meta.id); - - TaikoData.Block memory blk = L1.getBlock(meta.id); - - assertEq(blk.nextTransitionId, 2); - assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); - - TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); - assertEq(ts.blockHash, blockHash); - assertEq(ts.stateRoot, stateRoot); - assertEq(ts.tier, LibTiers.TIER_SGX); - assertEq(ts.contestBond, 1); - assertEq(ts.prover, Bob); - - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); - assertEq(tko.balanceOf(Bob), 10_000 ether + tierOp.contestBond * 7 / 8); - } - } -} diff --git a/packages/protocol/test/L2/Lib1559Math.t.sol b/packages/protocol/test/L2/Lib1559Math.t.sol deleted file mode 100644 index a4d275d26be..00000000000 --- a/packages/protocol/test/L2/Lib1559Math.t.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../TaikoTest.sol"; - -contract TestLib1559Math is TaikoTest { - using LibMath for uint256; - - function test_eip1559_math() external pure { - LibL2Config.Config memory config = LibL2Config.get(); - uint256 adjustmentFactor = config.gasTargetPerL1Block * config.basefeeAdjustmentQuotient; - - uint256 baseFee; - uint256 i; - uint256 target = 0.01 gwei; - - for (uint256 k; k < 5; ++k) { - for (; baseFee < target; ++i) { - baseFee = Lib1559Math.basefee(config.gasTargetPerL1Block * i, adjustmentFactor); - } - console2.log("base fee:", baseFee); - console2.log(" gasExcess:", config.gasTargetPerL1Block * i); - console2.log(" i:", i); - target *= 10; - } - } - - function test_eip1559_math_max() external pure { - LibL2Config.Config memory config = LibL2Config.get(); - uint256 adjustmentFactor = config.gasTargetPerL1Block * config.basefeeAdjustmentQuotient; - - uint256 gasExcess = type(uint64).max; - uint256 baseFee = Lib1559Math.basefee(gasExcess, adjustmentFactor); - - console2.log("base fee (gwei):", baseFee / 1 gwei); - console2.log(" gasExcess:", gasExcess); - } -} diff --git a/packages/protocol/test/L2/TaikoL2.t.sol b/packages/protocol/test/L2/TaikoL2.t.sol deleted file mode 100644 index 3665c3cf43a..00000000000 --- a/packages/protocol/test/L2/TaikoL2.t.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../TaikoTest.sol"; - -contract SkipBasefeeCheckL2 is TaikoL2EIP1559Configurable { - function skipFeeCheck() public pure override returns (bool) { - return true; - } -} - -contract TestTaikoL2 is TaikoTest { - using SafeCast for uint256; - - // Initial salt for semi-random generation - uint256 salt = 2_195_684_615_435_261_315_311; - // same as `block_gas_limit` in foundry.toml - uint32 public constant BLOCK_GAS_LIMIT = 30_000_000; - - address public addressManager; - TaikoL2EIP1559Configurable public L2; - SkipBasefeeCheckL2 public L2skip; - - function setUp() public { - addressManager = deployProxy({ - name: "address_manager", - impl: address(new AddressManager()), - data: abi.encodeCall(AddressManager.init, (address(0))) - }); - - SignalService ss = SignalService( - deployProxy({ - name: "signal_service", - impl: address(new SignalService()), - data: abi.encodeCall(SignalService.init, (address(0), addressManager)), - registerTo: addressManager - }) - ); - - uint64 gasExcess = 0; - uint8 quotient = 8; - uint32 gasTarget = 60_000_000; - uint64 l1ChainId = 12_345; - - L2 = TaikoL2EIP1559Configurable( - payable( - deployProxy({ - name: "taiko", - impl: address(new TaikoL2EIP1559Configurable()), - data: abi.encodeCall( - TaikoL2.init, (address(0), addressManager, l1ChainId, gasExcess) - ), - registerTo: addressManager - }) - ) - ); - - L2.setConfigAndExcess(LibL2Config.Config(gasTarget, quotient), gasExcess); - - ss.authorize(address(L2), true); - - gasExcess = 195_420_300_100; - - vm.roll(block.number + 1); - vm.warp(block.timestamp + 30); - - vm.deal(address(L2), 100 ether); - } - - // calling anchor in the same block more than once should fail - function test_L2_AnchorTx_revert_in_same_block() external { - vm.fee(1); - - vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); - _anchor(BLOCK_GAS_LIMIT); - - vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); - vm.expectRevert(); // L2_PUBLIC_INPUT_HASH_MISMATCH - _anchor(BLOCK_GAS_LIMIT); - } - - // calling anchor in the same block more than once should fail - function test_L2_AnchorTx_revert_from_wrong_signer() external { - vm.fee(1); - vm.expectRevert(); - _anchor(BLOCK_GAS_LIMIT); - } - - function test_L2_AnchorTx_signing(bytes32 digest) external { - (uint8 v, uint256 r, uint256 s) = LibL2Signer.signAnchor(digest, uint8(1)); - address signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); - assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); - - (v, r, s) = LibL2Signer.signAnchor(digest, uint8(2)); - signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); - assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); - - vm.expectRevert(); - LibL2Signer.signAnchor(digest, uint8(0)); - - vm.expectRevert(); - LibL2Signer.signAnchor(digest, uint8(3)); - } - - function test_L2_withdraw() external { - vm.prank(L2.owner(), L2.owner()); - L2.withdraw(address(0), Alice); - assertEq(address(L2).balance, 0 ether); - assertEq(Alice.balance, 100 ether); - - // Random EOA cannot call withdraw - vm.expectRevert(); - vm.prank(Alice, Alice); - L2.withdraw(address(0), Alice); - } - - function test_L2_getBlockHash() external { - assertEq(L2.getBlockHash(uint64(1000)), 0); - } - - function _anchor(uint32 parentGasLimit) private { - bytes32 l1Hash = randBytes32(); - bytes32 l1StateRoot = randBytes32(); - L2.anchor(l1Hash, l1StateRoot, 12_345, parentGasLimit); - } -} diff --git a/packages/protocol/test/L2/TaikoL2EIP1559Configurable.sol b/packages/protocol/test/L2/TaikoL2EIP1559Configurable.sol deleted file mode 100644 index 69661686afd..00000000000 --- a/packages/protocol/test/L2/TaikoL2EIP1559Configurable.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../contracts/L2/TaikoL2.sol"; - -/// @title TaikoL2EIP1559Configurable -/// @notice TaikoL2 with a setter to change EIP-1559 configurations and states. -/// @custom:security-contact security@taiko.xyz -contract TaikoL2EIP1559Configurable is TaikoL2 { - /// @notice EIP-1559 configuration. - LibL2Config.Config public customConfig; - - uint256[49] private __gap; - - /// @notice Emits when the EIP-1559 configuration and gas excess are changed. - /// @param config The new EIP-1559 config. - /// @param gasExcess The new gas excess. - event ConfigAndExcessChanged(LibL2Config.Config config, uint64 gasExcess); - - error L2_INVALID_CONFIG(); - - /// @notice Sets EIP1559 configuration and gas excess. - /// @param _newConfig The new EIP1559 config. - /// @param _newGasExcess The new gas excess - function setConfigAndExcess( - LibL2Config.Config memory _newConfig, - uint64 _newGasExcess - ) - external - virtual - onlyOwner - { - if (_newConfig.gasTargetPerL1Block == 0) revert L2_INVALID_CONFIG(); - if (_newConfig.basefeeAdjustmentQuotient == 0) revert L2_INVALID_CONFIG(); - - customConfig = _newConfig; - gasExcess = _newGasExcess; - - emit ConfigAndExcessChanged(_newConfig, _newGasExcess); - } - - /// @inheritdoc TaikoL2 - function getConfig() public view override returns (LibL2Config.Config memory) { - return customConfig; - } -} diff --git a/packages/protocol/test/L2/TaikoL2NoFeeCheck.t.sol b/packages/protocol/test/L2/TaikoL2NoFeeCheck.t.sol deleted file mode 100644 index 6a10e25d6cf..00000000000 --- a/packages/protocol/test/L2/TaikoL2NoFeeCheck.t.sol +++ /dev/null @@ -1,201 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../TaikoTest.sol"; - -contract SkipBasefeeCheckL2 is TaikoL2EIP1559Configurable { - function skipFeeCheck() public pure override returns (bool) { - return true; - } -} - -contract TestTaikoL2NoFeeCheck is TaikoTest { - using SafeCast for uint256; - - // Initial salt for semi-random generation - uint256 salt = 2_195_684_615_435_261_315_311; - // same as `block_gas_limit` in foundry.toml - uint32 public constant BLOCK_GAS_LIMIT = 30_000_000; - - address public addressManager; - SkipBasefeeCheckL2 public L2; - - function setUp() public { - addressManager = deployProxy({ - name: "address_manager", - impl: address(new AddressManager()), - data: abi.encodeCall(AddressManager.init, (address(0))) - }); - - SignalService ss = SignalService( - deployProxy({ - name: "signal_service", - impl: address(new SignalService()), - data: abi.encodeCall(SignalService.init, (address(0), addressManager)), - registerTo: addressManager - }) - ); - - uint64 gasExcess = 0; - uint8 quotient = 8; - uint32 gasTarget = 60_000_000; - uint64 l1ChainId = 12_345; - - gasExcess = 195_420_300_100; - L2 = SkipBasefeeCheckL2( - payable( - deployProxy({ - name: "taiko", - impl: address(new SkipBasefeeCheckL2()), - data: abi.encodeCall( - TaikoL2.init, (address(0), addressManager, l1ChainId, gasExcess) - ), - registerTo: addressManager - }) - ) - ); - - L2.setConfigAndExcess(LibL2Config.Config(gasTarget, quotient), gasExcess); - - ss.authorize(address(L2), true); - - vm.roll(block.number + 1); - vm.warp(block.timestamp + 30); - } - - function test_L2_NoFeeCheck_simulation_lower_traffic() external { - console2.log("LOW TRAFFIC STARTS"); // For parser - _simulation(100_000, 10_000_000, 1, 8); - console2.log("LOW TRAFFIC ENDS"); - } - - function test_L2_NoFeeCheck_simulation_higher_traffic() external { - console2.log("HIGH TRAFFIC STARTS"); // For parser - _simulation(100_000, 120_000_000, 1, 8); - console2.log("HIGH TRAFFIC ENDS"); - } - - function test_L2_NoFeeCheck_simulation_target_traffic() external { - console2.log("TARGET TRAFFIC STARTS"); // For parser - _simulation(60_000_000, 0, 12, 0); - console2.log("TARGET TRAFFIC ENDS"); - } - - function _simulation( - uint256 minGas, - uint256 maxDiffToMinGas, - uint8 quickest, - uint8 maxDiffToQuickest - ) - internal - { - // We need to randomize the: - // - parent gas used (We should sometimes exceed 150.000.000 gas / 12 - // seconds (to simulate congestion a bit) !!) - // - the time we fire away an L2 block (anchor transaction). - // The rest is baked in. - // initial gas excess issued: 49954623777 (from eip1559_util.py) if we - // want to stick to the params of 10x Ethereum gas, etc. - - // This variables counts if we reached the 12seconds (L1) height, if so - // then resets the accumulated parent gas used and increments the L1 - // height number - uint8 accumulated_seconds = 0; - uint256 accumulated_parent_gas_per_l1_block = 0; - uint64 l1Height = uint64(block.number); - uint64 l1BlockCounter = 0; - uint64 maxL2BlockCount = 180; - uint256 allBaseFee = 0; - uint256 allGasUsed = 0; - uint256 newRandomWithoutSalt; - // Simulate 200 L2 blocks - for (uint256 i; i < maxL2BlockCount; ++i) { - newRandomWithoutSalt = uint256( - keccak256( - abi.encodePacked( - block.prevrandao, msg.sender, block.timestamp, i, newRandomWithoutSalt, salt - ) - ) - ); - - uint32 currentGasUsed; - if (maxDiffToMinGas == 0) { - currentGasUsed = uint32(minGas); - } else { - currentGasUsed = - uint32(pickRandomNumber(newRandomWithoutSalt, minGas, maxDiffToMinGas)); - } - salt = uint256(keccak256(abi.encodePacked(currentGasUsed, salt))); - accumulated_parent_gas_per_l1_block += currentGasUsed; - allGasUsed += currentGasUsed; - - uint8 currentTimeAhead; - if (maxDiffToQuickest == 0) { - currentTimeAhead = uint8(quickest); - } else { - currentTimeAhead = - uint8(pickRandomNumber(newRandomWithoutSalt, quickest, maxDiffToQuickest)); - } - accumulated_seconds += currentTimeAhead; - - if (accumulated_seconds >= 12) { - console2.log( - "Gas used per L1 block:", l1Height, ":", accumulated_parent_gas_per_l1_block - ); - l1Height++; - l1BlockCounter++; - accumulated_parent_gas_per_l1_block = 0; - accumulated_seconds = 0; - } - - vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); - _anchorSimulation(currentGasUsed, l1Height); - (uint256 currentBaseFee,) = L2.getBasefee(l1Height, currentGasUsed); - allBaseFee += currentBaseFee; - console2.log("Actual gas in L2 block is:", currentGasUsed); - console2.log("L2block to baseFee is:", i, ":", currentBaseFee); - vm.roll(block.number + 1); - - vm.warp(block.timestamp + currentTimeAhead); - } - - console2.log("Average wei gas price per L2 block is:", (allBaseFee / maxL2BlockCount)); - console2.log("Average gasUsed per L1 block:", (allGasUsed / l1BlockCounter)); - } - - function test_L2_NoFeeCheck_L2_AnchorTx_signing(bytes32 digest) external { - (uint8 v, uint256 r, uint256 s) = LibL2Signer.signAnchor(digest, uint8(1)); - address signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); - assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); - - (v, r, s) = LibL2Signer.signAnchor(digest, uint8(2)); - signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); - assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); - - vm.expectRevert(); - LibL2Signer.signAnchor(digest, uint8(0)); - - vm.expectRevert(); - LibL2Signer.signAnchor(digest, uint8(3)); - } - - // Semi-random number generator - function pickRandomNumber( - uint256 randomNum, - uint256 lowerLimit, - uint256 diffBtwLowerAndUpperLimit - ) - internal - view - returns (uint256) - { - randomNum = uint256(keccak256(abi.encodePacked(randomNum, salt))); - return (lowerLimit + (randomNum % diffBtwLowerAndUpperLimit)); - } - - function _anchorSimulation(uint32 parentGasLimit, uint64 l1Height) private { - bytes32 l1Hash = randBytes32(); - bytes32 l1StateRoot = randBytes32(); - L2.anchor(l1Hash, l1StateRoot, l1Height, parentGasLimit); - } -} diff --git a/packages/protocol/test/common/TestMulticall3.sol b/packages/protocol/test/common/TestMulticall3.sol deleted file mode 100644 index bc0620169b5..00000000000 --- a/packages/protocol/test/common/TestMulticall3.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @title Multicall3 -/// @notice Aggregate results from multiple function calls -/// @dev Multicall & Multicall2 backwards-compatible -/// @dev Aggregate methods are marked `payable` to save 24 gas per call -/// @author Michael Elliot -/// @author Joshua Levine -/// @author Nick Johnson -/// @author Andreas Bigger -/// @author Matt Solomon -contract TestMulticall3 { - struct Call3 { - address target; - bool allowFailure; - bytes callData; - } - - struct Result { - bool success; - bytes returnData; - } - - /// @notice Aggregate calls, ensuring each returns success if required - /// @param calls An array of Call3 structs - /// @return returnData An array of Result structs - function aggregate3(Call3[] calldata calls) - public - payable - returns (Result[] memory returnData) - { - uint256 length = calls.length; - returnData = new Result[](length); - Call3 calldata calli; - for (uint256 i = 0; i < length; ++i) { - Result memory result = returnData[i]; - calli = calls[i]; - (result.success, result.returnData) = calli.target.call(calli.callData); - assembly { - // Revert if the call fails and failure is not allowed - // `allowFailure := calldataload(add(calli, 0x20))` and `success := mload(result)` - if iszero(or(calldataload(add(calli, 0x20)), mload(result))) { - // set "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)"))) - mstore(0x00, 0x08c379a000000000000000000000000000000000000000000000000000000000) - // set data offset - mstore(0x04, 0x0000000000000000000000000000000000000000000000000000000000000020) - // set length of revert string - mstore(0x24, 0x0000000000000000000000000000000000000000000000000000000000000017) - // set revert string: bytes32(abi.encodePacked("Multicall3: call failed")) - mstore(0x44, 0x4d756c746963616c6c333a2063616c6c206661696c6564000000000000000000) - revert(0x00, 0x64) - } - } - } - } -} diff --git a/packages/protocol/genesis/GenerateGenesis.g.sol b/packages/protocol/test/genesis/GenerateGenesis.g.sol similarity index 92% rename from packages/protocol/genesis/GenerateGenesis.g.sol rename to packages/protocol/test/genesis/GenerateGenesis.g.sol index 52f77f2227c..78da0cd79fc 100644 --- a/packages/protocol/genesis/GenerateGenesis.g.sol +++ b/packages/protocol/test/genesis/GenerateGenesis.g.sol @@ -1,25 +1,25 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/console2.sol"; import "forge-std/src/StdJson.sol"; import "forge-std/src/Test.sol"; -import "../contracts/common/AddressManager.sol"; -import "../contracts/bridge/Bridge.sol"; -import "../contracts/tokenvault/ERC1155Vault.sol"; -import "../contracts/tokenvault/ERC20Vault.sol"; -import "../contracts/tokenvault/ERC721Vault.sol"; -import "../contracts/signal/SignalService.sol"; -import "../contracts/L2/TaikoL2.sol"; -import "../test/common/erc20/RegularERC20.sol"; +import "src/shared/common/AddressManager.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/tokenvault/ERC1155Vault.sol"; +import "src/shared/tokenvault/ERC20Vault.sol"; +import "src/shared/tokenvault/ERC721Vault.sol"; +import "src/shared/signal/SignalService.sol"; +import "src/layer2/based/TaikoL2.sol"; +import "../shared/token/RegularERC20.sol"; contract TestGenerateGenesis is Test, AddressResolver { using stdJson for string; string private configJSON = - vm.readFile(string.concat(vm.projectRoot(), "/deployments/genesis_config.json")); + vm.readFile(string.concat(vm.projectRoot(), "/test/genesis/data/genesis_config.json")); string private genesisAllocJSON = - vm.readFile(string.concat(vm.projectRoot(), "/deployments/genesis_alloc.json")); + vm.readFile(string.concat(vm.projectRoot(), "/test/genesis/data/genesis_alloc.json")); address private contractOwner = configJSON.readAddress(".contractOwner"); uint256 private l1ChainId = configJSON.readUint(".l1ChainId"); @@ -272,7 +272,11 @@ contract TestGenerateGenesis is Test, AddressResolver { assertEq(regularERC20.symbol(), "RGL"); } - function getPredeployedContractAddress(string memory contractName) private view returns (address) { + function getPredeployedContractAddress(string memory contractName) + private + view + returns (address) + { return configJSON.readAddress(string.concat(".contractAddresses.", contractName)); } @@ -284,20 +288,11 @@ contract TestGenerateGenesis is Test, AddressResolver { assertEq(address(contractAddress).code, vm.parseBytes(deployedCode)); } - function checkProxyImplementation( - string memory proxyName - ) - private - { - return checkProxyImplementation(proxyName, contractOwner); + function checkProxyImplementation(string memory proxyName) private { + return checkProxyImplementation(proxyName, contractOwner); } - function checkProxyImplementation( - string memory proxyName, - address owner - ) - private - { + function checkProxyImplementation(string memory proxyName, address owner) private { vm.startPrank(owner); // address contractAddress = getPredeployedContractAddress(contractName); address proxyAddress = getPredeployedContractAddress(proxyName); diff --git a/packages/protocol/test/genesis/data/genesis_config.js b/packages/protocol/test/genesis/data/genesis_config.js new file mode 100644 index 00000000000..df60b5b536f --- /dev/null +++ b/packages/protocol/test/genesis/data/genesis_config.js @@ -0,0 +1,61 @@ +"use strict"; +const ADDRESS_LENGTH = 40; + +module.exports = { + // Owner address of the pre-deployed L2 contracts. + contractOwner: "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", + l1ChainId: 1, + // Chain ID of the Taiko L2 network. + chainId: 167, + // Account address and pre-mint ETH amount as key-value pairs. + seedAccounts: [ + { "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39": 1000 }, + { "0x79fcdef22feed20eddacbb2587640e45491b757f": 1000 }, + ], + // Owner Chain ID, Security Council, and Timelock Controller + l1ChainId: 31337, + ownerSecurityCouncil: "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", + ownerTimelockController: "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", + get contractAddresses() { + return { + // ============ Implementations ============ + // Shared Contracts + BridgeImpl: getConstantAddress(`0${this.chainId}`, 1), + ERC20VaultImpl: getConstantAddress(`0${this.chainId}`, 2), + ERC721VaultImpl: getConstantAddress(`0${this.chainId}`, 3), + ERC1155VaultImpl: getConstantAddress(`0${this.chainId}`, 4), + SignalServiceImpl: getConstantAddress(`0${this.chainId}`, 5), + SharedAddressManagerImpl: getConstantAddress(`0${this.chainId}`, 6), + BridgedERC20Impl: getConstantAddress(`0${this.chainId}`, 10096), + BridgedERC721Impl: getConstantAddress(`0${this.chainId}`, 10097), + BridgedERC1155Impl: getConstantAddress(`0${this.chainId}`, 10098), + RegularERC20: getConstantAddress(`0${this.chainId}`, 10099), + // Rollup Contracts + TaikoL2Impl: getConstantAddress(`0${this.chainId}`, 10001), + RollupAddressManagerImpl: getConstantAddress(`0${this.chainId}`, 10002), + // ============ Proxies ============ + // Shared Contracts + Bridge: getConstantAddress(this.chainId, 1), + ERC20Vault: getConstantAddress(this.chainId, 2), + ERC721Vault: getConstantAddress(this.chainId, 3), + ERC1155Vault: getConstantAddress(this.chainId, 4), + SignalService: getConstantAddress(this.chainId, 5), + SharedAddressManager: getConstantAddress(this.chainId, 6), + // Rollup Contracts + TaikoL2: getConstantAddress(this.chainId, 10001), + RollupAddressManager: getConstantAddress(this.chainId, 10002), + }; + }, + // L2 EIP-1559 baseFee calculation related fields. + param1559: { + gasExcess: 1, + }, + // Option to pre-deploy an ERC-20 token. + predeployERC20: true, +}; + +function getConstantAddress(prefix, suffix) { + return `0x${prefix}${"0".repeat( + ADDRESS_LENGTH - String(prefix).length - String(suffix).length, + )}${suffix}`; +} diff --git a/packages/protocol/test/genesis/data/genesis_config.json b/packages/protocol/test/genesis/data/genesis_config.json new file mode 100644 index 00000000000..8d771d79b1b --- /dev/null +++ b/packages/protocol/test/genesis/data/genesis_config.json @@ -0,0 +1 @@ +{"contractOwner":"0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39","l1ChainId":31337,"chainId":167,"seedAccounts":[{"0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39":1000},{"0x79fcdef22feed20eddacbb2587640e45491b757f":1000}],"ownerSecurityCouncil":"0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39","ownerTimelockController":"0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39","contractAddresses":{"BridgeImpl":"0x0167000000000000000000000000000000000001","ERC20VaultImpl":"0x0167000000000000000000000000000000000002","ERC721VaultImpl":"0x0167000000000000000000000000000000000003","ERC1155VaultImpl":"0x0167000000000000000000000000000000000004","SignalServiceImpl":"0x0167000000000000000000000000000000000005","SharedAddressManagerImpl":"0x0167000000000000000000000000000000000006","BridgedERC20Impl":"0x0167000000000000000000000000000000010096","BridgedERC721Impl":"0x0167000000000000000000000000000000010097","BridgedERC1155Impl":"0x0167000000000000000000000000000000010098","RegularERC20":"0x0167000000000000000000000000000000010099","TaikoL2Impl":"0x0167000000000000000000000000000000010001","RollupAddressManagerImpl":"0x0167000000000000000000000000000000010002","Bridge":"0x1670000000000000000000000000000000000001","ERC20Vault":"0x1670000000000000000000000000000000000002","ERC721Vault":"0x1670000000000000000000000000000000000003","ERC1155Vault":"0x1670000000000000000000000000000000000004","SignalService":"0x1670000000000000000000000000000000000005","SharedAddressManager":"0x1670000000000000000000000000000000000006","TaikoL2":"0x1670000000000000000000000000000000010001","RollupAddressManager":"0x1670000000000000000000000000000000010002"},"param1559":{"gasExcess":1},"predeployERC20":true} \ No newline at end of file diff --git a/packages/protocol/utils/generate_genesis/erc20.ts b/packages/protocol/test/genesis/generate/erc20.ts similarity index 97% rename from packages/protocol/utils/generate_genesis/erc20.ts rename to packages/protocol/test/genesis/generate/erc20.ts index 1d08dd69ec1..d85c266c1e6 100644 --- a/packages/protocol/utils/generate_genesis/erc20.ts +++ b/packages/protocol/test/genesis/generate/erc20.ts @@ -1,7 +1,7 @@ import { ethers } from "ethers"; import { Result } from "./interface"; const path = require("path"); -const ARTIFACTS_PATH = path.join(__dirname, "../../out"); +const ARTIFACTS_PATH = path.join(__dirname, "../../../out/layer2"); const { computeStorageSlots, getStorageLayout } = require("./utils"); export const TOKEN_NAME = "RegularERC20"; diff --git a/packages/protocol/utils/generate_genesis/main.ts b/packages/protocol/test/genesis/generate/generate.ts similarity index 82% rename from packages/protocol/utils/generate_genesis/main.ts rename to packages/protocol/test/genesis/generate/generate.ts index a792c95a1c5..2462397624c 100644 --- a/packages/protocol/utils/generate_genesis/main.ts +++ b/packages/protocol/test/genesis/generate/generate.ts @@ -4,20 +4,11 @@ const path = require("path"); const { ethers } = require("ethers"); const { deployTaikoL2 } = require("./taikoL2"); const { deployERC20 } = require("./erc20"); +const config: Config = require("../data/genesis_config.js"); // Generate a L2 genesis JSON based on the given configurations. // ref: https://docs.soliditylang.org/en/latest/internals/layout_in_storage.html async function main() { - if (process.argv.length < 3) { - throw new Error("missing config json"); - } - - const config: Config = require( - path.isAbsolute(process.argv[2]) - ? process.argv[2] - : path.join(process.cwd(), process.argv[2]), - ); - const contractOwner = config.contractOwner; const chainId = config.chainId; const seedAccounts = config.seedAccounts; @@ -60,16 +51,13 @@ async function main() { result = await deployERC20(config, result); } - const allocSavedPath = path.join( - __dirname, - "../../deployments/genesis_alloc.json", - ); + const allocSavedPath = path.join(__dirname, "../data/genesis_alloc.json"); fs.writeFileSync(allocSavedPath, JSON.stringify(result.alloc, null, 2)); const layoutSavedPath = path.join( __dirname, - "../../deployments/genesis_storage_layout.json", + "../data/genesis_storage_layout.json", ); fs.writeFileSync( @@ -79,7 +67,7 @@ async function main() { const configJsonSavedPath = path.join( __dirname, - "../../deployments/genesis_config.json", + "../data/genesis_config.json", ); fs.writeFileSync(configJsonSavedPath, JSON.stringify(config)); diff --git a/packages/protocol/utils/generate_genesis/interface.ts b/packages/protocol/test/genesis/generate/interface.ts similarity index 100% rename from packages/protocol/utils/generate_genesis/interface.ts rename to packages/protocol/test/genesis/generate/interface.ts diff --git a/packages/protocol/utils/generate_genesis/taikoL2.ts b/packages/protocol/test/genesis/generate/taikoL2.ts similarity index 99% rename from packages/protocol/utils/generate_genesis/taikoL2.ts rename to packages/protocol/test/genesis/generate/taikoL2.ts index 9e631d35f6c..48e7979c010 100644 --- a/packages/protocol/utils/generate_genesis/taikoL2.ts +++ b/packages/protocol/test/genesis/generate/taikoL2.ts @@ -4,7 +4,7 @@ const { ethers } = require("ethers"); // eslint-disable-next-line node/no-extraneous-require const linker = require("solc/linker"); const { computeStorageSlots, getStorageLayout } = require("./utils"); -const ARTIFACTS_PATH = path.join(__dirname, "../../out"); +const ARTIFACTS_PATH = path.join(__dirname, "../../../out/layer2"); const IMPLEMENTATION_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; @@ -515,7 +515,7 @@ async function generateContractConfigs( // TaikoL2 => CrossChainOwned l1ChainId, // TaikoL2 - gasExcess: param1559.gasExcess, + parentGasExcess: param1559.gasExcess, publicInputHash: `${ethers.utils.solidityKeccak256( ["bytes32[256]"], [ diff --git a/packages/protocol/utils/generate_genesis/utils.ts b/packages/protocol/test/genesis/generate/utils.ts similarity index 99% rename from packages/protocol/utils/generate_genesis/utils.ts rename to packages/protocol/test/genesis/generate/utils.ts index 96e1adcf0f7..c84f98616ac 100644 --- a/packages/protocol/utils/generate_genesis/utils.ts +++ b/packages/protocol/test/genesis/generate/utils.ts @@ -43,7 +43,7 @@ export interface SolidityStorageLayout { export async function getStorageLayout( name: string, ): Promise { - const artifact = require(`../../out/${name}.sol/${name}.json`); + const artifact = require(`../../../out/layer2/${name}.sol/${name}.json`); if (!("storageLayout" in artifact)) { throw new Error(`Storage layout for ${name} not found.`); } diff --git a/packages/protocol/genesis/generate_genesis.test.sh b/packages/protocol/test/genesis/genesis.test.sh similarity index 87% rename from packages/protocol/genesis/generate_genesis.test.sh rename to packages/protocol/test/genesis/genesis.test.sh index 97d3c848dae..a0046e1b91e 100755 --- a/packages/protocol/genesis/generate_genesis.test.sh +++ b/packages/protocol/test/genesis/genesis.test.sh @@ -14,8 +14,8 @@ if ! docker info > /dev/null 2>&1; then exit 1 fi -GENESIS_JSON=$(cd "$(dirname "$DIR/../..")"; pwd)/deployments/genesis.json -TESTNET_CONFIG=$DIR/testnet/docker-compose.yml +GENESIS_JSON="$DIR/data/genesis.json" +TESTNET_CONFIG="$DIR/testnet/docker-compose.yml" touch "$GENESIS_JSON" @@ -48,13 +48,13 @@ echo ' echo "Starting generate_genesis tests..." # compile the contracts to get latest bytecode -rm -rf out && pnpm compile +rm -rf out && pnpm compile:genesis # run the task -pnpm run generate:genesis $DIR/test_config.js +pnpm run genesis:gen $DIR/test_config.js # generate complete genesis json -cat "$DIR"/../deployments/genesis_alloc.json >> "$GENESIS_JSON" +cat "$DIR/data/genesis_alloc.json" >> "$GENESIS_JSON" echo '}' >> "$GENESIS_JSON" @@ -88,11 +88,11 @@ function waitTestNode { waitTestNode http://localhost:18545 -forge test \ +FOUNDRY_PROFILE=genesis forge test \ -vvv \ --gas-report \ --fork-url http://localhost:18545 \ --fork-retry-backoff 120 \ --no-storage-caching \ - --match-path genesis/*.g.sol \ + --match-path test/genesis/GenerateGenesis.g.sol \ --block-gas-limit 1000000000 diff --git a/packages/protocol/genesis/mainnet.js b/packages/protocol/test/genesis/mainnet.js similarity index 100% rename from packages/protocol/genesis/mainnet.js rename to packages/protocol/test/genesis/mainnet.js diff --git a/packages/protocol/genesis/test_config.js b/packages/protocol/test/genesis/test_config.js similarity index 95% rename from packages/protocol/genesis/test_config.js rename to packages/protocol/test/genesis/test_config.js index 43637193643..59dff796b9c 100644 --- a/packages/protocol/genesis/test_config.js +++ b/packages/protocol/test/genesis/test_config.js @@ -2,9 +2,9 @@ const ADDRESS_LENGTH = 40; module.exports = { - contractOwner: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - l1ChainId: 1, - chainId: 167, + contractOwner: "0x91c34396e640e3bB4eE80f2e523c23dDa2b3f78F", + l1ChainId: 7014190335, + chainId: 167010, seedAccounts: [ { "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": 1024, @@ -76,7 +76,7 @@ module.exports = { "0x9eAF5590f2c84912A08de97FA28d0529361Deb9E": 1024, }, { - "0x1003ff39d25F2Ab16dBCc18EcE05a9B6154f65F4": 1024, + "0x91c34396e640e3bB4eE80f2e523c23dDa2b3f78F": 1024, }, ], get contractAddresses() { @@ -110,7 +110,7 @@ module.exports = { }; }, param1559: { - gasExcess: 20000000000, + gasExcess: 0, }, predeployERC20: true, }; diff --git a/packages/protocol/genesis/testnet/docker-compose.yml b/packages/protocol/test/genesis/testnet/docker-compose.yml similarity index 79% rename from packages/protocol/genesis/testnet/docker-compose.yml rename to packages/protocol/test/genesis/testnet/docker-compose.yml index 069d744f363..745f43de926 100644 --- a/packages/protocol/genesis/testnet/docker-compose.yml +++ b/packages/protocol/test/genesis/testnet/docker-compose.yml @@ -1,11 +1,9 @@ -version: "3.9" - services: geth: image: ethereum/client-go:v1.13.14 restart: unless-stopped volumes: - - ../../deployments:/data + - ../data:/data - .:/host ports: - 18545:8545 diff --git a/packages/protocol/genesis/testnet/init_geth.sh b/packages/protocol/test/genesis/testnet/init_geth.sh similarity index 100% rename from packages/protocol/genesis/testnet/init_geth.sh rename to packages/protocol/test/genesis/testnet/init_geth.sh diff --git a/packages/protocol/genesis/testnet/keyfile.json b/packages/protocol/test/genesis/testnet/keyfile.json similarity index 100% rename from packages/protocol/genesis/testnet/keyfile.json rename to packages/protocol/test/genesis/testnet/keyfile.json diff --git a/packages/protocol/genesis/testnet/password b/packages/protocol/test/genesis/testnet/password similarity index 100% rename from packages/protocol/genesis/testnet/password rename to packages/protocol/test/genesis/testnet/password diff --git a/packages/protocol/test/layer1/TaikoL1Test.sol b/packages/protocol/test/layer1/TaikoL1Test.sol new file mode 100644 index 00000000000..e77e24220b9 --- /dev/null +++ b/packages/protocol/test/layer1/TaikoL1Test.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/based/TaikoL1.sol"; +import "src/layer1/token/TaikoToken.sol"; +import "src/layer1/verifiers/SgxVerifier.sol"; +import "src/layer1/verifiers/SP1Verifier.sol"; +import "src/layer1/verifiers/Risc0Verifier.sol"; +import "src/layer1/provers/GuardianProver.sol"; +import "src/layer1/team/airdrop/ERC20Airdrop.sol"; +import "src/shared/bridge/QuotaManager.sol"; +import "../layer1/based/TestTierRouter.sol"; +import "../shared/TaikoTest.sol"; + +abstract contract TaikoL1Test is TaikoTest { } diff --git a/packages/protocol/test/automata-attestation/AutomataDcapV3AttestationTest.t.sol b/packages/protocol/test/layer1/automata-attestation/AutomataDcapV3AttestationTest.t.sol similarity index 51% rename from packages/protocol/test/automata-attestation/AutomataDcapV3AttestationTest.t.sol rename to packages/protocol/test/layer1/automata-attestation/AutomataDcapV3AttestationTest.t.sol index 0983fbe0071..148cae8a13f 100644 --- a/packages/protocol/test/automata-attestation/AutomataDcapV3AttestationTest.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/AutomataDcapV3AttestationTest.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/Test.sol"; import "forge-std/src/console.sol"; @@ -10,7 +10,7 @@ contract AutomataDcapV3AttestationTest is Test, AttestationBase { using BytesUtils for bytes; using stdJson for string; - string internal v3QuoteJsonPath = "/test/automata-attestation/assets/0923/v3quote.json"; + string internal v3QuoteJsonPath = "/test/layer1/automata-attestation/assets/0923/v3quote.json"; function setUp() public { // Call the AttestationBase init setup @@ -117,7 +117,7 @@ contract AutomataDcapV3AttestationTest is Test, AttestationBase { assertTrue(parsedInstanceAddr == address(0xC2D4564358139C90C17B744FE837F4DDc503EEdF)); } - function testParsedQuoteBinAttestation() public { + function testParsedSampleQuoteBinAttestation() public { vm.prank(user); bytes memory v3QuoteBytes = sampleQuote; V3Struct.ParsedV3QuoteStruct memory v3quote = @@ -128,6 +128,34 @@ contract AutomataDcapV3AttestationTest is Test, AttestationBase { assertTrue(parsedInstanceAddr == 0xC2D4564358139C90C17B744FE837F4DDc503EEdF); } + function testParsedCustomQuoteBinAttestation() public { + // fast forward to a time where the quote is valid + skip(1_820_000_000 - block.timestamp); + vm.prank(user); + bytes memory v3QuoteBytes = + hex"03000200000000000a000f00939a7233f79c4ca9940a0db3957f060724b261d141674cafc44426b74ed02fdf000000000b0d100fffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000e7000000000000009b2784bccc0779fa34e75d74881bf5850bb4a6410f4edfa935ef77115db3a86d0000000000000000000000000000000000000000000000000000000000000000ca0583a715534a8c981b914589a7f0dc5d60959d9ae79fb5353299a4231673d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000309734c02d2145cabb034f3c0505d28f7e5bfc2d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca10000010eec632f3dbb9a3b1280ca5e837750e12ce5adbea2cc64d53672b0b0213404d3b27c84dc886ce361716b5d51e85136750ca05827ced6d7c2afd025bc6ee44bd874269e41c5fcd064b417d110f40b745b5c7d0eb8208be57c3c48bd7bdabbf2e47c46ddd935f4589134f89c9e0995dfdaaef29aa61807366818f2eebf915134d0b0d100fffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000001500000000000000e70000000000000096b347a64e5a045e27369c26e6dcda51fd7c850e9b3a3a79e718f43261dee1e400000000000000000000000000000000000000000000000000000000000000008c4f5775d796503e96137f77c68a829a0056ac8ded70140b081b094490c57bff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf7138a8539a3d44afb1d9ab145134cd27aa8c6ee6c3053bdab6b19b46800d570000000000000000000000000000000000000000000000000000000000000000e04cceabc75e8485601a01fdf514b68c31f4498f3e2273930c03a1f7efbe0eaee34f08f9c3a0eba0e24f677ce5692389f4c016e5caf8451b544d312df74264752000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f0500620e00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d494945386a4343424a696741774942416749556565364e4e4f502f6b526c6f734d77336b435a70644a70424f414977436759494b6f5a497a6a3045417749770a634445694d434147413155454177775a535735305a577767553064594946424453794251624746305a6d397962534244515445614d42674741315545436777520a535735305a577767513239796347397959585270623234784644415342674e564241634d43314e68626e526849454e7359584a684d51737743515944565151490a44414a445154454c4d416b474131554542684d4356564d774868634e4d6a51774e5449794d6a4d7a4f544d345768634e4d7a45774e5449794d6a4d7a4f544d340a576a42774d534977494159445651514444426c4a626e526c624342545231676755454e4c49454e6c636e52705a6d6c6a5958526c4d526f77474159445651514b0a4442464a626e526c6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e560a4241674d416b4e424d517377435159445651514745774a56557a425a4d424d4742797147534d34394167454743437147534d34394177454841304941424673770a4f5267652f704a4834514d3163456c44626f463451384549313864386a42665a63536b4c615179656b35614f6b4767454756672f476655356255453450544c2b0a37794c6b626b394471557950467836592b434b6a67674d4f4d494944436a416642674e5648534d4547444157674253566231334e765276683655424a796454300a4d383442567776655644427242674e56485238455a4442694d47436758714263686c706f64485277637a6f764c32467761533530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c334e6e6543396a5a584a3061575a7059324630615739754c3359304c33426a61324e796244396a595431770a624746305a6d397962535a6c626d4e765a476c755a7a316b5a584977485159445652304f42425945464c686b766f31584a6f2b6958464c6c6c454f2b472f56580a695239534d41344741315564447745422f775145417749477744414d42674e5648524d4241663845416a41414d4949434f77594a4b6f5a496876684e415130420a424949434c444343416967774867594b4b6f5a496876684e41513042415151516668326b6a583748503937435265674c6256594f726a434341575547436971470a534962345451454e41514977676746564d42414743797147534962345451454e415149424167454c4d42414743797147534962345451454e415149434167454c0a4d42414743797147534962345451454e41514944416745444d42414743797147534962345451454e41514945416745444d42454743797147534962345451454e0a41514946416749412f7a415242677371686b69472b4530424451454342674943415038774541594c4b6f5a496876684e4151304241676343415141774541594c0a4b6f5a496876684e4151304241676743415141774541594c4b6f5a496876684e4151304241676b43415141774541594c4b6f5a496876684e4151304241676f430a415141774541594c4b6f5a496876684e4151304241677343415141774541594c4b6f5a496876684e4151304241677743415141774541594c4b6f5a496876684e0a4151304241673043415141774541594c4b6f5a496876684e4151304241673443415141774541594c4b6f5a496876684e4151304241673843415141774541594c0a4b6f5a496876684e4151304241684143415141774541594c4b6f5a496876684e4151304241684543415130774877594c4b6f5a496876684e41513042416849450a4541734c4177502f2f7741414141414141414141414141774541594b4b6f5a496876684e4151304241775143414141774641594b4b6f5a496876684e415130420a424151474d474271414141414d41384743697147534962345451454e4151554b415145774867594b4b6f5a496876684e41513042426751516c4b6254394547580a78334843365163754c712b374d7a424542676f71686b69472b453042445145484d4459774541594c4b6f5a496876684e4151304242774542416638774541594c0a4b6f5a496876684e4151304242774942416638774541594c4b6f5a496876684e4151304242774d4241663877436759494b6f5a497a6a304541774944534141770a5251496763325556534f386d4b384c314f5675534943514264315671534e50326e716d5656394c4678504e326c6f774349514362662b69785065367a335966420a664b51344f4b6c546f694d55386a66333849672f765275586976525257773d3d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436c6a4343416a32674177494241674956414a567658633239472b487051456e4a3150517a7a674658433935554d416f4743437147534d343942414d430a4d476778476a415942674e5642414d4d45556c756447567349464e48574342536232393049454e424d526f77474159445651514b4442464a626e526c624342440a62334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e424d5173770a435159445651514745774a56557a4165467730784f4441314d6a45784d4455774d5442614677307a4d7a41314d6a45784d4455774d5442614d484178496a41670a42674e5642414d4d47556c756447567349464e4857434251513073675547786864475a76636d306751304578476a415942674e5642416f4d45556c75644756730a49454e76636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b474131554543417743513045780a437a414a42674e5642415954416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a304441516344516741454e53422f377432316c58534f0a3243757a7078773734654a423732457944476757357258437478327456544c7136684b6b367a2b5569525a436e71523770734f766771466553786c6d546c4a6c0a65546d693257597a33714f42757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f536347724442530a42674e5648523845537a424a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e5648513445466751556c5739640a7a62306234656c4153636e553944504f4156634c336c517744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159420a4166384341514177436759494b6f5a497a6a30454177494452774177524149675873566b6930772b6936565947573355462f32327561586530594a446a3155650a6e412b546a44316169356343494359623153416d4435786b66545670766f34556f79695359787244574c6d5552344349394e4b7966504e2b0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436a7a4343416a53674177494241674955496d554d316c71644e496e7a6737535655723951477a6b6e42717777436759494b6f5a497a6a3045417749770a614445614d4267474131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e760a636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a0a42674e5642415954416c56544d423458445445344d4455794d5445774e4455784d466f58445451354d54497a4d54497a4e546b314f566f77614445614d4267470a4131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e76636e4276636d46300a615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a42674e56424159540a416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a3044415163445167414543366e45774d4449595a4f6a2f69505773437a61454b69370a314f694f534c52466857476a626e42564a66566e6b59347533496a6b4459594c304d784f346d717379596a6c42616c54565978465032734a424b357a6c4b4f420a757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f5363477244425342674e5648523845537a424a0a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b63325679646d6c6a5a584d75615735300a5a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e564851344546675155496d554d316c71644e496e7a673753560a55723951477a6b6e4271777744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159424166384341514577436759490a4b6f5a497a6a3045417749445351417752674968414f572f35516b522b533943695344634e6f6f774c7550524c735747662f59693747535839344267775477670a41694541344a306c72486f4d732b586f356f2f7358364f39515778485241765a55474f6452513763767152586171493d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a00"; + V3Struct.ParsedV3QuoteStruct memory v3quote = + verifyParsedQuoteAttestation(v3QuoteBytes, true); + address parsedInstanceAddr = + address(bytes20(Bytes.slice(v3quote.localEnclaveReport.reportData, 0, 20))); + // console.log("[log] parsed instance addr = %s", parsedInstanceAddr); + assertTrue(parsedInstanceAddr == 0x309734C02d2145cABB034F3c0505D28F7E5bFc2d); + } + + function testParsedCustomQuoteBinAttestation2() public { + // fast forward to a time where the quote is valid + skip(1_820_000_000 - block.timestamp); + vm.prank(user); + bytes memory v3QuoteBytes = + hex"03000200000000000a000f00939a7233f79c4ca9940a0db3957f06071be3d9366ba62a20234e416dad1fec240000000002090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000300000000000000dfcb4fca3073e3f3a90b05d328688c32619d56f26789c0a9797aa10e765a78070000000000000000000000000000000000000000000000000000000000000000ca0583a715534a8c981b914589a7f0dc5d60959d9ae79fb5353299a4231673d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ecf78b2b1f7e61370e150678b6283c042c6bda030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000441000003eb0537ec9eff3c1b167a9354ef0e48ec3f8118265d714ce1218931e3fff3d71b526c2012deec8a2d821958dc8ba37011a472bc9eb4338f8580447e50a93d221d7ed1af4c65d20077454982d6352bb648cbce2421197e7df764affb38a7c90dd4523fbf508525c66f39c72e3e7701830ddad0b2891398252fd1acf7868281dfc0209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001500000000000000030000000000000096b347a64e5a045e27369c26e6dcda51fd7c850e9b3a3a79e718f43261dee1e400000000000000000000000000000000000000000000000000000000000000008c4f5775d796503e96137f77c68a829a0056ac8ded70140b081b094490c57bff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006316b596db625df6899ab6832860358700f52e6edb650f27aac553d0fa4d64140000000000000000000000000000000000000000000000000000000000000000532e6ff126eaa52e75c602bf831838d71f18d69c9341c434e9df28b515b2669d8cb6969c5aa5ee6dc342b7f95de306979c69b09a514d44840689055fc56bcc352000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f0500dc0d00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949456a44434342444b674177494241674955464a772b4d3738584e49683564396552746a3141336b637031587377436759494b6f5a497a6a3045417749770a6354456a4d4345474131554541777761535735305a577767553064594946424453794251636d396a5a584e7a6233496751304578476a415942674e5642416f4d0a45556c756447567349454e76636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155450a4341774351304578437a414a42674e5642415954416c56544d423458445449304d4459784e4445344d7a597a4e316f5844544d784d4459784e4445344d7a597a0a4e316f77634445694d434147413155454177775a535735305a5777675530645949464244537942445a584a3061575a70593246305a5445614d426747413155450a43677752535735305a577767513239796347397959585270623234784644415342674e564241634d43314e68626e526849454e7359584a684d517377435159440a5651514944414a445154454c4d416b474131554542684d4356564d775754415442676371686b6a4f5051494242676771686b6a4f50514d4242774e43414154310a664748303932422f537034647235574a512b787537377753624e4461452b53732f334b4c626b71434d595346535546465757307047636365564832485a646e310a52637833543775337347716442546e697479596d6f344943707a434341714d77487759445652306a42426777466f4155304f6971326e58582b53354a463567380a6578526c304e587957553077624159445652306642475577597a42686f462b6758595a626148523063484d364c79396863476b7564484a316333526c5a484e6c0a636e5a705932567a4c6d6c75644756734c6d4e766253397a5a3367765932567964476c6d61574e6864476c76626939324e4339775932746a636d772f593245390a63484a765932567a633239794a6d56755932396b6157356e5057526c636a416442674e564851344546675155384e42757945652b5a354f6d7a794e674f7845700a4c376f7155374d7744675944565230504151482f42415144416762414d41774741315564457745422f7751434d4141776767485442676b71686b69472b4530420a44514545676748454d4949427744416542676f71686b69472b453042445145424242423662436843506c354d5255734930584f7a656745614d4949425977594b0a4b6f5a496876684e41513042416a434341564d774541594c4b6f5a496876684e4151304241674543415149774541594c4b6f5a496876684e41513042416749430a415149774541594c4b6f5a496876684e4151304241674d43415141774541594c4b6f5a496876684e4151304241675143415141774541594c4b6f5a496876684e0a4151304241675543415141774541594c4b6f5a496876684e4151304241675943415141774541594c4b6f5a496876684e4151304241676343415141774541594c0a4b6f5a496876684e4151304241676743415141774541594c4b6f5a496876684e4151304241676b43415141774541594c4b6f5a496876684e4151304241676f430a415141774541594c4b6f5a496876684e4151304241677343415141774541594c4b6f5a496876684e4151304241677743415141774541594c4b6f5a496876684e0a4151304241673043415141774541594c4b6f5a496876684e4151304241673443415141774541594c4b6f5a496876684e4151304241673843415141774541594c0a4b6f5a496876684e4151304241684143415141774541594c4b6f5a496876684e415130424168454341516b774877594c4b6f5a496876684e41513042416849450a4541494341414141414141414141414141414141414141774541594b4b6f5a496876684e4151304241775143414141774641594b4b6f5a496876684e415130420a4241514741484271454141414d41384743697147534962345451454e4151554b41514177436759494b6f5a497a6a3045417749445341417752514968414d53680a31634b685451576349537230554a4a52765a6d4b767165464f324a37534c65336b794b54677175414169425971442b62676871754e636a55656b384e4a2f467a0a41726b5965416b52683055444d4764436561547032673d3d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436d444343416a36674177494241674956414e446f71747031312f6b7553526559504873555a644456386c6c4e4d416f4743437147534d343942414d430a4d476778476a415942674e5642414d4d45556c756447567349464e48574342536232393049454e424d526f77474159445651514b4442464a626e526c624342440a62334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e424d5173770a435159445651514745774a56557a4165467730784f4441314d6a45784d4455774d5442614677307a4d7a41314d6a45784d4455774d5442614d484578497a41680a42674e5642414d4d476b6c756447567349464e48574342515130736755484a765932567a6332397949454e424d526f77474159445651514b4442464a626e526c0a6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e420a4d517377435159445651514745774a56557a425a4d424d4742797147534d34394167454743437147534d34394177454841304941424c39712b4e4d7032494f670a74646c31626b2f75575a352b5447516d38614369387a373866732b664b435133642b75447a586e56544154325a68444369667949754a77764e33774e427039690a484253534d4a4d4a72424f6a6762737767626777487759445652306a42426777466f4155496d554d316c71644e496e7a6737535655723951477a6b6e427177770a556759445652306642457377535442486f45576751345a426148523063484d364c79396a5a584a3061575a70593246305a584d7564484a316333526c5a484e6c0a636e5a705932567a4c6d6c75644756734c6d4e766253394a626e526c62464e4857464a76623352445153356b5a584977485159445652304f42425945464e446f0a71747031312f6b7553526559504873555a644456386c6c4e4d41344741315564447745422f77514541774942426a415342674e5648524d4241663845434441470a4151482f416745414d416f4743437147534d343942414d43413067414d4555434951434a6754627456714f795a316d336a716941584d365159613672357357530a34792f4737793875494a4778647749675271507642534b7a7a516167424c517135733541373070646f6961524a387a2f3075447a344e675639316b3d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436a7a4343416a53674177494241674955496d554d316c71644e496e7a6737535655723951477a6b6e42717777436759494b6f5a497a6a3045417749770a614445614d4267474131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e760a636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a0a42674e5642415954416c56544d423458445445344d4455794d5445774e4455784d466f58445451354d54497a4d54497a4e546b314f566f77614445614d4267470a4131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e76636e4276636d46300a615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a42674e56424159540a416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a3044415163445167414543366e45774d4449595a4f6a2f69505773437a61454b69370a314f694f534c52466857476a626e42564a66566e6b59347533496a6b4459594c304d784f346d717379596a6c42616c54565978465032734a424b357a6c4b4f420a757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f5363477244425342674e5648523845537a424a0a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b63325679646d6c6a5a584d75615735300a5a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e564851344546675155496d554d316c71644e496e7a673753560a55723951477a6b6e4271777744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159424166384341514577436759490a4b6f5a497a6a3045417749445351417752674968414f572f35516b522b533943695344634e6f6f774c7550524c735747662f59693747535839344267775477670a41694541344a306c72486f4d732b586f356f2f7358364f39515778485241765a55474f6452513763767152586171493d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a00"; + V3Struct.ParsedV3QuoteStruct memory v3quote = + verifyParsedQuoteAttestation(v3QuoteBytes, true); + address parsedInstanceAddr = + address(bytes20(Bytes.slice(v3quote.localEnclaveReport.reportData, 0, 20))); + // console.log("[log] parsed instance addr = %s", parsedInstanceAddr); + assertTrue(parsedInstanceAddr == 0xecf78b2b1F7e61370e150678b6283C042c6bDa03); + } + function testParsedQuoteBase64Attestation() public { string memory v3QuoteB64Str = "AwACAAAAAAAKAA8Ak5pyM/ecTKmUCg2zlX8GBxLOavHkqB4OzaxCe5m7ApUAAAAACwsQD///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAADnAAAAAAAAADAx1Y7sROJljY0p6/ptbdwC841C1n7aq7S/qjSGeOa6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdPSuOeKkIHE14ZQJvmEsmUZdpbf5KBZii0O8HZPcA9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdC5oqY9mLGLKIiJy2EWABZTTIFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyhAAAEDWo4+gcMfB8oCHFOW95E3dDzSJmZxRjEPY6SLfsAxxmdL1E9tpPreSh37ItjqcFJQ6gYaaITdFjh1JUAIXGkDHJ34Tn18pgiVpiftlGYcB2Db41vFSVv8F1IkbytroE3V6fAn9HOAil3g7r2a52XZitfw4BTw0lwKAvqDrbhp+CwsQD///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAAAAAADnAAAAAAAAAJazR6ZOWgReJzacJubc2lH9fIUOmzo6eecY9DJh3uHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMT1d115ZQPpYTf3fGioKaAFasje1wFAsIGwlEkMV7/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1ueoS9M+Q7Gjo9LDL6xWrbHDoWPHtiwDG87hHG/EUZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXsD5UvPvZXKx36JrvQfjbUe/9s+nMccmvZd/k77abt+DaUSo3diPOAmrh0ahh1zxMInkgdjDYnXR+3H1g3xY8SAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8FAGIOAAAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRTh6Q0NCSm1nQXdJQkFnSVZBTHorallqeGNYK2ZKb21BVWJDSnFnaWZJb2w2TUFvR0NDcUdTTTQ5QkFNQwpNSEF4SWpBZ0JnTlZCQU1NR1VsdWRHVnNJRk5IV0NCUVEwc2dVR3hoZEdadmNtMGdRMEV4R2pBWUJnTlZCQW9NCkVVbHVkR1ZzSUVOdmNuQnZjbUYwYVc5dU1SUXdFZ1lEVlFRSERBdFRZVzUwWVNCRGJHRnlZVEVMTUFrR0ExVUUKQ0F3Q1EwRXhDekFKQmdOVkJBWVRBbFZUTUI0WERUSXpNRGd5T0RFeE1UTXdOVm9YRFRNd01EZ3lPREV4TVRNdwpOVm93Y0RFaU1DQUdBMVVFQXd3WlNXNTBaV3dnVTBkWUlGQkRTeUJEWlhKMGFXWnBZMkYwWlRFYU1CZ0dBMVVFCkNnd1JTVzUwWld3Z1EyOXljRzl5WVhScGIyNHhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVFzd0NRWUQKVlFRSURBSkRRVEVMTUFrR0ExVUVCaE1DVlZNd1dUQVRCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFReQpzQVNyUzZya2VqMTRIZjFKU3B1UE8xTkRVVnl6WEJDdnAxaDQyRjEwVVUwQUZVV2cxWTQ4b2VCZzd0dk41WDJJClRHRUI1ekhCanpqdjlrdVd5VWpVbzRJRERqQ0NBd293SHdZRFZSMGpCQmd3Rm9BVWxXOWR6YjBiNGVsQVNjblUKOURQT0FWY0wzbFF3YXdZRFZSMGZCR1F3WWpCZ29GNmdYSVphYUhSMGNITTZMeTloY0drdWRISjFjM1JsWkhObApjblpwWTJWekxtbHVkR1ZzTG1OdmJTOXpaM2d2WTJWeWRHbG1hV05oZEdsdmJpOTJOQzl3WTJ0amNtdy9ZMkU5CmNHeGhkR1p2Y20wbVpXNWpiMlJwYm1jOVpHVnlNQjBHQTFVZERnUVdCQlJUVjZabHoxdkprWVNma0pqOE5pZnoKcWdhd1dEQU9CZ05WSFE4QkFmOEVCQU1DQnNBd0RBWURWUjBUQVFIL0JBSXdBRENDQWpzR0NTcUdTSWI0VFFFTgpBUVNDQWl3d2dnSW9NQjRHQ2lxR1NJYjRUUUVOQVFFRUVQNUdyZ0Vjem9wTmJvTTBzSTBidEFFd2dnRmxCZ29xCmhraUcrRTBCRFFFQ01JSUJWVEFRQmdzcWhraUcrRTBCRFFFQ0FRSUJDekFRQmdzcWhraUcrRTBCRFFFQ0FnSUIKQ3pBUUJnc3Foa2lHK0UwQkRRRUNBd0lCQXpBUUJnc3Foa2lHK0UwQkRRRUNCQUlCQXpBUkJnc3Foa2lHK0UwQgpEUUVDQlFJQ0FQOHdFUVlMS29aSWh2aE5BUTBCQWdZQ0FnRC9NQkFHQ3lxR1NJYjRUUUVOQVFJSEFnRUFNQkFHCkN5cUdTSWI0VFFFTkFRSUlBZ0VBTUJBR0N5cUdTSWI0VFFFTkFRSUpBZ0VBTUJBR0N5cUdTSWI0VFFFTkFRSUsKQWdFQU1CQUdDeXFHU0liNFRRRU5BUUlMQWdFQU1CQUdDeXFHU0liNFRRRU5BUUlNQWdFQU1CQUdDeXFHU0liNApUUUVOQVFJTkFnRUFNQkFHQ3lxR1NJYjRUUUVOQVFJT0FnRUFNQkFHQ3lxR1NJYjRUUUVOQVFJUEFnRUFNQkFHCkN5cUdTSWI0VFFFTkFRSVFBZ0VBTUJBR0N5cUdTSWI0VFFFTkFRSVJBZ0VOTUI4R0N5cUdTSWI0VFFFTkFRSVMKQkJBTEN3TUQvLzhBQUFBQUFBQUFBQUFBTUJBR0NpcUdTSWI0VFFFTkFRTUVBZ0FBTUJRR0NpcUdTSWI0VFFFTgpBUVFFQmdCZ2FnQUFBREFQQmdvcWhraUcrRTBCRFFFRkNnRUJNQjRHQ2lxR1NJYjRUUUVOQVFZRUVFV0p6T3Z5ClpFOEsza2ovSGhYRWEvc3dSQVlLS29aSWh2aE5BUTBCQnpBMk1CQUdDeXFHU0liNFRRRU5BUWNCQVFIL01CQUcKQ3lxR1NJYjRUUUVOQVFjQ0FRSC9NQkFHQ3lxR1NJYjRUUUVOQVFjREFRSC9NQW9HQ0NxR1NNNDlCQU1DQTBnQQpNRVVDSUJxM3Z4MkROYW1RQkZtVWRNZSttUFlFQ3U4NFhnb0ZDZ0l3U0pWNGNKYVRBaUVBNDNwN3Ryd0I4MHMrCjJpd2FobURkQW5DTXdKVlBMaVNFdXdEUUY4VkVnU3c9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNsakNDQWoyZ0F3SUJBZ0lWQUpWdlhjMjlHK0hwUUVuSjFQUXp6Z0ZYQzk1VU1Bb0dDQ3FHU000OUJBTUMKTUdneEdqQVlCZ05WQkFNTUVVbHVkR1ZzSUZOSFdDQlNiMjkwSUVOQk1Sb3dHQVlEVlFRS0RCRkpiblJsYkNCRApiM0p3YjNKaGRHbHZiakVVTUJJR0ExVUVCd3dMVTJGdWRHRWdRMnhoY21FeEN6QUpCZ05WQkFnTUFrTkJNUXN3CkNRWURWUVFHRXdKVlV6QWVGdzB4T0RBMU1qRXhNRFV3TVRCYUZ3MHpNekExTWpFeE1EVXdNVEJhTUhBeElqQWcKQmdOVkJBTU1HVWx1ZEdWc0lGTkhXQ0JRUTBzZ1VHeGhkR1p2Y20wZ1EwRXhHakFZQmdOVkJBb01FVWx1ZEdWcwpJRU52Y25CdmNtRjBhVzl1TVJRd0VnWURWUVFIREF0VFlXNTBZU0JEYkdGeVlURUxNQWtHQTFVRUNBd0NRMEV4CkN6QUpCZ05WQkFZVEFsVlRNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVOU0IvN3QyMWxYU08KMkN1enB4dzc0ZUpCNzJFeURHZ1c1clhDdHgydFZUTHE2aEtrNnorVWlSWkNucVI3cHNPdmdxRmVTeGxtVGxKbAplVG1pMldZejNxT0J1ekNCdURBZkJnTlZIU01FR0RBV2dCUWlaUXpXV3AwMGlmT0R0SlZTdjFBYk9TY0dyREJTCkJnTlZIUjhFU3pCSk1FZWdSYUJEaGtGb2RIUndjem92TDJObGNuUnBabWxqWVhSbGN5NTBjblZ6ZEdWa2MyVnkKZG1salpYTXVhVzUwWld3dVkyOXRMMGx1ZEdWc1UwZFlVbTl2ZEVOQkxtUmxjakFkQmdOVkhRNEVGZ1FVbFc5ZAp6YjBiNGVsQVNjblU5RFBPQVZjTDNsUXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CSUdBMVVkRXdFQi93UUlNQVlCCkFmOENBUUF3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnWHNWa2kwdytpNlZZR1czVUYvMjJ1YVhlMFlKRGoxVWUKbkErVGpEMWFpNWNDSUNZYjFTQW1ENXhrZlRWcHZvNFVveWlTWXhyRFdMbVVSNENJOU5LeWZQTisKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2p6Q0NBalNnQXdJQkFnSVVJbVVNMWxxZE5JbnpnN1NWVXI5UUd6a25CcXd3Q2dZSUtvWkl6ajBFQXdJdwphREVhTUJnR0ExVUVBd3dSU1c1MFpXd2dVMGRZSUZKdmIzUWdRMEV4R2pBWUJnTlZCQW9NRVVsdWRHVnNJRU52CmNuQnZjbUYwYVc5dU1SUXdFZ1lEVlFRSERBdFRZVzUwWVNCRGJHRnlZVEVMTUFrR0ExVUVDQXdDUTBFeEN6QUoKQmdOVkJBWVRBbFZUTUI0WERURTRNRFV5TVRFd05EVXhNRm9YRFRRNU1USXpNVEl6TlRrMU9Wb3dhREVhTUJnRwpBMVVFQXd3UlNXNTBaV3dnVTBkWUlGSnZiM1FnUTBFeEdqQVlCZ05WQkFvTUVVbHVkR1ZzSUVOdmNuQnZjbUYwCmFXOXVNUlF3RWdZRFZRUUhEQXRUWVc1MFlTQkRiR0Z5WVRFTE1Ba0dBMVVFQ0F3Q1EwRXhDekFKQmdOVkJBWVQKQWxWVE1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUM2bkV3TURJWVpPai9pUFdzQ3phRUtpNwoxT2lPU0xSRmhXR2pibkJWSmZWbmtZNHUzSWprRFlZTDBNeE80bXFzeVlqbEJhbFRWWXhGUDJzSkJLNXpsS09CCnV6Q0J1REFmQmdOVkhTTUVHREFXZ0JRaVpReldXcDAwaWZPRHRKVlN2MUFiT1NjR3JEQlNCZ05WSFI4RVN6QkoKTUVlZ1JhQkRoa0ZvZEhSd2N6b3ZMMk5sY25ScFptbGpZWFJsY3k1MGNuVnpkR1ZrYzJWeWRtbGpaWE11YVc1MApaV3d1WTI5dEwwbHVkR1ZzVTBkWVVtOXZkRU5CTG1SbGNqQWRCZ05WSFE0RUZnUVVJbVVNMWxxZE5JbnpnN1NWClVyOVFHemtuQnF3d0RnWURWUjBQQVFIL0JBUURBZ0VHTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFFd0NnWUkKS29aSXpqMEVBd0lEU1FBd1JnSWhBT1cvNVFrUitTOUNpU0RjTm9vd0x1UFJMc1dHZi9ZaTdHU1g5NEJnd1R3ZwpBaUVBNEowbHJIb01zK1hvNW8vc1g2TzlRV3hIUkF2WlVHT2RSUTdjdnFSWGFxST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoA"; diff --git a/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00706A100000.json b/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00706A100000.json new file mode 100644 index 00000000000..ec1d14b10e4 --- /dev/null +++ b/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00706A100000.json @@ -0,0 +1,244 @@ +{ + "tcbInfo": { + "version": 2, + "issueDate": "2024-06-14T19:46:01Z", + "nextUpdate": "2024-07-14T19:46:01Z", + "fmspc": "00706a100000", + "pceId": "0000", + "tcbType": 0, + "tcbEvaluationDataNumber": 16, + "tcbLevels": [ + { + "tcb": { + "sgxtcbcomp01svn": 8, + "sgxtcbcomp02svn": 8, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2023-08-09T00:00:00Z", + "tcbStatus": "UpToDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 7, + "sgxtcbcomp02svn": 7, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2022-11-09T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 5, + "sgxtcbcomp02svn": 5, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 11 + }, + "tcbDate": "2021-11-10T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 4, + "sgxtcbcomp02svn": 4, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 11 + }, + "tcbDate": "2021-06-09T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 3, + "sgxtcbcomp02svn": 3, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 10 + }, + "tcbDate": "2020-11-11T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 2, + "sgxtcbcomp02svn": 2, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 9 + }, + "tcbDate": "2020-06-10T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 2, + "sgxtcbcomp02svn": 2, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 7 + }, + "tcbDate": "2019-05-15T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 2, + "sgxtcbcomp02svn": 2, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 6 + }, + "tcbDate": "2018-08-15T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 1, + "sgxtcbcomp02svn": 1, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 5 + }, + "tcbDate": "2018-01-04T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 0, + "sgxtcbcomp02svn": 0, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 4 + }, + "tcbDate": "2017-07-26T00:00:00Z", + "tcbStatus": "OutOfDate" + } + ] + }, + "signature": "f9c1b130cfd4d7b681e2e082b074e752a9ec286927845fda0846373e985606755277ea130eb169b32ef98b6337a547d9ae06374435c4e9d1c04154443c1c65b5" +} diff --git a/packages/protocol/test/automata-attestation/assets/0424/tcb_00906ED50000.json b/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00906ED50000.json similarity index 100% rename from packages/protocol/test/automata-attestation/assets/0424/tcb_00906ED50000.json rename to packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00906ED50000.json diff --git a/packages/protocol/test/automata-attestation/assets/0424/tcb_00A067110000.json b/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00A067110000.json similarity index 100% rename from packages/protocol/test/automata-attestation/assets/0424/tcb_00A067110000.json rename to packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00A067110000.json diff --git a/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_30606a000000.json b/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_30606a000000.json new file mode 100644 index 00000000000..c97c2b2971d --- /dev/null +++ b/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_30606a000000.json @@ -0,0 +1,221 @@ +{ + "tcbInfo": { + "version": 2, + "issueDate": "2024-06-05T21:19:36Z", + "nextUpdate": "2024-07-05T21:19:36Z", + "fmspc": "30606a000000", + "pceId": "0000", + "tcbType": 0, + "tcbEvaluationDataNumber": 16, + "tcbLevels": [ + { + "tcb": { + "sgxtcbcomp01svn": 12, + "sgxtcbcomp02svn": 12, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 1, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2023-08-09T00:00:00Z", + "tcbStatus": "SWHardeningNeeded" + }, + { + "tcb": { + "sgxtcbcomp01svn": 12, + "sgxtcbcomp02svn": 12, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2023-08-09T00:00:00Z", + "tcbStatus": "ConfigurationAndSWHardeningNeeded" + }, + { + "tcb": { + "sgxtcbcomp01svn": 11, + "sgxtcbcomp02svn": 11, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 1, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2023-02-15T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 11, + "sgxtcbcomp02svn": 11, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2023-02-15T00:00:00Z", + "tcbStatus": "OutOfDateConfigurationNeeded" + }, + { + "tcb": { + "sgxtcbcomp01svn": 7, + "sgxtcbcomp02svn": 9, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 1, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2022-08-10T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 7, + "sgxtcbcomp02svn": 9, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2022-08-10T00:00:00Z", + "tcbStatus": "OutOfDateConfigurationNeeded" + }, + { + "tcb": { + "sgxtcbcomp01svn": 4, + "sgxtcbcomp02svn": 4, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 11 + }, + "tcbDate": "2021-11-10T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 4, + "sgxtcbcomp02svn": 4, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 10 + }, + "tcbDate": "2020-11-11T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 4, + "sgxtcbcomp02svn": 4, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 5 + }, + "tcbDate": "2018-01-04T00:00:00Z", + "tcbStatus": "OutOfDate" + } + ] + }, + "signature": "cd542e85f79fdf7fadb6218bb8640df5fd988f6287b5da46c7f96c63f93c39e540fe260a2f5fe640430705339fad9372a4301f071a9838a737dff6ff6c63e042" +} diff --git a/packages/protocol/test/automata-attestation/assets/0923/identity.json b/packages/protocol/test/layer1/automata-attestation/assets/0923/identity.json similarity index 100% rename from packages/protocol/test/automata-attestation/assets/0923/identity.json rename to packages/protocol/test/layer1/automata-attestation/assets/0923/identity.json diff --git a/packages/protocol/test/automata-attestation/assets/0923/tcb_00606A000000.json b/packages/protocol/test/layer1/automata-attestation/assets/0923/tcb_00606A000000.json similarity index 100% rename from packages/protocol/test/automata-attestation/assets/0923/tcb_00606A000000.json rename to packages/protocol/test/layer1/automata-attestation/assets/0923/tcb_00606A000000.json diff --git a/packages/protocol/test/automata-attestation/assets/0923/v3quote.json b/packages/protocol/test/layer1/automata-attestation/assets/0923/v3quote.json similarity index 100% rename from packages/protocol/test/automata-attestation/assets/0923/v3quote.json rename to packages/protocol/test/layer1/automata-attestation/assets/0923/v3quote.json diff --git a/packages/protocol/test/automata-attestation/assets/complex.json b/packages/protocol/test/layer1/automata-attestation/assets/complex.json similarity index 100% rename from packages/protocol/test/automata-attestation/assets/complex.json rename to packages/protocol/test/layer1/automata-attestation/assets/complex.json diff --git a/packages/protocol/test/automata-attestation/common/AttestationBase.t.sol b/packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol similarity index 89% rename from packages/protocol/test/automata-attestation/common/AttestationBase.t.sol rename to packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol index 62016721950..1f2d71a67ce 100644 --- a/packages/protocol/test/automata-attestation/common/AttestationBase.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol @@ -1,23 +1,23 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/Test.sol"; import "forge-std/src/console.sol"; import "forge-std/src/StdJson.sol"; -import "../../../contracts/verifiers/SgxVerifier.sol"; -import "../../../contracts/thirdparty/optimism/Bytes.sol"; -import { AutomataDcapV3Attestation } from - "../../../contracts/automata-attestation/AutomataDcapV3Attestation.sol"; -import { P256Verifier } from "p256-verifier/src/P256Verifier.sol"; -import { SigVerifyLib } from "../../../contracts/automata-attestation/utils/SigVerifyLib.sol"; -import { PEMCertChainLib } from "../../../contracts/automata-attestation/lib/PEMCertChainLib.sol"; -import { V3Struct } from "../../../contracts/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; -import { BytesUtils } from "../../../contracts/automata-attestation/utils/BytesUtils.sol"; -import { Base64 } from "solady/src/utils/Base64.sol"; -import "../utils/DcapTestUtils.t.sol"; -import "../utils/V3QuoteParseUtils.t.sol"; +import "@optimism/packages/contracts-bedrock/src/libraries/Bytes.sol"; import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import "@p256-verifier/contracts/P256Verifier.sol"; + +import "src/layer1/verifiers/SgxVerifier.sol"; +import "src/layer1/automata-attestation/AutomataDcapV3Attestation.sol"; +import "src/layer1/automata-attestation/utils/SigVerifyLib.sol"; +import "src/layer1/automata-attestation/lib/PEMCertChainLib.sol"; +import "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import "src/layer1/automata-attestation/utils/BytesUtils.sol"; +import "solady/src/utils/Base64.sol"; +import "../utils/DcapTestUtils.t.sol"; +import "../utils/V3QuoteParseUtils.t.sol"; contract AttestationBase is Test, DcapTestUtils, V3QuoteParseUtils { using BytesUtils for bytes; @@ -30,8 +30,14 @@ contract AttestationBase is Test, DcapTestUtils, V3QuoteParseUtils { // use a network that where the P256Verifier contract exists // ref: https://github.com/daimo-eth/p256-verifier //string internal rpcUrl = vm.envString("RPC_URL"); - string internal tcbInfoPath = "/test/automata-attestation/assets/0923/tcb_00606A000000.json"; - string internal idPath = "/test/automata-attestation/assets/0923/identity.json"; + string[] internal tcbInfoPaths = [ + "/test/layer1/automata-attestation/assets/0923/tcb_00606A000000.json", + "/test/layer1/automata-attestation/assets/0424/tcb_00A067110000.json", + "/test/layer1/automata-attestation/assets/0424/tcb_00906ED50000.json", + "/test/layer1/automata-attestation/assets/0424/tcb_30606a000000.json", + "/test/layer1/automata-attestation/assets/0424/tcb_00706A100000.json" + ]; + string internal idPath = "/test/layer1/automata-attestation/assets/0923/identity.json"; address constant admin = address(1); address constant user = 0x0926b716f6aEF52F9F3C3474A2846e1Bf1ACedf6; bytes32 mrEnclave = 0x46049af725ec3986eeb788693df7bc5f14d3f2705106a19cd09b9d89237db1a0; @@ -68,15 +74,18 @@ contract AttestationBase is Test, DcapTestUtils, V3QuoteParseUtils { setMrEnclave(address(attestation), mrEnclave, true); setMrSigner(address(attestation), mrSigner, true); - string memory tcbInfoJson = vm.readFile(string.concat(vm.projectRoot(), tcbInfoPath)); - string memory enclaveIdJson = vm.readFile(string.concat(vm.projectRoot(), idPath)); + for (uint256 i = 0; i < tcbInfoPaths.length; i++) { + string memory tcbInfoJson = + vm.readFile(string.concat(vm.projectRoot(), tcbInfoPaths[i])); - (bool tcbParsedSuccess, TCBInfoStruct.TCBInfo memory parsedTcbInfo) = - parseTcbInfoJson(tcbInfoJson); - require(tcbParsedSuccess, "tcb parsed failed"); - string memory fmspc = LibString.lower(parsedTcbInfo.fmspc); - attestation.configureTcbInfoJson(fmspc, parsedTcbInfo); + (bool tcbParsedSuccess, TCBInfoStruct.TCBInfo memory parsedTcbInfo) = + parseTcbInfoJson(tcbInfoJson); + require(tcbParsedSuccess, "tcb parsed failed"); + string memory fmspc = LibString.lower(parsedTcbInfo.fmspc); + attestation.configureTcbInfoJson(fmspc, parsedTcbInfo); + } + string memory enclaveIdJson = vm.readFile(string.concat(vm.projectRoot(), idPath)); configureQeIdentityJson(address(attestation), enclaveIdJson); vm.stopPrank(); } diff --git a/packages/protocol/test/automata-attestation/utils/DcapTestUtils.t.sol b/packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol similarity index 95% rename from packages/protocol/test/automata-attestation/utils/DcapTestUtils.t.sol rename to packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol index a859d73a30e..03c581109ff 100644 --- a/packages/protocol/test/automata-attestation/utils/DcapTestUtils.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import { TCBInfoStruct } from "../../../contracts/automata-attestation/lib/TCBInfoStruct.sol"; -import { EnclaveIdStruct } from "../../../contracts/automata-attestation/lib/EnclaveIdStruct.sol"; -import { V3Struct } from "../../../contracts/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; -import { JSONParserLib } from "solady/src/utils/JSONParserLib.sol"; -import { LibString } from "solady/src/utils/LibString.sol"; +import "src/layer1/automata-attestation/lib/TCBInfoStruct.sol"; +import "src/layer1/automata-attestation/lib/EnclaveIdStruct.sol"; +import "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import "solady/src/utils/JSONParserLib.sol"; +import "solady/src/utils/LibString.sol"; contract DcapTestUtils { using JSONParserLib for JSONParserLib.Item; @@ -235,7 +235,7 @@ contract DcapTestUtils { // Converts a string to a hexstring (of bytes type) // https://ethereum.stackexchange.com/questions/39989/solidity-convert-hex-string-to-bytes - // Convert an hexadecimal character to their value + // Convert a hexadecimal character to their value function _fromHexChar(uint8 c) private pure returns (uint8) { if (bytes1(c) >= bytes1("0") && bytes1(c) <= bytes1("9")) { return c - uint8(bytes1("0")); @@ -249,7 +249,7 @@ contract DcapTestUtils { revert("failed to convert hex value"); } - // Convert an hexadecimal string to raw bytes + // Convert a hexadecimal string to raw bytes function _fromHex(string memory s) private pure returns (bytes memory) { bytes memory ss = bytes(s); require(ss.length % 2 == 0); // length must be even diff --git a/packages/protocol/test/automata-attestation/utils/V3QuoteParseUtils.t.sol b/packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol similarity index 91% rename from packages/protocol/test/automata-attestation/utils/V3QuoteParseUtils.t.sol rename to packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol index 83b7e9a24a4..ae40bc25c0e 100644 --- a/packages/protocol/test/automata-attestation/utils/V3QuoteParseUtils.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol @@ -1,14 +1,13 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import { V3Struct } from "../../../contracts/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; -import { V3Parser } from "../../../contracts/automata-attestation/lib/QuoteV3Auth/V3Parser.sol"; -import { IPEMCertChainLib } from - "../../../contracts/automata-attestation/lib/interfaces/IPEMCertChainLib.sol"; -import { PEMCertChainLib } from "../../../contracts/automata-attestation/lib/PEMCertChainLib.sol"; -import { Base64 } from "solady/src/utils/Base64.sol"; -import { JSONParserLib } from "solady/src/utils/JSONParserLib.sol"; -import { LibString } from "solady/src/utils/LibString.sol"; +import "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol"; +import "src/layer1/automata-attestation/lib/interfaces/IPEMCertChainLib.sol"; +import "src/layer1/automata-attestation/lib/PEMCertChainLib.sol"; +import "solady/src/utils/Base64.sol"; +import "solady/src/utils/JSONParserLib.sol"; +import "solady/src/utils/LibString.sol"; contract V3QuoteParseUtils { using JSONParserLib for JSONParserLib.Item; diff --git a/packages/protocol/test/L1/GuardianProver1.t.sol b/packages/protocol/test/layer1/based/GuardianProver1.t.sol similarity index 94% rename from packages/protocol/test/L1/GuardianProver1.t.sol rename to packages/protocol/test/layer1/based/GuardianProver1.t.sol index 9ae2bd02e4e..0400cafd3eb 100644 --- a/packages/protocol/test/L1/GuardianProver1.t.sol +++ b/packages/protocol/test/layer1/based/GuardianProver1.t.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../TaikoTest.sol"; +import "src/layer1/provers/GuardianProver.sol"; +import "test/shared/TaikoTest.sol"; contract DummyGuardianProver is GuardianProver { uint256 public operationId; @@ -11,7 +12,7 @@ contract DummyGuardianProver is GuardianProver { } function approve(bytes32 hash) public returns (bool) { - return _approve(operationId++, hash); + return _saveApproval(operationId++, hash); } } diff --git a/packages/protocol/test/L1/GuardianProver2.t.sol b/packages/protocol/test/layer1/based/GuardianProver2.t.sol similarity index 95% rename from packages/protocol/test/L1/GuardianProver2.t.sol rename to packages/protocol/test/layer1/based/GuardianProver2.t.sol index 3aede68a4e9..2cc6df5a115 100644 --- a/packages/protocol/test/L1/GuardianProver2.t.sol +++ b/packages/protocol/test/layer1/based/GuardianProver2.t.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../L1/TaikoL1TestBase.sol"; +import "src/layer1/provers/GuardianProver.sol"; +import "./TaikoL1TestBase.sol"; /// @author Kirk Baird contract TestGuardianProver2 is TaikoL1TestBase { diff --git a/packages/protocol/test/layer1/based/MockTaikoL1.sol b/packages/protocol/test/layer1/based/MockTaikoL1.sol new file mode 100644 index 00000000000..82e50637655 --- /dev/null +++ b/packages/protocol/test/layer1/based/MockTaikoL1.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/based/ITaikoL1.sol"; + +/// @title MockTaikoL1 +/// @custom:security-contact security@taiko.xyz +contract MockTaikoL1 is ITaikoL1 { + function proposeBlockV2( + bytes calldata _params, + bytes calldata _txList + ) + external + virtual + returns (TaikoData.BlockMetadataV2 memory meta_) + { } + + function proposeBlocksV2( + bytes[] calldata _paramsArr, + bytes[] calldata _txListArr + ) + external + virtual + returns (TaikoData.BlockMetadataV2[] memory metaArr_) + { } + + function proveBlock(uint64 _blockId, bytes calldata _input) external virtual { } + + function proveBlocks( + uint64[] calldata _blockIds, + bytes[] calldata _inputs, + bytes calldata _batchProof + ) + external + virtual + { } + + function verifyBlocks(uint64 _maxBlocksToVerify) external virtual { } + + function pauseProving(bool _pause) external virtual { } + + function depositBond(uint256 _amount) external payable virtual { } + + function withdrawBond(uint256 _amount) external virtual { } + + function getVerifiedBlockProver(uint64 _blockId) external view virtual returns (address) { } + + function getBlockV2(uint64 _blockId) + external + view + virtual + returns (TaikoData.BlockV2 memory blk_) + { } + + function getTransition( + uint64 _blockId, + uint32 _tid + ) + external + view + virtual + returns (TaikoData.TransitionState memory) + { } + + function lastProposedIn() external view returns (uint56) { } + + function getConfig() external pure virtual returns (TaikoData.Config memory) { } +} diff --git a/packages/protocol/test/L1/TaikoL1.t.sol b/packages/protocol/test/layer1/based/TaikoL1.t.sol similarity index 70% rename from packages/protocol/test/L1/TaikoL1.t.sol rename to packages/protocol/test/layer1/based/TaikoL1.t.sol index 399bc88c8b0..52415ea780d 100644 --- a/packages/protocol/test/L1/TaikoL1.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1.t.sol @@ -1,17 +1,17 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestBase.sol"; contract TaikoL1_NoCooldown is TaikoL1 { - function getConfig() public view override returns (TaikoData.Config memory config) { + function getConfig() public pure override returns (TaikoData.Config memory config) { config = TaikoL1.getConfig(); // over-write the following - config.maxBlocksToVerifyPerProposal = 0; + config.maxBlocksToVerify = 0; config.blockMaxProposals = 10; config.blockRingBufferSize = 12; config.livenessBond = 1e18; // 1 Taiko token - config.checkEOAForCalldataDA = false; + config.ontakeForkHeight = 0; } } @@ -21,7 +21,7 @@ contract Verifier { } } -contract TaikoL1Test is TaikoL1TestBase { +contract TaikoL1Tests is TaikoL1TestBase { function deployTaikoL1() internal override returns (TaikoL1) { return TaikoL1( payable( @@ -41,20 +41,19 @@ contract TaikoL1Test is TaikoL1TestBase { giveEthAndTko(Bob, 1e8 ether, 100 ether); console2.log("Bob balance:", tko.balanceOf(Bob)); giveEthAndTko(Carol, 1e8 ether, 100 ether); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { //printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); bytes32 blockHash = bytes32(1e10 + blockId); bytes32 stateRoot = bytes32(1e9 + blockId); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; @@ -69,36 +68,33 @@ contract TaikoL1Test is TaikoL1TestBase { /// @dev Test more than one block can be proposed, proven, & verified in the /// same L1 block. function test_L1_multiple_blocks_in_one_L1_block() external { - giveEthAndTko(Alice, 1000 ether, 1000 ether); + giveEthAndTko(Alice, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); giveEthAndTko(Carol, 1e8 ether, 100 ether); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId <= 20; ++blockId) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + printVariables("after propose"); bytes32 blockHash = bytes32(1e10 + blockId); bytes32 stateRoot = bytes32(1e9 + blockId); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; vm.warp(block.timestamp + tierProvider().getTier(minTier).cooldownWindow * 60 + 1); verifyBlock(2); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.id, blk.blockId); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, parentHash); - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); parentHash = blockHash; } @@ -107,25 +103,22 @@ contract TaikoL1Test is TaikoL1TestBase { /// @dev Test verifying multiple blocks in one transaction function test_L1_verifying_multiple_blocks_once() external { - giveEthAndTko(Alice, 1000 ether, 1000 ether); + giveEthAndTko(Alice, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); giveEthAndTko(Carol, 1e8 ether, 100 ether); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId <= conf.blockMaxProposals; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + printVariables("after propose"); bytes32 blockHash = bytes32(1e10 + blockId); bytes32 stateRoot = bytes32(1e9 + blockId); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); parentHash = blockHash; } @@ -140,14 +133,13 @@ contract TaikoL1Test is TaikoL1TestBase { function test_L1_in_proving_window_logic() external { giveEthAndTko(Alice, 1000 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); giveEthAndTko(Carol, 1e8 ether, 100 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId <= conf.blockMaxProposals; blockId++) { - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + bytes32 blockHash; bytes32 stateRoot; if (blockId % 2 == 0) { @@ -168,12 +160,12 @@ contract TaikoL1Test is TaikoL1TestBase { secondTransitionHash, stateRoot, meta.minTier, - TaikoErrors.L1_NOT_ASSIGNED_PROVER.selector + LibProving.L1_NOT_ASSIGNED_PROVER.selector ); // Only guardian or assigned prover is allowed if (blockId % 4 == 0) { - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); } else { proveBlock( Carol, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, "" @@ -202,13 +194,12 @@ contract TaikoL1Test is TaikoL1TestBase { function test_pauseProving() external { L1.pauseProving(true); - TaikoData.BlockMetadata memory meta; - giveEthAndTko(Alice, 1000 ether, 1000 ether); giveEthAndTko(Bob, 1e8 ether, 100 ether); // Proposing is still possible - (meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + // Proving is not, so supply the revert reason to proveBlock proveBlock( Bob, @@ -217,7 +208,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32("01"), bytes32("02"), meta.minTier, - TaikoErrors.L1_PROVING_PAUSED.selector + LibProving.L1_PROVING_PAUSED.selector ); } @@ -228,43 +219,18 @@ contract TaikoL1Test is TaikoL1TestBase { giveEthAndTko(Bob, 1e8 ether, 100 ether); // Proposing is also not possible - proposeButRevert(Alice, Bob, 1024, EssentialContract.INVALID_PAUSE_STATUS.selector); + proposeButRevert(Alice, 1024, EssentialContract.INVALID_PAUSE_STATUS.selector); // unpause L1.unpause(); // Proposing is possible again - proposeBlock(Alice, Bob, 1_000_000, 1024); + proposeBlock(Alice, 1024); } - function test_getTierIds() external { - uint16[] memory tiers = cp.getTierIds(); - assertEq(tiers[0], LibTiers.TIER_OPTIMISTIC); - assertEq(tiers[1], LibTiers.TIER_SGX); - assertEq(tiers[2], LibTiers.TIER_GUARDIAN); - - vm.expectRevert(); - cp.getTier(123); - } - - function proposeButRevert( - address proposer, - address prover, - uint24 txListSize, - bytes4 revertReason - ) - internal - { - uint256 msgValue = 2 ether; - AssignmentHook.ProverAssignment memory assignment; - TaikoData.HookCall[] memory hookcalls = new TaikoData.HookCall[](1); - hookcalls[0] = TaikoData.HookCall(address(assignmentHook), abi.encode(assignment)); - + function proposeButRevert(address proposer, uint24 txListSize, bytes4 revertReason) internal { vm.prank(proposer, proposer); vm.expectRevert(revertReason); - L1.proposeBlock{ value: msgValue }( - abi.encode(TaikoData.BlockParams(prover, address(0), 0, 0, hookcalls, "")), - new bytes(txListSize) - ); + L1.proposeBlockV2("", new bytes(txListSize)); } } diff --git a/packages/protocol/test/L1/TaikoL1LibProvingWithTiers.t.sol b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol similarity index 70% rename from packages/protocol/test/L1/TaikoL1LibProvingWithTiers.t.sol rename to packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol index 6a65281c7c8..d27eb8a968c 100644 --- a/packages/protocol/test/L1/TaikoL1LibProvingWithTiers.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol @@ -1,17 +1,17 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestBase.sol"; contract TaikoL1Tiers is TaikoL1 { - function getConfig() public view override returns (TaikoData.Config memory config) { + function getConfig() public pure override returns (TaikoData.Config memory config) { config = TaikoL1.getConfig(); - config.maxBlocksToVerifyPerProposal = 0; + config.maxBlocksToVerify = 0; config.blockMaxProposals = 10; config.blockRingBufferSize = 12; config.livenessBond = 1e18; // 1 Taiko token - config.checkEOAForCalldataDA = false; + config.ontakeForkHeight = 0; } } @@ -29,7 +29,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { } function proveHigherTierProof( - TaikoData.BlockMetadata memory meta, + TaikoData.BlockMetadataV2 memory meta, bytes32 parentHash, bytes32 stateRoot, bytes32 blockHash, @@ -50,19 +50,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e7 ether, 1000 ether); giveEthAndTko(Carol, 1e7 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e6 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -70,7 +63,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 stateRoot = bytes32(1e9 + blockId); // This proof cannot be verified obviously because of // blockhash:blockId - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); // Try to contest - but should revert with L1_ALREADY_PROVED proveBlock( @@ -80,7 +73,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { blockHash, stateRoot, meta.minTier, - TaikoErrors.L1_ALREADY_PROVED.selector + LibProving.L1_ALREADY_PROVED.selector ); vm.roll(block.number + 15 * 12); @@ -99,19 +92,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e8 ether, 1000 ether); giveEthAndTko(Carol, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -121,7 +107,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { // stateRoot instead of blockHash uint16 minTier = meta.minTier; - proveBlock(Bob, meta, parentHash, stateRoot, stateRoot, minTier, ""); + proveBlock(Alice, meta, parentHash, stateRoot, stateRoot, minTier, ""); // Try to contest proveBlock(Carol, meta, parentHash, blockHash, stateRoot, minTier, ""); @@ -152,19 +138,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e8 ether, 1000 ether); giveEthAndTko(Carol, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -173,7 +152,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { // This proof cannot be verified obviously because of // stateRoot instead of blockHash uint16 minTier = meta.minTier; - proveBlock(Bob, meta, parentHash, stateRoot, stateRoot, minTier, ""); + proveBlock(Alice, meta, parentHash, stateRoot, stateRoot, minTier, ""); // Try to contest proveBlock(Carol, meta, parentHash, blockHash, stateRoot, minTier, ""); @@ -204,19 +183,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e8 ether, 1000 ether); giveEthAndTko(Carol, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -226,7 +198,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { // stateRoot instead of blockHash uint16 minTier = meta.minTier; - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, minTier, ""); if (minTier == LibTiers.TIER_OPTIMISTIC) { // Try to contest @@ -261,19 +233,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e8 ether, 1000 ether); giveEthAndTko(Carol, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < 10; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -282,7 +247,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { // This proof cannot be verified obviously because of // stateRoot instead of blockHash uint16 minTier = meta.minTier; - proveBlock(Bob, meta, parentHash, stateRoot, stateRoot, minTier, ""); + proveBlock(Alice, meta, parentHash, stateRoot, stateRoot, minTier, ""); if (minTier == LibTiers.TIER_OPTIMISTIC) { // Try to contest @@ -305,7 +270,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { 0, stateRoot, LibTiers.TIER_GUARDIAN, - TaikoErrors.L1_INVALID_TRANSITION.selector + LibProving.L1_INVALID_TRANSITION.selector ); } @@ -324,21 +289,16 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { function test_L1_NonAssignedProverCannotBeFirstInProofWindowTime() external { giveEthAndTko(Alice, 1e8 ether, 100 ether); - // This is a very weird test (code?) issue here. - // If this line (or Bob's query balance) is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) console2.log("Alice balance:", tko.balanceOf(Alice)); - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); + giveEthAndTko(Carol, 1e8 ether, 100 ether); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < 10; blockId++) { //printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -351,7 +311,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { blockHash, stateRoot, meta.minTier, - TaikoErrors.L1_NOT_ASSIGNED_PROVER.selector + LibProving.L1_NOT_ASSIGNED_PROVER.selector ); vm.roll(block.number + 15 * 12); @@ -368,19 +328,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e7 ether, 1000 ether); giveEthAndTko(Carol, 1e7 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e6 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -391,7 +344,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { (, TaikoData.SlotB memory b) = L1.getStateVariables(); uint64 lastVerifiedBlockBefore = b.lastVerifiedBlockId; - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); console2.log("mintTier is:", meta.minTier); // Try to contest proveBlock( @@ -430,19 +383,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e7 ether, 1000 ether); giveEthAndTko(Carol, 1e7 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e6 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -450,7 +396,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 stateRoot = bytes32(1e9 + blockId); // This proof cannot be verified obviously because of // blockhash:blockId - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); // Try to contest - but should revert with L1_ALREADY_PROVED proveBlock( @@ -460,7 +406,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { 0, stateRoot, LibTiers.TIER_GUARDIAN, - TaikoErrors.L1_INVALID_TRANSITION.selector + LibProving.L1_INVALID_TRANSITION.selector ); vm.roll(block.number + 15 * 12); @@ -476,37 +422,49 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { } function test_L1_GuardianProverCanOverwriteIfNotSameProof() external { + uint64 syncInternal = L1.getConfig().stateRootSyncInternal; + console2.log("syncInternal:", syncInternal); + giveEthAndTko(Alice, 1e7 ether, 1000 ether); giveEthAndTko(Carol, 1e7 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e7 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { + bool isSyncBlock = LibUtils.isSyncBlock(syncInternal, blockId); + console2.log("blockId:", blockId); + console2.log("isSyncBlock:", isSyncBlock); + printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); - //printVariables("after propose"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + mine(1); - bytes32 blockHash = bytes32(1e10 + blockId); - bytes32 stateRoot = bytes32(1e9 + blockId); - // This proof cannot be verified obviously because of - // blockhash:blockId - proveBlock(Bob, meta, parentHash, stateRoot, stateRoot, meta.minTier, ""); + bytes32 blockHash = bytes32(1_000_000 + blockId); + bytes32 stateRoot = bytes32(2_000_000 + blockId); + + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); // Prove as guardian - proveBlock( - Carol, meta, parentHash, blockHash, bytes32(uint256(1)), LibTiers.TIER_GUARDIAN, "" - ); + blockHash = bytes32(1_000_000 + blockId + 100); + stateRoot = bytes32(2_000_000 + blockId + 100); + proveBlock(Carol, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); - // Prove as guardian again + // Re-prove as guardian + stateRoot = bytes32(2_000_000 + blockId + 200); + if (!isSyncBlock) { + // Changing stateRoot doesn't help + proveBlock( + Carol, + meta, + parentHash, + blockHash, + stateRoot, + LibTiers.TIER_GUARDIAN, + LibProving.L1_ALREADY_PROVED.selector + ); + } + blockHash = bytes32(1_000_000 + blockId + 200); proveBlock(Carol, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); vm.roll(block.number + 15 * 12); @@ -527,19 +485,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e8 ether, 1000 ether); giveEthAndTko(Carol, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < 10; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -554,7 +505,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { blockHash, stateRoot, LibTiers.TIER_SGX, - TaikoErrors.L1_INVALID_BLOCK_ID.selector + LibUtils.L1_INVALID_BLOCK_ID.selector ); parentHash = blockHash; @@ -568,19 +519,15 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e8 ether, 1000 ether); giveEthAndTko(Carol, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e8 ether, 100 ether); + + giveEthAndTko(Bob, 1e6 ether, 100 ether); console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < 10; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -588,7 +535,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 stateRoot = bytes32(1e9 + blockId); // Mess up metahash - meta.l1Height = 200; + meta.proposedIn = 200; proveBlock( Bob, meta, @@ -596,7 +543,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { blockHash, stateRoot, LibTiers.TIER_SGX, - TaikoErrors.L1_BLOCK_MISMATCH.selector + LibProving.L1_BLOCK_MISMATCH.selector ); parentHash = blockHash; @@ -608,19 +555,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e7 ether, 1000 ether); giveEthAndTko(Carol, 1e7 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are onsgoing with foundry team - giveEthAndTko(Bob, 1e7 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -628,7 +568,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 stateRoot = bytes32(1e9 + blockId); // This proof cannot be verified obviously because of blockhash is // exchanged with stateRoot - proveBlock(Bob, meta, parentHash, stateRoot, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, stateRoot, stateRoot, meta.minTier, ""); // Prove as guardian proveBlock(Carol, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); @@ -641,7 +581,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { stateRoot, stateRoot, LibTiers.TIER_SGX, - TaikoErrors.L1_INVALID_TIER.selector + LibProving.L1_INVALID_TIER.selector ); vm.roll(block.number + 15 * 12); @@ -660,24 +600,17 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e7 ether, 1000 ether); giveEthAndTko(Carol, 1e7 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e6 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); bytes32 blockHash = bytes32(uint256(1)); bytes32 stateRoot = bytes32(uint256(1)); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); // Try to contest with a lower tier proof- but should revert with L1_INVALID_TIER proveBlock( @@ -687,7 +620,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { blockHash, stateRoot, LibTiers.TIER_SGX, - TaikoErrors.L1_INVALID_TIER.selector + LibProving.L1_INVALID_TIER.selector ); printVariables(""); diff --git a/packages/protocol/test/L1/TaikoL1TestBase.sol b/packages/protocol/test/layer1/based/TaikoL1TestBase.sol similarity index 65% rename from packages/protocol/test/L1/TaikoL1TestBase.sol rename to packages/protocol/test/layer1/based/TaikoL1TestBase.sol index adf4cbed7e8..49c0d6e32df 100644 --- a/packages/protocol/test/L1/TaikoL1TestBase.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestBase.sol @@ -1,20 +1,20 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../TaikoTest.sol"; +import "../TaikoL1Test.sol"; abstract contract TaikoL1TestBase is TaikoTest { AddressManager public addressManager; - AssignmentHook public assignmentHook; TaikoToken public tko; SignalService public ss; TaikoL1 public L1; TaikoData.Config conf; uint256 internal logCount; - RiscZeroVerifier public rv; + Risc0Verifier public rv; + SP1Verifier public sp1; SgxVerifier public sv; GuardianProver public gp; - TestTierProvider public cp; + TestTierRouter public tr; Bridge public bridge; bytes32 public GENESIS_BLOCK_HASH = keccak256("GENESIS_BLOCK_HASH"); @@ -22,8 +22,8 @@ abstract contract TaikoL1TestBase is TaikoTest { address public L2SS = randAddress(); address public L2 = randAddress(); // Bootstrapped SGX instances (by owner) - address internal SGX_X_0 = vm.addr(0x4); - address internal SGX_X_1 = vm.addr(0x5); + address internal SGX_X_0 = vm.addr(0x1000004); + address internal SGX_X_1 = vm.addr(0x1000005); function deployTaikoL1() internal virtual returns (TaikoL1 taikoL1); @@ -75,7 +75,7 @@ abstract contract TaikoL1TestBase is TaikoTest { setupGuardianProverMultisig(); - cp = new TestTierProvider(); + tr = new TestTierRouter(); bridge = Bridge( payable( @@ -88,18 +88,10 @@ abstract contract TaikoL1TestBase is TaikoTest { ) ); - assignmentHook = AssignmentHook( - deployProxy({ - name: "assignment_hook", - impl: address(new AssignmentHook()), - data: abi.encodeCall(AssignmentHook.init, (address(0), address(addressManager))) - }) - ); - registerAddress("taiko", address(L1)); registerAddress("tier_sgx", address(sv)); registerAddress("tier_guardian", address(gp)); - registerAddress("tier_router", address(cp)); + registerAddress("tier_router", address(tr)); registerAddress("signal_service", address(ss)); registerL2Address("taiko", address(L2)); registerL2Address("signal_service", address(L2SS)); @@ -113,82 +105,29 @@ abstract contract TaikoL1TestBase is TaikoTest { registerTo: address(addressManager) }) ); + registerAddress("bond_token", address(tko)); L1.init(address(0), address(addressManager), GENESIS_BLOCK_HASH, false); + mine(1); - gp.enableTaikoTokenAllowance(true); + gp.enableBondAllowance(true); printVariables("init "); } function proposeBlock( address proposer, - address prover, - uint32 gasLimit, uint24 txListSize ) internal - returns (TaikoData.BlockMetadata memory meta, TaikoData.EthDeposit[] memory ethDeposits) + returns (TaikoData.BlockMetadataV2 memory) { - TaikoData.TierFee[] memory tierFees = new TaikoData.TierFee[](3); - // Register the tier fees - // Based on OPL2ConfigTier we need 3: - // - LibTiers.TIER_SGX; - // - LibTiers.TIER_OPTIMISTIC; - // - LibTiers.TIER_GUARDIAN; - tierFees[0] = TaikoData.TierFee(LibTiers.TIER_OPTIMISTIC, 1 ether); - tierFees[1] = TaikoData.TierFee(LibTiers.TIER_SGX, 1 ether); - tierFees[2] = TaikoData.TierFee(LibTiers.TIER_GUARDIAN, 0 ether); - // For the test not to fail, set the message.value to the highest, the - // rest will be returned - // anyways - uint256 msgValue = 2 ether; - - AssignmentHook.ProverAssignment memory assignment = AssignmentHook.ProverAssignment({ - feeToken: address(0), - tierFees: tierFees, - expiry: uint64(block.timestamp + 60 minutes), - maxBlockId: 0, - maxProposedIn: 0, - metaHash: 0, - parentMetaHash: 0, - signature: new bytes(0) - }); - - assignment.signature = _signAssignment( - prover, assignment, address(L1), proposer, keccak256(new bytes(txListSize)) - ); - - (, TaikoData.SlotB memory b) = L1.getStateVariables(); - - uint256 _difficulty; - unchecked { - _difficulty = block.prevrandao * b.numBlocks; - } - - // TODO: why init meta here? - meta.timestamp = uint64(block.timestamp); - meta.l1Height = uint64(block.number - 1); - meta.l1Hash = blockhash(block.number - 1); - meta.difficulty = bytes32(_difficulty); - meta.gasLimit = gasLimit; - - TaikoData.HookCall[] memory hookcalls; - if (prover != proposer) { - hookcalls = new TaikoData.HookCall[](1); - hookcalls[0] = TaikoData.HookCall(address(assignmentHook), abi.encode(assignment)); - } else { - hookcalls = new TaikoData.HookCall[](0); - } vm.prank(proposer, proposer); - (meta, ethDeposits) = L1.proposeBlock{ value: msgValue }( - abi.encode(TaikoData.BlockParams(prover, address(0), 0, 0, hookcalls, "")), - new bytes(txListSize) - ); + return L1.proposeBlockV2("", new bytes(txListSize)); } function proveBlock( address prover, - TaikoData.BlockMetadata memory meta, + TaikoData.BlockMetadataV2 memory meta, bytes32 parentHash, bytes32 blockHash, bytes32 stateRoot, @@ -231,18 +170,18 @@ abstract contract TaikoL1TestBase is TaikoTest { // Grant 2 signatures, 3rd might be a revert vm.prank(David, David); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); vm.prank(Emma, Emma); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); if (revertReason != "") { vm.prank(Frank, Frank); vm.expectRevert(); // Revert reason is 'wrapped' so will not be // identical to the expectedRevert - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); } else { vm.prank(Frank, Frank); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); } } else { if (revertReason != "") { @@ -281,36 +220,6 @@ abstract contract TaikoL1TestBase is TaikoTest { console2.log(conf.chainId, string(abi.encodePacked(nameHash)), unicode"→", addr); } - function _signAssignment( - address prover, - AssignmentHook.ProverAssignment memory assignment, - address taikoAddr, - address blockProposer, - bytes32 blobHash - ) - internal - view - returns (bytes memory signature) - { - uint256 signerPrivateKey; - - // In the test suite these are the 3 which acts as provers - if (prover == Alice) { - signerPrivateKey = 0x1; - } else if (prover == Bob) { - signerPrivateKey = 0x2; - } else if (prover == Carol) { - signerPrivateKey = 0x3; - } else { - revert("unexpected"); - } - - bytes32 assignmentHash = - assignmentHook.hashAssignment(assignment, taikoAddr, blockProposer, prover, blobHash); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPrivateKey, assignmentHash); - signature = abi.encodePacked(r, s, v); - } - function createSgxSignatureProof( TaikoData.Transition memory tran, address newInstance, @@ -330,9 +239,9 @@ abstract contract TaikoL1TestBase is TaikoTest { // In the test suite these are the 3 which acts as provers if (SGX_X_0 == newInstance) { - signerPrivateKey = 0x5; + signerPrivateKey = 0x1000005; } else if (SGX_X_1 == newInstance) { - signerPrivateKey = 0x4; + signerPrivateKey = 0x1000004; } (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPrivateKey, digest); @@ -345,8 +254,6 @@ abstract contract TaikoL1TestBase is TaikoTest { vm.prank(to, to); tko.approve(address(L1), amountTko); - vm.prank(to, to); - tko.approve(address(assignmentHook), amountTko); console2.log("TKO balance:", to, tko.balanceOf(to)); console2.log("ETH balance:", to, to.balance); diff --git a/packages/protocol/test/L1/TaikoL1TestGroup1.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup1.t.sol similarity index 61% rename from packages/protocol/test/L1/TaikoL1TestGroup1.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup1.t.sol index a9f8bd93f30..9226cc75074 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup1.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup1.t.sol @@ -1,42 +1,44 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block within the proving window, using the correct parent hash. - // 3. Bob's proof is used to verify the block. + // 1. Alice proposes a block + // 2. Alice proves the block within the proving window, using the correct parent hash. + // 3. Alice's proof is used to verify the block. function test_taikoL1_group_1_case_1() external { vm.warp(1_000_000); printBlockAndTrans(0); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; uint256 proposedAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.minTier, LibTiers.TIER_OPTIMISTIC); assertEq(blk.nextTransitionId, 1); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, livenessBond); + assertEq(meta.livenessBond, livenessBond); + assertEq(meta.proposer, Alice); + assertEq(meta.timestamp, block.timestamp); + assertEq(meta.anchorBlockId, block.number - 1); + assertEq(meta.proposedAt, block.timestamp); + assertEq(meta.proposedIn, block.number); proposedAt = blk.proposedAt; - assertEq(tko.balanceOf(Alice), 10_000 ether); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); } // Prove the block @@ -53,38 +55,35 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { blockHash, stateRoot, meta.minTier, - TaikoErrors.L1_NOT_ASSIGNED_PROVER.selector + LibProving.L1_NOT_ASSIGNED_PROVER.selector ); - console2.log("====== Bob proves the block"); + console2.log("====== Alice proves the block"); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); uint256 provenAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_OPTIMISTIC); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.validityBond, tierOp.validityBond); assertEq(ts.timestamp, block.timestamp); provenAt = ts.timestamp; - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); } console2.log("====== Verify block"); @@ -93,29 +92,26 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_OPTIMISTIC); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.validityBond, tierOp.validityBond); assertEq(ts.timestamp, provenAt); - assertEq(tko.balanceOf(Bob), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. Taylor proposes the block outside the proving window. // 3. Taylor's proof is used to verify the block. function test_taikoL1_group_1_case_2() external { @@ -123,30 +119,32 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { printBlockAndTrans(0); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; uint256 proposedAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.minTier, LibTiers.TIER_OPTIMISTIC); assertEq(blk.nextTransitionId, 1); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, livenessBond); + assertEq(meta.livenessBond, livenessBond); + assertEq(meta.proposer, Alice); + assertEq(meta.timestamp, block.timestamp); + assertEq(meta.anchorBlockId, block.number - 1); + assertEq(meta.proposedAt, block.timestamp); + assertEq(meta.proposedIn, block.number); proposedAt = blk.proposedAt; - assertEq(tko.balanceOf(Alice), 10_000 ether); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); } // Prove the block @@ -163,27 +161,26 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_OPTIMISTIC); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.prover, Taylor); assertEq(ts.validityBond, tierOp.validityBond); assertEq(ts.timestamp, block.timestamp); provenAt = ts.timestamp; - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.validityBond); + assertEq( + totalTkoBalance(tko, L1, Taylor), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); } console2.log("====== Verify block"); @@ -192,42 +189,39 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_OPTIMISTIC); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.prover, Taylor); assertEq(ts.validityBond, tierOp.validityBond); assertEq(ts.timestamp, provenAt); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + livenessBond * 7 / 8); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block within the proving window. + // 1. Alice proposes a block, + // 2. Alice proves the block within the proving window. // 3. Taylor proves the block outside the proving window. // 4. Taylor's proof is used to verify the block. function test_taikoL1_group_1_case_3() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); // Prove the block bytes32 parentHash1 = bytes32(uint256(9)); @@ -237,8 +231,8 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { mineAndWrap(10 seconds); - console2.log("====== Bob proves the block first"); - proveBlock(Bob, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); + console2.log("====== Alice proves the block first"); + proveBlock(Alice, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); console2.log("====== Taylor proves the block later"); mineAndWrap(10 seconds); @@ -250,37 +244,34 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 3); assertEq(blk.verifiedTransitionId, 2); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 2); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.prover, Taylor); assertEq(ts.validityBond, tierOp.validityBond); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block within the proving window. + // 1. Alice proposes a block, + // 2. Alice proves the block within the proving window. // 3. Taylor proves the block outside the proving window. - // 4. Bob's proof is used to verify the block. + // 4. Alice's proof is used to verify the block. function test_taikoL1_group_1_case_4() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); // Prove the block bytes32 parentHash1 = GENESIS_BLOCK_HASH; @@ -290,8 +281,8 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { mineAndWrap(10 seconds); - console2.log("====== Bob proves the block first"); - proveBlock(Bob, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); + console2.log("====== Alice proves the block first"); + proveBlock(Alice, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); console2.log("====== Taylor proves the block later"); mineAndWrap(10 seconds); @@ -303,38 +294,34 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 3); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.validityBond, tierOp.validityBond); - assertEq(tko.balanceOf(Bob), 10_000 ether); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.validityBond); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. William proves the block outside the proving window. // 3. Taylor also proves the block outside the proving window. // 4. Taylor's proof is used to verify the block. function test_taikoL1_group_1_case_5() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); // Prove the block bytes32 parentHash1 = bytes32(uint256(9)); @@ -357,56 +344,54 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 3); assertEq(blk.verifiedTransitionId, 2); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 2); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.prover, Taylor); assertEq(ts.validityBond, tierOp.validityBond); - assertEq(tko.balanceOf(Bob), 10_000 ether - L1.getConfig().livenessBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - L1.getConfig().livenessBond); } } - // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block outside the proving window, using the correct parent hash. - // 3. Bob's proof is used to verify the block. + // Test summary: + // 1. Alice proposes a block, + // 2. Alice proves the block outside the proving window, using the correct parent hash. + // 3. Alice's proof is used to verify the block. function test_taikoL1_group_1_case_6() external { vm.warp(1_000_000); printBlockAndTrans(0); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; uint256 proposedAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.minTier, LibTiers.TIER_OPTIMISTIC); assertEq(blk.nextTransitionId, 1); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, livenessBond); + assertEq(meta.livenessBond, livenessBond); + assertEq(meta.proposer, Alice); + assertEq(meta.timestamp, block.timestamp); + assertEq(meta.anchorBlockId, block.number - 1); + assertEq(meta.proposedAt, block.timestamp); + assertEq(meta.proposedIn, block.number); proposedAt = blk.proposedAt; - assertEq(tko.balanceOf(Alice), 10_000 ether); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); } // Prove the block @@ -414,35 +399,35 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); - console2.log("====== Bob proves the block outside the proving window"); + console2.log("====== Alice proves the block outside the proving window"); mineAndWrap(7 days); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); uint256 provenAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_OPTIMISTIC); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.validityBond, tierOp.validityBond); assertEq(ts.timestamp, block.timestamp); provenAt = ts.timestamp; - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond - livenessBond); + assertEq( + totalTkoBalance(tko, L1, Alice), + 10_000 ether - tierOp.validityBond - livenessBond / 8 + ); } console2.log("====== Verify block"); @@ -451,24 +436,21 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_OPTIMISTIC); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.validityBond, tierOp.validityBond); assertEq(ts.timestamp, provenAt); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond / 8); } } @@ -481,24 +463,28 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { giveEthAndTko(Alice, 10_000 ether, 1000 ether); console2.log("====== Alice propose a block with herself as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; uint256 proposedAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.minTier, LibTiers.TIER_OPTIMISTIC); assertEq(blk.nextTransitionId, 1); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.assignedProver, Alice); - assertEq(blk.livenessBond, livenessBond); + assertEq(meta.livenessBond, livenessBond); + assertEq(meta.proposer, Alice); + assertEq(meta.timestamp, block.timestamp); + assertEq(meta.anchorBlockId, block.number - 1); + assertEq(meta.proposedAt, block.timestamp); + assertEq(meta.proposedIn, block.number); proposedAt = blk.proposedAt; - assertEq(tko.balanceOf(Alice), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); } } } diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup10.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup10.t.sol new file mode 100644 index 00000000000..489daa1c10b --- /dev/null +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup10.t.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoL1TestGroupBase.sol"; + +contract TaikoL10TestGroup1 is TaikoL1TestGroupBase { + // Test summary: + // 1. Alice proposes 5 blocks, + // 2. Alice proves all 5 block within the proving window, using the correct parent hash. + // 3. Verify up to 10 blocks + function test_taikoL1_group_10_case_1() external { + vm.warp(1_000_000); + printBlockAndTrans(0); + + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + + console2.log("====== Alice propose 5 block"); + bytes32 parentHash = GENESIS_BLOCK_HASH; + + for (uint256 i = 1; i <= 5; ++i) { + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); + + // Prove the block + bytes32 blockHash = bytes32(uint256(10_000 + i)); + bytes32 stateRoot = bytes32(uint256(20_000 + i)); + + mineAndWrap(10 seconds); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + + printBlockAndTrans(meta.id); + + parentHash = blockHash; + } + + console2.log("====== Verify up to 10 block"); + mineAndWrap(7 days); + verifyBlock(10); + { + (, TaikoData.SlotB memory b) = L1.getStateVariables(); + assertEq(b.lastVerifiedBlockId, 5); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + } + } +} diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup11.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup11.t.sol new file mode 100644 index 00000000000..6f5feb65b58 --- /dev/null +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup11.t.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoL1TestGroupBase.sol"; + +contract TaikoL10TestGroup11 is TaikoL1TestGroupBase { + // Test summary: + // 1. Zachary proposes a block with a custom proposer in the block parameters + // 2. The proposal will revert as Zachary is not registered as the preconf task manager. + function test_taikoL1_group_11_case_1() external { + vm.warp(1_000_000); + printBlockAndTrans(0); + + giveEthAndTko(Zachary, 10_000 ether, 1000 ether); + + ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + + console2.log("====== Zachary proposes a block"); + + TaikoData.BlockParamsV2 memory params; + params.proposer = Alice; + proposeBlock(Zachary, params, LibProposing.L1_INVALID_CUSTOM_PROPOSER.selector); + } + + // Test summary: + // 1. Zachary proposes a block with a Alice as the proposer + // 2. Alice proves the block + // 3. Alice verifies the block to get back her bonds. + function test_taikoL1_group_11_case_2() external { + registerAddress("preconf_task_manager", Zachary); + + vm.warp(1_000_000); + printBlockAndTrans(0); + + giveEthAndTko(Zachary, 10_000 ether, 1000 ether); + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + + console2.log("====== Zachary proposes a block with Alice as the proposer"); + + TaikoData.BlockParamsV2 memory params; + params.proposer = Alice; + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Zachary, params, ""); + + assertEq(totalTkoBalance(tko, L1, Zachary), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - L1.getConfig().livenessBond); + + console2.log("====== Alice proves the block"); + // Prove the block + bytes32 blockHash = bytes32(uint256(10_000)); + bytes32 stateRoot = bytes32(uint256(20_000)); + + mineAndWrap(10 seconds); + proveBlock(Alice, meta, GENESIS_BLOCK_HASH, blockHash, stateRoot, meta.minTier, ""); + + assertEq(totalTkoBalance(tko, L1, Zachary), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + + printBlockAndTrans(meta.id); + + console2.log("====== Alice's block is verified"); + mineAndWrap(7 days); + verifyBlock(1); + + assertEq(totalTkoBalance(tko, L1, Zachary), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + } +} diff --git a/packages/protocol/test/L1/TaikoL1TestGroup2.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup2.t.sol similarity index 59% rename from packages/protocol/test/L1/TaikoL1TestGroup2.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup2.t.sol index 94f8a2f166d..364c1f62717 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup2.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup2.t.sol @@ -1,37 +1,37 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, Bob as the prover. - // 2. Bob proves the block within the proving window, with correct parent hash. - // 3. Taylor contests Bob's proof. - // 4. William proves Bob is correct and Taylor is wrong. + // 1. Alice proposes a block, Alice as the prover. + // 2. Alice proves the block within the proving window, with correct parent hash. + // 3. Taylor contests Alice's proof. + // 4. William proves Alice is correct and Taylor is wrong. // 5. William's proof is used to verify the block. function test_taikoL1_group_2_case_1() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); - console2.log("====== Bob proves the block as the assigned prover"); + console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); - console2.log("====== Taylor contests Bob"); + console2.log("====== Taylor contests Alice"); bytes32 blockHash2 = bytes32(uint256(20)); bytes32 stateRoot2 = bytes32(uint256(21)); mineAndWrap(10 seconds); @@ -40,11 +40,9 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -53,40 +51,37 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { assertEq(ts.contester, Taylor); assertEq(ts.contestBond, tierOp.contestBond); assertEq(ts.validityBond, tierOp.validityBond); - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); } - console2.log("====== William proves Bob is right"); + console2.log("====== William proves Alice is right"); mineAndWrap(10 seconds); proveBlock(William, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_SGX, ""); { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, William); assertEq(ts.timestamp, block.timestamp); // not zero - assertEq(tko.balanceOf(Bob), 10_000 ether); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); assertEq( - tko.balanceOf(William), + totalTkoBalance(tko, L1, William), 10_000 ether - tierSgx.validityBond + tierOp.contestBond * 7 / 8 ); } @@ -97,52 +92,50 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); // assertEq(blk.livenessBond, livenessBond); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_SGX); - assertEq(ts.contestBond, 1); assertEq(ts.prover, William); - assertEq(tko.balanceOf(William), 10_000 ether + tierOp.contestBond * 7 / 8); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether + tierOp.contestBond * 7 / 8); } } // Test summary: - // 1. Alice proposes a block, Bob as the prover. - // 2. Bob proves the block within the proving window, with correct parent hash. - // 3. Taylor contests Bob's proof. - // 4. William proves Taylor is correct and Bob is wrong. + // 1. Alice proposes a block, Alice as the prover. + // 2. Alice proves the block within the proving window, with correct parent hash. + // 3. Taylor contests Alice's proof. + // 4. William proves Taylor is correct and Alice is wrong. // 5. William's proof is used to verify the block. function test_taikoL1_group_2_case_2() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); - console2.log("====== Bob proves the block as the assigned prover"); + console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); - console2.log("====== Taylor contests Bob"); + console2.log("====== Taylor contests Alice"); bytes32 blockHash2 = bytes32(uint256(20)); bytes32 stateRoot2 = bytes32(uint256(21)); mineAndWrap(10 seconds); @@ -151,11 +144,9 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -164,11 +155,11 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { assertEq(ts.contester, Taylor); assertEq(ts.contestBond, tierOp.contestBond); assertEq(ts.validityBond, tierOp.validityBond); - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); } console2.log("====== William proves Tayler is right"); @@ -178,27 +169,27 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, William); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); uint256 quarterReward = tierOp.validityBond * 7 / 8 / 4; - assertEq(tko.balanceOf(Taylor), 10_000 ether + quarterReward * 3); - assertEq(tko.balanceOf(William), 10_000 ether - tierSgx.validityBond + quarterReward); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + quarterReward * 3); + assertEq( + totalTkoBalance(tko, L1, William), + 10_000 ether - tierSgx.validityBond + quarterReward + ); } console2.log("====== Verify the block"); @@ -207,26 +198,24 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, William); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); uint256 quarterReward = tierOp.validityBond * 7 / 8 / 4; - assertEq(tko.balanceOf(Taylor), 10_000 ether + quarterReward * 3); - assertEq(tko.balanceOf(William), 10_000 ether + quarterReward); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + quarterReward * 3); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether + quarterReward); } } } diff --git a/packages/protocol/test/L1/TaikoL1TestGroup3.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup3.t.sol similarity index 67% rename from packages/protocol/test/L1/TaikoL1TestGroup3.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup3.t.sol index ee181cda4a0..0375309e8d0 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup3.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup3.t.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. James proves the block outside the proving window, using the correct parent hash. // 3. Taylor contests James' proof. // 4. William proves James is correct and Taylor is wrong. @@ -14,15 +14,15 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(James, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; @@ -43,11 +43,9 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -59,9 +57,12 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { assertEq(ts.prover, James); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(James), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + totalTkoBalance(tko, L1, James), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); } console2.log("====== William proves James is right"); @@ -71,26 +72,23 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, William); assertEq(ts.timestamp, block.timestamp); // not zero - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); assertEq( - tko.balanceOf(William), + totalTkoBalance(tko, L1, William), 10_000 ether - tierSgx.validityBond + tierOp.contestBond * 7 / 8 ); } @@ -101,26 +99,24 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); // assertEq(blk.livenessBond, livenessBond); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_SGX); - assertEq(ts.contestBond, 1); assertEq(ts.prover, William); - assertEq(tko.balanceOf(William), 10_000 ether + tierOp.contestBond * 7 / 8); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether + tierOp.contestBond * 7 / 8); } } // Test summary: - // 1. Alice proposes a block, Bob as the prover. + // 1. Alice proposes a block, Alice as the prover. // 2. James proves the block outside the proving window, with correct parent hash. // 3. Taylor contests James' proof. // 4. William proves Taylor is correct and James is wrong. @@ -129,15 +125,15 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(James, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; @@ -158,11 +154,9 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -174,9 +168,12 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { assertEq(ts.prover, James); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(James), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + totalTkoBalance(tko, L1, James), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); } console2.log("====== William proves Tayler is right"); @@ -186,28 +183,31 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, William); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(James), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + totalTkoBalance(tko, L1, James), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); uint256 quarterReward = tierOp.validityBond * 7 / 8 / 4; - assertEq(tko.balanceOf(Taylor), 10_000 ether + quarterReward * 3); - assertEq(tko.balanceOf(William), 10_000 ether - tierSgx.validityBond + quarterReward); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + quarterReward * 3); + assertEq( + totalTkoBalance(tko, L1, William), + 10_000 ether - tierSgx.validityBond + quarterReward + ); } console2.log("====== Verify the block"); @@ -216,27 +216,28 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, William); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); uint256 quarterReward = tierOp.validityBond * 7 / 8 / 4; - assertEq(tko.balanceOf(James), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether + quarterReward * 3); - assertEq(tko.balanceOf(William), 10_000 ether + quarterReward); + assertEq( + totalTkoBalance(tko, L1, James), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + quarterReward * 3); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether + quarterReward); } } } diff --git a/packages/protocol/test/L1/TaikoL1TestGroup4.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup4.t.sol similarity index 64% rename from packages/protocol/test/L1/TaikoL1TestGroup4.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup4.t.sol index 4c0cf35c3a4..5a748170b7a 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup4.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup4.t.sol @@ -1,36 +1,36 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, Bob is the prover. - // 2. Bob proves the block within the proving window, using the correct parent hash. - // 3. Taylor contests then proves Bob is wrong in the same transaction with a higher-tier + // 1. Alice proposes a block, Alice is the prover. + // 2. Alice proves the block within the proving window, using the correct parent hash. + // 3. Taylor contests then proves Alice is wrong in the same transaction with a higher-tier // proof. // 4. Taylor's proof is used to verify the block. function test_taikoL1_group_4_case_1() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); - console2.log("====== Bob proves the block as the assigned prover"); + console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); - console2.log("====== Taylor contests Bob with a higher tier proof"); + console2.log("====== Taylor contests Alice with a higher tier proof"); bytes32 blockHash2 = bytes32(uint256(20)); bytes32 stateRoot2 = bytes32(uint256(21)); mineAndWrap(10 seconds); @@ -39,23 +39,20 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, Taylor); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); assertEq( tko.balanceOf(Taylor), 10_000 ether - tierSgx.validityBond + tierOp.validityBond * 7 / 8 @@ -68,26 +65,24 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); // assertEq(blk.livenessBond, livenessBond); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); - assertEq(ts.contestBond, 1); assertEq(ts.prover, Taylor); - assertEq(tko.balanceOf(Taylor), 10_000 ether + tierOp.validityBond * 7 / 8); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + tierOp.validityBond * 7 / 8); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. David proves the block outside the proving window, using the correct parent hash. // 3. Taylor contests then proves David is wrong in the same transaction with a higher-tier // proof. @@ -96,18 +91,18 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(David, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; - console2.log("====== Bob proves the block as the assigned prover"); + console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); @@ -124,24 +119,23 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, Taylor); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(David), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + tko.balanceOf(David), 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); assertEq( tko.balanceOf(Taylor), 10_000 ether - tierSgx.validityBond + tierOp.validityBond * 7 / 8 @@ -154,21 +148,18 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); - assertEq(ts.contestBond, 1); assertEq(ts.prover, Taylor); - assertEq(tko.balanceOf(Taylor), 10_000 ether + tierOp.validityBond * 7 / 8); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + tierOp.validityBond * 7 / 8); } } } diff --git a/packages/protocol/test/L1/TaikoL1TestGroup5.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup5.t.sol similarity index 68% rename from packages/protocol/test/L1/TaikoL1TestGroup5.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup5.t.sol index 7e263b24caf..9b59addfd55 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup5.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup5.t.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. Guardian prover directly proves the block. // 3. Guardian prover re-proves the same transition and fails. // 4. Guardian prover proves the block again with a different transition. @@ -14,11 +14,11 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Guardian prover proves"); bytes32 parentHash = GENESIS_BLOCK_HASH; @@ -31,24 +31,21 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, 0); assertEq(ts.prover, address(gp)); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } console2.log("====== Guardian re-approve with the same transition"); @@ -60,7 +57,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { blockHash, stateRoot, LibTiers.TIER_GUARDIAN, - TaikoErrors.L1_ALREADY_PROVED.selector + LibProving.L1_ALREADY_PROVED.selector ); console2.log("====== Guardian re-approve with a different transition"); @@ -72,24 +69,21 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, 0); assertEq(ts.prover, address(gp)); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } console2.log("====== William contests with a lower tier proof"); @@ -101,7 +95,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { blockHash, stateRoot, LibTiers.TIER_SGX, - TaikoErrors.L1_INVALID_TIER.selector + LibProving.L1_INVALID_TIER.selector ); console2.log("====== Verify the block"); @@ -110,28 +104,25 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); - assertEq(ts.contestBond, 1); assertEq(ts.prover, address(gp)); - assertEq(tko.balanceOf(Bob), 10_000 ether); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } } // Test summary: - // 1. Alice proposes a block, Bob is the prover. - // 2. Bob proves the block. + // 1. Alice proposes a block, Alice is the prover. + // 2. Alice proves the block. // 3. Guardian prover re-proves the same transition and fails. // 4. Guardian prover proves the block with a different transition. // 5. William contests the guardian prover using a lower-tier proof and fails. @@ -139,20 +130,20 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); - console2.log("====== Bob proves the block"); + console2.log("====== Alice proves the block"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); console2.log("====== Guardian re-approve with the same transition"); mineAndWrap(10 seconds); @@ -163,7 +154,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { blockHash, stateRoot, LibTiers.TIER_GUARDIAN, - TaikoErrors.L1_ALREADY_PROVED.selector + LibProving.L1_ALREADY_PROVED.selector ); console2.log("====== Guardian re-approve with a different transition"); @@ -175,24 +166,21 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, 0); assertEq(ts.prover, address(gp)); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } console2.log("====== Verify the block"); @@ -201,27 +189,24 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); - assertEq(ts.contestBond, 1); assertEq(ts.prover, address(gp)); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. David proves the block outside the proving window. // 3. Guardian prover re-proves the same transition and fails. // 4. Guardian prover proves the block with a different transition. @@ -230,13 +215,13 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(David, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; @@ -257,7 +242,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { blockHash, stateRoot, LibTiers.TIER_GUARDIAN, - TaikoErrors.L1_ALREADY_PROVED.selector + LibProving.L1_ALREADY_PROVED.selector ); console2.log("====== Guardian re-approve with a different transition"); @@ -269,25 +254,24 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, 0); assertEq(ts.prover, address(gp)); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(David), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + tko.balanceOf(David), 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } console2.log("====== Verify the block"); @@ -296,38 +280,37 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); - assertEq(ts.contestBond, 1); assertEq(ts.prover, address(gp)); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(David), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + tko.balanceOf(David), 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. Guardian prover directly proves the block out of proving window function test_taikoL1_group_5_case_4() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Guardian prover proves"); bytes32 parentHash = GENESIS_BLOCK_HASH; @@ -340,24 +323,21 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, 0); assertEq(ts.prover, address(gp)); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - L1.getConfig().livenessBond); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - L1.getConfig().livenessBond); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } } } diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup6.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup6.t.sol new file mode 100644 index 00000000000..8dbb1649542 --- /dev/null +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup6.t.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoL1TestGroupBase.sol"; + +contract TaikoL1TestGroup6 is TaikoL1TestGroupBase { + // Test summary: + // 1. Alice proposes a block, + // 2. Alice proves the block within the proving window, using the correct parent hash. + // 3. Taylor contests Alice's proof. + // 4. Alice re-proves his proof, showing Taylor is incorrect. + // 5. Alice's proof is validated and used to verify the block. + function test_taikoL1_group_6_case_1() external { + vm.warp(1_000_000); + + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); + + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); + + console2.log("====== Alice proves the block as the assigned prover"); + bytes32 parentHash = GENESIS_BLOCK_HASH; + bytes32 blockHash = bytes32(uint256(10)); + bytes32 stateRoot = bytes32(uint256(11)); + + mineAndWrap(10 seconds); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + + console2.log("====== Taylor contests Alice"); + bytes32 blockHash2 = bytes32(uint256(20)); + bytes32 stateRoot2 = bytes32(uint256(21)); + mineAndWrap(10 seconds); + proveBlock(Taylor, meta, parentHash, blockHash2, stateRoot2, meta.minTier, ""); + + console2.log("====== Alice cannot proves himself is right"); + mineAndWrap(10 seconds); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_SGX, ""); + + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 0); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash); + assertEq(ts.stateRoot, stateRoot); + assertEq(ts.tier, LibTiers.TIER_SGX); + assertEq(ts.contester, address(0)); + assertEq(ts.validityBond, tierSgx.validityBond); + assertEq(ts.prover, Alice); + assertEq(ts.timestamp, block.timestamp); // not zero + + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); + assertEq( + totalTkoBalance(tko, L1, Alice), + 10_000 ether - tierSgx.validityBond + tierOp.contestBond * 7 / 8 + ); + } + + console2.log("====== Verify the block"); + mineAndWrap(7 days); + verifyBlock(1); + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 1); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash); + assertEq(ts.stateRoot, stateRoot); + assertEq(ts.tier, LibTiers.TIER_SGX); + assertEq(ts.prover, Alice); + + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether + tierOp.contestBond * 7 / 8); + } + } +} diff --git a/packages/protocol/test/L1/TaikoL1TestGroup7.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup7.t.sol similarity index 55% rename from packages/protocol/test/L1/TaikoL1TestGroup7.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup7.t.sol index e2b9897e46a..f8d57a59536 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup7.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup7.t.sol @@ -1,31 +1,30 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup7 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block within the proving window, using the correct parent hash. - // 3. After the cooldown window, Taylor contests Bob's proof, and fails. + // 1. Alice proposes a block, + // 2. Alice proves the block within the proving window, using the correct parent hash. + // 3. After the cooldown window, Taylor contests Alice's proof, and fails. function test_taikoL1_group_7_case_1() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); - console2.log("====== Bob proves the block as the assigned prover"); + console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); mineAndWrap(tierOp.cooldownWindow * 60); bytes32 blockHash2 = bytes32(uint256(20)); @@ -37,35 +36,34 @@ contract TaikoL1TestGroup7 is TaikoL1TestGroupBase { blockHash2, stateRoot2, meta.minTier, - TaikoErrors.L1_CANNOT_CONTEST.selector + LibProving.L1_CANNOT_CONTEST.selector ); printBlockAndTrans(meta.id); } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block within the proving window, using the correct parent hash. - // 3. Taylor contests Bob's proof. - // 4. William attempts but fails to contest Bob again. + // 1. Alice proposes a block, + // 2. Alice proves the block within the proving window, using the correct parent hash. + // 3. Taylor contests Alice's proof. + // 4. William attempts but fails to contest Alice again. function test_taikoL1_group_7_case_2() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); - console2.log("====== Bob proves the block as the assigned prover"); + console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); mineAndWrap(tierOp.cooldownWindow * 60 - 1); bytes32 blockHash2 = bytes32(uint256(20)); @@ -81,7 +79,7 @@ contract TaikoL1TestGroup7 is TaikoL1TestGroupBase { blockHash3, stateRoot3, meta.minTier, - TaikoErrors.L1_ALREADY_CONTESTED.selector + LibProving.L1_ALREADY_CONTESTED.selector ); printBlockAndTrans(meta.id); diff --git a/packages/protocol/test/L1/TaikoL1TestGroup8.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup8.t.sol similarity index 57% rename from packages/protocol/test/L1/TaikoL1TestGroup8.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup8.t.sol index 913ad55eef1..9c52fca4257 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup8.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup8.t.sol @@ -1,38 +1,37 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup8 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. TaikoL1 is paused. - // 3. Bob attempts to prove the block within the proving window. + // 3. Alice attempts to prove the block within the proving window. // 4. Alice tries to propose another block. // 5. TaikoL1 is unpaused. - // 6. Bob attempts again to prove the first block within the proving window. + // 6. Alice attempts again to prove the first block within the proving window. // 7. Alice tries to propose another block. function test_taikoL1_group_8_case_1() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); - console2.log("====== Alice propose a block with bob as the assigned prover"); + console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Pause TaikoL1"); mineAndWrap(10 seconds); vm.prank(L1.owner()); L1.pause(); - console2.log("====== Bob proves the block first after L1 paused"); + console2.log("====== Alice proves the block first after L1 paused"); bytes32 parentHash1 = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); proveBlock( - Bob, + Alice, meta, parentHash1, blockHash, @@ -42,82 +41,81 @@ contract TaikoL1TestGroup8 is TaikoL1TestGroupBase { ); console2.log("====== Alice tries to propose another block after L1 paused"); - proposeBlock(Alice, Bob, EssentialContract.INVALID_PAUSE_STATUS.selector); + proposeBlock(Alice, EssentialContract.INVALID_PAUSE_STATUS.selector); console2.log("====== Unpause TaikoL1"); mineAndWrap(10 seconds); vm.prank(L1.owner()); L1.unpause(); - console2.log("====== Bob proves the block first after L1 unpaused"); - proveBlock(Bob, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); + console2.log("====== Alice proves the block first after L1 unpaused"); + proveBlock(Alice, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); console2.log("====== Alice tries to propose another block after L1 unpaused"); - proposeBlock(Alice, Bob, ""); + proposeBlock(Alice, ""); } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. TaikoL1 proving is paused. - // 3. Bob attempts to prove the block within the proving window. + // 3. Alice attempts to prove the block within the proving window. // 4. Alice tries to propose another block. // 5. TaikoL1 proving is unpaused. - // 6. Bob attempts again to prove the first block within the proving window. + // 6. Alice attempts again to prove the first block within the proving window. // 7. Alice tries to propose another block. function test_taikoL1_group_8_case_2() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); - console2.log("====== Alice propose a block with bob as the assigned prover"); + console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Pause TaikoL1 proving"); mineAndWrap(10 seconds); vm.prank(L1.owner()); L1.pauseProving(true); - console2.log("====== Bob proves the block first after L1 proving paused"); + console2.log("====== Alice proves the block first after L1 proving paused"); bytes32 parentHash1 = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); proveBlock( - Bob, + Alice, meta, parentHash1, blockHash, stateRoot, meta.minTier, - TaikoErrors.L1_PROVING_PAUSED.selector + LibProving.L1_PROVING_PAUSED.selector ); console2.log("====== Alice tries to propose another block after L1 proving paused"); - proposeBlock(Alice, Bob, ""); + proposeBlock(Alice, ""); console2.log("====== Unpause TaikoL1 proving"); mineAndWrap(10 seconds); vm.prank(L1.owner()); L1.pauseProving(false); - console2.log("====== Bob proves the block first after L1 proving unpaused"); - proveBlock(Bob, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); + console2.log("====== Alice proves the block first after L1 proving unpaused"); + proveBlock(Alice, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); } // Test summary: // 1. Gets a block that doesn't exist // 2. Gets a transition by ID & hash that doesn't exist. function test_taikoL1_group_8_case_3() external { - vm.expectRevert(TaikoErrors.L1_INVALID_BLOCK_ID.selector); - L1.getBlock(2); + vm.expectRevert(LibUtils.L1_INVALID_BLOCK_ID.selector); + L1.getBlockV2(2); - vm.expectRevert(TaikoErrors.L1_TRANSITION_NOT_FOUND.selector); + vm.expectRevert(LibUtils.L1_TRANSITION_NOT_FOUND.selector); L1.getTransition(0, 2); - vm.expectRevert(TaikoErrors.L1_TRANSITION_NOT_FOUND.selector); + vm.expectRevert(LibUtils.L1_TRANSITION_NOT_FOUND.selector); L1.getTransition(0, randBytes32()); - vm.expectRevert(TaikoErrors.L1_INVALID_BLOCK_ID.selector); + vm.expectRevert(LibUtils.L1_INVALID_BLOCK_ID.selector); L1.getTransition(3, randBytes32()); } } diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup9.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup9.t.sol new file mode 100644 index 00000000000..0fc7533182b --- /dev/null +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup9.t.sol @@ -0,0 +1,374 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoL1TestGroupBase.sol"; + +// Testing block proving and verification for block#2, as stateRootSyncInternal is set to 2 in +// this test suite, we are testing that block#2 shall have state root always as zero. +contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { + bytes32 internal constant FIRST_BLOCK_HASH = keccak256("FIRST_BLOCK_HASH"); + + function proposeProveVerifyTheFirstBlock() internal { + vm.warp(1_000_000); + + giveEthAndTko(David, 10_000 ether, 1000 ether); + console2.log("====== David proposes, proves, and verifies the first block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(David, ""); + + bytes32 stateRoot = bytes32(uint256(1)); + + mineAndWrap(10 seconds); + proveBlock( + David, meta, GENESIS_BLOCK_HASH, FIRST_BLOCK_HASH, stateRoot, LibTiers.TIER_SGX, "" + ); + mineAndWrap(7 days); + verifyBlock(1); + } + + // Test summary: + // 0. David proposes, proves, and verifies the first block. + // 1. Alice proposes a block, + // 2. Guardian prover directly proves the block. + // 3. Guardian prover re-proves the same transition and fails. + // 4. Guardian prover proves the block again with a different transition. + // 5. William contests the guardian prover using a lower-tier proof and fails. + function test_taikoL1_group_9_case_1() external { + proposeProveVerifyTheFirstBlock(); + + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); + + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); + + console2.log("====== Guardian prover proves"); + bytes32 parentHash = FIRST_BLOCK_HASH; + bytes32 blockHash = bytes32(uint256(10)); + bytes32 stateRoot = bytes32(uint256(11)); + + mineAndWrap(10 seconds); + proveBlock(William, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); + + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 0); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.contester, address(0)); + assertEq(ts.validityBond, 0); + assertEq(ts.prover, address(gp)); + assertEq(ts.timestamp, block.timestamp); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + + console2.log("====== Guardian re-approve with the same transition"); + mineAndWrap(10 seconds); + proveBlock( + William, + meta, + parentHash, + blockHash, + stateRoot, + LibTiers.TIER_GUARDIAN, + LibProving.L1_ALREADY_PROVED.selector + ); + + console2.log("====== Guardian re-approve with a different transition"); + bytes32 blockHash2 = bytes32(uint256(20)); + bytes32 stateRoot2 = bytes32(uint256(21)); + mineAndWrap(10 seconds); + proveBlock(William, meta, parentHash, blockHash2, stateRoot2, LibTiers.TIER_GUARDIAN, ""); + + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 0); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash2); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.contester, address(0)); + assertEq(ts.validityBond, 0); + assertEq(ts.prover, address(gp)); + assertEq(ts.timestamp, block.timestamp); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + + console2.log("====== William contests with a lower tier proof"); + mineAndWrap(10 seconds); + proveBlock( + William, + meta, + parentHash, + blockHash, + stateRoot, + LibTiers.TIER_SGX, + LibProving.L1_INVALID_TIER.selector + ); + + console2.log("====== Verify the block"); + mineAndWrap(7 days); + verifyBlock(1); + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 1); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash2); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.prover, address(gp)); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + } + + // Test summary: + // 0. David proposes, proves, and verifies the first block. + // 1. Alice proposes a block, Alice is the prover. + // 2. Alice proves the block. + // 3. Guardian prover re-proves the same transition and fails. + // 4. Guardian prover proves the block with a different transition. + // 5. William contests the guardian prover using a lower-tier proof and fails. + function test_taikoL1_group_9_case_2() external { + proposeProveVerifyTheFirstBlock(); + + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); + + console2.log("====== Alice proves the block"); + bytes32 parentHash = FIRST_BLOCK_HASH; + bytes32 blockHash = bytes32(uint256(10)); + bytes32 stateRoot = bytes32(uint256(11)); + + mineAndWrap(10 seconds); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + + console2.log("====== Guardian re-approve with the same transition"); + mineAndWrap(10 seconds); + proveBlock( + William, + meta, + parentHash, + blockHash, + stateRoot, + LibTiers.TIER_GUARDIAN, + LibProving.L1_ALREADY_PROVED.selector + ); + + console2.log("====== Guardian re-approve with a different transition"); + bytes32 blockHash2 = bytes32(uint256(20)); + bytes32 stateRoot2 = bytes32(uint256(21)); + mineAndWrap(10 seconds); + proveBlock(William, meta, parentHash, blockHash2, stateRoot2, LibTiers.TIER_GUARDIAN, ""); + + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 0); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash2); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.contester, address(0)); + assertEq(ts.validityBond, 0); + assertEq(ts.prover, address(gp)); + assertEq(ts.timestamp, block.timestamp); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + + console2.log("====== Verify the block"); + mineAndWrap(7 days); + verifyBlock(1); + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 1); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash2); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.prover, address(gp)); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + } + + // Test summary: + // 0. David proposes, proves, and verifies the first block. + // 1. Alice proposes a block, + // 2. Carol proves the block outside the proving window. + // 3. Guardian prover re-proves the same transition and fails. + // 4. Guardian prover proves the block with a different transition. + // 5. William contests the guardian prover using a lower-tier proof and fails. + function test_taikoL1_group_9_case_3() external { + proposeProveVerifyTheFirstBlock(); + + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + giveEthAndTko(Carol, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); + + uint96 livenessBond = L1.getConfig().livenessBond; + + console2.log("====== Carol proves the block"); + bytes32 parentHash = FIRST_BLOCK_HASH; + bytes32 blockHash = bytes32(uint256(10)); + bytes32 stateRoot = bytes32(uint256(11)); + + mineAndWrap(7 days); + proveBlock(Carol, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + + console2.log("====== Guardian re-approve with the same transition"); + mineAndWrap(10 seconds); + proveBlock( + William, + meta, + parentHash, + blockHash, + stateRoot, + LibTiers.TIER_GUARDIAN, + LibProving.L1_ALREADY_PROVED.selector + ); + + console2.log("====== Guardian re-approve with a different transition"); + bytes32 blockHash2 = bytes32(uint256(20)); + bytes32 stateRoot2 = bytes32(uint256(21)); + mineAndWrap(10 seconds); + proveBlock(William, meta, parentHash, blockHash2, stateRoot2, LibTiers.TIER_GUARDIAN, ""); + + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 0); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash2); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.contester, address(0)); + assertEq(ts.validityBond, 0); + assertEq(ts.prover, address(gp)); + assertEq(ts.timestamp, block.timestamp); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + totalTkoBalance(tko, L1, Carol), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + + console2.log("====== Verify the block"); + mineAndWrap(7 days); + verifyBlock(1); + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 1); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash2); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.prover, address(gp)); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + totalTkoBalance(tko, L1, Carol), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + } + + // Test summary: + // 0. David proposes, proves, and verifies the first block. + // 1. Alice proposes a block, + // 2. Guardian prover directly proves the block out of proving window + function test_taikoL1_group_9_case_4() external { + proposeProveVerifyTheFirstBlock(); + + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); + + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); + + console2.log("====== Guardian prover proves"); + bytes32 parentHash = FIRST_BLOCK_HASH; + bytes32 blockHash = bytes32(uint256(10)); + bytes32 stateRoot = bytes32(uint256(11)); + + mineAndWrap(7 days); + proveBlock(William, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); + + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 0); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.contester, address(0)); + assertEq(ts.validityBond, 0); + assertEq(ts.prover, address(gp)); + assertEq(ts.timestamp, block.timestamp); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - L1.getConfig().livenessBond); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + } +} diff --git a/packages/protocol/test/L1/TaikoL1TestGroupBase.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol similarity index 51% rename from packages/protocol/test/L1/TaikoL1TestGroupBase.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol index b1709355e8b..5948876c131 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroupBase.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol @@ -1,20 +1,21 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestBase.sol"; contract TaikoL1New is TaikoL1 { - function getConfig() public view override returns (TaikoData.Config memory config) { + function getConfig() public pure override returns (TaikoData.Config memory config) { config = TaikoL1.getConfig(); - config.maxBlocksToVerifyPerProposal = 0; - config.blockMaxProposals = 10; - config.blockRingBufferSize = 20; - config.checkEOAForCalldataDA = true; + config.maxBlocksToVerify = 0; + config.blockMaxProposals = 20; + config.blockRingBufferSize = 25; + config.stateRootSyncInternal = 2; + config.ontakeForkHeight = 0; } } abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { - function deployTaikoL1() internal override returns (TaikoL1) { + function deployTaikoL1() internal virtual override returns (TaikoL1) { return TaikoL1( payable(deployProxy({ name: "taiko", impl: address(new TaikoL1New()), data: "" })) ); @@ -22,62 +23,32 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { function proposeBlock( address proposer, - address assignedProver, bytes4 revertReason ) internal - returns (TaikoData.BlockMetadata memory meta) + returns (TaikoData.BlockMetadataV2 memory) { - TaikoData.TierFee[] memory tierFees = new TaikoData.TierFee[](2); - tierFees[0] = TaikoData.TierFee(LibTiers.TIER_OPTIMISTIC, 1 ether); - tierFees[1] = TaikoData.TierFee(LibTiers.TIER_SGX, 2 ether); - - AssignmentHook.ProverAssignment memory assignment = AssignmentHook.ProverAssignment({ - feeToken: address(0), - tierFees: tierFees, - expiry: uint64(block.timestamp + 60 minutes), - maxBlockId: 0, - maxProposedIn: 0, - metaHash: 0, - parentMetaHash: 0, - signature: new bytes(0) - }); - - bytes memory txList = new bytes(10); - assignment.signature = - _signAssignment(assignedProver, assignment, address(L1), proposer, keccak256(txList)); - - TaikoData.HookCall[] memory hookcalls = new TaikoData.HookCall[](1); - hookcalls[0] = TaikoData.HookCall(address(assignmentHook), abi.encode(assignment)); - - bytes memory eoaSig; - { - uint256 privateKey; - if (proposer == Alice) { - privateKey = 0x1; - } else if (proposer == Bob) { - privateKey = 0x2; - } else if (proposer == Carol) { - privateKey = 0x3; - } else { - revert("unexpected"); - } - - (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, keccak256(txList)); - eoaSig = abi.encodePacked(r, s, v); - } + vm.prank(proposer); + if (revertReason != "") vm.expectRevert(revertReason); + return L1.proposeBlockV2("", new bytes(10)); + } + function proposeBlock( + address proposer, + TaikoData.BlockParamsV2 memory params, + bytes4 revertReason + ) + internal + returns (TaikoData.BlockMetadataV2 memory) + { vm.prank(proposer); if (revertReason != "") vm.expectRevert(revertReason); - (meta,) = L1.proposeBlock{ value: 3 ether }( - abi.encode(TaikoData.BlockParams(assignedProver, address(0), 0, 0, hookcalls, eoaSig)), - txList - ); + return L1.proposeBlockV2(abi.encode(params), new bytes(10)); } function proveBlock( address prover, - TaikoData.BlockMetadata memory meta, + TaikoData.BlockMetadataV2 memory meta, bytes32 parentHash, bytes32 blockHash, bytes32 stateRoot, @@ -120,13 +91,71 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { // Grant 2 signatures, 3rd might be a revert vm.prank(David, David); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); vm.prank(Emma, Emma); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); if (revertReason != "") vm.expectRevert(revertReason); vm.prank(Frank); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); + } else { + if (revertReason != "") vm.expectRevert(revertReason); + vm.prank(prover); + L1.proveBlock(meta.id, abi.encode(meta, tran, proof)); + } + } + + function proveBlock2( + address prover, + TaikoData.BlockMetadataV2 memory meta, + bytes32 parentHash, + bytes32 blockHash, + bytes32 stateRoot, + uint16 tier, + bytes4 revertReason + ) + internal + { + TaikoData.Transition memory tran = TaikoData.Transition({ + parentHash: parentHash, + blockHash: blockHash, + stateRoot: stateRoot, + graffiti: 0x0 + }); + + TaikoData.TierProof memory proof; + proof.tier = tier; + address newInstance; + + // Keep changing the pub key associated with an instance to avoid + // attacks, + // obviously just a mock due to 2 addresses changing all the time. + (newInstance,) = sv.instances(0); + if (newInstance == SGX_X_0) { + newInstance = SGX_X_1; + } else { + newInstance = SGX_X_0; + } + + if (tier == LibTiers.TIER_SGX) { + bytes memory signature = + createSgxSignatureProof(tran, newInstance, prover, keccak256(abi.encode(meta))); + + proof.data = bytes.concat(bytes4(0), bytes20(newInstance), signature); + } + + if (tier == LibTiers.TIER_GUARDIAN) { + proof.data = ""; + + // Grant 2 signatures, 3rd might be a revert + vm.prank(David, David); + gp.approveV2(meta, tran, proof); + vm.prank(Emma, Emma); + gp.approveV2(meta, tran, proof); + + if (revertReason != "") vm.expectRevert(revertReason); + vm.prank(Frank); + gp.approveV2(meta, tran, proof); } else { if (revertReason != "") vm.expectRevert(revertReason); vm.prank(prover); @@ -135,7 +164,7 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { } function printBlockAndTrans(uint64 blockId) internal view { - TaikoData.Block memory blk = L1.getBlock(blockId); + TaikoData.BlockV2 memory blk = L1.getBlockV2(blockId); printBlock(blk); for (uint32 i = 1; i < blk.nextTransitionId; ++i) { @@ -143,16 +172,28 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { } } - function printBlock(TaikoData.Block memory blk) internal view { - TaikoData.SlotB memory b = L1.slotB(); + function totalTkoBalance( + TaikoToken tko, + TaikoL1 L1, + address user + ) + internal + view + returns (uint256) + { + return tko.balanceOf(user) + L1.bondBalanceOf(user); + } + + function printBlock(TaikoData.BlockV2 memory blk) internal view { + (, TaikoData.SlotB memory b) = L1.getStateVariables(); + console2.log("\n=================="); console2.log("---CHAIN:"); console2.log(" | lastVerifiedBlockId:", b.lastVerifiedBlockId); console2.log(" | numBlocks:", b.numBlocks); console2.log(" | timestamp:", block.timestamp); console2.log("---BLOCK#", blk.blockId); - console2.log(" | assignedProver:", blk.assignedProver); - console2.log(" | livenessBond:", blk.livenessBond); console2.log(" | proposedAt:", blk.proposedAt); + console2.log(" | proposedIn:", blk.proposedIn); console2.log(" | metaHash:", vm.toString(blk.metaHash)); console2.log(" | nextTransitionId:", blk.nextTransitionId); console2.log(" | verifiedTransitionId:", blk.verifiedTransitionId); @@ -166,11 +207,13 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { console2.log(" | contester:", ts.contester); console2.log(" | contestBond:", ts.contestBond); console2.log(" | timestamp:", ts.timestamp); + console2.log(" | key (parentHash):", vm.toString(ts.key)); console2.log(" | blockHash:", vm.toString(ts.blockHash)); console2.log(" | stateRoot:", vm.toString(ts.stateRoot)); } function mineAndWrap(uint256 value) internal { + vm.roll(block.number + 1); vm.warp(block.timestamp + value); } } diff --git a/packages/protocol/test/L1/TestTierProvider.sol b/packages/protocol/test/layer1/based/TestTierRouter.sol similarity index 77% rename from packages/protocol/test/L1/TestTierProvider.sol rename to packages/protocol/test/layer1/based/TestTierRouter.sol index 4f19289f923..833d259f639 100644 --- a/packages/protocol/test/L1/TestTierProvider.sol +++ b/packages/protocol/test/layer1/based/TestTierRouter.sol @@ -1,22 +1,23 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../../contracts/common/LibStrings.sol"; -import "../../contracts/L1/tiers/ITierProvider.sol"; -import "../../contracts/L1/tiers/ITierRouter.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/layer1/tiers/ITierProvider.sol"; +import "src/layer1/tiers/LibTiers.sol"; +import "src/layer1/tiers/ITierRouter.sol"; -/// @title TestTierProvider +/// @title TestTierRouter /// @dev Labeled in AddressResolver as "tier_router" /// @custom:security-contact security@taiko.xyz -contract TestTierProvider is ITierProvider, ITierRouter { +contract TestTierRouter is ITierProvider, ITierRouter { uint256[50] private __gap; /// @inheritdoc ITierRouter function getProvider(uint256) external view returns (address) { return address(this); } - /// @inheritdoc ITierProvider + /// @inheritdoc ITierProvider function getTier(uint16 _tierId) public pure override returns (ITierProvider.Tier memory) { if (_tierId == LibTiers.TIER_OPTIMISTIC) { return ITierProvider.Tier({ @@ -25,8 +26,8 @@ contract TestTierProvider is ITierProvider, ITierRouter { contestBond: 500 ether, // TKO cooldownWindow: 1440, //24 hours provingWindow: 30, // 0.5 hours - maxBlocksToVerifyPerProof: 12 - }); + maxBlocksToVerifyPerProof: 0 // DEPRECATED + }); } if (_tierId == LibTiers.TIER_SGX) { @@ -36,8 +37,8 @@ contract TestTierProvider is ITierProvider, ITierRouter { contestBond: 1640 ether, // =250TKO * 6.5625 cooldownWindow: 1440, //24 hours provingWindow: 60, // 1 hours - maxBlocksToVerifyPerProof: 8 - }); + maxBlocksToVerifyPerProof: 0 // DEPRECATED + }); } if (_tierId == LibTiers.TIER_GUARDIAN) { @@ -47,8 +48,8 @@ contract TestTierProvider is ITierProvider, ITierRouter { contestBond: 0, // must be 0 for top tier cooldownWindow: 60, //1 hours provingWindow: 2880, // 48 hours - maxBlocksToVerifyPerProof: 16 - }); + maxBlocksToVerifyPerProof: 0 // DEPRECATED + }); } revert TIER_NOT_FOUND(); @@ -63,7 +64,7 @@ contract TestTierProvider is ITierProvider, ITierRouter { } /// @inheritdoc ITierProvider - function getMinTier(uint256 _rand) public pure override returns (uint16) { + function getMinTier(address, uint256 _rand) public pure override returns (uint16) { // 10% will be selected to require SGX proofs. if (_rand % 10 == 0) return LibTiers.TIER_SGX; // Other blocks are optimistic, without validity proofs. diff --git a/packages/protocol/test/layer1/fork/ForkManager.t.sol b/packages/protocol/test/layer1/fork/ForkManager.t.sol new file mode 100644 index 00000000000..b3f3c8df647 --- /dev/null +++ b/packages/protocol/test/layer1/fork/ForkManager.t.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../TaikoL1Test.sol"; +import "src/layer1/fork/ForkManager.sol"; + +contract Fork is EssentialContract { + bytes32 private immutable __name; + + constructor(bytes32 _name) { + __name = _name; + } + + function init() external initializer { + __Essential_init(msg.sender); + } + + function name() public view returns (bytes32) { + return __name; + } +} + +contract ForkManager_RouteToOldFork is ForkManager { + constructor(address _fork1, address _fork2) ForkManager(_fork1, _fork2) { } + + function shouldRouteToOldFork(bytes4 _selector) internal pure override returns (bool) { + return _selector == Fork.name.selector; + } +} + +contract TestForkManager is TaikoL1Test { + address fork1 = address(new Fork("fork1")); + address fork2 = address(new Fork("fork2")); + + function test_ForkManager_default_routing() public { + address proxy = deployProxy({ + name: "main_proxy", + impl: address(new ForkManager(address(0), fork1)), + data: abi.encodeCall(Fork.init, ()) + }); + + assertTrue(ForkManager(payable(proxy)).isForkManager()); + assertEq(Fork(proxy).name(), "fork1"); + + // If we upgrade the proxy's impl to a fork, then alling isForkManager will throw, + // so we should never do this in production. + Fork(proxy).upgradeTo(fork2); + vm.expectRevert(); + ForkManager(payable(proxy)).isForkManager(); + + Fork(proxy).upgradeTo(address(new ForkManager(fork1, fork2))); + assertEq(Fork(proxy).name(), "fork2"); + } + + function test_ForkManager_routing_to_old_fork() public { + address proxy = deployProxy({ + name: "main_proxy", + impl: address(new ForkManager_RouteToOldFork(fork1, fork2)), + data: abi.encodeCall(Fork.init, ()) + }); + + assertTrue(ForkManager(payable(proxy)).isForkManager()); + assertEq(Fork(proxy).name(), "fork1"); + + Fork(proxy).upgradeTo(address(new ForkManager(fork1, fork2))); + assertTrue(ForkManager(payable(proxy)).isForkManager()); + assertEq(Fork(proxy).name(), "fork2"); + } +} diff --git a/packages/protocol/test/layer1/preconf/BaseTest.sol b/packages/protocol/test/layer1/preconf/BaseTest.sol new file mode 100644 index 00000000000..de6486e533a --- /dev/null +++ b/packages/protocol/test/layer1/preconf/BaseTest.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Test.sol"; + +contract BaseTest is Test { + address addr_1 = vm.addr(1); + address addr_2 = vm.addr(2); + address addr_3 = vm.addr(3); + address addr_4 = vm.addr(4); + address addr_5 = vm.addr(5); + address addr_6 = vm.addr(6); + address addr_7 = vm.addr(7); + address addr_8 = vm.addr(8); + address addr_9 = vm.addr(9); + address addr_10 = vm.addr(10); +} diff --git a/packages/protocol/test/layer1/preconf/beacon/BeaconProofsVerification.sol b/packages/protocol/test/layer1/preconf/beacon/BeaconProofsVerification.sol new file mode 100644 index 00000000000..e162fe84025 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/beacon/BeaconProofsVerification.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/preconf/libs/LibMerkleUtils.sol"; +import "../BaseTest.sol"; +import "../fixtures/BeaconProofs.sol"; + +/// @dev The beacon chain data used here is from slot 9000000 on Ethereum mainnet. +contract BeaconProofsVerification is BaseTest { + function test_beaconProofsVerification_validatorInclusionInValidatorList() public { + bytes32[8] memory validatorChunks = BeaconProofs.validatorChunks(); + + bytes32 validatorHashTreeRoot = LibMerkleUtils.merkleize(validatorChunks); + + bytes32[] memory validatorProof = BeaconProofs.validatorProof(); + + bytes32 validatorsRoot = BeaconProofs.validatorsRoot(); + uint256 validatorIndex = BeaconProofs.validatorIndex(); + + assertTrue( + LibMerkleUtils.verifyProof( + validatorProof, validatorsRoot, validatorHashTreeRoot, validatorIndex + ) + ); + } + + function test_beaconProofsVerification_validatorListInclusionInBeaconState() public { + bytes32[] memory beaconStateProofForValidatorList = + BeaconProofs.beaconStateProofForValidatorList(); + + bytes32 validatorListRoot = BeaconProofs.validatorsRoot(); + bytes32 beaconStateRoot = BeaconProofs.beaconStateRoot(); + + assertTrue( + LibMerkleUtils.verifyProof( + beaconStateProofForValidatorList, beaconStateRoot, validatorListRoot, 11 + ) + ); + } + + function test_beaconProofsVerification_beaconStateInclusionInBeaconBlock() public { + bytes32[] memory beaconBlockProofForBeaconState = + BeaconProofs.beaconBlockProofForBeaconState(); + + bytes32 beaconStateRoot = BeaconProofs.beaconStateRoot(); + bytes32 beaconBlockRoot = BeaconProofs.beaconBlockRoot(); + + assertTrue( + LibMerkleUtils.verifyProof( + beaconBlockProofForBeaconState, beaconBlockRoot, beaconStateRoot, 3 + ) + ); + } + + function test_beaconProofsVerification_proposerInclusionInBeaconBlock() public { + bytes32[] memory beaconBlockProofForProposer = BeaconProofs.beaconBlockProofForProposer(); + + uint256 validatorIndex = BeaconProofs.validatorIndex(); + bytes32 beaconBlockRoot = BeaconProofs.beaconBlockRoot(); + + assertTrue( + LibMerkleUtils.verifyProof( + beaconBlockProofForProposer, + beaconBlockRoot, + LibMerkleUtils.toLittleEndian(validatorIndex), + 1 + ) + ); + } +} diff --git a/packages/protocol/test/layer1/preconf/blocks/BlockProposing.t.sol b/packages/protocol/test/layer1/preconf/blocks/BlockProposing.t.sol new file mode 100644 index 00000000000..f0b53ef580b --- /dev/null +++ b/packages/protocol/test/layer1/preconf/blocks/BlockProposing.t.sol @@ -0,0 +1,239 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../fixtures/BlocksFixtures.sol"; + +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; + +contract BlockProposing is BlocksFixtures { + function setUp() public override { + super.setUp(); + } + + function test_newBlockProposal_preconferCanProposeBlockInAdvanced_Case1() external { + // Push preconfer Address 1 to slot 13 and Address 3 to slot 23 of the next epoch + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + // Warp to an arbitrary timestamp before the preconfer's slot + uint256 currentSlotTimestamp = + currentEpochStart + (10 * LibPreconfConstants.SECONDS_IN_SLOT); + vm.warp(currentSlotTimestamp); + + // Arbitrary lookahead for the next epoch just to avoid fallback selection in this test + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: currentEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + }); + + // Address 1 proposes the block + vm.prank(addr_1); + _newBlockProposal("Block Params", "Txn List", 1, lookaheadSetParams); + } + + function test_newBlockProposal_preconferCanProposeBlockInAdvanced_Case2() external { + // Push preconfer Address 1 to slot 13 and Address 3 to slot 23 of the next epoch + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + // Warp to an arbitrary timestamp after Address 1's slot but before Address 3's slot + uint256 currentSlotTimestamp = + currentEpochStart + (15 * LibPreconfConstants.SECONDS_IN_SLOT); + vm.warp(currentSlotTimestamp); + + // Arbitrary lookahead for the next epoch just to avoid fallback selection in this test + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: currentEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + }); + + // Address 3 proposes the block in advance + vm.prank(addr_3); + _newBlockProposal("Block Params 2", "Txn List 2", 2, lookaheadSetParams); + } + + function test_newBlockProposal_preconferCanProposeBlockAtDedicatedSlot() external { + // Push preconfer Address 1 to slot 13 and Address 3 to slot 23 of the next epoch + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + // Warp to the exact timestamp of the preconfer's dedicated slot + uint256 currentSlotTimestamp = + currentEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT); + vm.warp(currentSlotTimestamp); + + // Arbitrary lookahead for the next epoch just to avoid fallback selection in this test + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: currentEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + }); + + // Address 1 proposes the block at its dedicated slot + vm.prank(addr_1); + _newBlockProposal("Block Params 3", "Txn List 3", 1, lookaheadSetParams); + } + + function test_newBlockProposal_updatesLookaheadForNextEpoch() external { + // Prepare initial lookahead + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 nextEpochStart = currentEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH; + + uint256 currentSlotTimestamp = currentEpochStart + (9 * LibPreconfConstants.SECONDS_IN_SLOT); + // Warp to a slot where address 1 can propose a block + vm.warp(currentSlotTimestamp); + + // Prepare lookahead set for the next epoch + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + // Slot 10 + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + (9 * LibPreconfConstants.SECONDS_IN_SLOT), + preconfer: addr_1 + }); + // Slot 20 + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + (19 * LibPreconfConstants.SECONDS_IN_SLOT), + preconfer: addr_2 + }); + + // Address 1 proposes a block and updates the lookahead + vm.prank(addr_1); + _newBlockProposal("Block Params", "Txn List", 1, lookaheadSetParams); + + // Verify that the lookahead for the next epoch has been updated + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + + // Check the first entry + assertEq(lookaheadBuffer[3].preconfer, addr_1); + assertEq( + lookaheadBuffer[3].timestamp, nextEpochStart + (9 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq( + lookaheadBuffer[3].prevTimestamp, + currentEpochStart + (22 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq(lookaheadBuffer[3].isFallback, false); + + // Check the second entry + assertEq(lookaheadBuffer[4].preconfer, addr_2); + assertEq( + lookaheadBuffer[4].timestamp, + nextEpochStart + (19 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq( + lookaheadBuffer[4].prevTimestamp, + nextEpochStart + (9 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq(lookaheadBuffer[4].isFallback, false); + + // Verify that the lookahead tail has been updated + assertEq(preconfTaskManager.getLookaheadTail(), 4); + + // Verify that the lookahead poster for the next epoch has been set + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_1); + } + + function test_newBlockProposal_revertWhenTimestampAboveDedicatedSlot() external { + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 dedicatedSlotTimestamp = + currentEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT); + + // Warp to a timestamp after the dedicated slot + vm.warp(dedicatedSlotTimestamp + LibPreconfConstants.SECONDS_IN_SLOT); + + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + _newBlockProposal( + "Block Params", "Txn List", 1, new IPreconfTaskManager.LookaheadSetParam[](0) + ); + } + + function test_newBlockProposal_revertWhenTimestampBelowPrevTimestamp() external { + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 prevSlotTimestamp = currentEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT); + + // Warp to a timestamp before the previous slot + vm.warp(prevSlotTimestamp - LibPreconfConstants.SECONDS_IN_SLOT); + + vm.prank(addr_3); + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + _newBlockProposal( + "Block Params", "Txn List", 2, new IPreconfTaskManager.LookaheadSetParam[](0) + ); + } + + function test_newBlockProposal_revertWhenTimestampEqualToPrevTimestamp() external { + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 prevSlotTimestamp = currentEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT); + + // Warp to the exact timestamp of the previous slot + vm.warp(prevSlotTimestamp); + + vm.prank(addr_3); + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + _newBlockProposal( + "Block Params", "Txn List", 2, new IPreconfTaskManager.LookaheadSetParam[](0) + ); + } + + function test_newBlockProposal_revertWhenSenderIsNotThePreconfer() external { + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 currentSlotTimestamp = + currentEpochStart + (15 * LibPreconfConstants.SECONDS_IN_SLOT); + + // Warp to a slot when Address 3 is the expected preconfer + vm.warp(currentSlotTimestamp); + + // Try to propose with a different address than the expected preconfer + vm.prank(addr_2); // addr_2 is not the expected preconfer (It is addr_3) + vm.expectRevert(IPreconfTaskManager.SenderIsNotThePreconfer.selector); + _newBlockProposal( + "Block Params", "Txn List", 2, new IPreconfTaskManager.LookaheadSetParam[](0) + ); + } + + function _newBlockProposal( + bytes memory blockParams, + bytes memory txList, + uint256 lookaheadPointer, + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams + ) + internal + { + bytes[] memory blockParamsArr = new bytes[](1); + blockParamsArr[0] = blockParams; + + bytes[] memory txListArr = new bytes[](1); + txListArr[0] = txList; + + preconfTaskManager.newBlockProposals( + blockParamsArr, txListArr, lookaheadPointer, lookaheadSetParams + ); + } +} diff --git a/packages/protocol/test/layer1/preconf/bls/BLSExpandMsgXmd.t.sol b/packages/protocol/test/layer1/preconf/bls/BLSExpandMsgXmd.t.sol new file mode 100644 index 00000000000..2a9d893faf8 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/bls/BLSExpandMsgXmd.t.sol @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: MIT +// Test has been referenced from +// https://github.com/ethyla/bls12-381-hash-to-curve/blob/main/test/expandMsgXmd.sol +pragma solidity ^0.8.24; + +import "../BaseTest.sol"; +import "src/layer1/preconf/libs/LibBLS12381.sol"; + +contract BLSExpendMsgXmd is BaseTest { + bytes internal expand_msg_dst = "QUUX-V01-CS02-with-expander-SHA256-128"; + + function test_expandMsgXmd_empty_msg_0x20() public { + uint256[] memory result = LibBLS12381._expandMsgXmd("", expand_msg_dst, 0x20); + uint256 expected = 0x68a985b87eb6b46952128911f2a4412bbc302a9d759667f87f7a21d803f07235; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_abc_0x20() public { + uint256[] memory result = LibBLS12381._expandMsgXmd("abc", expand_msg_dst, 0x20); + uint256 expected = 0xd8ccab23b5985ccea865c6c97b6e5b8350e794e603b4b97902f53a8a0d605615; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_abcdef0123456789_0x20() public { + uint256[] memory result = + LibBLS12381._expandMsgXmd("abcdef0123456789", expand_msg_dst, 0x20); + uint256 expected = 0xeff31487c770a893cfb36f912fbfcbff40d5661771ca4b2cb4eafe524333f5c1; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_q128_0x20() public { + uint256[] memory result = LibBLS12381._expandMsgXmd( + "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + expand_msg_dst, + 0x20 + ); + uint256 expected = 0xb23a1d2b4d97b2ef7785562a7e8bac7eed54ed6e97e29aa51bfe3f12ddad1ff9; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_a512_0x20() public { + uint256[] memory result = LibBLS12381._expandMsgXmd( + "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + expand_msg_dst, + 0x20 + ); + uint256 expected = 0x4623227bcc01293b8c130bf771da8c298dede7383243dc0993d2d94823958c4c; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_empty_msg_0x80() public { + uint256[] memory result = LibBLS12381._expandMsgXmd("", expand_msg_dst, 0x80); + bytes memory expected = + hex"af84c27ccfd45d41914fdff5df25293e221afc53d8ad2ac06d5e3e29485dadbee0d121587713a3e0dd4d5e69e93eb7cd4f5df4cd103e188cf60cb02edc3edf18eda8576c412b18ffb658e3dd6ec849469b979d444cf7b26911a08e63cf31f9dcc541708d3491184472c2c29bb749d4286b004ceb5ee6b9a7fa5b646c993f0ced"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } + + function testExpandMsgXmd_abc_0x80() public { + uint256[] memory result = LibBLS12381._expandMsgXmd("abc", expand_msg_dst, 0x80); + bytes memory expected = + hex"abba86a6129e366fc877aab32fc4ffc70120d8996c88aee2fe4b32d6c7b6437a647e6c3163d40b76a73cf6a5674ef1d890f95b664ee0afa5359a5c4e07985635bbecbac65d747d3d2da7ec2b8221b17b0ca9dc8a1ac1c07ea6a1e60583e2cb00058e77b7b72a298425cd1b941ad4ec65e8afc50303a22c0f99b0509b4c895f40"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } + + function testExpandMsgXmd_abcdef0123456789_0x80() public { + uint256[] memory result = + LibBLS12381._expandMsgXmd("abcdef0123456789", expand_msg_dst, 0x80); + bytes memory expected = + hex"ef904a29bffc4cf9ee82832451c946ac3c8f8058ae97d8d629831a74c6572bd9ebd0df635cd1f208e2038e760c4994984ce73f0d55ea9f22af83ba4734569d4bc95e18350f740c07eef653cbb9f87910d833751825f0ebefa1abe5420bb52be14cf489b37fe1a72f7de2d10be453b2c9d9eb20c7e3f6edc5a60629178d9478df"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } + + function testExpandMsgXmd_q128_0x80() public { + uint256[] memory result = LibBLS12381._expandMsgXmd( + "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + expand_msg_dst, + 0x80 + ); + bytes memory expected = + hex"80be107d0884f0d881bb460322f0443d38bd222db8bd0b0a5312a6fedb49c1bbd88fd75d8b9a09486c60123dfa1d73c1cc3169761b17476d3c6b7cbbd727acd0e2c942f4dd96ae3da5de368d26b32286e32de7e5a8cb2949f866a0b80c58116b29fa7fabb3ea7d520ee603e0c25bcaf0b9a5e92ec6a1fe4e0391d1cdbce8c68a"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } + + function testExpandMsgXmd_a512_0x80() public { + uint256[] memory result = LibBLS12381._expandMsgXmd( + "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + expand_msg_dst, + 0x80 + ); + bytes memory expected = + hex"546aff5444b5b79aa6148bd81728704c32decb73a3ba76e9e75885cad9def1d06d6792f8a7d12794e90efed817d96920d728896a4510864370c207f99bd4a608ea121700ef01ed879745ee3e4ceef777eda6d9e5e38b90c86ea6fb0b36504ba4a45d22e86f6db5dd43d98a294bebb9125d5b794e9d2a81181066eb954966a487"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } +} diff --git a/packages/protocol/test/layer1/preconf/bls/BLSHashToFieldFp2.t.sol b/packages/protocol/test/layer1/preconf/bls/BLSHashToFieldFp2.t.sol new file mode 100644 index 00000000000..da305ab7957 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/bls/BLSHashToFieldFp2.t.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +// Test has been referenced from +// https://github.com/ethyla/bls12-381-hash-to-curve/blob/main/test/hashToField.sol +pragma solidity ^0.8.24; + +import "../BaseTest.sol"; +import "src/layer1/preconf/libs/LibBLS12381.sol"; + +contract BLSHashToFieldFp2 is BaseTest { + bytes internal hash_to_dst = "QUUX-V01-CS02-with-BLS12381G2_XMD:SHA-256_SSWU_RO_"; + + function test_hashToFieldFp2_empty_msg() public { + LibBLS12381.FieldPoint2[2] memory result = LibBLS12381.hashToFieldFp2("", hash_to_dst); + bytes memory expected_u0 = + hex"0000000000000000000000000000000003dbc2cce174e91ba93cbb08f26b917f98194a2ea08d1cce75b2b9cc9f21689d80bd79b594a613d0a68eb807dfdc1cf8"; + bytes memory expected_u0_I = + hex"0000000000000000000000000000000005a2acec64114845711a54199ea339abd125ba38253b70a92c876df10598bd1986b739cad67961eb94f7076511b3b39a"; + bytes memory expected_u1 = + hex"0000000000000000000000000000000002f99798e8a5acdeed60d7e18e9120521ba1f47ec090984662846bc825de191b5b7641148c0dbc237726a334473eee94"; + bytes memory expected_u1_I = + hex"00000000000000000000000000000000145a81e418d4010cc027a68f14391b30074e89e60ee7a22f87217b2f6eb0c4b94c9115b436e6fa4607e95a98de30a435"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } + + function test_hashToFieldFp2_msg_abc() public { + LibBLS12381.FieldPoint2[2] memory result = LibBLS12381.hashToFieldFp2("abc", hash_to_dst); + bytes memory expected_u0 = + hex"0000000000000000000000000000000015f7c0aa8f6b296ab5ff9c2c7581ade64f4ee6f1bf18f55179ff44a2cf355fa53dd2a2158c5ecb17d7c52f63e7195771"; + bytes memory expected_u0_I = + hex"0000000000000000000000000000000001c8067bf4c0ba709aa8b9abc3d1cef589a4758e09ef53732d670fd8739a7274e111ba2fcaa71b3d33df2a3a0c8529dd"; + bytes memory expected_u1 = + hex"00000000000000000000000000000000187111d5e088b6b9acfdfad078c4dacf72dcd17ca17c82be35e79f8c372a693f60a033b461d81b025864a0ad051a06e4"; + bytes memory expected_u1_I = + hex"0000000000000000000000000000000008b852331c96ed983e497ebc6dee9b75e373d923b729194af8e72a051ea586f3538a6ebb1e80881a082fa2b24df9f566"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } + + function test_hash_to_field_msg_fp2_abcdef0123456789() public { + LibBLS12381.FieldPoint2[2] memory result = + LibBLS12381.hashToFieldFp2("abcdef0123456789", hash_to_dst); + bytes memory expected_u0 = + hex"000000000000000000000000000000000313d9325081b415bfd4e5364efaef392ecf69b087496973b229303e1816d2080971470f7da112c4eb43053130b785e1"; + bytes memory expected_u0_I = + hex"00000000000000000000000000000000062f84cb21ed89406890c051a0e8b9cf6c575cf6e8e18ecf63ba86826b0ae02548d83b483b79e48512b82a6c0686df8f"; + bytes memory expected_u1 = + hex"000000000000000000000000000000001739123845406baa7be5c5dc74492051b6d42504de008c635f3535bb831d478a341420e67dcc7b46b2e8cba5379cca97"; + bytes memory expected_u1_I = + hex"0000000000000000000000000000000001897665d9cb5db16a27657760bbea7951f67ad68f8d55f7113f24ba6ddd82caef240a9bfa627972279974894701d975"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } + + function test_hashToFieldFp2_msg_q128() public { + LibBLS12381.FieldPoint2[2] memory result = LibBLS12381.hashToFieldFp2( + "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + hash_to_dst + ); + bytes memory expected_u0 = + hex"00000000000000000000000000000000025820cefc7d06fd38de7d8e370e0da8a52498be9b53cba9927b2ef5c6de1e12e12f188bbc7bc923864883c57e49e253"; + bytes memory expected_u0_I = + hex"00000000000000000000000000000000034147b77ce337a52e5948f66db0bab47a8d038e712123bb381899b6ab5ad20f02805601e6104c29df18c254b8618c7b"; + bytes memory expected_u1 = + hex"000000000000000000000000000000000930315cae1f9a6017c3f0c8f2314baa130e1cf13f6532bff0a8a1790cd70af918088c3db94bda214e896e1543629795"; + bytes memory expected_u1_I = + hex"0000000000000000000000000000000010c4df2cacf67ea3cb3108b00d4cbd0b3968031ebc8eac4b1ebcefe84d6b715fde66bef0219951ece29d1facc8a520ef"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } + + function test_hashToFieldFp2_msg_a512() public { + LibBLS12381.FieldPoint2[2] memory result = LibBLS12381.hashToFieldFp2( + "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + hash_to_dst + ); + bytes memory expected_u0 = + hex"00000000000000000000000000000000190b513da3e66fc9a3587b78c76d1d132b1152174d0b83e3c1114066392579a45824c5fa17649ab89299ddd4bda54935"; + bytes memory expected_u0_I = + hex"0000000000000000000000000000000012ab625b0fe0ebd1367fe9fac57bb1168891846039b4216b9d94007b674de2d79126870e88aeef54b2ec717a887dcf39"; + bytes memory expected_u1 = + hex"000000000000000000000000000000000e6a42010cf435fb5bacc156a585e1ea3294cc81d0ceb81924d95040298380b164f702275892cedd81b62de3aba3f6b5"; + bytes memory expected_u1_I = + hex"00000000000000000000000000000000117d9a0defc57a33ed208428cb84e54c85a6840e7648480ae428838989d25d97a0af8e3255be62b25c2a85630d2dddd8"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } +} diff --git a/packages/protocol/test/layer1/preconf/bls/script-test/BLSHashToCurveG2.sol b/packages/protocol/test/layer1/preconf/bls/script-test/BLSHashToCurveG2.sol new file mode 100644 index 00000000000..9caf95cdaea --- /dev/null +++ b/packages/protocol/test/layer1/preconf/bls/script-test/BLSHashToCurveG2.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +// solhint-disable-next-line +pragma solidity ^0.8.24; + +import "script/layer1/preconf/BaseScript.sol"; +import "src/layer1/preconf/libs/LibBLS12381.sol"; + +/** + * @dev At the time of writing this (Sept, 2024) foundry does not support the LibBLS12381 + * precompile, + * thus + * a traditional foundry test is not possible for hash to curve functionality. Instead, we test it + * manually by sending a transaction to a Pectra devnet and verify the outputs on the explorer. + */ +contract BLSHashToCurveG2 is BaseScript { + function run() external broadcast { + Target target = new Target(); + target.hashToCurveG2(); + } +} + +contract Target { + bytes internal HASH_TO_G2_DST = "QUUX-V01-CS02-with-LibBLS12381G2_XMD:SHA-256_SSWU_RO_"; + + event Output(LibBLS12381.G2Point); + + function hashToCurveG2() external { + /** + * Expected output: + * 0x0000000000000000000000000000000002c2d18e033b960562aae3cab37a27ce00d80ccd5ba4b7fe0e7a210245129dbec7780ccc7954725f4168aff2787776e600000000000000000000000000000000139cddbccdc5e91b9623efd38c49f81a6f83f175e80b06fc374de9eb4b41dfe4ca3a230ed250fbe3a2acf73a41177fd8000000000000000000000000000000001787327b68159716a37440985269cf584bcb1e621d3a7202be6ea05c4cfe244aeb197642555a0645fb87bf7466b2ba480000000000000000000000000000000000aa65dae3c8d732d10ecd2c50f8a1baf3001578f71c694e03866e9f3d49ac1e1ce70dd94a733534f106d4cec0eddd16 + */ + emit Output(LibBLS12381.hashToCurveG2("abc", HASH_TO_G2_DST)); + } +} diff --git a/packages/protocol/test/layer1/preconf/bls/script-test/BLSVerifySignature.sol b/packages/protocol/test/layer1/preconf/bls/script-test/BLSVerifySignature.sol new file mode 100644 index 00000000000..244b2bcf629 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/bls/script-test/BLSVerifySignature.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +// solhint-disable-next-line +pragma solidity ^0.8.24; + +import "script/layer1/preconf/BaseScript.sol"; +import "src/layer1/preconf/libs/LibBLSSignature.sol"; + +/** + * @dev At the time of writing this (Sept, 2024) foundry does not support the LibBLS12381 + * precompile, + * thus + * a traditional foundry test is not possible to verify a signature. Instead, we test it + * manually by sending a transaction to a Pectra devnet and verify the outputs on the explorer. + */ +contract BLSVerifySignature is BaseScript { + using LibBLS12381 for *; + + function run() external broadcast { + Target target = new Target(); + target.verify(); + } +} + +contract Target { + event Output(bool); + + function verify() external { + LibBLS12381.G2Point memory sig = LibBLS12381.G2Point({ + x: [ + 0x00000000000000000000000000000000075785f1ffe7faabd27259035731c4ff, + 0x881c38e87fc963a47425ce52f12f18c348370eaea53008bc683206d7770f5bdf + ], + x_I: [ + 0x0000000000000000000000000000000002f8146bf138cbc35aeeccd4570d121c, + 0x8aec29661e8108e4094dc37b5a499272a6a680f015d0527c312a82457db8b979 + ], + y: [ + 0x000000000000000000000000000000000f5357626a9be51a0e689244b1a28d7b, + 0xe6132ad16f8d1852c2c75804fccf473902a5b8bbe6dd182d04643f34bb34fbe6 + ], + y_I: [ + 0x000000000000000000000000000000000544d2c2834eebb7cfbd5498cc0c328b, + 0x619d482161808b7e27dbb92941df85f704a6218ce9903af72eabdb3dbead70c7 + ] + }); + + LibBLS12381.G1Point memory pubkey = LibBLS12381.G1Point({ + x: [ + 0x00000000000000000000000000000000101936a69d6fbd2feae29545220ad66e, + 0xb60c3171b8d15de582dd2c645f67cb32377de0c97666e4b4fc7fad8a1c9a81af + ], + y: [ + 0x00000000000000000000000000000000056cde7adcc8f412efa58ee343569d76, + 0xa95176133a52fbf43979f46c0658010c573c093f3814a5d4dded92b52d197dff + ] + }); + + /** + * Expected output using DST as empty string "": + * 0x0000000000000000000000000000000000000000000000000000000000000001 + */ + emit Output(LibBLSSignature.verifySignature("abc", sig, pubkey)); + } +} diff --git a/packages/protocol/test/layer1/preconf/fixtures/BeaconProofs.sol b/packages/protocol/test/layer1/preconf/fixtures/BeaconProofs.sol new file mode 100644 index 00000000000..e6ada1d91c3 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/fixtures/BeaconProofs.sol @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/preconf/libs/LibEIP4788.sol"; + +/// @dev Data has been taken from beacon block at slot 9000000 on Ethereum mainnet +library BeaconProofs { + function validator() internal pure returns (bytes memory) { + return + hex"98fb8eacf684f80712faa9354535620f94a10687c2243c0cdae7280cf6220fb64c78e49efe8eef599406b33e5aac4dd0"; + } + + function validatorsRoot() internal pure returns (bytes32) { + return 0x0ccf56d8e76d16306c6e6e78ec20c07be5fa5ae89b18873b43cc823075a5df0b; + } + + function validatorIndex() internal pure returns (uint256) { + return 912_203; + } + + function beaconStateRoot() internal pure returns (bytes32) { + return 0xcd918afbe365c6dcabab551e32fae5f3f9677433876049dc035e5135122a2e7e; + } + + function beaconBlockRoot() internal pure returns (bytes32) { + return 0xcc8a36da0d5112c8dd602530ac7c7b8364edfd92cdc6f0d62365de392e8e5bb6; + } + + function validatorChunks() internal pure returns (bytes32[8] memory) { + bytes32[8] memory chunks; + chunks[0] = 0x8d7c2b324f41a1d395fc265d42c6e1293b38c33a674244cae9ac67d68367036d; + chunks[1] = 0x0100000000000000000000006661be71769ff00c5e403f327869505caf0b7f70; + chunks[2] = 0x0040597307000000000000000000000000000000000000000000000000000000; + chunks[3] = 0x0000000000000000000000000000000000000000000000000000000000000000; + chunks[4] = 0xe271030000000000000000000000000000000000000000000000000000000000; + chunks[5] = 0x6084030000000000000000000000000000000000000000000000000000000000; + chunks[6] = 0xffffffffffffffff000000000000000000000000000000000000000000000000; + chunks[7] = 0xffffffffffffffff000000000000000000000000000000000000000000000000; + + return chunks; + } + + function validatorProof() internal pure returns (bytes32[] memory) { + bytes32[] memory proof = new bytes32[](41); + proof[0] = 0xf5ee350215176477a7fb48aa80292de237856ad3068f46728da26aedca8a3b2b; + proof[1] = 0xfbeca4cff4f86c2ff5f1ff6808f57b12e7a6f3365d59a35c90f19715995f8be8; + proof[2] = 0x06ee0000b0cf0c0531c2a4f3368eb8df6079216bb6cca127a76e459c62058615; + proof[3] = 0x5b8c291888e7936b46e36d7b71d36c846fbfc04d48cab6beb20e23642f64ee69; + proof[4] = 0xa748ed979e88b53c303ece0946d13d2def12e003b90b562474dac1768d1d0975; + proof[5] = 0xe667bf725f0e72f47409d089248b50a9a11d08591b83374f18ed338f5c3ff964; + proof[6] = 0xd86b77a649fad1d48e109b8bc98d2a2dbc88a4b9b86c5e06878e0b980ebda3b7; + proof[7] = 0xc2db7c18d080f2b21f2c981f65414d00b0cc8542fda38233fa1c1ee33df4bbe1; + proof[8] = 0xe72e80d2ce704957f507af587e19a61ceadad2411c9728315e1f294fadae23f1; + proof[9] = 0x32f30ee3311d96e0544e2e4b0f4e1e1863d06224636ea8004e49a27280a81a11; + proof[10] = 0x89d191926d7681be7545b42b9ef95d413fbe1d8c014400c5ece8141be300b238; + proof[11] = 0x0c924ac306b692750b3285f974edf991dd4f05fff0ab3dd114430499722ff93b; + proof[12] = 0x1eb9a358bbe044159a2bed16a0b69b5b988ba0c57f2c267cfd390b3fb86fde6a; + proof[13] = 0xda60132f38fc053c26ba06136e03a861fd5e59734dc3e6cc1b69c072b9ce600a; + proof[14] = 0xcee182aa676671046ccf49213a58ef8d35e227a3adfaa146f7b71dc47c7bdd73; + proof[15] = 0xf1d0df094ceceed165886daf4c52c467710ed19a53df98ab2607629dbf7036ba; + proof[16] = 0x81917306117277e02aa4174ae73a2ec414862aced0491ec933434d9bd2279e3f; + proof[17] = 0xc562f7ffddaec138272a84b043216c1c906f68198f752ad6b80171794fcba3b5; + proof[18] = 0xcdfeaaff006b40d110ff925b18bffc36cf55543a35c84d25da0b196ea81c6029; + proof[19] = 0x8bd5e9cadc78cd0b0e0abd32a63a39596ad24e14552926bce0f6c54e39c29b99; + proof[20] = 0x6187b4f2f4b3e572fe26a6c73567ab5b1695303b0ad9dd5c9ab9679266fba2e3; + proof[21] = 0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c; + proof[22] = 0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167; + proof[23] = 0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7; + proof[24] = 0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0; + proof[25] = 0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544; + proof[26] = 0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765; + proof[27] = 0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4; + proof[28] = 0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1; + proof[29] = 0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636; + proof[30] = 0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c; + proof[31] = 0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7; + proof[32] = 0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff; + proof[33] = 0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5; + proof[34] = 0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d; + proof[35] = 0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c; + proof[36] = 0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327; + proof[37] = 0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74; + proof[38] = 0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76; + proof[39] = 0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f; + proof[40] = 0x2821150000000000000000000000000000000000000000000000000000000000; + + return proof; + } + + function beaconStateProofForValidatorList() internal pure returns (bytes32[] memory) { + bytes32[] memory proof = new bytes32[](5); + proof[0] = 0x8c53160000000000000000000000000000000000000000000000000000000000; + proof[1] = 0xd9cb62ffd113d2a2b71b4539c54bf01587d8a2a5a7c81baa2c2ae89d245578d6; + proof[2] = 0xefbad4c97640101fc18122e8b818e8cc3c278a18e05dc601af4095d5519d834a; + proof[3] = 0x775d61d75ab0731115447847764383a42283b502eb4ed3ca7ba412ac67da5138; + proof[4] = 0xbb5cf5c0273b8d100f329ea0c78c471d0833f048c7fc264c285c3696d7aed412; + + return proof; + } + + function beaconBlockProofForBeaconState() internal pure returns (bytes32[] memory) { + bytes32[] memory proof = new bytes32[](3); + proof[0] = 0xf47de6dfa04049ce0586d989821321111d896f3cc37e40637fc226bee212e43d; + proof[1] = 0x7506bc99ed6f0e48ad0e1ded3e878dfcfe08ca4a89308910ba1941e912673258; + proof[2] = 0x00f48b46fd6aac7f8a72d8e1eed4f3b5bd244bf6242cb538ca94b44aed02857a; + + return proof; + } + + function beaconBlockProofForProposer() internal pure returns (bytes32[] memory) { + bytes32[] memory proof = new bytes32[](3); + proof[0] = 0x4054890000000000000000000000000000000000000000000000000000000000; + proof[1] = 0xd22083672621f940e26b3f1e627f8c311a3f5f0874c193b40974f244668e1372; + proof[2] = 0x00f48b46fd6aac7f8a72d8e1eed4f3b5bd244bf6242cb538ca94b44aed02857a; + + return proof; + } + + function eip4788ValidatorInclusionProof() + internal + pure + returns (LibEIP4788.InclusionProof memory) + { + return LibEIP4788.InclusionProof({ + validator: validatorChunks(), + validatorIndex: validatorIndex(), + validatorProof: validatorProof(), + validatorsRoot: validatorsRoot(), + beaconStateProof: beaconStateProofForValidatorList(), + beaconStateRoot: beaconStateRoot(), + beaconBlockProofForState: beaconBlockProofForBeaconState(), + beaconBlockProofForProposerIndex: beaconBlockProofForProposer() + }); + } +} diff --git a/packages/protocol/test/layer1/preconf/fixtures/BlocksFixtures.sol b/packages/protocol/test/layer1/preconf/fixtures/BlocksFixtures.sol new file mode 100644 index 00000000000..291da5cb39b --- /dev/null +++ b/packages/protocol/test/layer1/preconf/fixtures/BlocksFixtures.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../BaseTest.sol"; +import "../mocks/MockPreconfRegistry.sol"; +import "../mocks/MockPreconfServiceManager.sol"; +import "../mocks/MockBeaconBlockRoot.sol"; +import "test/layer1/based/MockTaikoL1.sol"; + +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/impl/PreconfTaskManager.sol"; +import "src/layer1/preconf/iface/IPreconfRegistry.sol"; +import "src/layer1/preconf/iface/IPreconfServiceManager.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; + +contract BlocksFixtures is BaseTest { + PreconfTaskManager internal preconfTaskManager; + MockPreconfRegistry internal preconfRegistry; + MockPreconfServiceManager internal preconfServiceManager; + MockBeaconBlockRoot internal beaconBlockRootContract; + MockTaikoL1 internal taikoL1; + + function setUp() public virtual { + preconfRegistry = new MockPreconfRegistry(); + preconfServiceManager = new MockPreconfServiceManager(); + beaconBlockRootContract = new MockBeaconBlockRoot(); + taikoL1 = new MockTaikoL1(); + + preconfTaskManager = new PreconfTaskManager( + IPreconfServiceManager(address(preconfServiceManager)), + IPreconfRegistry(address(preconfRegistry)), + ITaikoL1(taikoL1), + LibPreconfConstants.MAINNET_BEACON_GENESIS, + address(beaconBlockRootContract) + ); + } + + /// @dev Inserts two preconfers in the lookahead for the next epoch at the given slots. + function prepareLookahead(uint256 slot1, uint256 slot2) internal { + addPreconfersToRegistry(3); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_1, + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT * (slot1 - 1) + }); + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_3, + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT * (slot2 - 1) + }); + + vm.warp(LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT); + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function addPreconfersToRegistry(uint256 count) internal { + for (uint256 i = 1; i <= count; i++) { + preconfRegistry.registerPreconfer(vm.addr(i)); + } + } +} diff --git a/packages/protocol/test/layer1/preconf/fixtures/LookaheadFixtures.sol b/packages/protocol/test/layer1/preconf/fixtures/LookaheadFixtures.sol new file mode 100644 index 00000000000..d9e77fe34bc --- /dev/null +++ b/packages/protocol/test/layer1/preconf/fixtures/LookaheadFixtures.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "test/layer1/based/MockTaikoL1.sol"; +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/impl/PreconfTaskManager.sol"; +import "src/layer1/preconf/iface/IPreconfRegistry.sol"; +import "src/layer1/preconf/iface/IPreconfServiceManager.sol"; + +import "../BaseTest.sol"; +import "../mocks/MockPreconfRegistry.sol"; +import "../mocks/MockPreconfServiceManager.sol"; +import "../mocks/MockBeaconBlockRoot.sol"; + +contract LookaheadFixtures is BaseTest { + PreconfTaskManager internal preconfTaskManager; + MockPreconfRegistry internal preconfRegistry; + MockPreconfServiceManager internal preconfServiceManager; + MockBeaconBlockRoot internal beaconBlockRootContract; + MockTaikoL1 internal taikoL1; + + function setUp() public virtual { + preconfRegistry = new MockPreconfRegistry(); + preconfServiceManager = new MockPreconfServiceManager(); + beaconBlockRootContract = new MockBeaconBlockRoot(); + taikoL1 = new MockTaikoL1(); + + preconfTaskManager = new PreconfTaskManager( + IPreconfServiceManager(address(preconfServiceManager)), + IPreconfRegistry(address(preconfRegistry)), + ITaikoL1(taikoL1), + LibPreconfConstants.MAINNET_BEACON_GENESIS, + address(beaconBlockRootContract) + ); + } + + function addPreconfersToRegistry(uint256 count) internal { + for (uint256 i = 1; i <= count; i++) { + preconfRegistry.registerPreconfer(vm.addr(i)); + } + } + + function computeFallbackPreconfer( + bytes32 randomness, + uint256 nextPreconferIndex + ) + internal + pure + returns (address) + { + return vm.addr(uint256(randomness) % (nextPreconferIndex - 1) + 1); + } +} diff --git a/packages/protocol/test/layer1/preconf/lookahead/IncorrectLookahead.t.sol b/packages/protocol/test/layer1/preconf/lookahead/IncorrectLookahead.t.sol new file mode 100644 index 00000000000..46ff9691ec7 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/lookahead/IncorrectLookahead.t.sol @@ -0,0 +1,661 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../fixtures/BeaconProofs.sol"; +import "../fixtures/LookaheadFixtures.sol"; + +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; + +/// @dev The beacon chain data used here is from slot 9000000 on Ethereum mainnet. +contract IncorrectLookahead is LookaheadFixtures { + // Most tests in this file use a lookahead that has a preconfer (addr_1) set at slot 16 in epoch + // 2. + // Epoch 1 starts at the genesis timestamp. + uint256 internal nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 internal slot16Timestamp = nextEpochStart + (15 * LibPreconfConstants.SECONDS_IN_SLOT); + + function setUp() public override { + super.setUp(); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case1() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // This beacon proposer is not added as a validator for our preconfer in lookahead + bytes memory beaconProposer = BeaconProofs.validator(); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case2() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // The beacon proposer is added for the preconfer, but is not allowed to propose at slot 16 + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_1, slot16Timestamp + LibPreconfConstants.SECONDS_IN_SLOT, 0 + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case3() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // The beacon proposer is added for the preconfer, but is has lost proposal rights at slot + // 16 + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_1, LibPreconfConstants.MAINNET_BEACON_GENESIS, slot16Timestamp + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case4() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // The beacon proposer is added for the preconfer, but is has lost proposal rights before + // slot 16 + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, + addr_1, + LibPreconfConstants.MAINNET_BEACON_GENESIS, + slot16Timestamp - LibPreconfConstants.SECONDS_IN_SLOT + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case5() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // The beacon proposer belongs to another preconfer + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_2, LibPreconfConstants.MAINNET_BEACON_GENESIS, 0 + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case6() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Take a slot for which their is no dedicated lookahead entry and set it's beacon block + // root + // containing a proposer mapped to a valid preconfer + uint256 slot15Timestamp = slot16Timestamp - LibPreconfConstants.SECONDS_IN_SLOT; + beaconBlockRootContract.set(slot16Timestamp, BeaconProofs.beaconBlockRoot()); + + // The beacon proposer belongs to a valid preconfer who is not in the lookahead at slot 15 + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_2, LibPreconfConstants.MAINNET_BEACON_GENESIS, 0 + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot15Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case7() + external + { + addPreconfersToRegistry(10); + // addr_1 posts empty lookahead for next epoch to set fallback preconfer + postEmptyLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Take the last slot in the lookahead with the fallback preconfer and set it's beacon block + // root + // containing a proposer mapped to an active preconfer + beaconBlockRootContract.set(nextEpochEnd, BeaconProofs.beaconBlockRoot()); + + // The beacon proposer belongs to a valid preconfer who is not in the lookahead at slot 32 + // as the lookahead has the fallback preconfer + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_2, LibPreconfConstants.MAINNET_BEACON_GENESIS, 0 + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 1, + nextEpochEnd - LibPreconfConstants.SECONDS_IN_SLOT, + beaconProposer, + BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_setsFallbackPreconfer_Case1() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to an arbitrary timestamp after the incorrect slot in the next epoch + vm.warp(slot16Timestamp + (2 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // This beacon proposer is not added as a validator for our preconfer in lookahead + bytes memory beaconProposer = BeaconProofs.validator(); + + bytes32 randomness = bytes32(uint256(4)); + + // Set beacon block root such that addr_4 is randomly selected + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT, + randomness + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + uint256 lastSlotTimestamp = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Verify that the lookahead has the fallback preconfer + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq( + lookaheadBuffer[3].preconfer, + computeFallbackPreconfer(randomness, preconfRegistry.getNextPreconferIndex()) + ); + assertEq(lookaheadBuffer[3].timestamp, lastSlotTimestamp); + assertEq( + lookaheadBuffer[3].prevTimestamp, nextEpochStart - LibPreconfConstants.SECONDS_IN_SLOT + ); + assertEq(lookaheadBuffer[3].isFallback, true); + + // Verify that the remaining entries for the epoch have been removed + assertEq(lookaheadBuffer[2].preconfer, address(0)); + assertEq(lookaheadBuffer[2].timestamp, 0); + assertEq(lookaheadBuffer[2].prevTimestamp, 0); + assertEq(lookaheadBuffer[2].isFallback, false); + + assertEq(lookaheadBuffer[1].preconfer, address(0)); + assertEq(lookaheadBuffer[1].timestamp, 0); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + } + + function test_proveIncorrectLookahead_setsFallbackPreconfer_Case2() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to an arbitrary timestamp after the incorrect slot in the next epoch + vm.warp(slot16Timestamp + (2 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Force push lookahead for next epoch + // This to ensure if the first entry in the following epoch connects correctly to the newly + // inserted + // fallback preconfer + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + + uint256 nextToNextEpochStart = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Slot 13 + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_1, + timestamp: nextToNextEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + // Slot 22 + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: nextToNextEpochStart + (21 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // This beacon proposer is not added as a validator for our preconfer in lookahead + bytes memory beaconProposer = BeaconProofs.validator(); + + bytes32 randomness = bytes32(uint256(4)); + + // Set beacon block root such that addr_4 is randomly selected + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT, + randomness + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + uint256 lastSlotTimestamp = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Verify that the lookahead has the fallback preconfer + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq( + lookaheadBuffer[3].preconfer, + computeFallbackPreconfer(randomness, preconfRegistry.getNextPreconferIndex()) + ); + assertEq(lookaheadBuffer[3].timestamp, lastSlotTimestamp); + assertEq( + lookaheadBuffer[3].prevTimestamp, nextEpochStart - LibPreconfConstants.SECONDS_IN_SLOT + ); + assertEq(lookaheadBuffer[3].isFallback, true); + + // Verify that the remaining entries for the epoch have been removed + assertEq(lookaheadBuffer[2].preconfer, address(0)); + assertEq(lookaheadBuffer[2].timestamp, 0); + assertEq(lookaheadBuffer[2].prevTimestamp, 0); + assertEq(lookaheadBuffer[2].isFallback, false); + + assertEq(lookaheadBuffer[1].preconfer, address(0)); + assertEq(lookaheadBuffer[1].timestamp, 0); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + + // Verify that the first entry in the following epoch is connected to the fallback preconfer + assertEq(lookaheadBuffer[4].preconfer, addr_1); + assertEq( + lookaheadBuffer[4].timestamp, + nextToNextEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq(lookaheadBuffer[4].prevTimestamp, lastSlotTimestamp); + assertEq(lookaheadBuffer[4].isFallback, false); + } + + function test_proveIncorrectLookahead_revertsWhenPosterIsAlreadySlashedOrLookaheadIsEmpty() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // Reverts when the timestamp belongs to an epoch that does not have a lookahead yet + vm.expectRevert(IPreconfTaskManager.PosterAlreadySlashedOrLookaheadIsEmpty.selector); + preconfTaskManager.proveIncorrectLookahead( + 2, + // Epoch does not have a poster yet + LibPreconfConstants.MAINNET_BEACON_GENESIS + (4 * LibPreconfConstants.SECONDS_IN_EPOCH), + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenDisputeWindowIsMissed() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // Wrap into the future when the dispute window is missed + vm.warp( + slot16Timestamp + LibPreconfConstants.DISPUTE_PERIOD + + LibPreconfConstants.SECONDS_IN_SLOT + ); + + // Reverts when the dispute period is over + vm.expectRevert(IPreconfTaskManager.MissedDisputeWindow.selector); + preconfTaskManager.proveIncorrectLookahead( + 2, + slot16Timestamp, + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenLookaheadPointerIsInvalid_Case1() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Reverts because the pointer is in the past and slot timestamp in future + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + preconfTaskManager.proveIncorrectLookahead( + 1, + slot16Timestamp, + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenLookaheadPointerIsInvalid_Case2() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Reverts because the pointer is in the future (slotTimestamp == pointer.prevTimestamp) + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + preconfTaskManager.proveIncorrectLookahead( + 3, + slot16Timestamp, + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenLookaheadPointerIsInvalid_Case3() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // Wrap to arbitrary timestamp in next epoch + vm.warp(slot16Timestamp + (2 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Push a lookahead for the following epoch + // This will enable simulating the condition slotTimestamp < pointer.prevTimestamps + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + uint256 nextToNextEpochStart = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH; + // Slot 13 + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_1, + timestamp: nextToNextEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Reverts because the pointer is in the future (slotTimestamp < pointer.prevTimestamp) + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + preconfTaskManager.proveIncorrectLookahead( + 4, + slot16Timestamp, + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenLookaheadEntryIsCorrect() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + // Sets slot 16 to its own address + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Add the validator for addr_1 in registry + // This is also the proposer for the beacon block whose root we have stored (see + // `postLookahead()`) + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_1, LibPreconfConstants.MAINNET_BEACON_GENESIS, 0 + ); + + // Reverts when the lookahead is tried to be proven incorrect + vm.expectRevert(IPreconfTaskManager.LookaheadEntryIsCorrect.selector); + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_emitsProvedIncorrectLookaheadEvent() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // This beacon proposer is not added as a validator for our preconfer in lookahead + bytes memory beaconProposer = BeaconProofs.validator(); + + // Prove the lookahead to be incorrect + vm.expectEmit(); + emit IPreconfTaskManager.ProvedIncorrectLookahead(addr_1, slot16Timestamp, address(this)); + + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + //========= + // Helpers + //========= + + /// @dev Makes addr_1 push a fixed lookeahead + function postLookahead() internal { + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](3); + + // Slot 5 + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: nextEpochStart + (4 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + // Slot 16 (Slot used for fault proofs) + lookaheadSetParams[1] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_1, timestamp: slot16Timestamp }); + // Slot 25 + lookaheadSetParams[2] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_3, + timestamp: nextEpochStart + (24 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Set the beacon block root for slot 16 (in the timestamp of slot 17) + beaconBlockRootContract.set( + slot16Timestamp + LibPreconfConstants.SECONDS_IN_SLOT, BeaconProofs.beaconBlockRoot() + ); + } + + /// @dev Makes addr_1 push an empty lookeahead + function postEmptyLookahead() internal { + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](0); + + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT, + bytes32(uint256(4)) + ); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } +} diff --git a/packages/protocol/test/layer1/preconf/lookahead/LookaheadPosting.t.sol b/packages/protocol/test/layer1/preconf/lookahead/LookaheadPosting.t.sol new file mode 100644 index 00000000000..cbee4ba898c --- /dev/null +++ b/packages/protocol/test/layer1/preconf/lookahead/LookaheadPosting.t.sol @@ -0,0 +1,428 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../fixtures/LookaheadFixtures.sol"; + +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; + +contract LookaheadPosting is LookaheadFixtures { + function setUp() public override { + super.setUp(); + } + + function test_forcePushLookahead_setsNonEmptyLookaheadInNextEpoch_Case1() external { + addPreconfersToRegistry(5); + + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + + // Slot 1 + lookaheadSetParams[0] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_1, timestamp: nextEpochStart }); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Verify storage is updated correctly + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 1); + + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq(lookaheadBuffer[1].preconfer, addr_1); + assertEq(lookaheadBuffer[1].timestamp, nextEpochStart); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_1); + } + + function test_forcePushLookahead_setsNonEmptyLookaheadInNextEpoch_Case2() external { + addPreconfersToRegistry(7); + + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 slot20Timestamp = nextEpochStart + (19 * LibPreconfConstants.SECONDS_IN_SLOT); + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + + // Slot 1 + lookaheadSetParams[0] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_1, timestamp: nextEpochStart }); + // Slot 20 + lookaheadSetParams[1] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_3, timestamp: slot20Timestamp }); + + // Address 3 pushes the lookahead + vm.prank(addr_3); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Storage is updated correctly + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 2); + + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq(lookaheadBuffer[1].preconfer, addr_1); + assertEq(lookaheadBuffer[1].timestamp, nextEpochStart); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + + assertEq(lookaheadBuffer[2].preconfer, addr_3); + assertEq(lookaheadBuffer[2].timestamp, slot20Timestamp); + assertEq(lookaheadBuffer[2].prevTimestamp, nextEpochStart); + assertEq(lookaheadBuffer[2].isFallback, false); + + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_3); + } + + function test_forcePushLookahead_setsNonEmptyLookaheadInNextEpoch_Case3() external { + addPreconfersToRegistry(10); + + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 slot14Timestamp = nextEpochStart + (13 * LibPreconfConstants.SECONDS_IN_SLOT); + uint256 slot31Timestamp = nextEpochStart + (30 * LibPreconfConstants.SECONDS_IN_SLOT); + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](3); + + // Slot 1 + lookaheadSetParams[0] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_1, timestamp: nextEpochStart }); + // Slot 14 + lookaheadSetParams[1] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_2, timestamp: slot14Timestamp }); + // Slot 31 + lookaheadSetParams[2] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_5, timestamp: slot31Timestamp }); + + // Address 2 pushes the lookahead + vm.prank(addr_2); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Storage is updated correctly + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 3); + + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq(lookaheadBuffer[1].preconfer, addr_1); + assertEq(lookaheadBuffer[1].timestamp, nextEpochStart); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + + assertEq(lookaheadBuffer[2].preconfer, addr_2); + assertEq(lookaheadBuffer[2].timestamp, slot14Timestamp); + assertEq(lookaheadBuffer[2].prevTimestamp, nextEpochStart); + assertEq(lookaheadBuffer[2].isFallback, false); + + assertEq(lookaheadBuffer[3].preconfer, addr_5); + assertEq(lookaheadBuffer[3].timestamp, slot31Timestamp); + assertEq(lookaheadBuffer[3].prevTimestamp, slot14Timestamp); + assertEq(lookaheadBuffer[3].isFallback, false); + + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_2); + } + + function test_forcePushLookahead_setsFallbackPreconfer_Case1() external { + addPreconfersToRegistry(10); + + // Arbitrary slot in the current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 lastSlotTimestampInNextEpoch = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Create an empty lookahead set + IPreconfTaskManager.LookaheadSetParam[] memory emptyLookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](0); + + bytes32 randomness = bytes32(uint256(4)); + + // Push a required root to the mock beacon block root contract + // This root as a source of randomness selects the preconfer with index 4 + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT, + randomness + ); + + // Address 2 pushes the empty lookahead + vm.prank(addr_2); + preconfTaskManager.forcePushLookahead(emptyLookaheadSetParams); + + // Verify that the lookahead is empty + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 1); + + // Verify that correct preconfer is inserted as fallback in lookahead buffer + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq( + lookaheadBuffer[1].preconfer, + computeFallbackPreconfer(randomness, preconfRegistry.getNextPreconferIndex()) + ); + assertEq(lookaheadBuffer[1].timestamp, lastSlotTimestampInNextEpoch); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, true); + + // Verify that the lookahead poster is set correctly + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_2); + } + + function test_forcePushLookahead_setsFallbackPreconfer_Case2() external { + addPreconfersToRegistry(10); + + // Arbitrary slot in the current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 lastSlotTimestampInNextEpoch = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Create an empty lookahead set + IPreconfTaskManager.LookaheadSetParam[] memory emptyLookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](0); + + bytes32 randomness = bytes32(uint256(4)); + + // Unlike Case 1, we push the root at a later timestamp to simulate "skipped blocks" and see + // if the contract iterates forward and finds the required root + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + 3 * LibPreconfConstants.SECONDS_IN_SLOT, + randomness + ); + + // Address 2 pushes the empty lookahead + vm.prank(addr_2); + preconfTaskManager.forcePushLookahead(emptyLookaheadSetParams); + + // Verify that the lookahead is empty + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 1); + + // Verify that correct preconfer is inserted as fallback in lookahead buffer + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq( + lookaheadBuffer[1].preconfer, + computeFallbackPreconfer(randomness, preconfRegistry.getNextPreconferIndex()) + ); + assertEq(lookaheadBuffer[1].timestamp, lastSlotTimestampInNextEpoch); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, true); + + // Verify that the lookahead poster is set correctly + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_2); + } + + function test_forcePushLookahead_revertsWhenPreconferNotRegistered_Case1() external { + // Add addr_1 through addr_5 to the registry + addPreconfersToRegistry(5); + + IPreconfTaskManager.LookaheadSetParam[] memory emptyLookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](0); + + // Transaction is expected to revert as addr_6 is not registered in the preconfer registry + vm.prank(addr_6); + vm.expectRevert(IPreconfTaskManager.PreconferNotRegistered.selector); + preconfTaskManager.forcePushLookahead(emptyLookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenPreconferNotRegistered_Case2() external { + // Add addr_1 through addr_5 to the registry + addPreconfersToRegistry(5); + + // Arbitrary slot in the current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a lookahead set with an unregistered preconfer (addr_6) + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_6 // addr_6 is not registered + }); + + // Transaction is expected to revert as addr_6 is not registered in the preconfer registry + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.PreconferNotRegistered.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenLookaheadIsNotRequired() external { + // Add addr_1 through addr_5 to the registry + addPreconfersToRegistry(5); + + // Arbitrary slot in the current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a valid lookahead set + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_1 + }); + + // First push should succeed + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Verify that the lookahead poster is set correctly + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_1); + + // Attempt to push the lookahead again fails + vm.prank(addr_2); + vm.expectRevert(IPreconfTaskManager.LookaheadIsNotRequired.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenInvalidSlotTimestamp_notMultipleOf12() external { + // Add addr_1 to the registry + addPreconfersToRegistry(1); + + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a lookahead set with an invalid timestamp (not a multiple of 12 seconds from epoch + // start) + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + 5, // Not a multiple of 12 + preconfer: addr_1 + }); + + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.InvalidSlotTimestamp.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenInvalidSlotTimestamp_exceedsEpochEnd() external { + // Add addr_1 to the registry + addPreconfersToRegistry(1); + + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a lookahead set with a timestamp that exceeds the epoch end + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH, // Exactly one epoch + // later, which is the start of the next epoch + preconfer: addr_1 + }); + + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.InvalidSlotTimestamp.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenInvalidSlotTimestamp_notGreaterThanPrevious() + external + { + // Add addr_1 and addr_2 to the registry + addPreconfersToRegistry(2); + + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a lookahead set with timestamps in the wrong order + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + 2 * LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_1 + }); + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT, // Earlier than the + // previous timestamp + preconfer: addr_2 + }); + + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.InvalidSlotTimestamp.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_emitsLookaheadUpdatedEvent() external { + // Add addr_1 and addr_2 to the registry + addPreconfersToRegistry(2); + + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a valid lookahead set + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_1 + }); + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + 2 * LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_2 + }); + + vm.prank(addr_1); + vm.expectEmit(); + emit IPreconfTaskManager.LookaheadUpdated(lookaheadSetParams); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } +} diff --git a/packages/protocol/test/layer1/preconf/mocks/MockBeaconBlockRoot.sol b/packages/protocol/test/layer1/preconf/mocks/MockBeaconBlockRoot.sol new file mode 100644 index 00000000000..35f3caba2db --- /dev/null +++ b/packages/protocol/test/layer1/preconf/mocks/MockBeaconBlockRoot.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +contract MockBeaconBlockRoot { + mapping(uint256 => bytes32) internal blockRoots; + + function set(uint256 timestamp, bytes32 root) external { + blockRoots[timestamp] = root; + } + + fallback(bytes calldata data) external payable returns (bytes memory) { + bytes32 root = blockRoots[abi.decode(data, (uint256))]; + require(root != bytes32(0), "no root"); + return abi.encode(root); + } + + receive() external payable { } +} diff --git a/packages/protocol/test/layer1/preconf/mocks/MockPreconfRegistry.sol b/packages/protocol/test/layer1/preconf/mocks/MockPreconfRegistry.sol new file mode 100644 index 00000000000..d28561a6fb6 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/mocks/MockPreconfRegistry.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +contract MockPreconfRegistry { + struct Validator { + address preconfer; + uint40 startProposingAt; + uint40 stopProposingAt; + } + + mapping(address preconfer => uint256 index) internal preconferToIndex; + mapping(uint256 index => address preconfer) internal indexToPreconfer; + mapping(bytes32 pubKeyhash => Validator validator) internal validators; + + uint256 internal nextPreconferIndex = 1; + + function registerPreconfer(address preconfer) external { + uint256 _nextPreconferIndex = nextPreconferIndex; + + preconferToIndex[preconfer] = _nextPreconferIndex; + indexToPreconfer[_nextPreconferIndex] = preconfer; + + unchecked { + nextPreconferIndex = _nextPreconferIndex + 1; + } + } + + function addValidator( + bytes memory pubKey, + address preconfer, + uint256 startProposingAt, + uint256 stopProposingAt + ) + external + { + bytes32 key = keccak256(abi.encodePacked(bytes16(0), pubKey)); + validators[key] = Validator(preconfer, uint40(startProposingAt), uint40(stopProposingAt)); + } + + function getNextPreconferIndex() external view returns (uint256) { + return nextPreconferIndex; + } + + function getPreconferIndex(address preconfer) external view returns (uint256) { + return preconferToIndex[preconfer]; + } + + function getPreconferAtIndex(uint256 index) external view returns (address) { + return indexToPreconfer[index]; + } + + function getValidator(bytes32 pubKeyHash) external view returns (Validator memory) { + return validators[pubKeyHash]; + } +} diff --git a/packages/protocol/test/layer1/preconf/mocks/MockPreconfServiceManager.sol b/packages/protocol/test/layer1/preconf/mocks/MockPreconfServiceManager.sol new file mode 100644 index 00000000000..c46ea65303b --- /dev/null +++ b/packages/protocol/test/layer1/preconf/mocks/MockPreconfServiceManager.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +contract MockPreconfServiceManager { + mapping(address => uint256) public stakeLockTimestamps; + mapping(address => bool) public operatorSlashed; + + function lockStakeUntil(address operator, uint256 timestamp) external { + stakeLockTimestamps[operator] = timestamp; + } + + function slashOperator(address operator) external { + operatorSlashed[operator] = true; + } +} diff --git a/packages/protocol/test/team/airdrop/ERC20Airdrop.t.sol b/packages/protocol/test/layer1/team/airdrop/ERC20Airdrop.t.sol similarity index 98% rename from packages/protocol/test/team/airdrop/ERC20Airdrop.t.sol rename to packages/protocol/test/layer1/team/airdrop/ERC20Airdrop.t.sol index ac33e319356..b96d8454d30 100644 --- a/packages/protocol/test/team/airdrop/ERC20Airdrop.t.sol +++ b/packages/protocol/test/layer1/team/airdrop/ERC20Airdrop.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../../TaikoTest.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "../../TaikoL1Test.sol"; contract MockERC20Airdrop is ERC20Airdrop { function _verifyMerkleProof( diff --git a/packages/protocol/test/team/airdrop/MerkleClaimable.t.sol b/packages/protocol/test/layer1/team/airdrop/MerkleClaimable.t.sol similarity index 98% rename from packages/protocol/test/team/airdrop/MerkleClaimable.t.sol rename to packages/protocol/test/layer1/team/airdrop/MerkleClaimable.t.sol index 5e29afceec9..613a34637ce 100644 --- a/packages/protocol/test/team/airdrop/MerkleClaimable.t.sol +++ b/packages/protocol/test/layer1/team/airdrop/MerkleClaimable.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../../TaikoTest.sol"; +import "../../TaikoL1Test.sol"; contract MockMerkleClaimable is MerkleClaimable { function init(uint64 _claimStart, uint64 _claimEnd, bytes32 _merkleRoot) external initializer { diff --git a/packages/protocol/test/team/tokenunlock/TokenUnlock.t.sol b/packages/protocol/test/layer1/team/tokenunlock/TokenUnlock.t.sol similarity index 98% rename from packages/protocol/test/team/tokenunlock/TokenUnlock.t.sol rename to packages/protocol/test/layer1/team/tokenunlock/TokenUnlock.t.sol index 8a2ed61964a..1bac31403c8 100644 --- a/packages/protocol/test/team/tokenunlock/TokenUnlock.t.sol +++ b/packages/protocol/test/layer1/team/tokenunlock/TokenUnlock.t.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; -import "../../TaikoTest.sol"; -import "../../../contracts/team/tokenunlock/TokenUnlock.sol"; +import "src/layer1/team/tokenunlock/TokenUnlock.sol"; +import "test/shared/TaikoTest.sol"; contract MyERC20 is ERC20, ERC20Votes { constructor(address owner) ERC20("Taiko Token", "TKO") ERC20Permit("Taiko Token") { @@ -48,6 +48,7 @@ contract TestTokenUnlock is TaikoTest { }) ); + addressManager.setAddress(uint64(block.chainid), "bond_token", address(tko)); addressManager.setAddress(uint64(block.chainid), "taiko_token", address(tko)); addressManager.setAddress(uint64(block.chainid), "assignment_hook", assignmentHook); addressManager.setAddress(uint64(block.chainid), "taiko", taikoL1); diff --git a/packages/protocol/test/mocks/MockPlonkVerifier.sol b/packages/protocol/test/layer1/verifiers/MockPlonkVerifier.sol similarity index 84% rename from packages/protocol/test/mocks/MockPlonkVerifier.sol rename to packages/protocol/test/layer1/verifiers/MockPlonkVerifier.sol index 4065fbdb22f..9ff78e24627 100644 --- a/packages/protocol/test/mocks/MockPlonkVerifier.sol +++ b/packages/protocol/test/layer1/verifiers/MockPlonkVerifier.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../../contracts/thirdparty/optimism/Bytes.sol"; +import "@optimism/packages/contracts-bedrock/src/libraries/Bytes.sol"; /// @author Kirk Baird contract MockPlonkVerifier { diff --git a/packages/protocol/test/verifiers/RiscZeroVerifier.t.sol b/packages/protocol/test/layer1/verifiers/Risc0Verifier.t.sol similarity index 81% rename from packages/protocol/test/verifiers/RiscZeroVerifier.t.sol rename to packages/protocol/test/layer1/verifiers/Risc0Verifier.t.sol index 75eb16dd2d0..fcb63f057e7 100644 --- a/packages/protocol/test/verifiers/RiscZeroVerifier.t.sol +++ b/packages/protocol/test/layer1/verifiers/Risc0Verifier.t.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../L1/TaikoL1TestBase.sol"; +import "../based/TaikoL1TestBase.sol"; -contract MockRiscZeroRemoteVerifier is IRiscZeroReceiptVerifier { +contract MockRisc0RemoteVerifier is IRiscZeroVerifier { // To simulate failing and succeeding bool public verifying; @@ -14,19 +14,21 @@ contract MockRiscZeroRemoteVerifier is IRiscZeroReceiptVerifier { function verify( bytes calldata, /*seal*/ bytes32, /*imageId*/ - bytes32, /*postStateDigest*/ bytes32 /*journalDigest*/ ) external view - returns (bool) { - return verifying; + require(verifying, "RiscZeroRemoteVerifier: invalid proof"); + } + + function verifyIntegrity(Receipt calldata /*receipt*/ ) external view { + require(verifying, "RiscZeroRemoteVerifier: invalid integrity"); } } contract TestRiscZeroVerifier is TaikoL1TestBase { - MockRiscZeroRemoteVerifier riscZeroRemoteVerifier; + MockRisc0RemoteVerifier riscZeroRemoteVerifier; function deployTaikoL1() internal override returns (TaikoL1) { return @@ -37,18 +39,17 @@ contract TestRiscZeroVerifier is TaikoL1TestBase { // Call the TaikoL1TestBase setUp() super.setUp(); - riscZeroRemoteVerifier = new MockRiscZeroRemoteVerifier(); + riscZeroRemoteVerifier = new MockRisc0RemoteVerifier(); riscZeroRemoteVerifier.setVerifier(true); + registerAddress("risc0_groth16_verifier", address(riscZeroRemoteVerifier)); + // Deploy Taiko's RiscZero proof verifier - rv = RiscZeroVerifier( + rv = Risc0Verifier( deployProxy({ - name: "tier_risc_zero", - impl: address(new RiscZeroVerifier()), - data: abi.encodeCall( - RiscZeroVerifier.init, - (address(0), address(addressManager), address(riscZeroRemoteVerifier)) - ) + name: "tier_zkvm_risc0", + impl: address(new Risc0Verifier()), + data: abi.encodeCall(Risc0Verifier.init, (address(0), address(addressManager))) }) ); @@ -104,7 +105,7 @@ contract TestRiscZeroVerifier is TaikoL1TestBase { (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = _getDummyContextAndTransition(); - vm.expectRevert(RiscZeroVerifier.RISC_ZERO_INVALID_IMAGE_ID.selector); + vm.expectRevert(Risc0Verifier.RISC_ZERO_INVALID_BLOCK_PROOF_IMAGE_ID.selector); rv.verifyProof(ctx, transition, proof); vm.stopPrank(); @@ -120,18 +121,17 @@ contract TestRiscZeroVerifier is TaikoL1TestBase { bytes memory seal = hex"00"; bytes32 imageId = bytes32("11"); - bytes32 postStateDigest = bytes32("22"); // TierProof TaikoData.TierProof memory proof = - TaikoData.TierProof({ tier: 100, data: abi.encode(seal, imageId, postStateDigest) }); + TaikoData.TierProof({ tier: 100, data: abi.encode(seal, imageId) }); vm.warp(block.timestamp + 5); (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = _getDummyContextAndTransition(); - vm.expectRevert(RiscZeroVerifier.RISC_ZERO_INVALID_PROOF.selector); + vm.expectRevert(Risc0Verifier.RISC_ZERO_INVALID_PROOF.selector); rv.verifyProof(ctx, transition, proof); vm.stopPrank(); diff --git a/packages/protocol/test/layer1/verifiers/RiscZeroGroth16Verifier.t.sol b/packages/protocol/test/layer1/verifiers/RiscZeroGroth16Verifier.t.sol new file mode 100644 index 00000000000..fabebf4101a --- /dev/null +++ b/packages/protocol/test/layer1/verifiers/RiscZeroGroth16Verifier.t.sol @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@risc0/contracts/groth16/RiscZeroGroth16Verifier.sol"; +import "@risc0/contracts/groth16/ControlID.sol"; +import "../based/TaikoL1TestBase.sol"; + +contract RiscZeroGroth16VerifierTest is TaikoL1TestBase { + function deployTaikoL1() internal override returns (TaikoL1) { + return + TaikoL1(payable(deployProxy({ name: "taiko", impl: address(new TaikoL1()), data: "" }))); + } + + function setUp() public override { + vm.startPrank(Emma); + // Call the TaikoL1TestBase setUp() + super.setUp(); + + RiscZeroGroth16Verifier verifier = + new RiscZeroGroth16Verifier(ControlID.CONTROL_ROOT, ControlID.BN254_CONTROL_ID); + console2.log("Deployed RiscZeroGroth16Verifier to", address(verifier)); + registerAddress("risc0_groth16_verifier", address(verifier)); + + // Deploy Taiko's RiscZero proof verifier + rv = Risc0Verifier( + deployProxy({ + name: "tier_zkvm_risc0", + impl: address(new Risc0Verifier()), + data: abi.encodeCall(Risc0Verifier.init, (address(0), address(addressManager))) + }) + ); + + rv.setImageIdTrusted( + bytes32(0x7669d1059d0dfa9537c2b3581569b8bc244495e6c406d07dea628bc8cf480392), true + ); + } + + // Test `verifyProof()` happy path + function test_risc0_groth16_verifyProof() external { + vm.stopPrank(); + + // Caller not necessary has to be TaikoL1 contract because there is no keys (as in SGX keys) + // to be front run. + vm.startPrank(Emma); + + bytes memory seal = + hex"50bd1769220929ac1ac3f9d3a8a4e7f4bcec136f8ea44be5a7248785d83b13879b409b762480f0ca5f38b164091e2def50b35829e453d1418492c01cc1b924e851580fe208d3808a925ce28724f0a862b944074f5277c4bd4b3153c1a1ff87056740628008fcc8d7edef53215db823e4773334e6f5fe08fed84c7ebd005fe4f42b80891724044cadde535253739049d99abc1a91a4a987ad93b0fcedbdb2440c9c2d662101509acb5f869bdb2e15d2609aa1a6c6c1a5a83e04fb2f77d25163b5675351be2204a497f20d43277d211adcc66b730b5d8d7635bb4a456cbf9029904ef2493a0346cd8e1aa2c270a160bc28bca77336bf18fe91b9dc8790a15f1618188dafa9"; + bytes32 imageId = + bytes32(0x7669d1059d0dfa9537c2b3581569b8bc244495e6c406d07dea628bc8cf480392); + bytes32 journalDigest = + bytes32(0xa82287ae36a69b51f8013851b3814ff1243da5dfa071f6fd9b46b85445895553); + + // TierProof + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 100, data: abi.encode(seal, imageId) }); + + vm.warp(block.timestamp + 5); + + (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = + _generateTaikoMainnetContextAndTransition(); + + uint64 chainId = L1.getConfig().chainId; + bytes32 pi = LibPublicInput.hashPublicInputs( + transition, address(rv), address(0), ctx.prover, ctx.metaHash, chainId + ); + bytes memory header = hex"20000000"; // [32, 0, 0, 0] -- big-endian uint32(32) for hash + // bytes len + assert(sha256(bytes.concat(header, pi)) == journalDigest); + + // `verifyProof()` + rv.verifyProof(ctx, transition, proof); + + vm.stopPrank(); + } + + function _generateTaikoMainnetContextAndTransition() + internal + pure + returns (IVerifier.Context memory ctx, TaikoData.Transition memory transition) + { + // Context + ctx = IVerifier.Context({ + metaHash: bytes32(0xd7efb262f6f25cc817452a622009a22e5868e53e1f934d899d3ec68d8c4f2c5b), + blobHash: bytes32(0x015cc9688f24b8d2195e46829b3f726ce006884d5fd2760b7cf414bab9a1b231), + prover: address(0x70997970C51812dc3A010C7d01b50e0d17dc79C8), + msgSender: address(0), + blockId: 223_248, //from mainnet + isContesting: false, + blobUsed: true + }); + + // Transition + transition = TaikoData.Transition({ + parentHash: 0x317de24b32f09629524133334ad552a14e3de603d71a9cf9e88d722809f101b3, + blockHash: 0x9966d3cf051d3d1e44e2a740169627506a619257c95374e812ca572de91ed885, + stateRoot: 0x3ae3de1afa16b93a5c7ea20a0b36b43357061f5b8ef857053d68b2735c3df860, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }); + } + + function test_risc0_verifyBatchProof() public { + vm.startPrank(Emma); + + bytes32 aggProofImageId = 0x8e192ebe6872b47645367692838b2d697c467f5e4543d605b0ef7d10365fb11a; + bytes32 blkProofImageId = 0x7669d1059d0dfa9537c2b3581569b8bc244495e6c406d07dea628bc8cf480392; + + // proof generation elf + rv.setImageIdTrusted(aggProofImageId, true); + // proof aggregation elf + rv.setImageIdTrusted(blkProofImageId, true); + + vm.startPrank(address(L1)); + + // Context + IVerifier.ContextV2[] memory ctxs = new IVerifier.ContextV2[](2); + ctxs[0] = IVerifier.ContextV2({ + metaHash: 0x207b2833fb6d804612da24d8785b870a19c7a3f25fa4aaeb9799cd442d65b031, + blobHash: 0x01354e8725e60ad91b32ec4ab19158572a0a5b06b2d4d83f6269c9a7d068f49b, + prover: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + msgSender: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + blockId: 393_333, + isContesting: false, + blobUsed: true, + tran: TaikoData.Transition({ + parentHash: 0xce519622a374dc014c005d7857de26d952751a9067d3e23ffe14da247aa8a399, + blockHash: 0x941d557653da2214cbf3d30af8d9cadbc7b5f77b6c3e48bca548eba04eb9cd79, + stateRoot: 0x4203a2fd98d268d272acb24d91e25055a779b443ff3e732f2cee7abcf639b5e9, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }) + }); + ctxs[1] = IVerifier.ContextV2({ + metaHash: 0x946ba1a9c02fc2f01da49e31cb5be83c118193d0389987c6be616ce76426b44d, + blobHash: 0x01abac8c1fb54f87ff7b0cbf14259b9d5ee7a8de458c587dd6eda43ef8354b4f, + prover: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + msgSender: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + blockId: 393_334, + isContesting: false, + blobUsed: true, + tran: TaikoData.Transition({ + parentHash: 0x941d557653da2214cbf3d30af8d9cadbc7b5f77b6c3e48bca548eba04eb9cd79, + blockHash: 0xc0dad38646ab264be30995b7b7fd02db65e7115126fb52bfad94c0fc9572287c, + stateRoot: 0x222061caab95b6bd0f8dd398088030979efbe56e282cd566f7abd77838558eb9, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }) + }); + + bytes memory seal = + hex"50bd176901a68e3f05b0e651b6e5ff18e5463be794699597908b42b9ac3195a464c2b67320fb89c8199909a5ef1ff32366d1047009f4758294090f4ce613129f64a9ff58109cf0f6cb0f22e194dab522a2938631b138f4afeb075117a05d1ad75093515e15de11d9b231b79be5d42b0c7921ba22d62a6594258745f3e5c2e10508741fd813581ea8fab28ee1d07cb1f2e84500e2993cff3ca2e37284cfb5cfec5fe301d92f4246b2dbffc17d2ef5d889f50b8f28c51d1bacd6b0c55399e574969bb0a77207ceda541460cfec3e0c315889d62c0c91c5cf0cecd515ada96712735e5cf0ea1664af11012004ba7cb6adea3751911c8afe5eb5979b1adf43da6f9c18837f3d"; + // TierProof + TaikoData.TierProof memory proof = TaikoData.TierProof({ + tier: 100, + data: abi.encode(seal, blkProofImageId, aggProofImageId) + }); + + // `verifyProof()` + rv.verifyBatchProof(ctxs, proof); + + vm.stopPrank(); + } +} diff --git a/packages/protocol/test/layer1/verifiers/SP1PlonkVerifier.t.sol b/packages/protocol/test/layer1/verifiers/SP1PlonkVerifier.t.sol new file mode 100644 index 00000000000..9291354fb43 --- /dev/null +++ b/packages/protocol/test/layer1/verifiers/SP1PlonkVerifier.t.sol @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import { SP1Verifier as SuccinctVerifier } from "@sp1-contracts/src/v3.0.0/SP1VerifierPlonk.sol"; +import "../based/TaikoL1TestBase.sol"; + +contract SuccinctVerifierTest is TaikoL1TestBase { + function deployTaikoL1() internal override returns (TaikoL1) { + return + TaikoL1(payable(deployProxy({ name: "taiko", impl: address(new TaikoL1()), data: "" }))); + } + + function setUp() public override { + vm.startPrank(Emma); + // Call the TaikoL1TestBase setUp() + super.setUp(); + + SuccinctVerifier verifier = new SuccinctVerifier(); + console2.log("Deployed SuccinctVerifier to", address(verifier)); + registerAddress("sp1_remote_verifier", address(verifier)); + + // Deploy Taiko's SP1 proof verifier + sp1 = SP1Verifier( + deployProxy({ + name: "tier_zkvm_sp1", + impl: address(new SP1Verifier()), + data: abi.encodeCall(SP1Verifier.init, (address(0), address(addressManager))) + }) + ); + + sp1.setProgramTrusted( + bytes32(0x004e167a367ef584f118c2fac6ffdda82e5349913a165703fb1895f0da412bff), true + ); + } + + // Test `verifyProof()` happy path + function test_sp1_Plonk_verifyProof() external { + vm.stopPrank(); + + // Caller not necessary has to be TaikoL1 contract because there is no keys (as in SGX keys) + // to be front run. + vm.startPrank(Emma); + + bytes memory sp1Proof = + hex"54bdcae329f3f04a73d0e51b60e37a3dc2eb812b6c818895fbda375c24ce943d40a1a3541655911e01acabfb1ed0a04027e641f5e492e883d2ca77a03266b485a61563fe1c751fa9821101c5e755f8963df8493e967224867963a4b459457ca1ae23b7c62e7b320dcb495d119ca771ce2030f6aeeb44c328bc03f8a892c69da84aa43ca1201baeb122781539d987fc6fd706123398a8d50f837817873890c18269c3d3dd0e782114074808a1ff3548b49f0b499424c689e4bf5d74cb876237240d6473dc1ab63fc429bee770b10527113efff5ee6f2705031d6c7370d0a60154f19e8dd20ba14bd5fd5683ac1094f7981b122d908442fa6cd1ca460ffbf49e7e162fbc0d25280c78297ab4f7026a04448422da8e376ebb2b359d6c7be1ec1a660d07dfa82ac8c2d89f04fa02cb3a86a2066188f92895f2f42dc2f6f7e5713067a14a925a02fdffdcb99f7ad1df29281d3120d1196595b53b22a386a3eae6043435445f140976aafc537cbad06c46ca5ad2b16a7da0c4bd45ac880aef87078e7347cb464f0db47c51e064400751c2f032fd0fb92d8e4cf42c5bdda442d7a3c28e3dce3bdd10d8e014089f3a9ddc8c56dd154fe487beaf0ac01e73da68271378808786e69b1b709cfdd5666f53d46c569c965ea013a17e733efa740beddb8e56183138db1723e68dc91a3c893c7d05439388d387ed0fbeb19c7e996083b39858b07762a87c21ae07df5ea0fe21cb4974dc52d4e21553864af5e7d7042bfd0703aed1cf80171006aec8456ef123dc1ae4ec805c9d301f0dfe4788a0c5c599ff7a3ed17390bb1f260665e92e3647d7b89fab2681bc7237943c4b45243f68705d53c2ce8e4c5303b8ae78d556d0c4a1efaa48aedbb7feef62a27332a462fbd4e7dff75f3df8d92ea73b5afcc5a42c1a564bcdd99f2dcfe8e0c9873fa0470753900a20f7e01bcd1b3e6c62b2f8cdbd7de3068b7f5dcbfd6c0e9a511baccef6c7adfc41dee3f2dd2bb2409707d3d21594e3f425f6f6873b5245ec7dd2473b9b14b7f80576e776f3068e65e12da6663c8fff51ab2cdf1960225945dea081c5a38231f62439ad08032e4131a32f5b70566b1b86b7fb0138d4e2497621d71b31580ec36043f2c57330190c8b7d5a408a9ca109ae6dc5b90c6f86b4c15d54d2da991591369cb03c3d9c0c5030e89f7de4a5b6e7975fad4d321b1e01863dc0dbe8d49517006c7587a38b"; + bytes32 vKey = bytes32(0x004e167a367ef584f118c2fac6ffdda82e5349913a165703fb1895f0da412bff); + console2.logBytes(abi.encodePacked(vKey, sp1Proof)); + // TierProof + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 100, data: abi.encodePacked(vKey, sp1Proof) }); + + vm.warp(block.timestamp + 5); + + (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = + _generateTaikoMainnetContextAndTransition(); + + uint64 chainId = L1.getConfig().chainId; + bytes32 pi = LibPublicInput.hashPublicInputs( + transition, address(sp1), address(0), ctx.prover, ctx.metaHash, chainId + ); + console2.log("chainId: ", chainId); + console2.log("Verifier: ", address(sp1)); + console2.log("Prover: ", ctx.prover); + console2.log("MetaHash: "); + console2.logBytes32(ctx.metaHash); + console2.log("Public input"); + console2.logBytes32(pi); + + // `verifyProof()` + sp1.verifyProof(ctx, transition, proof); + + vm.stopPrank(); + } + + function _generateTaikoMainnetContextAndTransition() + internal + pure + returns (IVerifier.Context memory ctx, TaikoData.Transition memory transition) + { + // Context + ctx = IVerifier.Context({ + metaHash: bytes32(0xd7efb262f6f25cc817452a622009a22e5868e53e1f934d899d3ec68d8c4f2c5b), + blobHash: bytes32(0x015cc9688f24b8d2195e46829b3f726ce006884d5fd2760b7cf414bab9a1b231), + prover: address(0x70997970C51812dc3A010C7d01b50e0d17dc79C8), + msgSender: address(0), + blockId: 223_248, //from mainnet + isContesting: false, + blobUsed: true + }); + + // Transition + transition = TaikoData.Transition({ + parentHash: 0x317de24b32f09629524133334ad552a14e3de603d71a9cf9e88d722809f101b3, + blockHash: 0x9966d3cf051d3d1e44e2a740169627506a619257c95374e812ca572de91ed885, + stateRoot: 0x3ae3de1afa16b93a5c7ea20a0b36b43357061f5b8ef857053d68b2735c3df860, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }); + } + + // Test `verifyBatchProof()` happy path + function test_sp1_Plonk_verifyBatchProof() public { + vm.startPrank(Emma); + + // proof generation elf vk digest which is not a bn254 hash + // but a sha256 hash from the same Sp1Verifykey. + sp1.setProgramTrusted( + bytes32(0x270b3d1b1fbd613c23185f586ffdda82729a4c8968595c0f76312be15a412bff), true + ); + // proof aggregation elf + sp1.setProgramTrusted( + bytes32(0x00d5ff4ed163b73e75aa1f60c399b3c778df24abe584fc6eee1ce5c444b74bcd), true + ); + + vm.startPrank(address(L1)); + + // Context + IVerifier.ContextV2[] memory ctxs = new IVerifier.ContextV2[](2); + ctxs[0] = IVerifier.ContextV2({ + metaHash: 0x207b2833fb6d804612da24d8785b870a19c7a3f25fa4aaeb9799cd442d65b031, + blobHash: 0x01354e8725e60ad91b32ec4ab19158572a0a5b06b2d4d83f6269c9a7d068f49b, + prover: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + msgSender: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + blockId: 393_333, + isContesting: false, + blobUsed: true, + tran: TaikoData.Transition({ + parentHash: 0xce519622a374dc014c005d7857de26d952751a9067d3e23ffe14da247aa8a399, + blockHash: 0x941d557653da2214cbf3d30af8d9cadbc7b5f77b6c3e48bca548eba04eb9cd79, + stateRoot: 0x4203a2fd98d268d272acb24d91e25055a779b443ff3e732f2cee7abcf639b5e9, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }) + }); + ctxs[1] = IVerifier.ContextV2({ + metaHash: 0x946ba1a9c02fc2f01da49e31cb5be83c118193d0389987c6be616ce76426b44d, + blobHash: 0x01abac8c1fb54f87ff7b0cbf14259b9d5ee7a8de458c587dd6eda43ef8354b4f, + prover: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + msgSender: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + blockId: 393_334, + isContesting: false, + blobUsed: true, + tran: TaikoData.Transition({ + parentHash: 0x941d557653da2214cbf3d30af8d9cadbc7b5f77b6c3e48bca548eba04eb9cd79, + blockHash: 0xc0dad38646ab264be30995b7b7fd02db65e7115126fb52bfad94c0fc9572287c, + stateRoot: 0x222061caab95b6bd0f8dd398088030979efbe56e282cd566f7abd77838558eb9, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }) + }); + + // TierProof + bytes memory data = + hex"00d5ff4ed163b73e75aa1f60c399b3c778df24abe584fc6eee1ce5c444b74bcd270b3d1b1fbd613c23185f586ffdda82729a4c8968595c0f76312be15a412bff54bdcae3236b956a67d15b4682d972d50fbb3632ac950bd712dad2d4cc9c302856c11e6c2ed6722fc3e4904ed204eb05a9f32bae3f8e7d4fbdd854c3d269a33e601c39c90d02026cdcdd55268090e316df3ffc0eee6de2765eb0d767f1455cd35af89da20ade1e61dc074884d5317f0206abb720acf8c023d2740b41fe37f2cb00fe561725269f4321543b30d528ee3e8884ea493fc6b1629e9a7537e65353fb0afd7e8021d502cb556e7a2b600e859f3fc524ad681df470d8d0ccc463775434ca56de661b34a3b620726aed8affc8a90d7b798a92d6500dacd9fb7d43a37c301d70e59d2d192fa85b2f6689bd9a6d47df9ea45163a228c8291e8d6d0ed5d7d7be8bd6391d6496989df139eaff5fca0f9d47eccad8ff6fb7aa0b8bb3da8e73fa4ff825d208b0ce5a639f30501f200c12f8fa1bf5c4ac42c4a58ceb34bbb3b012121f6ff31ed772d57c421a75813f987888e7e3b984bff8465bbfbdd30d45fae9904816a21c99ca4a903ed19af479d4ce0a1b4e78e2a9b3bdb8dde8986e8f028da0dd37e3129a184b4d36427d130075802421e5c693297f4705a030454b105b91f3ce8be111967dd8016ec9aed42e42ed3ab53e1dc42a0b796557e05b658203ae972378db1a109898a02ac97adfe3d5b24e1ab0d49f7702b69d137e23264e5b2c5b6e72fc2b2a4562b793a2c00ead94de8890700aa3c2fe5baf59ab8b7f524d38ba3b71712151edd00307dc3c9f24ea9d1bbac6687c8f30dbe845663f7aaddaec9df8d1fd15ced22fa58272184fe02aad68fd5a90ee249fced2ef955c0af40e02be0621e7162413e629b4428cb929d0a2bd87375dcec17664fec3a5a6cd2f7039723d41f10b77f5f3b7b052db1043c302795d3d739eecd2d2f686c2c474dcc67d9e844ca50bdabc7ac085aeb02aff0b3cbf17aaa0114ba85eff4a938d87db17680a5995a90347b2a5eccaeeb1be204a6dd83da39fe9485822667a43d4a5451f494063075007f152eeb46e0bad0675cf6219b53b36b1ca474f13f6dae87d1efad3c71f89cd05a04a6c76f6703858650a5fd6e2b45be3bf299386595d8eca6c8c55d537e8b3263828c7be68c92bdae0be0ed101f89c0c4c16154867228dc47ff0a4fccb4bb72b7cf8aa2c4a9bd4fd01254e51a7fbf680f408b5ae9c189466625b0f41636d94060e805eb6da30eab1202b65d8226918c4b99a73a6874089dbc5eac08cfab3d7"; + TaikoData.TierProof memory proof = TaikoData.TierProof({ tier: 0, data: data }); + + // `verifyProof()` + sp1.verifyBatchProof(ctxs, proof); + + vm.stopPrank(); + } +} diff --git a/packages/protocol/test/layer1/verifiers/SP1Verifier.t.sol b/packages/protocol/test/layer1/verifiers/SP1Verifier.t.sol new file mode 100644 index 00000000000..329031fdd83 --- /dev/null +++ b/packages/protocol/test/layer1/verifiers/SP1Verifier.t.sol @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../based/TaikoL1TestBase.sol"; + +contract MockSP1Gateway is ISP1Verifier { + // To simulate failing and succeeding + bool public verifying; + + error SP1_INVALID_PROOF(); + + function setVerifying(bool _verifying) public { + verifying = _verifying; + } + + function verifyProof( + bytes32, /*programVKey*/ + bytes calldata, /*publicValues*/ + bytes calldata /*proofBytes*/ + ) + external + view + { + require(verifying, "SP1Verifier: invalid proof"); + } +} + +contract TestSP1Verifier is TaikoL1TestBase { + MockSP1Gateway sp1Gateway; + + function deployTaikoL1() internal override returns (TaikoL1) { + return + TaikoL1(payable(deployProxy({ name: "taiko", impl: address(new TaikoL1()), data: "" }))); + } + + function setUp() public override { + // Call the TaikoL1TestBase setUp() + super.setUp(); + + sp1Gateway = new MockSP1Gateway(); + sp1Gateway.setVerifying(true); + + // Deploy Taiko's SP1 proof verifier ('remitter') + sp1 = SP1Verifier( + deployProxy({ + name: "tier_zkvm_sp1", + impl: address(new SP1Verifier()), + data: abi.encodeCall(SP1Verifier.init, (address(0), address(addressManager))) + }) + ); + + sp1.setProgramTrusted(bytes32("105"), true); + + registerAddress("sp1_verifier", address(sp1)); + registerAddress("sp1_remote_verifier", address(sp1Gateway)); + } + + // Test `verifyProof()` happy path + function test_verifyProof() external { + vm.stopPrank(); + + // Caller not necessary has to be TaikoL1 contract because there is no keys (as in SGX keys) + // to be front run. + vm.startPrank(Alice); + + bytes32 programVKey = bytes32("105"); + bytes memory sp1Proof = hex"00"; + + // TierProof + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 100, data: abi.encode(programVKey, sp1Proof) }); + + vm.warp(block.timestamp + 5); + + (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = + _getDummyContextAndTransition(); + + // `verifyProof()` + sp1.verifyProof(ctx, transition, proof); + + vm.stopPrank(); + } + + function test_verifyProof_invalidProgramVKeyd() external { + vm.stopPrank(); + + // Caller not necessary has to be TaikoL1 contract because there is no keys (as in SGX keys) + // to be front run. + vm.startPrank(Alice); + + bytes32 programVKey = bytes32("101"); + bytes memory sp1Proof = hex"00"; + + // TierProof + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 100, data: abi.encode(programVKey, sp1Proof) }); + + vm.warp(block.timestamp + 5); + + (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = + _getDummyContextAndTransition(); + + // `verifyProof()` + vm.expectRevert(SP1Verifier.SP1_INVALID_PROGRAM_VKEY.selector); + sp1.verifyProof(ctx, transition, proof); + + vm.stopPrank(); + } + + function test_verifyProof_invalidProof() external { + sp1Gateway.setVerifying(false); + vm.stopPrank(); + + // Caller not necessary has to be TaikoL1 contract because there is no keys (as in SGX keys) + // to be front run. + vm.startPrank(Alice); + + bytes32 programVKey = bytes32("105"); + bytes memory sp1Proof = hex"00"; + + // TierProof + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 100, data: abi.encode(programVKey, sp1Proof) }); + + vm.warp(block.timestamp + 5); + + (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = + _getDummyContextAndTransition(); + + vm.expectRevert(SP1Verifier.SP1_INVALID_PROOF.selector); + sp1.verifyProof(ctx, transition, proof); + + vm.stopPrank(); + } + + function _getDummyContextAndTransition() + internal + pure + returns (IVerifier.Context memory ctx, TaikoData.Transition memory transition) + { + // Context + ctx = IVerifier.Context({ + metaHash: bytes32("ab"), + blobHash: bytes32("cd"), + prover: address(0), + msgSender: address(0), + blockId: 10, + isContesting: false, + blobUsed: false + }); + + // Transition + transition = TaikoData.Transition({ + parentHash: bytes32("12"), + blockHash: bytes32("34"), + stateRoot: bytes32("56"), + graffiti: bytes32("78") + }); + } +} diff --git a/packages/protocol/test/verifiers/SgxVerifier.t.sol b/packages/protocol/test/layer1/verifiers/SgxVerifier.t.sol similarity index 78% rename from packages/protocol/test/verifiers/SgxVerifier.t.sol rename to packages/protocol/test/layer1/verifiers/SgxVerifier.t.sol index 116c9e6c119..2e1b115de9e 100644 --- a/packages/protocol/test/verifiers/SgxVerifier.t.sol +++ b/packages/protocol/test/layer1/verifiers/SgxVerifier.t.sol @@ -1,8 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../L1/TaikoL1TestBase.sol"; +import "src/layer1/verifiers/SgxVerifierBase.sol"; import "../automata-attestation/common/AttestationBase.t.sol"; +import "../based/TaikoL1TestBase.sol"; contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { address internal SGX_Y = @@ -38,9 +39,11 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { instances[1] = Bob; vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded(startInstance, instances[0], address(0), block.timestamp); + emit SgxVerifierBase.InstanceAdded(startInstance, instances[0], address(0), block.timestamp); vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded(startInstance + 1, instances[1], address(0), block.timestamp); + emit SgxVerifierBase.InstanceAdded( + startInstance + 1, instances[1], address(0), block.timestamp + ); // `addInstances()` uint256[] memory ids = sv.addInstances(instances); @@ -66,11 +69,11 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { instances2[1] = David; vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded( + emit SgxVerifierBase.InstanceAdded( startInstance + 2, instances2[0], address(0), block.timestamp ); vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded( + emit SgxVerifierBase.InstanceAdded( startInstance + 3, instances2[1], address(0), block.timestamp ); @@ -103,7 +106,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { instances[1] = address(0); // `addInstances()` - vm.expectRevert(SgxVerifier.SGX_INVALID_INSTANCE.selector); + vm.expectRevert(SgxVerifierBase.SGX_INVALID_INSTANCE.selector); sv.addInstances(instances); vm.stopPrank(); @@ -117,7 +120,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { instances[1] = Alice; // invalid as duplicate instance // `addInstances()` - vm.expectRevert(SgxVerifier.SGX_ALREADY_ATTESTED.selector); + vm.expectRevert(SgxVerifierBase.SGX_ALREADY_ATTESTED.selector); sv.addInstances(instances); } @@ -161,7 +164,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { vm.prank(Bob, Bob); sv.registerInstance(v3quote); - vm.expectRevert(SgxVerifier.SGX_ALREADY_ATTESTED.selector); + vm.expectRevert(SgxVerifierBase.SGX_ALREADY_ATTESTED.selector); vm.prank(Carol, Carol); sv.registerInstance(v3quote); } @@ -218,7 +221,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { vm.warp(block.timestamp + 5); vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded(id, newInstance, KNOWN_ADDRESS, block.timestamp); + emit SgxVerifierBase.InstanceAdded(id, newInstance, KNOWN_ADDRESS, block.timestamp); // `verifyProof()` sv.verifyProof(ctx, transition, proof); @@ -294,7 +297,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { }); // `verifyProof()` - vm.expectRevert(SgxVerifier.SGX_INVALID_PROOF.selector); + vm.expectRevert(SgxVerifierBase.SGX_INVALID_PROOF.selector); sv.verifyProof(ctx, transition, proof); } @@ -375,53 +378,63 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { TaikoData.TierProof memory proof = TaikoData.TierProof({ tier: 0, data: data }); // `verifyProof()` - vm.expectRevert(SgxVerifier.SGX_INVALID_INSTANCE.selector); + vm.expectRevert(SgxVerifierBase.SGX_INVALID_INSTANCE.selector); sv.verifyProof(ctx, transition, proof); vm.stopPrank(); } - // Test `verifyProof()` call is not taiko or higher tier proof - function test_verifyProof_invalidCaller() public { - vm.startPrank(Alice); // invalid caller + // Test `verifyBatchProof()` happy path + function test_verifyBatchProofs() public { + // setup instances + address newInstance = address(0x6Aa1108c1903E3AeF092FF46E4C506fD3ac567c0); + address[] memory instances = new address[](1); + instances[0] = newInstance; + uint256[] memory ids = sv.addInstances(instances); + console.log("Instance ID: ", ids[0]); + + vm.startPrank(address(L1)); // Context - IVerifier.Context memory ctx = IVerifier.Context({ - metaHash: bytes32("ab"), - blobHash: bytes32("cd"), - prover: Alice, - msgSender: Alice, - blockId: 10, + IVerifier.ContextV2[] memory ctxs = new IVerifier.ContextV2[](2); + ctxs[0] = IVerifier.ContextV2({ + metaHash: 0x207b2833fb6d804612da24d8785b870a19c7a3f25fa4aaeb9799cd442d65b031, + blobHash: 0x01354e8725e60ad91b32ec4ab19158572a0a5b06b2d4d83f6269c9a7d068f49b, + prover: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + msgSender: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + blockId: 393_333, isContesting: false, - blobUsed: false + blobUsed: true, + tran: TaikoData.Transition({ + parentHash: 0xce519622a374dc014c005d7857de26d952751a9067d3e23ffe14da247aa8a399, + blockHash: 0x941d557653da2214cbf3d30af8d9cadbc7b5f77b6c3e48bca548eba04eb9cd79, + stateRoot: 0x4203a2fd98d268d272acb24d91e25055a779b443ff3e732f2cee7abcf639b5e9, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }) }); - - // Transition - TaikoData.Transition memory transition = TaikoData.Transition({ - parentHash: bytes32("12"), - blockHash: bytes32("34"), - stateRoot: bytes32("56"), - graffiti: bytes32("78") + ctxs[1] = IVerifier.ContextV2({ + metaHash: 0x946ba1a9c02fc2f01da49e31cb5be83c118193d0389987c6be616ce76426b44d, + blobHash: 0x01abac8c1fb54f87ff7b0cbf14259b9d5ee7a8de458c587dd6eda43ef8354b4f, + prover: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + msgSender: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + blockId: 393_334, + isContesting: false, + blobUsed: true, + tran: TaikoData.Transition({ + parentHash: 0x941d557653da2214cbf3d30af8d9cadbc7b5f77b6c3e48bca548eba04eb9cd79, + blockHash: 0xc0dad38646ab264be30995b7b7fd02db65e7115126fb52bfad94c0fc9572287c, + stateRoot: 0x222061caab95b6bd0f8dd398088030979efbe56e282cd566f7abd77838558eb9, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }) }); // TierProof - uint32 id = 0; - address newInstance = address(0x33); - - uint64 chainId = L1.getConfig().chainId; - bytes32 signedHash = LibPublicInput.hashPublicInputs( - transition, address(sv), newInstance, ctx.prover, ctx.metaHash, chainId - ); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign(KNOWN_ADDRESS_PRIV_KEY, signedHash); - bytes memory signature = abi.encodePacked(r, s, v); - - bytes memory data = abi.encodePacked(id, newInstance, signature); - TaikoData.TierProof memory proof = TaikoData.TierProof({ tier: 100, data: data }); + bytes memory data = + hex"000000016aa1108c1903e3aef092ff46e4c506fd3ac567c06aa1108c1903e3aef092ff46e4c506fd3ac567c0dda91ea274c36678a0680bae65216b40bd935e646b6364ea669a6de9b58e0cd11e1c1b86765f98ac5a3113fdc08296aa663378e8e2e44cf08db7a4ba6e5f00f21b"; + TaikoData.TierProof memory proof = TaikoData.TierProof({ tier: 0, data: data }); // `verifyProof()` - vm.expectRevert(AddressResolver.RESOLVER_DENIED.selector); - sv.verifyProof(ctx, transition, proof); + sv.verifyBatchProof(ctxs, proof); vm.stopPrank(); } diff --git a/packages/protocol/test/layer1/verifiers/compose/ComposeVerifeir.t.sol b/packages/protocol/test/layer1/verifiers/compose/ComposeVerifeir.t.sol new file mode 100644 index 00000000000..6a738475495 --- /dev/null +++ b/packages/protocol/test/layer1/verifiers/compose/ComposeVerifeir.t.sol @@ -0,0 +1,228 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/compose/ComposeVerifier.sol"; +import "test/shared/TaikoTest.sol"; + +contract ComposeVerifierForTest is ComposeVerifier { + uint256 private threshold; + address[] private verifiers; + + function setThreshold(uint256 _threshold) external { + threshold = _threshold; + } + + function getSubVerifiersAndThreshold() + public + view + override + returns (address[] memory, uint256) + { + return (verifiers, threshold); + } + + function addSubVerifier(address _verifier) external { + verifiers.push(_verifier); + } + + function _getAddress(uint64, bytes32 _name) internal view override returns (address) { + if (_name == LibStrings.B_TAIKO) return msg.sender; + else return address(0); + } +} + +contract MockVerifier is IVerifier { + bool private shouldSucceed; + + constructor(bool _shouldSucceed) { + shouldSucceed = _shouldSucceed; + } + + function verifyProof( + Context calldata, + TaikoData.Transition calldata, + TaikoData.TierProof calldata + ) + external + view + override + { + if (!shouldSucceed) { + revert("MockVerifier: Verification failed"); + } + } + + function verifyBatchProof( + ContextV2[] calldata, + TaikoData.TierProof calldata + ) + external + pure + override + { + revert("NOT_IMPLEMENTED"); + } +} + +contract ComposeVerifierTest is TaikoTest { + IVerifier.Context private ctx; + TaikoData.Transition private tran; + + function test_composeVerifeir_invalid_subproof_length() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(true)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](2); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + subProofs[1] = ComposeVerifier.SubProof(verifier1, ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(1); + + vm.expectRevert(ComposeVerifier.CV_INVALID_SUBPROOF_LENGTH.selector); + composeVerifier.verifyProof(ctx, tran, proof); + } + + function test_composeVerifeir_1_outof_3() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(true)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](1); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(1); + composeVerifier.verifyProof(ctx, tran, proof); + } + + function test_composeVerifeir_2_outof_3() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(true)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](2); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + subProofs[1] = ComposeVerifier.SubProof(verifier2, ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(2); + composeVerifier.verifyProof(ctx, tran, proof); + } + + function test_composeVerifeir_3_outof_3() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(true)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](3); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + subProofs[1] = ComposeVerifier.SubProof(verifier2, ""); + subProofs[2] = ComposeVerifier.SubProof(verifier3, ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(3); + composeVerifier.verifyProof(ctx, tran, proof); + } + + function test_composeVerifeir_subproof_failure() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(false)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](3); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + subProofs[1] = ComposeVerifier.SubProof(verifier2, ""); + subProofs[2] = ComposeVerifier.SubProof(verifier3, ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(3); + + // Expect the verification to fail because one sub proof is invalid + vm.expectRevert("MockVerifier: Verification failed"); + composeVerifier.verifyProof(ctx, tran, proof); + } + + function test_composeVerifeir_2_outof_3_duplicate_subproof() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(true)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](2); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + subProofs[1] = ComposeVerifier.SubProof(verifier1, ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(2); + vm.expectRevert(ComposeVerifier.CV_SUB_VERIFIER_NOT_FOUND.selector); + composeVerifier.verifyProof(ctx, tran, proof); + } + + function test_composeVerifeir_subproof_verifier_not_found() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(true)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](3); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + subProofs[1] = ComposeVerifier.SubProof(verifier2, ""); + subProofs[2] = ComposeVerifier.SubProof(address((123)), ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(3); + + // Expect the verification to fail because one sub proof is invalid + vm.expectRevert(ComposeVerifier.CV_SUB_VERIFIER_NOT_FOUND.selector); + composeVerifier.verifyProof(ctx, tran, proof); + } +} diff --git a/packages/protocol/test/L2/DelegateOwner.t.sol b/packages/protocol/test/layer2/DelegateOwner.t.sol similarity index 88% rename from packages/protocol/test/L2/DelegateOwner.t.sol rename to packages/protocol/test/layer2/DelegateOwner.t.sol index 96bf4bc9e37..431219d9508 100644 --- a/packages/protocol/test/L2/DelegateOwner.t.sol +++ b/packages/protocol/test/layer2/DelegateOwner.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../common/TestMulticall3.sol"; -import "../TaikoTest.sol"; +import "../shared/thirdparty/Multicall3.sol"; +import "./TaikoL2Test.sol"; contract Target is EssentialContract { function init(address _owner) external initializer { @@ -10,14 +10,14 @@ contract Target is EssentialContract { } } -contract TestDelegateOwner is TaikoTest { +contract TestDelegateOwner is TaikoL2Test { address public owner; address public remoteOwner; Bridge public bridge; SignalService public signalService; AddressManager public addressManager; DelegateOwner public delegateOwner; - TestMulticall3 public multicall; + Multicall3 public multicall; uint64 remoteChainId = uint64(block.chainid + 1); address remoteBridge = vm.addr(0x2000); @@ -30,7 +30,7 @@ contract TestDelegateOwner is TaikoTest { vm.startPrank(owner); - multicall = new TestMulticall3(); + multicall = new Multicall3(); addressManager = AddressManager( deployProxy({ @@ -45,7 +45,8 @@ contract TestDelegateOwner is TaikoTest { name: "delegate_owner", impl: address(new DelegateOwner()), data: abi.encodeCall( - DelegateOwner.init, (remoteOwner, address(addressManager), remoteChainId) + DelegateOwner.init, + (remoteOwner, address(addressManager), remoteChainId, address(0)) ), registerTo: address(addressManager) }) @@ -94,7 +95,7 @@ contract TestDelegateOwner is TaikoTest { ); vm.expectRevert(DelegateOwner.DO_DRYRUN_SUCCEEDED.selector); - delegateOwner.dryrunMessageInvocation(data); + delegateOwner.dryrunInvocation(data); IBridge.Message memory message; message.from = remoteOwner; @@ -127,7 +128,7 @@ contract TestDelegateOwner is TaikoTest { ); vm.expectRevert(DelegateOwner.DO_DRYRUN_SUCCEEDED.selector); - delegateOwner.dryrunMessageInvocation(data); + delegateOwner.dryrunInvocation(data); IBridge.Message memory message; message.from = remoteOwner; @@ -168,7 +169,7 @@ contract TestDelegateOwner is TaikoTest { }) ); - TestMulticall3.Call3[] memory calls = new TestMulticall3.Call3[](3); + Multicall3.Call3[] memory calls = new Multicall3.Call3[](4); calls[0].target = address(target1); calls[0].allowFailure = false; calls[0].callData = abi.encodeCall(EssentialContract.pause, ()); @@ -181,17 +182,21 @@ contract TestDelegateOwner is TaikoTest { calls[2].allowFailure = false; calls[2].callData = abi.encodeCall(UUPSUpgradeable.upgradeTo, (delegateOwnerImpl2)); + calls[3].target = address(delegateOwner); + calls[3].allowFailure = false; + calls[3].callData = abi.encodeCall(DelegateOwner.setAdmin, (David)); + bytes memory data = abi.encode( DelegateOwner.Call( uint64(0), address(multicall), true, // DELEGATECALL - abi.encodeCall(TestMulticall3.aggregate3, (calls)) + abi.encodeCall(Multicall3.aggregate3, (calls)) ) ); vm.expectRevert(DelegateOwner.DO_DRYRUN_SUCCEEDED.selector); - delegateOwner.dryrunMessageInvocation(data); + delegateOwner.dryrunInvocation(data); IBridge.Message memory message; message.from = remoteOwner; @@ -211,5 +216,6 @@ contract TestDelegateOwner is TaikoTest { assertTrue(target1.paused()); assertEq(target2.impl(), impl2); assertEq(delegateOwner.impl(), delegateOwnerImpl2); + assertEq(delegateOwner.admin(), David); } } diff --git a/packages/protocol/test/layer2/LibEIP1559.t.sol b/packages/protocol/test/layer2/LibEIP1559.t.sol new file mode 100644 index 00000000000..31368b2e494 --- /dev/null +++ b/packages/protocol/test/layer2/LibEIP1559.t.sol @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoL2Test.sol"; + +contract TestLibEIP1559 is TaikoL2Test { + using LibMath for uint256; + + function test_ethQty() external { + assertEq(LibEIP1559.ethQty(60_000_000 * 8, 0), 1); + assertEq(LibEIP1559.ethQty(60_000_000 * 8, 60_000_000), 1); + assertEq(LibEIP1559.ethQty(60_000_000 * 8, 60_000_000 * 100), 268_337); + assertEq(LibEIP1559.ethQty(60_000_000 * 8, 60_000_000 * 200), 72_004_899_337); + } + + function test_basefee() external pure { + uint256 basefee; + console2.log("excess, basefee"); + // 1_0000_000 is 0.01 gwei + for (uint64 i; basefee <= 10_000_000;) { + // uint 0.01 gwei + uint64 excess = i * 5_000_000; + uint64 target = 5_000_000 * 8; + + basefee = LibEIP1559.basefee(target, excess); + if (basefee != 0) { + console2.log( + string.concat(Strings.toString(excess), ", ", Strings.toString(basefee)) + ); + } + i += 1; + } + } + + function test_mainnet_min_basefee() external pure { + console2.log("Mainnet minimal basefee: ", LibEIP1559.basefee(5_000_000 * 8, 1_340_000_000)); + } + + function test_change_of_quotient_and_gasIssuancePerSecond() public { + uint64 excess = 150 * 2_000_000; + uint64 target = 4 * 2_000_000; + uint256 unit = 10_000_000; // 0.01 gwei + + // uint 0.01 gwei + uint256 baselineBasefee = LibEIP1559.basefee(target, excess) / unit; + console2.log("baseline basefee: ", baselineBasefee); + + uint256 basefee = LibEIP1559.basefee(target * 2, excess) / unit; + console2.log("basefee will decrease if target increases:", basefee); + + basefee = LibEIP1559.basefee(excess, target / 2) / unit; + console2.log("basefee will increase if target decreases:", basefee); + + console2.log("maintain basefee when target increases"); + { + uint64 newTarget = 5 * 2_000_000; + (uint64 newTarget_, uint64 newExcess_) = + LibEIP1559.adjustExcess(target, newTarget, excess); + assertEq(newTarget_, newTarget, "adjustExcess failed"); + basefee = LibEIP1559.basefee(newTarget_, newExcess_) / unit; + console2.log("old gas excess: ", excess); + console2.log("new gas excess: ", newExcess_); + console2.log("basefee: ", basefee); + assertEq(baselineBasefee, basefee); + } + + console2.log("maintain basefee when target decreases"); + { + uint64 newTarget = 3 * 2_000_000; + (uint64 newTarget_, uint64 newExcess_) = + LibEIP1559.adjustExcess(target, newTarget, excess); + assertEq(newTarget_, newTarget, "adjustExcess failed"); + basefee = LibEIP1559.basefee(newTarget_, newExcess_) / unit; + console2.log("old gas excess: ", excess); + console2.log("new gas excess: ", newExcess_); + console2.log("basefee: ", basefee); + assertEq(baselineBasefee, basefee); + } + } + + function test_change_of_quotient_and_gasIssuancePerSecond2() public { + uint64 excess = 1; + uint64 target = 60_000_000 * 8; + uint256 unit = 10_000_000; // 0.01 gwei + + // uint 0.01 gwei + uint256 baselineBasefee = LibEIP1559.basefee(target, excess) / unit; + console2.log("baseline basefee: ", baselineBasefee); + + console2.log("maintain basefee when target changes"); + uint64 newTarget = 5_000_000 * 8; + (uint64 newTarget_, uint64 newExcess_) = LibEIP1559.adjustExcess(target, newTarget, excess); + assertEq(newTarget_, newTarget, "adjustExcess failed"); + uint256 basefee = LibEIP1559.basefee(newTarget_, newExcess_) / unit; + console2.log("old gas excess: ", excess); + console2.log("new gas excess: ", newExcess_); + console2.log("basefee: ", basefee); + assertEq(baselineBasefee, basefee); + } + + /// forge-config: layer2.fuzz.runs = 1000 + /// forge-config: layer2.fuzz.show-logs = true + function test_fuzz_ethQty(uint64 _gasTarget, uint64 _gasExcess) external { + if (_gasTarget == 0) _gasTarget = 1; + uint256 result = LibEIP1559.ethQty(_gasTarget, _gasExcess); + assertTrue(result > 0); + } + + /// forge-config: layer2.fuzz.runs = 2000 + /// forge-config: layer2.fuzz.show-logs = true + function test_fuzz_basefee(uint64 _gasTarget, uint64 _gasExcess) external { + uint256 result = LibEIP1559.basefee(_gasTarget, _gasExcess); + assertTrue(result >= 1); + } + + /// forge-config: layer2.fuzz.runs = 2000 + /// forge-config: layer2.fuzz.show-logs = true + function test_fuzz_adjustExcess( + uint64 _oldGasTarget, + uint64 _newGasTarget, + uint64 _oldGasExcess + ) + external + { + (uint64 newGasTarget_, uint64 newGasExcess_) = + LibEIP1559.adjustExcess(_oldGasTarget, _newGasTarget, _oldGasExcess); + + if (_oldGasTarget == 0 && _newGasTarget == 0) { + assertEq(newGasTarget_, 0); + assertEq(newGasExcess_, _oldGasExcess); + } else { + assertTrue(newGasTarget_ != 0); + } + } + + /// forge-config: layer2.fuzz.runs = 2000 + /// forge-config: layer2.fuzz.show-logs = true + function test_fuzz_calc1559BaseFee( + uint64 _gasTarget, + uint64 _gasExcess, + uint64 _gasIssuance, + uint32 _parentGasUsed, + uint64 _minGasExcess + ) + external + pure + { + if (_gasTarget == 0) _gasTarget = 1; + LibEIP1559.calc1559BaseFee( + _gasTarget, _gasExcess, _gasIssuance, _parentGasUsed, _minGasExcess + ); + } +} diff --git a/packages/protocol/test/L2/LibL2Signer.sol b/packages/protocol/test/layer2/LibL2Signer.sol similarity index 98% rename from packages/protocol/test/L2/LibL2Signer.sol rename to packages/protocol/test/layer2/LibL2Signer.sol index 52f29867589..42cfc4e8734 100644 --- a/packages/protocol/test/L2/LibL2Signer.sol +++ b/packages/protocol/test/layer2/LibL2Signer.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../thirdparty/LibUint512Math.sol"; +import "../shared/thirdparty/LibUint512Math.sol"; /// @title LibL2Signer /// @notice This contract allows for signing operations required on Taiko L2. diff --git a/packages/protocol/test/layer2/TaikoL2.t.sol b/packages/protocol/test/layer2/TaikoL2.t.sol new file mode 100644 index 00000000000..f917525f816 --- /dev/null +++ b/packages/protocol/test/layer2/TaikoL2.t.sol @@ -0,0 +1,187 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoL2Test.sol"; + +contract TaikoL2ForTest is TaikoL2 { + function skipFeeCheck() public pure override returns (bool) { + return true; + } +} + +contract TaikoL2Tests is TaikoL2Test { + using SafeCast for uint256; + + uint64 public constant L1_CHAIN_ID = 12_345; + uint32 public constant BLOCK_GAS_LIMIT = 30_000_000; + + address public addressManager; + uint64 public anchorBlockId; + TaikoL2ForTest public L2; + + function setUp() public { + addressManager = deployProxy({ + name: "address_manager", + impl: address(new AddressManager()), + data: abi.encodeCall(AddressManager.init, (address(0))) + }); + + SignalService ss = SignalService( + deployProxy({ + name: "signal_service", + impl: address(new SignalService()), + data: abi.encodeCall(SignalService.init, (address(0), addressManager)), + registerTo: addressManager + }) + ); + + L2 = TaikoL2ForTest( + payable( + deployProxy({ + name: "taiko", + impl: address(new TaikoL2ForTest()), + data: abi.encodeCall(TaikoL2.init, (address(0), addressManager, L1_CHAIN_ID, 0)), + registerTo: addressManager + }) + ) + ); + + ss.authorize(address(L2), true); + vm.roll(block.number + 1); + vm.warp(block.timestamp + 30); + vm.deal(address(L2), 100 ether); + } + + // calling anchor in the same block more than once should fail + function test_L2_AnchorTx_revert_in_same_block() external { + vm.fee(1); + + vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); + _anchorV2(BLOCK_GAS_LIMIT); + + vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); + vm.expectRevert(TaikoL2.L2_PUBLIC_INPUT_HASH_MISMATCH.selector); + _anchorV2(BLOCK_GAS_LIMIT); + } + + // calling anchor in the same block more than once should fail + function test_L2_AnchorTx_revert_from_wrong_signer() external { + vm.fee(1); + vm.expectRevert(TaikoL2.L2_INVALID_SENDER.selector); + _anchorV2(BLOCK_GAS_LIMIT); + } + + function test_L2_AnchorTx_signing(bytes32 digest) external { + (uint8 v, uint256 r, uint256 s) = LibL2Signer.signAnchor(digest, uint8(1)); + address signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); + assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); + + (v, r, s) = LibL2Signer.signAnchor(digest, uint8(2)); + signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); + assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); + + vm.expectRevert(LibL2Signer.L2_INVALID_GOLDEN_TOUCH_K.selector); + LibL2Signer.signAnchor(digest, uint8(0)); + + vm.expectRevert(LibL2Signer.L2_INVALID_GOLDEN_TOUCH_K.selector); + LibL2Signer.signAnchor(digest, uint8(3)); + } + + function test_L2_withdraw() external { + vm.prank(L2.owner(), L2.owner()); + L2.withdraw(address(0), Alice); + assertEq(address(L2).balance, 0 ether); + assertEq(Alice.balance, 100 ether); + + // Random EOA cannot call withdraw + vm.expectRevert(AddressResolver.RESOLVER_DENIED.selector); + vm.prank(Alice, Alice); + L2.withdraw(address(0), Alice); + } + + function test_L2_getBlockHash() external { + assertEq(L2.getBlockHash(uint64(1000)), 0); + } + + /// forge-config: layer2.fuzz.runs = 2000 + /// forge-config: layer2.fuzz.show-logs = true + function test_fuzz_getBasefeeV2( + uint32 _parentGasUsed, + uint32 _gasIssuancePerSecond, + uint64 _minGasExcess, + uint32 _maxGasIssuancePerBlock, + uint8 _adjustmentQuotient, + uint8 _sharingPctg + ) + external + { + LibSharedData.BaseFeeConfig memory baseFeeConfig = LibSharedData.BaseFeeConfig({ + adjustmentQuotient: _adjustmentQuotient, + sharingPctg: uint8(_sharingPctg % 100), + gasIssuancePerSecond: _gasIssuancePerSecond, + minGasExcess: _minGasExcess, + maxGasIssuancePerBlock: _maxGasIssuancePerBlock + }); + + (uint256 basefee_,,) = + L2.getBasefeeV2(_parentGasUsed, uint64(block.timestamp), baseFeeConfig); + assertTrue(basefee_ != 0, "basefee is 0"); + } + + /// forge-config: layer2.fuzz.runs = 2000 + /// forge-config: layer2.fuzz.show-logs = true + function test_fuzz_anchorV2( + uint32 _parentGasUsed, + uint32 _gasIssuancePerSecond, + uint64 _minGasExcess, + uint32 _maxGasIssuancePerBlock, + uint8 _adjustmentQuotient, + uint8 _sharingPctg + ) + external + { + if (_parentGasUsed == 0) _parentGasUsed = 1; + if (_gasIssuancePerSecond == 0) _gasIssuancePerSecond = 1; + if (_gasIssuancePerSecond == type(uint32).max) _gasIssuancePerSecond -= 1; + if (_adjustmentQuotient == 0) _adjustmentQuotient = 1; + + LibSharedData.BaseFeeConfig memory baseFeeConfig = LibSharedData.BaseFeeConfig({ + adjustmentQuotient: _adjustmentQuotient, + sharingPctg: uint8(_sharingPctg % 100), + gasIssuancePerSecond: _gasIssuancePerSecond, + minGasExcess: _minGasExcess, + maxGasIssuancePerBlock: _maxGasIssuancePerBlock + }); + + bytes32 anchorStateRoot = bytes32(uint256(1)); + vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); + L2.anchorV2(++anchorBlockId, anchorStateRoot, _parentGasUsed, baseFeeConfig); + + (uint256 basefee, uint64 newGasTarget,) = + L2.getBasefeeV2(_parentGasUsed, uint64(block.timestamp), baseFeeConfig); + + assertTrue(basefee != 0, "basefee is 0"); + assertEq(newGasTarget, L2.parentGasTarget()); + + // change the gas issuance to change the gas target + baseFeeConfig.gasIssuancePerSecond += 1; + + (basefee, newGasTarget,) = + L2.getBasefeeV2(_parentGasUsed, uint64(block.timestamp), baseFeeConfig); + + assertTrue(basefee != 0, "basefee is 0"); + assertTrue(newGasTarget != L2.parentGasTarget()); + } + + function _anchorV2(uint32 parentGasUsed) private { + bytes32 anchorStateRoot = randBytes32(); + LibSharedData.BaseFeeConfig memory baseFeeConfig = LibSharedData.BaseFeeConfig({ + adjustmentQuotient: 8, + sharingPctg: 75, + gasIssuancePerSecond: 5_000_000, + minGasExcess: 1_340_000_000, + maxGasIssuancePerBlock: 600_000_000 // two minutes + }); + L2.anchorV2(++anchorBlockId, anchorStateRoot, parentGasUsed, baseFeeConfig); + } +} diff --git a/packages/protocol/test/layer2/TaikoL2Test.sol b/packages/protocol/test/layer2/TaikoL2Test.sol new file mode 100644 index 00000000000..a57ad6c00d7 --- /dev/null +++ b/packages/protocol/test/layer2/TaikoL2Test.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer2/DelegateOwner.sol"; +import "src/layer2/based/LibEIP1559.sol"; +import "src/layer2/based/TaikoL2.sol"; +import "test/layer2/LibL2Signer.sol"; +import "test/shared/TaikoTest.sol"; + +abstract contract TaikoL2Test is TaikoTest { } diff --git a/packages/protocol/test/libs/LibFixedPointMath.t.sol b/packages/protocol/test/libs/LibFixedPointMath.t.sol deleted file mode 100644 index 73cf16300ae..00000000000 --- a/packages/protocol/test/libs/LibFixedPointMath.t.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: MIT -// Some of the tests are taken from: -// https://github.com/recmo/experiment-solexp/blob/main/src/test/FixedPointMathLib.t.sol -pragma solidity 0.8.24; - -import "../TaikoTest.sol"; - -contract LibFixedPointMathTest is TaikoTest { - function testExp1() public { - assertEq(LibFixedPointMath.exp(-1e18), 367_879_441_171_442_321); - } - - function testExpSmallest() public pure { - int256 y = LibFixedPointMath.exp(-42_139_678_854_452_767_550); - - console2.log("LibFixedPointMath.exp(-42139678854452767550)=", uint256(y)); - } - - function testExpLargest() public pure { - int256 y = LibFixedPointMath.exp(int256(uint256(LibFixedPointMath.MAX_EXP_INPUT))); - console2.log("LibFixedPointMath.exp(135305999368893231588)=", uint256(y)); - } - - function testExpSome() public pure { - int256 y = LibFixedPointMath.exp(5e18); - console2.log("LibFixedPointMath.exp(5e18)=", uint256(y)); - } - - function testExpGas() public view { - uint256 g0 = gasleft(); - LibFixedPointMath.exp(133e18); - uint256 g1 = gasleft(); - LibFixedPointMath.exp(-23e18); - uint256 g2 = gasleft(); - LibFixedPointMath.exp(5e18); - uint256 g3 = gasleft(); - console2.logUint(g0 - g1); - console2.logUint(g1 - g2); - console2.logUint(g2 - g3); - } - - function testExp3() public pure { - LibFixedPointMath.exp(133e18); - LibFixedPointMath.exp(10e18); - LibFixedPointMath.exp(-23e18); - } -} diff --git a/packages/protocol/test/DeployCapability.sol b/packages/protocol/test/shared/DeployCapability.sol similarity index 97% rename from packages/protocol/test/DeployCapability.sol rename to packages/protocol/test/shared/DeployCapability.sol index 4da2b1ff125..fd2a8681bcd 100644 --- a/packages/protocol/test/DeployCapability.sol +++ b/packages/protocol/test/shared/DeployCapability.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; @@ -8,7 +8,7 @@ import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "forge-std/src/console2.sol"; import "forge-std/src/Script.sol"; -import "../contracts/common/AddressManager.sol"; +import "src/shared/common/AddressManager.sol"; /// @title DeployCapability abstract contract DeployCapability is Script { diff --git a/packages/protocol/test/HelperContracts.sol b/packages/protocol/test/shared/HelperContracts.sol similarity index 90% rename from packages/protocol/test/HelperContracts.sol rename to packages/protocol/test/shared/HelperContracts.sol index 2253a3be915..769b7a5fed0 100644 --- a/packages/protocol/test/HelperContracts.sol +++ b/packages/protocol/test/shared/HelperContracts.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../contracts/bridge/Bridge.sol"; -import "../contracts/signal/SignalService.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/signal/SignalService.sol"; contract BadReceiver { receive() external payable { diff --git a/packages/protocol/test/TaikoTest.sol b/packages/protocol/test/shared/TaikoTest.sol similarity index 66% rename from packages/protocol/test/TaikoTest.sol rename to packages/protocol/test/shared/TaikoTest.sol index 025d9666193..a71bb75ae8f 100644 --- a/packages/protocol/test/TaikoTest.sol +++ b/packages/protocol/test/shared/TaikoTest.sol @@ -1,45 +1,30 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/Test.sol"; import "@openzeppelin/contracts/utils/math/SafeCast.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "../contracts/tokenvault/BridgedERC20.sol"; -import "../contracts/tokenvault/BridgedERC721.sol"; -import "../contracts/tokenvault/BridgedERC1155.sol"; -import "../contracts/tokenvault/ERC20Vault.sol"; -import "../contracts/tokenvault/ERC721Vault.sol"; -import "../contracts/tokenvault/ERC1155Vault.sol"; - -import "../contracts/tko/TaikoToken.sol"; -import "../contracts/L1/TaikoL1.sol"; -import "../contracts/verifiers/SgxVerifier.sol"; -import "../contracts/verifiers/RiscZeroVerifier.sol"; -import "../test/L1/TestTierProvider.sol"; -import "../contracts/L1/hooks/AssignmentHook.sol"; -import "../contracts/L1/provers/GuardianProver.sol"; -import "../contracts/bridge/QuotaManager.sol"; - -import "../contracts/L2/DelegateOwner.sol"; - -import "../contracts/team/airdrop/ERC20Airdrop.sol"; - -import "../test/common/erc20/FreeMintERC20.sol"; -import "../test/L2/TaikoL2EIP1559Configurable.sol"; - +import "src/shared/tokenvault/BridgedERC20V2.sol"; +import "src/shared/tokenvault/BridgedERC721.sol"; +import "src/shared/tokenvault/BridgedERC1155.sol"; +import "src/shared/tokenvault/ERC20Vault.sol"; +import "src/shared/tokenvault/ERC721Vault.sol"; +import "src/shared/tokenvault/ERC1155Vault.sol"; +import "./token/FreeMintERC20.sol"; +import "./token/RegularERC20.sol"; +import "./token/MayFailFreeMintERC20.sol"; import "./DeployCapability.sol"; import "./HelperContracts.sol"; -import "./L2/LibL2Signer.sol"; abstract contract TaikoTest is Test, DeployCapability { uint256 private _seed = 0x12345678; address internal Alice = vm.addr(0x1); address internal Bob = vm.addr(0x2); address internal Carol = vm.addr(0x3); - address internal David = randAddress(); - address internal Emma = randAddress(); + address internal David = vm.addr(0x4); + address internal Emma = vm.addr(0x5); address internal Frank = randAddress(); address internal Grace = randAddress(); address internal Henry = randAddress(); diff --git a/packages/protocol/test/bridge/Bridge.t.sol b/packages/protocol/test/shared/bridge/Bridge.t.sol similarity index 96% rename from packages/protocol/test/bridge/Bridge.t.sol rename to packages/protocol/test/shared/bridge/Bridge.t.sol index 8ebf8c9715d..9406a70ce1c 100644 --- a/packages/protocol/test/bridge/Bridge.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; @@ -40,7 +40,6 @@ contract BridgeTest is TaikoTest { SignalService signalService; SkipProofCheckSignal mockProofSignalService; UntrustedSendMessageRelayer untrustedSenderContract; - DelegateOwner delegateOwner; NonMaliciousContract1 nonmaliciousContract1; MaliciousContract2 maliciousContract2; @@ -86,18 +85,6 @@ contract BridgeTest is TaikoTest { uint64 l1ChainId = uint64(block.chainid); vm.chainId(destChainId); - delegateOwner = DelegateOwner( - payable( - deployProxy({ - name: "delegate_owner", - impl: address(new DelegateOwner()), - data: abi.encodeCall( - DelegateOwner.init, (mockDAO, address(addressManager), l1ChainId) - ) - }) - ) - ); - vm.chainId(l1ChainId); mockProofSignalService = SkipProofCheckSignal( @@ -132,12 +119,6 @@ contract BridgeTest is TaikoTest { register(address(addressManager), "bridge_watchdog", address(uint160(123)), destChainId); - // Otherwise delegateOwner cannot do actions on them, on behalf of the DAO. - destChainBridge.transferOwnership(address(delegateOwner)); - delegateOwner.acceptOwnership(address(destChainBridge)); - mockProofSignalService.transferOwnership(address(delegateOwner)); - delegateOwner.acceptOwnership(address(mockProofSignalService)); - vm.stopPrank(); } diff --git a/packages/protocol/test/bridge/Bridge2.t.sol b/packages/protocol/test/shared/bridge/Bridge2.t.sol similarity index 98% rename from packages/protocol/test/bridge/Bridge2.t.sol rename to packages/protocol/test/shared/bridge/Bridge2.t.sol index 621bf1fa484..95ffe3075b7 100644 --- a/packages/protocol/test/bridge/Bridge2.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge2.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; diff --git a/packages/protocol/test/bridge/Bridge2_failMessage.t.sol b/packages/protocol/test/shared/bridge/Bridge2_failMessage.t.sol similarity index 99% rename from packages/protocol/test/bridge/Bridge2_failMessage.t.sol rename to packages/protocol/test/shared/bridge/Bridge2_failMessage.t.sol index 6ac17268f65..c677c76daa2 100644 --- a/packages/protocol/test/bridge/Bridge2_failMessage.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge2_failMessage.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./Bridge2.t.sol"; diff --git a/packages/protocol/test/bridge/Bridge2_processMessage.t.sol b/packages/protocol/test/shared/bridge/Bridge2_processMessage.t.sol similarity index 99% rename from packages/protocol/test/bridge/Bridge2_processMessage.t.sol rename to packages/protocol/test/shared/bridge/Bridge2_processMessage.t.sol index 76019070a91..5c3ed60b746 100644 --- a/packages/protocol/test/bridge/Bridge2_processMessage.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge2_processMessage.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./Bridge2.t.sol"; diff --git a/packages/protocol/test/bridge/Bridge2_recallMessage.t.sol b/packages/protocol/test/shared/bridge/Bridge2_recallMessage.t.sol similarity index 99% rename from packages/protocol/test/bridge/Bridge2_recallMessage.t.sol rename to packages/protocol/test/shared/bridge/Bridge2_recallMessage.t.sol index f23095f0826..d45331ce74e 100644 --- a/packages/protocol/test/bridge/Bridge2_recallMessage.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge2_recallMessage.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./Bridge2.t.sol"; diff --git a/packages/protocol/test/bridge/Bridge2_retryMessage.t.sol b/packages/protocol/test/shared/bridge/Bridge2_retryMessage.t.sol similarity index 99% rename from packages/protocol/test/bridge/Bridge2_retryMessage.t.sol rename to packages/protocol/test/shared/bridge/Bridge2_retryMessage.t.sol index b450bc05655..ab4c8a65213 100644 --- a/packages/protocol/test/bridge/Bridge2_retryMessage.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge2_retryMessage.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./Bridge2.t.sol"; diff --git a/packages/protocol/test/bridge/Bridge2_sendMessage.t.sol b/packages/protocol/test/shared/bridge/Bridge2_sendMessage.t.sol similarity index 97% rename from packages/protocol/test/bridge/Bridge2_sendMessage.t.sol rename to packages/protocol/test/shared/bridge/Bridge2_sendMessage.t.sol index a0c43980051..b8dded2413d 100644 --- a/packages/protocol/test/bridge/Bridge2_sendMessage.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge2_sendMessage.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./Bridge2.t.sol"; @@ -31,7 +31,7 @@ contract BridgeTest2_sendMessage is BridgeTest2 { vm.expectRevert(Bridge.B_INVALID_CHAINID.selector); bridge.sendMessage(message); - // an bridge has been registered for remoteChainId + // a bridge has been registered for remoteChainId message.destChainId = remoteChainId; bridge.sendMessage(message); // id = 0 diff --git a/packages/protocol/test/bridge/QuotaManager.t.sol b/packages/protocol/test/shared/bridge/QuotaManager.t.sol similarity index 99% rename from packages/protocol/test/bridge/QuotaManager.t.sol rename to packages/protocol/test/shared/bridge/QuotaManager.t.sol index 3c7985e6294..fa44f0cc9e6 100644 --- a/packages/protocol/test/bridge/QuotaManager.t.sol +++ b/packages/protocol/test/shared/bridge/QuotaManager.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; diff --git a/packages/protocol/test/common/AddressManager.t.sol b/packages/protocol/test/shared/common/AddressManager.t.sol similarity index 93% rename from packages/protocol/test/common/AddressManager.t.sol rename to packages/protocol/test/shared/common/AddressManager.t.sol index f4470d43a64..94e64b5c836 100644 --- a/packages/protocol/test/common/AddressManager.t.sol +++ b/packages/protocol/test/shared/common/AddressManager.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../L1/TaikoL1TestBase.sol"; +import "../TaikoTest.sol"; /// @author Kirk Baird -contract TestAddressManager is TaikoL1TestBase { +contract TestAddressManager is TaikoTest { function deployTaikoL1() internal override returns (TaikoL1) { return TaikoL1(payable(deployProxy({ name: "taiko", impl: address(new TaikoL1()), data: "" }))); diff --git a/packages/protocol/test/common/AddressResolver.t.sol b/packages/protocol/test/shared/common/AddressResolver.t.sol similarity index 92% rename from packages/protocol/test/common/AddressResolver.t.sol rename to packages/protocol/test/shared/common/AddressResolver.t.sol index 2cb5a31c6ac..b416c950db2 100644 --- a/packages/protocol/test/common/AddressResolver.t.sol +++ b/packages/protocol/test/shared/common/AddressResolver.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../L1/TaikoL1TestBase.sol"; +import "../TaikoTest.sol"; /// @author Kirk Baird -contract TestAddressResolver is TaikoL1TestBase { +contract TestAddressResolver is TaikoTest { function deployTaikoL1() internal override returns (TaikoL1) { return TaikoL1(payable(deployProxy({ name: "taiko", impl: address(new TaikoL1()), data: "" }))); diff --git a/packages/protocol/test/common/EssentialContract.t.sol b/packages/protocol/test/shared/common/EssentialContract.t.sol similarity index 98% rename from packages/protocol/test/common/EssentialContract.t.sol rename to packages/protocol/test/shared/common/EssentialContract.t.sol index 2012cffebd9..dc9d90eeae3 100644 --- a/packages/protocol/test/common/EssentialContract.t.sol +++ b/packages/protocol/test/shared/common/EssentialContract.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; diff --git a/packages/protocol/test/libs/LibAddress.t.sol b/packages/protocol/test/shared/common/LibAddress.t.sol similarity index 98% rename from packages/protocol/test/libs/LibAddress.t.sol rename to packages/protocol/test/shared/common/LibAddress.t.sol index 890798cce4a..b575c56e171 100644 --- a/packages/protocol/test/libs/LibAddress.t.sol +++ b/packages/protocol/test/shared/common/LibAddress.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; -import "../../contracts/libs/LibAddress.sol"; +import "src/shared/common/LibAddress.sol"; contract CalldataReceiver { // Returns success diff --git a/packages/protocol/test/libs/LibTrieProof.t.sol b/packages/protocol/test/shared/common/LibTrieProof.t.sol similarity index 99% rename from packages/protocol/test/libs/LibTrieProof.t.sol rename to packages/protocol/test/shared/common/LibTrieProof.t.sol index 69f198ee4a0..08f5d59c309 100644 --- a/packages/protocol/test/libs/LibTrieProof.t.sol +++ b/packages/protocol/test/shared/common/LibTrieProof.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; +import "src/shared/common/LibTrieProof.sol"; import "../TaikoTest.sol"; -import "../../contracts/libs/LibTrieProof.sol"; contract TestLibTrieProof is TaikoTest { function test_verifyMerkleProof() public { diff --git a/packages/protocol/test/signal/SignalService.t.sol b/packages/protocol/test/shared/signal/SignalService.t.sol similarity index 99% rename from packages/protocol/test/signal/SignalService.t.sol rename to packages/protocol/test/shared/signal/SignalService.t.sol index c6db7f293fb..289d35fc60e 100644 --- a/packages/protocol/test/signal/SignalService.t.sol +++ b/packages/protocol/test/shared/signal/SignalService.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; import "forge-std/src/console2.sol"; diff --git a/packages/protocol/test/thirdparty/LibUint512Math.sol b/packages/protocol/test/shared/thirdparty/LibUint512Math.sol similarity index 99% rename from packages/protocol/test/thirdparty/LibUint512Math.sol rename to packages/protocol/test/shared/thirdparty/LibUint512Math.sol index a5077d80061..ae732cf8eba 100644 --- a/packages/protocol/test/thirdparty/LibUint512Math.sol +++ b/packages/protocol/test/shared/thirdparty/LibUint512Math.sol @@ -23,7 +23,7 @@ // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title LibUint512Math library LibUint512Math { diff --git a/packages/protocol/test/shared/thirdparty/Multicall3.sol b/packages/protocol/test/shared/thirdparty/Multicall3.sol new file mode 100644 index 00000000000..38b96a3e872 --- /dev/null +++ b/packages/protocol/test/shared/thirdparty/Multicall3.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title Multicall3 +/// @notice Aggregate results from multiple function calls +/// @dev Multicall & Multicall2 backwards-compatible +/// @dev Aggregate methods are marked `payable` to save 24 gas per call +/// @author Michael Elliot +/// @author Joshua Levine +/// @author Nick Johnson +/// @author Andreas Bigger +/// @author Matt Solomon +contract Multicall3 { + struct Call { + address target; + bytes callData; + } + + struct Call3 { + address target; + bool allowFailure; + bytes callData; + } + + struct Call3Value { + address target; + bool allowFailure; + uint256 value; + bytes callData; + } + + struct Result { + bool success; + bytes returnData; + } + + /// @notice Backwards-compatible call aggregation with Multicall + /// @param calls An array of Call structs + /// @return blockNumber The block number where the calls were executed + /// @return returnData An array of bytes containing the responses + function aggregate(Call[] calldata calls) + public + payable + returns (uint256 blockNumber, bytes[] memory returnData) + { + blockNumber = block.number; + uint256 length = calls.length; + returnData = new bytes[](length); + Call calldata call; + for (uint256 i = 0; i < length;) { + bool success; + call = calls[i]; + (success, returnData[i]) = call.target.call(call.callData); + require(success, "Multicall3: call failed"); + unchecked { + ++i; + } + } + } + + /// @notice Backwards-compatible with Multicall2 + /// @notice Aggregate calls without requiring success + /// @param requireSuccess If true, require all calls to succeed + /// @param calls An array of Call structs + /// @return returnData An array of Result structs + function tryAggregate( + bool requireSuccess, + Call[] calldata calls + ) + public + payable + returns (Result[] memory returnData) + { + uint256 length = calls.length; + returnData = new Result[](length); + Call calldata call; + for (uint256 i = 0; i < length;) { + Result memory result = returnData[i]; + call = calls[i]; + (result.success, result.returnData) = call.target.call(call.callData); + if (requireSuccess) require(result.success, "Multicall3: call failed"); + unchecked { + ++i; + } + } + } + + /// @notice Backwards-compatible with Multicall2 + /// @notice Aggregate calls and allow failures using tryAggregate + /// @param calls An array of Call structs + /// @return blockNumber The block number where the calls were executed + /// @return blockHash The hash of the block where the calls were executed + /// @return returnData An array of Result structs + function tryBlockAndAggregate( + bool requireSuccess, + Call[] calldata calls + ) + public + payable + returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData) + { + blockNumber = block.number; + blockHash = blockhash(block.number); + returnData = tryAggregate(requireSuccess, calls); + } + + /// @notice Backwards-compatible with Multicall2 + /// @notice Aggregate calls and allow failures using tryAggregate + /// @param calls An array of Call structs + /// @return blockNumber The block number where the calls were executed + /// @return blockHash The hash of the block where the calls were executed + /// @return returnData An array of Result structs + function blockAndAggregate(Call[] calldata calls) + public + payable + returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData) + { + (blockNumber, blockHash, returnData) = tryBlockAndAggregate(true, calls); + } + + /// @notice Aggregate calls, ensuring each returns success if required + /// @param calls An array of Call3 structs + /// @return returnData An array of Result structs + function aggregate3(Call3[] calldata calls) + public + payable + returns (Result[] memory returnData) + { + uint256 length = calls.length; + returnData = new Result[](length); + Call3 calldata calli; + for (uint256 i = 0; i < length;) { + Result memory result = returnData[i]; + calli = calls[i]; + (result.success, result.returnData) = calli.target.call(calli.callData); + assembly { + // Revert if the call fails and failure is not allowed + // `allowFailure := calldataload(add(calli, 0x20))` and `success := mload(result)` + if iszero(or(calldataload(add(calli, 0x20)), mload(result))) { + // set "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)"))) + mstore(0x00, 0x08c379a000000000000000000000000000000000000000000000000000000000) + // set data offset + mstore(0x04, 0x0000000000000000000000000000000000000000000000000000000000000020) + // set length of revert string + mstore(0x24, 0x0000000000000000000000000000000000000000000000000000000000000017) + // set revert string: bytes32(abi.encodePacked("Multicall3: call failed")) + mstore(0x44, 0x4d756c746963616c6c333a2063616c6c206661696c6564000000000000000000) + revert(0x00, 0x64) + } + } + unchecked { + ++i; + } + } + } + + /// @notice Aggregate calls with a msg value + /// @notice Reverts if msg.value is less than the sum of the call values + /// @param calls An array of Call3Value structs + /// @return returnData An array of Result structs + function aggregate3Value(Call3Value[] calldata calls) + public + payable + returns (Result[] memory returnData) + { + uint256 valAccumulator; + uint256 length = calls.length; + returnData = new Result[](length); + Call3Value calldata calli; + for (uint256 i = 0; i < length;) { + Result memory result = returnData[i]; + calli = calls[i]; + uint256 val = calli.value; + // Humanity will be a Type V Kardashev Civilization before this overflows - andreas + // ~ 10^25 Wei in existence << ~ 10^76 size uint fits in a uint256 + unchecked { + valAccumulator += val; + } + (result.success, result.returnData) = calli.target.call{ value: val }(calli.callData); + assembly { + // Revert if the call fails and failure is not allowed + // `allowFailure := calldataload(add(calli, 0x20))` and `success := mload(result)` + if iszero(or(calldataload(add(calli, 0x20)), mload(result))) { + // set "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)"))) + mstore(0x00, 0x08c379a000000000000000000000000000000000000000000000000000000000) + // set data offset + mstore(0x04, 0x0000000000000000000000000000000000000000000000000000000000000020) + // set length of revert string + mstore(0x24, 0x0000000000000000000000000000000000000000000000000000000000000017) + // set revert string: bytes32(abi.encodePacked("Multicall3: call failed")) + mstore(0x44, 0x4d756c746963616c6c333a2063616c6c206661696c6564000000000000000000) + revert(0x00, 0x84) + } + } + unchecked { + ++i; + } + } + // Finally, make sure the msg.value = SUM(call[0...i].value) + require(msg.value == valAccumulator, "Multicall3: value mismatch"); + } + + /// @notice Returns the block hash for the given block number + /// @param blockNumber The block number + function getBlockHash(uint256 blockNumber) public view returns (bytes32 blockHash) { + blockHash = blockhash(blockNumber); + } + + /// @notice Returns the block number + function getBlockNumber() public view returns (uint256 blockNumber) { + blockNumber = block.number; + } + + /// @notice Returns the block coinbase + function getCurrentBlockCoinbase() public view returns (address coinbase) { + coinbase = block.coinbase; + } + + /// @notice Returns the block difficulty + function getCurrentBlockDifficulty() public view returns (uint256 difficulty) { + difficulty = block.prevrandao; + } + + /// @notice Returns the block gas limit + function getCurrentBlockGasLimit() public view returns (uint256 gaslimit) { + gaslimit = block.gaslimit; + } + + /// @notice Returns the block timestamp + function getCurrentBlockTimestamp() public view returns (uint256 timestamp) { + timestamp = block.timestamp; + } + + /// @notice Returns the (ETH) balance of a given address + function getEthBalance(address addr) public view returns (uint256 balance) { + balance = addr.balance; + } + + /// @notice Returns the block hash of the last block + function getLastBlockHash() public view returns (bytes32 blockHash) { + unchecked { + blockHash = blockhash(block.number - 1); + } + } + + /// @notice Gets the base fee of the given block + /// @notice Can revert if the BASEFEE opcode is not implemented by the given chain + function getBasefee() public view returns (uint256 basefee) { + basefee = block.basefee; + } + + /// @notice Returns the chain id + function getChainId() public view returns (uint256 chainid) { + chainid = block.chainid; + } +} diff --git a/packages/protocol/test/common/erc20/FreeMintERC20.sol b/packages/protocol/test/shared/token/FreeMintERC20.sol similarity index 95% rename from packages/protocol/test/common/erc20/FreeMintERC20.sol rename to packages/protocol/test/shared/token/FreeMintERC20.sol index a928dd80cc8..96e02962edc 100644 --- a/packages/protocol/test/common/erc20/FreeMintERC20.sol +++ b/packages/protocol/test/shared/token/FreeMintERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/packages/protocol/test/common/erc20/MayFailFreeMintERC20.sol b/packages/protocol/test/shared/token/MayFailFreeMintERC20.sol similarity index 98% rename from packages/protocol/test/common/erc20/MayFailFreeMintERC20.sol rename to packages/protocol/test/shared/token/MayFailFreeMintERC20.sol index 58044944f1c..4fe4e76501a 100644 --- a/packages/protocol/test/common/erc20/MayFailFreeMintERC20.sol +++ b/packages/protocol/test/shared/token/MayFailFreeMintERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/packages/protocol/test/common/erc20/RegularERC20.sol b/packages/protocol/test/shared/token/RegularERC20.sol similarity index 90% rename from packages/protocol/test/common/erc20/RegularERC20.sol rename to packages/protocol/test/shared/token/RegularERC20.sol index 4985d937d36..5216f9077af 100644 --- a/packages/protocol/test/common/erc20/RegularERC20.sol +++ b/packages/protocol/test/shared/token/RegularERC20.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/packages/protocol/test/tokenvault/BridgedERC20.t.sol b/packages/protocol/test/shared/tokenvault/BridgedERC20V2.t.sol similarity index 98% rename from packages/protocol/test/tokenvault/BridgedERC20.t.sol rename to packages/protocol/test/shared/tokenvault/BridgedERC20V2.t.sol index 80470c70644..9d07025e40b 100644 --- a/packages/protocol/test/tokenvault/BridgedERC20.t.sol +++ b/packages/protocol/test/shared/tokenvault/BridgedERC20V2.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; @@ -127,7 +127,7 @@ contract TestBridgedERC20 is TaikoTest { return BridgedERC20( deployProxy({ name: "bridged_token1", - impl: address(new BridgedERC20()), + impl: address(new BridgedERC20V2()), data: abi.encodeCall( BridgedERC20.init, (owner, address(manager), srcToken, srcChainId, srcDecimals, name, name) diff --git a/packages/protocol/test/tokenvault/ERC1155Vault.t.sol b/packages/protocol/test/shared/tokenvault/ERC1155Vault.t.sol similarity index 99% rename from packages/protocol/test/tokenvault/ERC1155Vault.t.sol rename to packages/protocol/test/shared/tokenvault/ERC1155Vault.t.sol index c7a4853e664..6c28e585e7d 100644 --- a/packages/protocol/test/tokenvault/ERC1155Vault.t.sol +++ b/packages/protocol/test/shared/tokenvault/ERC1155Vault.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; import "../TaikoTest.sol"; diff --git a/packages/protocol/test/tokenvault/ERC20Vault.t.sol b/packages/protocol/test/shared/tokenvault/ERC20Vault.t.sol similarity index 99% rename from packages/protocol/test/tokenvault/ERC20Vault.t.sol rename to packages/protocol/test/shared/tokenvault/ERC20Vault.t.sol index 98f1c9ddc12..1f8804a84f8 100644 --- a/packages/protocol/test/tokenvault/ERC20Vault.t.sol +++ b/packages/protocol/test/shared/tokenvault/ERC20Vault.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; @@ -61,7 +61,7 @@ contract PrankDestBridge { } } -contract UpdatedBridgedERC20 is BridgedERC20 { +contract UpdatedBridgedERC20 is BridgedERC20V2 { function helloWorld() public pure returns (string memory) { return "helloworld"; } diff --git a/packages/protocol/test/tokenvault/ERC721Vault.t.sol b/packages/protocol/test/shared/tokenvault/ERC721Vault.t.sol similarity index 99% rename from packages/protocol/test/tokenvault/ERC721Vault.t.sol rename to packages/protocol/test/shared/tokenvault/ERC721Vault.t.sol index c43ed5fde0b..0ef70957687 100644 --- a/packages/protocol/test/tokenvault/ERC721Vault.t.sol +++ b/packages/protocol/test/shared/tokenvault/ERC721Vault.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "../TaikoTest.sol"; diff --git a/packages/protocol/test/thirdparty/LibFixedPointMath.t.sol b/packages/protocol/test/thirdparty/LibFixedPointMath.t.sol deleted file mode 100644 index 917a31bc936..00000000000 --- a/packages/protocol/test/thirdparty/LibFixedPointMath.t.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../TaikoTest.sol"; - -/// @author Kirk Baird -contract TestLibFixedPointMath is TaikoTest { - function test_exp() external { - assertEq(LibFixedPointMath.exp(1e18), 2_718_281_828_459_045_235); // 2.718281828459045235 - assertEq(LibFixedPointMath.exp(2e18), 7_389_056_098_930_650_227); // 7.389056098930650227 - assertEq(LibFixedPointMath.exp(0), 1_000_000_000_000_000_000); // 1 - assertEq(LibFixedPointMath.exp(-1e18), 367_879_441_171_442_321); // 0.3678794411714423216 - assertEq(LibFixedPointMath.exp(1), 1_000_000_000_000_000_001); //1.000000000000000001 - assertEq(LibFixedPointMath.exp(-1), 999_999_999_999_999_999); //0.9999999999999999990 - - // accurate up to 1e-16% - assertApproxEqRel( - LibFixedPointMath.exp(135e18), - 42_633_899_483_147_210_448_936_866_880_765_989_356_468_745_853_255_281_087_440_011_736_227_864_297_277, - 1 - ); // 42633899483147210448936866880765989356468745853255281087440.011736227864297277 - - // accurate up to 1e-16% - assertApproxEqRel( - LibFixedPointMath.exp(135_305_999_368_893_231_588), - 57_896_044_618_658_097_649_816_762_928_942_336_782_129_491_980_154_662_247_847_962_410_455_084_893_091, - 1 - ); // 57896044618658097649816762928942336782129491980154662247847.962410455084893091 - - assertEq(LibFixedPointMath.exp(-40e18), 4); - - // returns 0 if result is <0.5 - assertEq(LibFixedPointMath.exp(-42_139_678_854_452_767_552), 0); - } - - function test_exp_overflow() external { - vm.expectRevert(LibFixedPointMath.Overflow.selector); - LibFixedPointMath.exp(135_305_999_368_893_231_589); // max input is 135305999368893231588 - } -} diff --git a/packages/protocol/test/thirdparty/optimisim/Bytes.t.sol b/packages/protocol/test/thirdparty/optimisim/Bytes.t.sol deleted file mode 100644 index 7a94ffe63f9..00000000000 --- a/packages/protocol/test/thirdparty/optimisim/Bytes.t.sol +++ /dev/null @@ -1,129 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../TaikoTest.sol"; -import "../../../contracts/thirdparty/optimism/Bytes.sol"; -/// @author Kirk Baird - -contract TestBytes is TaikoTest { - function test_toNibbles() external { - // 20 Bytes input - bytes memory someBytes = hex"0123456789012345678901234567890123456789"; - bytes memory nibbles = Bytes.toNibbles(someBytes); - assertEq( - hex"00010203040506070809000102030405060708090001020304050607080900010203040506070809", - nibbles - ); - - // Empty bytes input - bytes memory emptyBytes; - nibbles = Bytes.toNibbles(emptyBytes); - assertEq(nibbles, hex""); - } - - // We test slice using case division based on different input sizes, starts and lengths - function test_slice() external { - // 1. 20 bytes input - bytes memory someBytes = hex"0123456789012345678901234567890123456789"; - - // 1.A. 0 length - // 1.A.i. 0 start - assertEq(Bytes.slice(someBytes, 0, 0), hex""); - - // 1.A.ii. partial start - assertEq(Bytes.slice(someBytes, 7, 0), hex""); - - // 1.A.iii. end start - assertEq(Bytes.slice(someBytes, someBytes.length, 0), hex""); - - // 1.B. full length - // 1.B.i. 0 start - assertEq( - Bytes.slice(someBytes, 0, someBytes.length), - hex"0123456789012345678901234567890123456789" - ); - - // 1.B.ii. partial start - vm.expectRevert("slice_outOfBounds"); - Bytes.slice(someBytes, 7, someBytes.length); - - // 1.C. partial length - // 1.C.i. 0 start - assertEq(Bytes.slice(someBytes, 0, 9), hex"012345678901234567"); - - // 1.C.ii. partial start - assertEq(Bytes.slice(someBytes, 7, 9), hex"456789012345678901"); - - // 1.C.iii. partial start, until exact end of input - assertEq(Bytes.slice(someBytes, 11, 9), hex"234567890123456789"); - - // 1.C.iv. end start - vm.expectRevert("slice_outOfBounds"); - Bytes.slice(someBytes, someBytes.length, 9); - - // 2. 64 byte input - someBytes = - hex"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - - // 2.A. 0 length - // 2.A.i. 0 start - assertEq(Bytes.slice(someBytes, 0, 0), hex""); - - // 2.A.ii. partial start - assertEq(Bytes.slice(someBytes, 7, 0), hex""); - - // 2.A.iii. end start - assertEq(Bytes.slice(someBytes, someBytes.length, 0), hex""); - - // 2.B. full length - // 2.B.i. 0 start - assertEq( - Bytes.slice(someBytes, 0, someBytes.length), - hex"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - ); - - // 2.B.ii. partial start - vm.expectRevert("slice_outOfBounds"); - Bytes.slice(someBytes, 7, someBytes.length); // TODO Foundry bug - - // 2.C. partial length - // 2.C.i. 0 start - assertEq(Bytes.slice(someBytes, 0, 9), hex"0123456789abcdef01"); - - // 2.C.ii. partial start - assertEq(Bytes.slice(someBytes, 7, 9), hex"ef0123456789abcdef"); - - // 2.C.iii. partial start, until exact end of input - assertEq(Bytes.slice(someBytes, 55, 9), hex"ef0123456789abcdef"); - - // 2.C.iv. end start - vm.expectRevert("slice_outOfBounds"); - Bytes.slice(someBytes, someBytes.length, 9); - - // 3. 0 byte input - someBytes = hex""; - - // 3.A. 0 start - assertEq(Bytes.slice(someBytes, 0, 0), hex""); - - // 3.B. overflow start - vm.expectRevert("slice_outOfBounds"); - Bytes.slice(someBytes, 1, 0); - - // 3.C. overflow length - vm.expectRevert("slice_outOfBounds"); - Bytes.slice(someBytes, 0, 1); - } - - function test_slice2() external { - // 20 byte input - bytes memory someBytes = hex"0123456789012345678901234567890123456789"; - - assertEq(Bytes.slice(someBytes, 0), hex"0123456789012345678901234567890123456789"); - - assertEq(Bytes.slice(someBytes, 10), hex"01234567890123456789"); - - assertEq(Bytes.slice(someBytes, someBytes.length * 1000), hex""); //Doesnt revert if start - // is out of bounds - } -} diff --git a/packages/protocol/test/thirdparty/optimisim/rlp/RLPReader.t.sol b/packages/protocol/test/thirdparty/optimisim/rlp/RLPReader.t.sol deleted file mode 100644 index d9986ce4efc..00000000000 --- a/packages/protocol/test/thirdparty/optimisim/rlp/RLPReader.t.sol +++ /dev/null @@ -1,128 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../../TaikoTest.sol"; - -/// @author Kirk Baird -contract TestRLPReader is TaikoTest { - function test_readList_correctList() external { - bytes memory encodedList = hex"c3010203"; // "[0x01, 0x02, 0x03]" - RLPReader.RLPItem[] memory decodedList = RLPReader.readList(encodedList); - assertEq(decodedList.length, 3); - assertEq(RLPReader.readBytes(decodedList[0]), hex"01"); - assertEq(RLPReader.readBytes(decodedList[1]), hex"02"); - assertEq(RLPReader.readBytes(decodedList[2]), hex"03"); - } - - function test_readList_emptyList() external { - bytes memory encodedList = hex"c0"; // "[]" - RLPReader.RLPItem[] memory decodedList = RLPReader.readList(encodedList); - assertEq(decodedList.length, 0); - } - - function test_readList_emptyListNull() external { - bytes memory encodedList = hex"c180"; // "[""]" - RLPReader.RLPItem[] memory decodedList = RLPReader.readList(encodedList); - assertEq(decodedList.length, 1); - assertEq(RLPReader.readBytes(decodedList[0]), hex""); - } - - function test_readList_nestedList() external { - bytes memory encodedList = hex"c3c10102"; // "[["0x01"],"0x02"]" - RLPReader.RLPItem[] memory decodedList = RLPReader.readList(encodedList); - assertEq(decodedList.length, 2); - assertEq(RLPReader.readBytes(decodedList[1]), hex"02"); - RLPReader.RLPItem[] memory nestedDecodedList = RLPReader.readList(decodedList[0]); - assertEq(nestedDecodedList.length, 1); - assertEq(RLPReader.readBytes(nestedDecodedList[0]), hex"01"); - } - - function test_readList_invalidLength() external { - bytes memory encodedList = hex"e1a00000000000000000000000000000000000000000000000000001"; - vm.expectRevert( - "RLPReader: length of content must be greater than list length (short list)" - ); - RLPReader.readList(encodedList); - } - - function test_readList_empty() external { - bytes memory empty = hex""; - vm.expectRevert( - "RLPReader: length of an RLP item must be greater than zero to be decodable" - ); - RLPReader.readList(empty); - } - - function test_readList_null() external { - bytes memory encodedNull = hex"80"; - vm.expectRevert("RLPReader: decoded item type for list is not a list item"); - RLPReader.readList(encodedNull); - } - - function test_readList_nonList() external { - bytes memory encodedNumber = hex"8204d2"; // "1234" - vm.expectRevert("RLPReader: decoded item type for list is not a list item"); - RLPReader.readList(encodedNumber); - } - - function test_readBytes_correctFourBytes() external { - bytes memory encodedBytes = hex"8412345678"; // "0x12345678" - bytes memory decodedBytes = RLPReader.readBytes(encodedBytes); - assertEq(decodedBytes.length, 4); - assertEq(decodedBytes, hex"12345678"); - } - - function test_readBytes_correctSixtyFourBytes() external { - bytes memory encodedBytes = - hex"b8400123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - bytes memory decodedBytes = RLPReader.readBytes(encodedBytes); - assertEq(decodedBytes.length, 64); - assertEq( - decodedBytes, - hex"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - ); - } - - function test_readBytes_null() external { - bytes memory encodedBytes = hex"80"; - assertEq(RLPReader.readBytes(encodedBytes), hex""); - } - - function test_readBytes_empty() external { - bytes memory empty = hex""; - vm.expectRevert( - "RLPReader: length of an RLP item must be greater than zero to be decodable" - ); - RLPReader.readBytes(empty); - } - - function test_readBytes_list() external { - bytes memory encodedList = hex"c3010203"; // "[0x01, 0x02, 0x03]" - vm.expectRevert("RLPReader: decoded item type for bytes is not a data item"); - RLPReader.readBytes(encodedList); - } - - function test_readRawBytes_shortBytes() external { - bytes memory encodedBytes = hex"940123456789012345678901234567890123456789"; - assertEq(RLPReader.readRawBytes(RLPReader.toRLPItem(encodedBytes)), encodedBytes); - } - - function test_readRawBytes_longBytes() external { - bytes memory encodedBytes = - hex"b8400123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - assertEq(RLPReader.readRawBytes(RLPReader.toRLPItem(encodedBytes)), encodedBytes); - } - - function test_readRawBytes_empty() external { - bytes memory encodedBytes = hex""; - vm.expectRevert( - "RLPReader: length of an RLP item must be greater than zero to be decodable" - ); - RLPReader.readRawBytes(RLPReader.toRLPItem(encodedBytes)); - } - - function test_readRawBytes_null() external { - bytes memory encodedBytes = hex"80"; - assertEq(RLPReader.readRawBytes(RLPReader.toRLPItem(encodedBytes)), encodedBytes); - } -} diff --git a/packages/protocol/test/thirdparty/optimisim/trie/SecureMerkleTrie.t.sol b/packages/protocol/test/thirdparty/optimisim/trie/SecureMerkleTrie.t.sol deleted file mode 100644 index b679d08611e..00000000000 --- a/packages/protocol/test/thirdparty/optimisim/trie/SecureMerkleTrie.t.sol +++ /dev/null @@ -1,130 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../../TaikoTest.sol"; - -/// @author Kirk Baird -contract TestSecureMerkleTrie is TaikoTest { - function test_verifyInclusionProof_simple() external { - bytes memory slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; // hash - // = 0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f - bytes memory value = hex"01"; - // Leaf node (target): - // ["0x3652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f","0x01"] // hash = - // 4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337 - // Branch node (root): - // ["0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337", - // "0x"] // hash = b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c - - bytes32 rootHash = hex"b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c"; - - bytes[] memory proof = new bytes[](2); - proof[0] = - hex"f1808080808080808080808080808080a04c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c33780"; - proof[1] = hex"e2a03652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01"; - - assertTrue(SecureMerkleTrie.verifyInclusionProof(slot, value, proof, rootHash)); - } - - // based on deployed contract 0xcD5e2bebd3DfE46e4BF96aE2ac7B89B22cc6a982 (SignalService Proxy) - // on Sepolia - function test_verifyInclusionProof_realProof() external { - bytes memory slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - bytes memory value = hex"01"; - bytes32 rootHash = hex"45e9f670f31850ee0771a6ce85f36721526bc413bd91d58b8b9002adacb418ca"; - - bytes[] memory proof = new bytes[](6); - proof[0] = - hex"f90211a01bf8dc9db1d06b09a1593db05232aa42c2b417e20251d71e8f32086b57573e06a0f541e279cb44d7e034fd4a8fda716291d8bb5cc2fb67249197c373e4405333d9a09ac7f4d030a807bf868f0e9122a537e6ea6f029a3bbae5477f5bec9367477538a012795298d14f24c7876a15303f38c794fe4d22c385d6b15adf136a65287d64aca0db8ff50aeed396a753e2b582a2101807146b9abad224956c8c0b2914e8bc6308a050e2462dd19498a35aabf6a701e90756cd519129c04095fde7b35ced53548967a01d4d98eae2c34085bef8029256fbc79dfd08ce2413742e006c16057ee23d8415a05ee9d91e8763e4ab8bfddb682f1579d91189d77435e69e186788b1236c07b400a06e867457693097e1ac54bca407a9b7241740e64d110e661b71b708776bf951cea038440f0f7488fc76ba3f7a35b1789dd4658b9b206441ef824acb7fe2a3a76a20a0285e98d81740593ef5a9a529c4d733ebe64f15f40732b3a0d0623c1cb71f8ed0a0a80dd18c30ffd2792e4856b13097aad1e5afe7439b7f343cf9ae856d68af2ba7a0c2d74f432cab091d90bae5ec862089ae1272f39108f1cba4f57c7b5671e5c816a0aceebc0b41cf40fe8313c2b524f03e732b8385727de1abae876d9057b2d85e1fa00ee8b4f21e2f328d027884d9ffbac6fac35539a7d74b11d9f17e5a3a185b8386a0e52242d3cc5dd7773ec21fbfae2141144d02ce74ff601c375bda5fff96aef12b80"; - proof[1] = - hex"f90211a09c081fac815d03d3ef97f0f6ec100c24a7057fff79a870a22756b374a67a67eaa008586c30da747166360003b1eed874a0b915ca98cbfa84964f7d88ab8da1989aa0449474ec27502c1a3a5d21050bbfd57cc514adae298412e23f132534ff932dfca08434310370976516d70c7b3b6b33a383e46a94563ec48da41ce3074141c29d37a0912079ec50d4499209c32b2f7dd8d12cb9c152136812df496876fae92d485335a0505627a88c1028e9ce54238f9f5d79e196b9fee338aa642afe511886ed53f04aa0e411917634b30a3767de43f4208ee6a7bef92e63e4afd83b9318da18b5664a6ea03f5bbccdf60e44fa45761b107f34166d4b511d0343af2464afed818dfdc57963a002920171377ba261586e2733d3d0f19696b44848abb95ad91b08484f7cbe74bea0815f25e6680089a62b7219ee2957b19e773d41545fe2140a4dbcd7e8cd3dffd7a0204c53730d2e8b4840012807a3ccfb3dab97a9abcbddea7b470e72c31ed47e64a0e37b499b1b6139944109adfffe5a303f26efc14627a85bdd06f5f67fa18d1f27a070660c887064df8b7d89a942b0553427dd18f06b8bbb39db5365786e780fc749a07b51a6dbe67bad62c92538c859a66937162cb61a000d7e5f21695e490199b18ba0b80c116ca1493c4a017f3189e519614295c4ec23edcaa199f16f64ad9b9527c7a09cea6ec2caee96a5cacbae86e88c15e0f2a5d26d4b75137179fd5666fbb5aa7480"; - proof[2] = - hex"f90211a0edff33fe5c95b4fa868d66431769e22577932ee13b18b1da8ee5419aec59c5e7a09320d0ae25a44b54b44f69b435a3edb6503d0aab80052a4ba2d0069e840ffcf3a084d002a67ee8281c3681b11d948ab4d2a6440a2803f6025b54dcaa4a2bb86047a00104b82f9c6c5a0d3bc9f1af1ccde26293e680e26d525f9d542a9ebb5d623eada02b2522787d006e41d10c12bff567be8eb13ca23784a926eddeda28550bc50843a03d02c42758d7f7107850431572c6275b64a9da09107d588c732a45804ec8b650a0be4b44daa2d677c7163e0b6b8334c39ddb92ae0701b573196ed2e422d08d7f79a0c4c06e7eded093383c6c3e2460462a49d356a4fc3165ec0207490cf62b382653a0d54b62359a6a9c0541e660b151009cc42a48e3ba12b7059e7aa40ea55f7d627fa08ee6a1a4cc20035c4ac7aea9d80dfc1dd13d83b9c9941c180caf0496a261a525a02885741fff2f4e61c3cd76ea387978030d9d0a79d2accdaaa535e9fd69be9dc0a013f67d5965341a354b659eddf810ad1801ed6cdbc85922fbf4f1d5690d4dec5ea0014ce0d9af419fb75af5ebf396786cd3f415429d30e174c864c6f355e46e9e9fa04ad594c616d61e8b911359309131516d9e29d9a435cec91520d0831bcee6752fa06aeb091d8001bf97c0861ea1900e85edad54c00e7d368fae73a5d980a4479a2da07e2aa9f31c59e36b69154fbd34de81c6b1feed1a6ed868813e923d2f98d8c31480"; - proof[3] = - hex"f90211a0d2c363378ebc8717d552d4137cba842e6d00f045121f885d88f1146121c299e5a09f6f5a03356b3033f75fba1956afe0242be8dc508ce83e356ea5f48b3c17b571a0ba32e8ef62fdfc524822241c471024cba2b1d4a6a9d049424e2ac3868435f2eaa0284ecc45af9d2cc173636750eef4fc9c3e8828a5469732571950259cd25b2ae5a0a4a384dba0939acbcc8b14ce2411df265cc91162debb84ffd94f9a5f185e6c04a02542ba4e13a2571665afb8a8d6b5e972e018d1d6f3ae57707d725254530f27aaa05b1f61c8dea59ac83181d4faa4d3c322970f5ecacd0bd07028bc87b6e3174baba02fa86ead02062c2671a3de5460efe03e179184e3602320ab8478aa51239ca5f1a0b0a1ed80fa8eef67af1193c2080d04976d2b28ed3a70ad64afc9d31864ddf0d3a0afd61230c619715051e37d73754063a58da86e17fa9f1f702038b88b762fda4ea0cdb772381aec1978ad17c8c0e13298b1f9ce4b937f45a7b5ade7bce5ec374665a0db07f3614888c57b8ccbddca9e1575e63b663acada279262261b43e8d328ba88a00de0759c749651d9b8960feed63fbeecaaa145f47927e7f2d2d3f56bb802d676a01c3384e31a91e9d39ee8c728c24cf49a2d1c27ed4d96075c760d470e0812731da07e7fc146b9cc0be8af894c7a6cd93b4857011483f299c5b68737de3f0eb53304a0466878f42b7f4b98bdf104bede4313aade1c2cf0186db3e5806b74935129d00e80"; - proof[4] = - hex"f90171a031dde6777fd092b1b9769b2402355e81e3e03e5d5c336f5edc583836ed15cfa580a0bb779ade81cb7fa701d963b9c1ae32d7cf58d926d14217bf96e3b44cdc93426da08cfeef6342385fbb0b452adca5c2ae1c5c651839137c15ce646d2a2011358e0ba0354480a6556b60a6af02f5f138eac24b268af77d85b3a7e241b1c6ec30125e17a08b6d79c69add140fd1bdd694ded36b248961ce0a6c905aac15ae928b925d730f80a0665dd3eb57bd0fd5bf2476a2c7ce190bbe4cfe92862d2ca644ec2f24a5e1545980a0321c382b719c93b3d816c3876a5f36b265186988c4a7994bc5927357f64d82bfa0adbd467e4d446b07a0f755954da22d7480373fdb139e93ec52799aa4239571a980a0a3eed0a41205afb11767756e464a4b99b0cbec8ac9f0919f46b831118a6847f880a0954e8545cb42ac37f2ef0f79f745a03c660dd143a7b621132385060a8345e821a00fe18033d0e53a5d97855111b656f4aefc4b32538df7aba9a01592bb1337d15380"; - proof[5] = hex"e09e3cd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56301"; - - assertTrue(SecureMerkleTrie.verifyInclusionProof(slot, value, proof, rootHash)); - } - - function test_verifyInclusionProof_fakeValue() external { - bytes memory slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; - bytes memory value = hex"ff"; - bytes32 rootHash = hex"b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c"; - - bytes[] memory proof = new bytes[](2); - proof[0] = - hex"f1808080808080808080808080808080a04c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c33780"; - proof[1] = hex"e2a03652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01"; - - assertFalse(SecureMerkleTrie.verifyInclusionProof(slot, value, proof, rootHash)); - } - - function test_verifyInclusionProof_fakeRoot() external { - bytes memory slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; // hash - // = 0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f - bytes memory value = hex"01"; - // Leaf node (target): - // ["0x3652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f","0x01"] // hash = - // 4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337 - // Branch node (root): - // ["0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337", - // "0x"] // hash = b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c - - bytes32 rootHash = hex"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - - bytes[] memory proof = new bytes[](2); - proof[0] = - hex"f1808080808080808080808080808080a04c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c33780"; - proof[1] = hex"e2a03652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01"; - - vm.expectRevert("MerkleTrie: invalid root hash"); - SecureMerkleTrie.verifyInclusionProof(slot, value, proof, rootHash); - } - - function test_verifyInclusionProof_fakeIntermediateNode() external { - bytes memory slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; // hash - // = 0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f - bytes memory value = hex"01"; - // Leaf node (target): - // ["0x3123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef","0x01"] // hash = - // 7b074e96d2dcd6ae7a05e7e35c748e067706d28e47bfecf0c0e642f4dff48d17 - // Branch node (root): - // ["0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337", - // "0x"] // hash = b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c - - bytes32 rootHash = hex"b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c"; - - bytes[] memory proof = new bytes[](2); - proof[0] = - hex"f1808080808080808080808080808080a04c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c33780"; - proof[1] = hex"e2a03123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01"; - - vm.expectRevert("MerkleTrie: invalid large internal hash"); - SecureMerkleTrie.verifyInclusionProof(slot, value, proof, rootHash); - } - - function test_get() external { - bytes memory slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; // hash - // = 0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f - bytes memory value = hex"01"; - // Leaf node (target): - // ["0x3652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f","0x01"] // hash = - // 4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337 - // Branch node (root): - // ["0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337", - // "0x"] // hash = b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c - - bytes32 rootHash = hex"b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c"; - - bytes[] memory proof = new bytes[](2); - proof[0] = - hex"f1808080808080808080808080808080a04c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c33780"; - proof[1] = hex"e2a03652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01"; - - bytes memory fetchedValue = SecureMerkleTrie.get(slot, proof, rootHash); - assertEq(fetchedValue, value); - } -} diff --git a/packages/protocol/tsconfig.json b/packages/protocol/tsconfig.json new file mode 100644 index 00000000000..ab68f56d56b --- /dev/null +++ b/packages/protocol/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "lib": ["es6"], + "types": ["node"], + "moduleResolution": "node", + "esModuleInterop": true + }, + "include": ["utils/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/packages/protocol/utils/airdrop/airdrop_db/example_claimList.json b/packages/protocol/utils/airdrop/airdrop_db/example_claimList.json deleted file mode 100644 index 3208e43309c..00000000000 --- a/packages/protocol/utils/airdrop/airdrop_db/example_claimList.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - { "address": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf", "amount": 100 }, - { "address": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF", "amount": 100 }, - { "address": "0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69", "amount": 100 }, - { "address": "0x1efF47bc3a10a45D4B230B5d10E37751FE6AA718", "amount": 100 }, - { "address": "0xe1AB8145F7E55DC933d51a18c793F901A3A0b276", "amount": 200 } -] diff --git a/packages/protocol/utils/airdrop/buildMerkleTree.ts b/packages/protocol/utils/airdrop/buildMerkleTree.ts deleted file mode 100644 index f732a115c79..00000000000 --- a/packages/protocol/utils/airdrop/buildMerkleTree.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { MerkleTree } from "merkletreejs/dist/MerkleTree"; -const { ethers } = require("ethers"); -const keccak256 = require("keccak256"); -const fs = require("fs"); - -interface IClaimListData { - address: string; - amount: number; -} - -interface IMerkle { - merkleTree: MerkleTree; - rootHash: string; -} - -async function buildMerkleTree( - allowListDataArr: IClaimListData[], -): Promise { - // create merkle tree - const leafNodes: any = []; - for (let i = 0; i < allowListDataArr.length; i++) { - leafNodes.push(buildLeaf(allowListDataArr[i])); - } - const merkleTree = new MerkleTree(leafNodes, keccak256, { - sortPairs: true, - }); - - const rootHash = merkleTree.getHexRoot(); - - return { - merkleTree, - rootHash, - }; -} - -function buildLeaf(data: IClaimListData) { - const inputData = ethers.utils.defaultAbiCoder.encode( - ["address", "uint256"], - [data.address, data.amount], - ); - - return Buffer.from( - ethers.utils - .keccak256( - ethers.utils.defaultAbiCoder.encode( - ["bytes", "bytes"], - [ - ethers.utils.toUtf8Bytes("CLAIM_TAIKO_AIRDROP"), - inputData, - ], - ), - ) - .slice(2), - "hex", - ); -} - -async function getMerkleProof( - address: string, - amount: number, - claimList: IClaimListData[], -) { - const merkleData = await buildMerkleTree(claimList); - const leaf = buildLeaf({ address, amount }); - - return merkleData.merkleTree.getHexProof(leaf); -} - -async function main() { - const filePath = process.argv[2]; - - if (!filePath) { - console.error( - "Please provide a path to the JSON file as a command-line argument.", - ); - return; - } - - const jsonData = fs.readFileSync(filePath, "utf-8"); - const claimList: IClaimListData[] = JSON.parse(jsonData); - const merkleData = await buildMerkleTree(claimList); - - console.log("Merkle root:", merkleData.rootHash); - console.log("Nr of leaves (entries):", claimList.length); - - const exampleProof = await getMerkleProof( - "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf", - 100, - claimList, - ); - - console.log("Example proof for Alice (foundry) is: ", exampleProof); -} - -main().catch((error) => { - console.error(error); -}); diff --git a/packages/relayer/.gitignore b/packages/relayer/.gitignore index b2e94840565..ebc976485e7 100644 --- a/packages/relayer/.gitignore +++ b/packages/relayer/.gitignore @@ -66,6 +66,5 @@ terraform.rc .idea -Bridge.json -TaikoL2.json -IHeaderSync.json \ No newline at end of file +# Ignore abi files +bindings/**/*.json diff --git a/packages/relayer/.golangci.yml b/packages/relayer/.golangci.yml index 56dcebe883c..f47cd722a6f 100644 --- a/packages/relayer/.golangci.yml +++ b/packages/relayer/.golangci.yml @@ -9,7 +9,7 @@ # ], output: - format: colored-line-number + formats: colored-line-number linters: enable: @@ -34,6 +34,8 @@ linters-settings: min-complexity: 75 issues: + exclude-dirs: + - contracts/* exclude-rules: # Exclude some linters from running on tests files. - path: _test\.go @@ -42,7 +44,3 @@ issues: - path: / linters: - typecheck - -run: - skip-dirs: - - contracts/* diff --git a/packages/relayer/.l1indexer.example.env b/packages/relayer/.l1indexer.example.env index 8a11abd4a6e..04fda9e1aa0 100644 --- a/packages/relayer/.l1indexer.example.env +++ b/packages/relayer/.l1indexer.example.env @@ -20,4 +20,5 @@ SRC_RPC_URL=wss://l1ws.internal.taiko.xyz DEST_RPC_URL=wss://ws.internal.taiko.xyz CORS_ORIGINS=* NUM_GOROUTINES=50 -BLOCK_BATCH_SIZE=100 \ No newline at end of file +BLOCK_BATCH_SIZE=100 +CONFIRMATIONS_BEFORE_INDEXING=1 \ No newline at end of file diff --git a/packages/relayer/ERC1155Vault.json b/packages/relayer/ERC1155Vault.json deleted file mode 100644 index 5bcfce5cfd9..00000000000 --- a/packages/relayer/ERC1155Vault.json +++ /dev/null @@ -1,1026 +0,0 @@ -[ - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "bridgedToCanonical", - "inputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "symbol", - "type": "string", - "internalType": "string" - }, - { - "name": "name", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "canonicalToBridged", - "inputs": [ - { - "name": "chainId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "ctoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "name", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "onERC1155BatchReceived", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "onERC1155Received", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "onMessageInvocation", - "inputs": [ - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "onMessageRecalled", - "inputs": [ - { - "name": "message", - "type": "tuple", - "internalType": "struct IBridge.Message", - "components": [ - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "srcOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "msgHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "sendToken", - "inputs": [ - { - "name": "_op", - "type": "tuple", - "internalType": "struct BaseNFTVault.BridgeTransferOp", - "components": [ - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "internalType": "uint256[]" - } - ] - } - ], - "outputs": [ - { - "name": "message_", - "type": "tuple", - "internalType": "struct IBridge.Message", - "components": [ - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "srcOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "supportsInterface", - "inputs": [ - { - "name": "_interfaceId", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BridgedTokenDeployed", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "btoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "ctokenSymbol", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "ctokenName", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenReceived", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenReleased", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenSent", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "ETH_TRANSFER_FAILED", - "inputs": [] - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "VAULT_INTERFACE_NOT_SUPPORTED", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_AMOUNT", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_TOKEN", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_TO_ADDR", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_PERMISSION_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_TOKEN_ARRAY_MISMATCH", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/relayer/ERC20Vault.json b/packages/relayer/ERC20Vault.json deleted file mode 100644 index cc2983af776..00000000000 --- a/packages/relayer/ERC20Vault.json +++ /dev/null @@ -1,1102 +0,0 @@ -[ - { - "type": "function", - "name": "MIN_MIGRATION_DELAY", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "bridgedToCanonical", - "inputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "decimals", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "symbol", - "type": "string", - "internalType": "string" - }, - { - "name": "name", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "btokenBlacklist", - "inputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "blacklisted", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "canonicalToBridged", - "inputs": [ - { - "name": "chainId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "ctoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "changeBridgedToken", - "inputs": [ - { - "name": "_ctoken", - "type": "tuple", - "internalType": "struct ERC20Vault.CanonicalERC20", - "components": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "decimals", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "symbol", - "type": "string", - "internalType": "string" - }, - { - "name": "name", - "type": "string", - "internalType": "string" - } - ] - }, - { - "name": "_btokenNew", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "btokenOld_", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastMigrationStart", - "inputs": [ - { - "name": "chainId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "ctoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "timestamp", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "name", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "onMessageInvocation", - "inputs": [ - { - "name": "_data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "onMessageRecalled", - "inputs": [ - { - "name": "_message", - "type": "tuple", - "internalType": "struct IBridge.Message", - "components": [ - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "srcOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "_msgHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "sendToken", - "inputs": [ - { - "name": "_op", - "type": "tuple", - "internalType": "struct ERC20Vault.BridgeTransferOp", - "components": [ - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ], - "outputs": [ - { - "name": "message_", - "type": "tuple", - "internalType": "struct IBridge.Message", - "components": [ - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "srcOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "supportsInterface", - "inputs": [ - { - "name": "_interfaceId", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BridgedTokenChanged", - "inputs": [ - { - "name": "srcChainId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "ctoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "btokenOld", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "btokenNew", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "ctokenSymbol", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "ctokenName", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "ctokenDecimal", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BridgedTokenDeployed", - "inputs": [ - { - "name": "srcChainId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "ctoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "btoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "ctokenSymbol", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "ctokenName", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "ctokenDecimal", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenReceived", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenReleased", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenSent", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "ETH_TRANSFER_FAILED", - "inputs": [] - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "VAULT_BTOKEN_BLACKLISTED", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_CTOKEN_MISMATCH", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_AMOUNT", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_NEW_BTOKEN", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_TOKEN", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_TO_ADDR", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_LAST_MIGRATION_TOO_CLOSE", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_PERMISSION_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/relayer/ERC721Vault.json b/packages/relayer/ERC721Vault.json deleted file mode 100644 index cabf9b6cf95..00000000000 --- a/packages/relayer/ERC721Vault.json +++ /dev/null @@ -1,982 +0,0 @@ -[ - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "bridgedToCanonical", - "inputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "symbol", - "type": "string", - "internalType": "string" - }, - { - "name": "name", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "canonicalToBridged", - "inputs": [ - { - "name": "chainId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "ctoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "name", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "onERC721Received", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "onMessageInvocation", - "inputs": [ - { - "name": "_data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "onMessageRecalled", - "inputs": [ - { - "name": "_message", - "type": "tuple", - "internalType": "struct IBridge.Message", - "components": [ - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "srcOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "_msgHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "sendToken", - "inputs": [ - { - "name": "_op", - "type": "tuple", - "internalType": "struct BaseNFTVault.BridgeTransferOp", - "components": [ - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "internalType": "uint256[]" - } - ] - } - ], - "outputs": [ - { - "name": "message_", - "type": "tuple", - "internalType": "struct IBridge.Message", - "components": [ - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "srcOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "supportsInterface", - "inputs": [ - { - "name": "_interfaceId", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BridgedTokenDeployed", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "btoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "ctokenSymbol", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "ctokenName", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenReceived", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenReleased", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenSent", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "ETH_TRANSFER_FAILED", - "inputs": [] - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "VAULT_INTERFACE_NOT_SUPPORTED", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_AMOUNT", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_TOKEN", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_TO_ADDR", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_PERMISSION_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_TOKEN_ARRAY_MISMATCH", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/relayer/ICrossChainSync.json b/packages/relayer/ICrossChainSync.json deleted file mode 100644 index dd612d08085..00000000000 --- a/packages/relayer/ICrossChainSync.json +++ /dev/null @@ -1,74 +0,0 @@ -[ - { - "type": "function", - "name": "getSyncedSnippet", - "inputs": [ - { - "name": "blockId", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "snippet", - "type": "tuple", - "internalType": "struct ICrossChainSync.Snippet", - "components": [ - { - "name": "syncedInBlock", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "event", - "name": "CrossChainSynced", - "inputs": [ - { - "name": "syncedInBlock", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "blockId", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "blockHash", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - } - ], - "anonymous": false - } -] diff --git a/packages/relayer/QuotaManager.json b/packages/relayer/QuotaManager.json deleted file mode 100644 index 4470ce042c8..00000000000 --- a/packages/relayer/QuotaManager.json +++ /dev/null @@ -1,569 +0,0 @@ -[ - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "availableQuota", - "inputs": [ - { - "name": "_token", - "type": "address", - "internalType": "address" - }, - { - "name": "_leap", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "consumeQuota", - "inputs": [ - { - "name": "_token", - "type": "address", - "internalType": "address" - }, - { - "name": "_amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - }, - { - "name": "_quotaPeriod", - "type": "uint24", - "internalType": "uint24" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "quotaPeriod", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint24", - "internalType": "uint24" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "tokenQuota", - "inputs": [ - { - "name": "token", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "updatedAt", - "type": "uint48", - "internalType": "uint48" - }, - { - "name": "quota", - "type": "uint104", - "internalType": "uint104" - }, - { - "name": "available", - "type": "uint104", - "internalType": "uint104" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateQuota", - "inputs": [ - { - "name": "_token", - "type": "address", - "internalType": "address" - }, - { - "name": "_quota", - "type": "uint104", - "internalType": "uint104" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "QuotaUpdated", - "inputs": [ - { - "name": "token", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "oldQuota", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newQuota", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "QM_INVALID_PARAM", - "inputs": [] - }, - { - "type": "error", - "name": "QM_OUT_OF_QUOTA", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/relayer/README.md b/packages/relayer/README.md index cbc97800416..a9414d599df 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -1,9 +1,8 @@ -[![Golang](https://github.com/taikoxyz/taiko-mono/actions/workflows/golang.yml/badge.svg)](https://github.com/taikoxyz/taiko-mono/actions/workflows/golang.yml) [![Relayer](https://codecov.io/gh/taikoxyz/taiko-mono/branch/main/graph/badge.svg?token=E468X2PTJC&flag=relayer)](https://codecov.io/gh/taikoxyz/taiko-mono) # Relayer -A relayer for the Bridge to watch and sync event between Layer 1 and Taiko Layer 2. +A relayer for the Bridge to watch and sync events between Layer 1 and Taiko Layer 2. ## Build the Source diff --git a/packages/relayer/SignalService.json b/packages/relayer/SignalService.json deleted file mode 100644 index baafb1ef1c9..00000000000 --- a/packages/relayer/SignalService.json +++ /dev/null @@ -1,885 +0,0 @@ -[ - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "authorize", - "inputs": [ - { - "name": "_addr", - "type": "address", - "internalType": "address" - }, - { - "name": "_authorize", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "getSignalSlot", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_app", - "type": "address", - "internalType": "address" - }, - { - "name": "_signal", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "getSyncedChainData", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "blockId_", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "chainData_", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "isAuthorized", - "inputs": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "authorized", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "isChainDataSynced", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_chainData", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "isSignalSent", - "inputs": [ - { - "name": "_app", - "type": "address", - "internalType": "address" - }, - { - "name": "_signal", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proveSignalReceived", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_app", - "type": "address", - "internalType": "address" - }, - { - "name": "_signal", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_proof", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "numCacheOps_", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "sendSignal", - "inputs": [ - { - "name": "_signal", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "signalForChainData", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "syncChainData", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_chainData", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "topBlockId", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "kind", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "blockId", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "verifySignalReceived", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_app", - "type": "address", - "internalType": "address" - }, - { - "name": "_signal", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_proof", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "view" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Authorized", - "inputs": [ - { - "name": "addr", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "authorized", - "type": "bool", - "indexed": false, - "internalType": "bool" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ChainDataSynced", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "blockId", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "kind", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "data", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "signal", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "SignalSent", - "inputs": [ - { - "name": "app", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "signal", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "slot", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "value", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "LTP_INVALID_ACCOUNT_PROOF", - "inputs": [] - }, - { - "type": "error", - "name": "LTP_INVALID_INCLUSION_PROOF", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "SS_EMPTY_PROOF", - "inputs": [] - }, - { - "type": "error", - "name": "SS_INVALID_HOPS_WITH_LOOP", - "inputs": [] - }, - { - "type": "error", - "name": "SS_INVALID_LAST_HOP_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "SS_INVALID_MID_HOP_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "SS_INVALID_STATE", - "inputs": [] - }, - { - "type": "error", - "name": "SS_SIGNAL_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "SS_UNAUTHORIZED", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/relayer/api/api.go b/packages/relayer/api/api.go index e7b72bd1477..ebff088719b 100644 --- a/packages/relayer/api/api.go +++ b/packages/relayer/api/api.go @@ -2,7 +2,6 @@ package api import ( "context" - "database/sql" "fmt" "log/slog" nethttp "net/http" @@ -17,19 +16,13 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/repo" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/utils" "github.com/urfave/cli/v2" - "gorm.io/gorm" ) -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} - type API struct { srv *http.Server httpPort uint64 ctx context.Context - wg *sync.WaitGroup + wg sync.WaitGroup srcEthClient *ethclient.Client } @@ -84,7 +77,6 @@ func InitFromConfig(ctx context.Context, api *API, cfg *Config) (err error) { api.srv = srv api.httpPort = cfg.HTTPPort api.ctx = ctx - api.wg = &sync.WaitGroup{} api.srcEthClient = srcEthClient return nil @@ -112,7 +104,7 @@ func (api *API) Start() error { go func() { if err := backoff.Retry(func() error { - return utils.ScanBlocks(api.ctx, api.srcEthClient, api.wg) + return utils.ScanBlocks(api.ctx, api.srcEthClient, &api.wg) }, backoff.NewConstantBackOff(5*time.Second)); err != nil { slog.Error("scan blocks backoff retry", "error", err) } diff --git a/packages/relayer/api/config.go b/packages/relayer/api/config.go index 9c25d25e5a5..22b320cecc3 100644 --- a/packages/relayer/api/config.go +++ b/packages/relayer/api/config.go @@ -28,7 +28,7 @@ type Config struct { ProcessingFeeMultiplier float64 DestTaikoAddress common.Address HTTPPort uint64 - OpenDBFunc func() (DB, error) + OpenDBFunc func() (db.DB, error) } // NewConfigFromCliContext creates a new config instance from command line flags. @@ -47,7 +47,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { DestRPCUrl: c.String(flags.DestRPCUrl.Name), ProcessingFeeMultiplier: c.Float64(flags.ProcessingFeeMultiplier.Name), DestTaikoAddress: common.HexToAddress(c.String(flags.DestTaikoAddress.Name)), - OpenDBFunc: func() (DB, error) { + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -56,7 +56,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (db.DB, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/relayer/api/config_test.go b/packages/relayer/api/config_test.go index 0e07a99668d..9176b3a8856 100644 --- a/packages/relayer/api/config_test.go +++ b/packages/relayer/api/config_test.go @@ -4,9 +4,11 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/urfave/cli/v2" + "github.com/taikoxyz/taiko-mono/packages/relayer/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/mock" - "github.com/urfave/cli/v2" ) var ( @@ -47,7 +49,7 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, "destRpcUrl", c.DestRPCUrl) assert.Equal(t, destTaikoAddress, c.DestTaikoAddress.Hex()) - c.OpenDBFunc = func() (DB, error) { + c.OpenDBFunc = func() (db.DB, error) { return &mock.DB{}, nil } diff --git a/packages/relayer/bindings/bridge/Bridge.go b/packages/relayer/bindings/bridge/Bridge.go index 6e31225296b..97be0a48852 100644 --- a/packages/relayer/bindings/bridge/Bridge.go +++ b/packages/relayer/bindings/bridge/Bridge.go @@ -31,9 +31,10 @@ var ( // BridgeProcessingStats is an auto generated low-level Go binding around an user-defined struct. type BridgeProcessingStats struct { - GasUsedInFeeCalc uint32 - ProofSize uint32 - NumCacheOps uint32 + GasUsedInFeeCalc uint32 + ProofSize uint32 + NumCacheOps uint32 + ProcessedByRelayer bool } // IBridgeContext is an auto generated low-level Go binding around an user-defined struct. @@ -60,7 +61,7 @@ type IBridgeMessage struct { // BridgeMetaData contains all meta data concerning the Bridge contract. var BridgeMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"context\",\"inputs\":[],\"outputs\":[{\"name\":\"ctx_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Context\",\"components\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"inputs\":[{\"name\":\"dataLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"hashMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"enabled_\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"destBridge_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageSent\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageStatus\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextMessageId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"status_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"},{\"name\":\"reason_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.StatusReason\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recallMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"retryMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_isLastAttempt\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"selfDelegate\",\"inputs\":[{\"name\":\"_anyToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"msgHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"inputs\":[{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageProcessed\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"stats\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structBridge.ProcessingStats\",\"components\":[{\"name\":\"gasUsedInFeeCalc\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"proofSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numCacheOps\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageStatusChanged\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIBridge.Status\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"context\",\"inputs\":[],\"outputs\":[{\"name\":\"ctx_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Context\",\"components\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"inputs\":[{\"name\":\"dataLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"hashMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"enabled_\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"destBridge_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageSent\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageStatus\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextMessageId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"status_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"},{\"name\":\"reason_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.StatusReason\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recallMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"retryMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_isLastAttempt\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"selfDelegate\",\"inputs\":[{\"name\":\"_anyToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"msgHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"inputs\":[{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageProcessed\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"stats\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structBridge.ProcessingStats\",\"components\":[{\"name\":\"gasUsedInFeeCalc\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"proofSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numCacheOps\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"processedByRelayer\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageStatusChanged\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIBridge.Status\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // BridgeABI is the input ABI used to generate the binding from. @@ -271,6 +272,37 @@ func (_Bridge *BridgeCallerSession) GASRESERVE() (uint32, error) { return _Bridge.Contract.GASRESERVE(&_Bridge.CallOpts) } +// RELAYERMAXPROOFBYTES is a free data retrieval call binding the contract method 0x422770fa. +// +// Solidity: function RELAYER_MAX_PROOF_BYTES() view returns(uint256) +func (_Bridge *BridgeCaller) RELAYERMAXPROOFBYTES(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Bridge.contract.Call(opts, &out, "RELAYER_MAX_PROOF_BYTES") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// RELAYERMAXPROOFBYTES is a free data retrieval call binding the contract method 0x422770fa. +// +// Solidity: function RELAYER_MAX_PROOF_BYTES() view returns(uint256) +func (_Bridge *BridgeSession) RELAYERMAXPROOFBYTES() (*big.Int, error) { + return _Bridge.Contract.RELAYERMAXPROOFBYTES(&_Bridge.CallOpts) +} + +// RELAYERMAXPROOFBYTES is a free data retrieval call binding the contract method 0x422770fa. +// +// Solidity: function RELAYER_MAX_PROOF_BYTES() view returns(uint256) +func (_Bridge *BridgeCallerSession) RELAYERMAXPROOFBYTES() (*big.Int, error) { + return _Bridge.Contract.RELAYERMAXPROOFBYTES(&_Bridge.CallOpts) +} + // AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. // // Solidity: function addressManager() view returns(address) @@ -1220,27 +1252,6 @@ func (_Bridge *BridgeTransactorSession) UpgradeToAndCall(newImplementation commo return _Bridge.Contract.UpgradeToAndCall(&_Bridge.TransactOpts, newImplementation, data) } -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_Bridge *BridgeTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Bridge.contract.RawTransact(opts, nil) // calldata is disallowed for receive function -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_Bridge *BridgeSession) Receive() (*types.Transaction, error) { - return _Bridge.Contract.Receive(&_Bridge.TransactOpts) -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_Bridge *BridgeTransactorSession) Receive() (*types.Transaction, error) { - return _Bridge.Contract.Receive(&_Bridge.TransactOpts) -} - // BridgeAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the Bridge contract. type BridgeAdminChangedIterator struct { Event *BridgeAdminChanged // Event containing the contract specifics and raw log @@ -1729,9 +1740,9 @@ type BridgeMessageProcessed struct { Raw types.Log // Blockchain specific contextual infos } -// FilterMessageProcessed is a free log retrieval operation binding the contract event 0xdaa934be05606f60ac49cd6e2ca4fbb3a5c15680dd3304880ea6abb590486e3d. +// FilterMessageProcessed is a free log retrieval operation binding the contract event 0x8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d. // -// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32) stats) +// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32,bool) stats) func (_Bridge *BridgeFilterer) FilterMessageProcessed(opts *bind.FilterOpts, msgHash [][32]byte) (*BridgeMessageProcessedIterator, error) { var msgHashRule []interface{} @@ -1746,9 +1757,9 @@ func (_Bridge *BridgeFilterer) FilterMessageProcessed(opts *bind.FilterOpts, msg return &BridgeMessageProcessedIterator{contract: _Bridge.contract, event: "MessageProcessed", logs: logs, sub: sub}, nil } -// WatchMessageProcessed is a free log subscription operation binding the contract event 0xdaa934be05606f60ac49cd6e2ca4fbb3a5c15680dd3304880ea6abb590486e3d. +// WatchMessageProcessed is a free log subscription operation binding the contract event 0x8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d. // -// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32) stats) +// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32,bool) stats) func (_Bridge *BridgeFilterer) WatchMessageProcessed(opts *bind.WatchOpts, sink chan<- *BridgeMessageProcessed, msgHash [][32]byte) (event.Subscription, error) { var msgHashRule []interface{} @@ -1788,9 +1799,9 @@ func (_Bridge *BridgeFilterer) WatchMessageProcessed(opts *bind.WatchOpts, sink }), nil } -// ParseMessageProcessed is a log parse operation binding the contract event 0xdaa934be05606f60ac49cd6e2ca4fbb3a5c15680dd3304880ea6abb590486e3d. +// ParseMessageProcessed is a log parse operation binding the contract event 0x8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d. // -// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32) stats) +// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32,bool) stats) func (_Bridge *BridgeFilterer) ParseMessageProcessed(log types.Log) (*BridgeMessageProcessed, error) { event := new(BridgeMessageProcessed) if err := _Bridge.contract.UnpackLog(event, "MessageProcessed", log); err != nil { diff --git a/packages/relayer/bindings/erc1155vault/ERC1155Vault.go b/packages/relayer/bindings/erc1155vault/ERC1155Vault.go index 23c51136d1d..43e11874c90 100644 --- a/packages/relayer/bindings/erc1155vault/ERC1155Vault.go +++ b/packages/relayer/bindings/erc1155vault/ERC1155Vault.go @@ -58,7 +58,7 @@ type IBridgeMessage struct { // ERC1155VaultMetaData contains all meta data concerning the ERC1155Vault contract. var ERC1155VaultMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"_op\",\"type\":\"tuple\",\"internalType\":\"structBaseNFTVault.BridgeTransferOp\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReleased\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"_op\",\"type\":\"tuple\",\"internalType\":\"structBaseNFTVault.BridgeTransferOp\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReleased\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // ERC1155VaultABI is the input ABI used to generate the binding from. diff --git a/packages/relayer/bindings/erc20vault/ERC20Vault.go b/packages/relayer/bindings/erc20vault/ERC20Vault.go index ccbe17c07a5..877b253c36a 100644 --- a/packages/relayer/bindings/erc20vault/ERC20Vault.go +++ b/packages/relayer/bindings/erc20vault/ERC20Vault.go @@ -66,7 +66,7 @@ type IBridgeMessage struct { // ERC20VaultMetaData contains all meta data concerning the ERC20Vault contract. var ERC20VaultMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"btokenBlacklist\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"blacklisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"inputs\":[{\"name\":\"_ctoken\",\"type\":\"tuple\",\"internalType\":\"structERC20Vault.CanonicalERC20\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_btokenNew\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btokenOld_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"_op\",\"type\":\"tuple\",\"internalType\":\"structERC20Vault.BridgeTransferOp\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"name\":\"srcChainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btokenOld\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"btokenNew\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenDecimal\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"name\":\"srcChainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenDecimal\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReleased\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"denied\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"inputs\":[{\"name\":\"_ctoken\",\"type\":\"tuple\",\"internalType\":\"structERC20Vault.CanonicalERC20\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_btokenNew\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btokenOld_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"_op\",\"type\":\"tuple\",\"internalType\":\"structERC20Vault.BridgeTransferOp\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"name\":\"srcChainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btokenOld\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"btokenNew\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenDecimal\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"name\":\"srcChainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenDecimal\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReleased\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"canonicalChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // ERC20VaultABI is the input ABI used to generate the binding from. @@ -337,12 +337,12 @@ func (_ERC20Vault *ERC20VaultCallerSession) BridgedToCanonical(btoken common.Add return _ERC20Vault.Contract.BridgedToCanonical(&_ERC20Vault.CallOpts, btoken) } -// BtokenBlacklist is a free data retrieval call binding the contract method 0xcaec3e4e. +// BtokenDenylist is a free data retrieval call binding the contract method 0x0e7eeb79. // -// Solidity: function btokenBlacklist(address btoken) view returns(bool blacklisted) -func (_ERC20Vault *ERC20VaultCaller) BtokenBlacklist(opts *bind.CallOpts, btoken common.Address) (bool, error) { +// Solidity: function btokenDenylist(address btoken) view returns(bool denied) +func (_ERC20Vault *ERC20VaultCaller) BtokenDenylist(opts *bind.CallOpts, btoken common.Address) (bool, error) { var out []interface{} - err := _ERC20Vault.contract.Call(opts, &out, "btokenBlacklist", btoken) + err := _ERC20Vault.contract.Call(opts, &out, "btokenDenylist", btoken) if err != nil { return *new(bool), err @@ -354,18 +354,18 @@ func (_ERC20Vault *ERC20VaultCaller) BtokenBlacklist(opts *bind.CallOpts, btoken } -// BtokenBlacklist is a free data retrieval call binding the contract method 0xcaec3e4e. +// BtokenDenylist is a free data retrieval call binding the contract method 0x0e7eeb79. // -// Solidity: function btokenBlacklist(address btoken) view returns(bool blacklisted) -func (_ERC20Vault *ERC20VaultSession) BtokenBlacklist(btoken common.Address) (bool, error) { - return _ERC20Vault.Contract.BtokenBlacklist(&_ERC20Vault.CallOpts, btoken) +// Solidity: function btokenDenylist(address btoken) view returns(bool denied) +func (_ERC20Vault *ERC20VaultSession) BtokenDenylist(btoken common.Address) (bool, error) { + return _ERC20Vault.Contract.BtokenDenylist(&_ERC20Vault.CallOpts, btoken) } -// BtokenBlacklist is a free data retrieval call binding the contract method 0xcaec3e4e. +// BtokenDenylist is a free data retrieval call binding the contract method 0x0e7eeb79. // -// Solidity: function btokenBlacklist(address btoken) view returns(bool blacklisted) -func (_ERC20Vault *ERC20VaultCallerSession) BtokenBlacklist(btoken common.Address) (bool, error) { - return _ERC20Vault.Contract.BtokenBlacklist(&_ERC20Vault.CallOpts, btoken) +// Solidity: function btokenDenylist(address btoken) view returns(bool denied) +func (_ERC20Vault *ERC20VaultCallerSession) BtokenDenylist(btoken common.Address) (bool, error) { + return _ERC20Vault.Contract.BtokenDenylist(&_ERC20Vault.CallOpts, btoken) } // CanonicalToBridged is a free data retrieval call binding the contract method 0x67090ccf. @@ -2590,19 +2590,20 @@ func (it *ERC20VaultTokenSentIterator) Close() error { // ERC20VaultTokenSent represents a TokenSent event raised by the ERC20Vault contract. type ERC20VaultTokenSent struct { - MsgHash [32]byte - From common.Address - To common.Address - DestChainId uint64 - Ctoken common.Address - Token common.Address - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos + MsgHash [32]byte + From common.Address + To common.Address + CanonicalChainId uint64 + DestChainId uint64 + Ctoken common.Address + Token common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterTokenSent is a free log retrieval operation binding the contract event 0xeb8a69f21b7a981e25f90d9f1e2ab7fa5bdbfddbc0ac160344145fc5caa6ddd2. +// FilterTokenSent is a free log retrieval operation binding the contract event 0x256f5c87f6ab8d238ac244067613227eb6e2cd65299121135d4f778e8581e03d. // -// Solidity: event TokenSent(bytes32 indexed msgHash, address indexed from, address indexed to, uint64 destChainId, address ctoken, address token, uint256 amount) +// Solidity: event TokenSent(bytes32 indexed msgHash, address indexed from, address indexed to, uint64 canonicalChainId, uint64 destChainId, address ctoken, address token, uint256 amount) func (_ERC20Vault *ERC20VaultFilterer) FilterTokenSent(opts *bind.FilterOpts, msgHash [][32]byte, from []common.Address, to []common.Address) (*ERC20VaultTokenSentIterator, error) { var msgHashRule []interface{} @@ -2625,9 +2626,9 @@ func (_ERC20Vault *ERC20VaultFilterer) FilterTokenSent(opts *bind.FilterOpts, ms return &ERC20VaultTokenSentIterator{contract: _ERC20Vault.contract, event: "TokenSent", logs: logs, sub: sub}, nil } -// WatchTokenSent is a free log subscription operation binding the contract event 0xeb8a69f21b7a981e25f90d9f1e2ab7fa5bdbfddbc0ac160344145fc5caa6ddd2. +// WatchTokenSent is a free log subscription operation binding the contract event 0x256f5c87f6ab8d238ac244067613227eb6e2cd65299121135d4f778e8581e03d. // -// Solidity: event TokenSent(bytes32 indexed msgHash, address indexed from, address indexed to, uint64 destChainId, address ctoken, address token, uint256 amount) +// Solidity: event TokenSent(bytes32 indexed msgHash, address indexed from, address indexed to, uint64 canonicalChainId, uint64 destChainId, address ctoken, address token, uint256 amount) func (_ERC20Vault *ERC20VaultFilterer) WatchTokenSent(opts *bind.WatchOpts, sink chan<- *ERC20VaultTokenSent, msgHash [][32]byte, from []common.Address, to []common.Address) (event.Subscription, error) { var msgHashRule []interface{} @@ -2675,9 +2676,9 @@ func (_ERC20Vault *ERC20VaultFilterer) WatchTokenSent(opts *bind.WatchOpts, sink }), nil } -// ParseTokenSent is a log parse operation binding the contract event 0xeb8a69f21b7a981e25f90d9f1e2ab7fa5bdbfddbc0ac160344145fc5caa6ddd2. +// ParseTokenSent is a log parse operation binding the contract event 0x256f5c87f6ab8d238ac244067613227eb6e2cd65299121135d4f778e8581e03d. // -// Solidity: event TokenSent(bytes32 indexed msgHash, address indexed from, address indexed to, uint64 destChainId, address ctoken, address token, uint256 amount) +// Solidity: event TokenSent(bytes32 indexed msgHash, address indexed from, address indexed to, uint64 canonicalChainId, uint64 destChainId, address ctoken, address token, uint256 amount) func (_ERC20Vault *ERC20VaultFilterer) ParseTokenSent(log types.Log) (*ERC20VaultTokenSent, error) { event := new(ERC20VaultTokenSent) if err := _ERC20Vault.contract.UnpackLog(event, "TokenSent", log); err != nil { diff --git a/packages/relayer/bindings/erc721vault/ERC721Vault.go b/packages/relayer/bindings/erc721vault/ERC721Vault.go index e972df37ff2..3cf53e85f9d 100644 --- a/packages/relayer/bindings/erc721vault/ERC721Vault.go +++ b/packages/relayer/bindings/erc721vault/ERC721Vault.go @@ -58,7 +58,7 @@ type IBridgeMessage struct { // ERC721VaultMetaData contains all meta data concerning the ERC721Vault contract. var ERC721VaultMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onERC721Received\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"_op\",\"type\":\"tuple\",\"internalType\":\"structBaseNFTVault.BridgeTransferOp\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReleased\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onERC721Received\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"_op\",\"type\":\"tuple\",\"internalType\":\"structBaseNFTVault.BridgeTransferOp\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReleased\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // ERC721VaultABI is the input ABI used to generate the binding from. diff --git a/packages/relayer/bindings/quotamanager/QuotaManager.go b/packages/relayer/bindings/quotamanager/QuotaManager.go index 87a30a38535..e953f0e8769 100644 --- a/packages/relayer/bindings/quotamanager/QuotaManager.go +++ b/packages/relayer/bindings/quotamanager/QuotaManager.go @@ -31,7 +31,7 @@ var ( // QuotaManagerMetaData contains all meta data concerning the QuotaManager contract. var QuotaManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"availableQuota\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_leap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"consumeQuota\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_quotaPeriod\",\"type\":\"uint24\",\"internalType\":\"uint24\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quotaPeriod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint24\",\"internalType\":\"uint24\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"tokenQuota\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"updatedAt\",\"type\":\"uint48\",\"internalType\":\"uint48\"},{\"name\":\"quota\",\"type\":\"uint104\",\"internalType\":\"uint104\"},{\"name\":\"available\",\"type\":\"uint104\",\"internalType\":\"uint104\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateQuota\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_quota\",\"type\":\"uint104\",\"internalType\":\"uint104\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuotaUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldQuota\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newQuota\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"QM_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"QM_OUT_OF_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"availableQuota\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_leap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"consumeQuota\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_quotaPeriod\",\"type\":\"uint24\",\"internalType\":\"uint24\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quotaPeriod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint24\",\"internalType\":\"uint24\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setQuotaPeriod\",\"inputs\":[{\"name\":\"_quotaPeriod\",\"type\":\"uint24\",\"internalType\":\"uint24\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"tokenQuota\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"updatedAt\",\"type\":\"uint48\",\"internalType\":\"uint48\"},{\"name\":\"quota\",\"type\":\"uint104\",\"internalType\":\"uint104\"},{\"name\":\"available\",\"type\":\"uint104\",\"internalType\":\"uint104\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateQuota\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_quota\",\"type\":\"uint104\",\"internalType\":\"uint104\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuotaPeriodUpdated\",\"inputs\":[{\"name\":\"quotaPeriod\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuotaUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldQuota\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newQuota\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"QM_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"QM_OUT_OF_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // QuotaManagerABI is the input ABI used to generate the binding from. @@ -707,6 +707,27 @@ func (_QuotaManager *QuotaManagerTransactorSession) RenounceOwnership() (*types. return _QuotaManager.Contract.RenounceOwnership(&_QuotaManager.TransactOpts) } +// SetQuotaPeriod is a paid mutator transaction binding the contract method 0xb91d1651. +// +// Solidity: function setQuotaPeriod(uint24 _quotaPeriod) returns() +func (_QuotaManager *QuotaManagerTransactor) SetQuotaPeriod(opts *bind.TransactOpts, _quotaPeriod *big.Int) (*types.Transaction, error) { + return _QuotaManager.contract.Transact(opts, "setQuotaPeriod", _quotaPeriod) +} + +// SetQuotaPeriod is a paid mutator transaction binding the contract method 0xb91d1651. +// +// Solidity: function setQuotaPeriod(uint24 _quotaPeriod) returns() +func (_QuotaManager *QuotaManagerSession) SetQuotaPeriod(_quotaPeriod *big.Int) (*types.Transaction, error) { + return _QuotaManager.Contract.SetQuotaPeriod(&_QuotaManager.TransactOpts, _quotaPeriod) +} + +// SetQuotaPeriod is a paid mutator transaction binding the contract method 0xb91d1651. +// +// Solidity: function setQuotaPeriod(uint24 _quotaPeriod) returns() +func (_QuotaManager *QuotaManagerTransactorSession) SetQuotaPeriod(_quotaPeriod *big.Int) (*types.Transaction, error) { + return _QuotaManager.Contract.SetQuotaPeriod(&_QuotaManager.TransactOpts, _quotaPeriod) +} + // TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. // // Solidity: function transferOwnership(address newOwner) returns() @@ -1665,6 +1686,140 @@ func (_QuotaManager *QuotaManagerFilterer) ParsePaused(log types.Log) (*QuotaMan return event, nil } +// QuotaManagerQuotaPeriodUpdatedIterator is returned from FilterQuotaPeriodUpdated and is used to iterate over the raw logs and unpacked data for QuotaPeriodUpdated events raised by the QuotaManager contract. +type QuotaManagerQuotaPeriodUpdatedIterator struct { + Event *QuotaManagerQuotaPeriodUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *QuotaManagerQuotaPeriodUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(QuotaManagerQuotaPeriodUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(QuotaManagerQuotaPeriodUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *QuotaManagerQuotaPeriodUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *QuotaManagerQuotaPeriodUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// QuotaManagerQuotaPeriodUpdated represents a QuotaPeriodUpdated event raised by the QuotaManager contract. +type QuotaManagerQuotaPeriodUpdated struct { + QuotaPeriod *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterQuotaPeriodUpdated is a free log retrieval operation binding the contract event 0x714cf57ffe172b008fcbb807b801535a5edc28672cff603865d82fc2708287ba. +// +// Solidity: event QuotaPeriodUpdated(uint256 quotaPeriod) +func (_QuotaManager *QuotaManagerFilterer) FilterQuotaPeriodUpdated(opts *bind.FilterOpts) (*QuotaManagerQuotaPeriodUpdatedIterator, error) { + + logs, sub, err := _QuotaManager.contract.FilterLogs(opts, "QuotaPeriodUpdated") + if err != nil { + return nil, err + } + return &QuotaManagerQuotaPeriodUpdatedIterator{contract: _QuotaManager.contract, event: "QuotaPeriodUpdated", logs: logs, sub: sub}, nil +} + +// WatchQuotaPeriodUpdated is a free log subscription operation binding the contract event 0x714cf57ffe172b008fcbb807b801535a5edc28672cff603865d82fc2708287ba. +// +// Solidity: event QuotaPeriodUpdated(uint256 quotaPeriod) +func (_QuotaManager *QuotaManagerFilterer) WatchQuotaPeriodUpdated(opts *bind.WatchOpts, sink chan<- *QuotaManagerQuotaPeriodUpdated) (event.Subscription, error) { + + logs, sub, err := _QuotaManager.contract.WatchLogs(opts, "QuotaPeriodUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(QuotaManagerQuotaPeriodUpdated) + if err := _QuotaManager.contract.UnpackLog(event, "QuotaPeriodUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseQuotaPeriodUpdated is a log parse operation binding the contract event 0x714cf57ffe172b008fcbb807b801535a5edc28672cff603865d82fc2708287ba. +// +// Solidity: event QuotaPeriodUpdated(uint256 quotaPeriod) +func (_QuotaManager *QuotaManagerFilterer) ParseQuotaPeriodUpdated(log types.Log) (*QuotaManagerQuotaPeriodUpdated, error) { + event := new(QuotaManagerQuotaPeriodUpdated) + if err := _QuotaManager.contract.UnpackLog(event, "QuotaPeriodUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // QuotaManagerQuotaUpdatedIterator is returned from FilterQuotaUpdated and is used to iterate over the raw logs and unpacked data for QuotaUpdated events raised by the QuotaManager contract. type QuotaManagerQuotaUpdatedIterator struct { Event *QuotaManagerQuotaUpdated // Event containing the contract specifics and raw log diff --git a/packages/relayer/bindings/taikol1/TaikoL1.go b/packages/relayer/bindings/taikol1/TaikoL1.go index 6aa08ced8a5..0ca11edfd8f 100644 --- a/packages/relayer/bindings/taikol1/TaikoL1.go +++ b/packages/relayer/bindings/taikol1/TaikoL1.go @@ -61,13 +61,14 @@ type TaikoDataBlockMetadata struct { // TaikoDataConfig is an auto generated low-level Go binding around an user-defined struct. type TaikoDataConfig struct { - ChainId uint64 - BlockMaxProposals uint64 - BlockRingBufferSize uint64 - MaxBlocksToVerifyPerProposal uint64 - BlockMaxGasLimit uint32 - LivenessBond *big.Int - BlockSyncThreshold uint8 + ChainId uint64 + BlockMaxProposals uint64 + BlockRingBufferSize uint64 + MaxBlocksToVerify uint64 + BlockMaxGasLimit uint32 + LivenessBond *big.Int + StateRootSyncInternal uint8 + CheckEOAForCalldataDA bool } // TaikoDataEthDeposit is an auto generated low-level Go binding around an user-defined struct. @@ -120,7 +121,7 @@ type TaikoDataTransitionState struct { // TaikoL1MetaData contains all meta data concerning the TaikoL1 contract. var TaikoL1MetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerifyPerProposal\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockSyncThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_tid\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_toPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resetGenesisHash\",\"inputs\":[{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slotA\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slotB\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"stateRootSyncInternal\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"checkEOAForCalldataDA\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"blockId_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"blockId_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_tid\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_toPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CalldataTxList\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"txList\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CalldataTxList\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"txList\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BATCH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BATCH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NO_HOOKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // TaikoL1ABI is the input ABI used to generate the binding from. @@ -333,7 +334,7 @@ func (_TaikoL1 *TaikoL1CallerSession) GetBlock(_blockId uint64) (TaikoDataBlock, // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,bool)) func (_TaikoL1 *TaikoL1Caller) GetConfig(opts *bind.CallOpts) (TaikoDataConfig, error) { var out []interface{} err := _TaikoL1.contract.Call(opts, &out, "getConfig") @@ -350,18 +351,118 @@ func (_TaikoL1 *TaikoL1Caller) GetConfig(opts *bind.CallOpts) (TaikoDataConfig, // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,bool)) func (_TaikoL1 *TaikoL1Session) GetConfig() (TaikoDataConfig, error) { return _TaikoL1.Contract.GetConfig(&_TaikoL1.CallOpts) } // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,bool)) func (_TaikoL1 *TaikoL1CallerSession) GetConfig() (TaikoDataConfig, error) { return _TaikoL1.Contract.GetConfig(&_TaikoL1.CallOpts) } +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_) +func (_TaikoL1 *TaikoL1Caller) GetLastSyncedBlock(opts *bind.CallOpts) (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte +}, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getLastSyncedBlock") + + outstruct := new(struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + }) + if err != nil { + return *outstruct, err + } + + outstruct.BlockId = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.BlockHash = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.StateRoot = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) + + return *outstruct, err + +} + +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_) +func (_TaikoL1 *TaikoL1Session) GetLastSyncedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte +}, error) { + return _TaikoL1.Contract.GetLastSyncedBlock(&_TaikoL1.CallOpts) +} + +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_) +func (_TaikoL1 *TaikoL1CallerSession) GetLastSyncedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte +}, error) { + return _TaikoL1.Contract.GetLastSyncedBlock(&_TaikoL1.CallOpts) +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_) +func (_TaikoL1 *TaikoL1Caller) GetLastVerifiedBlock(opts *bind.CallOpts) (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte +}, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getLastVerifiedBlock") + + outstruct := new(struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + }) + if err != nil { + return *outstruct, err + } + + outstruct.BlockId = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.BlockHash = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.StateRoot = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) + + return *outstruct, err + +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_) +func (_TaikoL1 *TaikoL1Session) GetLastVerifiedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte +}, error) { + return _TaikoL1.Contract.GetLastVerifiedBlock(&_TaikoL1.CallOpts) +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_) +func (_TaikoL1 *TaikoL1CallerSession) GetLastVerifiedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte +}, error) { + return _TaikoL1.Contract.GetLastVerifiedBlock(&_TaikoL1.CallOpts) +} + // GetStateVariables is a free data retrieval call binding the contract method 0xdde89cf5. // // Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint8,uint16,uint32,uint64)) @@ -735,68 +836,6 @@ func (_TaikoL1 *TaikoL1CallerSession) Resolve0(_name [32]byte, _allowZeroAddress return _TaikoL1.Contract.Resolve0(&_TaikoL1.CallOpts, _name, _allowZeroAddress) } -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1 *TaikoL1Caller) SlotA(opts *bind.CallOpts) (TaikoDataSlotA, error) { - var out []interface{} - err := _TaikoL1.contract.Call(opts, &out, "slotA") - - if err != nil { - return *new(TaikoDataSlotA), err - } - - out0 := *abi.ConvertType(out[0], new(TaikoDataSlotA)).(*TaikoDataSlotA) - - return out0, err - -} - -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1 *TaikoL1Session) SlotA() (TaikoDataSlotA, error) { - return _TaikoL1.Contract.SlotA(&_TaikoL1.CallOpts) -} - -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1 *TaikoL1CallerSession) SlotA() (TaikoDataSlotA, error) { - return _TaikoL1.Contract.SlotA(&_TaikoL1.CallOpts) -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1 *TaikoL1Caller) SlotB(opts *bind.CallOpts) (TaikoDataSlotB, error) { - var out []interface{} - err := _TaikoL1.contract.Call(opts, &out, "slotB") - - if err != nil { - return *new(TaikoDataSlotB), err - } - - out0 := *abi.ConvertType(out[0], new(TaikoDataSlotB)).(*TaikoDataSlotB) - - return out0, err - -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1 *TaikoL1Session) SlotB() (TaikoDataSlotB, error) { - return _TaikoL1.Contract.SlotB(&_TaikoL1.CallOpts) -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1 *TaikoL1CallerSession) SlotB() (TaikoDataSlotB, error) { - return _TaikoL1.Contract.SlotB(&_TaikoL1.CallOpts) -} - // State is a free data retrieval call binding the contract method 0xc19d93fb. // // Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) @@ -1015,27 +1054,6 @@ func (_TaikoL1 *TaikoL1TransactorSession) RenounceOwnership() (*types.Transactio return _TaikoL1.Contract.RenounceOwnership(&_TaikoL1.TransactOpts) } -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1 *TaikoL1Transactor) ResetGenesisHash(opts *bind.TransactOpts, _genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1.contract.Transact(opts, "resetGenesisHash", _genesisBlockHash) -} - -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1 *TaikoL1Session) ResetGenesisHash(_genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1.Contract.ResetGenesisHash(&_TaikoL1.TransactOpts, _genesisBlockHash) -} - -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1 *TaikoL1TransactorSession) ResetGenesisHash(_genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1.Contract.ResetGenesisHash(&_TaikoL1.TransactOpts, _genesisBlockHash) -} - // TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. // // Solidity: function transferOwnership(address newOwner) returns() @@ -2065,6 +2083,296 @@ func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerified0(log types.Log) (*TaikoL1Blo return event, nil } +// TaikoL1CalldataTxListIterator is returned from FilterCalldataTxList and is used to iterate over the raw logs and unpacked data for CalldataTxList events raised by the TaikoL1 contract. +type TaikoL1CalldataTxListIterator struct { + Event *TaikoL1CalldataTxList // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1CalldataTxListIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1CalldataTxList) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1CalldataTxList) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1CalldataTxListIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1CalldataTxListIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1CalldataTxList represents a CalldataTxList event raised by the TaikoL1 contract. +type TaikoL1CalldataTxList struct { + BlockId *big.Int + TxList []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCalldataTxList is a free log retrieval operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) FilterCalldataTxList(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1CalldataTxListIterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "CalldataTxList", blockIdRule) + if err != nil { + return nil, err + } + return &TaikoL1CalldataTxListIterator{contract: _TaikoL1.contract, event: "CalldataTxList", logs: logs, sub: sub}, nil +} + +// WatchCalldataTxList is a free log subscription operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) WatchCalldataTxList(opts *bind.WatchOpts, sink chan<- *TaikoL1CalldataTxList, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "CalldataTxList", blockIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1CalldataTxList) + if err := _TaikoL1.contract.UnpackLog(event, "CalldataTxList", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCalldataTxList is a log parse operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) ParseCalldataTxList(log types.Log) (*TaikoL1CalldataTxList, error) { + event := new(TaikoL1CalldataTxList) + if err := _TaikoL1.contract.UnpackLog(event, "CalldataTxList", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1CalldataTxList0Iterator is returned from FilterCalldataTxList0 and is used to iterate over the raw logs and unpacked data for CalldataTxList0 events raised by the TaikoL1 contract. +type TaikoL1CalldataTxList0Iterator struct { + Event *TaikoL1CalldataTxList0 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1CalldataTxList0Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1CalldataTxList0) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1CalldataTxList0) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1CalldataTxList0Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1CalldataTxList0Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1CalldataTxList0 represents a CalldataTxList0 event raised by the TaikoL1 contract. +type TaikoL1CalldataTxList0 struct { + BlockId *big.Int + TxList []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCalldataTxList0 is a free log retrieval operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) FilterCalldataTxList0(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1CalldataTxList0Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "CalldataTxList0", blockIdRule) + if err != nil { + return nil, err + } + return &TaikoL1CalldataTxList0Iterator{contract: _TaikoL1.contract, event: "CalldataTxList0", logs: logs, sub: sub}, nil +} + +// WatchCalldataTxList0 is a free log subscription operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) WatchCalldataTxList0(opts *bind.WatchOpts, sink chan<- *TaikoL1CalldataTxList0, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "CalldataTxList0", blockIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1CalldataTxList0) + if err := _TaikoL1.contract.UnpackLog(event, "CalldataTxList0", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCalldataTxList0 is a log parse operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) ParseCalldataTxList0(log types.Log) (*TaikoL1CalldataTxList0, error) { + event := new(TaikoL1CalldataTxList0) + if err := _TaikoL1.contract.UnpackLog(event, "CalldataTxList0", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // TaikoL1InitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the TaikoL1 contract. type TaikoL1InitializedIterator struct { Event *TaikoL1Initialized // Event containing the contract specifics and raw log @@ -3041,140 +3349,6 @@ func (_TaikoL1 *TaikoL1Filterer) ParseStateVariablesUpdated(log types.Log) (*Tai return event, nil } -// TaikoL1StateVariablesUpdated0Iterator is returned from FilterStateVariablesUpdated0 and is used to iterate over the raw logs and unpacked data for StateVariablesUpdated0 events raised by the TaikoL1 contract. -type TaikoL1StateVariablesUpdated0Iterator struct { - Event *TaikoL1StateVariablesUpdated0 // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *TaikoL1StateVariablesUpdated0Iterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(TaikoL1StateVariablesUpdated0) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(TaikoL1StateVariablesUpdated0) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1StateVariablesUpdated0Iterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *TaikoL1StateVariablesUpdated0Iterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// TaikoL1StateVariablesUpdated0 represents a StateVariablesUpdated0 event raised by the TaikoL1 contract. -type TaikoL1StateVariablesUpdated0 struct { - SlotB TaikoDataSlotB - Raw types.Log // Blockchain specific contextual infos -} - -// FilterStateVariablesUpdated0 is a free log retrieval operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1 *TaikoL1Filterer) FilterStateVariablesUpdated0(opts *bind.FilterOpts) (*TaikoL1StateVariablesUpdated0Iterator, error) { - - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "StateVariablesUpdated0") - if err != nil { - return nil, err - } - return &TaikoL1StateVariablesUpdated0Iterator{contract: _TaikoL1.contract, event: "StateVariablesUpdated0", logs: logs, sub: sub}, nil -} - -// WatchStateVariablesUpdated0 is a free log subscription operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1 *TaikoL1Filterer) WatchStateVariablesUpdated0(opts *bind.WatchOpts, sink chan<- *TaikoL1StateVariablesUpdated0) (event.Subscription, error) { - - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "StateVariablesUpdated0") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(TaikoL1StateVariablesUpdated0) - if err := _TaikoL1.contract.UnpackLog(event, "StateVariablesUpdated0", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseStateVariablesUpdated0 is a log parse operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1 *TaikoL1Filterer) ParseStateVariablesUpdated0(log types.Log) (*TaikoL1StateVariablesUpdated0, error) { - event := new(TaikoL1StateVariablesUpdated0) - if err := _TaikoL1.contract.UnpackLog(event, "StateVariablesUpdated0", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // TaikoL1TransitionContestedIterator is returned from FilterTransitionContested and is used to iterate over the raw logs and unpacked data for TransitionContested events raised by the TaikoL1 contract. type TaikoL1TransitionContestedIterator struct { Event *TaikoL1TransitionContested // Event containing the contract specifics and raw log diff --git a/packages/relayer/bridge/bridge.go b/packages/relayer/bridge/bridge.go index bcfc22e603d..7c60ace3337 100644 --- a/packages/relayer/bridge/bridge.go +++ b/packages/relayer/bridge/bridge.go @@ -45,15 +45,13 @@ type Bridge struct { srcBridge relayer.Bridge destBridge relayer.Bridge - mu *sync.Mutex - addr common.Address backOffRetryInterval time.Duration backOffMaxRetries uint64 ethClientTimeout time.Duration - wg *sync.WaitGroup + wg sync.WaitGroup srcChainId *big.Int destChainId *big.Int @@ -121,9 +119,6 @@ func InitFromConfig(ctx context.Context, b *Bridge, cfg *Config) error { b.srcChainId = srcChainID b.destChainId = destChainID - b.wg = &sync.WaitGroup{} - b.mu = &sync.Mutex{} - b.backOffRetryInterval = time.Duration(cfg.BackoffRetryInterval) * time.Second b.backOffMaxRetries = cfg.BackOffMaxRetrys b.ethClientTimeout = time.Duration(cfg.ETHClientTimeout) * time.Second diff --git a/packages/relayer/cmd/flags/common.go b/packages/relayer/cmd/flags/common.go index c56cbdd31da..30eb6d87beb 100644 --- a/packages/relayer/cmd/flags/common.go +++ b/packages/relayer/cmd/flags/common.go @@ -105,12 +105,14 @@ var ( Usage: "Retry interval in seconds when there is an error", Category: processorCategory, Value: 12, + EnvVars: []string{"BACKOFF_RETRY_INTERVAL"}, } BackOffMaxRetrys = &cli.Uint64Flag{ Name: "backoff.maxRetrys", Usage: "Max retry times when there is an error", Category: processorCategory, - Value: 3, + Value: 5, + EnvVars: []string{"BACKOFF_MAX_RETRYS"}, } ) diff --git a/packages/relayer/cmd/flags/indexer.go b/packages/relayer/cmd/flags/indexer.go index 45eb322c047..4ca08198afe 100644 --- a/packages/relayer/cmd/flags/indexer.go +++ b/packages/relayer/cmd/flags/indexer.go @@ -1,6 +1,8 @@ package flags import ( + "time" + "github.com/urfave/cli/v2" ) @@ -69,12 +71,23 @@ var ( Category: indexerCategory, EnvVars: []string{"SRC_TAIKO_ADDRESS"}, } - NumLatestBlocksToIgnoreWhenCrawling = &cli.Uint64Flag{ - Name: "numLatestBlocksToIgnoreWhenCrawling", - Usage: "Number of blocks to ignore when crawling chain, should be higher for L2-L1 indexing due to delay", - Value: 1000, + NumLatestBlocksEndWhenCrawling = &cli.Uint64Flag{ + Name: "numLatestBlocksEndWhenCrawling", + Usage: `Number of blocks to ignore from the end when crawling chain, + should be higher for L2-L1 indexing due to delay + `, + Value: 300, + Category: indexerCategory, + EnvVars: []string{"NUM_LATEST_BLOCKS_END_WHEN_CRAWLING"}, + } + NumLatestBlocksStartWhenCrawling = &cli.Uint64Flag{ + Name: "numLatestBlocksStartWhenCrawling", + Usage: `Number of latest blocks to index from the start when crawling chain. + The default value is to cover past 7 days. + `, + Value: 50400, Category: indexerCategory, - EnvVars: []string{"NUM_LATEST_BLOCKS_TO_IGNORE_WHEN_CRAWLING"}, + EnvVars: []string{"NUM_LATEST_BLOCKS_START_WHEN_CRAWLING"}, } EventName = &cli.StringFlag{ Name: "event", @@ -89,6 +102,27 @@ var ( Category: indexerCategory, EnvVars: []string{"TARGET_BLOCK_NUMBER"}, } + MinFeeToIndex = &cli.Uint64Flag{ + Name: "minFeeToIndex", + Usage: "Minimum fee to index and add to the queue (will still be saved to database)", + Category: indexerCategory, + Value: 0, + EnvVars: []string{"MIN_FEE_TO_INDEX"}, + } + WaitForConfirmationTimeout = &cli.DurationFlag{ + Name: "waitForConfirmationTimeout", + Usage: "Timeout waiting for confirmations", + Value: 5 * time.Minute, + Category: indexerCategory, + EnvVars: []string{"WAIT_FOR_CONFIRMATION_TIMEOUT"}, + } + IndexingConfirmations = &cli.Uint64Flag{ + Name: "confirmations", + Usage: "Confirmations to wait for on source chain before indexing an event", + Value: 1, + Category: indexerCategory, + EnvVars: []string{"CONFIRMATIONS_BEFORE_INDEXING"}, + } ) var IndexerFlags = MergeFlags(CommonFlags, QueueFlags, []cli.Flag{ @@ -101,7 +135,11 @@ var IndexerFlags = MergeFlags(CommonFlags, QueueFlags, []cli.Flag{ SubscriptionBackoff, SyncMode, WatchMode, - NumLatestBlocksToIgnoreWhenCrawling, + NumLatestBlocksEndWhenCrawling, + NumLatestBlocksStartWhenCrawling, EventName, + MinFeeToIndex, TargetBlockNumber, + WaitForConfirmationTimeout, + IndexingConfirmations, }) diff --git a/packages/relayer/cmd/flags/processor.go b/packages/relayer/cmd/flags/processor.go index 17bc5e5d7c7..2005681a068 100644 --- a/packages/relayer/cmd/flags/processor.go +++ b/packages/relayer/cmd/flags/processor.go @@ -143,6 +143,13 @@ var ( Required: false, EnvVars: []string{"DEST_QUOTA_MANAGER_ADDRESS"}, } + MinFeeToProcess = &cli.Uint64Flag{ + Name: "minFeeToProcess", + Usage: "Minimum fee to process", + Category: processorCategory, + Value: 0, + EnvVars: []string{"MIN_FEE_TO_PROCESS"}, + } ) var ProcessorFlags = MergeFlags(CommonFlags, QueueFlags, TxmgrFlags, []cli.Flag{ @@ -166,5 +173,6 @@ var ProcessorFlags = MergeFlags(CommonFlags, QueueFlags, TxmgrFlags, []cli.Flag{ CacheOption, UnprofitableMessageQueueExpiration, MaxMessageRetries, + MinFeeToProcess, DestQuotaManagerAddress, }) diff --git a/packages/relayer/db.go b/packages/relayer/db.go deleted file mode 100644 index 02798e0e236..00000000000 --- a/packages/relayer/db.go +++ /dev/null @@ -1,28 +0,0 @@ -package relayer - -import ( - "database/sql" - - "github.com/cyberhorsey/errors" - "gorm.io/gorm" -) - -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") -) - -type DBConnectionOpts struct { - Name string - Password string - Host string - Database string - MaxIdleConns uint64 - MaxOpenConns uint64 - MaxConnLifetime uint64 - OpenFunc func(dsn string) (DB, error) -} - -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} diff --git a/packages/relayer/docs/docs.go b/packages/relayer/docs/docs.go index 622106df9d1..dde35e98426 100644 --- a/packages/relayer/docs/docs.go +++ b/packages/relayer/docs/docs.go @@ -17,7 +17,7 @@ const docTemplate = `{ }, "license": { "name": "MIT", - "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md" + "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE" }, "version": "{{.Version}}" }, diff --git a/packages/relayer/docs/swagger.json b/packages/relayer/docs/swagger.json index 028b3a5e083..42ff334167b 100644 --- a/packages/relayer/docs/swagger.json +++ b/packages/relayer/docs/swagger.json @@ -10,7 +10,7 @@ }, "license": { "name": "MIT", - "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md" + "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE" }, "version": "1.0" }, diff --git a/packages/relayer/docs/swagger.yaml b/packages/relayer/docs/swagger.yaml index 8e35602519f..1760c3aab6f 100644 --- a/packages/relayer/docs/swagger.yaml +++ b/packages/relayer/docs/swagger.yaml @@ -47,7 +47,7 @@ info: url: https://community.taiko.xyz/ license: name: MIT - url: https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md + url: https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE termsOfService: http://swagger.io/terms/ title: Taiko Bridge Relayer API version: "1.0" diff --git a/packages/relayer/event.go b/packages/relayer/event.go index c9c0092d98d..2389c40de91 100644 --- a/packages/relayer/event.go +++ b/packages/relayer/event.go @@ -4,6 +4,7 @@ import ( "context" "math/big" "net/http" + "time" "github.com/ethereum/go-ethereum/common" "github.com/morkid/paginate" @@ -51,27 +52,36 @@ func (e EventType) String() string { // into the Data field to be unmarshalled into a concrete struct // dependant on the name of the event type Event struct { - ID int `json:"id"` - Name string `json:"name"` - Data datatypes.JSON `json:"data"` - Status EventStatus `json:"status"` - EventType EventType `json:"eventType"` - ChainID int64 `json:"chainID"` - DestChainID int64 `json:"destChainID"` - SyncedChainID uint64 `json:"syncedChainID"` - EmittedBlockID uint64 `json:"emittedBlockID"` - BlockID uint64 `json:"blockID"` - SyncedInBlockID uint64 `json:"syncedInBlockID"` - SyncData string `json:"syncData"` - Kind string `json:"kind"` - CanonicalTokenAddress string `json:"canonicalTokenAddress"` - CanonicalTokenSymbol string `json:"canonicalTokenSymbol"` - CanonicalTokenName string `json:"canonicalTokenName"` - CanonicalTokenDecimals uint8 `json:"canonicalTokenDecimals"` - Amount string `json:"amount"` - MsgHash string `json:"msgHash"` - MessageOwner string `json:"messageOwner"` - Event string `json:"event"` + ID int `json:"id"` + Name string `json:"name"` + Data datatypes.JSON `json:"data"` + Status EventStatus `json:"status"` + EventType EventType `json:"eventType"` + ChainID int64 `json:"chainID"` + DestChainID int64 `json:"destChainID"` + SyncedChainID uint64 `json:"syncedChainID"` + EmittedBlockID uint64 `json:"emittedBlockID"` + BlockID uint64 `json:"blockID"` + SyncedInBlockID uint64 `json:"syncedInBlockID"` + SyncData string `json:"syncData"` + Kind string `json:"kind"` + CanonicalTokenAddress string `json:"canonicalTokenAddress"` + CanonicalTokenSymbol string `json:"canonicalTokenSymbol"` + CanonicalTokenName string `json:"canonicalTokenName"` + CanonicalTokenDecimals uint8 `json:"canonicalTokenDecimals"` + Amount string `json:"amount"` + MsgHash string `json:"msgHash"` + MessageOwner string `json:"messageOwner"` + Event string `json:"event"` + ClaimedBy string `json:"claimedBy" gorm:"-"` + ProcessedTxHash string `json:"processedTxHash" gorm:"-"` + Fee *uint64 `json:"fee"` + DestChainBaseFee *uint64 `json:"destChainBaseFee"` + GasTipCap *uint64 `json:"gasTipCap"` + GasLimit *uint64 `json:"gasLimit"` + IsProfitable *bool `json:"isProfitable"` + EstimatedOnchainFee *uint64 `json:"estimatedOnchainFee"` + IsProfitableEvaluatedAt *time.Time `json:"isProfitableEvaluatedAt"` } // SaveEventOpts @@ -98,6 +108,16 @@ type SaveEventOpts struct { SyncedInBlockID uint64 } +type UpdateFeesAndProfitabilityOpts struct { + Fee uint64 + DestChainBaseFee uint64 + GasTipCap uint64 + GasLimit uint64 + IsProfitable bool + EstimatedOnchainFee uint64 + IsProfitableEvaluatedAt time.Time +} + type FindAllByAddressOpts struct { Address common.Address EventType *EventType @@ -108,13 +128,15 @@ type FindAllByAddressOpts struct { // EventRepository is used to interact with events in the store type EventRepository interface { - Save(ctx context.Context, opts SaveEventOpts) (*Event, error) + Close() error + Save(ctx context.Context, opts *SaveEventOpts) (*Event, error) UpdateStatus(ctx context.Context, id int, status EventStatus) error + UpdateFeesAndProfitability(ctx context.Context, id int, opts *UpdateFeesAndProfitabilityOpts) error FindAllByAddress( ctx context.Context, req *http.Request, opts FindAllByAddressOpts, - ) (paginate.Page, error) + ) (*paginate.Page, error) FirstByMsgHash( ctx context.Context, msgHash string, @@ -138,6 +160,7 @@ type EventRepository interface { ) (uint64, error) DeleteAllAfterBlockID(blockID uint64, srcChainID uint64, destChainID uint64) error FindLatestBlockID( + ctx context.Context, event string, srcChainID uint64, destChainID uint64, diff --git a/packages/relayer/indexer/config.go b/packages/relayer/indexer/config.go index 39172cea167..9e313af5641 100644 --- a/packages/relayer/indexer/config.go +++ b/packages/relayer/indexer/config.go @@ -36,53 +36,61 @@ type Config struct { QueueHost string QueuePort uint64 // rpc configs - SrcRPCUrl string - DestRPCUrl string - ETHClientTimeout uint64 - BlockBatchSize uint64 - NumGoroutines uint64 - SubscriptionBackoff uint64 - SyncMode SyncMode - WatchMode WatchMode - NumLatestBlocksToIgnoreWhenCrawling uint64 - EventName string - TargetBlockNumber *uint64 - BackOffRetryInterval time.Duration - BackOffMaxRetries uint64 - OpenQueueFunc func() (queue.Queue, error) - OpenDBFunc func() (DB, error) + SrcRPCUrl string + DestRPCUrl string + ETHClientTimeout uint64 + BlockBatchSize uint64 + NumGoroutines uint64 + SubscriptionBackoff uint64 + SyncMode SyncMode + WatchMode WatchMode + NumLatestBlocksEndWhenCrawling uint64 + NumLatestBlocksStartWhenCrawling uint64 + EventName string + TargetBlockNumber *uint64 + BackOffRetryInterval time.Duration + BackOffMaxRetries uint64 + MinFeeToIndex uint64 + OpenQueueFunc func() (queue.Queue, error) + OpenDBFunc func() (db.DB, error) + ConfirmationTimeout time.Duration + Confirmations uint64 } // NewConfigFromCliContext creates a new config instance from command line flags. func NewConfigFromCliContext(c *cli.Context) (*Config, error) { return &Config{ - SrcBridgeAddress: common.HexToAddress(c.String(flags.SrcBridgeAddress.Name)), - SrcTaikoAddress: common.HexToAddress(c.String(flags.SrcTaikoAddress.Name)), - SrcSignalServiceAddress: common.HexToAddress(c.String(flags.SrcSignalServiceAddress.Name)), - DestBridgeAddress: common.HexToAddress(c.String(flags.DestBridgeAddress.Name)), - DatabaseUsername: c.String(flags.DatabaseUsername.Name), - DatabasePassword: c.String(flags.DatabasePassword.Name), - DatabaseName: c.String(flags.DatabaseName.Name), - DatabaseHost: c.String(flags.DatabaseHost.Name), - DatabaseMaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), - DatabaseMaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), - DatabaseMaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - QueueUsername: c.String(flags.QueueUsername.Name), - QueuePassword: c.String(flags.QueuePassword.Name), - QueuePort: c.Uint64(flags.QueuePort.Name), - QueueHost: c.String(flags.QueueHost.Name), - SrcRPCUrl: c.String(flags.SrcRPCUrl.Name), - DestRPCUrl: c.String(flags.DestRPCUrl.Name), - BlockBatchSize: c.Uint64(flags.BlockBatchSize.Name), - NumGoroutines: c.Uint64(flags.MaxNumGoroutines.Name), - SubscriptionBackoff: c.Uint64(flags.SubscriptionBackoff.Name), - WatchMode: WatchMode(c.String(flags.WatchMode.Name)), - SyncMode: SyncMode(c.String(flags.SyncMode.Name)), - ETHClientTimeout: c.Uint64(flags.ETHClientTimeout.Name), - NumLatestBlocksToIgnoreWhenCrawling: c.Uint64(flags.NumLatestBlocksToIgnoreWhenCrawling.Name), - EventName: c.String(flags.EventName.Name), - BackOffMaxRetries: c.Uint64(flags.BackOffMaxRetrys.Name), - BackOffRetryInterval: c.Duration(flags.BackOffRetryInterval.Name), + SrcBridgeAddress: common.HexToAddress(c.String(flags.SrcBridgeAddress.Name)), + SrcTaikoAddress: common.HexToAddress(c.String(flags.SrcTaikoAddress.Name)), + SrcSignalServiceAddress: common.HexToAddress(c.String(flags.SrcSignalServiceAddress.Name)), + DestBridgeAddress: common.HexToAddress(c.String(flags.DestBridgeAddress.Name)), + DatabaseUsername: c.String(flags.DatabaseUsername.Name), + DatabasePassword: c.String(flags.DatabasePassword.Name), + DatabaseName: c.String(flags.DatabaseName.Name), + DatabaseHost: c.String(flags.DatabaseHost.Name), + DatabaseMaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), + DatabaseMaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), + DatabaseMaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), + QueueUsername: c.String(flags.QueueUsername.Name), + QueuePassword: c.String(flags.QueuePassword.Name), + QueuePort: c.Uint64(flags.QueuePort.Name), + QueueHost: c.String(flags.QueueHost.Name), + SrcRPCUrl: c.String(flags.SrcRPCUrl.Name), + DestRPCUrl: c.String(flags.DestRPCUrl.Name), + BlockBatchSize: c.Uint64(flags.BlockBatchSize.Name), + NumGoroutines: c.Uint64(flags.MaxNumGoroutines.Name), + SubscriptionBackoff: c.Uint64(flags.SubscriptionBackoff.Name), + WatchMode: WatchMode(c.String(flags.WatchMode.Name)), + SyncMode: SyncMode(c.String(flags.SyncMode.Name)), + ETHClientTimeout: c.Uint64(flags.ETHClientTimeout.Name), + NumLatestBlocksEndWhenCrawling: c.Uint64(flags.NumLatestBlocksEndWhenCrawling.Name), + NumLatestBlocksStartWhenCrawling: c.Uint64(flags.NumLatestBlocksStartWhenCrawling.Name), + EventName: c.String(flags.EventName.Name), + BackOffMaxRetries: c.Uint64(flags.BackOffMaxRetrys.Name), + BackOffRetryInterval: c.Duration(flags.BackOffRetryInterval.Name), + MinFeeToIndex: c.Uint64(flags.MinFeeToIndex.Name), + ConfirmationTimeout: c.Duration(flags.WaitForConfirmationTimeout.Name), + Confirmations: c.Uint64(flags.IndexingConfirmations.Name), TargetBlockNumber: func() *uint64 { if c.IsSet(flags.TargetBlockNumber.Name) { value := c.Uint64(flags.TargetBlockNumber.Name) @@ -90,7 +98,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { } return nil }(), - OpenDBFunc: func() (DB, error) { + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -99,7 +107,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (db.DB, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/relayer/indexer/config_test.go b/packages/relayer/indexer/config_test.go index cb10cd313a4..fab17163b88 100644 --- a/packages/relayer/indexer/config_test.go +++ b/packages/relayer/indexer/config_test.go @@ -5,11 +5,13 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" + "github.com/urfave/cli/v2" + "github.com/taikoxyz/taiko-mono/packages/relayer" "github.com/taikoxyz/taiko-mono/packages/relayer/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/mock" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" - "github.com/urfave/cli/v2" ) var ( @@ -69,7 +71,7 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, WatchMode(watchMode), c.WatchMode) assert.Equal(t, eventName, c.EventName) - c.OpenDBFunc = func() (DB, error) { + c.OpenDBFunc = func() (db.DB, error) { return &mock.DB{}, nil } diff --git a/packages/relayer/indexer/handle_chain_data_synced_event.go b/packages/relayer/indexer/handle_chain_data_synced_event.go index ecd307cff0c..23b1b6d7c11 100644 --- a/packages/relayer/indexer/handle_chain_data_synced_event.go +++ b/packages/relayer/indexer/handle_chain_data_synced_event.go @@ -3,7 +3,6 @@ package indexer import ( "context" "encoding/json" - "math/big" "log/slog" @@ -16,7 +15,6 @@ import ( // handleChainDataSyncedEvent handles an individual ChainDataSynced event func (i *Indexer) handleChainDataSyncedEvent( ctx context.Context, - chainID *big.Int, event *signalservice.SignalServiceChainDataSynced, waitForConfirmations bool, ) error { @@ -34,7 +32,7 @@ func (i *Indexer) handleChainDataSyncedEvent( // we need to wait for confirmations to confirm this event is not being reverted, // removed, or reorged now. - confCtx, confCtxCancel := context.WithTimeout(ctx, defaultCtxTimeout) + confCtx, confCtxCancel := context.WithTimeout(ctx, i.cfg.ConfirmationTimeout) defer confCtxCancel() @@ -42,7 +40,7 @@ func (i *Indexer) handleChainDataSyncedEvent( if err := relayer.WaitConfirmations( confCtx, i.srcEthClient, - uint64(defaultConfirmations), + i.confirmations, event.Raw.TxHash, ); err != nil { return err @@ -54,7 +52,7 @@ func (i *Indexer) handleChainDataSyncedEvent( return errors.Wrap(err, "json.Marshal(event)") } - opts := relayer.SaveEventOpts{ + _, err = i.eventRepo.Save(ctx, &relayer.SaveEventOpts{ Name: relayer.EventNameChainDataSynced, Event: relayer.EventNameChainDataSynced, Data: string(marshaled), @@ -67,14 +65,16 @@ func (i *Indexer) handleChainDataSyncedEvent( SyncData: common.BytesToHash(event.Data[:]).Hex(), Kind: common.BytesToHash(event.Kind[:]).Hex(), SyncedInBlockID: event.Raw.BlockNumber, - } - - _, err = i.eventRepo.Save(ctx, opts) + }) if err != nil { return errors.Wrap(err, "i.eventRepo.Save") } - slog.Info("chainDataSynced event saved") + slog.Info("chainDataSynced event saved", + "srcChainId", i.srcChainId, + "destChainId", i.destChainId, + "SyncedChainID", event.ChainId, + ) relayer.ChainDataSyncedEventsIndexed.Inc() diff --git a/packages/relayer/indexer/handle_message_processed_event.go b/packages/relayer/indexer/handle_message_processed_event.go index dd232374dcb..aab50ac4ebd 100644 --- a/packages/relayer/indexer/handle_message_processed_event.go +++ b/packages/relayer/indexer/handle_message_processed_event.go @@ -45,14 +45,14 @@ func (i *Indexer) handleMessageProcessedEvent( if waitForConfirmations { // we need to wait for confirmations to confirm this event is not being reverted, // removed, or reorged now. - confCtx, confCtxCancel := context.WithTimeout(ctx, defaultCtxTimeout) + confCtx, confCtxCancel := context.WithTimeout(ctx, i.cfg.ConfirmationTimeout) defer confCtxCancel() if err := relayer.WaitConfirmations( confCtx, i.srcEthClient, - uint64(defaultConfirmations), + i.confirmations, event.Raw.TxHash, ); err != nil { return err diff --git a/packages/relayer/indexer/handle_message_sent_event.go b/packages/relayer/indexer/handle_message_sent_event.go index d7d541baf88..e176e144b70 100644 --- a/packages/relayer/indexer/handle_message_sent_event.go +++ b/packages/relayer/indexer/handle_message_sent_event.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "math/big" - "time" "log/slog" @@ -16,11 +15,6 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" ) -var ( - defaultCtxTimeout = 3 * time.Minute - defaultConfirmations = 5 -) - // handleMessageSentEvent handles an individual MessageSent event func (i *Indexer) handleMessageSentEvent( ctx context.Context, @@ -56,14 +50,14 @@ func (i *Indexer) handleMessageSentEvent( if waitForConfirmations { // we need to wait for confirmations to confirm this event is not being reverted, // removed, or reorged now. - confCtx, confCtxCancel := context.WithTimeout(ctx, defaultCtxTimeout) + confCtx, confCtxCancel := context.WithTimeout(ctx, i.cfg.ConfirmationTimeout) defer confCtxCancel() if err := relayer.WaitConfirmations( confCtx, i.srcEthClient, - uint64(defaultConfirmations), + i.confirmations, event.Raw.TxHash, ); err != nil { return err @@ -101,6 +95,20 @@ func (i *Indexer) handleMessageSentEvent( return nil } + // we shouldnt add messages to the queue that will be determined + // unprocessable. + if event.Message.GasLimit == 0 { + slog.Warn("Zero gaslimit message found, will be unprocessable") + return nil + } + + if i.minFeeToIndex != 0 && event.Message.Fee < i.minFeeToIndex { + slog.Warn("Fee is less than minFeeToIndex, not adding to queue", + "fee", event.Message.Fee, + "minFeeToIndex", i.minFeeToIndex, + ) + } + msg := queue.QueueMessageSentBody{ ID: id, Event: event, diff --git a/packages/relayer/indexer/handle_message_status_changed_event.go b/packages/relayer/indexer/handle_message_status_changed_event.go index 4cf9ebffc04..df449e3a4f9 100644 --- a/packages/relayer/indexer/handle_message_status_changed_event.go +++ b/packages/relayer/indexer/handle_message_status_changed_event.go @@ -33,7 +33,7 @@ func (i *Indexer) handleMessageStatusChangedEvent( return nil } - _, err = i.eventRepo.Save(ctx, relayer.SaveEventOpts{ + _, err = i.eventRepo.Save(ctx, &relayer.SaveEventOpts{ Name: relayer.EventNameMessageStatusChanged, Data: string(marshaled), ChainID: chainID, diff --git a/packages/relayer/indexer/indexer.go b/packages/relayer/indexer/indexer.go index dfc0f36e89d..fd5cc8b2557 100644 --- a/packages/relayer/indexer/indexer.go +++ b/packages/relayer/indexer/indexer.go @@ -2,7 +2,6 @@ package indexer import ( "context" - "database/sql" "fmt" "log/slog" "math/big" @@ -17,6 +16,9 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" + "github.com/urfave/cli/v2" + "golang.org/x/sync/errgroup" + "github.com/taikoxyz/taiko-mono/packages/relayer" "github.com/taikoxyz/taiko-mono/packages/relayer/bindings/bridge" "github.com/taikoxyz/taiko-mono/packages/relayer/bindings/signalservice" @@ -24,9 +26,6 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/repo" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/utils" - "github.com/urfave/cli/v2" - "golang.org/x/sync/errgroup" - "gorm.io/gorm" ) var ( @@ -74,12 +73,6 @@ type ethClient interface { TransactionByHash(ctx context.Context, txHash common.Hash) (*types.Transaction, bool, error) } -// DB is a local interface that lets us narrow down a database type for testing. -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} - // Indexer is the main struct of this package, containing all dependencies necessary for indexing // relayer-related chain data. All database repositories, contract implementations, // and configurations will be injected here. @@ -114,19 +107,22 @@ type Indexer struct { ethClientTimeout time.Duration - wg *sync.WaitGroup + wg sync.WaitGroup - numLatestBlocksToIgnoreWhenCrawling uint64 + numLatestBlocksEndWhenCrawling uint64 + numLatestBlocksStartWhenCrawling uint64 targetBlockNumber *uint64 ctx context.Context - mu *sync.Mutex - eventName string + minFeeToIndex uint64 + cfg *Config + + confirmations uint64 } // InitFromCli inits a new Indexer from command line or environment variables. @@ -229,22 +225,25 @@ func InitFromConfig(ctx context.Context, i *Indexer, cfg *Config) (err error) { i.syncMode = cfg.SyncMode i.watchMode = cfg.WatchMode - i.wg = &sync.WaitGroup{} - i.ethClientTimeout = time.Duration(cfg.ETHClientTimeout) * time.Second - i.numLatestBlocksToIgnoreWhenCrawling = cfg.NumLatestBlocksToIgnoreWhenCrawling + i.numLatestBlocksEndWhenCrawling = cfg.NumLatestBlocksEndWhenCrawling + i.numLatestBlocksStartWhenCrawling = cfg.NumLatestBlocksStartWhenCrawling i.targetBlockNumber = cfg.TargetBlockNumber - i.mu = &sync.Mutex{} - i.eventName = cfg.EventName i.cfg = cfg + i.confirmations = cfg.Confirmations + i.ctx = ctx + i.minFeeToIndex = i.cfg.MinFeeToIndex + + slog.Info("minFeeToIndex", "minFeeToIndex", i.minFeeToIndex) + return nil } @@ -257,6 +256,11 @@ func (i *Indexer) Name() string { // context is stopped externally by cmd/main.go shutdown. func (i *Indexer) Close(ctx context.Context) { i.wg.Wait() + + // Close db connection. + if err := i.eventRepo.Close(); err != nil { + slog.Error("Failed to close db connection", "err", err) + } } // Start starts the indexer, which should initialize the queue, add to wait groups, @@ -274,17 +278,15 @@ func (i *Indexer) Start() error { } // set the initial processing block, which will vary by sync mode. - if err := i.setInitialIndexingBlockByMode(i.ctx, i.syncMode, i.srcChainId); err != nil { + if err := i.setInitialIndexingBlockByMode(i.syncMode, i.srcChainId); err != nil { return errors.Wrap(err, "i.setInitialIndexingBlockByMode") } - i.wg.Add(1) - - go i.eventLoop(i.ctx, i.latestIndexedBlockNumber) + go i.eventLoop(i.ctx) go func() { if err := backoff.Retry(func() error { - return utils.ScanBlocks(i.ctx, i.srcEthClient, i.wg) + return utils.ScanBlocks(i.ctx, i.srcEthClient, &i.wg) }, backoff.NewConstantBackOff(5*time.Second)); err != nil { slog.Error("scan blocks backoff retry", "error", err) } @@ -293,17 +295,11 @@ func (i *Indexer) Start() error { return nil } -func (i *Indexer) eventLoop(ctx context.Context, startBlockID uint64) { +func (i *Indexer) eventLoop(ctx context.Context) { + i.wg.Add(1) defer i.wg.Done() - var d time.Duration = 10 * time.Second - - if i.watchMode == CrawlPastBlocks { - d = 10 * time.Minute - } - - t := time.NewTicker(d) - + t := time.NewTicker(10 * time.Second) defer t.Stop() for { @@ -333,6 +329,15 @@ func (i *Indexer) filter(ctx context.Context) error { // ignore latest N blocks if we are crawling past blocks, they are probably in queue already // and are not "missed", have just not been processed. if i.watchMode == CrawlPastBlocks { + if i.numLatestBlocksEndWhenCrawling > i.numLatestBlocksStartWhenCrawling { + slog.Error("Invalid configuration", + "numLatestBlocksEndWhenCrawling", i.numLatestBlocksEndWhenCrawling, + "numLatestBlocksStartWhenCrawling", i.numLatestBlocksStartWhenCrawling, + ) + + return errors.New("numLatestBlocksStartWhenCrawling must be greater than numLatestBlocksEndWhenCrawling") + } + // if targetBlockNumber is not nil, we are just going to process a singular block. if i.targetBlockNumber != nil { slog.Info("targetBlockNumber is set", "targetBlockNumber", *i.targetBlockNumber) @@ -342,15 +347,19 @@ func (i *Indexer) filter(ctx context.Context) error { endBlockID = i.latestIndexedBlockNumber + 1 } else { // set the initial processing block back to either 0 or the genesis block again. - if err := i.setInitialIndexingBlockByMode(i.ctx, i.syncMode, i.srcChainId); err != nil { + if err := i.setInitialIndexingBlockByMode(i.syncMode, i.srcChainId); err != nil { return errors.Wrap(err, "i.setInitialIndexingBlockByMode") } - if endBlockID > i.numLatestBlocksToIgnoreWhenCrawling { + if i.latestIndexedBlockNumber < endBlockID-i.numLatestBlocksStartWhenCrawling { + i.latestIndexedBlockNumber = endBlockID - i.numLatestBlocksStartWhenCrawling + } + + if endBlockID > i.numLatestBlocksEndWhenCrawling { // otherwise, we need to set the endBlockID as the greater of the two: // either the endBlockID minus the number of latest blocks to ignore, // or endBlockID. - endBlockID -= i.numLatestBlocksToIgnoreWhenCrawling + endBlockID -= i.numLatestBlocksEndWhenCrawling } } } @@ -384,7 +393,9 @@ func (i *Indexer) filter(ctx context.Context) error { switch i.eventName { case relayer.EventNameMessageSent: if err := i.withRetry(func() error { return i.indexMessageSentEvents(ctx, filterOpts) }); err != nil { - return errors.Wrap(err, "i.indexMessageSentEvents") + // We will skip the error after retrying, as we want the indexer to continue. + slog.Error("i.indexMessageSentEvents", "error", err) + relayer.MessageSentEventsAfterRetryErrorCount.Inc() } // we dont want to watch for message status changed events @@ -393,17 +404,20 @@ func (i *Indexer) filter(ctx context.Context) error { // since they are related. if i.watchMode != CrawlPastBlocks { if err := i.withRetry(func() error { return i.indexMessageStatusChangedEvents(ctx, filterOpts) }); err != nil { - return errors.Wrap(err, "i.indexMessageStatusChangedEvents") + slog.Error("i.indexMessageStatusChangedEvents", "error", err) + relayer.MessageStatusChangedEventsAfterRetryErrorCount.Inc() } // we also want to index chain data synced events. if err := i.withRetry(func() error { return i.indexChainDataSyncedEvents(ctx, filterOpts) }); err != nil { - return errors.Wrap(err, "i.indexChainDataSyncedEvents") + slog.Error("i.indexChainDataSyncedEvents", "error", err) + relayer.ChainDataSyncedEventsAfterRetryErrorCount.Inc() } } case relayer.EventNameMessageProcessed: if err := i.withRetry(func() error { return i.indexMessageProcessedEvents(ctx, filterOpts) }); err != nil { - return errors.Wrap(err, "i.indexMessageProcessedEvents") + slog.Error("i.indexMessageProcessedEvents", "error", err) + relayer.MessageProcessedEventsAfterRetryErrorCount.Inc() } } @@ -462,7 +476,7 @@ func (i *Indexer) indexMessageSentEvents(ctx context.Context, } func (i *Indexer) checkReorg(ctx context.Context, emittedInBlockNumber uint64) error { - n, err := i.eventRepo.FindLatestBlockID(i.eventName, i.srcChainId.Uint64(), i.destChainId.Uint64()) + n, err := i.eventRepo.FindLatestBlockID(ctx, i.eventName, i.srcChainId.Uint64(), i.destChainId.Uint64()) if err != nil { return err } @@ -589,7 +603,7 @@ func (i *Indexer) indexChainDataSyncedEvents(ctx context.Context, event := chainDataSyncedEvents.Event group.Go(func() error { - err := i.handleChainDataSyncedEvent(ctx, i.srcChainId, event, true) + err := i.handleChainDataSyncedEvent(ctx, event, true) if err != nil { relayer.MessageStatusChangedEventsIndexingErrors.Inc() diff --git a/packages/relayer/indexer/indexer_test.go b/packages/relayer/indexer/indexer_test.go index ca5a150ab36..8af5555ca1d 100644 --- a/packages/relayer/indexer/indexer_test.go +++ b/packages/relayer/indexer/indexer_test.go @@ -2,7 +2,6 @@ package indexer import ( "context" - "sync" "time" "github.com/taikoxyz/taiko-mono/packages/relayer" @@ -28,15 +27,12 @@ func newTestService(syncMode SyncMode, watchMode WatchMode) (*Indexer, relayer.B syncMode: syncMode, watchMode: watchMode, - wg: &sync.WaitGroup{}, - ctx: context.Background(), srcChainId: mock.MockChainID, destChainId: mock.MockChainID, ethClientTimeout: 10 * time.Second, - mu: &sync.Mutex{}, eventName: relayer.EventNameMessageSent, }, b } diff --git a/packages/relayer/indexer/save_event_to_db.go b/packages/relayer/indexer/save_event_to_db.go index 0c15c0c57dc..08b485315a2 100644 --- a/packages/relayer/indexer/save_event_to_db.go +++ b/packages/relayer/indexer/save_event_to_db.go @@ -3,6 +3,7 @@ package indexer import ( "context" "fmt" + "log/slog" "math/big" "github.com/pkg/errors" @@ -23,7 +24,14 @@ func (i *Indexer) saveEventToDB( ) (int, error) { eventType, canonicalToken, amount, err := relayer.DecodeMessageData(eventData, eventValue) if err != nil { - return 0, errors.Wrap(err, "eventTypeAmountAndCanonicalTokenFromEvent(event)") + slog.Error("error decoding message data", "error", err.Error()) + + return 0, errors.Wrap(err, "relayer.DecodeMessageData") + } + + if eventType == relayer.EventTypeSendETH { + canonicalToken = nil + amount = eventValue } // check if we have an existing event already. this is mostly likely only true @@ -63,7 +71,7 @@ func (i *Indexer) saveEventToDB( opts.CanonicalTokenDecimals = canonicalToken.TokenDecimals() } - e, err := i.eventRepo.Save(ctx, opts) + e, err := i.eventRepo.Save(ctx, &opts) if err != nil { return 0, errors.Wrap(err, "svc.eventRepo.Save") } diff --git a/packages/relayer/indexer/set_initial_Indexing_block_by_mode.go b/packages/relayer/indexer/set_initial_Indexing_block_by_mode.go index 49b295deb4a..a556e7f3cd7 100644 --- a/packages/relayer/indexer/set_initial_Indexing_block_by_mode.go +++ b/packages/relayer/indexer/set_initial_Indexing_block_by_mode.go @@ -1,7 +1,6 @@ package indexer import ( - "context" "math/big" "github.com/pkg/errors" @@ -11,7 +10,6 @@ import ( // setInitialIndexingBlockByMode takes in a SyncMode and determines how we should // start our indexing func (i *Indexer) setInitialIndexingBlockByMode( - ctx context.Context, mode SyncMode, chainID *big.Int, ) error { @@ -30,6 +28,7 @@ func (i *Indexer) setInitialIndexingBlockByMode( case Sync: // get most recently processed block height from the DB latest, err := i.eventRepo.FindLatestBlockID( + i.ctx, i.eventName, chainID.Uint64(), i.destChainId.Uint64(), diff --git a/packages/relayer/indexer/set_initial_indexing_block_by_mode_test.go b/packages/relayer/indexer/set_initial_indexing_block_by_mode_test.go index 9806c5a7457..50fc51834f3 100644 --- a/packages/relayer/indexer/set_initial_indexing_block_by_mode_test.go +++ b/packages/relayer/indexer/set_initial_indexing_block_by_mode_test.go @@ -1,7 +1,6 @@ package indexer import ( - "context" "math/big" "testing" @@ -51,7 +50,6 @@ func Test_setInitialIndexingBlockByMode(t *testing.T) { t.Run(tt.name, func(t *testing.T) { svc, _ := newTestService(tt.mode, FilterAndSubscribe) err := svc.setInitialIndexingBlockByMode( - context.Background(), tt.mode, tt.chainID, ) diff --git a/packages/relayer/migrations/1708366667_alter_events_add_dest_owner.sql b/packages/relayer/migrations/1708366667_alter_events_add_dest_owner.sql new file mode 100644 index 00000000000..8ad5fec0d26 --- /dev/null +++ b/packages/relayer/migrations/1708366667_alter_events_add_dest_owner.sql @@ -0,0 +1,9 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `events` ADD COLUMN `dest_owner_json` VARCHAR(255) AS (JSON_UNQUOTE(JSON_EXTRACT(`data`, '$.Message.DestOwner'))) STORED; +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +ALTER TABLE `events` DROP COLUMN `dest_owner_json`; +-- +goose StatementEnd \ No newline at end of file diff --git a/packages/relayer/migrations/1708366668_index_data.sql b/packages/relayer/migrations/1708366668_index_data.sql new file mode 100644 index 00000000000..5dcd01f260c --- /dev/null +++ b/packages/relayer/migrations/1708366668_index_data.sql @@ -0,0 +1,33 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `events` +ADD INDEX `message_owner_event_type_chain_id_event_data_index` (`message_owner`, `dest_owner_json`, `event_type`, `chain_id`, `event`), +ADD INDEX `message_owner_event_type_chain_id_data_index` (`message_owner`, `dest_owner_json`, `event_type`, `chain_id`), +ADD INDEX `message_owner_event_type_data_index` (`message_owner`, `dest_owner_json`, `event_type`), +ADD INDEX `message_owner_data_index` (`message_owner`, `dest_owner_json`), +ADD INDEX `message_owner_chain_id_data_index` (`message_owner`, `dest_owner_json`, `chain_id`), +ADD INDEX `message_owner_event_data_index` (`message_owner`, `dest_owner_json`, `event`), +ADD INDEX `msg_hash_event_data_index` (`msg_hash`, `dest_owner_json`, `event`), +ADD INDEX `data_event_type_chain_id_index` (`event_type`,`dest_owner_json`, `chain_id`), +ADD INDEX `data_event_type_index` (`dest_owner_json`, `event_type`), +ADD INDEX `data_index` (`dest_owner_json`), +ADD INDEX `data_chain_id_index` (`dest_owner_json`, `chain_id`), +ADD INDEX `data_event_index` (`dest_owner_json`, `event`); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +ALTER TABLE `events` + DROP INDEX `message_owner_event_type_chain_id_event_data_index`, + DROP INDEX `message_owner_event_type_chain_id_data_index`, + DROP INDEX `message_owner_event_type_data_index`, + DROP INDEX `message_owner_data_index`, + DROP INDEX `message_owner_chain_id_data_index`, + DROP INDEX `message_owner_event_data_index`, + DROP INDEX `msg_hash_event_data_index`, + DROP INDEX `data_event_type_chain_id_index`, + DROP INDEX `data_event_type_index`, + DROP INDEX `data_index`, + DROP INDEX `data_chain_id_index`, + DROP INDEX `data_event_index`; +-- +goose StatementEnd diff --git a/packages/relayer/migrations/1708366669_alert_events_is_profitable.sql b/packages/relayer/migrations/1708366669_alert_events_is_profitable.sql new file mode 100644 index 00000000000..d9eda80f57b --- /dev/null +++ b/packages/relayer/migrations/1708366669_alert_events_is_profitable.sql @@ -0,0 +1,23 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `events` +ADD COLUMN `fee` BIGINT UNSIGNED NULL, +ADD COLUMN `dest_chain_base_fee` BIGINT UNSIGNED NULL, +ADD COLUMN `gas_tip_cap` BIGINT UNSIGNED NULL, +ADD COLUMN `gas_limit` BIGINT UNSIGNED NULL, +ADD COLUMN `is_profitable` BOOLEAN NULL, +ADD COLUMN `estimated_onchain_fee` BIGINT UNSIGNED NULL, +ADD COLUMN `is_profitable_evaluated_at` TIMESTAMP NULL; + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +ALTER TABLE `events` +DROP COLUMN `fee`, +DROP COLUMN `dest_chain_base_fee`, +DROP COLUMN `gas_tip_cap`, +DROP COLUMN `gas_limit`, +DROP COLUMN `is_profitable`, +DROP COLUMN `estimated_onchain_fee`, +DROP COLUMN `is_profitable_evaluated_at`; +-- +goose StatementEnd diff --git a/packages/relayer/pkg/db/db.go b/packages/relayer/pkg/db/db.go index e2d19c61ca0..1610c161873 100644 --- a/packages/relayer/pkg/db/db.go +++ b/packages/relayer/pkg/db/db.go @@ -1,36 +1,43 @@ package db import ( - "database/sql" "fmt" "time" + "database/sql" + "github.com/cyberhorsey/errors" "gorm.io/gorm" ) -type DB struct { +var ( + ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "no db") +) + +// DB is a local interface that lets us narrow down a database type for testing. +type DB interface { + DB() (*sql.DB, error) + GormDB() *gorm.DB +} + +type Database struct { gormdb *gorm.DB } -func (db *DB) DB() (*sql.DB, error) { +func (db *Database) DB() (*sql.DB, error) { return db.gormdb.DB() } -func (db *DB) GormDB() *gorm.DB { +func (db *Database) GormDB() *gorm.DB { return db.gormdb } -func New(gormdb *gorm.DB) *DB { - return &DB{ +func New(gormdb *gorm.DB) DB { + return &Database{ gormdb: gormdb, } } -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") -) - type DBConnectionOpts struct { Name string Password string @@ -39,10 +46,10 @@ type DBConnectionOpts struct { MaxIdleConns uint64 MaxOpenConns uint64 MaxConnLifetime uint64 - OpenFunc func(dsn string) (*DB, error) + OpenFunc func(dsn string) (DB, error) } -func OpenDBConnection(opts DBConnectionOpts) (*DB, error) { +func OpenDBConnection(opts DBConnectionOpts) (DB, error) { dsn := "" if opts.Password == "" { dsn = fmt.Sprintf( diff --git a/packages/relayer/pkg/http/get_block_info.go b/packages/relayer/pkg/http/get_block_info.go index 0ad1b1eab13..30eb629258c 100644 --- a/packages/relayer/pkg/http/get_block_info.go +++ b/packages/relayer/pkg/http/get_block_info.go @@ -80,6 +80,7 @@ func (srv *Server) GetBlockInfo(c echo.Context) error { } latestProcessedSrcBlock, err := srv.eventRepo.FindLatestBlockID( + c.Request().Context(), relayer.EventNameMessageSent, srcChainID.Uint64(), destChainID.Uint64(), @@ -89,6 +90,7 @@ func (srv *Server) GetBlockInfo(c echo.Context) error { } latestProcessedDestBlock, err := srv.eventRepo.FindLatestBlockID( + c.Request().Context(), relayer.EventNameMessageSent, destChainID.Uint64(), srcChainID.Uint64(), diff --git a/packages/relayer/pkg/http/get_events_by_address.go b/packages/relayer/pkg/http/get_events_by_address.go index b1e0f6357fc..d136deb7050 100644 --- a/packages/relayer/pkg/http/get_events_by_address.go +++ b/packages/relayer/pkg/http/get_events_by_address.go @@ -1,7 +1,10 @@ package http import ( + "encoding/json" + "errors" "html" + "math" "math/big" "net/http" "strconv" @@ -12,6 +15,48 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer" ) +type JSONData struct { + Raw Raw `json:"Raw"` +} +type Raw struct { + Data string `json:"data"` + Topics []string `json:"topics"` + Address string `json:"address"` + Removed bool `json:"removed"` + LogIndex string `json:"logIndex"` + BlockHash string `json:"blockHash"` + BlockNumber string `json:"blockNumber"` + TransactionHash string `json:"transactionHash"` + TransactionIndex string `json:"transactionIndex"` +} + +type Stats struct { + ProofSize int `json:"ProofSize"` + NumCacheOps int `json:"NumCacheOps"` + GasUsedInFeeCalc int `json:"GasUsedInFeeCalc"` +} + +type Message struct { + Id int `json:"Id"` + To string `json:"To"` + Fee int64 `json:"Fee"` + Data string `json:"Data"` + From string `json:"From"` + Value int64 `json:"Value"` + GasLimit int `json:"GasLimit"` + SrcOwner string `json:"SrcOwner"` + DestOwner string `json:"DestOwner"` + SrcChainId int `json:"SrcChainId"` + DestChainId int `json:"DestChainId"` +} + +type DataStruct struct { + Raw Raw `json:"Raw"` + Stats Stats `json:"Stats"` + Message Message `json:"Message"` + MsgHash string `json:"MsgHash"` +} + // GetEventsByAddress // // returns events by address @@ -66,5 +111,69 @@ func (srv *Server) GetEventsByAddress(c echo.Context) error { return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) } + // get processed message tx and claimedBy + for i := range *page.Items.(*[]relayer.Event) { + v := &(*page.Items.(*[]relayer.Event))[i] + + msgProcessedEvent, err := srv.eventRepo.FirstByEventAndMsgHash( + c.Request().Context(), + relayer.EventNameMessageStatusChanged, + v.MsgHash, + ) + if err != nil { + continue + } + + if msgProcessedEvent == nil { + continue + } + + r := &JSONData{} + + if err := json.Unmarshal(msgProcessedEvent.Data, r); err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + if r.Raw.TransactionIndex == "" || r.Raw.TransactionHash == "" { + continue + } + + var ethClient ethClient + + if new(big.Int).SetInt64(msgProcessedEvent.ChainID).Cmp(srv.srcChainID) == 0 { + ethClient = srv.srcEthClient + } else { + ethClient = srv.destEthClient + } + + tx, _, err := ethClient.TransactionByHash( + c.Request().Context(), + common.HexToHash(r.Raw.TransactionHash), + ) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + txIndex, err := strconv.ParseInt(r.Raw.TransactionIndex[2:], 16, 64) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + if txIndex < 0 || txIndex > math.MaxUint32 { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, errors.New("transaction index out of range")) + } + + sender, err := ethClient.TransactionSender( + c.Request().Context(), + tx, + common.HexToHash(r.Raw.BlockHash), + uint(txIndex), + ) + if err == nil { + v.ClaimedBy = sender.Hex() + } + + v.ProcessedTxHash = r.Raw.TransactionHash + } + return c.JSON(http.StatusOK, page) } diff --git a/packages/relayer/pkg/http/get_events_by_address_test.go b/packages/relayer/pkg/http/get_events_by_address_test.go index 665ac21b354..479e4502b4e 100644 --- a/packages/relayer/pkg/http/get_events_by_address_test.go +++ b/packages/relayer/pkg/http/get_events_by_address_test.go @@ -15,9 +15,9 @@ import ( ) func Test_GetEventsByAddress(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() - _, err := srv.eventRepo.Save(context.Background(), relayer.SaveEventOpts{ + _, err := srv.eventRepo.Save(context.Background(), &relayer.SaveEventOpts{ Name: "name", Data: `{"Owner": "0x0000000000000000000000000000000000000123"}`, ChainID: big.NewInt(167001), diff --git a/packages/relayer/pkg/http/get_recommended_processing_fees.go b/packages/relayer/pkg/http/get_recommended_processing_fees.go index 63887d8766d..48e3271a88b 100644 --- a/packages/relayer/pkg/http/get_recommended_processing_fees.go +++ b/packages/relayer/pkg/http/get_recommended_processing_fees.go @@ -122,14 +122,14 @@ func (srv *Server) GetRecommendedProcessingFees(c echo.Context) error { for _, f := range feeTypes { fees = append(fees, fee{ Type: f.String(), - Amount: srv.getCost(c.Request().Context(), uint64(f), destGasTipCap, destBaseFee, Layer1).String(), + Amount: srv.getCost(uint64(f), destGasTipCap, destBaseFee, Layer1).String(), DestChainID: srcChainID.Uint64(), GasLimit: strconv.Itoa(int(f)), }) fees = append(fees, fee{ Type: f.String(), - Amount: srv.getCost(c.Request().Context(), uint64(f), srcGasTipCap, srcBaseFee, Layer2).String(), + Amount: srv.getCost(uint64(f), srcGasTipCap, srcBaseFee, Layer2).String(), DestChainID: destChainID.Uint64(), GasLimit: strconv.Itoa(int(f)), }) @@ -143,7 +143,6 @@ func (srv *Server) GetRecommendedProcessingFees(c echo.Context) error { } func (srv *Server) getCost( - ctx context.Context, gasLimit uint64, gasTipCap *big.Int, baseFee *big.Int, @@ -151,7 +150,7 @@ func (srv *Server) getCost( ) *big.Int { cost := new(big.Int).Mul( new(big.Int).SetUint64(gasLimit), - new(big.Int).Add(gasTipCap, baseFee)) + new(big.Int).Add(gasTipCap, new(big.Int).Mul(baseFee, big.NewInt(2)))) if destLayer == Layer2 { return cost diff --git a/packages/relayer/pkg/http/server.go b/packages/relayer/pkg/http/server.go index e6f5ee0dfb1..0ef5d961ecf 100644 --- a/packages/relayer/pkg/http/server.go +++ b/packages/relayer/pkg/http/server.go @@ -2,10 +2,12 @@ package http import ( "context" + "log/slog" "math/big" "net/http" "os" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/labstack/echo/v4/middleware" "github.com/taikoxyz/taiko-mono/packages/relayer" @@ -19,6 +21,12 @@ type ethClient interface { ChainID(ctx context.Context) (*big.Int, error) SuggestGasTipCap(ctx context.Context) (*big.Int, error) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) + TransactionByHash(ctx context.Context, hash common.Hash) (*types.Transaction, bool, error) + TransactionSender(ctx context.Context, + tx *types.Transaction, + blockHash common.Hash, + txIndex uint, + ) (common.Address, error) } // @title Taiko Bridge Relayer API @@ -30,15 +38,17 @@ type ethClient interface { // @contact.email info@taiko.xyz // @license.name MIT -// @license.url https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md +// @license.url https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE // @host relayer.hekla.taiko.xyz -// Server represents an relayer http server instance. +// Server represents a relayer http server instance. type Server struct { echo *echo.Echo eventRepo relayer.EventRepository srcEthClient ethClient + srcChainID *big.Int destEthClient ethClient + destChainID *big.Int processingFeeMultiplier float64 taikoL2 *taikol2.TaikoL2 } @@ -82,6 +92,16 @@ func NewServer(opts NewServerOpts) (*Server, error) { return nil, err } + srcChainID, err := opts.SrcEthClient.ChainID(context.Background()) + if err != nil { + return nil, err + } + + destChainID, err := opts.DestEthClient.ChainID(context.Background()) + if err != nil { + return nil, err + } + srv := &Server{ echo: opts.Echo, eventRepo: opts.EventRepo, @@ -89,6 +109,8 @@ func NewServer(opts NewServerOpts) (*Server, error) { destEthClient: opts.DestEthClient, processingFeeMultiplier: opts.ProcessingFeeMultiplier, taikoL2: opts.TaikoL2, + srcChainID: srcChainID, + destChainID: destChainID, } corsOrigins := opts.CorsOrigins @@ -109,6 +131,11 @@ func (srv *Server) Start(address string) error { // Shutdown shuts down the HTTP server func (srv *Server) Shutdown(ctx context.Context) error { + // Close db connection. + if err := srv.eventRepo.Close(); err != nil { + slog.Error("Failed to close db connection", "err", err) + } + return srv.echo.Shutdown(ctx) } diff --git a/packages/relayer/pkg/http/server_test.go b/packages/relayer/pkg/http/server_test.go index 324744e45cc..061861158b9 100644 --- a/packages/relayer/pkg/http/server_test.go +++ b/packages/relayer/pkg/http/server_test.go @@ -14,7 +14,7 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/repo" ) -func newTestServer(url string) *Server { +func newTestServer() *Server { _ = godotenv.Load("../.test.env") srv := &Server{ @@ -75,16 +75,6 @@ func Test_NewServer(t *testing.T) { }, relayer.ErrNoEventRepository, }, - { - "noCorsOrigins", - NewServerOpts{ - Echo: echo.New(), - EventRepo: &repo.EventRepository{}, - SrcEthClient: &mock.EthClient{}, - DestEthClient: &mock.EthClient{}, - }, - relayer.ErrNoCORSOrigins, - }, { "noHttpFramework", NewServerOpts{ @@ -104,7 +94,7 @@ func Test_NewServer(t *testing.T) { } func Test_Health(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() req, _ := http.NewRequest(echo.GET, "/healthz", nil) rec := httptest.NewRecorder() @@ -117,7 +107,7 @@ func Test_Health(t *testing.T) { } func Test_Root(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() req, _ := http.NewRequest(echo.GET, "/", nil) rec := httptest.NewRecorder() @@ -130,7 +120,7 @@ func Test_Root(t *testing.T) { } func Test_StartShutdown(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() go func() { _ = srv.Start(":3928") diff --git a/packages/relayer/pkg/mock/eth_client.go b/packages/relayer/pkg/mock/eth_client.go index b851a747d30..9cbe1cf1976 100644 --- a/packages/relayer/pkg/mock/eth_client.go +++ b/packages/relayer/pkg/mock/eth_client.go @@ -137,3 +137,19 @@ func (c *EthClient) SubscribeNewHead(ctx context.Context, ch chan<- *types.Heade return s, nil } + +// nolint: lll +func (c *EthClient) TransactionSender(ctx context.Context, tx *types.Transaction, blockHash common.Hash, txIndex uint) (common.Address, error) { + return common.Address{}, nil +} + +func (c *EthClient) BalanceAt( + ctx context.Context, + account common.Address, + blockNumber *big.Int) (*big.Int, error) { + return big.NewInt(100), nil +} + +func (c *EthClient) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) { + return []byte{}, nil +} diff --git a/packages/relayer/pkg/mock/event_repository.go b/packages/relayer/pkg/mock/event_repository.go index 6e5d5bffe88..f3593bbd7e1 100644 --- a/packages/relayer/pkg/mock/event_repository.go +++ b/packages/relayer/pkg/mock/event_repository.go @@ -6,6 +6,7 @@ import ( "errors" "math/rand" "net/http" + "time" "github.com/morkid/paginate" "github.com/taikoxyz/taiko-mono/packages/relayer" @@ -21,7 +22,12 @@ func NewEventRepository() *EventRepository { events: make([]*relayer.Event, 0), } } -func (r *EventRepository) Save(ctx context.Context, opts relayer.SaveEventOpts) (*relayer.Event, error) { + +func (r *EventRepository) Close() error { + return nil +} + +func (r *EventRepository) Save(ctx context.Context, opts *relayer.SaveEventOpts) (*relayer.Event, error) { r.events = append(r.events, &relayer.Event{ ID: rand.Int(), // nolint: gosec Data: datatypes.JSON(opts.Data), @@ -62,35 +68,77 @@ func (r *EventRepository) UpdateStatus(ctx context.Context, id int, status relay return nil } +func (r *EventRepository) UpdateFeesAndProfitability( + ctx context.Context, + id int, opts *relayer.UpdateFeesAndProfitabilityOpts, +) error { + var event *relayer.Event + + var index int + + // Find the event by ID + for i, e := range r.events { + if e.ID == id { + event = e + index = i + + break + } + } + + if event == nil { + return nil // Or return an appropriate error if the event is not found + } + + // Update the event fields + event.Fee = &opts.Fee + event.DestChainBaseFee = &opts.DestChainBaseFee + event.GasTipCap = &opts.GasTipCap + event.GasLimit = &opts.GasLimit + event.IsProfitable = &opts.IsProfitable + event.EstimatedOnchainFee = &opts.EstimatedOnchainFee + currentTime := time.Now().UTC() + event.IsProfitableEvaluatedAt = ¤tTime + + // Save the updated event back to the slice + r.events[index] = event + + return nil +} + func (r *EventRepository) FindAllByAddress( ctx context.Context, req *http.Request, opts relayer.FindAllByAddressOpts, -) (paginate.Page, error) { +) (*paginate.Page, error) { type d struct { Owner string `json:"Owner"` } - events := make([]*relayer.Event, 0) + appendToSlice := func(slice *[]relayer.Event, elements ...relayer.Event) { + *slice = append(*slice, elements...) + } + + events := &[]relayer.Event{} for _, e := range r.events { m, err := e.Data.MarshalJSON() if err != nil { - return paginate.Page{}, err + return nil, err } data := &d{} if err := json.Unmarshal(m, data); err != nil { - return paginate.Page{}, err + return nil, err } if data.Owner == opts.Address.Hex() { - events = append(events, e) + appendToSlice(events, *e) break } } - return paginate.Page{ + return &paginate.Page{ Items: events, }, nil } @@ -162,6 +210,7 @@ func (r *EventRepository) DeleteAllAfterBlockID(blockID uint64, srcChainID uint6 // GetLatestBlockID get latest block id func (r *EventRepository) FindLatestBlockID( + ctx context.Context, event string, srcChainID uint64, destChainID uint64, diff --git a/packages/relayer/pkg/mock/mock_tx_sender.go b/packages/relayer/pkg/mock/mock_tx_sender.go index df88966b6ae..5dd941b5fd0 100644 --- a/packages/relayer/pkg/mock/mock_tx_sender.go +++ b/packages/relayer/pkg/mock/mock_tx_sender.go @@ -2,10 +2,12 @@ package mock import ( "context" + "math/big" "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rpc" ) type TxManager struct { @@ -34,3 +36,20 @@ func (t *TxManager) Close() { func (t *TxManager) IsClosed() bool { return false } + +func (t *TxManager) SendAsync(ctx context.Context, candidate txmgr.TxCandidate, ch chan txmgr.SendResponse) { + panic("unimplemented") +} + +func (t *TxManager) SuggestGasPriceCaps(ctx context.Context) ( + tipCap *big.Int, + baseFee *big.Int, + blobBaseFee *big.Int, + err error, +) { + panic("unimplemented") +} + +func (t *TxManager) API() rpc.API { + panic("unimplemented") +} diff --git a/packages/relayer/pkg/repo/containers_test.go b/packages/relayer/pkg/repo/containers_test.go index 67f186da3bc..c18e06f4c72 100644 --- a/packages/relayer/pkg/repo/containers_test.go +++ b/packages/relayer/pkg/repo/containers_test.go @@ -6,12 +6,13 @@ import ( "testing" "github.com/pressly/goose/v3" - "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/wait" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" + + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" ) var ( @@ -20,7 +21,7 @@ var ( dbPassword = "password" ) -func testMysql(t *testing.T) (DB, func(), error) { +func testMysql(t *testing.T) (db.DB, func(), error) { req := testcontainers.ContainerRequest{ Image: "mysql:latest", ExposedPorts: []string{"3306/tcp", "33060/tcp"}, diff --git a/packages/relayer/pkg/repo/db.go b/packages/relayer/pkg/repo/db.go deleted file mode 100644 index 1c8a35dbca3..00000000000 --- a/packages/relayer/pkg/repo/db.go +++ /dev/null @@ -1,17 +0,0 @@ -package repo - -import ( - "database/sql" - - "github.com/cyberhorsey/errors" - "gorm.io/gorm" -) - -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "no db") -) - -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} diff --git a/packages/relayer/pkg/repo/event.go b/packages/relayer/pkg/repo/event.go index 8dccbf74df0..b07b1758553 100644 --- a/packages/relayer/pkg/repo/event.go +++ b/packages/relayer/pkg/repo/event.go @@ -2,32 +2,43 @@ package repo import ( "context" - "strings" - "net/http" + "strings" "github.com/morkid/paginate" "github.com/pkg/errors" - "github.com/taikoxyz/taiko-mono/packages/relayer" "gorm.io/datatypes" "gorm.io/gorm" + + "github.com/taikoxyz/taiko-mono/packages/relayer" + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" ) type EventRepository struct { - db DB + db db.DB } -func NewEventRepository(db DB) (*EventRepository, error) { - if db == nil { - return nil, ErrNoDB +func NewEventRepository(dbHandler db.DB) (*EventRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &EventRepository{ - db: db, + db: dbHandler, }, nil } -func (r *EventRepository) Save(ctx context.Context, opts relayer.SaveEventOpts) (*relayer.Event, error) { +// Close closes the database connection. +func (r *EventRepository) Close() error { + sqlDB, err := r.db.DB() + if err != nil { + return err + } + + return sqlDB.Close() +} + +func (r *EventRepository) Save(ctx context.Context, opts *relayer.SaveEventOpts) (*relayer.Event, error) { e := &relayer.Event{ Data: datatypes.JSON(opts.Data), Status: opts.Status, @@ -51,22 +62,66 @@ func (r *EventRepository) Save(ctx context.Context, opts relayer.SaveEventOpts) EmittedBlockID: opts.EmittedBlockID, } - if err := r.db.GormDB().Create(e).Error; err != nil { + if err := r.db.GormDB().WithContext(ctx).Create(e).Error; err != nil { return nil, errors.Wrap(err, "r.db.Create") } return e, nil } +func (r *EventRepository) UpdateFeesAndProfitability( + ctx context.Context, + id int, + opts *relayer.UpdateFeesAndProfitabilityOpts, +) error { + tx := r.db.GormDB().WithContext(ctx) + tx = tx.Model(&relayer.Event{}) + tx = tx.Where("id = ?", id) + + // check if existed. + var count int64 + if err := tx.Count(&count).Error; err != nil { + return errors.Wrap(err, "r.db.Count") + } + + if count == 0 { + return gorm.ErrRecordNotFound + } + + err := tx.Updates(map[string]interface{}{ + "fee": opts.Fee, + "dest_chain_base_fee": opts.DestChainBaseFee, + "gas_tip_cap": opts.GasTipCap, + "gas_limit": opts.GasLimit, + "is_profitable": opts.IsProfitable, + "estimated_onchain_fee": opts.EstimatedOnchainFee, + "is_profitable_evaluated_at": opts.IsProfitableEvaluatedAt, + }).Error + + if err != nil { + return errors.Wrap(err, "r.db.Commit") + } + + return nil +} + func (r *EventRepository) UpdateStatus(ctx context.Context, id int, status relayer.EventStatus) error { - e := &relayer.Event{} - if err := r.db.GormDB().Where("id = ?", id).First(e).Error; err != nil { - return errors.Wrap(err, "r.db.First") + tx := r.db.GormDB().WithContext(ctx) + tx = tx.Model(&relayer.Event{}) + tx = tx.Where("id = ?", id) + + // check if existed. + var count int64 + if err := tx.Count(&count).Error; err != nil { + return errors.Wrap(err, "r.db.Count") + } + + if count == 0 { + return gorm.ErrRecordNotFound } - e.Status = status - if err := r.db.GormDB().Save(e).Error; err != nil { - return errors.Wrap(err, "r.db.Save") + if err := tx.Update("status", status).Error; err != nil { + return errors.Wrap(err, "tx.Commit") } return nil @@ -78,7 +133,7 @@ func (r *EventRepository) FirstByMsgHash( ) (*relayer.Event, error) { e := &relayer.Event{} // find all message sent events - if err := r.db.GormDB().Where("msg_hash = ?", msgHash). + if err := r.db.GormDB().WithContext(ctx).Where("msg_hash = ?", msgHash). First(&e).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, nil @@ -97,7 +152,7 @@ func (r *EventRepository) FirstByEventAndMsgHash( ) (*relayer.Event, error) { e := &relayer.Event{} // find all message sent events - if err := r.db.GormDB().Where("msg_hash = ?", msgHash). + if err := r.db.GormDB().WithContext(ctx).Where("msg_hash = ?", msgHash). Where("event = ?", event). First(&e).Error; err != nil { if err == gorm.ErrRecordNotFound { @@ -114,13 +169,18 @@ func (r *EventRepository) FindAllByAddress( ctx context.Context, req *http.Request, opts relayer.FindAllByAddressOpts, -) (paginate.Page, error) { +) (*paginate.Page, error) { pg := paginate.New(&paginate.Config{ DefaultSize: 100, }) - q := r.db.GormDB(). - Model(&relayer.Event{}).Where("message_owner = ?", strings.ToLower(opts.Address.Hex())) + q := r.db.GormDB().WithContext(ctx). + Model(&relayer.Event{}). + Where( + "dest_owner_json = ? OR message_owner = ?", + strings.ToLower(opts.Address.Hex()), + strings.ToLower(opts.Address.Hex()), + ) if opts.EventType != nil { q = q.Where("event_type = ?", *opts.EventType) @@ -141,15 +201,18 @@ func (r *EventRepository) FindAllByAddress( reqCtx := pg.With(q) page := reqCtx.Request(req).Response(&[]relayer.Event{}) + if page.Error { + return nil, page.RawError + } - return page, nil + return &page, nil } func (r *EventRepository) Delete( ctx context.Context, id int, ) error { - return r.db.GormDB().Delete(relayer.Event{}, id).Error + return r.db.GormDB().WithContext(ctx).Delete(relayer.Event{}, id).Error } func (r *EventRepository) ChainDataSyncedEventByBlockNumberOrGreater( @@ -160,7 +223,7 @@ func (r *EventRepository) ChainDataSyncedEventByBlockNumberOrGreater( ) (*relayer.Event, error) { e := &relayer.Event{} // find all message sent events - if err := r.db.GormDB().Where("name = ?", relayer.EventNameChainDataSynced). + if err := r.db.GormDB().WithContext(ctx).Where("name = ?", relayer.EventNameChainDataSynced). Where("chain_id = ?", srcChainId). Where("synced_chain_id = ?", syncedChainId). Where("block_id >= ?", blockNumber). @@ -184,7 +247,7 @@ func (r *EventRepository) LatestChainDataSyncedEvent( ) (uint64, error) { blockID := 0 // find all message sent events - if err := r.db.GormDB().Table("events"). + if err := r.db.GormDB().WithContext(ctx).Table("events"). Where("chain_id = ?", srcChainId). Where("synced_chain_id = ?", syncedChainId). Select("COALESCE(MAX(block_id), 0)"). @@ -210,16 +273,18 @@ WHERE block_id >= ? AND chain_id = ? AND dest_chain_id = ?` // GetLatestBlockID get latest block id func (r *EventRepository) FindLatestBlockID( + ctx context.Context, event string, srcChainID uint64, destChainID uint64, ) (uint64, error) { - q := `SELECT COALESCE(MAX(emitted_block_id), 0) + q := `SELECT COALESCE(MAX(emitted_block_id), 0) FROM events WHERE chain_id = ? AND dest_chain_id = ? AND event = ?` var b uint64 - if err := r.db.GormDB().Table("events").Raw(q, srcChainID, destChainID, event).Scan(&b).Error; err != nil { + if err := r.db.GormDB().WithContext(ctx).Table("events"). + Raw(q, srcChainID, destChainID, event).Scan(&b).Error; err != nil { return 0, err } diff --git a/packages/relayer/pkg/repo/event_test.go b/packages/relayer/pkg/repo/event_test.go index cbcf840770e..b363466ef4a 100644 --- a/packages/relayer/pkg/repo/event_test.go +++ b/packages/relayer/pkg/repo/event_test.go @@ -10,10 +10,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/morkid/paginate" - "github.com/taikoxyz/taiko-mono/packages/relayer" - "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" "gopkg.in/go-playground/assert.v1" "gorm.io/datatypes" + + "github.com/taikoxyz/taiko-mono/packages/relayer" + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" ) var testMsgHash = "0x1" @@ -85,18 +86,18 @@ var testEvents = []relayer.Event{ func Test_NewEventRepo(t *testing.T) { tests := []struct { name string - db DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - ErrNoDB, + db.ErrNoDB, }, } @@ -118,12 +119,12 @@ func TestIntegration_Event_Save(t *testing.T) { assert.Equal(t, nil, err) tests := []struct { name string - opts relayer.SaveEventOpts + opts *relayer.SaveEventOpts wantErr error }{ { "success", - relayer.SaveEventOpts{ + &relayer.SaveEventOpts{ Name: "test", ChainID: big.NewInt(1), DestChainID: big.NewInt(2), @@ -184,7 +185,7 @@ func TestIntegration_Event_UpdateStatus(t *testing.T) { t.Run(tt.name, func(t *testing.T) { if tt.name == "success" { _, err := eventRepo.Save(context.Background(), - relayer.SaveEventOpts{ + &relayer.SaveEventOpts{ Name: "test", ChainID: big.NewInt(1), DestChainID: big.NewInt(2), @@ -223,7 +224,7 @@ func TestIntegration_Event_FindAllByAddress(t *testing.T) { addr := common.HexToAddress("0x71C7656EC7ab88b098defB751B7401B5f6d8976F") - _, err = eventRepo.Save(context.Background(), relayer.SaveEventOpts{ + _, err = eventRepo.Save(context.Background(), &relayer.SaveEventOpts{ Name: "name", Data: fmt.Sprintf(`{"Message": {"Owner": "%s"}}`, strings.ToLower(addr.Hex())), ChainID: big.NewInt(1), @@ -243,7 +244,7 @@ func TestIntegration_Event_FindAllByAddress(t *testing.T) { assert.Equal(t, nil, err) - _, err = eventRepo.Save(context.Background(), relayer.SaveEventOpts{ + _, err = eventRepo.Save(context.Background(), &relayer.SaveEventOpts{ Name: "name", Data: fmt.Sprintf(`{"Message": {"Owner": "%s"}}`, strings.ToLower(addr.Hex())), ChainID: big.NewInt(1), @@ -262,7 +263,7 @@ func TestIntegration_Event_FindAllByAddress(t *testing.T) { }) assert.Equal(t, nil, err) - _, err = eventRepo.Save(context.Background(), relayer.SaveEventOpts{ + _, err = eventRepo.Save(context.Background(), &relayer.SaveEventOpts{ Name: "name", Data: fmt.Sprintf(`{"Message": {"Owner": "%s"}}`, strings.ToLower(addr.Hex())), ChainID: big.NewInt(1), @@ -443,7 +444,7 @@ func TestIntegration_Event_FirstByMsgHash(t *testing.T) { eventRepo, err := NewEventRepository(db) assert.Equal(t, nil, err) - _, err = eventRepo.Save(context.Background(), relayer.SaveEventOpts{ + _, err = eventRepo.Save(context.Background(), &relayer.SaveEventOpts{ Name: "name", Data: fmt.Sprintf(`{"Message": {"Owner": "%s"}}`, strings.ToLower(addr.Hex())), ChainID: big.NewInt(1), diff --git a/packages/relayer/pkg/utils/scan_blocks.go b/packages/relayer/pkg/utils/scan_blocks.go index ec62c24a724..d6da257ebc5 100644 --- a/packages/relayer/pkg/utils/scan_blocks.go +++ b/packages/relayer/pkg/utils/scan_blocks.go @@ -15,10 +15,7 @@ type headSubscriber interface { func ScanBlocks(ctx context.Context, ethClient headSubscriber, wg *sync.WaitGroup) error { wg.Add(1) - - defer func() { - wg.Done() - }() + defer wg.Done() headers := make(chan *types.Header) diff --git a/packages/relayer/processor/can_process_message.go b/packages/relayer/processor/can_process_message.go index 9e5db2875f1..7772ba5d530 100644 --- a/packages/relayer/processor/can_process_message.go +++ b/packages/relayer/processor/can_process_message.go @@ -16,7 +16,7 @@ import ( // or its processed, failed, and is in Retriable or Failed state, where the user // should finish manually. func canProcessMessage( - ctx context.Context, + _ context.Context, eventStatus relayer.EventStatus, messageOwner common.Address, relayerAddress common.Address, diff --git a/packages/relayer/processor/config.go b/packages/relayer/processor/config.go index e11daa7daaf..06410b53bea 100644 --- a/packages/relayer/processor/config.go +++ b/packages/relayer/processor/config.go @@ -7,15 +7,16 @@ import ( "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" + "github.com/urfave/cli/v2" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/logger" + "github.com/taikoxyz/taiko-mono/packages/relayer/cmd/flags" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" pkgFlags "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/flags" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue/rabbitmq" - "github.com/urfave/cli/v2" - "gorm.io/driver/mysql" - "gorm.io/gorm" - "gorm.io/gorm/logger" ) // hopConfig is a config struct that must be provided for an individual @@ -76,7 +77,7 @@ type Config struct { DestRPCUrl string ETHClientTimeout uint64 OpenQueueFunc func() (queue.Queue, error) - OpenDBFunc func() (DB, error) + OpenDBFunc func() (db.DB, error) hopConfigs []hopConfig @@ -86,6 +87,7 @@ type Config struct { TxmgrConfigs *txmgr.CLIConfig MaxMessageRetries uint64 + MinFeeToProcess uint64 } // NewConfigFromCliContext creates a new config instance from command line flags. @@ -176,7 +178,8 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { c, ), MaxMessageRetries: c.Uint64(flags.MaxMessageRetries.Name), - OpenDBFunc: func() (DB, error) { + MinFeeToProcess: c.Uint64(flags.MinFeeToProcess.Name), + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -185,7 +188,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (db.DB, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/relayer/processor/config_test.go b/packages/relayer/processor/config_test.go index 63e5c8191a3..b9f6ebd8df5 100644 --- a/packages/relayer/processor/config_test.go +++ b/packages/relayer/processor/config_test.go @@ -5,10 +5,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" + "github.com/urfave/cli/v2" + "github.com/taikoxyz/taiko-mono/packages/relayer/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/mock" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" - "github.com/urfave/cli/v2" ) var ( @@ -71,7 +73,7 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, uint64(100), c.QueuePrefetch) assert.Equal(t, true, c.EnableTaikoL2) - c.OpenDBFunc = func() (DB, error) { + c.OpenDBFunc = func() (db.DB, error) { return &mock.DB{}, nil } diff --git a/packages/relayer/processor/is_profitable.go b/packages/relayer/processor/is_profitable.go index 62d91e875cb..f4081a88220 100644 --- a/packages/relayer/processor/is_profitable.go +++ b/packages/relayer/processor/is_profitable.go @@ -2,8 +2,8 @@ package processor import ( "context" - "log/slog" + "time" "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/relayer" @@ -18,6 +18,7 @@ var ( // profitable. Otherwise, we compare it to the estimated cost. func (p *Processor) isProfitable( ctx context.Context, + id int, fee uint64, gasLimit uint64, destChainBaseFee uint64, @@ -34,9 +35,9 @@ func (p *Processor) isProfitable( return shouldProcess, errImpossible } - // if processing fee is higher than baseFee * gasLimit, + // if processing fee is higher than baseFee * 2 +gasTipCap + gasLimit, // we should process. - estimatedOnchainFee := (destChainBaseFee + gasTipCap) * uint64(gasLimit) + estimatedOnchainFee := ((destChainBaseFee * 2) + gasTipCap) * uint64(gasLimit) if fee > estimatedOnchainFee { shouldProcess = true } @@ -44,11 +45,26 @@ func (p *Processor) isProfitable( slog.Info("isProfitable", "processingFee", fee, "destChainBaseFee", destChainBaseFee, + "gasTipCap", gasTipCap, "gasLimit", gasLimit, "shouldProcess", shouldProcess, "estimatedOnchainFee", estimatedOnchainFee, ) + opts := relayer.UpdateFeesAndProfitabilityOpts{ + Fee: fee, + DestChainBaseFee: destChainBaseFee, + GasTipCap: gasTipCap, + GasLimit: gasLimit, + IsProfitable: shouldProcess, + EstimatedOnchainFee: estimatedOnchainFee, + IsProfitableEvaluatedAt: time.Now().UTC(), + } + + if err := p.eventRepo.UpdateFeesAndProfitability(ctx, id, &opts); err != nil { + slog.Error("failed to update event", "error", err) + } + if !shouldProcess { relayer.UnprofitableMessagesDetected.Inc() diff --git a/packages/relayer/processor/is_profitable_test.go b/packages/relayer/processor/is_profitable_test.go index 639118eac7a..f4e942999ba 100644 --- a/packages/relayer/processor/is_profitable_test.go +++ b/packages/relayer/processor/is_profitable_test.go @@ -11,6 +11,7 @@ func Test_isProfitable(t *testing.T) { p := newTestProcessor(true) tests := []struct { + id int name string fee uint64 gasLimit uint64 @@ -20,6 +21,7 @@ func Test_isProfitable(t *testing.T) { wantErr error }{ { + 0, "zeroProcessingFee", 0, 1, @@ -29,8 +31,9 @@ func Test_isProfitable(t *testing.T) { errImpossible, }, { + 1, "profitable", - 600000000600001, + 7000000000600001, 600000, 1000000000, 1, @@ -38,6 +41,7 @@ func Test_isProfitable(t *testing.T) { nil, }, { + 2, "unprofitable", 590000000600000, 600000, @@ -52,6 +56,7 @@ func Test_isProfitable(t *testing.T) { t.Run(tt.name, func(t *testing.T) { profitable, err := p.isProfitable( context.Background(), + tt.id, tt.fee, tt.gasLimit, tt.baseFee, diff --git a/packages/relayer/processor/process_message.go b/packages/relayer/processor/process_message.go index 6022b80ca87..d5921fa57f4 100644 --- a/packages/relayer/processor/process_message.go +++ b/packages/relayer/processor/process_message.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "log/slog" + "math" "math/big" "strings" "time" @@ -69,6 +70,12 @@ func (p *Processor) processMessage( return false, 0, errors.Wrap(err, "json.Unmarshal") } + if msgBody.Event == nil { + slog.Warn("empty msgBody", "id", msgBody.ID) + + return false, 0, errors.New("empty message body") + } + slog.Info("message received", "srcTxHash", msgBody.Event.Raw.TxHash.Hex()) // check if we already processing this hash @@ -104,10 +111,19 @@ func (p *Processor) processMessage( return false, msgBody.TimesRetried, nil } - if err := p.waitForConfirmations(ctx, msgBody.Event.Raw.TxHash, msgBody.Event.Raw.BlockNumber); err != nil { - return false, msgBody.TimesRetried, err + // we never want to process messages below a certain fee, if set. + // return a nil error, and we will successfully acknowledge this. + if p.minFeeToProcess != 0 && msgBody.Event.Message.Fee < p.minFeeToProcess { + slog.Warn("minFeeToProcess not met", + "minFeeToProcess", p.minFeeToProcess, + "fee", msgBody.Event.Message.Fee, + "srcTxHash", msgBody.Event.Raw.TxHash.Hex(), + ) + + return false, msgBody.TimesRetried, nil } + // check message process eligibility before waiting for confirmations to process eventStatus, err := p.eventStatusFromMsgHash(ctx, msgBody.Event.MsgHash) if err != nil { return false, msgBody.TimesRetried, errors.Wrap(err, "p.eventStatusFromMsgHash") @@ -123,6 +139,10 @@ func (p *Processor) processMessage( return false, msgBody.TimesRetried, nil } + if err := p.waitForConfirmations(ctx, msgBody.Event.Raw.TxHash); err != nil { + return false, msgBody.TimesRetried, err + } + // check paused status paused, err := p.destBridge.Paused(&bind.CallOpts{ Context: ctx, @@ -182,7 +202,7 @@ func (p *Processor) processMessage( return false, msgBody.TimesRetried, err } - _, err = p.sendProcessMessageCall(ctx, msgBody.Event, encodedSignalProof) + _, err = p.sendProcessMessageCall(ctx, msgBody.ID, msgBody.Event, encodedSignalProof) if err != nil { return false, msgBody.TimesRetried, err } @@ -237,18 +257,12 @@ func (p *Processor) generateEncodedSignalProof(ctx context.Context, var hopChainID *big.Int for _, hop := range p.hops { - hop.blockNum = blockNum - event, err := p.waitHeaderSynced(ctx, hopEthClient, hop.chainID.Uint64(), blockNum) if err != nil { return nil, errors.Wrap(err, "p.waitHeaderSynced") } - if err != nil { - return nil, errors.Wrap(err, "hop.headerSyncer.GetSyncedSnippet") - } - blockNum = event.SyncedInBlockID hopEthClient = hop.ethClient @@ -384,9 +398,12 @@ func (p *Processor) generateEncodedSignalProof(ctx context.Context, // after estimating gas, and checking profitability. func (p *Processor) sendProcessMessageCall( ctx context.Context, + id int, event *bridge.BridgeMessageSent, proof []byte, ) (*types.Receipt, error) { + defer p.logRelayerBalance(ctx) + received, err := p.destBridge.IsMessageReceived(nil, event.Message, proof) if err != nil { return nil, err @@ -419,14 +436,27 @@ func (p *Processor) sendProcessMessageCall( return nil, err } - // mul by 1.05 for padding - gasLimit := uint64(float64(event.Message.GasLimit) * 1.05) + gasLimit := uint64(float64(event.Message.GasLimit)) + + // if destination address is a contract, add padding. check message.to + // to see if it is a contract address. + code, err := p.destEthClient.CodeAt(ctx, event.Message.To, nil) + if err != nil { + return nil, err + } + + if len(code) != 0 { + gasLimit = uint64(float64(gasLimit) * 1.1) + } else { + gasLimit = uint64(float64(gasLimit) * 1.05) + } - var estimatedCost uint64 = 0 + var estimatedMaxCost uint64 if bool(p.profitableOnly) { profitable, err := p.isProfitable( ctx, + id, event.Message.Fee, gasLimit, baseFee.Uint64(), @@ -439,9 +469,8 @@ func (p *Processor) sendProcessMessageCall( return nil, relayer.ErrUnprofitable } - // now simulate the transaction and lets confirm - // it is profitable + // now simulate the transaction and lets confirm it is profitable auth, err := bind.NewKeyedTransactorWithChainID(p.ecdsaKey, p.destChainId) if err != nil { return nil, err @@ -469,7 +498,7 @@ func (p *Processor) sendProcessMessageCall( return nil, relayer.ErrUnprofitable } - estimatedCost = gasUsed * (baseFee.Uint64() + gasTipCap.Uint64()) + estimatedMaxCost = gasUsed * ((baseFee.Uint64() * 2) + gasTipCap.Uint64()) } // we should check event status one more time, after we have waiting for @@ -489,7 +518,6 @@ func (p *Processor) sendProcessMessageCall( uint64(event.Message.GasLimit), ) { slog.Error("can not process message after waiting for confirmations", "err", errUnprocessable) - return nil, errUnprocessable } @@ -528,10 +556,10 @@ func (p *Processor) sendProcessMessageCall( slog.Info("tx cost", "txHash", hex.EncodeToString(receipt.TxHash.Bytes()), "srcTxHash", event.Raw.TxHash.Hex(), "actualCost", cost, - "estimatedCost", estimatedCost, + "estimatedMaxCost", estimatedMaxCost, ) - if cost > estimatedCost { + if cost > estimatedMaxCost { relayer.UnprofitableMessageAfterTransacting.Inc() } else { relayer.ProfitableMessageAfterTransacting.Inc() @@ -545,6 +573,29 @@ func (p *Processor) sendProcessMessageCall( return receipt, nil } +// retrieve the balance of the relayer and set Prometheus +func (p *Processor) logRelayerBalance(ctx context.Context) { + balance, err := p.destEthClient.BalanceAt(ctx, p.relayerAddr, nil) + if err != nil { + slog.Warn("Failed to retrieve relayer balance", "error", err) + return + } + + balanceFloat := new(big.Float).SetInt(balance) + balanceEth := new(big.Float).Quo( + balanceFloat, + big.NewFloat(math.Pow10(18)), + ) + + slog.Info("Relayer balance", + "relayerAddress", p.relayerAddr, + "balance", balanceEth.Text('f', 18), + ) + + balanceEthFloat, _ := balanceEth.Float64() + relayer.RelayerKeyBalanceGauge.Set(balanceEthFloat) +} + // saveMessageStatusChangedEvent writes the MessageStatusChanged event to the // database after a message is processed func (p *Processor) saveMessageStatusChangedEvent( @@ -575,7 +626,7 @@ func (p *Processor) saveMessageStatusChangedEvent( // keep same format as other raw events data := fmt.Sprintf(`{"Raw":{"transactionHash": "%v"}}`, receipt.TxHash.Hex()) - _, err = p.eventRepo.Save(ctx, relayer.SaveEventOpts{ + _, err = p.eventRepo.Save(ctx, &relayer.SaveEventOpts{ Name: relayer.EventNameMessageStatusChanged, Data: data, EmittedBlockID: event.Raw.BlockNumber, diff --git a/packages/relayer/processor/process_message_test.go b/packages/relayer/processor/process_message_test.go index 114a17e7635..704f541b3a5 100644 --- a/packages/relayer/processor/process_message_test.go +++ b/packages/relayer/processor/process_message_test.go @@ -20,6 +20,7 @@ func Test_sendProcessMessageCall(t *testing.T) { _, err := p.sendProcessMessageCall( context.Background(), + 1, &bridge.BridgeMessageSent{ Message: bridge.IBridgeMessage{ Id: 1, diff --git a/packages/relayer/processor/processor.go b/packages/relayer/processor/processor.go index b36c6191b9b..d0f550caf83 100644 --- a/packages/relayer/processor/processor.go +++ b/packages/relayer/processor/processor.go @@ -3,16 +3,19 @@ package processor import ( "context" "crypto/ecdsa" - "database/sql" + "encoding/json" "errors" "fmt" "log/slog" "math/big" "os" + "strings" "sync" "time" "github.com/cenkalti/backoff/v4" + "github.com/ethereum-optimism/optimism/op-service/txmgr" + txmgrMetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -21,10 +24,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rpc" "github.com/urfave/cli/v2" - "gorm.io/gorm" - "github.com/ethereum-optimism/optimism/op-service/txmgr" - txmgrMetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" "github.com/taikoxyz/taiko-mono/packages/relayer" "github.com/taikoxyz/taiko-mono/packages/relayer/bindings/bridge" "github.com/taikoxyz/taiko-mono/packages/relayer/bindings/erc1155vault" @@ -39,11 +39,6 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/utils" ) -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} - // ethClient is a slimmed down interface of a go-ethereum ethclient.Client // we can use for mocking and testing type ethClient interface { @@ -58,6 +53,8 @@ type ethClient interface { ChainID(ctx context.Context) (*big.Int, error) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (ethereum.Subscription, error) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint64, error) + BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) + CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) } // hop is a struct which needs to be created based on the config parameters @@ -70,7 +67,6 @@ type hop struct { taikoAddress common.Address ethClient ethClient caller relayer.Caller - blockNum uint64 } // Processor is the main struct which handles message processing and queue @@ -100,8 +96,6 @@ type Processor struct { prover *proof.Prover - mu *sync.Mutex - relayerAddr common.Address srcSignalServiceAddress common.Address @@ -118,7 +112,7 @@ type Processor struct { msgCh chan queue.Message - wg *sync.WaitGroup + wg sync.WaitGroup srcChainId *big.Int destChainId *big.Int @@ -134,7 +128,9 @@ type Processor struct { maxMessageRetries uint64 processingTxHashes map[common.Hash]bool - processingTxHashMu *sync.Mutex + processingTxHashMu sync.Mutex + + minFeeToProcess uint64 } // InitFromCli creates a new processor from a cli context @@ -360,8 +356,6 @@ func InitFromConfig(ctx context.Context, p *Processor, cfg *Config) error { p.srcSignalServiceAddress = cfg.SrcSignalServiceAddress p.msgCh = make(chan queue.Message) - p.wg = &sync.WaitGroup{} - p.mu = &sync.Mutex{} p.srcCaller = srcRpcClient p.backOffRetryInterval = time.Duration(cfg.BackoffRetryInterval) * time.Second @@ -373,7 +367,10 @@ func InitFromConfig(ctx context.Context, p *Processor, cfg *Config) error { p.maxMessageRetries = cfg.MaxMessageRetries p.processingTxHashes = make(map[common.Hash]bool, 0) - p.processingTxHashMu = &sync.Mutex{} + + p.minFeeToProcess = p.cfg.MinFeeToProcess + + slog.Info("minFeeToProcess", "minFeeToProcess", p.minFeeToProcess) return nil } @@ -386,6 +383,11 @@ func (p *Processor) Close(ctx context.Context) { p.cancel() p.wg.Wait() + + // Close db connection. + if err := p.eventRepo.Close(); err != nil { + slog.Error("Failed to close db connection", "err", err) + } } func (p *Processor) Start() error { @@ -415,7 +417,7 @@ func (p *Processor) Start() error { go func() { if err := backoff.Retry(func() error { slog.Info("attempting backoff queue subscription") - if err := p.queue.Subscribe(ctx, p.msgCh, p.wg); err != nil { + if err := p.queue.Subscribe(ctx, p.msgCh, &p.wg); err != nil { slog.Error("processor queue subscription error", "err", err.Error()) return err } @@ -426,13 +428,11 @@ func (p *Processor) Start() error { } }() - p.wg.Add(1) - go p.eventLoop(ctx) go func() { if err := backoff.Retry(func() error { - return utils.ScanBlocks(ctx, p.srcEthClient, p.wg) + return utils.ScanBlocks(ctx, p.srcEthClient, &p.wg) }, backoff.NewConstantBackOff(5*time.Second)); err != nil { slog.Error("scan blocks backoff retry", "error", err) } @@ -448,9 +448,8 @@ func (p *Processor) queueName() string { // eventLoop is the main event loop of a Processor which should read // messages from a queue and then process them. func (p *Processor) eventLoop(ctx context.Context) { - defer func() { - p.wg.Done() - }() + p.wg.Add(1) + defer p.wg.Done() for { select { @@ -488,14 +487,14 @@ func (p *Processor) eventLoop(ctx context.Context) { if err := p.queue.Ack(ctx, m); err != nil { slog.Error("Err acking message", "err", err.Error()) } - case errors.Is(err, context.Canceled): - slog.Error("process message failed due to context cancel", "err", err.Error()) - - // we want to negatively acknowledge the message and make sure - // we requeue it - if err := p.queue.Nack(ctx, m, true); err != nil { - slog.Error("Err nacking message", "err", err.Error()) - } + case errors.Is(err, context.Canceled) || + strings.Contains(err.Error(), "timeout") || + strings.Contains(err.Error(), "i/o") || + strings.Contains(err.Error(), "connect") || + strings.Contains(err.Error(), "failed to get tx into the mempool"): + // we want to do nothing, just log, and the message will be re-picked up + // by another consumer. no need to nack or ack. + slog.Error("process message failed", "err", err.Error()) default: slog.Error("process message failed", "err", err.Error()) @@ -510,11 +509,19 @@ func (p *Processor) eventLoop(ctx context.Context) { } if shouldRequeue { - // we want to negatively acknowledge the message and make sure - // we requeue it + // we want to negatively acknowledge the message if err := p.queue.Nack(ctx, m, true); err != nil { slog.Error("Err nacking message", "err", err.Error()) } + + marshalledMsg, err := json.Marshal(msg) + if err != nil { + slog.Error("err marshaling queue message", "err", err.Error()) + } else { + if err := p.queue.Publish(ctx, p.queueName(), marshalledMsg, nil, nil); err != nil { + slog.Error("err publishing to queue", "err", err.Error()) + } + } } else { // otherwise if no error, we can acknowledge it successfully. if err := p.queue.Ack(ctx, m); err != nil { diff --git a/packages/relayer/processor/processor_test.go b/packages/relayer/processor/processor_test.go index 5b4582c1a39..2eb87863ea8 100644 --- a/packages/relayer/processor/processor_test.go +++ b/packages/relayer/processor/processor_test.go @@ -1,7 +1,6 @@ package processor import ( - "sync" "time" "github.com/ethereum/go-ethereum/common" @@ -28,7 +27,6 @@ func newTestProcessor(profitableOnly bool) *Processor { destEthClient: &mock.EthClient{}, destERC20Vault: &mock.TokenVault{}, srcSignalService: &mock.SignalService{}, - mu: &sync.Mutex{}, ecdsaKey: privateKey, prover: prover, srcCaller: &mock.Caller{}, @@ -49,6 +47,5 @@ func newTestProcessor(profitableOnly bool) *Processor { maxMessageRetries: 5, destQuotaManager: &mock.QuotaManager{}, processingTxHashes: make(map[common.Hash]bool, 0), - processingTxHashMu: &sync.Mutex{}, } } diff --git a/packages/relayer/processor/wait_for_confirmations.go b/packages/relayer/processor/wait_for_confirmations.go index df2ecf981fa..d6fdfcadb97 100644 --- a/packages/relayer/processor/wait_for_confirmations.go +++ b/packages/relayer/processor/wait_for_confirmations.go @@ -10,7 +10,7 @@ import ( // waitForConfirmations waits for the given transaction to reach N confs // before returning -func (p *Processor) waitForConfirmations(ctx context.Context, txHash common.Hash, blockNumber uint64) error { +func (p *Processor) waitForConfirmations(ctx context.Context, txHash common.Hash) error { ctx, cancelFunc := context.WithTimeout(ctx, time.Duration(p.confTimeoutInSeconds)*time.Second) defer cancelFunc() diff --git a/packages/relayer/processor/wait_for_confirmations_test.go b/packages/relayer/processor/wait_for_confirmations_test.go index c787dd00263..ec26d5ce0a3 100644 --- a/packages/relayer/processor/wait_for_confirmations_test.go +++ b/packages/relayer/processor/wait_for_confirmations_test.go @@ -11,6 +11,6 @@ import ( func Test_waitForConfirmations(t *testing.T) { p := newTestProcessor(true) - err := p.waitForConfirmations(context.TODO(), mock.SucceedTxHash, uint64(mock.BlockNum)) + err := p.waitForConfirmations(context.TODO(), mock.SucceedTxHash) assert.Nil(t, err) } diff --git a/packages/relayer/processor/wait_header_synced.go b/packages/relayer/processor/wait_header_synced.go index 47acae12baf..6e957f55e75 100644 --- a/packages/relayer/processor/wait_header_synced.go +++ b/packages/relayer/processor/wait_header_synced.go @@ -8,7 +8,7 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer" ) -// waitHeaderSynced waits for a event to appear in the database from the indexer +// waitHeaderSynced waits for an event to appear in the database from the indexer // for the type "ChainDataSynced" to be greater or less than the given blockNum. // this is used to make sure a valid proof can be generated and verified on chain. func (p *Processor) waitHeaderSynced( diff --git a/packages/relayer/prometheus.go b/packages/relayer/prometheus.go index 80cafab8db6..a586bd84c2d 100644 --- a/packages/relayer/prometheus.go +++ b/packages/relayer/prometheus.go @@ -130,4 +130,24 @@ var ( Name: "unprofitable_message_after_transacting_ops_total", Help: "The total number of processed events that ended up unprofitable", }) + MessageSentEventsAfterRetryErrorCount = promauto.NewCounter(prometheus.CounterOpts{ + Name: "message_sent_events_after_retry_error_count", + Help: "The total number of errors logged for MessageSent events after retries", + }) + MessageStatusChangedEventsAfterRetryErrorCount = promauto.NewCounter(prometheus.CounterOpts{ + Name: "message_status_changed_events_after_retry_error_count", + Help: "The total number of errors logged for MessageStatusChanged events after retries", + }) + ChainDataSyncedEventsAfterRetryErrorCount = promauto.NewCounter(prometheus.CounterOpts{ + Name: "chain_data_synced_events_after_retry_error_count", + Help: "The total number of errors logged for ChainDataSynced events after retries", + }) + MessageProcessedEventsAfterRetryErrorCount = promauto.NewCounter(prometheus.CounterOpts{ + Name: "message_processed_events_after_retry_error_count", + Help: "The total number of errors logged for MessageProcessed events after retries", + }) + RelayerKeyBalanceGauge = promauto.NewGauge(prometheus.GaugeOpts{ + Name: "relayer_key_balance", + Help: "Current balance of the relayer key", + }) ) diff --git a/packages/relayer/scripts/abigen.sh b/packages/relayer/scripts/abigen.sh index 2a25191ffee..57aab341fcb 100755 --- a/packages/relayer/scripts/abigen.sh +++ b/packages/relayer/scripts/abigen.sh @@ -1,4 +1,4 @@ -#/bin/sh +#!/bin/sh if [ ! -d "../protocol/out" ]; then echo "ABI not generated in protocol package yet. Please run npm install && npx hardhat compile in ../protocol" @@ -11,9 +11,9 @@ names=("ERC1155Vault" "ERC721Vault" "ERC20Vault" "Bridge" "TaikoL2" "TaikoL1" "S for (( i = 0; i < ${#paths[@]}; ++i )); do - jq .abi ../protocol/out/${paths[i]}/${names[i]}.json > ${names[i]}.json lower=$(echo "${names[i]}" | tr '[:upper:]' '[:lower:]') - abigen --abi ${names[i]}.json \ + jq .abi ../protocol/out/${paths[i]}/${names[i]}.json > bindings/$lower/${names[i]}.json + abigen --abi bindings/$lower/${names[i]}.json \ --pkg $lower \ --type ${names[i]} \ --out bindings/$lower/${names[i]}.go diff --git a/packages/relayer/scripts/swagger.sh b/packages/relayer/scripts/swagger.sh index 2ba0cac2c3a..3a45b8beaac 100755 --- a/packages/relayer/scripts/swagger.sh +++ b/packages/relayer/scripts/swagger.sh @@ -1,3 +1,3 @@ -#/bin/sh +#!/bin/sh -swag init -g server.go -d pkg/http --parseDependency \ No newline at end of file +swag init -g server.go -d pkg/http --parseDependency diff --git a/packages/relayer/types.go b/packages/relayer/types.go index 83a1532ca66..657d22d63d9 100644 --- a/packages/relayer/types.go +++ b/packages/relayer/types.go @@ -6,6 +6,7 @@ import ( "fmt" "math/big" "time" + "unicode/utf8" "log/slog" @@ -21,17 +22,6 @@ var ( ZeroAddress = common.HexToAddress("0x0000000000000000000000000000000000000000") ) -// IsInSlice determines whether v is in slice s -func IsInSlice[T comparable](v T, s []T) bool { - for _, e := range s { - if v == e { - return true - } - } - - return false -} - type confirmer interface { TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) BlockNumber(ctx context.Context) (uint64, error) @@ -155,7 +145,20 @@ func decodeDataAsERC20(decodedData []byte) (CanonicalToken, *big.Int, error) { return token, big.NewInt(0), errors.New("data for BigInt is invalid") } - canonicalTokenData := decodedData[offset.Int64()+canonicalTokenDataStartingindex*32:] + // Calculate the starting index for canonicalTokenData + startIndex := offset.Int64() + canonicalTokenDataStartingindex*32 + + // Boundary check + if startIndex >= int64(len(decodedData)) || startIndex < 0 { + slog.Warn("startIndex greater than decodedData length", + "startIndex", startIndex, + "lenDecodedData", int64(len(decodedData)), + ) + + return token, big.NewInt(0), errors.New("calculated index is out of bounds") + } + + canonicalTokenData := decodedData[startIndex:] types := []string{"uint64", "address", "uint8", "string", "string"} values, err := decodeABI(types, canonicalTokenData) @@ -164,11 +167,37 @@ func decodeDataAsERC20(decodedData []byte) (CanonicalToken, *big.Int, error) { return token, big.NewInt(0), err } - token.ChainId = values[0].(uint64) - token.Addr = values[1].(common.Address) - token.Decimals = uint8(values[2].(uint8)) - token.Symbol = values[3].(string) - token.Name = values[4].(string) + // Type assertions and validations + chainId, ok := values[0].(uint64) + if !ok { + return token, big.NewInt(0), errors.New("invalid chainId type") + } + + addr, ok := values[1].(common.Address) + if !ok { + return token, big.NewInt(0), errors.New("invalid address type") + } + + decimals, ok := values[2].(uint8) + if !ok { + return token, big.NewInt(0), errors.New("invalid decimals type") + } + + symbol, ok := values[3].(string) + if !ok || !utf8.ValidString(symbol) { + return token, big.NewInt(0), errors.New("invalid symbol string") + } + + name, ok := values[4].(string) + if !ok || !utf8.ValidString(name) { + return token, big.NewInt(0), errors.New("invalid name string") + } + + token.ChainId = chainId + token.Addr = addr + token.Decimals = decimals + token.Symbol = symbol + token.Name = name amount, ok := new(big.Int).SetString(common.Bytes2Hex((chunks[canonicalTokenDataStartingindex+3])), 16) if !ok { @@ -190,7 +219,20 @@ func decodeDataAsNFT(decodedData []byte) (EventType, CanonicalToken, *big.Int, e return EventTypeSendETH, token, big.NewInt(0), errors.New("data for BigInt is invalid") } - canonicalTokenData := decodedData[offset.Int64()+canonicalTokenDataStartingindex*32:] + // Calculate the starting index for canonicalTokenData + startIndex := offset.Int64() + canonicalTokenDataStartingindex*32 + + // Boundary check + if startIndex >= int64(len(decodedData)) || startIndex < 0 { + slog.Warn("startIndex greater than decodedData length", + "startIndex", startIndex, + "lenDecodedData", int64(len(decodedData)), + ) + + return EventTypeSendETH, token, big.NewInt(0), errors.New("calculated index is out of bounds") + } + + canonicalTokenData := decodedData[startIndex:] types := []string{"uint64", "address", "string", "string"} values, err := decodeABI(types, canonicalTokenData) @@ -199,10 +241,31 @@ func decodeDataAsNFT(decodedData []byte) (EventType, CanonicalToken, *big.Int, e return EventTypeSendETH, token, big.NewInt(0), err } - token.ChainId = values[0].(uint64) - token.Addr = values[1].(common.Address) - token.Symbol = values[2].(string) - token.Name = values[3].(string) + // Type assertions and validations + chainId, ok := values[0].(uint64) + if !ok { + return EventTypeSendETH, token, big.NewInt(0), errors.New("invalid chainId type") + } + + addr, ok := values[1].(common.Address) + if !ok { + return EventTypeSendETH, token, big.NewInt(0), errors.New("invalid address type") + } + + symbol, ok := values[2].(string) + if !ok || !utf8.ValidString(symbol) { + return EventTypeSendETH, token, big.NewInt(0), errors.New("invalid symbol string") + } + + name, ok := values[3].(string) + if !ok || !utf8.ValidString(name) { + return EventTypeSendETH, token, big.NewInt(0), errors.New("invalid name string") + } + + token.ChainId = chainId + token.Addr = addr + token.Symbol = symbol + token.Name = name if offset.Int64() == 128 { amount := big.NewInt(1) diff --git a/packages/relayer/types_test.go b/packages/relayer/types_test.go index 0444a7d7148..069f1229512 100644 --- a/packages/relayer/types_test.go +++ b/packages/relayer/types_test.go @@ -13,16 +13,6 @@ import ( "github.com/stretchr/testify/assert" ) -func Test_IsInSlice(t *testing.T) { - if IsInSlice("fake", []string{}) { - t.Fatal() - } - - if !IsInSlice("real", []string{"real"}) { - t.Fatal() - } -} - type mockConfirmer struct { } diff --git a/packages/relayer/watchdog/config.go b/packages/relayer/watchdog/config.go index cbb91160b3d..b73fb9af15f 100644 --- a/packages/relayer/watchdog/config.go +++ b/packages/relayer/watchdog/config.go @@ -55,7 +55,7 @@ type Config struct { DestRPCUrl string ETHClientTimeout uint64 OpenQueueFunc func() (queue.Queue, error) - OpenDBFunc func() (DB, error) + OpenDBFunc func() (db.DB, error) SrcTxmgrConfigs *txmgr.CLIConfig DestTxmgrConfigs *txmgr.CLIConfig @@ -94,7 +94,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { BackoffRetryInterval: c.Uint64(flags.BackOffRetryInterval.Name), BackOffMaxRetrys: c.Uint64(flags.BackOffMaxRetrys.Name), ETHClientTimeout: c.Uint64(flags.ETHClientTimeout.Name), - OpenDBFunc: func() (DB, error) { + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -103,7 +103,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (db.DB, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/relayer/watchdog/config_test.go b/packages/relayer/watchdog/config_test.go index 29f93142b99..727d24a8a12 100644 --- a/packages/relayer/watchdog/config_test.go +++ b/packages/relayer/watchdog/config_test.go @@ -5,10 +5,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" + "github.com/urfave/cli/v2" + "github.com/taikoxyz/taiko-mono/packages/relayer/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/mock" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" - "github.com/urfave/cli/v2" ) var ( @@ -64,7 +66,7 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, uint64(10), c.ETHClientTimeout) assert.Equal(t, uint64(100), c.QueuePrefetch) - c.OpenDBFunc = func() (DB, error) { + c.OpenDBFunc = func() (db.DB, error) { return &mock.DB{}, nil } diff --git a/packages/relayer/watchdog/watchdog.go b/packages/relayer/watchdog/watchdog.go index 8de4f9df6c5..36ed241793f 100644 --- a/packages/relayer/watchdog/watchdog.go +++ b/packages/relayer/watchdog/watchdog.go @@ -3,7 +3,6 @@ package watchdog import ( "context" "crypto/ecdsa" - "database/sql" "encoding/json" "fmt" "log/slog" @@ -14,6 +13,7 @@ import ( "github.com/cenkalti/backoff/v4" "github.com/cyberhorsey/errors" "github.com/ethereum-optimism/optimism/op-service/txmgr" + txmgrMetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -21,23 +21,15 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/log" - "github.com/urfave/cli/v2" - "gorm.io/gorm" - - txmgrMetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" "github.com/taikoxyz/taiko-mono/packages/relayer" "github.com/taikoxyz/taiko-mono/packages/relayer/bindings/bridge" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/encoding" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/repo" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/utils" + "github.com/urfave/cli/v2" ) -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} - type ethClient interface { PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) @@ -66,8 +58,6 @@ type Watchdog struct { srcBridge relayer.Bridge destBridge relayer.Bridge - mu *sync.Mutex - watchdogAddr common.Address confirmations uint64 @@ -80,7 +70,7 @@ type Watchdog struct { msgCh chan queue.Message - wg *sync.WaitGroup + wg sync.WaitGroup srcChainId *big.Int destChainId *big.Int @@ -194,8 +184,6 @@ func InitFromConfig(ctx context.Context, w *Watchdog, cfg *Config) error { w.confirmations = cfg.Confirmations w.msgCh = make(chan queue.Message) - w.wg = &sync.WaitGroup{} - w.mu = &sync.Mutex{} w.backOffRetryInterval = time.Duration(cfg.BackoffRetryInterval) * time.Second w.backOffMaxRetries = cfg.BackOffMaxRetrys @@ -214,6 +202,11 @@ func (w *Watchdog) Close(ctx context.Context) { w.cancel() w.wg.Wait() + + // Close db connection. + if err := w.eventRepo.Close(); err != nil { + slog.Error("Failed to close db connection", "err", err) + } } func (w *Watchdog) Start() error { @@ -230,7 +223,7 @@ func (w *Watchdog) Start() error { go func() { if err := backoff.Retry(func() error { slog.Info("attempting backoff queue subscription") - if err := w.queue.Subscribe(ctx, w.msgCh, w.wg); err != nil { + if err := w.queue.Subscribe(ctx, w.msgCh, &w.wg); err != nil { slog.Error("processor queue subscription error", "err", err.Error()) return err } @@ -247,7 +240,7 @@ func (w *Watchdog) Start() error { go func() { if err := backoff.Retry(func() error { - return utils.ScanBlocks(ctx, w.srcEthClient, w.wg) + return utils.ScanBlocks(ctx, w.srcEthClient, &w.wg) }, backoff.NewConstantBackOff(5*time.Second)); err != nil { slog.Error("scan blocks backoff retry", "error", err) } diff --git a/packages/snaefell-ui/CHANGELOG.md b/packages/snaefell-ui/CHANGELOG.md index db6d597731b..069e06f044f 100644 --- a/packages/snaefell-ui/CHANGELOG.md +++ b/packages/snaefell-ui/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## [1.1.0](https://github.com/taikoxyz/taiko-mono/compare/snaefell-ui-v1.0.0...snaefell-ui-v1.1.0) (2024-06-18) + + +### Features + +* **nfts:** snaefell ui fixes ([#17391](https://github.com/taikoxyz/taiko-mono/issues/17391)) ([14a9939](https://github.com/taikoxyz/taiko-mono/commit/14a9939f417ba73fd32c35099a067ae8b56e99bb)) +* **nfts:** snaefell-ui pre-mint disclaimer ([#17484](https://github.com/taikoxyz/taiko-mono/issues/17484)) ([99731fa](https://github.com/taikoxyz/taiko-mono/commit/99731fa66a6e961d7d964b9dec43de5bfaa905bc)) +* **nfts:** snaefell-v2 contract, ui adaptations ([#17614](https://github.com/taikoxyz/taiko-mono/issues/17614)) ([728657f](https://github.com/taikoxyz/taiko-mono/commit/728657f379f755e72b1a93ff4c70998cdeed26ac)) + + +### Bug Fixes + +* **nfts:** snaefell day1 fixes ([#17420](https://github.com/taikoxyz/taiko-mono/issues/17420)) ([34f1ae2](https://github.com/taikoxyz/taiko-mono/commit/34f1ae238a6f209d6cefdb6adf6d4b42236dfe82)) +* **nfts:** snaefell fixes, v3 ([#17401](https://github.com/taikoxyz/taiko-mono/issues/17401)) ([7f40e3a](https://github.com/taikoxyz/taiko-mono/commit/7f40e3a20b3cdce375990e24cd22cd71f913fc01)) +* **nfts:** snaefell ui chains modal and counters ([#17395](https://github.com/taikoxyz/taiko-mono/issues/17395)) ([91d1a34](https://github.com/taikoxyz/taiko-mono/commit/91d1a34ee0ebdbff09b1b7c8205934104a3b8382)) +* **nfts:** snaefell ui fixes v4 ([#17414](https://github.com/taikoxyz/taiko-mono/issues/17414)) ([ee9b711](https://github.com/taikoxyz/taiko-mono/commit/ee9b711b854f3df1b8bdea91be352e53222ac4bc)) +* **nfts:** snaefell-ui figma implementations ([#17400](https://github.com/taikoxyz/taiko-mono/issues/17400)) ([cca2358](https://github.com/taikoxyz/taiko-mono/commit/cca235839ac099b351a60966dd00ce59bfd9dcd2)) +* **nfts:** snaefell-ui fix date ([#17425](https://github.com/taikoxyz/taiko-mono/issues/17425)) ([5bb8bf4](https://github.com/taikoxyz/taiko-mono/commit/5bb8bf458c5828e91e021a1b5ef481a0b2785de5)) +* **nfts:** snaefell-ui fixes ([#17398](https://github.com/taikoxyz/taiko-mono/issues/17398)) ([53b74f2](https://github.com/taikoxyz/taiko-mono/commit/53b74f20a9e1581973f3a47390d792d2f6921f96)) +* **nfts:** snaefell-ui scroll fixes ([#17402](https://github.com/taikoxyz/taiko-mono/issues/17402)) ([a72e187](https://github.com/taikoxyz/taiko-mono/commit/a72e18753c77912b69f6317394b9b95a9b61d660)) +* **nfts:** snaefell-ui, show success panel after user has minted permanently ([#17447](https://github.com/taikoxyz/taiko-mono/issues/17447)) ([efb7610](https://github.com/taikoxyz/taiko-mono/commit/efb7610417160c0c44524badcd6e5c6e590da051)) + ## 1.0.0 (2024-05-28) diff --git a/packages/snaefell-ui/package.json b/packages/snaefell-ui/package.json index 4d80c0222bc..c90aa48f828 100644 --- a/packages/snaefell-ui/package.json +++ b/packages/snaefell-ui/package.json @@ -1,6 +1,6 @@ { "name": "snaefell-ui", - "version": "1.0.0", + "version": "1.1.0", "description": "", "main": "index.js", "scripts": { @@ -15,7 +15,7 @@ "format": "prettier --write ./src", "test:integration": "playwright test", "test:unit": "vitest", - "start": "npm run generate:abi && vite dev --open", + "start": "vite dev --open", "generate:abi": "cd ../nfts && pnpm compile && cd - && wagmi generate" }, "devDependencies": { @@ -23,7 +23,7 @@ "@chromatic-com/storybook": "^1.3.1", "@playwright/test": "^1.28.1", "@sveltejs/adapter-auto": "^3.0.0", - "@sveltejs/kit": "^2.0.0", + "@sveltejs/kit": "^2.5.21", "@sveltejs/vite-plugin-svelte": "^3.0.0", "@types/eslint": "^8.56.0", "@types/jest": "^29.5.12", @@ -60,7 +60,7 @@ "@wagmi/cli": "^2.1.8", "@wagmi/connectors": "^5.0.6", "@wagmi/core": "^2.10.4", - "@web3modal/common": "^4.2.2", + "@web3modal/common": "^5.0.11", "@web3modal/ui": "^4.2.2", "@web3modal/wagmi": "^4.2.2", "@zerodevx/svelte-toast": "^0.9.5", diff --git a/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/MintDisclaimer.modal.svelte b/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/MintDisclaimer.modal.svelte index d0c154414d8..876325f3400 100644 --- a/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/MintDisclaimer.modal.svelte +++ b/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/MintDisclaimer.modal.svelte @@ -4,7 +4,7 @@ import { browser } from '$app/environment'; import { Button } from '$components/core/Button'; import { account } from '$stores/account'; - import { Modal, ModalBody, ModalFooter, ModalTitle } from '$ui/Modal'; + import { Modal, ModalBody, ModalTitle } from '$ui/Modal'; import { bodyWrapperClasses, @@ -44,13 +44,12 @@ I agree to the terms and conditions mentioned above. - - +

      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]ssb_B6rf7D}>tof94tdFb5B$>Hy)c9=Y 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%0AtZwL=@j%e) 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 z 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

    @K; zb7My0K$iMdZGsonpL=#X)llkyMSKkas0YiTs@X2pq+9rNzn?a9W}Kx04#CmT7@lib zmU!2L1n&E5Yr@bng+Z(dNmCg`v8q6qx=j!!r}SbM5ODb_3}^MiUJMF-3G0EP2jzsr z-4;hNr`LOUF!HFXMEWJSEtz_UL6trR&C>?~j1j&Ak`J6J?n_DEKDQl~VM5zYeNpS> z;Q{d?pi(_fr-=WFBZdLJj%rjY|MPVUqN9ab4>y&gEGbc1|E^r!yW8M&kgExQK=OVe zgD)P&zm@f*)w{`GC|C59INdGJXPGN%911RPtQv_fllLY+Wk@i~d|;QY?aAwP5Bgxb zl;*ykcufYcdPK+g``;Q&0oIQxPi<3{kc+Pa*2ecd&Buy?muGUO`^55zT?^Flo3iW= zc@@(pUxws1<_r3r9fsm>)$TQ{W>aD@V^1Uj-DdARoR3@fz4q;x>-cb8=DMbeHPXNX zv4|tm#6!iQxu98LEe)+jFoB}+x?f`opy~@$7I}8Zoimf_-yn435u$fA(8;3Jnj#9n5|2hy zrng(hya6X<%%(3UZ`x<)Sjh`VY6Y#wH9|E0$=+^N{wMcaAatSnn93B{ z$?^(qn^P6G@eEXcKj0>VjofMC5u=5v+B{rsnB-)6`P*4#Rc`F$ldZy%FcnKg9M>Z7 zwk#-%s`A|`4XtJwjerztA7K!K%$QdN3|KU^idnF2}5)Ew<*gjQ{LUUESEXquana+8Xho8*Rek*8nKJDlWi-(;Md8LOQOg%!p>T zjh?8RRQ3#NoksIQ^fv+iBgCxU3%=bwV zGklcA!vif(;m)D5g&};oGgW7IYLc8$Osp{zsu^a?Hag!E78xG9Qk26rDJB#@6EWWf zzyE~f>1MI4gSL8{FaO3!5+~_*3~m@N6G?UZe*wL?!3`&pXLGo!j=3R9)MQX9Pg;KG zz&>Gs?OC!aiF1EHIRgX;f%oT>-Hxk^iO$ovDMrFhy~iP$d1bL!gkD>@1Hc+Em1f?O zdys6L!9@|X(?vcWs+>TUaU26_LA^?5xhSbcVtq-O^OGxPOn?%x8fSl|zA~+XH#9#T zqCZDbV^2|tcOFIR*aO`cUH-9se2{}BvK%5dOlJZl?>>$@ghJuiqgY1hd6XuD65vNhBf=Y<7o5FRC)aR>=p z)^MgA3>qZtvp{uyL9~8kS;RqZ{&t^WP?;bTg*q$lvA<+X?34GOS|j@Q~~$`>9IZ z2rP�G^M8C?9U*Uy~Ar7Xa-K5~vYOd{B0y=79Pa$5cDCFD(sUY9R!0fM``I|L2x?(SY%+@ZJ!cP(0+;!sL) zcb7tOD9}=zLL12B{eNrbduP^M&&6ElE-N|DdG`73y+_Q?tfTm<13v`t4r8-fGs~zi z0<)lYENFC!LNogb;6M!X=*n@CU*X7D&?qFNeP&C{B?ZH71)@jRF_D}6;Z(DM2n=|G z3lchF!o-X{S$$qL4+BBEYxDte{?#y{4=*A*P#%;1=P@{*U#s)kE@Y{BQW{ltfm#-o zpXxb|1N|m3%vy#Peuu`?6~p(!Kqf$n7(jSgjHH6v0i)n87x?FkS==LJNKb>{X6Fck z?mKKVeMR;L`DHC>c}y>#S2C|;(mI(&>h0N1$(a!oqF(HXhT>!SqxsUDn^z092ZzCM zCJ)Ovi#8zdT*<9vDXsaQMz6e9PH|981ka!u>3_G<(jo}_A8#Fqna`g))%OIWfeh5q zs2b%8@v_adD?$r7vXPS+I=#wE2jgLc9I>2%*Q@pMxF%DKDi>BF9;u_0VNBMF1w(zs+ zd@+Um`neT{b>r2#D#t~5<~;9k5ut(nnlb#+wfAQEeHbF*@cVEQ9MZk;rCGZa{wBgK zHTHE{#uOIVH|lAg$Q$-eDrw5HbsqEF5OW;DyiTUFm*_oJwhx z$ktRIM`Zj7@BVh(1c^OD?+u0PyT!y%_~13?Q2E+vAO3>SrUkB)hZooN^NLzaJ^-SM z6}kg9Q$mrLRZgP&^;?sv-2jtX@FL&RAz<}N$81IB#^DU_VixIQ2s~mnMclR=E`fUf zsh*HJbUQ$$_)FU(Ljd=a&eS&t!I0)e7L5sKvQj)%9c2s(;2|(NKWPJ|kjvEmwphHMz9CeG}HYfa=ZFA1{mWnsGsJJyisksmgc*E4$F25%Jg2$ni0`4X0p+>?+ck0aX6@mLzdw1a#h4GANh_Xey*5q8kHa7+>Tl zcPDh&-QeQge`$Bf)C&=W0D1g0QA$63N=1}`=tJ`eN#-6R&cY3CefR_~@(@`R z<1jJ2?~YBk44}%yK+>BwLe;DtO>8`XfcZ*BMpiyA4E>O11Z2&P! zT&!c*P7;7wbM~YKoMZTSOXCrzUTP?V=j!NUs1cA-gb?UBi!BIPjVYf3<9)5NbA?Mc z5sqX{6|bn8sAd89P|cr>PKuasl))+k2z^scjQBS*{9i&6@ZYQYbK%v;Q5;SeMH77Z zsy-Y${KEB_IqmCk5{a3$PtA{A0UN|zt}W$O`!p_?rDXJ23!R|ze2EaDN$W|C2~3xd zlIIePtd#DwTTk2BjuJH^*6>a{$XHJ*r-@tK}gbB=6rmG<=O^Fca8c$Ht{j|1Iviu@@j|LvXbJ z><82vE8!%>`p_O_jc-+YTOROeSQt8*y5A{qW6GtGF>lZE{zyQbeLA9ZS((B?Pm^Zr zxh**oyOaJPoR)b5emjfbP-VG->Z$Ydi>?$&i;2o(3!Qo7QFGE4INQc!ym(E4bDIa# zJo-taw1i+Yd4xg}@M}{XgIEAPFY8O|9ys)rK$G!p^R=2sb^sEN0G?3Rs&Wq}bDGfj zfbOKiT<%R!}8$U)^w zOxbxuT8u0q)^aq}1FagITk7;_{M2;Er-^;fFgS5r3<*2~N6g4+g3FA{CZy7%2V{w2 zHt=Rz;4A|~a>mDJ10FVAf!?s?%m2C&@C;W(;5L^iY@54-c}jyv+c>H%WbbqEphpD` zpG^B$%G!@zHJsmBnpv3WS_$7e`)Ql2|8p7oTOWG7(_gSozDx%eJ!v z)fQJ&2eN=nY3&TZRGplcU6~BVGvEl5=GZ5Xq!vABvOKOOUVyVJm*F=%H`yfOAj%3A z^2`xib`w}7+>5eqtvowSGAMfOLWFgPHS5TvrUrU>gp(LGL$-H|_JNsm0_s0xv&wN3 z^wd~V9~Eh55futNID?Mh&!QX%j853Z=@}_0Zrfv7POg zOpC9@-{K1o!Sl4xVcG)=SA!GRl8^g8vI~N-$TQ+~k(2x>D=2voW`$}H8sj#!XvH7L zsgN^LxS>N-(9g(oraC!#oXRrPP_*!Ws?^mPBIKV^kode9f_=&e_6kSDyYB`G)0GuY zRFp8@M+`MO@6+VGijju-qyvJp%7~zaBaBit^e72%^{6yXs39HTJi#o1`w6+)dOt-~ z&{G=VGAcZ!gX<)3M>HI6rQ;Pjni5_?8nKr(+Q*s(uWO*#eWk=@&Ihmn*pb%^AArlR z^Q@c85;*Fj#UVDSB9V5a6Y+||(R2Vsj10PY=~&?z9e~LmB6W9noaD`ZrY$Q2#r#GL zZ~1lVAJ9>RaWpFJAVSLfZA8K;ZAF?@M=aZhAtKVj0Ze3*FT-$K=+wX%Aua*I@-aOL zAOaCvej!|qUp_`6dW_pG9b%z=$h#hZ$`Qeq#^8+1P~ZIF%q<<$Xgih}5rbNe_X-zH z5Saj`TrEU~sIGD45kvZyb5hn7aWsxt zvxkUtAcBbUn<}{_0;UUem`D@zOu?8hG0nW9ko{Td-%9;I16KGI+ka^x&%swbC~0gS ztjX{JyWej=Nhy^DcUFv$;smOgcdG3PM65TNz?~JeaCJmVg<><^ejcUPSXD;K--{8Tt-1}SAZ0owt4#AN~{%3^EVPU(dFG*OtVg^la>9gYeyOk;)RIR?O z9PdTtg-HZ_zAiZl_EnR=I6QWJbM8L5nN`hJzXiKG_=gs)f9F!LcGH5zFu8wgv>7qa zopsbO%Jlw0{b zRUEOS+&q$o|7brRrN>E2s%K;98$Yh3L59Zm>0+W8u@jqL!of>~J z27JM$$5>AO$L_C5Bk*=3Aw@zAjV2X#7m>a&y(7rttz#r;_x*-Tw*ACW29>g8sh z$GA__mZRh!u=Q>CB4*Jkl(drjv$nUR%Cz~R22JsiVO4TJbk&(AyL}0R8TM!^2T+H4 zVHTYwoK1174^}2|yE1>piF+%iKPjvbco0MXcLs)sh#_~100&)>;TYKiNC2YAm;C1_ zYoMExDWIYD_y8KE)Sx^4SlX7uk2J9o=T*bLI1 zSfYJ1*IIOb&?v5^mYNF9F5XZx9E#)~J2#fM%-v2b16OS-=q%QBiac-)e2&(21TlBi zef1XC@)=Vvg`#-mcZztbI@`)?RQC10GezlpBp0Po3G@@efZH)fN-=Qc)~VXY)7#IrUJ!;z{POM3XvF zb{k_Pg%Mz_8INbA2(3N(%myS%z%uFvB1?bHHGLk#Ph#GW)*H1uvEc%)?Tjp^C*g$B z)D>Eic(vs=Br=nQi{a7UEQsExkM~1PRwcm$MP5_l-SJT~f?{fS2r`HW z*SM50{of%>Ug6wV;+N7NB(EO-3YA(7jtFQ76N(OjrDzc_kI=~H7siCYN=rt-&-S4M zyAM4grEvaB(&P|T?hSVK0mcMjtJpWIf)XsFA zpoJ7ZLX}vJfwFj2>qSM=m4iBn46cLma01|Z5Pjej&-LdqVT7_Bxy?SdZ-^Yl1Zk|C zyf%UuKXL?YLWyj4gTXj_o?503)fk|HU!qY*b8R6JzR$fZ?yRm^gQ&7lwgm&(Nd7XM;smul`dHR{98PjyYbkHCk9^5SX&hn^ z19QX@zP$NbnZHbl)RP`KEh1EAL-|3;WgU@&J;eI23EwQn!%Dw|s4adQFdQ%~OJXOW zvY$rU#N0-~rch`JdciIZy87wx30ddxP({0C$SYG`oZ5NQtKP~VrM%u}!MxFiM>J#X zIkkIW3my}_{PYpu)93gKh3bs^2HY_KQIe`xre%|~q=q+o)Bt`xT8%IIw$23ivP4Ll zLw`hziEdV7eIe3(`Oyi})XBG1aIS<3$l@Yv2;qW`Jy$fv@1B=b!k#6|t-wh6x2f1L zeVqw#3#|fB05Cd?>Y38$lxFuGswa!z1`z-<(_*%3#NR^?^JVSv?zO~Ii{Q;+Uy7`U z2$9m|aOmx}mD9xTptlg&Z9+74@n3{YbU|H>)p`UhmHTvDFHnIA(()Kqav2J|m0aq( z=R;#!lxNwm(vH!w=nROp80GK8bcccL<4jK4y1604IHIs4Jk$5h+fS(=N?(3z9hn#B zGl5I&U;+S`H;Fd`yf}T|DEKSh~K@SiMuNY$l$Ic75j5Ydz32=mTgv!*1&NP8eX`gX0h?nRRJaJNiDP{TXMvJe_ z9$7`H6S$nt(R4I~#WM$}m}Wl?<(~o*`${Y=7!ETktRbNw|MzwMpC3El|9oa+P%3Nh zaaf|jWTJAK%jDv?sEN0k)Zz6-_++-*tm&&@GmKo7=?+MRO47;8J^e-!aku{GjN+s2 z*R))3b8QC`J7!7yEdS~!FA3cqF&bmr1PXLr5?48qCov;GY2h}S`ota zd@=JGUq1OO&tA8XkYYzbf^~gFo+GV7JEF^T?S7^9|Hw<07p2y^BuZ- z!6?M>1=LT?@Is5H=UcUqoA8R6Na8bmb=p7JJ~qKbhE8SDM|phFgfO2a8s7U2ff;bS zWEO;%LsO|NiGFTkiY2tUEKVApH6sUq&??eUSEiC>9E;@a~EL>;c_8YQ-U)&E8R5NlGzNvMC_P#es-dg>Rqe5H8Gw^<;J+I?45YKS$|v$?_@Epa^l;-#%^zYL!FN- zMOH?|tr}v-<_wT2jwJ5{S~2!n1N#hYMsnVANf?Q`*qZS_f|YG0ge6X5X)@4X>-qMu zvB-AM`%U05w#YhXoR07=`VIPFZm$5w?oh`PW{eS4t)J+z_AMY6AB9dkYCil{nfB6S z)PUx-K>$_EmnymWFY;!L7&43DNNTj-71qXm7P33Bxo_?5lDV0xboDQ=|DvcdeW(!8 zzPgpKP`C9(NSGCQt4;b&&ULvWMW6#+V21q+cKBMV1gfVZBZjERtEvxh0z?TsF`x^& z!AY=*a_g1=wEHWB6f?pol3wE&4zKG}A-K5pR6i-0c8%+i$3Ro3JqniH2O!}v5K$7M z6WVI0F|Ne0b~eYDQwt}%oF2qr><=ITF}>oDBjNCtjf-~XnZ;KGLl|G%Dy9@b6f zC{J)dz~1NEcgVtq z)}O=dBM=H1wRU^VDLxVVjCs>;MmnL?b@W^sa@%^rBHEPFIK?6ZFV9h8vEGZSnSHc? z@8Ja_2}7~ZSP%2Xa>GctKfXP{4ITRP+>Rk1G`9PVOXQ{vB`7x70!{|7y_wY41>;J` zoPo}8<--uR^X7F7<;DKz*>nM=^~9ih>&LfMi4UJ`JH0}GslreUpRG7GLGgP-v1(rtTV|l zQAV01ISTO3ms<<)Qe_GBZLNqv^+JcRzR2i*U_D1(ILGs1&ecJsWJ7MW>6iM?b@GORB*YBc}J z*5x$!Oak}i$*9shQ~vo{*3FryE5aMJgpuXR4|6IlMnvIH1v|=nAQE^y^3Q!N2){0n z-WtJImn@*m1`3XMV^%qR4BAMjnyrE-f^cu_#SzEc!SmAJp(7{hACk*y2?B+l*i9}8 zpHj0FN?PGvU~n4+j}Edo22=Pcp9-gMGDiw%qb3K?gJR;X&XQVm4By{LS&w;cygDb~ zZC?z)0f!;}UtozhnJLmK!uMLCFxD9l@kVKJKKN_7UxL^^L=KCTI+(LbYb$^tHEBa) z*+L%K!458O6s_`mrIsFQ&d?Ut#=}i9W!|O(S4Xpa2aMhXnVb305?^6kazexU!Kw5m6zoTL2G9)^&z=M0*Ex)RUS zw`HD)s`teVJc{_KA$FjSG;6ryLI9zhXa23p>D#708t2mJ|2=5r3Wcjnc9{KfvuP;+iY61cI`>0 z>-Jh?T)5(sKQA_qlb_ZqQA0H*H!8-j!#)!z2fvC|5If(8IK$(oHh{6bs)hu%;c~?A z=-a^ak+e4p!_<3l`ZCs28d4g84_H(X46sR2xubh`$zLQf5RvNIfJnADfy)2VLKq3z zqZy`~U{$mJmzaVpE75`@}gZi5l&Q;L8>HUc)s%L{WGA-434N5b^VQk6ZzD6v=mx8#6}K!+gm zisip|b!!gjZnW={CuuhrwE0|mPpK^Uz5jz&5{^Cb#pY6^42s_$e--O0 z!~XE0A+%q+P4!5_FZ_Q}i==sA1AT62b3454^2xFeBF%bLR>+qIpTE{+>S)2H2qox% zITLO~G}u35P`E}7BZzyby2q@IA~u?A1V0J=G95s?eDi|lKsOcnQ0_V6LfE{hS@Wgw zLz~Ce>(p`Nrj>%V8oR{iPHcUa9@{IW;(!m|*uT&=7>{=`k&sSPC?;cja=?B+yDxQl z;$$9%2xBvJMqG53XF|1}q;Ifn5WFFoh4N;w%B3{*Up@yZ(!VHwr$%C5{7&_EtkSo( z17uXbf5%8>KWp;&)dY|b1X{t-K-bKmlB@0>$>G};{H;TQs&O-~$|kmksg2aaq%C|A zTA3{8Rvf992;%O5NW$EF_naC@@0XI1iie0L*PxjIbtk|bj;geQ5|A6l%8+J2ghCff zlQU2W$)n`EfxC8#n1K8^foIyOB#o_8vQDDj=|WTL41fTxi}E!37X6`b;8D)@so)$8 zy<}13T6!SQFn}G%mxDq0U2uYy0m9J)N6~~fB;*{c0h5~*Ne!q7|5|Eq5pLm(4g&mF zf&2>g?``-0`wwVe@xB^B2tfE>-72Mn5ml;G|JAJmBw>d9^M6Pr;BnpV=3^L7rKJc0 zsI(qUWZ(&u$WQWD4TW)-P1)Dn9M2RAT8)iNwlUAYM+rsr&GY!akgxED`Z?d{Y~h1u zK5;VpD(h;!ahvP6sgC;fkJiJ9RBD|Kn{71k=F?yuF0-V!ySfk#68djFIG0oU)45HS zpF*E-pnrv%cRK=5$Q7Zfyj!DDWQQ>g#y1+8HQ^lxN2g78ZFxf84{rHyPG^gm!nlKj z+RvAq&8nHZ3mV*(IA2RevhZ4x=oGQ{ug?B`@4h#*iGTSl9$>d&mrLPZLfLqCIQKg2 zi{|swY~R@l8_e#*uch~Lkd9y!o|4|cyL7BuY;Yg+>26`P^&^bBKcwUClfP9+>g;++ z=#{~Ex^@cGR!cHMUpG}OZiTN%lSk;$I-0;RpiG*~1-&eq(6oj!7S1);B+v|Hl|?c5 zIhXsgzEsdBP^&ZIiX z_PMsYG<40uxikcye62hfr@+eWqkscD+@R-I_ z80bRbLr%$5oTECK(r z_kO3)UGne4U!E@yIguaxpu{z6g9scF9)mc4Ie3N;1>CMi@p#ldhG{PD;>35&z0g0y z0t8Y;GHmlNCYavO%4G&!kH)Sx)*UEq1a-|e)s9D$OjQ`B0M1-i?STP;2$zG1*sa?|mtRu93*=gR>s zMu}@Knt8n&BraI+)i4D~=r=hXp0xW}*lq7aq)KY$Z&-M${H{J9`1I;fW@XF|016r1~>wvVyMVzdU2N8SJG0cOej-lWX$6sOT<3L zSHuDkSog>n4%=IH{+MUrme;|aO zufj#$l|D1~=E^~MuzNPs*PCls-w~8wtKnSWU2wX>1RC9(i3>oDzq^`cMOlQ2OM(u7 zM$?%LFIOpH6Xmk?!S7wKYPB@4ZYf@noeN(nXh+enyluB}CVAML4@1o=N0F@g!Yf9a z>_u2kUCdg<&b|~)?_PE`@m-PXt4;!DRu#$Wl%(C)g*e5#3Jz=+&F_(UR;wOXuRZ0( zU&?S~M(89sml+(7j0H{u@VON%;3g&4iYnpzT9r(8_8PI881s7z6G>N!jB|r(*=#IZ zrh2#6$!;3n@&U2y$or`*S-oJ4>zF+<8i*uV@^7a0l zds_d=cvE&hHAzbPLPN|{KJJKqrSKWoo2zZ7A7_NKiIHtUi#K-RpwvZJ&O>{#a--Au z&bC(UH*Zw_VlU$}cGbbZ)sVlYdyzSvom}t)V-B;1ZsN|**eM@=kgC+6w647_jeCg7WVFkSs z>AP*T42OAIA-1)C`Fl(k39Gk82(B9VmE9bM;I`jn4H~-o<`F|CVI5B^poC$P#2M37 zS6ahKWm3VRtm#%x2(ufVapsdzy*?ln5oQ#8o13^lcu+T3Id1m%8seK^E4h<5Au7zD z`W@kr(Vc06o7^k?*3X{(@8gtuQ%k02gIzRjzIHjSvm4c7g4KX6jG|i^4RO2zvN&do z-xz?*PN{uhLZhQy~iSIWJ=B;tPnA z{Sx>H|Rw7}z2~ zdwOn8&o!rIb&r`6jY`SshX(N*wJOSMdS!kO`OZ0hH*dESo3B^EbImR`XOMhX!XX)~ z?jQ8K^sRS=Ug)u5>g`hFnopTt-H9&vX+7|lcSEMd57bX2j$aWVnx%-6A&XzV0a1yX zrAVZa%Cq%C^#1w_-+l!cCGC(fB=*51uR@L!}S>Q z8sLbh2OXfKd7826v(^0>(nV+Wxb*&lQ42=o2Sp-*Nu$7Q;cui5@fmBW`XR3C<$f6WED}JokBhV)>LRWG=r8cfm;&k1Zd@*W zcTgH1M1ThhBUX+eHO5Ch#YF`fha$aJi1u)liFB}uw2z3i-w#E-j!0PKR?zeGEsIp5 zkMfd$8Rwk0&h=Tr(QW}iJDvP4fiB?pmjXp5dnusEDwwMu$ z;Ux_>HU?_^j@Iptu_leR%_D6Qh;odO$p4BdPB( zX@C?m1cHnhL&gFi6M2xSZph3AWbP5NK$^S+N?tKeUJFRx$V>j(oxHt~yz`j6N1Ac~ zN;xu4ISEKH1jT|_#ZNZ~g!3qb_+w=0Qm;2sSou=hyHWr(seBWu4;$PskEw{FX~==G z2FkiN0co(BwBYejfT-kHR~V5%I7*-&j%YNJC&kBfQgTrj-^KJRqjYS94E#+z(pHL@ z2uf4qNEQ>y4V?_`Wo}kcD)y(ejR`6t7)JD8I$BZtOg4L3C?72^o4WL5<_leh6gn;1 z5)IvEph*A&{}MeNA_GSTgWye;egcC)WR|B9gZ3o7SUHng2D3eXR27iPPLvrTfxsyv z$KoahaWlvECg*jzE~H#A(Ka{zAj|=QE&d>L>ooW7HnRzlqxB%xo{qh(G4{4IX&RaGBpnO^J@$@>yLj6WFSgW*|?0`EI3#4bDWuNkCn+a!PJX~eP;Zsl_2 zzzQDI3c7R!J3={wBZb|~Xd6ZaGkFDBdqv}{O4BS}QFh?ZfeLfBN}ejG(MswZ%)$L6ai zE2JxiqQ~#63wFo_In>SB>lX2rKBpCIiiDQd)m32X5+B#mKN<(D8pfj-B|4aR`&N3| z=%+atTPc_fV;Xn#5KgG_Wnkh>Nn>wnm-msI1a>rp2pNn_8H?8Jd-SJAWp7Cll9IvkHyn@-Lxu3YhG9w^b6ZT(hl%ypVw zJ)1Fdni>6UQlfFcFW@e#)-ya=|8Zz0e`r2yv&MF`wPCi`>U4+~bujQNLyK?_R&><$ zb5xoF`o6-2@|GjPY^q4jfSlrv+J5;KIj!3Sulv@#IzG5|JGwOyx5-XB_UE_^=6EY@ zx#oD5ooKg-Vv&3qYnM-Q)i!g}4URrXdy6IFj>F<{#_ahgw!n;~6V~Z@vgY}u=xG$p z?pE)4_s|La?n!{=_1lTh#oxzz-H-RTA75~^v%j~ih?^Kmw~#6isDnf!+RrpIL%WM2P1-K5ex2bSd>f z{CnEaUY}NzZmx&4BoTcg2{}XS{7RDEZbmYU6*4OBGBBNszZhKM zkd|_YUSf#Re26(@h_z^ly?2OndkD@Y@lp=+OAHH|4-1D3gNla5dWR*phozvy(v%~z z5+m~FBZ?s-%0(lpz3@Wk5l!fbHsz?U#HhacsA0&canY!0@2L6qs3mmNnsUr`CO(UA zER&UD%4sZ-HQKd>V(JQeBZ9P_76_^z3$MvK)Zzb*Ku{Fk?-vqh<&q7v#`&u~9##}L z&Yt59V^p|@ACH!vULtrI)9=&wxvxqg z%NQ-%?~$*kMxjJy))?99GjxOEFLqvYudI^!XYJ^)1@CaXc&qNZfWO-mXS8Ko;a)7{ zioKsiU!`k5FGOxg_}Eke06moo^l}Gwa>1NHsP)8k15t!DYQ^2#KypeaSKRY(r8wq%>9MZZ zNx3f9ZrzbgMTEM6YekFo!0WCY-I+^-r(@(*@WC}~pnGrcLs=-%PA;yd2l}bUhG*=X zU+R7&&H>fDJzKw{2E%cG(w2)USNCdfN$lh14hRSS#_ApKr6?vbW$+(^gAhNrjbU`C z@9cmh6usUp87S%NJHz{F8&Oj_| z;meyrv?% zyB<@|?|~~y{91etDKpwH-1#N79PcTm8(aWj{HFetpQXJ& zXQ@xckT0ezxt3p6lndx7?dYiq(9`dK#FtG~2=earea{-YX!$e+#Q%kLBVgk-t=T!k zAT!;$U8F#j$x%OXgA?8HqLz||XB4%m1-&eyySkFTa=yOwh`ho~#cz)iyOqY(r+udj zVVO3^__z!rbiek(yT04JF3QE*v-9fLD?5dE!P8-Wg<^w$Z$$-0^1yU%s1k1&Wo{S` z#ZiyTTcs;P(+Mlz4uVp_h=X%d^CZSN#RBhd73Oc1Ql*?bWaqBjpp>Qn%mpj^5plu$ zD+iwEko%kL`#C~Ib6g2a_xnfU2i2TvYgJ{OZz^o_gKk#83hy4`e7;%o{lb(0%a%uiFsQ#fuSYbnKkmqXHId71k`IFJnz=rhq9n)V6nZH}-hFw-BJv@;* zl4h?sEWV31%Rk{fn48W%Vl%Ya!dpJte6T!`ve)bDYm)l zc%DMy#QR~hq4hFg_kwxy+;;}_@vH=mtwT7HXK3v)+M^pp-$z?~^Gr-AFCew{(1%N5hv9nJ;m^=oZAG8zK~zR#6_qY&Q&3!W`~(1Ixxllz`@rS75dBI z-^3omz9vy$P}5L7mK;oy2;hGCjbG5z^P_c(yZ>_NuVe4c99C0ZqPENTEKP0EN_uRO zqcj42uSf-;5-5L~{uEW7Pl3qD-cwMAwH+vjOO?YGm|z(_GTM* z9RI99l@PyT>567aIEcGWSJh$fyJ3tP4UYS0(HQY_RY5Mx(sIb|auH#NK_kI)+bI)<6E_3gB1rZD1 zb%!ns|J@i7%fRndU6#R@qas$JzmL1D!eA&M>j*UFZtEyqMUYJliDS1-98E09Hi6|s zw`~&77|1SJa|d;j$v&i3LxC*Hxau zxydG-%CEC$We&u`-ZNK0q$)ODm2RGsrV(_F0$cfDx0a=-7)p2aUgCu=Cd&h#yqev} zO9h?6%~T!*Bq<6oc&&Z>lJ#~u=K+{!2$FF=DV=6kp!2F@FI=pKO$J}~QH@d%eR=ZB z@B|aYZM$<&goSwCvj@qSx*wd$s!W?vI(fuE*;X}l#C`*O7R8UZz1LA@f_yjSswI~< z%*I1~Fr1oLivv-0zh{8?N4%YviO9t&$_hUU=$uB7ka*43mepWcSnGM@XbjY zfjLbN1wf0q?v3tWgG3VcC?|1>fCYyYU|O@{BVbnNL18yLcv`5bqSQ661+Qx~$;=+A zctE%K7hn|mQ7IaY!!YSdTCCpz9gdT6U*iNaHN2&V^9T=@TYFMypu8nPOwgQ6=Ri@2Uo%C;{D2~CBRjEM zhwiEdO_gz-Ma1ij=1Lj;yd0EH>^Pr_flx{7%aW)>&7X!=Yr({jFsb5tlfkAl>wUnN zYMd4!ALkq=28ocVTy<0M#AjmDV8hhsN1}wCDy^yVP3e~KXV*jJIIz3aO#bL*H`o_& z6f4eHdLd?y104C|Ce`%BZgVGK(O->}<%)w=hBb*(W@<)@SvEM`@g_d72s%R%tMlsOmSPM?ncd8w%((raoHg& zbph-Q=Evm5pAQT^=Bc{D%zvn^e?Ia3_#@$`?GMw~VXeRS*zvtJT6sL|{gJh3{Lf|g7NVhNB zg-0M9i$)aTth}G_fYD+7nu?@oeWfZJ$v47kf$qP%K!j&Hiz!EX@_rRG7?>jP1OSIfOcA|tB3Hu*g zVhy!~XU;qVeP!|Y4m`sY++!lc$Oph({&dpxkBPhu`-jkqVWKCGcqMb&s)U0Pp}uQx zX+Rd0-N$k8NpoBrjMEk$ZeUTS)=KkMKVt667CYA-2O~xt!!yXs?rQ$A|Kj=ZgYP0~=8`T&7b6_Fyf>$jvv2dJLma6bTxLTJm2&$j9c2p1 zW@C2*3ZHwO`7$>bW5$-sx{6N0uLH7r)`kr`nv%J2jaar6T5ulP z+^H@sjLbG!>y$g+e3Q3T`@8Y6uhSq}9e0857tq~zgf7i>EZchEd+S zC!kFoKH~(A(Y)Yf92T8~_p6db< zLdWse7y5RI_h$yC<5TnlN+Y2ZGrt>9RYUOY#6am!R*+@t`)V>yi|VI!Z)!g#hvJ`R zUHD(CoBZnSEPhCX3H17Ga_q4JspV~E7+#9fG$$B%PTy6r-p%>5ga*JZBJz9Uvk5~q zeV2~znFocl0sTlX6p`zs+C z25+jtr0yEWLk%TDb@m8%y2g?mWlNq?SKFK)%~|^-81?L9j0L7=trl-9!b02IuF`Wy5H`8!1D(@GlSy`x!?v8DoqwzCQ}z z?}5=;S=bR1wY-vJJyOsIKYs)bq(Am&?lB_xNDq5Z^i6fVv{hpYRwR*1V`mZIK+$pK zDS?22n2CXHIzptM(#YyEndmav&N70ct&{!+U=8inxt*uygCwYbrn*03 z{q;y1tU(S0aTFlXFl@`TpC)y@0?_)%w$RHyEXaImmhE^jMtM zXxwB4C}jnGQh6k>gzpA9L*(cLA!=kPa1rxsDdcDZ`{WAnT{#OqD@)fH0Ip1)tx4Ug ziIX{k$cA7V$;!*?$ZuH7AErU1N0N{8Mt0D#)kY-NC*%(vhYzphj~5`?g7Ui2&3fDN z(!JP*E6FEU*v1V!CRxe)KSxZnM!uDf=x`1o=HntG$f9iGqIv>fMWh*LrXtm*B44LC zs1G>;(sX-ypFv|T>SL})sXlNN#&eK*U(v;07Wzub5t`~2t%y{X>T{Ih+dJkLGUkvp z7Er19j6Uw^Gv*bYLGpx0hL?f!ltxdM4ll^yA)Fw^$cSu6j{>AekF=u^VD-{?D#vdF z>GLNj@r059SP*3VWXJ?X*+i<(rxl<|B%?}-U`C?4%8K!1+=_Cp#3YqU29rsqNExP3 zEd&4JBy$PP%Kts9w|2v?;dAZJFy0dYs%j0mWSS|PU zQnBIaj)5w#`^FdirxKKq1s>xeRO~PXN_`Kd;&RaQS5&N3n!LBKRX@0qd7I5G|X2;xE@#SeN(ZujkLgUi;HY zpCwB|K;DOQ^-8&H?OCkuw;q$QKh@)lbRFON<7lj2LcZSZjb@6ZQnyN9UT-dkxx;8) z?r%TE5r@3$6e;u$Rd~RXyq{Q9kvxW%C%Y%=_?ky%@SV~|~xx%kp};h_NA7;@1iP04QMyg7;Nb~>tLM+}w9bY*r? zV5Wnp$q@~FKRrruHo>UM(enz-$u(B|#AIgg$aWlRn{ziVe&4(w&rm&ah)p6LdGA={ zy%y+HVs-H!v?1TtB=W(8wbYVH_4IvQ#&OO2SpL-niE9r8I1I6(7t63d3EHd5fBW^U zx{O~no3+xF9kaS562@L!r_+*HTi;wR_PWxq!_~E+_NFJhv8pequ7SRlkSw4jZ7_jV z_QiXWF09>Ut@T#$uUq@F;a@VA88NIk;!C=(-8&MM4{ei{`7y&c ztGEmBnUgz=_FB%BB(8e#-DL!{?EQ}o+bHy22gb&v{4+d z(YcgVmW;FR-3I#~w4Gyjo#DT&n>5y1v2EM7Z5xf6q;b;Nwr$&LY}-j=Ha6DDe~*2} z-XGwcukgHh#yx)5oY(x_x<;i<{&EGU3F4$ve%pb zAOR%Wewbzx!*HCa>Em%^W;^YCP#hT3aRymD*>PMFn)7;6>Gt_@S};MT>S19Zk}P z_EYX~a&%rA_ov~5*YzZVAs@qtX${}q4}M0zn_*Jl-*;+12>G8Dz5eh$D~B`wep=4W z{b20yeJjCUFb>HE5$3lanC^@NG@>t^270=E6} zy|1N0^fm&U5fO$oVe_1C&HPO+bz-wI5sj_igGET`MHD`cQdk~{xNYVl%#^BbSeTc zfXg=)^9QU|bW{=;_qb!i&@i;*xPBSUY1otoHWGTfa%jCX7DIY%b6Ugj7_Cp6l!CHD z`d_f|`c9>(lg<|SdDK%TDtE-oaugiCYm-Jt4rvQ~M=D9D6Wqyn>HSd@%+cENVfiEk z_t(RhDBz$Rqbz@6qY7;P6iVS5hrOJa%~H>ISS4!Mq&#D8DuIWwg5b|a0x|auYe!Hy&_Bqms$Z{jco2WTq>M8@BD^Vsty{#Z^ z{t}2m9j*FzwUEii+FHqSi{(_ch3v!{cRofF7PUCv85lfu{vKxOssz&saomA?0ZO*J z7=*HNtS1Z!Qt#pDP|Akh4j*U7LUj#YP3G36>r?07%P^<(bG;Lp)Q)A-T34?D{i^`Z zraSs8!D%nUhqIOL&*)l-VOhhwb>E6_|<6ob|MHA%C@{Kq$^^0L4Qw>QqC*L z-KppTj}2evL#YeBwLxkIc4>`^LeN39R@NSJ+32AGg6r%T=*QSz4Z#yiwvHeRTAL1O zX)4u^ur}n~*x;zrA6~k!l=NC(ln8FFueP%fP1*YE!`U@KfAwoccWa=(wR5B!(`N>E z>(PL-4I1exGCgzq6hmVmusP1M*=jB}onr`Kax-e=-FLmsH5OrV<7MNmi4LNC8R6bT z`UPW#5XuEH&RuhB-+6E_R`4>^HLGLGu ze_mH+J|8mLE8mAB2`4l)E2Hnjc)7AHu31 z(z72B%O8cyA5F_2!`&Y%&Hr}AJ>tn7zs#Sr&!3wzfOwVAnHY`8N}FO;lZ=X8s?|k5 zHNbKyfJG~i!#$8IEs&=z(A3g}4aSL?isk`1Nbtm0piQUJABW(}W95QV{})Fd2DiE| z&>uOtDjtVR7=Kn6ZweW2yf1k5Z}76QiW(M$NgMvyA|Z&F5UQUrEX)DM}a@NszH|7(YoEH>e;m3MPybh14RI!onoP z#yH%lpTdfTOtXN(QY8c;KO7HT0gstFQY4JbKOznsvr3D)z#UkNQTj2Fm^$jS_#5X1eRkM-pK27J*olAd^?bV8% zc_2{rE>`M0J6|cMw`+eUow#)(|3iDGL465%Lhiy|5&!qjXcv#G<)YU{4ASA2~QcTfeJO)z0ncY8o<2~wNK;PgB9Rgi7#4O3g9i&l; z52T~fWYXAVjO){q*`$Km;*rXc?2@Fu7#rT0EA(Fk@OpT5s`OH^^z_$iaQ6u5-hHU7r^r_;J_$4m^iZ+Lh+bP@l;KbEKrGhNb#;$iET-R z<3U9qS(Ruhi$qpX?zHx}m)AL@>xJ4ierug2wYQ0dgL>yhASlj-P&1{))l7(*=^ zzpER68z*7oF#@z0p9dGBr5NewtG@LD5cA=B#|jUUjUh3NFOv(!B9Ki=Ou>uH1)waI zIV^eMP}MWc&4j(;M% z{e*8Ve|vO*vCP-}n-0YTEF{W-5Jp^N0@|IGWK{e-kf;DrI1;Z!ZfpIbXvJ)kis`Dr zsFFlRiwi(4t?cdiB?(O?o`xzc6)#JJsildf?1sr?Rjs??0TM!}!l_<-twMr18uY(1zC1wGws%)bO%wX_SmG z8*M3VMQL2Ead<;-0>f)g1NM&MIqSC4+^Vjws?3f?`Mh~zC&Yx(GHYqI6-nZLQB6o{ zHc0=xsEt6Fat`AKxP?QmD3$K`*|^(dgG?yxb4uOf11eT zl2K+|OF1g#O`W43__?=zW!knK@l+yP_nlz|+U5HPVYi%lx8BfoB$48;5x4J=nGcCs z*;PPBaFcI6+RW}3c`oKgfKlS?^bX*U2Q|2Opqse*r?L9y1bVr(x*@GI9S`%(O93P? z03_6ojE8RH2ILi2hcQ7{mo0>TC=9_UQtoIWyg)N+M{)qdqde+NH+9>%nhy&B+(RsN zLoD0l0sGheTEa+0MDRj4>?<5p zt2CCQ7XU9z8aL?@Ur;?5H!fr>e@`>f;yuxpHPO*E(X~0z^FGmwH`&iOIjA=|>^(V} zH96ijIk`DG{XRL1H#N^UwWv3>>^-%bHMQO~wYfR9{XVseH@(L zRC;UBHUad}LQZg2dC;2Tn+x-2iE+Eiy@Km)kg@S`bl_3(ej|_lML>_5r8%F2aKzN@rUrG-_ovBSHH7A;HBK|PfRR*l{|@Ed3gsn%OE@9@Y126Jmm~lP6Vrx4Y_dpp zyGSfd9&;XUXwu8;wRC?So?1p)sRw5-y9i)z6_UlZ=nj)hT~@h^Y=tS~l8x#Nqj894 zut%hG=~naa6b*#WWIB%usEob`XY|*PmTe^suVg-dW`uK`C+0;7?`FDZVv4?8QRvH# ztX@r=S~c`WUT$KSyaUuT0TLz}V>&tW`PYl>T3^7|<7n55vODP=*9lKK&F>lmzbE*9 zUox?a@A$o8i7L@JfRL-&!NJS^0PILp-K3Ka?cd@a)aM@Nk6ph5obPu$EI`HJ&A(q0M3J%Q)jVmEMI6(EeH=g4s{-Xz8)9>8lkAK>( zkvZ;Mc2m6Z?>u~D_~)lu6(JqQb$$E3OD5Z;Nw$gTlN#+kgQAeyp!(PPUUfH6Y6)H{ zAWy0UHht5ofoNO$7t7wG(jF`QW;*sBt-@ZaS~`w#&xDvl6SiWr8ej;5W)!=DYg^$| zH&dWT^rvhOkYT<#K7*$xW5D@9h+sMEBzl}$b$Lw1Dk*!t`+%S`2c!6qfqhX6?C2#j z`%3!|IllK!TlOPe6McN^b^J*1@aO^d7=%rAt9^`emTMTvo+=Lb$nM+8LkdjjO9NS; z67Q`d;hqE%6a@R65NDha(f|Sk4)M;kLIfzo6zKg3j9NvF7MlBC%?HHBPtYff3P{iR zY)$CiVM;!Y%NRuSYIbNY&Wfk;c-GfkG~l+#O?dUJ`HmFnTupSXOF8WtFz?P2ffqs? z7uwbrE;=O<9SS`)1JypoLqZpN9u~5;s2Vp+m5=IUs6UeHY<`aqH4qgtBGv9~|2R-6 zJ7yRPF8Oy+6LDp4wQTzDM8W#;Uw%Y9Fmx8_vP6I1Ld$%q+$k!Tp7t6-aTvN52>Y}0 z*Jd%2;dK`9Ci2k1G0P5J5!odR?en9Wf92mC&MjH$;>Pc}u}@Sg-(gP8+W?Rwark?6 z^kf5@?cQ0im8jq~UosC|7%9^m*kT0ViZ^H5ht#kGwAFj16LeWv zkLnW)Vvj{3mB%LMkFoG~H}i1cmIl^d!`a|WSm)1CT)t{LzSqUQSAhg44khMsqdzci zKSl{ZC6yP9R&RBbXJtLAA%t;H2t{LNfHyyd?*0HDaOZ{L- z%=*&61N&B&j2#-|@Y-#G`J^vW@xasde!Fjy(0&$P{Z}E)7sTQA`TlBQ8`dbhade^W zro1gHz0yPP{XDzJ9&3Y?GA+Cbf7fhRA&n6ho#iswabI?y4UEh?<3u z5YWFOi{piE-i#(DAh1Z1ysI@#AH)d~IL}KeL-eamxVCkflnHDt5Z=Y6S)mDM%1hnzK4e~LF3 ze8(3a$yq0gFelI&Eo0FL3uAwz4GW03Owc0oWLz@J=YPyMOSR)zv5UNP&HtHB?yTih z{Gg%jER4^&E*R&+xmiL(yPT!~etM9rzyn)CKzAwMie~k2xMJvc+ILGByXuT#=mq@u zwBrZuy4)A|RE=fizcZ!95qNi~^*2%&X^krZwdL6~;1^1?mdm1c7`Ay&xyM@4m~Pmr z=OXnHp+$&~lx2)c40d+9O%Jyvi)%@PW$_P;4$zPM=n$UM;>zKdv(o%+2fp<3mUbJ9 zItqu>AV{+t-m#r-t`mfCeUzR|ULH9}guai3(sa2n^NF3QpkTiF{CqCzYCOBu5FRtf zFv&GDG5)h1P#drptmeSTNh*(SnK+(3Ujc;n`91F&ELG!oi#Y#Q&+KghDq*;oSw9%H zU08gW&TBEIpzlc;JTh1VP$k#Dh_dovezgriJ~G*g#cT5u%t4*64j`^05At64=T5no zq5+&$P*PV1DS1dDR2Qc$?3wwagQO$nl1woFNDX;tAxBE`kYeUjiF0(shkS&a;vBZB(+LkRTrIFBz?ewDFo)qL{KdrS8kuM3qxgV^+eoEv&$pLqc+{ zGdUgY^Mt1sOWF?YoQac%+$C9K>IA6BjP=K9o|On3`b}OaXHN-=Kg2$QcAq>LNI14L z_%J2#?;z&@_cZg=K-LKwQhmc-xVJ-)Cw~Mb*U(FcQ%)nnDcLg51~n}Xq;n2LbEzZlRu%V#W_iIn{ot3<(MHugJXukUKZGU#;Yts=~-VVJf?EX9};(`t7sY1H~(o*N>gtxkoEHHJgd zTi|Ar%%dzf6~GXg(BrO8#%R>lG}}<`DFX`s?`ia_HMnSpl6*2qI$03+pKOSuA9}P{ zzV5cqRBJCfgJX20-k~c1ed@Qpvozb**5hMqAHKb#x#Q*m!xQ0d@IUclS^YZ`&h8Dn z+Rt6uZK(Lxjwjxqu1gc!|5#SqZ_t0}z3Up@Tf22{x?K4jo)@aHVPYmS4gXFT*8BC( z)k+lAmWd%h<|iLXj{x1QGkugX;;&}}0tNuS{gP~y~jQvb2c07+%CVCIPWRp7BzzFZFb5|JPj z3$(-fqOk-baSOh&2J@jnV&)iU=|l^ebXpsGHL6);o}YaLA1{(DCDVnxk*^RmNhjh( zN~E{%t!yW=1w@6`_*~7_s#Q#__Lr{<6{>|MBQ*4H4?lDgVt3I^F=8jwT7MMwC(Ewb zD|dOs|I5~WVp#7D01c5}v>Is*@<2baXQ4aEj|GDW1b(bKGI^v1tbM&b;w>h~c>!$C z-1jH*rOIw*6eDLnvT;;XsS^J_mQZ!{SVErWTHoLv|UDcNtR86_EDzgaJfYe#M0Pt zwr>W+yjp04Qv~0}q?9`Ey_{1RX;xfXnJygtx>a$E5Dj&4N`FvUSp>_ORcX9}&S_|B zL2`L{mM5sfy6oOxy|Scq9FC^4$VBI?B(|iZQa*Oc(-`-AK8qr^@1inYEfTe}ZNmh| zn{7xkb|z5+IQ2wTqr8P|64ipME`6J11np(ZqL0^Q&{@JnP5VEIWGkLKH4-JtKktdt zf}vb*3{Crcl~;oAukdxf9^08$Jzvnbu8o7o+o2zYwX0+ZNXvKAyP9C_FoLaGg-Tfl z!8#*2*)++*It~*+k_Vn&bvrTHg?Bf}w$bG@!QI-$ItB6aC4*x@<&T>aBAsH*lk22& zp0~~>SrObhL7rItnqUg^XS4KlS=Jqyf8aC(K$fiz8CA2dfafDVu1Catw5&On;=69y zC4vxJSAHFjwQQK@R=cTvpWhGXIdzy@V0@e9p93KKL z>v|A3w(EA1aOL367QxW_$H+=zSL)K60m0+C>=pmRlp&$_Pn{^wIdX`i@pPhO*M=S;oe1Wf+$Md-=|Si;}n z;{5cOh``ZDg+{sRe9fMBAZW4r;S-bsXNB|O1g-jzE#i!rgN)$Fr3Nt8>w@-p#CSoU z#!-IMWEi($kk~+HI2ODj)Z4F-C4o@h4{otAF}4D#xH2&c9%N(Xtb(hGlXxPe`Y;zR z6O>f0SPB8=C^b4`$;q@KHhaft1Mfn#eJTu|0_A9Z+kMRZwh`v>cv7E563nlaJ|>I= z(h6lM@?GIrHuW>$wNfa_A~F0o*g1k>Ex>31skDp^ic$Ke8RgL3n39EMQU|p;`GE77 zn$vvZ<+oxgL9z)|6P3hPGjj%gSbT#BlY~YDR2u(wnS>^%RO~Zy`qXk6y|de7I%H#h znz;}e>>||%rBI&!P#{{4xybrK38yTWf@1yH`NAk^Fu*fPE$k=dU(i`g$xl(Mfyp|9}}=zqSZJ#LrbgxjQuW@x_`YYY)Z z=-d-xEm2AGpTWdIDHe@q#YqDk=c4QvZSX&+dJTBy5vH0-Xojd|^{oME2}y#2;^p$1 z6$^2XY9$60RPxCcgo^|=?8@=LuNAnGPLxluGX_1rx%;7@r`-HZ$ z)Pd^<>U9yxRg+A#I!ogkt^MjX@A>DN13Vger|i{}S~j{nIGR<{&6R=OmBwoh8iO>; zwb9WOW|umv4Jxj+;g__gU^aw(P8hYJhvz1sv(zR?+VW#dyWNPr*F@A#2US}fHiNBsX5)SXdTU2C^iSk-JxL)<=6QO1 z7dx-51BTR2(6@g<{j&P&32rE>>NT$E8(UXUA>G5je|pcHZ`=!Dik*CoVLLE~$Hb74 zQoTXawHQaaQz?@o+=lzX+U|a*CF_H?zYZKr!-NI2^#;^k2Qz0FLnnguzuzzgi_)1O zu&xeLwZujU)0rr@X$?>wIp|pE8N=^j4fC`xM<0mg5MT$5Rxo3`ABr7>VYQ=4#Y87u zO_)&#AB-uxjwaoa957&N6HES6PPl|mhWA<E;@@sdIz3*OgwRmby^+ z3lrS8)lr3(hSaGG3*NW2*_bb=D}QON`?kJ1-O|!Jb!qSQwy}%U+BPEp&nfe5^F*Pw zV`b`}YvBaGeG}vLzE1>bAC*+NO~`ydpaLnjk84ifrgUzuaB?#hnhGR} zFYr;){PBp|X}~DagJk+$0;lWKlb+`le4_i0OWWHgrKl5v^(!usx%J&;T&|l>eI;sv zGsk6wZ;N}v5z!ulMz1clfXj5HacwR~FqZcCVp5vd{ev|31BfW_0;W`*6!HX`gmxvr z^4j{|gpTS_HWxyOT!;!{OJdz-QPW9?iSHmGRv#M=kMT|#HE^8L4WIBLkA^-rWd&a z)?CZszEy%o6uzJj_LAf>NJI;@LblIiwg?M0x&>WO9zw)5;6e!aDdhB>i#-|>`-?sL zl5$%Avea1MbTj4hFLcGV@^@bVB0l?(aB}&u24Iz;cP#L9{o<`yF~%+6Drn?w`R*=A z!dvjStQCTCQL*of`t|+A)Z- ze1ogqg#$4mU_giR9tc}&iP~9-Bl?T`f}AD&7o~#8B;pQ25aXp>o1{Drq>|Fm8vce& zkpO>lA&(P*?;eLZsfe?}*X!IjyG7I;zOJs5@YI1XIkz;DIlVsYJj7qKLwi-~^$t&TGf{BDoeUxoI}JSu+&GAq7CNk`}Qtc0x1=O__&G>77^v zd=4l7I7 zfrM=72kU$!Y!z1G>eG_W*lHCj5tGZEQKX$w;*n97o>9@BQMHy)^O8}Ao!P*h*`%G> z;*r^wp4ri!*|nD0^OD(%oz>5sHK?66?2$E^o;BW{HMy2G{gO3{ojuQ;y{MhN?2)~i zp1t0ly}6dX{gS0l3c4nGE+Fb1Dac7dmF|aqZSY|0_>mlMA=c+< zsUl4^44~~OOnRh|Swt0G^p<%2ferS%3<$V)@Bxnp@UIr7QhX%^eE-bCf>0vJ!iqCP zSYQ%ZCn5c)X-ZNsq+L)s@x$0@%SzH8Hk0i z)z!Xqpl1?6*ZIMNZV|(hS!GX=fBY~d2~nP`1ElfPn>fO-k;6T%8r8*_mMRm%_N97R za#uD~P=F>-B2QB>I2hXYYXoGGHKpL9JsNq80~mQ5|INV^3N;O@p+>^O#E&(}4CKYM zBW%?n%oxGX6E%|~BdGZyLq_5?&B7!Z!L|z}>vg3(IVa=xmGHXp4Dki^FYC;B8ORZBOxPPs?o2 z=xop0XwP|T&%^B~;O!{V?I`i;D9h}q=yP8j|cvV?8G+?F!d{IfUzZ^K-s0PN8kd+H0N>Ee{o53jH9kN=6s#wvVrnW zAjr}ABExF)+{J_#E|MABZLV`h8_jEuCH=Wj1``oTLaxgK((Ta&qd zdXZ(G$}SH82iMTkI#E7^j=u-!r0(O=9e&xry{zImD%<^G|lDwt?E% z*4u2-_@SO5piT&rym*zlXZNM(4miR$*Xtrj@{^9ylW#=z721`r75=Mue$1!}$|yN2 z2Zlv4M^3thzB7eqA;t44miZAiiR%iXvPNa)n02t&1#0H#`K8m1XYsM;>RA*guu`Yh zJ7)A((*@LdbKy_{YTiqBfD`n}*aFH(5vqV_Q52!FQa!z_o+zZ=3)ud5iXmIxByQvp zJmj&i$tk(X=3hK>?*v=2KohH=ZB%H*XV=BkQdud%N7892uBquKtevdseLYX^Md5oQ zA^ZLiMzWkc@303s;U~G!F5|&e|4>Y`nTWKRu=I2y7l~!?@F+FK#FLbXjVx8Li0Qpq zIf%JBDFRgl199WIq6oLs+1yoC+-G)oMiAakDewC5= zsTe0cUJrf>RLBNt{)WupMhJL=Nw+YIBk)HEs+4>d7O{nPe&Z0xc?&*%i>H3;FFwY$ z-Ih=I)+1!vo_zMj<#I`=$>kJ9%II`A_tazbW|iIs$JEZw4=nYh9k|V%#=cg{-)P|W zna~RU0UpC|c3uBZy6dI5a1q158LO@0h2V>Jt3bQ(z#H=!h%3^^M-p~F}>?gask8FE2z>ts&L`<)G(FPTcfZ;Lt9Kp*LNL_6{CKMRfY68>!;%$ zmyj3Hd=2OqLR3|_BtYm}Rp`ajyF{A&N1SyTaP#jRsoyv5c$gvb+UN34;1Y#+AT;&l z(GiFt_jNb{!x)z7|{5j;yv7KIi$5YJhVN*QtzD;!1GrI zn62PqG~;FRr^sxlX&>d$n(r~sV+yCTqyU@DWb`$-(!@iSYTA9^H>_gi3rQ zi0^nS^fw|NH0O{X$NAi56p{btbD-X6(ISDvLnoO#Utu9yA~rx zZY&O=#594b-k14YvOK~2jqKN$*T7ry#hdf@_r^ct){^hYr0*YY*K8QH{Y}0-@!qn?}c3-!?~1eppOdM@eH|7E6<+B_i+d738Juxrp?bXR-n0n z=6UTzm#x*4A=f3y|J#k?u229ZB7s<%(qAFv0);Wt$E(a7E%XKH_mY#@++ciupNrLN zDL;}L>1gwLRb|;bZCT~M=5?uN@x{v_2s}G>$rev{$E5JJKX_mV_af z;#3ud(I0^Bi^_v)Y7;t3X|kWEmc;n7wq*;7qUQ6?zA;(o@N6 zd!E55#5|?Nt{P^N`YpPay3voi4w2}s8n!NWDY}}V_!gq?=jDS_&9lm-J4fRQ@d%!M zA1B-1>6=fuUW+fB)b}xqSA;>3BEd$12+N$cKG+0Pf1#jT+=-(oV}9(1JiI9yxrh?1 zF(vX!yzD2_+k5P!X5Vp9#l^qwXM5hK#q1d>fXS1H>mZAjrbf{YAS)x|a17-5BE5nL z)k1u}Y#i|#o;+h2K0IbYB~Y)x{BR5^(i(j2SDRAG=^Jt3v6@%wrdEXvyV^@I+po)KXB zDMl2qgSeirT!YBfh1%iD=X_MA_T5>{6?%sj0z>%%x$lzL7*wr$e-%N#d5OCq z3glie3?(8MHKOmhC&DlRb-pBI`H+e*9T3(^!55~+5Qb8HCXa)*@Hf17N8I=y4|2l5r{g6V$TSP775*JouR@1bV!f0I;XYodk zLPRb^E4LD7tB8*@$XaXK4MUD!^Ym8Aj)ck2THO$3B0Cr{AuR_6S-cc$1P~ zO(2hp(jz6PWg(NT7~&IU0dxz%jw=Q@5@jVNQ0mXerPetm*RYwZRHVu5c_$dj1!PQc9xohk~W~Z;3J~3Ewkg{$L~)t4WiUa^XlU0k;Z-bVHG7JcVjS z)~M5=WMDCZ>%~dKk!Tu=hFp0+Gs-xOyI;(xng$MD;ET*JePm~VJ;ZiPhEgGb( z0ihOX)xk;Z+WCC3`RDQWmhR)vxxTORA^+@?V_1_NE#>y+^RMu^U`9qCebdL&Nk|?L zGx>vCgQhXu4fFFaI+gv25@|TTGquc93L*^pB7(z>n4Q%sgOjEq1VF*XMo52DSsUe}1`5(TDS^Q7ivEEy9d$?ks4{JYT6`pohMg;igIt}^Xk7sf}%l;1R zJU?0ryv!;7cK6Ep_MqAGoL}pMj0_jJCmgHLBuo^FrH@VJ9>#+Q!P!S7dd))GXQ(tA zfVD^j%`esL8{`la5HSux>)z*U#zcTyBnd5eB7*E%8bn$37ZLOop~3iS>9DX7BdUfC zpx<7Hoy(d4)1|~P0%k+Wg;n|Qcf&;S$TZKMLkN%@!^+?N&FxnaDM?Z>>7C{x>*4mX zCbS}0KS`tWO-%JRSBDr~Wn#?ONO6|RMjEe?V~o&DiO#u3`EX9+eBPmnPOT*QYHs4M zR!s=^%cNvDZWFf0GWoiMDFd0L@E=AIg}MAAoZBi8gVmC#q&7Z$smOH|$cL}~@?HR9Erd;;5 z(*D;m1-E|HocpFyzH4p5-~!cbM933SSQ_Psj*$X{4@)6v9OXbK$b1GcY6%Ei7YllMZb@oNaW_1SQ@rbevE=MWaNJ_MbDMRJzna(TxJ)tuLRTp@HC<>>L; zqUHM%?yVn+zBr5d7|m=C^=B%LXKFPv50%x{(OUKEi`62{m8y`HUd!WZ)dK7l2E`Q; zTG+83@1od!X=0QR^~3#60m9X*Pz)zG0E>H;>ioZzhG4W>{V7#up&#NVm>a7j1nT4o zA2vqNx>}PY8ud{wbacd->9Z;+O{x4BKe#K`1wr~F&4tZX#+I2nGa6{3kSDq9Gmek5&?}oKbhUtfa54UNSg} zYfI6+U5FK%KGYPM;P2$S(5a`K&|plVq~3`LUKfK@3iT11lY1DQ&qGWx^--2``#2lV z!(7w#F>aIl1aHqHLP!m9p>hW#xG$qp3JnRVlLr*MFJnqE4N0YPhcsWwE3N5HXzNt6rt5tv3Kq@kwFY!4~S8kj9%A zLh!~7V>;VZ5pNIX4`;wppiopYv>@Kkn-S1=VY661VM|bYe1uk&6IONGVJa`jq#!&6 zCGn3Pl?J4kGPB}LU+H7fJ&)9H59b+?W5>A63pp2NR5L_y$CmMG3xK_{Qpx%*Sxwa? z4|*3Fe40Jz{-jzJb2@{*LydZHjLK;NS4BG+wS(1%IwSQe{ZmLqkf&zP0Xmsk{Dgrg z=4#LK;gf4RtZnB9gMxG;7EC5S1LCJ>umb&&j8IBp1# zd53ZSyak=mSgu}eqeUup-ulQ^i)`?yW1};Pwg)hhjegV!T(`xLY#S$LIKs@(+edh6 z8)TMy37(MLOho*>FN##2J->O8^3=JR&G1%EnghDhJN{Vp_jOGLj^0DgznRe1x^GDu zP@$*&IYplJ|D=6cLY^0Rr({f_CNZ2ti%F_8oHB;{KU#f_nss~AB3pv-Z;K5nl?`{24gRtl&W#!_Jp218M}hx^2cLtPN-JGkK*F6srkz0HkwBH6K+~Q; zx0b;0lE8$W$ikh-rk%*)k;nx~PvmJ&ix64OqS_)`0%C&{!Y$*m#Zdlyd)d_NHzv@G1fNacC=How0&A%&!e&i2xf!BI{x4EG9&i>Cka8mc2@ENJ%sF!vTdafac( zZE2A~XK;7d;_mM5Uc5LIhvE*!-QC^Y-MtidhvE)%=sr6q*||46x##A}|1g>4Tkr2# z3z`kmb~nx+#vy<_CEzL*+v!MH7vxUpM*;2;ivmf-vw|!Vyut1m?}FK%3IX>sFgePS z=8r-2*YNlDax-W^a1C%fCJShZ@-7$&xed5d1V+z5o4}HUNCMB0mCw->H;F=hKmh2+ zbn-G3m=W(oK>%JN^;fiT2UZofMy$+7q_r((JyWEQ{td5CcKH@;H5L43jz$cdVVtQ- zV+v|>iRL3?HUv!}12T-w7GPYH2GgYA$r+FgiAf&s9U+ltCXHg0L&UhP*M5~phir7K z?BJS)=?Y;WeN=qL_|t{E1P6STpFa21d#r@k0l@E=DncBR>I*0(LX5LSO*#QB$01iR zf@W*r2V&qerN7;~lu*>dl#Urq2>}uqK?61L)gI+7Y2|HgKUC-q`I2C=|6$9E8 zLmm|)X%%B_6%#8JQ_mGMIF)nUl?&RHOCFWWX_YH&m1`@N8_$(nI8{5`ReRc12Od>N zX;mj}Rc9+z7td9fIMvtO)wkN!D)*%W;nj}FrDER;l=`bhkV|H1YBI~J1t_rI%i{lP zrq#vP#9bx%2qmmhINFV(A>kssjV7oo0qYd87?Nroi0#Y1*U(eft+-=Ql-sdi;osHZ zVW!6cR=)w8alfWhj)G_FSUpv992|*9Y<#A0>PE7qnM%cgIhWR|p)NxiT- z$quYis2JOnjylxp$zEEASne;*PF5(DVMx`mG?H8`K~|oq0WD?zXizr{ZKLTvpK4g1 zS`JZK=jYO?&044ZTkSbp<#U+?omJ8(YxCeeCcnFgGt(q+ulkGYCq*wRLV3J!TaOt#rwT^0Fz@VB6DQC*-og#bfzQ8IC$ONds&O; z7UaV?(1<35S_h8rEU)j}qx89e=vt=r{wvru%#t=U%by|0Z^P*Kp3m6!1;>&nHojKy zN{82Z z56q`%M3t6}-M<~gL?1G?&Nq_{g(Y^TJ{&Zp8}fC_hYXT;oRGyR0jW1)Iq$0))2WIi z78)iFVS=$o*cuChDiA^{3fa~`k-Q^(cO$VGBd;V{6M|ZmhFV2vMHzR}>t^v8XQMf< z5iKJ{g=_f5c$(QA;<*z#6?k?{)cRA-nv(#keaRFy_wm!h@#NX@@N{zZ$nm(-hS57Hp+uRO%F18=*R|>Q*Xd9AGoSfpAoXUTf6f3hXW%+#5Y}gq-ey4f zvnYJCXnM04KWDKrXK^}b@z!Sv-e!sL=SbvYuV2xBf#8w^L2ZJFoa%E!y2cE@a4zxY zFTk_@^y2eN!qXx$#+>-bkf%mfzGVowEwuOZVtQ_kVGHWwA-jwvOti*SWuR8Z0LuFX z2D3$u^_uuKR82%mblh5kFF_HQIrZG2rZP@YL=u5YEk^qyb?=hlxr0IF5*tJv!xH>n zPd=U5Z_i3w!dGIiP9wixXw<8Xlu1~FF+fMo5XBTg_Lgs(FH;bG2`bAULybQfvsk3% z^Qj*f1UA7Or**cS)yui|Lo>j)7~gF{0QDP?;n6EMvz~6KE{|`uHZv!`5~YEDm8P~H z7lw%cl$}|rp(O|AtQZt&2ww{N^HZXM2xjfi+SC$6!yV~VC*OLv-g>Ltik?!#40v*q zwwFk`yiu-wz0~0cb{&B#Ezq$B@r@A_(G2Su16R7`|K}2ckYqzer_npo=vi(<-D=}! zN~3Cf zA+ycoKla#qTY}4ts+rNNxL}=on1|1q`asG?@C`nUe(xU%>XhT>Lb? z`fXP0M^!IJ2^?*HAA!Qp$Nt{yHMH$*Fdehlp6q+=4Z{d5H$YBX-w1E~&hcaVg7)n9 z>h$;ahVuPM{F4e>*7_;Na)#4hTI|_z&iQfNVR%lnhtt7BPRsoKLH>>&`Oaxt-wAon zDfu&Qe&jixbL;xErH!+`i;e|`4(`azbkZ)1zOG3YIqI~oH3{$VHxOmG&2QR^Xu*rq z@y;27ixr8#2m0Qk{Gjdft{2-b$%KpRs=xQ|OVDTC09oEPL;n_XXKS&K7(eZ+vOp+DZy!`^N zQ|fC2q`gFpF&tKkw)@urGvO^xS3SPPeZ*sp4YKL6c3IOxW&6}`C zkiaN69hbGCM&Pig*HAm*nls%?clNMD#mm;uH~6^M2JlcH*x-$XbvO<7cCPw$&0uJ9 zbNKgHw8XO!2ICP;n$h32?**ZwIm_R!z!H))BWIh;F|Y5Rdc_h-e8A8c{~n@*gAws5 zoB}VhxfM=Q^yrEvP%GFoHymC*o~D>h>$==gC1-NRLg@9nA~|b!#LTccTwbvpO-AFX z;R(F3RZIF((CCd8MrKJRW69+5AmJ9sDOIlym{c&Vm1%`Cpu>02?lsD7T8_}q7R>e) zn`}z|anthOe&4u$(Rp@0Z`wHEmD^mNB(3U|RdWT$;UU0bt0u zVt)>&?2)iPNrqiNn%IJ(Fb1X5l^BF^LM<96o?I0*^nQlrq_9$QNL^w8eFSj6b~w ziS^U9iEI+J)lvr+OR;=1FL3VliK(PF7gB6gbp&>i-7w?5LR2~-PdWIXtNNtAY^WT* zUO4eNy6ktTVJbKN_+7-yGo+l7wY$$#&V7L zfFBI0^%)ka$zb4>`jneio%Ccnt&6^FYc7#nvi&5_F2L@1234V0e|=@kY8lzI-0U2O z^VIy1MS}ic!`}GON&=(c4r5l!UQKUK*Q5VHwEZz;7+R>>$LvV#MfF@RM%6`64ujjji1)eLbu~LHfgO|Rs5lm(JUX* zHHu`aE6GQ~ZH(i(5ZKR3zi2yeD@SQP$SY@Pk6QNp+VM0sUftcaP5Za&4rL;x_jzvh ztM-SFXq}@ z>3+k1+zJW_YuSn1J!shq{B8Lt5dT&FU_Zu+p_MnxbBg>Zm8Z`AFtI<_V=p9LzE#xw zPrn`S4W6kn(*t->qVBo zQRh>*gm1TF0@iO2gCfzqcjLokA58q?R!1l?hGAHs3a{bvbv%Nethc82947Fie zk)$|5adGmmB2kdJ+X5{V@tTXIHs`IOgb+_aAr$7ABTlm5f&38xapbsrEV2bSY$?&a z;4V}qHM_U5v-G7dP$si#Ln^YB6v1_e@tV(doz zGio%cgu-iU@hN^V$#Po=lRpDPgcI`7Y|@w+xaoiG2icO>wZP3CVU!tmySUux~c+@O1 zajCOIj4>z1)mm^|Vk&2|u@Y+s6@n{FQmgfr)a-e*^Oo5g5l1VHy~kJ6&ee7MOb;CR z3Th6xA6jRARXG*Qtesc>e32E+4Lg%8B7_GgK(<;(y@-vb<)^#c%E-lL* zABv5S5ha6Ulaf^Ye34xJRzSATu3*pH*xqA9X`>Rl=BdrnwhNi5kXojK?f6h6&qfnS z1*e)Z7p3rwY~~&!ZMvqtSk)CoXCt<2)m#Ar1N*zSJC0-KZ)Z$4bti& zn{}7ld7hn~0${O(z9@r&idik-sqOm4hhr@MTIC2KO@mAs-wE5XpoLtB_eX!!ToY7m zK|NW3*jKJTHVQ`HBU*+?o35fvZgVfrkyhJgX0RZMB?igs!hJM%v6n|2@drbPnUM^F zYdcIx&7VfjSFhv$XzYXUS^oUgKxyamYk?7Z-Hr}7*&WYW=%Uj3GkQ~foIQh3!gKds zUhT9X>*=@r6Qsh+o(~%Y=?lm_)z9ZFP~i)@!s{)z1e7ZKqOxqGig=?EHM%MXo04dd zADkqGG?O2$rk_lqO5VLjD4V)}qox-+k#w%VjhI%zpli2-TS2ielba^XvcI{QrbMmh zxQlj!nwGE|C}&^Wf?gsRIihJw92a?(NHzh`4|55Ej0GNE0`(sw zSJf;cxds2>-u4+IX1)+Doy~svGu^RSOdo~grXtYY1oV0kGsVU%QOqJ`9y{CU ze4z+bF$cZc|H5$xVk3Q9iOYcP@`-6Fe${)?a$F~<31+GOZ*b3B_MC!T( zI&6KH?i0>?@OX$va^7-(3y4pj^$x)VJT8Np4xKbqfu@RI+lqm*TIer=NawD<&bD9& zXPENpKoMmB-c?TofqH^IAq_}x_E9>esQQ{PJ%YgRySOI}D8=>)pYP-ojSwDdynY;G zgfYU#3xbXXfqxRP0YMCCC8}USCA3DQpbvJ;2p?bwny6v=n&^LN$mE;IXu62Bh~}E? zjv)lA(Q_GqJ8Zs^%N#2PdIrUpKA{-cqZRtbv_IiAk)t+$OK*Ncl_3VHLPYm#p{fp> z*C%Bpe&ZiG&TuNUp5qex?2j3to~etHx$=MW@&ei;2auKn*Or5@l7sY|1H#Eg;m$?V z&c*P^#Y)TV9m$MpfgZ-tA05n1dCWZn#0XR8rKV(ZJy#02x!EIZ~ zg@IK5J(Y;t9y8s?furJMwE zjtV~w7f-%sRZTyab8#6_Zq>Kps_&HXdi$;mc=IA_-4=3)KSP_g*%{<8i*N2gJHQkqa`3T zT_8LH#Aad7=-Cp6E19s`QteKeRA}=#Ht<3+-#rB*TL&vwCa8On1us{+DtrjI`Hf|O7A*p?>bxUx_Ifj#O=Q3>AuzJzW3~Y zOz(bf?|xnFet+rygx6E}*zpw^E|L)rniyfaM-Q^2m0hdORw?FT>xo33E=G4Nvf+tOo{hM^7CH5@Z!-AV!dhQ5@2WLj9Gxv5BEj z66Hfd**WlF5aQotcPqytM`^|^1Y%V9F+0nm#;$V<<{WRyAVNv+TCtMWq^rZ^LWXd(w(X*9XHSsr=%Maz z2jvDH^66U1t~hz(SjkQ><#h%A?O82SZ|T$h$c3X_9XUH&1kW9)ILd|T{e|!yMd{&N(&l%TDj2_1 z3il614pj`nv5Y(e@$1u8zb`WERw(mT@E?{N;4jXG|HzR5DdJbC(EIDlF&X|`(yXsk zd|+LAj@^B(1Z>AHhr>J6Aa=F?cAkWCUH^TLIS+$e<#t|4LBFgcvTSC&{AJQJN{&4! z^S6O(+y}C?2&uyUTy0M2Vq%B{YY}HX%yT-%ZRxs_LBFCLN|5ujs+yjlcKuJi9_YEu z6a0x$O8^}|Emytbr4I`MPS*)pJy+ha_bY2r(>Ks%BrsPu*55V|$5-20*BP8P?$>K$ zY3fN<>x6FW49Z%%Tt#SBS?Ofz%m;WPBBh9U>UkQr*iY+J-+Y)nw_s4V5csz+^+%!g z#bB!t(57fG-nR%Nwov4E*sOL47!u5>y?I|)B~O1!w~sI(HHe?GgWd^6&w5Q48+IQW zq+SRg>20|#8d#AUIruZ}$@f?;>Sb;BWM1~fWcJwQ_uIId*3o>ootlOcnto9?>B=gL}HjZh( z92Zp`mrNZ8rDLa*AN*=)t@=LC%y!z?e406v78!IpUUnMq2})c&kcR@swx146we}F; z#H6=2cAYibo=p>uS78^Owk=b(bxNI=I=3wsqlg{t1?1vapPrXnUF=LroNP>O zPn};7v~P8tA8nl9>g%-fEG@L={T}^z=3D|ZT)y!m0}m5v7(-IDRCDfyb>_&!w z_^)8F<3GWmSlEApL0}S1;(sVvfN+tLSDSqwU{D&bq;`8SiilJmp)`hgG#((4*I?ne z{}FExFiUs>Qc$Y)_&RW#fQrVm={z0D+*l6fa|Pp}=`B!;<+Ef%X!NA&OO;9>f69|< zsaehzOExRpXw8?;=PQZKi9Q~#bC?~s&;_=t(+#yjuXg?7(V)?9M+T!Tz-!o2x0yg_ zpuI*jZuWbl(jw7uRj>B_L}bp2jHxy54~XlDPV?QC6J zZ?M|M$L4CYq4Tr9shx4TLoo43kNdWm*}kzbl2l`A?dc|JFq+a}#*&a1*Y>@*m^rnqC?gI0OkMUX3XZnC z{{1$V;|AcLO;wn4t>BZf*J@SW4b5}rH8|#8QT>@(rlOYO3XZ;}PyW=paYQ_wzJ3A4 z#HMcZeb(BYAQf$#xA2V=o@2~w7q$iE{cg7HybJel$3c`ub=%q44nxQF-0D_0V>7WnN<-dx}2FG6c|i$$KSc7nrhjN=_cjcPcpVej?eJic-)Ou(0|%b z&Chz=DG%X)J}t6(*F9+n*x){{$=)FSn_bV)c3LY?l@q&>*dnC`z_(F`s@44-YQ}I zGiKNQudm*p14GprMS&i?BuL;C9m*BMMi@9UtZTRIQ1;z8sJwhXU}VlBg=R0OE@Oa! zBLD{5xdF%x@<%Dy;-#a4L$Cyq(29n^2m$($$6|unWxut7tNMF90vUtJdAAV>11S7PNoiau{hU4%41LrOT3AwC7es(jJ>eb=BVwHH$dN{5#>Nw& z;%sptzk(eHaQivM4-&2-zl(wh+Nr|7UMoe}KosD21`Ma3Gevo4Pbc0#N=u%$eMlCOPw@l zW=A+;GT5cItRxW0aTui1-GB5i}ENBCLR+u@rE9^3?-wsVoY;+!z-sgi$l~Vomghn zX{lA;rdCEymOrQ{&V-?ZU`9n68T}|iyMfF$#GuY`vkGT~KCU?|tX`M!Gr}~&PYcp! zsV=Ki)Pzz;Ydncvu=xDUSPgz<3Cw)o_2wNjPPD7W*8kF{oks1?h4TqQbc9%`$bF^?bl=FWUBFjDwoz%y-N>?jte3? zr{W0oQ*p-j)$S7RG-9k5DnS%MOjVQdA$!Q22%voPKk=j#uiP^1%q;+>c z+Kq#>VYQduYeql;$l_2(KwP|+W(qTQr$Q97R1)2PEMb-JLj-F6f4+qM-&V5REWtTZ zmC_P@5!)pCPSOamQR`n^*k-Oo+PgT99^eHc~N}*naN>F8Q(e2 z?@~x5U1jLuIqA7at_xST;b^`s#H>c6Af_i!ed1Z}f%d32YDu+6G~5bLNZb8oUu#c0 zslNx(-A-y_Q~*_@xrY47|2BU;@vx(5=59AoD)QTFAFn+_64QbPonVE)PuKmsXs_D< zd~nZOQZN3C7c$+QE`;`6FnePWETN@L0FO`f*M>}F6FjJ1zM<4=)>00X_qR1!?6?alGj_?M&OEzqs;1^>dNgXHn$!mVdK^NhQ>#YY#3@a)q4 z*34(<2hS*r36YTC!wQtRANs=%0x`Y#3bC$pN~vTKvhgAP)zhzNE}iKr^OS*gitOBng$_4euH0z4p3qh z6Lb>eOb|<45dY|B*e6J(qe((AOWHyPg`i1=4M^3aIY54svc3ElU6@PuhWVcz1tJ7e z5yU^2HtLUo!H`mEWKz1C$XTMY&8pIEWb)^Ma(`8Wjv7LSRpoXeLsuHSM6ck7e1S;d zTsN32xRa!ixdQp0Bl5o&WXoJZ%!SIZrb_HkimK2`e~A>bMwCesmGWA`YL#Fvdw|WD z$Pt2|{!8F=j%}u-0xMKFgR@G7B*=SF-7iria8TnJInrfc-M>&Hs4(YgaYu7Tt-31!*6QXdk)hoP-jYq(4Y9R_j1B^jLWM-J~9AP4KCHW>o{5FNWl zBlQNK+#Bw*#Ug0MB1svdk{AIrQN)6ceiNHuC&d-I;vXg>gGX%XMveGfjHSW%5$??4 z1}+f~L-CIo30=W}1}a41C!2gj&~gldu-kvTgvCxW;z}~nN-}d#vPey`Y)!KMlVtmp zWRIQf$d&A*mF(i4?3SAB(VFb_C)xWc*%v#-pDQI$D<#-HB{Vf9yfr2APfFBNN(^>t z+y_X}N=ky9?sBb=ft@N^7J{+{4uj0hVpUEG*)+Yj+0o^ zGIIv^x&|M*LB#@bu(Nd8QFe{o2R_pkD#GBEWa)~dR&sd03TImcvyPbm+$qV{P>0*( z;Jg=P4BmBTg3VDrAS?Uf0}bGD=FEm0!#!@rigSRwzT|s17W}lwzM>L>&Yf!{1m7hH zI;$}~10jK9LWz0>70Gg#Tl|H{@_HP+c|+lKKYsa7z@!B+Fk^_aMF{vZowW?>kSO=4 z7?5QMbk#&b?3D||l0Q*|PVWQlH2}9kd17tohpvF=OXQiWbVA2@7ZA zXqb7Yo&EIxSbgIP%nlu~SHLa<;(Dp@I;j7ZS|JPFz{8U(s$*^-6qK%&u9?)p)sCJ$ zo2uk#s=|ZK|R zB+$012xa|BR!%H!Z82&_*=Y?KZgJFUgPzU$Aof4T>3@^Zm(hkAdA6k=w#6r-JxDP% z(xx`IGs!l!_avhcsvzCvAPnd*lc{*2IW$;fcl57%t&6e#pd_A<>5%@>@%uM2KSVxR z{?Dy`L_3EZ25?LAA1k(19gOvt&T(p4IH9h6O1Q&uge^~$55xU7DezsxcVr$4s}U`X ztNYHgyD7f=C4&2whwuJ0=QD2w$S-&51_t+84F4HOXepm#m5i_kg+%9f`JvXC5Wo)a z1$OjalJ@$?v?G2CM7aermjwod^^q3zsTPQ8<#otA5iz9sD?|26xry+sRII7e2~aE&N%?#=L{J!!9a>bDlFto~=c*eX{%P1FGCcQa znCSuJ25wXLQA1eEfw|8?0t-eupm%z-jyR+1M&pgfca#h*t6kP`N4}~=A&kb!j&5_h zVhTltOY2;6YEOa6ezuOCjc8@wX;oWm)$&IFH7#u9)iw#z-TX9O_gYZMZBQ&7`(PT| z?2!U(Ru=L}9+As%Q`KtZhem7ZH^Ito|$i+6|6VU{&Su)bN(a3#JfJv|I5n40<<8A zxZ5_<3=w8wwovmhvpu-bscSJaJZmlet6eZ(9^UL&3Rc!-QDbOP{a{fIddXL*QEdtS zP!P$^GEZH63BJrxb7)Bk`ge;EP6HDj9t?#xEhAzr?5|I7p(ss7@D#r5(W>=5in92MO+>RwA1qBT z2q+8;ukl07g;&{WdV?VTBDDM(v=S=3YClfYGHKtY*AIQw%v@)$#sOO^2;yCa|ENAK zagz91ku1WlNFlEWSULOBq7PJ(FX@qLfngd$+9@3HH#8k#pKClN5hqqNLhM#OF29Ge?{TOYVnA$Thzf(mq@ zB*nhnEk}SM-=^+nw>UYk(P#V~Fe9NLVX4p4npfrE)7>Ve7%I!RV>AEWKN@L1d)yTO*0gP7e zobmwoX+e%zU9akg-UNrUyPcO{+M^noBcF?|kf<(B=B}Wr&giV8zZyMY`<_R5-Y>ko zx2Ig6=zMPNp}{>sYi^QvtDf8_pX&Kz&bX7*t`p$N3G?UEG=iRts-C@Xr*&C9vfjPe zUIHW)Z1}u_gw_INl4sR#<(!|-h$niFJ0fz+rbe#PsRn2=-A`&J2tR;cc>ryXBV$_ir zkNP`w%zxi(FA-+@kN#!#JQ0zkHQGNB0@X&#SmtXy8i> zgKH<&K}6l0P&5+t1esjkRE~#x4@0) z=8Z1Gtx)!@NcN!d*^PDNZ6em4n8KYz_k}IpNT79*XGXa5^Kb|9$O+?!JHmZ1?=S?p ztQ)V&H=hycH$1cGd;9Kt(n6&lz!5#4djp_yN6Lef?0vJ+gO5*rS2)sdMs-?^8Oq@&tNPga%}QQHTR4&f8wcN z`nfoJqylf^P;#Q<%&-dqcpj?Vf~VbP7lRtY)s664MfcjKJJBpO-eosFg#Mb<_Sz0~ z>IAey|rN{Qa&(reot=~AusbXQ`k3z?3*$ztE&s-o?3g=w+B4VAR& zLZLe%&l*jNeQCct1XxA4!QQwfn)G*u>{G>lZydJOMn((E!F0~QiKh0QS)PLPRpuYbReWvDfB*Ej!V?lS<=Vz{#0R|c%|9(1gHxv2yxX6h_oti9 zhu`s-9i!H&{X^b<*1FwgNkBvXSFHTMOy6&`YSRDqrasO)1E5?gCBVPEX>FdUKL#R= z$;c@2KqQff*#N-NxIX|WR;KG7VsK9Mxox{0z zBx7$BZEq$_ESf@ZrQu|t7$u)X4QIYgBUAL3ZQ=7B?NX?Au?xMGi&?Y^xm&GD^Jf?dc3JHD{g_`+!VJ9F zwFcAKEWzHgn%CPC#h9My9N*(QWkTLL<=@<0&R1JqZ<6Fz*=^VRJuzXTc)6}Nhl6;) zC#!Ck+Zo=o`418^-5x$CIpC}*mY4gB&HfM6JkRU;cWbcz;e_Dl>)nmUQb;ww&*Izh z=x{pe(I;0)MsSaCu#XzD1(81-^KwE!3x3L$KgzY}Ht|2xw>+-Phv}O&2(TSm`gS!X zV9K}v%X@6^M;L}yI+7Q`I3`Id!`?J98o@NxVl2wHgS8h!gZ^Y3B~0=?CQk6A1xqTr z2Nj5kUuqE@ZN>E`Sx`+sb)QGaac^HNDkyAUK-x%j=ayb|11ORd6WH*imK>fwo~@L>5yEn=DoeD=kWx$y8DiVtET^TOy+A3ofVP(`vFYUcb1rY1t)1xvSWAqh^)(PH(G+?EiTBAG+^~_@n28BF`%BBLmp$DGm=v72rM) ze=dqUnYAj4AWCqfz-NfGn)fD;6WDpXpaV9$AN~5(_+eTCJbk-J$n$=+|Ko4x^I3!s z#nWoGfWYIqK{nz0ftCLAqq#s)4hjD4B{cT?C!j~ox3B&dhM4bHRUR3i#pJmSKVvTU zz;KiJ-=-KseYK!Oq>1rE3e16|4&_Ga8V$sg-G(kd$CPF9zU-!v*si`Q@s-1`v2`#|zQ)C#92J;mTN(aA#o+QmbEu zYn>@82JecIGtY)8z6PL`QsJ<23rE1*5UQ*IhB%^_qJHp_V*D)`qCcsn0B##&ZEK2i z^AAP2@h%a&=1B^~DMgu8>=KcViUpvZ5Sl+q$eO8e>n;irZR`dU$^VJppg)Mu#oOnV zZk1N$S4ga=80k~~BBKNsnDC3Gkbco`Jhlaeu`_|3UMqD>yD5%u^mU&u;CRC9AdaN{ zRhAVDF+r<-lQgwZSfW{oAGI8p?I^k&H}!F*sYDV*b&#gcitpv?ok0#CUQ z+@vPuQgWY#O$F?ux?ike@D@VOP;(V!9nc-sBDGC>zpG^2cpV9np71;O1!TfjE()h7 zOqKx>avonx_(j6QV+oi@z6$HVAT?2$c@@K(c}U(fT)~WdlNDw{+{Cc*n9m3|D&`B4 z3-;%pH%4wG;Is*qj~-UZPGaSfy(?8IRaY$~NGy|jqYkL!R;?0VERk$HVR9EyPfKGf z!%sa~>ho9($RQ!PO@SNZ_KPx{$hX}5h|N&U!V2xdJ51%x>fMwjbl%@pPXNvg;XRip z$dg1P7Of^8Pc(Yql4^qYA&uG-b0^qc>Z9+@Og=tetbUF(WY}AqlfGz;fy0;T3KBuq zrtn&${!MlGKHMS25SBXiNW+X=W37B`Lt~~eM;GBd6p|{3*mB(iZp^m9 zm@3K=E4?#j$@YIf>iYY257FeNJ+)zH_)&seN7v5DpH-gy@S7)NzdPP*t35i)Hy`AG zci((miM5Y!e7q9ltze_rRYOE8jujCU-e z;1Q=@>y)3`cq}ZFMwXx-Spq(@NDx|?i4tU$Qi4E+B`qM1O;Dt^IG2gpT3JF^ajq1( zwo<*qS%#**PhGNa4yV#F8m4fOa9mfkR$EBR0YJ4>hl`e_g(OFjED$_TI|>tETVQea7h433K_IwAI%G&gs@E*QuMVm)Ao< zVB1WH{B0iY+mWO~+g$S0Z4uAgv0`-FLb3c^naGQ6^8dE)xv^TFP><@&zFU*+Q1!2EhHaOzIw zOU_GV`^y_F2lx?+?CFZbhn%7f)H?q+*S>x;^p}s1W6nTJRfj;i3( zM`40O)xSe&MB?iy?Ae7%2_s3l!0rakN%=*S(vwvlTtfpkq=`2&!jz=JUZ%lyGtT^s zj1%fsI_H;U^kMtQnN((;A<=~@q5pcM4W*K$p&EW}9bzhrtrAXXW1wqKIc@A`K?) zM^wuPfCZ71HSK*cgLO4o1#ej0Njbb!ID%AyU8y*oK1AdJWDYEBH0o@huWYuULjpKL zJy|%t!SmLWBnQho(e-&H;8u~2qKBvbYz)f=QxT)Ygf z#J&xnjMe=5kc{^ef!cjtPah?Ikx3qw1Yy_8t&_=u4duWb_|RN(8w0XikfwcyipaAv z;FthZCb)!}=(orJ$P_cWA-2l)tI96AC?h8-6AdcB?JK+_+hB{yQ-4>a2~wn^R%QT8 zDJPF$5egA)#sE7(C`tBiRPG9_t#KH4aqUK5Z5q|soz?Xd)x{17<*4Blpfuvh5;aE% z{Op0t63A-qi55`mmgFeyLE82EI!%k(;XxW{L2wz1I*o(cEn)#rOlU7NK&+?4&kjlU zsoD*V+C9!%G_{70i~7*)`T%Idr*A2c(E2;*2C(8JXEAo+kBL!#3}gNnASVUo6&MF; zvhh)v$rYKJx!Airrb?=teseK3J}?o1HZ9RY$4U)|1-VN!8RvaB6-Y8QrAQxcuuNI9 zbR7C#Lt*7vWEMGOS#V%EN*?#mf@{g5WlC=&$v*pIb35viKm_`*3*2G5<=BHhW@F<2q%w(JC95|kHRC5DlLzuEst&`kKs9w5htISJD*iM zpWP#$GcBLHEuVKKpZ_^u5T`(xyFgUCK-{B1GOa+mtw46AK>oQv5vNd@yHHiTP~D?Y zGp$g&tx$KRQ2)8m5U0q9yU0Yl$jqaNlq2UQwCJxmN_zq-^%cCeheNR|N=8lm4;;Ig zTK@6mVhr=2lUKmpmSpd6`vX@-7p;=ZCK)tvTnuGi2^tJJ*w-iK#I_yH&sZ5qk7DJf zU3xeKOZw+I$4v}boMCOGTx+7dBXD-zRDySc0^47>UN3>k*p?=wBiF?gShF(okz#`?Hg}uH6dR)S|?y0kz0yRrjY}{%` zmF$gk)Q0krhQ{J(ziHr~o~e zX{s3MjSt9uT4lNoeMhu zTYFQSG^}GcJNUGMXRH6g+&gwh`sm%d-RYQBLC3b$v2EK{$LiR&ZM$RJHabqnwplyt zzt*$&v(Jn3YVR}7SEzAUjl1Uj&Fivxx5O-!D*XCJ_ARn|G!6x#vHpztEp%< z5|paVl3q!jwa&bLH97$p)4gUPR$@^$RT^}!M6>UqC?7MJA5%1{jCCbzm>4r~9Isg? zC^1)xL}B*KL%b(os=zP-jTbZ%PdM;ToH|Zy#ZHv1rS^LIO-I5G(o8N){KjOgf>}Xa zl;m$9A^~LP|2^a0jf`OMu%3#W+OeuyEJ*l%T?KoGBycC7b{B=-pgJyH@X$f4;Vm%*tE{cL%jZTY&DI?BdrC3BT zD=R$vou@ioa*lhu`pc`#fUzkb2zDO2ELPTVp2<3%<*R}yhXRX+0ZM27+&Z7sEP z0&P-)(9S$iN`Yoyk)^j5FT?McBw0ZsSwM2pU4M~iO~w9R#j!{wCk0>od{Gu=Nuz8r zh1|yLI2o=F;KQLc!H|+P*uXI2htrA8ME%Dell7OEmTOk2i(s7Xq&hR#9~SIoaHi!& z8VS*e2KZ#XSW1@gGQ=&0GwcreE&L zn5C&nj4vV{8Dhm-2Hy#Et+j#ST6&|`TI;(pN#9z9221z3VedIY%jDRA42olWBVrtG z)>UTqL&0p71%<%I()l0>D1Kv3fMM}HYjYC0UA5fZ3$U+Ic&H-|SHCGcw`t>L$t)$2 zygT&6y)1D8`^DNApKx4&6ZK2EgqIf6W~K*827QA0d77{)StKZFzck z5c+NTdX6uGXC;=Mz8r6hfeBN7g;b^w2L{|bVg2i`K1bre?`iIk>;V|)sYlkffmh3d zj)UE0J=iZk*c&>qpmW!1--GP!Jryn85Ix)rKHM!n+#WhCGw37GwlR~6S`7z8`da&f zHcPgXj|SOnBBT439**V-`}fFTyA%*nKC#`t2g`!Tdk4q6kSB~CI19trj7I$rKyMv7 z0Js{}Xff`cJd{5_(h~#XQF>K80d2`ge|fZZd-jQtrFHides45we{_F;+(4PjCR9Bk z=&xE%50WV_Vqq?u%S!Upp?n)VqHL;np?hvrZh=%;daX-Lxo$p}APQ!GAr3HlgxV7fwxv4*D~ z+K-||;TuX;7=m>eDk#VP0z$)*gT#q}GxkOLZh2<6e*K7uLCAL#UUy?Pdy@|er)1Fk z&a^f3I!W!NO*`vv?FvsDRX@y?GtAR%?WsNNV|6FQ7a$mOCt|x5TRGw_Fp^+(rsB%5 z4jy!EO%F~uqBK3if}f+U2dk?`rw_UY@I08v-3LowD0I`uuRqY(juvH(%6?-%k$J2G z7>e$my4yZ#+MM_xjk(Z|1^A2w*^+Z_SzR!a)-=r{+uR5mg zg{E&AtB#02baal|F!(t0r*77#T0m1(82sCjAGeY3XTXn3xsPW)(3kC~h*F=B)x~y_ z!yHbYXhh%}y28#tXpyACKq!?CkFD`XZ^7_T9I*iC$ocuPLbp@Nm`-y5L+LYCW+DH% zCw_qRiBk~BSGJf&<@@zvg(s4(Of(h!>5ryyW7;1}rl+SGOm{vWD(22h2bWyj=S$U` zBr`dgrIx5s(uk(@P^Ft}ko6EncwH*ji11nWN^mZXCU&}ygo(bVPagIu`MXHH8;U|6 z>PRbf_R4nkw=d+BL>K3Jq1!f`0jranjak1p5P|p;Rm*5Rng~)V(d}GmG@Gfz7t7Xu zZdzZj;_64-cyh7c?tf0c8Bf1Govsz3N1|g(?(i}Dun#}7)}`TiID#ohna$<2Im+7F z+>FlQAz3h1vqqnNQ7z802ISb%RCgLD5$g;BdX$Nk|K3EtCb??m6n{K za-m@!rJcWvpJWXwoD-+n*N&fJX*>z!;`xZ17~}geH~{6ix23{!D+mMkvTW&|cVolw z8kvjvL6{9QxJWWi3JPRvKt&14#vk+Ptmi*O<0i1Vl+IGu^?%0*YI{oIR}Bb?*jhJI<=4=(uc)gk-y&W*u)n-ax3Wdyn(5>6k8A zKkCTt@GNguU>Un^*%Ly#8v4-=rRqkBoGlyp5F@r2`tP%FY)4&hEUyJW>u?x{Lv>-` zrUH|XH^pF>TjKfkuZJ+4Gs|jI^`{tGhC;ipNkGXG3(v&~Yy}(1NA8iLnij>Do}4F! z#lK%pDw_}7kNmrNKb6lJbnSR$5>nWfRWN&P%GJHe9#$oJO|MoRRZAJ?<{NaJHnqoO zZ#LyXy^PByk>|DR*3szCSBAw+Y-%xYMlC~AK)u;71Ij{SrH1safqk^O^(T$47_m{s} z_#c96wtT!BdsR?f&xez0W3}`4Wv*RmE_-_^va7wMS+4GFIp=%ia4)Un-l&*KA5VvT zU$Sk9zR~DQ^f-2dUsU^muqD2{LiWDM0J{91>j}OwAMuCT&G_PVphBaE3W%A}Tzh;d1(?IBLj}3OC@Yd3%u(p!@DWDI8UOFNasFc3 z$Bbm2ce{9m@x%Oc;IToKqlA7>rEE-bu~x==IHyk|KSV#D^*m!tS`8HG2Vhvnf;w3% zv}9TsGV%Yu6kz(4xBmKH^48p5zamN8|1h)B$s#{1oxyMv`k(79jKsq+1laEI5_Nkc z@f1qs+M{)!R4fLgu}q2j;>iql$CLHZ`jY7!{s359$%fL|T=E!2>2g$}`C`NzK@$q+ zliqTA-1pU{^Vyt2^`M{oCuo&|6-MpeJW>o+GYuvyM2Tyt7n%V!eyc1V3W=p5S$k;I zqSfPkvYC-D5HzVZ1_R+BPI&H?tL*_1bU7OWY!{oQcI#Kx(u~LR?QaoqA;&56)$S)$Sue#Ga=8B9w-;6)-2ald zLYaa}q!PLQk+-53>6EyAI$Pmzw(fY`uTIwv8$ddpt`B=bd*WOt7)ry0cMFcNm?JPh z^!=d7TJ!@z-2X0ja)W@T;)Ed>vMq#u=#r(|lEm-VvOMnWJK_wth5bQRl)smEK8qZ4 zm8gFkT*rzGW7xr33u0McQjKE45!`lTIEOx2823(}Hy(cS8o?1?Sy@by)J!#|lcSx= z7E)9V%ScoD^Dqz6O`0T3(hcJ+4is!YIU*VKgG5NNMeuH;_%7QA#3P9YNa)l8O!evFNn;HwnVUpoY3YE?!SeoDcvMOiQ&9D{Jwe>GQEo)jY+Tu*XYkwl~e1s{M^VDRj zXE&}oU}ra9`%+)XFC!}3G;alaD7Pc#*VA?!k7;QNTxMfmwh7K^<#irRJ=#iAwi!+5 z4u^q_=V%wID)+&GX0Q60B&AUY;Uhxq2PEySYKH-q+=(OTDL8epurAzN!(^5uHQ^66 z+e88-BPd8CV2?j;xmdQi<)^sFmzd@Fpw6MEIB%`0rkCcdZs&y9tncQ<#Srcmq|vLW zmewq)oc_pG--U2(dEUm*)Rj(3GlE=Eid4)>I)AN!I&dG?l@>u&tZO#?w9U5OTewe~ zfd%huo9;-_THC&dwCr0H_Wom(R}}pdYXJyN&#T++FA4jpmQ!wrIpfHj%7tcKZim^- z-#9VzUl-brYtR#3PGmMdIM3SWr(X7d=it4bHS#6K>cw>2Mja=B&yC(?4cy9Ey5BX~ zQ%-RGQ|ZKXK9D=oOWsb~;_=)s>UC>948t_OJ#SVZecbJI%XPgS6o7bMpI;&0$d&HP9do`sx&UKx4O!~0gjex^Ap`8>0tulatD1z|g*E$rx1oPO>DZ}y`tku=fAw$7 zcleM7!g{AELQ(A6NrP$ju>U>@ddsVKd_ zy_6xmBu-VR2%Y&Xu69EKc39mo#|vYWueK5P^^<5eYF&&EJPG#YQ7E@yp$?K#2)6be zv>S!B2*fG8~n1WAoL8 z%nz_~UWjse6%`c`9OnXhjh`~MCn`0P&XxHTry54-OI1usRdV|l>Lr{D`RVuN<|;)x ze@>LMPVTFe?@zTc=jaX#3-GRM6f?nZYE}WTKagIASSOwvv)I4a#hXZ(1UPEA0LAMw zWlp4cu~$^Wniy3F&n(zHSf)WAJGE6=XMCdATJz=K8XFg3EQLHUH$POGx{IvMf;_Zl z+I|rX(N+bRW~^4i8YfP}o#?&gi@0jbSwxJ=Vz(ZMUs^m`ZoFSC^o?gld zW{6&X|JJc)O^-1Or+3>#*nQl2>3*vP`>0sez4A`)ep;c6UfbOB>Qybf!=-oe(cAU( zjum*?t5=>mDA&SW()?LnsedU+O!#Dj4>lUCOP(F$p}z1h+~P zg6=15Avy=Co--mGqcqTj9BX}I7*3qxKmZ;W3IwO@HiFTNkYhlv2>$2BW5Ze&GaFhI zpK3eGmZ6{1N`bcTBJ+^v@p(EExi$C@7taVyb?c zw5PB1e82bXF+Fs1;(b`e%;9+`y!DpM)^p5bw}7TSbS|pEtzG~xOU?cFUiGm*497l+fO|9R zm2C(cuU%1)o2UkK^=r^&H%whQAEj0RLR89t1J@$}JK7X7gfufD(WQ-r*2itaO!pRf zi~Ep^uSV9h>n6Po=KvJ@Y+&BCr;g+0C~*lh@AvU(3hg{n9p+f#%1n^>yNmPAE=H0% zd&A4GbCQ|cHaYm)v2NG+l;+ZXAx!ta;!oBgqJav7;nzt126dvZFCx^wey}|c!dHQ8 z9dm2(PlIe9(D7`Hx z{UZ^BPZ1-jkz*~96BL2N;wFTlLbIun(=7lG0ldXfl{Bbd95UY$Bofk8l`JW~azrw7gc-5L&9jr2p;jKV z{`rP@;Oq0KmIRW|h!0?=+2$HDG9O{)F1qDHRLkrX;w~lz*eL<1S~659GqFlC2^jf4 zjQGA3@_%dK*+}4pa^gD&G4sAqL~T9uW%lNlgg#xqp?U3+SP|Fc^%K4I>Lvk(tjw%r@EOB*&f-ET(Mj{?5 zEUscK+Wc7x%KL!j`4gq*V!Dev|Bwh!1`ZU;%nitF8p}+A>xe@ZjF1#83R?=q$wceJ zzwjf@rRCE9lwK>8-WmYnnaI-&%F&4+A>7Ne)E1(mDay9V%l}l23`(ZMqL#vfhidbK zB!pp*C?ZIbCteg%z*1i$184`S1*54LCaJ3isW|T!yQrw^IjcLasyUApi>ksZ^}+wG zK?E@r-lzc*|E2_h7FFCxOFTtX!|&bTX4NN?w5m-sWLb1ZRdkwyv<5^pYMiyZAhgTf zP^Jvv&BXEzU;Zh!*tMrg%hSWPi>WM7i}mlE4G<2XkxcdN_Vm6C>4P2UgF{wwD?r`! zAc6Grq4Hp0Bmu3Ql^vRuUG9}YRyRfqBkRv{u9!>q!AN1r#Oc8V|5riMUKJPQZxhzv z<_9L6c}SD1fKP8Qh#wv*4t8wB^q9)@G~Ces;J1aUS+l8CimG)-lT|mFhjkoq^_XIIWW)9pB@Wu; zP9BfWUScj9!ziwYPO5M&4rWf8mM%i}4M2sjqsxr~kH0+GT*Sqi;DH{i<+P88H|94(^h(lR@7PFVvmw7@ixxTwt>{PLdfYdXY46 zMwrEOi3vpI<4}5~Lt9 zR^5qIVh+KinzyOHCnWZzxH;rY@R8^vQz2#+PnsO*Er(_;hj%VVZY)Q?FUR7p#Ph5q>Z~Mtt)ynHq<5}lZmeX#ujJyc z=JTu;>Z}%ft(Io3mUpgJZmj-(U#-DitK(T~&{=EpT5HK#YwKL=*jVd&U+ckL@8ek? zs9NSrEp>7ILEF*MCb8^w?mdPu;?%xAu{Q0b;_vXe!xsJW^>g+cs7`AvTuzD2w9#7W?wyh`haW2eays$H;?Wwk| z=l0IJ&FlrPwqr-)`k-ZTVRa)3C8pm!wlQD`3H`UJ@`ymO{q-x|%og#eU^_%z9{%nL znG6F-KbCGY$mwLaMB@NVU1UE#fMSr77KsCKI|J`)6qtt~37d!b+gyJV*dX#a6$88T5!vd50L8NC3!Q*6*^|mCE|?bJ z2Q$XyGfw#1I%0cQvo3tAE>b&UDckjFFYno(tX4QlBpFmFm^`#6j=>5`fcZs-^fmv4 zZtgU%kUYt`_WEgn1z>seYz^VOj(*4_gMMA?Yr+BZDLMb5=AiPo zE4u_E2$l<9l}E0`2Mv{-?@k1yBz9RMvDHEXQSOrmfa%rBCeT3>BsiH#ImrO-Sl#c# zYiamQAwcB_Tq9FUD$fMl(Q>ZE z`FwLQL#=wHRpl}K{8jBrzb^;@Uo=zw+HfcemoFGcGL!koU*?I|zz_|0@(p4gWVJ zVFm#RbmJNUDEvSMK^XGF8bLVv0R|xiw!Ipm&vieeFi?!7Rv1N2`198}n_~jshZWhR z3RSGYk{Ar6(?u-O(rl@g>d-lLpN-GW>jWwt z1{r-yu7`;qlNsk*)w!KNkMwKr2X$j~oL5Qd;awJ-&Ae!ocWRrW61WvhGWkyI(3q5u z@=B0*MXpEi+)-B!@o8Eo%u~$sHLRX?V#LUw_cMH?J&#A(a@@uja`4>tH>%;i9}dMp zlung;T?7gPArP4PBpB6|gT(i_Vjy@XZucVrkM#)Ydt~Tp5Rl&Yn|35PntHFhHUr29 zbA1c^{nP2{EzgKmNC3l_n$Y;xi~C@QBk%?VH?A=h#PAjXk02;yq)nu=*=7LGOazO? zJIP4vnFlaa?;j=rhH#P)p~OHBkQ~^Biu_oWi$~@1P#*wN00$}efJk()KbdGxcSI6N zM46aOBTA)q(SgWAjLEZs?ry|bozSAJs|t*6o?SD}9kg@)mM)+`;-_gATuaY+6dH?z zM;q@`>ZOfU)9j&sS~wX$dLyGohaewBPAe>9UK`p-=Ns*C8n&YAhS*uM%c%n6T~`%;+xWi2{>z~J&SHt-Pr>X zP3rpU7nB^I77ls2fJi<}LYVPohddE+azPIX>R-^zrJ;W&hf;mZL#qnm>-L*Xw`!ol zeW&0Pa-a20zKh0bED8vjcbXCUo;|ZiyiQBcUaWt%7_Rt)EI2u2L2FS`x^{*K73 zxs^dRBJG4rurx6=p*;;zuf@)+DOQZD@8R|~{4mGjDNhM4);)!xk1ao=DBZage z60@#KjtL;y9ewNiE_I-;d}c7whB2hZ!WfQFzZ=k?K2Q{8AL|B^z#xj~8=)6vibW&a z>-+IM%13vdm=cLn;nj~a#58*QpCnra*O2tDU&SzC@wnd9m>{aCDRT_#q~(-~DAcVf z!?@do32(j1dx->ZE1xtqK}~`41$lX=`5id{Q1WNw`&lKvnQ! z%bld8e`VIb%7TT$LWXXJ&YvboPB8Wa96q#>Vo?^sv#}H7&NgC*g!{2B&LYJe&c*g* zu?nyE81-pQvc_N3wLX5QM%A1v%?>Pk`UqBLn5U~(h^!O@t3JLYg?cuG$I7W zD>rByVwlHjSqwUfkk?nFFZ98KFuJe-9ts7R)1yO=8^IwUuD>3c#DhrQ_D%UXz$E_p9( zJ>1-V3pQib<+CtVhufA&8}&3?y%-F-N0v)$D(dxkPPJSd{(!EWJ9|1Uq2k7L5hbk4Q63fCYCTze8W&H{ZrH;KC+GZOt>jZyy-WcMcx_K4umZIp&l z^rQ4136XxfLrrO7Hk3dA0}0Ey&#!@C@5|MoPH|semZ!TOoLk;CxP5+Z#B|-2$i1IX za(FI}XFoKN>t6_6zHP2iz4YdEomSX-o`FoBbGP1ay+B^u5#3LJ#JnHUy1h1q@So1f zyY6FhJjn-*@DQ^KHS5r9eAD=j0$q+s+8m2SIk-mG;HF>sOrZI7s35_dz`qIeJInJ! zSn*FW^MStcPv-H%4fKF#hC)~+Hr@6>feXN(_RbUce)}P?#MO%^+|lma13>M8rQye1 z=t0@zN9z!19}z%b@5PwtL8ufU9Dq?Z;{Ou?;TKDoC?DDr03DVKoq!EbZiPybCkcKX2bb@A@5Det%H}(*elkca57ov^~Wm@Rts1%^r?hmsR z;u#QReuMh~F3gQHz_{MeUdWN*3tNy1>#qr0iBT658eWhao?bdoT*@S!C|uZ5Ap7G- zN2qWaKt#3!R?e77UU*QZ0k)W8u$^5*rf@(dQ^a<++iXpQD6q-nbg<11u7x5?&#J@_ zUQ}N?(qN&&_zl+i8s7X2-oh$DQND$&PBgMf|`&>-&*^>U-RO)%V822^5&o(xY`dW62C6pSK4}`xEKxNL>?Qj^xvU z`NHpSm`)Va`J(njGLnvzN~yAz$uEOtC-ccl6%K7DLQQ+EEQ>1>Xf??ts&$v z>-CL4qIkyRsViZxI)R& zD@>;0>BMrsJ)fBeW-=u*c;D5X4(BSc^YP9(4)I;Ky3p2iDwQ&p5p53-HeT86g8Q6r zAG~llZ1&sJ*wj)pTkejbE9lvxZ-LyVV_@%~aRjyV?$YAU0Cc(RNVmJ3#SnZ@)tlZ^ z>VAFo78_$Aa{FpZ-Bpz*s;4J?CQeGPbBZ;yb1O>`K z?F19Mhi-%s{Zcn{q;U{8lqnq$lH)O9?+atQEiD)(jMk=*k77G$F^b`Xq$G)BKN%^A z;fH-jN)Y8uD@;`83^PuYT3z0Ylc&;{lZ>7T4y1-%<+1(6tZ87w( z%T$=Wtp7`SeNsA^mX2MX?GK_lu`NtLIAN3vNm_9OmR(ft-R=Y@4`?nrG7aBv5cALFZ1c`QglnskT%2vU zyhrEVf4pA>S}!kjFGt|OJL>zGv;EIo>nrvWHYKs|zsmcw z_Sa1r+tNU??*4<>Pc-4Y&t+5fUlQ5&P${_gSEh-1KVgLfBKXCNBx0x}mf@xStY_B< zIPd-WeVqHL?POr8w{49=y} z#GDEl#i%7*YZg*oFLRoMKS-IYj%D;w3}MALIWIf(b6mgxR{#HJ%VK>Ou{v6*t!Ce5KLyCiCzLj$#rlcX989m}FG*niw7 zR8XBeEps0oEaji}!KM;kOi`hUH z*T{h;Z-0%3L16kjgt~}B%4khWSebGCQQuf{-kPDc_4*{ne?o!JozqUW>ztZfwnS8%2O~BPem=I=MbWvZRcv0-v9+(Uj8N_orV$Ck z;XcTVabpdUwMSPGL_Y=boa8ArCMOX*LyUUAzV?A2U3*k0YiJPP6d;(@fr#HJ1KpSm zOrQQRqLVTBuvxVu(zo>1FhU0szr`WvVDx~g*7|8>{zVU9AHu-2m$lM1Ks{vdr#`TY z;lnYk;%y`mRz;6yoPa_2`~Vod8FDbJ8uG8iEstk1u)DB~B`%8nr72NTvJUp$d^JE5 z#?hf^5q<}SrOyf0-u0YAl_dTXty7|{jwwMm`)NUL)AkRJ+{Y8WKc+1vVTc}6rgHrlxZGC2Wdx-5df zvA5KQS1IZtf0uO!{8TY>{PR1wG1XT__Z(4+sfCrbVmjeW4~cYnig%>S(aQ=<#bf1< z&95qmI%^B!_CI4bp%n79YX3TN;jnb}L@?Ze9roC8RtYwUs=N5r&9%9Z-OPV7$>x_& zwDpQ7+0F54TX@CEcK2}Ei6pD;m61$wX3E}yi?|WGw)Pjg`$>Vx=1(x_aC-}M<=WdT zYJWw7v-`36G|I(m7Z%X5LoX-pU^f60K}2u%wEzlED5E}q`eivrdCSrD;x@lJ15eP_ zR4WTFv0(a$oQqy)+6&656v^vExw$R;XZ(E?h?_zH^rBZr2U|7D?b%)OJ?1YZ4{im9nj8JRW}h z2)faYNc9^x-SjVWx8-ZTYwjaQGWWT9om>7LZgFMM^$hvPWl>1yxNE+{WI>L@KKgCZ?W<0?ycFV*Uo)tw4JoGwTA~ItR#(iRZj5 zT`E6pOjPsP5MC0}<-|n&NwQ=)?WhSAfw6jNN;N4eL3@dwJOJz1bJ$+9dl5 zI;qBUNFMPoKhBIAOacRKhrP_Ju=INFPxrsjT1qH%&;d;10j$e<9Hod{;y7b}1NbQd zg%koATM(Gl0|xRwX{*@WPk||S0lY*(@Zy-F=0W1AL1ayVG9%c!t}yx-fkNUa+=}qe zGjQ)ch^`}ur~1(5p#fSWyt2?i1{fiX0zqP-L0qZ9KFdM=&>?UjAhXaw0INFuey&wK z38walU}|XCV2@K_J_XL#Fm3j*0fjI<=difau<{n{>=w&7L*#tu(83n%;v?wN)UcV9 zh^$g)0uh30b>v!#Fjn=5=G2G`cHyd{2nHbBlO5u_FW`e8F{4Jf!8~jrIAVAtyyGdX zTO7HUJz~){{EvBLMN5R%VfZox?#y9Of*tIq!dbG;rt}MZRgdQ}0U~&)Y+I0US5b6) zZ}bIpOmP70t$IwaUCc8D=BqjCacJCv|_=G>g8)7(^JUbLhBl8nLKp zu@g115(0?u_Hafsuzm!whlFvEVX@yi;xR^bu+l=2M&oZl>~T;UaYs&Z2wxd$zaXvq z!qqasd`8FkD!?!EFh>Bm-WmkIE0xPfAU|cIutlOcj16LKqRexm!b$|6LXwb1qF7p@ zeju#$@#pF~Nt7^IO(R+JIl+7-$r2`+uNM()8)>FAh5i+6NfZO@ zi@VZ_ca4f|%8QFzWrxFXJ0<8HG*MhuffjM;IR@YNVM^W7k^Ns#BDPC>?MrvdN&`Te z$dTbF_19S2m}TW(vlBJ3qh5e1u*QsexU;>uiaTY4!0dc?+_W}e5p4MndxEz(g2~?U zZ(x+wKiOV^70GVpC|@hy^CBsM#FYM}`r8$BH(7n|&MiNIgPgx8<4E-#NOcrRG?B^F zcSu$0NbTJ!5qc|C`$&x(P)rmlekoF>C}#d;CjWav5$aH3tNGgt`FBkI@8xtAe3Rc% z4itVw6{$Pal_)gr$R!IJG;iTFDh1VlruKl6FMBvDj?#76hz(}aX2s!UVAywBSSxi*HNTgJUZ@?l668fQZ z`>Cd8;c%8x`NpC?Uq3%kYXZ?ArSwB+oW=K6*83ZdRf60VI9}jxgA`n&j8wx?0h=F6 zqe}rRHX~=L14rp@^>evnC2>>ruAKGHCWs1x5eTkp*rp;!yi^pfy#nrjCGKNp-ui&% zrGjR9IFv489&fGR?v{Y*(5irOo*)n2Kg7JG_5uVy1h5;Mz`h@VoP3XV3&+BU5P zVcoqfvodk20r6mP@l-7PB=6oUaCO3yLjMV7bdIifJ9&DlD4k* zQ|V4rnQmbj(4s8#U_*qc{7(-ws77p()Tqe4ugJfzYh&daFBDV!fPs}45kkb5*-ePvamAtx4Tki0zQQsvG8f( znrhNchU=Qf@LJdVI(PdX4=lP*5PAbDS{{*F(*`={D!Tgix~d>x&-xl5Hx{nH2Da}C zX;vSh#a-9mQ`^gPBJt`_{qAEJZyJXBnX3Soz*FFnX zdxi8lGPbG&Btsx7Lyg84fc@CLbUUC~Zp}EzP zMPjgdaR;$#jLhP?l04&NWe0y4M^Um?ZEoT)S8dRW?I$i zK9geW0hKff>97abA6s+XF+IC9eUpsc^{eU|rsJ0o2P!ouT1*FtT02s5N4P8p7BvsF zC`Xe_l(VHsQTPs2zuAl8*{@LcxSbC8=MIF{01ua6av*ePVHcP9I2ZM1r#10;Czp9y za#wXIq_^0Xiq`aR)^iKJ^QMPRdliy=@;5#&p7!S1vp-diq%c}zMeXsHV^(Pu0ax|q0;Q(R?DG=Pkt#n!RZ?zKaW<{ z!B=0#m(2`9O+!P|jzY3%Bg)=`6vRWfprZ%aqgO`4MnkJ<;@0Y0)-spZMp~kNkF1&z zt`~~0mx)KOx<+>`$Fh#beZ`C;XiXrJi02d7NCUYhELSBktRyg%tygSsoSJXot;DbJ zZ1Rk5zzC$OTO^}gr|6cY8ic_La3tTJ&%hdNIj1cjARyl$q=cj;KU$|Csit|2rk6<6 z^L)*?IzdL7TKp!9l8KptHJc8w=@<>e?RMKf!rWQc$eMdDA-mWn@+RDPP6g}QVZhsE z;@$nByUXgm%bvZ<*|p2Pxy$>p%a6Aw$h-IXB^LGG6VKk0?Anvw+>`y-lgHavzyGd0_K#V25|;z;nYzCXzOsDg3eGgSfj;T`0Tha+ZhGfX91vTXy~R=2z8vZHJ=N88X!?at09kHQsUuWRZjVM#*C0Yw*QwRy1Vc7RPw zPOtZdqZb;ms&n*sn6w(0xSAo0C}e@!n)f4Yz1fR{E-a6l&W%?juiO)oAMAZ7wD7F- z#UhvYh&WrZCq3bK;Bka0GxRn|b-lV*!`JP4fKwC3^AkH|Wm4um+UsF^sO?-p$_%SB z?E0A|lDUJe!Z^Ir>2>WjEF|N=3dnnoyo7v|&>jfn0AAkIGTx$I0Mit?Wc_%9rf&CF zTGJxhMCnQ0mXQ~G16rvg2HWohcW$x1GQ=y31vK1iw{$4uV;9)LfpTFQE|3!JYO&(( zHwt^w0^#l$?3(VNs;)lcJNUF*K(js+uphXD+Uxs{pK15gW>&D5|1mWWX5-?#nP1pm z;RcFPsh0r;_nuU!ABHoMZxGNEY>VY8f!HMvpQn%1VV))zthwo^;p zStxEHezWua3L-@xsoDgX%B^#+GO`1q5Qq3`Hroz)eeOOA0YIZNcK`}QE>}qFUk6S& zT*JNgAXU@9ac|%93@H?YDvveBO%zkj*0?801K*uyM?UNjZRN2~MP1`(`H9i2F8pTJ zlgX5GOl6E17BL}p9Zbz4Vs@tM3%X^s zImd#};cNPz^*zb-z5tC&O@ZG1N!h&P2(ZMbNHXrni_9$Hq_9u#>UWyW=1Oc(TH4y9 zEy<`%8r6U5d+tfhws9HN8mSU0p7^m*r=KD^lMhPW(%|J! z|J3(-r%lr&9$N#ilT=emHR@vvUi1BNLh}A1+3jzzNFA?Z1_6Z|e*^xh@8yfUY5?b` zuBo-vO|N|(ROR#1oCCiRt&K#}-pRg_#ri<6ijnwWFk2*A!b%nk;=1hBiZzl6LL{mB zhSB2Mo8Q)?s*lKrp(qMG0or?9Y-!= zgxe{UNgQDele#a2`OFj_;h9V4WU+4>*hll@BIH?-?2k6jPSbk$?-_G)Y!&=p zK>UN*?nm2#_6rdOD5U%9-TnrVZ$8z^f7)!^+d}6lW`w!A#4b9a za!{^?w7mOnyODgduh*t2ce_p{LLy=~85!s}#$#eB*yC8=(5g{AM<+m`MtuK+x3lW1 zBiy!af;$U$cW2@5?(PJ4*INwDVqE4Mik-4CBb-Z9`afqipO!h7@LABK+ZQ{L!5U$}5^_a%T6NE0-*6)cGLZCJK1PqVBm>`0 z47j&G{d_i;XUs;)y*w#<%bCV+cP!c^cYz>2?SI0;ZJBcS^%?Vxiq{2hiSB)&lr zh~AzMn&H9(tvM`8RX&5Ew?L{i7teOykPzTE%CdeX!LZvq5yl5ocm=TWl6xVu%+)Az zSS7UhhOeHO(O67pcp}=En#dihf%km{!OgU8L1#ON7=I_8LQ$>W^RA$XpN?K3ZanYZ zAgE07hplWux%4luWH$;ndbN%h%@VPucniUeHLjDqP8n!27uOA`<`*1e1PfPftSE!e zKxw;cUp2(%uSHayb}!T=FsKL?Y%-v(-M8Ju64ixhMD&{2{sfKlgLGFNicUoAldN5P znpXdoEZ>`7)G+a6Z;hoZt(5%GSjIG98+^OEEaudVS;j=H7`5tD>X`t%HWL>R72g^< zsP0i&djyzbhEo;aawiS(Fs zzc@P!P{F;h~m_w;fNBzo_oMrpP1zd0k@EkjVwwg)A z%W3Vi&aU~Jz$gy5C%SemlozRmyJ7dGmSr8XVMrlT3caB?d(zv+=VP`SEzut*F({gB z=k0B$a-Fd}LER8A(B_sqaI2M9%wj&q`mx_dfHyv^h78FkyPtmScN2{ z%B)DU2owPkKy*e5ZXY|HDExZwR3Lm5JSNf&DW*G4n`}hKOOhxrJP{@RT3H_k6egj2 z(&a54c@`z*+3xgz?jUy zE&2eMoKPfgj80g0py@b^%RG+HeSpm`jyD8JXkkDYYET4oP?T~|jAKw-Vo*Y3P||!* z%6(8eWKbq~P_}STu5nO)a8O}kP;q}y>26RNYDfihNR@I(jblh%Vn{<{NYi{s%Y8^Y zL{cU%L83rHSm4*jGO}JW9)Acxe~|gxV7bA~kT)5gF=njkKAO3Cl*s~)r3Ru^B~b=& zI6P3Qu~aH4UCJIR*Ny|xkr7eoPRev*n4fUuzIC`z7vD-2e{K|=GYQ~sFPa{h5r0N)e_2BdoERYn$^1!bWAJi&sE zR3c1tpy94D!uRPxlpG!mC~@|gplCoM6k$>bAQ?)whdk;JkZ=-hY_vB$34pf&!V5MI z38)RVo(Z+rX&e`U4j!cnDb3wXk|hcpTa_6{&>f$UB`k6e?>8AQt%Mg~jF^^1Tb?DF z_l{Hif|2@_s(L+pw^uH4W_)HWyWW6wZLFw~QohFi5BG%JIvG)$1mYR|=QdJy{B!mL z!Wl4tGAJXoy+U0mV4h~=&*^fAbQQYYC#2emM;8)CCUP3RJ{OfFH?s*@1`(i!;s8*A zh#JYW$!~&L3y2-`D_yxboc_b-EH3C@lP>frWM^O64afjk(hvGCP3a>!6 zV!z@>H0h&p?%Kld^^jcQTxpxeNeCa(3%M!Qtf@V}sbj_n%z9F6`aB%IynB`Gpwi$n z%seh*1h?(*0Mdy7nb3e`885XwL|Zb9-6?AYcs&SZoS;0jLcx#0+^e_g?W-v)d=)UE za=l2t3VJ?uV*J|N9E|B z35v_XPX?$Gi3PLh&|-=7Prd4F8|v(f9W#XLf(P^Lf|Rogl;T(mb)-}#{6)BiV}1RT zAtIn@6Xiz%)JHE3b+Mv?y#*M0D)|@<`3#N2kOgJIMF=@fSt3F#S5EzYI0O9HZFQWR$U_mL77k{t&f;7&U1H zHK2XTnhmb;Im{0<|IkWpy;|(Fxa8EXZpZo8{=WFlJj%6b#*GPNv%0h!uWkPs+k&R? zzA5oRC^c`&a^5ZRekoBZ4f)QK_yZ2s2%0SDg2o4;)K{zltQ({g46PISIX5nsfZl0* z(MtpGwIiT)1Ak~nvzA_o(8ju|xiN-{tB~zN#s#RrShXT5j3WPtT!~g&iAk)Z_bAO? zERDDU=0c-HRF+$=1{Fh`pjh~_N2GR{cflG^@bdeP?C_Zmzcj=`?Qz{r{55- zmwrQ+iBKMo8C!ormm#K~b^2%6SU-YKKR0NtNisA(W3|0YugRf5NQR+WjlS5Hp$?*x z@=daL17IanT6ja>k6dBO3Y#TC);LGsguh-yZ_s?AK4>WQM>DL-)u1_Yy$)Zay-<7x zYojU1pyhP^6Pd%&Fr4^dFv+wr5NZhFo6tvJIZ)3C?i#Ng?q6;C$vCzO>Wq(#ucVyd zgH_yE7^U6Ztg0Mr|CDgDe;0^4&So6Q_%>AkZG&plK8Eq6i{TV{vjgz0#{ua=@Y^Mm z(LdzPvl#v0ZKj!c5RKPOyDj|nFV&a9w1n*%d4Mnr0)1k&J0+J zTxw4GVJm#5Z|QgL#C8JIcksh%uIX!VHg_;mxWC%6oFMFCFZByCnqHpn;Cb4rUb&)2@Rv2OidNbM3P~uyS_qAHxPuu2&>YOACrWK-Ep)IO_pP z#R0xJ&;aE?HP!;J;D8kJkQ^h~Wb;5R#X<>&P5;B(M2b!AQj|+Qlle8Ag&&G{ppmVj zA(Cjbx8G9Llbt1)oi>S0K^%@9H9j3v9x|X)*RAr zE5B%K!_QTw)Lf%}XQXF`{j8+}IJV-VqqZdpw+%SOGeCObsNNQ5*VcsV*hkA7!+#m8 z?l_$iahSuMRNzo9n}ELplCN;UsmP2kgT1Q?#Ft&b_x0a)@(kbmA>W6Rv$BqJ z-5Kv9D?bFuK^4DqO#?49_#X^Q$5-trxW6s%(pNPYE@hBcNZ>YDX?V=7e^{t4h$Pov zSX`DO1^VsyuXzOi$P2Xp5$N>o>=p0m)9>hijVJ99AaCKP5H@T$zNP|SUpe29{jDJX z-bpvzPMIn|{k>z{_l7C%2Fx5T!20MiF5WrR-^souK)HoL^}Car#*HaJh)38p3AcM% zAMiPH&%N>;%scF`1CAJkL`v}Y3Ea0C?wXF>*4N)+AuzSBrV z{j?GdVoCDn7ByBzYzrmvLSys_PZj+cfR2j!1aR+*9O;ef@#GnM!peGzb$W^ef8WgO z>v?CO4-&I87ejLwOMP5-jP_m$^~#twbf6p;aHq)D{+?OF^Seis6zRpO(>tZMkAman zGP>U-t3Te#I|Jmiy)DL&GF5RdR+jqAF!&-A@=`^DNQ{M8e+1u9Gs!CIo2~Pz6Oz(w zB$l(|6O;ZrsQHQ_^oMB7muTe`;lvl=`4#9c|C>9b9c<7h{nil|{eRP(fG@0HX8sS& z2~Q|fyWOK!BoVBOP5N_vzPQC6h^_ z(;eUUVl$se=b_>g`&*7dBTcSle^v-&rP(4*EG(*F7 zDNjFvYw!h&yu@hp7|4)viL?;-?N7Zxrl-SN3&h^IrmQxTev8OX;>I7Gs;!Q|TNG-A z`WnMt?t8Y&<0qDHMM=mX-XrJwb*5Y9MCA=UZe#x&7h1iOS;!HMqQ1bVv0rS^|GVj> z&vmxJ=37&YyuMB6Z6_QMCRxn$XK(Bm`}c12_Rl0yS!$#Ik9N<*^&%@UcoQh#c>_B? z`Fcnf-x9F3>#`H#Z$@{2zA=!h+#@vfde-##&F}X4k;EV3Qad*g{cGCR&o|&QY0wMW zGKoj*o7!}k{afHv*lFz!hyqXtOOsNaaw-dM2}il92rzz zj^^V>e#$CUQz9NUwu^F_FOE_BD43R&)oTSx?@f0&R%C& z86kVImd}UBb+iPD?VNQmUuME|2*>R3_wc>Ixy)dX0utLWOrky8IKBSF&FC?Q0ow?% zI%C7=eOt8KILSXoU9EuD+ez*d=e!v)1ZZ|t_WESLMo&qS?7KNI$GiJN;fa*tq71{2 zge4XEizYW?Bf(}`rPPi4D4VEBjy3&EQ-PXxa^@X^zmZZy|*iL=2;i( zTXyg{O|+pTIZrXsu(7lkw(_N#e)p_@l(Xw6#m@dEG_A;&3&<{*V7=h9!XF-@I^5=VenK zdR$Kc;Z0%!iR)TH$YwB$Q0zfTDP{0UK!MED9=HJ`>Jr1o`0chvdFK7lck82@M);); zHQ*?i}S zF{Mv~^XVQbLP@^ZXAnM!nUD+#(ON9$IX;ZUdN;4PkrB z`(Yr~?O;;ok8ln1v@4OFaXuJn)1OblS~0D}jj1XnpIDg{n)atGO9T!|pE@K3TMqpP}SteKJ!0Mm6WttbmIz+H_28C2hCa$V^ZC&R(1A~^k`$_s+($wzB^F# z_}JNj3$mm`rStK`Y|?Z}l4*k)vB2~|1q*8DxO+Eh^<3RJQ-u9AunaYO%2>SRg9GjQ z-Jx(Vosuj5U{*nrEML*HqHWlG1_YrA*K|5K$=lyDW0CNP^WFyFF9wBGwLCogftN5% z3yG7&1I1bvtP(mbMUE0$D)Fv98;T8CFyv(|L35fF`>ipLY>`$r%1kXxjIw~@z*cNUWFfCP#D`bUbx)#vP_A8qu+%ga4|H6l*XW>M3{+Vx zm*ABbSP)b6MIc8(>@&F%D98V9BV8L}Sn>%@=@2@G)#bV{dXV}m43IzQr~H7mJg}-7 z`7o``&OW!o@?BZxXl~3DbTAjxUqJvjKkya)FmvG1*I8WhtgD`6v@e0+dKe|=@)6q< zRvCzPZ6zbRe^Mwve3-IF$8j2#bRm{+nRKR6)CQ znUckGvcmAvwYcpZn#E(UBlRZdyXu3;?FJZA~EQ!5`kE|LEQR-Gjb z4PLVMkwWgJ?ZlLuDq+^9jabpo!W^_UF#5DP1KB!vP-ynuKTR4Dp^q^b0aQc7rgeD+ zZ#%d+!GqMqv}8lV0nKlTgoKI2v|@GPmPEa z*Cna4p~V0PFbc-B1iMY*@TsuD))xB`lkH_l%4kJSmQrp+3lo;y0fcKE)R=vHmszbd?vGr?@HXz zPbL1PFQof(lowH2^VRrJ!J!TEC(6dL@dOEd3BtE?KPV>Cn$bM5-Yrj&GRfNa`8#oZ zUo+p(Wa2xvJOoiue;;A2l`8hP^MSK=k-~lsuqL}K_0SwuYEUe|zdn!R={WTs<4(Y^ zg0=72V0Ck89hJFypfuX_>&Llo&8z!{=R->#(}j!n+B&3mW&7>qWr#K-cZc1KQ`vv5J3=3BRl+Ez zP8`<1R#nZ2S5fT67xLE}$tT&%#*W|PVHAircfWD( z`Z4T-6zrxqu=Q`(cHq*h@SDGW|6ijeiEn;n%I^=O zV_nOh(|%i!!Y{ssLSXi2RNH+kqvzhU?%N(=zw4x}wdER&7v+t&BiNqzt5Ttqn(6p` zr+{Z<^?-AlAA{WfOD$-?IsTI(vD)|_hOp&L$=EQd-N_(8r=Mq_1HPv|-LVVRCL^Yzbk4V%T0!cs@FYex;!n zUqRoz!tG^1PGD=0>vA|%AOA$W2`>i^NgW0!wi1{Wv2oZwSBE3pC17p@Gub+VB~X+( zFXFT}BIgO#4k}Xl2&Dkd-@+xbJTWpIgp&EBT7w%^PaDZ;8D$h0m72!cu^g5C6j9F; z)zlh5Wa6UFMRlk`wM&6ec^o;h9NjMy>1q<)-Wu7t9NFC((-;Hdk{02LHf~%r?g2Ocxz+NmRgL#L?y{8wGC~)| zJFY%0{&hJ{cPG9UHy#bo03#w^#5Dma0t37Z^Y0V6-9`m(qkjBE)KEbn;*GnPNyxQM zK%~RL2g67I!;M4dO(HFe^n(QyFh+lebOa>?648UZ`2!v12Q+_2` z8INd;5>Xuw>C?xdt1FA?24~2N<&Kx)$(!QsowAGh%YQ5-=s6|SJB^o&=~NYIdj|21 z6mTvANFYTV7g4kxOSOYfbKp(Ww@Gs?Lyw?K@zPE4(anf|P7ORs3BgOHL_<_oNAiFE zsp>`4N(Q^OP3c#b;vbswsb`=_M7JG5>ukgB(Uo(c&8ip88n(%H(#+l)$qKyAB0$UT z2GeCMlx6?b&DwI#vQEz$Ys{KF@t`Nmna9iO$HQMv&snumUO&m%O4p!G{=5*%Cn8L5 z^QmD*@ng+8F3VXfOL;rV`jADtk{~CO!$Z26Col;{94*z(OSb33Rc@FnW5mf@&^^Br& zIg+|Je4Pq>6)9XU6`=GAu_|7rZX0>H7g?ZOL6k0}WT?34U4EySb0HQTdmr{uQrmdc95+)_5my- zB%O~}Z6Z`h1FMe#RkuFXXbIJ~K{XfcHCMJ6Xrj4|_-I(A)$T3Tu&>qcdI&dsRSR++Z5YXxg?C?#6GMvE^&iuj|>tne_m&1}a1e zdevO~yao<_JT7?&im#1KcGNPNjdFjen%f(dUK>>in$-B4H1wOae4BJKoAf%G4Az>y zy*3#WG@J4_o9j1Q`ZilfJT0ZGD1+DA)C8(c$zb z5XkZO_9QgIoO`|b;wu~wASe(Wn()dK^lc_IVhRu=b`nL-5#g>&VnUE1no^@Al42(| zQW%h-CH7Ie^pj@Qs=H9~vsqF>42Ze@L>C*7RjZ;WMB|yDI8DQ|-W9W$qt;HO7FVDW zt)wzp)WPa%5rlCfT!R`HhLWb&sF1r<{+a*^k!*a@(?V zI}C7F8eqE=aJ#dAZ+OFM>g1}k=Z>z#t7hbmoB!jqhhId&l-IzUbW1++W|B}a(NViB8KXb?R1n}o`nT6LT1=o60M z2B4S^tcp&5m`z^YT<%`TwUanA)|MVoAFXZjZ%f-k? z?V79SnaiKWoPL#t7U_6=n_G9V7{ij_OI@A3k%P%#c zCW)`1Iz5#-_JJCbYLU<%l)Wp|MiIF5+JV3rHLin7#sqE4CT+K&923rA;zD&@j}_NN z?Y_2^TqKDcLoMffRD)1Nk|C68WVEPSI6V86vY3^8!|cMCS=2uL#Cz0aXuW1Cy}n=i z#i4p#2Wu5rdIgIf9aQ>dq3bMtD2n=vP(TFwiM2-P_1;kZiENAyu%;1&77bLf(Uqji zJEsx2=_lm1F*LQwin)vU^#&3)5_qN&LN)iD6;S_<`X4*i73x55&keHi1J&j;mdUHd zrg^c2x2yJe2eYE!{PF0$uX?i z`RdU5tF+TYu>)qfGpVDm{HU{q3df?%Vv`;qnH4a*oeTx8Lz)G2S${a)SULJFBFBF{x(r8{~EhM!tIo>WYERH5Wlrh0w4=F@O|dxL!>>2XGgef*_;(rJ7XQfFQz zuzj@UhH6oQJ^h?l4E zvqLPavG9z7@M(jIz`AIf0Oh@KsG`UVtN@g)&Yk#s zDA7A*qa2x@@B|Qu;%lsAa`b*{Gyz`xhRn74&O;h)>^NM!dtB_t2iB(21I$+hD$%dA z9RM7yh_&$mLaK(*&2{)-u7x3nUWBZk(8cU zsY?JN1q_fPM;pL}D*^_l)9O#slzcK;z-1ZED{l^4nYW+*dG9>Lj8Cmt_P??<05Gpt z_5=IVZcmbRy7jxyWjP3px+Dl#jz{`}cCjTA1dU8Ak*2aE7KThD6oRX|D-nrBG@Phi znZ~F)-i^F~%eK$0>)KrQI;>zWV+p0Z#J@MHS{6`bErtoDjK`isuU&6`crhWYRI+{j z7SX7qY*{zzT#pMpn#vIlM4+o*84XfRHEpRtv^p9+dQGd?e=>oNn%?E}ZpSKmA)hr%mR$d7vyX!1 z@+b6mwJ1zwcVd>WHd+g41oQs4jOnsI!FthBdX3#UH~&BGjfgt4(L_3Z%P?Ixjm)f> zp&;lAH5#Q-LSTqblJ(?pw%%8}p%cLJ#$t`t*5>5Rufqag=MVQ3EmrTYwh6qc${ z<^Mm;`6zk)vErQPI#6|wnnBN)Xy|TcK|}UEO5kxr_Y4|flu0OBf^~V=kh#}_9Zz%@aFE(%WI;p7yV~nK436~C#S=YUj(5%p@;)ujAc57ysJH6~xx@@6 z)=Lmyct48wTu=?qVIJNqv7Zx1mi#5dMFwkCSOW;P`FQxWiujz;1tCOgZ?iKl@e++s zT0A6qjqhK68({IVuR_G5fQwKeYjmOw@?AtUDN##^Z{E*C31HpS9i<`npH;G9;~Nd@ zOc3qDVhk@b4QE-M2}4K;3Z_*Zq^pOF(s8egl6f7uLrH`eU*3(#xe1T*^US=YjiUk6 z!iegjkMM-4+TZSsh>V)F2OjT6XW?%+s(i(3v)LzgdXttH3yu;Z%*P6tSYRy#0<9>m3q4{hAn$TYw4(*)J7Kh+T{L!wCNxO}25v zjplIdD>H8a?Cp!)MuWni0a+CJ?L>WGh2T}6nd^1aaOaPaC&z)UA)k+>TP0EkkWX|D zghIXp>?zgNm~7=c1<=q-(n_W5vf!jR(2k>_Fi&~k%AVi=9 zJ!hUbXXL0-%{qoEL|==>0VA6EzlJPfxaM%7j{&Ue85po!_V!PBfO)tpbTTil%W}es zRoLy!sP=GBYgmkv7@=Via-b-`N2_Qkq^y}}^^SCK<=2K#a#*_EC*;4?RaM9q!{P;r zoV~P=nX7~#*C$=1IL6SxmJJOcu5~BFVR9rOJyn^dKsCg^(ya1)&;vG~KMeGxJrKV{ z3WDrgus!JKkc!^3mrp`8E2O*3I^FXV)^OlY1+-_<5s_)cvidQILUDhC7#m@e~8|)c5wqE=SLnwT*va z-#ZTkoqYa&?w^Ohci(q8`9FTPE`3%AKvy$@`>+VMs#(?g0vGJG&oVm&O}#{ex+uDp z-qw$tNmC{9^boieQ8zZ2@o zwV|BnCMHCm2Uv;(RUZ@?Vk2nNc+?xe3s$$=t{rJ*>)Cv6DbPvTx90;eJz^BP8u-W^ zCLH&4173DHvR zzUhBk{w81DW7c8s9G}TI?hGU#Cli)NC`haTqN z^@w|FsD~5}^E2;tnb}S=JNn|K9~p!gnL-=pPTyNzEhQynhK^XhF%E=WA0z@JG@XS5V%zR%VUi1bp*lQqDX6~X@&$Gtuf zd_2G})?Q~!h6BO(Vk3M>*CIh#DY*{-yA6^AN)*fGOGS%s(2{#x@#mTY0jx=Ukn)g?hug6-}@C7#QZR~rlY+mD7V{HUlWpT1` z*d8B_>J_u)6}3TW_>7N`LzLWAx?E1}__y)#s&l#4m+@T4(K!_venD{b)`67yO^?Bkt zlS>@cXF-bKx_CuMa>ccM<^{FM@ms|mM5PcfL?7BU3%Xvx57d>3$LtiHcWU1`>CM z92Ma*zi}G|=y#5OH`xmC8`IYf#B|I*5Q4-|9%5*^D$VGjUlxUeNLBI)5qtXcJKNy< z5;J8u7m>n({af za0SaUexg+YDoktUte|m~ZS-nka-k`axloO{b@Mr49i~5LRS&Ke5*ccnt!iA1ASwqn z7DEBBEBySn+{9nPRL=2?gF^Y|pvZl*Y84-5u{V4V6(KjikZA+{X39aMT=BD@zTIb7 z0SD&f^Jt;>`C1j8;52m!PEkn<4Z*Go>BS70D!7YCluJHPDJ09dDBNTH^b^}$#0o6% zQyT0Jr*biT2~nhmOs=5`ueped;z$T5{H0@-x-4 zGDNVpsB@?K?eSv{vtqWApboo(wM`WPfKi9W0E`m@&PAkp)H1bsBkRP#<=^~8YhVRm z;VlCyq=Gp$LOi6`<8=!1mwy(G`}Z#g2rgrs=|rg1{k5sXiK@e^0MZ8|9`1sovY?hW?WjOMRl_f$cNW;bPGLJ ziX8OPL-oiSbhD~fvn__hyx3y4K@pV&g|rb#GVm3EhL1V8L*53m^~`eC28E88h8VUc zO_>yH{p1;TaWTr@xogpZ%TZT<8W%^BpbU}#2CYo%ZCJ{sti1m^BU*Z+CYfOJoQbQ9 zBl~{n&B_^=pFoH7rhC=37cS4tNy1HdM4j)gmn_0fdqB-(>n>3lifY0wE6Raapb@5; z4A(>THZ~A{M5re|H`Gu?@6jSZh(K$Ipvssb|7u10>nie>D#hhz`SnexDQ$?18T>@4 z#9r@S~o z!+kfyy>~A2??`lB<^mg%x(i| zbLM_ZeG}C$q(thJ-B613M1}#xu=x;c0&hWz3&~y60@G~$CGgBHEwve#MG29W%hZ9_ zl%pG&i`sM}elJ{SH*jE2U};bAa8KxAPZ(xj1bbhUdS8rdUtDTmLTg{ra$m}GUpj1G zCS_l?cwer0|1O~fH}x+P|x zsVr}}Gj4dte4?Erx|1ck^Cnsa+MzHSE1Z_84%c2v61uCSm1pyy|5zKnW3os;Z+cXs zZy0R{C;AUhQ}SyopKiiXUB2*$G3{o|qCNOvp&d$9>tcRuM6Dz6hL?5lw?TeOilB!! z5Q@o{9lkuq@(5zgpKAK2m^NsHGV#TH)X&y6{5D|gllaYqW`YhOd2~(EkT5`)m2t;l z!dihvgqiUyf&{y5Rc`!z>bE;tY zD++oe_IbCZT?4Cq_qQ`wuGHBE!ZQKE+RZL1`6{U}%{ruTxJ z>~bKYd(W|ZmD%w`J#oML;si4O=2hr!ZHDZ`Vf%P9l(v+(k1(e7@_b&EtnTub;vXzk z;_Yzvo%%mA6Q?UTrv~QUoNM7%$lfRUG17?C50h|@TxewZ#1A{7x3HeGb*IRNe-Po> zkR&3cWLJ6iS6}?DNFuJlZqCmId)oXWD3my;22vLv;ru$a$NRdW)^w|;lE}%usBt-{ z0xmQD8V5Em&>`1GA9yHME~qWnfawIJLKkA#>xz5gE0X~N2~jM}L_XFVbV{7U@q*LC(Sj|Q{0E57{=lkyE14+@=C`i4*-fm%T9CQyvd-M(}m zpfMVeSB;}2Lls9GaNlK^;<5aM8!eole;2`ID06MrnI;UO{AjoISw&MQ+q(` z$epS9^B)TjiooGnOE6(Edb{W}d%Q6ZA22Nu z7oYH~&-E1Q^mGCzI3Ic1|BI6!+>u@PY$d?Kt`C=)kTCPYx7kAT;3oDY8T5)3c}wO| zWE|dC9rT0s@+WyxD3l-+j?&^7(#9O};_3p2!3sL{!d`A%VzEf#@k;90Ul5yk#eDbD zM0$$u$xy-c20cnd#F1(EJ-Ppz*Mk~1CmhD@d7OF;ljj*Wz6*=9w#10EstSD8Pkv@4 zcZ~~pHp28_Q5()Ta>+h+kzRWLO9J`;E#kwp z;Sr+{ z-;LhaeSIo&a)x1p1O-5Vp9!Agi1>pMaMqbHNt(**- z0s0;O$o$RcD~%ASeXk=EOg!K)xZA^xGps_Rddu0R_m&64wHBAC$*Rg0%)R2+*T`Rl ztv3e~&IfZ%h4zrFS8j) zL;Qp97x!Q9=b{lKZ?MOsp;r!8>s+8YW$AC94~NI?pXf?yYN0sH*17=~U!P)rqRkz_ z@!c;BL^B2~?0o7%OU+P2JR~)g1S#KLKomX8W~l7rX+`UHBz%MUQLN)K1u;A*Pt&o2 z^fx0UqK5_3BJgx&=t*FfVIH&3a#5KB7J(PI!gvY%6_`XL=9T<3vij6B=@Sx4m96 zM2kebv3y$#^Py7t$*z$C6PQU#I1+;GDxcmRKHET{(w0yk0qSiIhzN+O=?pFhh=<8Wyu@=95-O4bZT}$gJzN5;O7d}(%p`JWrb4|5; zMb%{x;y>X%Ir;Lg&+R6 zhA34xl>I9oXa|Pzj>hVxShKnr#4=*68#Z?lnE68rS(!S(F3$)U=Pvlg&d&e+4tIha z7WsMxj2Q!*lfxNmoCXRTx-O{ibpr8-%(5};!yAM1;{rN|BSuDCcVpUcsm3A(gmo_} zSFDZ7nnmn|54qM^#{~f!C(A@!z1}VDkE;#=1g(t0kA~cK;LCEa)fn)**LoSc60d8D za3t^E5B_en{X}*6myOilT|6ln!BAdDZVjCVe-OW24e`5n4u>&0`L#~nUixO-e*uSIJpiWPMMmwW{T@5SQHA36QUgBj zVajR*Ucpm7;O@JfKSqKt3yFen&{wLjQN;3Z(t@|TsJ>%s-`=t7%M{@$W$s58Y-Bi+ z?w958xB@qG^$KH!hsZcE6y`)2L85E97Qq`g+qbQNexK+W87lJ$c(VH_#1Fb)rZ-sF zsITIileJ-SttMtFGJOH1wc(5lZ~&txQ9QN~St$wfZ?2`E8`_fy=JRdLC>b#fdbCii z^&N!yn*mZ3v=B|q9o%bjxCvGYN#cBX_HMHHNcVi?d@cC5I~_c{?b$|xeder&;y z;5dJCI6VlP3Q;jtmGH{FbnN<3LF|IKfauST{pV77YPF;^lR^q%Is{ql;Ka~ER66#u zc(5W@eNvnO94!r|fq0=&6o5E_?mU|71f$*k~#DjM$M4r;RZ zuHJfr^ot-u`jEY#gZGrbg* zeWbd_X`{5@ds%MKi<$>E7A1#dxmtL60ukS0i3n$^e3RZ{&%#}?o&&vd7ry4_K`K@; zThpm((kGpte_v+Aw4hPLyHqjmQTDg8LN6ViQ8_K7H2c4;h)4#`;zZ-6RJzsWNV=mC zIDKhQjP$b+(#{Y>Tx#LOgkLpzk(+BvdF)MbK38>0?Dbgb_7*IeE0dlN4S7Ttsd9Fc z^W<7}(H@NEh71zpde{va2bES1?rR^7u{9e ze_&ti+O=z~IiF_??he}@(k{sB>sR%U*?l2Doh+ja)-(U5KjzyJ2LvYjjF}Kr@t^r2 z_ag-mHWBw^!UvpSM7@rY_o$XpsTnV9gRhp!&B+|4kQnKqwr6<|tKs~9_Km`goA!at z${aPA?b4A*(k10z9NEMxx8LPgdT6R^f3q1NA-hn5_5CT&9!l#M zv|xAf92Zb<(W-sJXA;R6*N$mOzmc%O?D#iDq~(%&cz7)3jW-cc;*#@fXZ3QDF&Ta3 zQh3OC!an~rL0EF130ZQ&)51L;SHh9+7HR=+JxeMUIUKd6zp5}$fL;ZFN`VPP(D+h_ zwH_YA6AeOMCa?Es9lT2!2TJImdbPIZHB~twR~!C&Sq2evD@GX_F@U94^^?J}m8Gv2 zdfWWV5c$nD0ZewL%d;zw0{0SnIpU5y-u3&j&28WSd)pd;^~){pdIIvl9PIi_|Cs+Z zdgff&HoW=_hyJQZt{>12dj&p*a`(AaIr^EcYpwaU4om{$t6aIUYtxzN`xtM-q7krq zP9zz;CgFk133Ob)6i1b-SCa)y4^gb2$IZ4PGX&@(ZkVN}RI6`uz7QR;m$prJ_}&-& z^*QCYZl8%DrX`eq=g{~IHQmt-s1)fsvB~A<|5kmU%Ryu%#`3xp^MPMi8hlW*v1oWS z_3-PR@$cB`>n6$JudXj2mSi-7dy5nQ(gURb${BPnK)bn6Df$Vf{FylnHA(VRLCn3% zPU}2oBJnCD=)NL1GVN8Ej;AUh-YYkHKb6XTStjv2sQ)E&XX4 z*>AE`gyEcKzi?~%;VF&e{T^r476Rh`fY$%tYL19%0aPme4;4~zr4v23y#rwWU=%Kg zjbQrqws;gOg;Hf}U6EW892UDBt{VAZ602GL#gh}YWE$m+9IajBXu9_4^JUo+{NDC0k;3e^r^;g7eM ze{N~px)*J*e|+v&)3SdO&+aMZj3%Fx~>gFys^u(@2J9o#{_my6h)?rT|DD#oR}`ABPJaL6IPUe@c-^pFwLL zEAIrWe+MV$wFVC z<4Dr-vMwpk#HTC&6AI?HsesJMqz6_c%2!m?9c6x3+?u$HWA}d}TOzxrb)gZ9pM|Te z9l(D@tsjdVwX-4;{yZfOQ+Hfgi`WqSY*}=6x=h(~7N}}j3Ov7%2iY?)HEmBF;g~Be z?h{9c9Xw3O(0}ZYdgST-oHu zNb|ZmC?;#e)eNk#zv(b6)Y7E_k=wH4J8%6Y>P5l*WNgb!jI$SPIV1<1sMVXHxIPHY z-sb%NQGNvFbk*jN_lve&qX^a9i|r3$yVp^B`xf5?a6H!Y9HNU@AgAH(Bkpe-gEoT3 zcDD7sa`xNqln=)??BUHlWevyOltc|#&VqiA;QlHH#(UB#c}=IxjtI-gqpiEY@Z(t= z3-EQhw5IDmgD)_)`>b_WHVtK#BvO2-hU+xW{{wPI3<`(>F?ae~K;GC{5+n+X@92;A zwhhGqtVJYO37Xi;8xc$wgI24RLcYket^bD%Z!Lp4oHcBUGFW=tq$0)=y^BN?LW$iD zpyQ{+Mg{vHNDxA>5wT;MjyJ1IcC#{sa|Wwn6vIkTUO7hSKdZTt4m0W)96P1#lRGwg z5VD8Ql6{{*#+@FKo{g{LvBQ+YkE$DLU!05yqcbBs){(K>WaDt)EF^l?5fCVeWewQa z$3Z+Dmau_h_x~NHu@hdb;~I(=laEG8RW>aDojr+Y?SOLfM6T?2y?DWec?_fV7_ZeF zQv%_klsriOTRVGl?Exi~_VcLzRTh^z z6ZHA?A<+`{3_2_e!FkF#LIf@|?g>+3j*M};5}w6DBF0-NeGnrJcT>icyE42XRnNn2pWg-+EiX}e_H&KWc_S}_;4ZQ*Hfvez05@SMh?2F6M2P1)z(&5QuG*WS>4FYtSgw}$b>T4umTZ> zqCs*sx>zT3r$}y57k()r8;Qgh!V`~%GG$FA4L*KNRZT3mZ*FIC%{FR*Dp;l3SPU^E zks37xT$Q@eDEb}c8WnvhtcGQ<-~I$eDM0nt)WO*?j?F4g6wvRFmxd|m2y4kgKAVbu+34u0Zd6z3UQtZ7JDhwV?m%G+NSiHIpV)s8+qs6p; zJr8ZMbw+A&>#dli7BvY7sO`|%F^%v(VAtz$bu{2Vh60NhchZG;`{)ZC{g|VTp=*-* zMVxAhNf}cBX^cXYQ`ez`bGzwPxC0n|bsna6dk#xa{Y+C%AuWAo$bZs@=pL_Qf*4J6 z78L#OYllsV(ZX~LXxj5np#=Hoxn(v+I5?;#l4j8k>9n86%tvlhGiDE2IHK3`b6ec|T_ z40X+qO0ZO?YM-{>qEi&pPLk-9pg%M22Y)2U!1Gat+PMCp3k*qj?>dYt7Utqm>pIhN zsEND_Z<4VxWNFy(qAHPYDreZUZT_Oa(tzS#H|}f~KfnjGdEvTb(Gw>aJkK<`YHhR&BKB9) zh3~P6#3SOaVAQQwVlEKNr+r-QZGZb?hTf$6?j|hlMA_&uky9AFRjr(QIBxc@>-fX4 z6Kr}t@Ao!3{qdaj=VO~CH!IFF#u==xF;H8U;;>xhFWZ;*I;fFv-GC_Gs3 zDUb{fgAtQEtkww%EqII-ekjl6EZ&SA4r^wXo3jN?7YL_M8$|UKV&dUwenM)YgJcCK zi!u~yFv6<@7iP*EW*Cm(<`K4?687_i)B!HkztzT7=eIj}1lk&iX6q3ikRI;D8ybxp z{wWvoI5F`$357lhb54)&X^qgKBy_<V5Wd!sFr#$X&5x>SuaEyrCqF97V-r!%}4MHG}0xtsFqIn|2~)7g_; zJ|b1WEY~mIAGeP>FR?vS8dL&uuY&r&^ zGOV=G^!vPw>IgvbPDUPGrif-{X+~znYGyVaLalXtq$g&&Zk7pKcH47CK3`_rZWgdC zvoZpqMJ_uHJ?jS_VAMKmqAY8AHERNFocYnqcJjMBe!Oi-Nda;8FIg9EFfGh3I zD&ouSk<00O&Rn(57GTRlF3Qe|$l9^~GaK>eP&a2eBbOBTy!vYO(u>t)(4v-X>T?a%q`Rv~SH3xy;4}lb}IOk+#!I5aG znZRVPKi~&o6joV~ms*Gye3*QB27PYnTG_8%l-C(lvlmp;7u5YvAxS1~VPqMMQ(nWF ztHn)OgPp+}_w5ZS>0iY$2E z;F01kR#DG*UJrzCUI!B{0!YXwy3_B2ROe$T=K*ssY6FH z#fl}sHYGy<0vZx#TZ^w-6Qaydf=Dbu@M+^Xnd5DgbFF#fI7zPw#oq1O3GG^C7`f~1 ziQ|A|0rJ$>wsdbmmVSqXY6-4br=m%FcT_uw0l(!uBR`6y!@ILSt8H8${!E79%&BW- zoOi9G%X7BN7HrxHlK_{u(}lAud6dF9Y| z@A-J``9j$H|M#R5g3tv)mg*TX=ofzL7bP4J7aWi@7?AcEkj);D?;QBHF`)D| zph7sPCOD{JFsS7-sFOXY*EwjgG5Gy$(3o(@RB*`LV93H}$SQltrgO+{W61t($dPc^ zd7?)ML@I~YOk##fs>(s0kEyLTOyNB2BB)X1oxnqesRDuP3f^U|zx!Ol;`W#n%xN|u*1{qVpCj64 z8;1&IK5!aets9H(7_Z+L$EqiR*&`uiCkq#!03?!;Cr*%KfQQi>fj-oOD)n%SiXr5l3 zP1qMlP@P+}pHrzJ3`=c6-Hcl{hD*L`R@H1l^NveSagGW(LBp5Zn1XwcjL%byuRNQ? zc$3#BX%Rcr%S+*Q6p7GmwTRkZMD zrEQ2F{J3 zM^4!&&N-{D4gG@+4){$oUz`YYne+zf^!KEB@TE+!`KFU1Z(Wi6tcF7A0%=*J!ttg8 zuMpsHa!b_Naxf3>8ITU>+M-$6s=~C45La4WP<|*W3ygSWbfV>nq%f0@~iZylUV-S!yLr+FUgVF_g_s z04<6JJ&Gmz@*WhMHjI;&LWrhW2#WNerqGp^NNzfE-#!l6KIBaDtr{ZK9g89My>Lw!AAT~LU=?j^oS>|xmtIWXyd2Yojn=Sa6&Pk&0!f_YL> z%xLe2(LspOQL#~*Adwe}F$B!XmI3ysC;gZKbkNSfuX$p0zW9A9)yS~T$WhgtLu-V7 z$P|6aT)^F!ojO3I**r&hp*P@^2Kx^#2rfP5OgPn?d+3yz+dRX<;y%V3qR#TKo^={F zUXzklORR6xt##*=l?R!k3pT-h71FaPN_6aM53%)Im{l^i4X?fP4L8%>lI`h{-8qc? zRp=}Rugh(T-G<*pO{nAyw*4M)5T4V|V+$KrxlVH%Kp`po=kc|JbvRs#_*%(f)81h_ z*I}MpF(}M=F2F@|*h#0wQ4hzZ_I(%E?V88ZmCw>m@ShXPv@5_rrSS2PfZVMJDrq{m z0y+WleFH->?Har1T5j1zcld@K4C`bF>p^Mn6_(}|^^0N25W5J+J-8*lG|WR5)=Q9N zO#kaI=UU{u+zQ7J)KpSH^QVjfu+B~5DJJ3x{O4Kz>wdN>Cg;xUvedsB$G?rofBn}9 zYk>a%j^C2y<58I3G)-1r7*ow1@lh`-wGkkb^;7DAP(%9AZ;bdHJIV!mTsVGw9k%Wx z{&&ywj}IkM*(yk0H&`7mK{hERm2O6rS3F z>?del$p=p1d!6Y`yW<|^*e;z1BL@5HaZJ=iSlkXgr4_(LR;lM~mEo~QJu9@p&zQn8~wRQ72bR-{b|ABB2s6U8a6uG9*|6 zrQp!zu;$Go{Cv`YD)OGbJ1z1Bno^|?62s1}wky2?jzS)toEqm;%e+ns=PuHW;Bg~J zuJ8G*gQce>aH+wBxemMXYAR8eFfc}t>e4mwOU zHr+iUut@%@P_hRlaGOP`uUkJ#)1YBBMvno-GS1ZT#y-I|{&qZ(h@uJ{@CUlUC5IG5 zSb#Hd{sXP|dpOC?a4YS~D^g{+qRZ1o<vYR^4#Ed!APD z(4}4qkiqKNe1g{ZddbUTRf?yutm*^5`n4o`95bzK1!au3P%5F{SrFGGCk)~m znBLT31Sg+kkiGDmxMUf3vJK(>=mr(XZRZI*rzLCKKOd%Bx=$P#IevFO&htQZrJwns zlBueQ>GQWM)DbuYU+?Mf27gEkUJJvQ>e`O83>(y*PZTISbqOf|9YRP^4IIayy;<(! z)U>4zk09y-rI@ zyS>h9hK0Q^TaLTE|MtLsvNMKhdVKDtWkh@*mMwdH|80kf_&pz&_V~U29TxF_|99Nu z4+g^;e}U!|g}|Qq4J&C3fz>Js!#xv#8f*+j#VdxOH4}(4U<||6Du&`d0}djAGJ%ug z6-Q5<38s-WLC|a!$8MepVF@-t`oSxKzcdrdGhl+^)+#~#I1?rUWeN!4l_bZW4VRHL zMNes!q~@Mw^>Z#jKsBM(5MmTUkKBXHhs#;bM<%L@&!8Yo8${BJ*84*z&#yNa?V7!7 z?oB{}N23$X0Aw-^{2i7)Q;Z}w5D@9ixX=G(c9>q80hfUdH!e^tbnNR~;E~k;IYAq( z=4>JH_O&GG92vD&r+H#*G^v2qO`N9(JDI+@3Y|(uj#u(7s(#ynyDUnKkvwK z=6*7>xYV~(M`gM>u{ej3KxKF~3ML#{U}PmEs&NE`tLZ$vWNsjm4ww(1uu=RCu|A0Z zU`3K@L}i4g;OraSD{RKc?|6x~1Cm}1EFLy1BzjK=%D(5ORt-H|kgQ{v%LO}yc{R!}x|~J`GbtbpGLIL4uyt&qWeH zieF@;r_Xv_E=)L1A}nO)AhD$A7nNbe0UVWy%lYiVw%)~mz|txZQ(1mRRpif*f}Q9K zVaep!;TMGxxVw?Tl92V!6+_Z}WU$3&b9@fIuo9~wQMq_#3LEhu?5+8XW^2V{{iH)8 zK$ErkJqO%`7g*c6z_C8Y1*YmuB#CsgsAX1jLU_3$kzm!0H)}|>hHE`H^uAcpFP!{( zppY?x!;~qM*rq9ag~L`Xz*2}kMRR&$ zRB|+sa-ou>$)^kb&I3V5bQT=U3 zvgbR(`aL0%eSMl_h_{$Wt52F4D%45lHH;FRkL7J}i;kTVq4mL*si3S%ZMrqWfWRc; z|Flo&`6NSBdusux7)9&0;gCTIK$)|$p8P(goUlNFWs%&Uq(S5cj?Ro%vgcwmT0G+V z+FxVZcpFoCFBkax6f@=8YCK^}CMKw>N8g|ocNxWyPWT?xEBk9c=_vvIo>*MbPOCDa z6F>~+UX#?Jm4D`JsQHFxlmCl8nd1-IcumDbaNU>e{7By59;|{Z7zQ)+q4Y@pF=K$i ziMK!2=`bNWxfAWVnkF=}^r*0NiA~EuG7=u5VtjGZO`=30HcbL>&!8YIyC8}9jn**o#I_bVmY2S+cKJngDzFH~|KMV>HhaK1=7IlNE4;x!YZ zU4GhpFUox{DijES2|}X;p>u*TBte)OAS`nbwkrrH7=)V)!YcydH-ZQTK!gh*q5}}| zJ%|LVj})_yjIxiMvyVcuk5Z$L%Dj)-wU6fW(wN+bQ^=rk(@o-9H(n+_m7ZEh+e;UX z%VO8N)h3P?EWAV4?`$f5cb)@g@ky8lX0asVJt|1xnwM~N;`2%p@|hDYJ12AM6>@tu zlWq|D1299z2}SP_#4stsK@_lA%zKW}Y<3`Y6Ij3S;IV=n83UFx_7vJe$xn^C{@3z- zhCVeUsc^hO2D(A$Z^bddB89OcMbl7$3J@X&{l+V-_zWeWgX0ODvS+!+dtsvKd;?>tKm7eMyukuIpqPZBcuB#iZ;Y zR+(bofa2=LBshtb(L#svxm7V`XAFO$G8uuM79ILPqq2G+bC*%c+ZpMklN|>nzc*1A zdd)a9){8sA$QBWDCD}G@8lj(*etEzc_B3^mG<|Yi?2uly)?T%-##G}-pUo&1WCo+0 zSC!kQyt!8u+nM=Xsr)qsdV^f$opT1usXAJ>rm-VMHhLOIFt~M35TOelaWWHbFaln& zDC=4hTdd}G1+M0|q^^~0^87fIWQ~U?_LRCR`sFYfQK^r27B8h5AM5jaopAIhRzt3wM5s}NrJ7KF1XO3tOGEv80gSW6w!Sttng@rDJ#p!P#9oWW3y+D)wt z2xR^l3r5Aj(8jAP4Q#=f$Nses$Fm{C?N-ZEobm9xosVm}BYv*FSDoh}7*-KZ_@UF` zb>2|`-e#YT1QJU^F}#(Y{lSZ!tso2Cbpa|sgDGLbKTku5mA$5Q;c#qL+ILDO1xYz% zJ_K%26>B2GR#G4Z(W@4gp`YE;1M$~+H1jw-vj;y{hYDIzy}o8B!)v9XX8CuwQkHWX zlb^|^gNx>x8Z)YJMs7`*zKsL4B8HI2Y+2D_%^`v)hZGJc zUswSK?GpawSXJ$K!4%^QEf3^n?JRBQK@Jxxh366Nn1f z7;y6pt5E_w>No9_h{k;v9p;#oh{K6Us(K}FiO>ffS0HD64rhd+oG6)YD7$VioYufV zldBDqXhx(`K|uqnR_?9ZTgB?|M8um)Xm$!xu24$Bbt&6dJsh{#{P*#K!Byy4U1x7# z@q0*#W@zc5c!G+8WfFmEc(ZAG^YMaa2w`0Eyrwe;Pah|_VK|JfES&jMnAHli4g5Mg zFCGfRdV^*}OKnLLR!cKei%U{$*QLJIJY$1lS+AzPs1U%^dp(bcC{zKC|2^8H|C>f$ z%lo%)Y+pC2)qEz8^reQIUx+PdK?6=&x?5;EEj`TlU(`nO>#m@UHQ6*ld6cBl%U<7nE{ zQ*%ThbGQp`dAGPck$wdDfpQjaCxmvVMrtQdXQ%Jl=*tll(hzRQim|9- zIEvOzuzXy$S!nT7p?W}cb9(exeAI+-sKm|^X?sl^05j@Mve(LF5CDgpx=V4@h94Uh z#*1DvvkSuAtD)b^iHcc~-6N_qq5j@ZxMjj~PGfh`eTWdN{Tx_KW07b+RlmUp^ zQd-vmGAHp*zz$w_a3*#2ffV&2 zJSagu)|@2cKwg>=06K^p5l|S-Fg_7zsby2jNctJTym6KYy$|E|#nf*yKhy+H{Wa_d z42C6hs2O{-(Uw3C-cb*Sg>oBwh{}$ z)X5-bbG!`Go77d?8pGWQinaC|`UJK0a3{PIP_N}A;;cEHMa}gwSnsPq}xfvXDCc(DbhAO7@xA_({jJFrt2wm z3A_irZfJoJ`4gxG(g^|+f-=vna;IPpRZDF75_C`q^GWdecz1IwK`V*|ZC_LYUnZLz zem%EsV>MwDibYF)W><4xH*--Bifs{DmJaQCgT2V#&WwR2;g+Lw4(y!v)9kq$nYn~) zkl1KzZoWBw+}u!B&E*ouQS<=XnHp1J5y@TK^pP5A2NhH&xv z#MS*4+_7ZuX>JdSi^HqF18}M5xqANPN^8MF`<=PqNJ;twh39E1s()1h0=6GY`x@Hv z8s^tEY}hqi+BJOXHA2fZ;_x-n@-_1DHOjwhRM;B;&J7yP4LZ*ahRhA7_6?Th4fd}a zoUj|*;XL4DKg3vYY_EiMzSCES1R`x6nVTDCMn(97knX%1P($p**Xs>k=M8J;{oR`@ z_%KHmIEkWMS{g;px0~q4zYjMdO<5Ly?fRKZv7zE{!5lb4L%UGIMg2@9Bw=DFp*#K3 z_x2I9{amnx!UN97tuEZdF+$3Bj{SFhZ!SC}NK)n$JOy_U@)QrIk`fM>lK!r139eF~ z?VPfEu_A0GN>#Z^mv<0_5ITYQnq)lLxXmlh)A~FZfe12ey1+T9Xw#~+vr%9P%>IlS9n;JaY z;{2UZceiaBwD*Vm3H!_3Ao*Tr$l?G&v^!h&1lni^PU0EXEW6dhYM%f6bD9!OKO7No8o0xra z{zRF#NqcJKNvWBK$eG zhB_zAGq;8C4;VI-^95&jq|~PLQwtovyLgG=T#NO2 zansDHVe$5jas6Yim=rwfCxY~op(%3YM$-H>#NB&f5x;Q2JIm*FeD`%?!n-vlrvt~Q zXW1J^b*#YLyL5msxcYfX*Qdnp4SpzdG!7Wy>@yB}%U$pp@5!8Uke>;g5sVxgUXib# z$acFweNhNrd{^<1rK^>E=d2!UMe?05^##-8D^wi#Y#PyRX|rrA%kQ9$Zw*x9}51l=l{xXEzyQf6(Yl; zM+m>QZWsSj%UE}dRG0}H!Ev6p@=t&b7rE+Yt5^=fDE0rJYR)y;KsY)$gV|h z%^rowMhEkAO1gc|ifqFLoGp?k;)5u^p6>8_$F*NeqF*fcU(GfA+2MGiUL;?^?t||} zZ`k5R&^MXsYCYdB{Z|dS^B?OVSWWVMimP&_dZ8~I?Vr#K&)3o?b;x7dQ&P&%4 z)n(O9gTHqPv!yIOSA_0Xmu^YwEmxa|pPAOc1hPq=d|I8`&-M`Jv7llB$$Sk>VWy`% z@LM9PKnGhRoF7*}F|qem3^j@GBbCQu;5*+5X7Ix%kBJHvH*h8B&U(Zo?9KOS%M4Fm zc2C5=SAxVFEd@PFa1fJ1){SxMfIRv`jB{VaY*#uqmgZ*VPc-LRxLJa9clbe^{8qYI z5+xCySu&TB?hiTb7ptUX@V9!nC7x~CeR$>}AYByW#z+AY&ly|8EXlCbDInuBW?I5# z*IpK#F|lENAn+siGk^NC8;{1Q7`JU1?#wc=B<+&r2I^iT^^`sYLcw z#>t=PDY~=5EuuN43@{u$uo8@Ec3xFKMowLZ+@(kD+qmb&;ERm6!XVM(r_N9nxMfo) z?s6MhDL%$dP*v3`-NBHu@L_gYxgwlZ(YUFGXkXP7+i}_WgcmX{I3tZ|*HE852Sd|v z`s=vk=ID$`@qG*t?Gyf-_1BCRo9?;?6|3?b^g>@r(T^@9XgL6ns&~`*xy-B?sC2qj z;J;tdyAWwLKt~z}*R>KV@X<2d$B_FI&e2Cvr1`K{(Ze>}j@Ql1*S7FyF_wx8x4bz| z^nFM)O!6jKaZbzCbT*DFazH&y#;e7+j%mYUG%g`JF>!?%6;|G_d>emroiya30dPRg zzQoW}zN{%}oUXx*r}^9@lWw|CXa6I?q@%>xK0|s_u~)>7W#96mS#RAQ{PMBC^Q7p< zvp3we##7}FI~8w>;pf+Sh!|6?bdU{1Xj2%6f3*woyET8){u6 zDP2ni&p@}4CE{~H`c@Cd-A)ovRxY0S+2I+dpESooA$YUY(ha!vqE$8$niRNw8#smA~%`N>dyTg5^p6T&qb$-`<}C7B=+ zqQvhD&?>?Qnl(PBO?h$rD~@n7t*S!13GmiMg}E|~0i0VvG>$n?NO19$;7=b4jy>LC ze)j#?ky$ggCt3uJ6-c$P;6lRF5fYj55>D?6GrA8Tu^4)y`(&FrImf81(h=MDhp)x7 zkbEOxFy@>9P@{?77xb7dZ@%YrAU$UOiUzGn#h&tS{!j_X!DF#` z&v0LM*FscepnfDURB#&y{bC4GQ#t3L4USgfqR|0( zq09*D2&%9hqh75ExLt0o=P;&K?X_6CjCO8dD6dhmr&%?$TA}~WpCr@UFMYWmOtI6y zasz++OHoh?5lbyWz4Dsmo>xM9h8u5)zZoe$j;*myn!K6|hVhy6HyF;URK&yVSXgHu3qj}YA~U8xV3%mh-K@OCQ)3o_V| z3myXP3G09kVgwbho;}j%fRe|2RK}%VzhJ|RUSD_Q>r{OLVxaj2^T2pBM8n@LibL!K zz7b?led^-GkI>e(Q3DTWxq;|Xexv6J&+6gKlxPI%{%88YA*YOTJIl}=zRB<{mn@w3 z&*Z<9a7(1jw`|YIA?}IMAQxn_A5AIM*~9bTFI?i1pPGSmd^ch_H}cJ1EF}HG#oD9b zN)m0`U3#eHiX%4_A0nHz7`+vL;fE@r^mD_OcIle$%@Uc0XO`>jD|5nN_a>2;%TTMV zr48ywk?1O0Erp_Z3W>-{bDI^Spkg2HJqiOZi9ZsRH}qE)HbQ%w!yjm!TZbh2AqZpuMUg;@S19w?6$i1nh zOA+R{UOTnf-bs}HATLOfxe=(o^K1Xv*C%Lq{ps0-qD*42P`WjLlr3}~q3XTdQ~l5$ zZg{0BBDXnTec#zZbm90{VD*?eyZ6=g+HU!E(^K%#G zdZX4%V1`}`lw=?dK#<8JH_AS~c%tul8n^Vj%Vr5V7Grs-PW!koGx9y>V?kI^|9(^X zjCI8I2e7;UahFfh)#(-Iwb-!rAW7DJ5vS~Z2rj*w+7>!h6!G2B_kX&h``A_td|P7y zKeqV`{~ZLso*|OF4*i{YX`6ogln%Yzmik?HZ9V@ml0%ZtIQe=8>f?rjWOkHzU=5D( zfZ&-K?tzQS0!EKJ2JNfB>Rg6=Rg!{WHii`55trP7ik%kM$zwD&X0$S9b0p0(9E2q| zW}qd7(a)H)x^500?owTtkbK|R7tJG;m$t+uCtow^-!a+b zBqw>vkC8MbMIpDqpz$M@TnT4Tf}x`( zUuW8*UfZKT+M{%a0bQo!jYf5`vyx#(Uxb%D^9_uRme34M&J&N=dLc4Xf)&Lrr;jh=T)K* z%H0>5Qp>*C6rRFgXQSX1HWN)Xs|6g;>=p8p7a`IW@q83Yl&lMC6-utbNr?|+7ekr9 z2TJCIGU7rqw@%P$h|@@7yQu~ryFp;V1n~gj^LE5ZCeR?<@+6~+q>>Nh_zUIhixm2b zayUs8*LD=~C6um;DDEk7^~_t~4{rg7@cUjY-C@eoP%7?+YREt2 zEe^HFspKapb@mQ;P7ZY3_5Em(O1yA81{)hz6d|?jU|uFKK4dX_xTR{Q=CB4&$0%S)|!|iFflUlgE}a&v_#O#d202y zGki!%X~^R-Z$?P~H!v7xFhrU*A{HjB{@B;viZGYfuLRf^Z56IG5?+2H*?ZzPaT4VW zj43!#K01lymXpdmwxfrM%2kUehA}WEI7zsYO4O2zS1OGLlqDjZN^;W0Gnakmv=;sH zfA{5RKUG%YU%$YCzkvT!S>=I(;LuX(Q)=`7Q&~|P(AE_UMxoM~Zj8(p48@X45WmsZ zo69Crt7A)+)&G!8Wj0eXr){v1NauFho6vQknf@ahgg_+U2%IgHP5QVi!=#umA+{FB zdUiciDAN+qnjCAYSgtYdj|^#dtL*)x2E=MIr2f=tvDhEWQD~{&%qv#e)CB&j0d@L; zACUzCth;?dagpd!*A(_8;TvcyYudtM|tX znYw9@(fo~P4MhTfV1yoKIvlnmvCOE?r~h5n35$s**xJ9VpINxL%e zyg$-18wJ18Wc$<^o7+rdIcy1fJvgtX;e6!&db_!sE^Q&v_GA0^x_C(P`x=@mQ#AVx zU0Gn{KXC%GXU{P>2?^f)Xq!HR*3 zlO2veEiyrSCqqPzep*T!gzaTj5XJpsRm2S~PnRD`UQSyWE6#tAmZXJGUs7c6Wuu;3 z4)!_)W@f%Q#shv*TDVIgVL&UL96!i}pTz0=&b>1y`*BCtay~cIk zuSL~#Kww<_1-&eR96;b9tm|&bf3~%%QGB-wLJvNLBO+ly_XD2C|Ab&=))RHZq*0Y9 zqtu0VSz|>0g!Q7I7a8X}APZ~>NO^`X(? z@Wh?5T-;$JZFOzmCJJ4LO{ZmlpGnP?ZJn5=CF#N{cP+aPMeYp)ZzioxvotVK%a+N_ zd-Lk{$RtK+21p$UDqw6(=edJhmiwVaHkH1I$n$BoidRtbjIyNee(K5;A@*cTnvQWg zNsIeXKF$7<>vdQO4&vL79lmNilhU>CIIsN``*JJ^Vn+>50rcq5T*n_Hg&9liQ;+}8NF-vxf>KD5z<)y<#7D4Ye}N@yjaN6{W$EhE&TKsBV;TPEIUjf5d@(f z7j4vLByxwQWy@~NN9BP^JY=7ZOyb|w4A_`b&NTTK~URmsZ z9$>~RK~X-V$R|0B7_l-?P3RONp1g-r0hcWADVE7g=Vu5EhNsdxk?af&_vTCz zbeKvS5I#u)hoT3XK%EUWS@|0()^*Zv0e~dDp||lTzk+YKP#k2_(MR$nqe(U>H5ph8 zM{M3$=nmg8$W{qycw9`CEKD(6)}mv+@dy0zAK66%o(!yfD#FE@9{I z!MO)@G{O&~%Dx{Qd5}~RV#}-O!5_!D&l{E^B=j@3atmZIP2o~lnX{oU7cn?~eK}~)>fe0$7sR>7$|T?8 zR1*-;ira(BK+feVK~fq4aL2%%H*+1$K+Qa1H=tq8na;N4sJi?~ z#u-0$)!d@0z$hJPyB@I9+}h5C>MVt5u*R)TI=xvX7R<4^f*;b>KY8iyd9Hu>9jbGR zs@fe|Ve7!&y;vGz>SqdDgk0|)=F?9p2Krs(zaE-+4Hz+26CIOJ-_tbyH%ip##N83h{eBH@f|j?hK)Y9KdB}ay+-(jko0(^zUVNJb0z!H@#Fuowq5p zZ90gEnEfio+1ot2T8h3Yx(2cvhyOUrcIE@7-K!84c|IFOXoT|B*s=4m#UDf;D zYpq8b8wrxx#zYTH_4>EZ{5gJ7pVL{mQ7nyvsBEe(cR8&p?<2d$JdD|n5haK2*;c^Z zZ`y?un1{?`&mYz?-?LQ=-9By;{DyrnU9&SCRT4BSbuod040xEaFR!p1!=vj zj9xr3NEG=|e$QW{cYbVkvc6Kn$Zu^Ie_{-8zsm3!Ch9aJH;%fGKkUI+8iSK4!U~Q9 zt0ihR&wL^A|3|fbm`FYP@egkCMpj$`YFEh87oP#qP59Ebj+?AM0bMq~bpw35(RnT` zR{m`!>iK8^wk}-YyLa{}A9@(n@ngC+exoy?j8dt)2E@wo?ZHISelW5m$#-xQ!;=t( z*ZxiPf4FC2j?9=89=Hx}HwAJfLZ@>LZgQ#A`B{zzC!=3)I1zu9$`VD*lty@zothqt z**`HAa(bxG2b{=?K1tQ}-e$OnA5LD2EDShPSE1Vunpjka|VhMyB;0%pANtk$R^6wfggmgxm%Ev*K_0 ztG^tGL9!WR-G?|<2HnBES0%w>$8?f@A-cVn%2NTQxO0yqeL)uukz%f&sA!h=UN5_T zi9uE(*Mq)_fm#=Zl{}q$-=j6)oX>>I+674l4kJFv|; zQXhnT%?7uFiKL4fH;6H3%@|4@N--Y9qZB6KOD6PyEiw)eGh~)@V3KAA$fDr$Dp4v5 z0hHT8n@eFDLM&QBpBDe(=^2IreZuyNL89Z~IH@+~Lg7{pAloRAJvdwq8uq!J_zQ7_ z712+nc5#s>Z z{~5(}6EzKpw&#f+w2bZ}z{_rrMqG%tK#nO<0+bm>C;G&2Cdb5%$0R&Z7c&QyGRvnq z#L#&g8mC3IIeaUCqSTJZ)p#o;l#XBT0=dHo_}9~A|a0SeIqqNvOgEU6pxX{+*S3(QWVTImwr=|)Rwhyxg=(Wz#S$QEn3 z!0a$X2#N6ovpq|?uyQ(IC|&{=&oB*2QVHPg+l9IwGc*)Xq`;}29JmMq_&xG`UCX4q z$`ps{hWP=)v)LmZqnc4-{aMfh{8)LAvOBiUY3fWvyErK{{@maJOk?0U!S#)*ImncVo}?6-5(G<6Q5bWUbR0Q`dF^tON& zD$Ynz49G~0J34#S2e_!5&+e5U3sVAQT&Xxu9bXNeSiiK05G zC&gMSLt1|8ULxpUCS0kKx>zEC_FbLzyC!MAwlNM0KDK?5R?R!~4FLL<1;$Ce9-Q=95+fo895V?{m}KT* z!b^>*$aoX4fZ!YvaQguyG6x*H4o)<#e7Yz1j;Z`w`PQHV=RH*xvR0KCS0%^bn9=4R zY64!lir&Jwa|cz)M&Jh0%4T5YNY0mbAmlZzGHbGOejPFZtSLo<7|t73BWwts}`-)bF z##Vm}tZ#FyKYZdr?W%n_sl_tMFk`5X5^QMm$AWPcO^X2bxf-Wg^)S)vu~kfQ{x#ei zH#`DOIi~7KVN;FdqV-%VmKS!WX9t+Uw<_5&fWZOpY$IHTb~8CL3F(aw@2AWZKAS0T zP@*mrtBE$(=wWEZrU@=IEu@=Bkrf(>nwgN{25UDWO*UIiRjQb@IvuxQTDE-t*W7W? zs&|LI@xxS3o;=e3e}u716j~rn`L;$)eZ{~x^wGDLrPPP19n^fT0*(P>WHw*_L4wfRLt{zvKDQTkwZ~8CO-pq~hP8paD6*zH zb2mC7$8SZiQg_c()Z7%k29q2Ft+!(tC!O*2i}r|uYnl8TLaP5DX2WM`0RgZypeDfr_G46qVuvG{sZR!!-&Z{;w~GF)|qo$dDSr8ep*e zzxCzB#ym~OyaUF3^TzzU#{xFTf}Y3zt7wajgG|RG0>-2A#$#aJ<8hng3D4t6WcB7`?ekaS!i`+0Zd~rBBsYW_ew#g?rb>EEEy?3YOL7ILfBkpSXs;DxQFov+Dg@u}VL zb|CXhY~p`E=T$1@d*89dVZ)~m&sX`frX;>m@v<)M;UhyM2cvs~e(M<}m-+}Xg*|+-lesx*n zpY4hNkd-`vCp-_7xIF(U%>6rcSK{h?6A3AA0;0IkpHT#6D`negy(BR!!~jQSE|WJvtlz96|k9_fX00@B-h>xVF$TNF6!(us~4b z?p9mKOB>LlW1)sGpr_5VL|_nuSRCrF18cBh%hihd}CW&M1JaCO9$t`oX7c%C=x zY^!fVpx1?{j~kLDo__2XuK(35-&4L=%@oHMQLk*aHVLb+1k0d|Q!n7|7&2?T;bjaN zSyl)+EetoRA32rZIgOVGAjS;V{ZTDjG47;18;CMPXEQrn`8bG$Kfe{WSYWc8@DtAM z-1F-oLP+bxpL4X+rcFJw@KaXw{134v!0>6Z+B+qMuO zZ9+^A_1ea&ox`I4ccK+AdQlNN0hv?n-0(e@9s%4aJKx1Jn8~Ze9sg#^m=DLMrxAZ}01t z`+%@4?wir@A_eISgrGNG3NR6!Fu$VnS7WVI2nn|Ote+T9r+5YJ!N*smlP(RWml8Cq?9NH=1=pHGu!n1M+b)gR+YJlV3?1Db1dJ zuMdc>$!Du?k3%5_Z9x=Yz0WsF+`IB#O{^fEl&}$Y+orBRbWtS!o%7fqLK3Y0kZHU= z$l@as?fqAkD~s(9!H}D8MJ2KMGl0TW2CfQyz(XkwdG>Rn)|(FFRv@tlfk*I`ijf&O z;rPI8n25Vv(vzh4T7#6z`_&X)y_O1u(kD`lX|mgH$K{z8H1I|S|El#pEsYa=MXn@mE<>>Q|EDR!s3s?A$vg$S>6xp9LRBz)T&EH6q^3(jVGEv?av9}x(5 zdJye+V2Hjk8>EHM?P)y>=s`u2%? zkGt#&!>6kUIU;6!vAP;1_UaB)rgo7u)@6RH3NmCEG76Wc7>ZdTsa#2c46R}~Mh&eK zvag7btYq}<_ER*}{cJN$N821q6TdGg@N`>p9!9hE3hl+$Oq0NDD!($W*`(>&WkZd7 zt{s)DLfD}U)y8=HX+0vGnnn3;NZQ#chr zSN<*5k#WlRgJgd&|88|$v@kG{xn%CwT9;^dUtOGmz~`FFxdelgJbO^IKR5F}l)ttY zyUInpSEO~se17>DL}d&~`;gtM+a{)a_hSRaIX21G$0-g&|NcBuv4WJPD>er<^r?~`%2lgE-hQl=oHgl6yMjRLLc9yen*2aWQRK%$ zg3quubYjDIXUCO@z*^38WFLBqQ5%3bCv)iyDtqQ6=xopbfIN7Z6HU#MQ zmzXq0$&;aViiKTY|da69LF5x$qSBg6@BQ%6avHjBMyP;$N( zNU}l*!{8K$a8BS5%dX;A@Ws%GpDdKAh#gSfK?h5Na+ZwY4yl?S#>7%Omx+aCl)qXI zQQbCX=8=a&dg+m4r`_l>TnEbsyu;J5Kr4Oa3iBYtiHEhx$gG-4e3yTNkR?Y_Nvp<@_|7d7#8J_cq6-TPO6=oMvZ&i#nkC2_8_#1W+a*H zK>Vnr%FUtVpXmZTAl(Lom6}~SCNju|Mn)M5`g&VNE^`Deb=lfVNsKb`By%GWC(&=7 zpA~7eT+*Q-s&yXNf@yR{r=X+5LobIP$bppgI*@qIE{8^ZxX;r#WD<0#r;UILHKX8R zv9hS4NhKJO85soS#mdr`7be#Z;_Wi)K_1C>*!8jr#) zA|4$VOP1J*NF~CZd7vRlVwEd4vH^3zG?d`_e1^on^oFil6d*x-NVTNo!R!$N@J5h< zn5(GzL&ZAav^WXf0pkS-*R&+aB58{#yll=iNzm6l+y+}NE8{CH+W=Y55>ZO&`aw)_ zb~)142V`oc%Xca!+GJ|4$ZSaRvCslR%1P^dh>|w*A&LfbY8C>r#=?NUZm1)b7n#tw zG}b07=toPd4QE7h^a3|shwe)ZSWXb|wz*d2J3=i2BJB>|hu^5-yYPh#HRRHQgM>Lt$B#!pA{@xtuvw+y%BVACDlJa!p8IVBSYkTt~tM$>N9zbDA?41Eh6X zC{bh(1^4qWby}g=p+#K!QPqGprEcnwkr-os+TFxvFUAtUg=CanTykn&+Iq;n52AY) z-p6Nmu;Y}h{Z0PE5O+_PQ+GWNy{$&Z|az+uwlq!+?!EyhajGYVE- z3EPa)@8QjcOb6C^l?e;A>N5S-3QB{uNeSI@7uGzez;7!lJtGKzAP6IC7?O~jc7!*I zVM3ObfN%_LN*jW!WSqDAVT!6Ctd1)u?mRViP4B+OYUUG`7c~2kIP~ zDYajF^s)~zMTitkXs~54Il$65xEr(k4r_{=^ z&VX=HFMBi5sNQU?il_&mPJgIUMF$n|qFrqcjb&?gpW!}?`P6)QZQWA@zMO}2{hFAT5;4do8J{gJ(afz0Yj9O!@HWa~A2+^><5M{D3 z(>3X4tqT@9UWBPl3t$arBrT3#MK*hklzRu#;EHm7hy?x{1m?&-cC@)`(NN`NwRO?f z4++v=g$JXAtB!|Dry@Cgi;!Yxz{`;((Mob1hgTs+G3-K8Rb`~eZ7_t#)|O+;q~p_5 zWpZdoa&nbddV-8t$q%>7hdv(M?VjbIxUZW*&lVj9d$t%bHyKXqaSnU8}pDG^VA*lvKjOC9PI53N-CxG=snmGRXLUCRL+83WG!tl04nS!^>unSG)_ctUw1J%Lpq375rp zKYhPT>Q}L{PSXUaGV`Alf1&@_5Gqo3(!?eXaMcp2WST&U=FNgfEfeAM5sUmKQi-)g z0Zt27Ndl^7v)YJZ=&+~t6p7aGs6hTHeAur^r;qaR4HJ5YR1_tWKTi`;mfkqb+Pu%& z1xn_@$;{NOA|Aw;536!LYaWV5W~El1){JQD6j2wWfhQ-jBUZilM;nTp9#Rqy<%;fc z#P1*EAwX|+0#ybVwGvn+n+eU#gF5ip8fN$sXUU`H*pYsc&)`kVkD!1@{inM+v0%RK zWIg{zKXugv8^W8`BNzL!jh9gDisfwOA&-5UeLGFC+~CbtBFBb_)uPulud0214l`dx z{}b08>=4-m;JB9}Kj+i9c#gPB<5<&;t1uy0^G`DebD+>D?m5&jbj+36T48I+!y#Juwj#cUT9VS4_bG_u^eE~{b@lj))1Gx1Xp1y8z<}cg z^2ddtxDSaXlfRp=$~G#4nFSS@!S(e*>)WGW;d9yeyY2z?oO;9l4cg-qi!crj9YoQk zOILK;N2K4pD5z^ka-lo)A33|->+(QkGY2@ZF4Jqw;J_acHK&PJ}h z7X)u=rc_xM*LoQkpG?UXftoK70%%N!AJcrFO~odnNkO1BLZp7TymS+zDLz2l!IKo7 zg?+-qc~g|&ih2z{#umG5oK8%50y4EFF&oJ=n&F8?)t96H@v(=SI2%`xn{4tbGxRD= zz(Lj_PCw6x=u0xTCJ4UM! zwsYIQo%u9Wwo(GN)&lm{Se0(osO4&35IG7l){;NArUVM4=^^R#q$k=^jfJk+mQtnK zrX(n@iCbeBbr`Vow=6hLZ> zt7dSj&&4ae^y2tXl-5X0`@=ik0k}L-xA;*ZUt1$TLz0seT3(P_y*7f$ibIn&f{RRO zLxdz3OnSx9`$m%bDK-HtrXxi{pz}pZXySPacm^soAeZ#^7s@w&#WBwGP?Kx2rXKGX z;m&3I%$E;#ntG(Dzb0x-mqs?1(^JVUf6Y;-EW~wSg)Adg>%gu$XL5HDirJ7#WKA%Z zqkcZO|Av0d%|+cFN%;-vY_(3@E05YAX*@Up9lm^Qi{9FyAlN%F{wa%GuCh?$+Q|!< z3N>tF`ZZijhEB~pT4vJuolONig?g`sHQtQ*aNd1g^!r9WPd^}&jB=Oz$g-D7t9~O`70_arHDmW7aBb38G`85yag;q4CU3L(L!{u zWgC|;X>VmE_(2o}v-_VlDz#B}O${nPxlYg^l8qsv;ZQnhuVv@BrQMokCe(7JN|k`p zJX*>s`Q3uH;qJhmW!dcxGuAHXp&q|ltP!x>rIkOUBMO61>r}Z$&v9|>J;!iuRdV-E zL5I3|@0a)p0qqXf#qrkkID3ek)@TaWC9Bqpr+amVJ-b3!Mc)z+G$S9uI{yIGzl7j9 z(wXSKN9EhZ$^S9@xinX#na~tv^PvX&ywOIL5?jMrd=}+EkTb?M(t6+fs8& z)TmA#RoO*kiOF{K>e!|Z_~9vPnXIzEeb4FjSOq1zE-&UqxtXQNhG_o~wr^KH5;{&% zay(N0j^?g_@1c($FTS`bxl6KiU_9VoW18AniQa)P5@N!akb``p= z;WWUg*CzaR<^ECdu{#9&h0fr9#}V%N*bMcA#VqRksAQIUCV1<(Kt1cr`%g@SC)J~3 z6(mDC-=t8xNrMPuux?3eXa>@i?PJZDBy3Rnl@M&ub1)Dkze}7NtDUx(rD1uVCN{`) z9OiUl%|%*BH8aW%dZ)HAk_{)Ere=Tcd#y4#i@_HoOCTwby~-uPk7=aIvyotuppFXT zWdT`})ybYq-k;^a|FR!l(7cAeSX)LETTY%Xa<{|Lx44fLCUWaYbRVcRjy1}8 z)anu?^-)w@4mZ!owFU2V6z_Bm?)2>M^nLCOBJT_{?~E$$jN9%^#_mji-hDi}Gy8jI zj(l%HbZ^OYZzcFvZ@afKxVN?UHZ@Sv=qsc52oG6p4&Syh_4BUInASY<7@6?yzAaaS zA}))mbEsYphj<4l`y?;lmt>E7OO}~kA}TKpMrC7g}K8b`_jK9`g$`JXM&hdPkiK_BtfoVmvLWKanejr=B#Dk zKq~AM!HHA@@^ryR7UZ;ofZQawNrRG!U(PAH%h1i_$3ps&g1N_>BZ{Jm$FD{}YPU&) zbtHCl%EA=ikHY?$O8#5XPv5&CFvt@G8~;t}gwQYQ%OF;sPP!9!*3D7W!X{Y)pK4%7 z;M*q#J@V$@ugT^Zjop<^o0XjbIsxwy=mv+{_P||pmE8s^QPU~|M=CvS51@IKZVi<_ zxuqe&se$0XjA z1kV1PUN-j>EqGb_`wW|^VBQ#>835jBU%&MEt1aq2{J4twMjCX6__~Me=5H4CD||)` zmYROR=J!r*_owbrn@{)U%!!jG8RzE!zj3~&plys`3~!%{!r9-Rv!`-?`%F4)(NBNtezm#WuL`;AR;CR^;WBAgJ6zE!xZ}Ji??+wHjVIA6 ziahDPp#>obZ{FqjJk4-2k9`okAJ0L5C^8twxqi<}7`T$ANmL zgf$PMKiIa1M*`-?6TP@pD5*CVWTSY`zFzfv+4k4^9iw4`!x2#TUrmi{ty$kl`Kb@J zevRMnAk2T6wI5;K0Mr})0OB%g-``o~d)FGe1Cd*Y+}1xJm=$Be;xU{rAFlT&GkG)D zHy=G5mQ=NLTH_uI?Pd$4rwTYa?munTcn$sONozgX=rF$#;Ka%3wt}(pC$6Htt)y+S zi(>mHWDEdpI$`0Q`TkC)t1TW(l1tCGCrEYnzyB042HfHuH}%0J`~!|>+6n^q(?fw` zx6gEMM1tnX3e^R@t_G1QD%4#5u-YPr7m)rr@GXSOCeCNg{;%Hphg@qJ?O~dpSu~@rZ1K`TrezF?R=&O!OR`>(CL%vREqLq6O($QHmSVv@iGr(Gjx#VG z2QK^bkSL0OCo{%Y2))+eTYK=?kbLv3SmVE!RI*kD!?8J4j}!nkDyvvK&qRv^Oir2> z7*#4NR5FW%be9~S zTGF9iBxh1)L+-Dx8d4iq?)%EF`mRfTw1(ja?alfjViU2$QL4;QWroXV9aT4hQT%La zSVPp=Zw;hmC!WbK-~civ_gfVly5QNjtSL*a)3qe0=(EQR(de}M!UyDN&v_ZFUyV!r zG8~1jNZenVJ@Usrt|je@7AIEopBI&xYCLhL#b8`FoKaT(n62cAae)Hsea(wNE?8XC zhwYkKj{H@dqxjZ!r!LI4p|D7C?=@eht@{m|;hM6&aK(g&^)z12ho2zXAm8=;56&GP zk^M^~r_=a*{@ykA2Gew3ptnqNl|C7)r*&O_FivNM#FGEibYXQ}blDsHJC7m!AbQ>S z!KG_x?k{EF#gZVb;;zfOPV9U+^L}17wEO1iY*BtWTW)Qn#KTM?H!;YYV1)`N57wS4 zDS3TDHXJ0kiQG5U5gAavZT>_LCl!WrNp)3~{2oV06p^PiaKyI|9@U}fCBH5hznL0| z>LE+t7oGmEHMP*>6)tx&K$rNv1tP;B)*>?`{5MxIOg&?e;72`(O1KzHZxulJ1fY{* zAH|AXl_h%Rid4ccp`)}WI)2lC-)=hW>ct~HdV^%BmiZfLSJ~8RS2lG`w1h3bXq^66 z5i6fj3Fdr9*qs{)K0ed_%c4=pT>;1G<&~1IMUA1IxWxs6N=fce#znT=c>Ff$NN^s< z_;?!QE!gR)VA?!w`CKXp0~pN0Ay|kZ9JDjQIoW;N9JN7C+Jf#lX)Zb-%zt%=WN-)t zGk$1NU1T@42!Di~ggIFUO)b5AtsExysA80$o%NlbkX6M}b%A;*y~mW1E7u4Z2GIGm z6rjqFSu$;lF$ zn2o|pE1~UiP*CgC3a-R2g3EUhXM$TwVYK<~@D>-8x+|9~v!*pMtq+1RwXwM<2f=_XVqW%C&w>Yhkw=D_aY8z2|9P&6dsASwGA3_R5@LhZjCIDhbz*F3q2E zVp3sW-t}(EKNz-$Eo?9&jqwfCd_mM9GHRg=4UFsj`} zFRdti!cCPMy~}E*jhw?MgMBB!!gpSuLP^z7v!%(>bJ`R4^(XFc%O7DRZ>wSnaO5>2 zo)vv3FJr_TU(MhDn@GETNeaBG!gvuN?!iuQ{kCIb>1?(t4I|N44EoDPh72BOW^L;EtuH?= zGm@H|yqV3QI6l!E&g0r_Ov=WDFlD;Xn3B3;dm!P*t93Y-HlsqwgXhPf=zNs1vS}j_ zyf!nEbe**?Mktc|IIDbkT`=*Lgc(LM8&W2kjd%B5dJ)A@l)em|K&~P zyUMR0_qX1Wr45pJLtMT%x%|ml=@n3G3V-1@R{Xa-_5L;?=xFyg~u6F8T z&A9oqRcV^p9YQKdq!8eZP`TJG&I!pRS(aAmMz>}1*Ex-tnrRFA+fxzL2Ipmi+WsBs zb?=&Vcndi)qZcs47j(aLlIBS-CS9NDFx-EA3+<{QeM-dCDPR>=Xy((T^K$7Q>7&KgPVrIjf<^~s zj#1YFj`VF1fIcozRoTepqCjK{do`ekKuj% zTTe7|Dev;Up~CS9IeIzCl_c4gExd0vC_nD|{?Egz@R4i%^@a-XWtWQT@2)}6qvfCH z?W!ujgsl1yL@oN_9R)9ES#kRb5;?s%qy-S`ufojz->=GQuxwQfFNJqz!|#G-4auor zCqiFC#x>GHVdB)haz*m0MMHW;FCQ(C)Q6G0so$l9y!(Ma6i027ZUJYt4QGdmEV7N( zx(&qHHZt7CC@7lb+lFxvpy-282rcBhfp3(V@r4?~yJG`?3x)o4Rr@$fSbjL}Cqz8E z-^efU_?(mYjrjyT)Pz73UUr%&)g`=9Y5bhYFwLD#EyO8Qc|rv((wJq^R!d_2;;WA| zM$0>dJmy3}mVW1!?{+D);YRK_#roB@Ovjnwll7X0)s}v>RWnxVveYXUEwy zN=jc4Id?}{|5&lPmoOofG6NAfYI8Z@M!1bjzBgEX=(OS;E#XR_u%F$i>PxK0{`wCBG zGDr-vxVCCrrOI12@|FAApZ1Y^_cbJj%a=7IMgj7}SV#q->F;nP-h7j!SaaX<{BH+v zY6wPXp+=SP#*?XVHRa9Cwk!eVo}hC1Y1@xm<;D>UW{cq_1qbG%<%kErEeC@ z;^fpd-yI~COl;Zpe@84f3tVOt+dRZMX2iZ?>>yxr{S@hnYwrXcc1AOI$yspW)N`GU z`tr2vp&;kkdf>@g;l;z`jaA{TZ(lC`+sFCHNxf!vTxH@W$Ej>x$qlbOTp#B&9GYBmlG^iaIG!%G}EN|ry z3&$Ks2#$+zh!=szBf;bow3!o)p^1&)h+gP7T$ZRs<|-P;Xl?S;duWUuI2H+-76grp zVa_lEX{h6I70Za)B(E0@(izh2{6c^HhAU@bwG~I49ypvGqnlHEOqx8Cn?p2-=hcr@RVL%G=4Y^$xbLVAN2q@@-*l?PK?0YN zA~&FwWD%tL&5T=#osRFPHE1I=YJ-|NPi2ihA5&D-h8H!CvNrjD29#K|GoCgNmYMT? z_E4s6jydgo{kq=~gHR7n(Xm458a?i+9qr8-?GvEs^`@Vm|9p?>)Gt#wz(Y02S$!sa z)+3mkVWuN-~>3hlNnNZO5DD_M)``lJ_jey4gdmk|d_y4~>qHEvbU1!^8^V;Ahq*j&~ zoi4+A$`_XKbmyI+Xd=Oaf5dMw1fNXOR(4^JgYm43pkA>@dx$oi2A(IVmR#I!8hR|e z&s=>H+=kfbjcFqAWdrPn{PWk7*V$Ujz}D=GOPky8i9SxMt!`hJ{eB%CpP-kv#f`*m z7ML|7;2t8NvKLCE@mlD2Ti#PkWnQrMcx!jm7MvJd{rdEGD!_IjabOz%H)v);C<`ihSRb ziHbs2hNqd5Fp*EtG=vEVxG0_w%@LTQy?$I8x$cP~_Q!81T&f}Mr!raIILzx)W!39a z<=47V(x27S;Qv_T$(T=dEnAbSwS$XKY_$V_M5^mr;i}j)r(cFp*{Nww%(%Ch74utG zdB8PaH~mfKTh;_roZA)yV{6+_cyye*jv`E^+pinh3cK!iML%elq~XqqO^;t|P*is4 z(C6pzZD#Z%ki~I*LW2#}54lL2UJjss*pweyIw@}$rZ9Qt9t9>$bB|DlJzw^dX*_F; z5Jj@A;xda|32)#SyI;M@m!HN zkM~>#%8oQInG?}_tw_D>s2AMksp9fZqG&5Zlpr&$8-@cMg1;2kU@vMLn0*v~H?1Bq zg_uGwK0d4m@2Mqifg)|&_u!>x+kiU+)@&rm6GN;dnMCQ2hxx&jB3h+mgB{WZEHg`wwDQqo=@vYx`pY)ypBG zzV6$J4=&>O^Dc>EcQ5a~UvAb5N5mhePd$U)vMCpVnxEkw$EZ*s)^E!tetLbhf2V%G zKK)FGAzo5H?G^flBCP8o2Ez@ zER|&-1@6NUDFHF5(yZqU%HX8TQ!{#Eqv@@tlXe0kMACN9U>i7tRJ&XeV*4@JE`~|u zgsM@}k3*up1984($oBQb<5h4!2w1ciVlW0u2sirWYkeDH462O@5gSKH7!Tqs@Drqe zJR}NuyTv$Ql#-4aj#l?`$9wFTlEFZdtNk+G$bQ38>cuSwEp_xI%=EliYXEsPQ1b7m zWqDd7Y9Qlq3ao!0NU2Pq?2k)RgkOH8z1-Wr7PsAd!^Q3W@ z5$jT4bD=o1>`zHY%N4k=>w46?fiKf=wE9%}iU~hD$il8P6MjgSpwvL+6^$1Y;0{Y! z2^z9H5I01E1NpZlG zD-dA(iBFQqawX>-)8#7U(09EcqHGVt{0q>Kf;A~JgP+D;txEd`aIqEbq6Q_pNr z8AFt#y~)N3E>YX)3Wt*lo5?bgLCc>jc291DqEO%6pbBZV>QB5z5kK_wI^|<%(M6Lk zI2HK!&TIVmBh7pjYwR%d%@C1=w9A!{3!GLW-NB{O?xInm<3oMH-S7fvp!EwGv0cNohv6_C z?%2C+E8;nYQP&dgD(5(>LPDF7l!L3-Y#i(NeRAXU0&dA(dHa;Sk7Mc)O8s(THY`W0 z)Jo1*DY;H*96z(h%_XiAYE%!?#v!nt0FiL9@zTmsT`TI!%J{@AuQWmQGEMjI9w1<> zJtwq-GC&}v5cVD_{9$!AT*9*?wh^j;PPzy;aU*#jz<$fzN#Xh`TSTP>RVDLZiu&VO zDE)FIB-%M!ZdPBWcMizoFT(?`-;O=dFZ&bY2p%(I-^$@Yt}R_;UuQ=ZT5Fv+aGdFe*E$o@iJ17$ExPPiMu7Yj4h2JW~XwtQ8$*Io(NnXEX&06;-qX6m; zzkSCfDX)_=1MEZ%#bq)dUt-=yP3XimfEU7=c?oXdu{}cVa_)uP+0yt{%Gfg5e%RlqfH%mbwlI>KI4iDKo{6yMIZ404$t#USzw7 zop_Wy4K}?})%FD(TL(Wyav|G?D3nU8%a08Gin(r|HsubOi6)BK|Eq@{G{uXUxLbJk zkZT}ulTU>UC6jwXrU`;M)&Bl*HWVhkQTQ-GNA)6%-bcMF81$GL{CbdC{CMIL^%ouP zb;lt188a;KHZth%SRi#nFv3Fc<=^0IMeReyZx26l`YgCp1pw6zy!WL_QLVCivT`S` zCSXf*7*`17o)yV0gbrDX^Z}dP0YHfoN^XTmZx}Kh62ht!!eI#b@L)=lWedk0*4#=8 zwFnEY4;5Adh%yU`Gl$_5g9wE{EQTN<6nUj~UM}WPDTh$RkWdn#aAiJ#GFZmR4dtI4 zeG`p=i2(MW5Oky=8!aA^@_CNi5er(S2tRiZ2V$#F;}}j*%9G0oB%H`2`A7*UuWeMM zKx)M2)rjCIdRG{8B!PZpq;EttI5HL*`OOdzDildbi0ADP5t$TuTpt+-jYuGlN_w#5 zzlx4($ITdzjLV8n&Wr(pZM7|FT8Sxq7BMijSm$*pi zP^0am3_0LZg~XE3pmiDoCWUCGQQ{03;Cf|IBJAo>N7@~Sg?95Ye38~O)9b92WH1q*5l+B`eacfaYE%ZCP=b!b}F(PDG{@~ z({>t`mf=31V$D+eoB`U~4y^GSz*JcC?b_)C%J{{UAsdx$n+>p^@cgu<&S{zMqMUI+ zmwEm^13@b@Xaa|nJHyGs2DXiT)}Q%VIn#V10~wk@SCJXXlZo{{D&GNy_(0@kfSSXAouf5Ljb88#eV_;<)mD3Gz=goFsPS77+GNq-O%Wgl9rsgC zy;d<%PB9rUoRSsi4evu=FJeR^!!f4E>ntIRDJFfwCO`3e{0rdCDdIOS5zQ&(8_5-W z!~00fropLwQn{zDfaqiF6J>p1XQ}H_DJNPPmq;0wRvF!=QstNuk;;;fCuJXUFycZ*=}8rVrKX{61)NrKyDMt`rBpQz#uhdD z$u_k&8ri@*k)jja=^Wizw6aD(%@UCOM@-H7lm6yOO%p<`4RdWITFoM`2AWj6)=70X ziSY}q0*j-YO(IiG5^Ue6jL{fl8(F6s2lpF8@S4!MoB01P#c$%O zNnN@{=4*>WSIcp7^Y~+nI$NuzNvn2M^zsho8(!5UQU!7aZFVJVwI*v3 z4{6m`X*S$IHAZjxve5#XYPR^-Y_m~mK$B$B1+ZtLA*C_nVxzHFeA|8QobbjgVB^c3 z>hQ(kqTcJs&+XJ{>a5rhtL^G+=%Q)*+}W~$yQ72!MeXjn#EyQ0nZ5z0_d5<9IJ!kU z_l-L1P2xMzJ10-O7ym(`cA01$64y~kJpWi12s7(6L@8jr3m-zqC@B4rB5#7mq zW!{h1oQ_%J5`|*mM?T|4!&Jv{8^+_F$2rc%8B6+7FeZ2{C$ca`)7kNI$?@{@Cf=b= zmN<NiPB4X)*~EcnA`>u>^9VXEhL(qB>Lh+@}fL7A3Zf*jRrMH zT&ov@jYh_WMvnLoi$io8)nvMIvS&Y=41a#w`JC)5n*2C=>@&+?6i8*4Fk|RMWgj?g zJuhsBMz#4?1y-GXt0vbfpiLU24Hl(K->U=-(g1yFL*(bOOy*L_W`2IQKsV=hvjN=@ z-$v2W1@0L}$i9t>GW?#mTK1krQ=X>>Pcg6%ramMxE+jG?i2|-nlKI}5db1a<(H39H z7Vwq730*Kr>08i|v#~p~atW9+i?K48vN9&IsQ0jHYO+cDqABXL8swmx?sEup0)B{b zP_MFEe0?h?he%fIq4Yj7Qag$F0eUUr-_4N!`RwKkx+>wFd zIa~q0#>Y~;Jw<%R1AI;Ud?|!$l}UUpO{)aPYfvJ5`FDI*=z?eDLXM}TB{_nbpmpzx z^_`*haZUk>(>11s^_wL9^Cl-eHId47n-HX%YR~BY#ZsW=R9`d9Ju zlj1FV-`NZO?cdE?!Mn04&C-o7Gv-Izc~CoD#Tc#ZGELNgznHRH?`Tl5vM_?O9Hfe8 z_loDi^ANe5|1iG4iz|MiRFbD2$GTK}7%t0=M@5}pCEWT>MYQ+Cz6TwmDlx9YVV+JT zx=+uc`YmMtTj754x>6@XH@zRa@U#-Y-@Yh|x;`{eCKXHe(u>koH^%_IW3HZ4X1_H(V`xf zIrs8kYYp>$LAOCai|$L+&v-8fKT7>i{?1s7(dnc+^*Vz$T-09jE2#PwOVm%dgr%1nQq(r0kDigjT4SfMFe2 z#;sr?y926g2+iv?4F{23+Xfau@BIn#R|LcNGx&yUq)#O{><#SI7FL3r$djubwwtk0&)uUS&7;1|6VU)&$q*q))3YwjQ)3&wgvC8giNAj02KG~Hl>4A7^iZVv(0J^< z_|@l<%eQtS;NUm_($XKentJ}^>rCwDMjUVlEBBD*CrtVS!kBrl>hSIo(Y|)i4;9~q z32@{7G$!>7p!vMw5GWl&am(PtZvf-=V2*(ooA(!kRglJ55I#zCiAVyNxf^oe`Hry{ za*nyu_*EA!M86$W07fm^enlCGOg@P$@`xxsX)Nas&pAOGCXP(;c&iVOC@YU>UVZy! z9M%+9(gH>WF5JEqN=G(my*G`$seg^V2#>icw|!5K-5!hG3y*$j|2W2po*k2=5s86e z>CJHH{=ec8q1J#06iRCKo=6fAUQjbeyo|))2sEwAj7?^J$yc=(|#lx>+hlkDX$k}3SlK=GMPdkujeZP&BJkDfkYgY{(AD-LOCXW=f7WZ zyEIL9o4q0UnwJ|vZCJc}pS-0=fp{F5dS!ftYPk+(rAu&ZIWH$3elJEkdy%NtEm>Oz zKX${OeKa9k@SEc8;ODGHt~fJ(Q=+p*zb}+fmvdk^3XGrUGdam_^}CQoN`9lm09zqR zu0V9D60=@wAbROv)xWGVqXr}OvwOIdq7(@FclslIHwV|Ds50@|><;G>sS?$;Sbe@H z(DqPJ$duQk-^cs=Ro_VzZ-8*Oi{8RE%5Z2T>6M!VKj#)VpM9>d_!Ac$x>cWr30(em+T22$GOyR=IToL!Aacb{^Qk(e7*mlXoWy7m+oGLU4$>JuOjP&)&@>ozCrA*QUn70b zPYWa^S036zGhfz;B81b__k91QX%s^Fs4SJB{-|o-2hFu1&H4Uo4a4r6^t!&c#PNzz z7>C9m)1(mRwP0~t=v4Q17OE93Dyxzt1p;6RcaqX8oMDR6O9{G>(Hd1cY7BfSsuY3D z`1j81r8GnTuUP3uK|sM%@|0Mc=iPAX+ULFKp%5O6j3?6(0?=4T1%}a9Ldmw=2eQXb zpbZ(%ZW68=j!8sJ!Kz6#7=%Wa6h;0DE?NM{;*_OGDm^|a>zNWG@o(J|rwpkf;@fSUdGxAWOmA@)>N$MJ}4=wbX$mjz1V;F<-^AOH3H{@daF_+R}#flnUs`2WBCzB}xe z&{?HWSbp&xqr3KMlISol1|tH&hqk~LQ~Y|5VdB&WF_JANfLXb$dpb?laB>jQZiGw= zYY=*td2Ph=Z#^7~LQMQuYKm*tW!iigju_t?|1u@n&GqNJI4Dzv5n)q)SylyqLIh12ID6ESLlZ_ z>_+|}an_spmy|i^CiCDp7qE=H!2MpR6RsriFj1HN0lU(_`fIlOE2K`Z2{Mp9<>F(XgDQ39NW=ANZ3bE zE{yNC#N+_1aALJk(0v5ihr>kRsu+ov5tZZvHoV1&NYtA$JQbo@9IIY+O!+gcKrd+& zo*CxD!-D6wv{~!Sz@3n?G4?AL^%Nu zc@Rz#X`i?XAkF?U5LFp!Pgsl-F0{%Li|}=k#GJiSROKb6Bvr(y&vN85=eR0DIZ_M0 zmLSL3MQCbG@hMOW0n?$N!SOmlOYHKj2pim%H{36hgw}@$m+xxb0QZSAlyWxSNMXaV zFsnFxplVokD_G!z)swix*I`(Z=R+0o=bxog8F)AR3Citjfa4axLAszFh&C=&I5M^T zfGq=ioONb6{VK|n*JvP({_ z1VqJrY1h$Qqg95U&k!Xf3)6QqB$7Tu!N9!*_;X*1$q)Vjh2P7RgpUv!e^nBJi_Ebc zYI@-uQ3ymfo4TK!D%=e;1=X*SgayDFu4!j$hDt4f+k*uo39PO+$uJmsS`v1Rlf9Bb z=o*63xCPBgKk!0QAuEuT#n-n9Z<mUQPt84~6VJ(UtJP#g;NclkkX4js8Jmj>R@ysT?}C<< zXsEnhUsfltY@#HeXILAJB9Wd*A-HYGj4ItDo`<{mQ?mlgn7_At(TRlz9IRQnr8N9^ zi#sc-!CZMl4YXC|f6~&eD=LwzOUlsLNaZO91|S*Mhl4+RU1HNU19rYf=Fi0w93Ur;>LK)V>bpv8d5TA&-4+ zH&l=cWQJIM?_)E>`Yu6jrz-}#djdccUMMu$Q2+b-&X4zCT+*Ot*s9-s$1;I-Huxv_ z!pARcmva3uWFe8(!iZ!YaK-%y&HaeO{YZ=b$Or%L^!pZ!3m12U2;{$IScz763{u`> zmFecj4ADbH4;a9~US#5aBjBS?5X$%HA9lk|mI&fRiF9jA<|8 zUoYa+8*u&yE08IqP*L=K7+sk_qVo%_m}s$c1qI$B>hew)zh#ge34)_{=8*P?m@Eaz zV?<82*d7N3L{fZ;L#v1(GAP!@*q`o1L!r$~X;zIUuR>uxQ6bvMVkM5ehYzRZ46kup zR@O*mXWQ?p1n2A$>YvXnj*c--@@sjOI#rs{!G+Qhs&1`ZNTD3bP?yyJjfzuN;YJ7Y+)w0S0H zd~v3Gak!Bx?9a}oz~|Cbmx0u=QV2&#zPr*!EBq9*@vPu+FinFiE8De7C@^ZkMKnSA z4zGx0BI8A-xVbf&9+9r2&3`a0aE!&`nhuLyEFKVn0!c$45>Ztw+m<=P$dC$&47)e1X6q8nih{U#JQNEs?<9Nluo5CU)QT~HBf0_(;GanUL9xN=)^kBmD#ESrm4*^C=p}437 zh0oLK*FCbLF)VRYjZnFeFw>-{fI%-+bc753WAlyWgW)H2eGAC=e7FPy>7PG9J;Y=# zs#K>s7ZN5GQdU)~)0r8|>udCe!|@jRCl{=7nZyazcOwHjnKDk3KTQ~;^vJ#LO18BoU63Yn(n=CelL-x*^j(~<{*scD z=9)Y_!yh@&6ieWUCayjln8UQ`1d21aK8zc(8FYeV*dkMK!Y1+DWL+d2ge2r__o%@EDLIf8Z#>rXNy#|Vc&F+ZR%)F z(`vT-{`m>VQKSxE{0*kWwK>0eRXv8|4@Gk&GPAfUyW}4o%nKdR^Lp3(5KEIBC_Osv zOACg`grfC_!b)S77%w!cL|5C?o>p& zYMaD{PNweYAyn6U*e_(op2I)m>H@*-2!8D0Mr_4GB(2C5Q=kA&?hxue=mKK^%p6`# znDo%DT=+b6^nyAP*jRP*hskEW^CkpHf6p$8cyH6tGz~&#bIJ94pvNY6ihgQ8Cq_g{ zUc5BP3ujvYh~6D#eh?S-Iy6YQN}uMFGK2zghi!z!Xpgs^PeopshhCb8UiDO6bF3gF zAwQ28@F60+wiv!m!M_t4F2aRoaaVeqrfiGDfr3(g1{N4g^9L(&@|KSg%I*Zy3&Nma zzzV{_F=D{`#l$G>u-)zWuuUtHW2BvphYGi!I#2gV zIZn5S@6NQV;kEL8A%r8KiV_kCCmW5yJwhmy-t*&!qgpl&KjEGU-wUBh@Xu!mp+O1V zDDin9skki!A48bJ@vHt}HVJv&V^#=f=`CV)+q2$9V)U!wuGR9b-uF8wN<|#smqvlU zf%ycMRWq7$lH%Zvi)8Dgx9mtYpP|~SIuZ~uD;iN{+>k{+7)3SWw73t%iIOEk<0VVu zh@#Anau5~$I-rbWl{F3&dClQv4pjoou8qt?XMs#N35C~@Bri#w+;oN9g{lDx{z{6-u1I_(n436TNUJ{Hx5Y@;NF@Q%byS!!w=+wqX)V&CXFiFo0 z3HDS+j$75Hp$TSGbb=FjJPlncl5pydT*7nJD$`w)@#_c>0wA2Q$%-Kr1^K|*EjHC; z-$x~|bOO8#Fj)isL>Tu(EGWw7GDaxl1ay5IRht~0+cfU-S#;|{`>q0$5~8P#&F_Y7 zYs@Gjks8f#f}j#&;9(K9o*a>jUE^sv%92K6o|u-4<(6@3Tyg5rVU;yz6-RTHDrlWv zie=-OM#2*AIdE!{D3r6CF$sxVK$^LyijyppnPQxoIzA#tSYQy|6V#t!v=f*k{kOyl z&(&M@l?};fEu;2dMgtZu5;;|~25z^--?@jZFCR7yD47E=Gfk42Ly`hLy;4+(MP0af ztvS7;A`z7X_}FA=-<6fyq3wb$ED0xUSLp3x-H>L8N~;T2msIV#jP2?o@Q7K5RxdNb zizwL~2Xlx+F)pJdS>7evg6ZCqN(V%n-xxCarn9_HZOVzdj@{r^$O%pi3d-FO&)oF!FF*1vIj+uoOA0iu+O+y;&woA&lEx?5Hw9d^N?-LX6u3;=)8Ai#VXnVm zUw@^(hTyt}l)C=E)$jY-ZQqVT+$>5Tj58dlGW1?L`1*l|%OphG?6~4q(4lN;NhHFe zc76*FE9C`u(~CyppVTUHOPZQN>25>!^)m6R{mIRZgIS}z+BsWx2F;2S!Hm=*&}`%|U%P?&yqXZ|*`9Cg@Wt4wV-&y6@4C;57>wXsR~EGtB2- zF@}3D#NaZ<By;dwL!`-pgy#K2#@d7Z zyM(@ryoTDNX-~rJ}K4LfKQpkS^ti6Oy+n zV>KP^wa0{}kuvN(2XJK~8Dv2H(ja?85J8T7&KS}WLLL`m{*TlgF0Ul^bV#$;T>sMI zFt6AH&nWTNq++xj3gbWznG$Eh9%YXU{jQajOTY1{f_iVmeV<_RZ473ueDgU9z71Lb-FyD5coXJ|6J&H9VFCyS zbI&5QHo30a({M7v^|8OieEnz@huceY7U%Knb@{zEBi@1Jx0d&^TtE2>$(?3Rexlg( zmszNNAy%Vu3-dWjJehovz~qhSseQ-C-HhLqn*X#J_|{$iX+|Ej`mvT8^Y}}C1qRL= zy!biL3}5IA{-1tdym5sJGHQ!z*|Y(!R4fIncuIUmwU8^fAcNH{g={Fsl5bU-(Aqv&43+Pf*EPlKaHi@iG|k*E9B_CVfKv|vvAL-49E%Q8DY14i=&uL2ZZ?qIiLf|nq5)IhP zm2LkVsP@@_I_37{khgE;#$tpzkED861R?q1xIfF|BWME43;n)9Xpw=4JMX5r;C)q* z?B`jMl`#Bdyr+aSkEaB2oeRpos!3oz{ya=XDlg~q=5NNaEo2^@Lnj> zY4v%uQguJM_e|@^ajFbOEcjzz_sy0+*_3V_vlL(lR?BRZltJnwgpRd%At2U7d~PAh z>ugQ{g6v7r@&%7p9Ey6SQhrb_&X3|GuUG2wwAf6GifolgYtaIeS0erie%ga1;=>7J z-XA0fxzR0KXGdjH-wseyGN>r3Yt898>7#o-D$j)`=Z~sub7ggN8<+Pw0j=Gy6LzIr zjIvp+`w;(9$xo0Ll_){%tMEO2P`9z%=dQF-B(6K=ScwNQsMp_s4`E*bk7gOK3FpL3~30;{F?)y3C<`>t+s7_<`>_D+H{GokJq6 zarv>sF{PBD=l-2z_4By1Ia;Tvs&&>dtY>!Bp@_zPUC8}g!sgGU9Q+0C2o+i0dkPFW z;=}TxXx4Y$gXtu%x4T#uC_*RcT@0e!=e-yqBA!gdcaaxiFB+$Fp;(QVjy*8*CHFxh zSMaM)s_As}QFai#_epb-pyy%Q4}}0hgV`eV)hA5KLVsEor?<_oH{Q zJ`ZNfixt%H>SQzVrs(n%^WqEWZn3Pfc}g$f>^#4D@a|e2U>?=D2GFmI+uN zn_T?`{WLHmc54Isf)FlLq9zJLa+#{6Vefz4yb5@cBe7q9ihD8!$m1vH!_ry~06Ce1 z>`$Ti(a^d^$4V&0WZ?D$Z^OAUjxkQ?CHXr^5U_h;Ls{8XkoEU4cZ$Wr?4+f6lFf&K zWC>ETYH}!XjYC8q%;93y^B6x)aPS#fq9#`hX?(_zNDvajkKj!)$HPactP{el&Q0(K zaKz{=s3N$`3Q;b~B{}^ZS^mqpofQG3-U^8xpCzR~j56%Gk$gO~=eaN(!`Jdp;v*)f z$?#vKwHHB2f+q0Kcuhq`;@>56)yzb3PNl)pAGV1p#aon~$)CsSXbJTMnKV|kG9gN= z?(J`|R2){apJnyr1|$m#J1hC=!$hfx^F!+KyGd=yr1Z98Dpps|sgdkj)wE|^6geQG z=RFLTnRGZwv_u@E(L_>%b6NC6M!d5VE7@P$V?Ho&hIGnVqn7|p@Zpmg{RqlCefzZ7q*H!(S}ay^ zQIdbCP_BbqGLcTHG;KH&tEZc!aV@s!l-1}TLh0qu zX>_hXFj=~W>qM<<)-twKI1w^v|FvGOCTJy%SgNFXTi2>Ty8@biqpzQAjh9?5;_|VQ z?qWzB7dkH`(#Vii5?!wA8l?6q=D0w|P1H%H32Xs7*y-Y-=|&k#HY0S{g(*d$EIqci z)M3_2n9*aMthN%Be6RhP_FH!wf{S+6HGRa=8*QHos-tX*(YfQFUMP}#YZ|G&e|41Z zVd+Z8fVsWP5WOJg4V)+P%LadQFrqfW2$AhJJQZ`zszO|Gr&AX;Q}iNt}8Y zr0AW{F}T_NMnWX+&o}REM`zffpMXu)&LR;i@W5;_SE~+Ft)-?BzpG_Oy9)- zkkRp{E&mP#ary|rktHtW$P{fMeeksYI$mARjIgi$mljZhndC5D;NnK1#Bq!?nsV2l zLXlf*`PQFu>5$Ralgy-5FT>dR=)hKc%HmZjOa0b@H4K$kyVN;T!26g#&wR#FVJh2M z^@m7b#4G~*UHqtz(C_xTD8Wm>R*A0$Z8qsnP6E=fkSLF>a5M@N<5`c}a zP+r4#R-d{~SZ1MEiQ8!H-Tb;#AMvm$E0CwNjo0>5??E|v_e`-5dbJ5X!g*&$@0kCIXV#P4r4XO+R5lH6;c)kULzIw^J$ z_+ZlTK4bg7An&8X5Zsb?>q>k#vi&8}@aqT-9G(glLLMUL4ch@m{F1_RL!3KG{r)GVDu+e`zwra-iL7k`wLchZ<}s{lqe zjOcb3S49VJ8oC*&kfEKFV04~zzJPGqK#X~h=y4aT(3nKQL=><`iSnI_ij2AtnT?%{ zW?awKS0VWkQsD?0?K1JV+(H8DLNYfKdcQq#QQ2Jr6z1+A2Am-L z(LsvIC~~9(uMLUW{6Quc2qTF_6Il*kj*8@OJr1lQ9vQDNl1ZClawjv#}D$F6d zXo(Y?Y%zw4qxPXnVvNSENri-Y#dk`r-ZU)}N^M?B83*$<5A$M@lHKM*MNZ1Fk&;r3 zL(O&b#C~k?-a=NSat$qT6hTdrPdwr*%7Ji$0yt7G0b z$f2+Qso8AwkX!xoi?GQaGDRSANbOoDB?Oh)U}Lr6)8-FERGVCF)EUg6c7G(mYCf1s zmPs4+c_lucs1(5Ce~4S_Gii@1iTbW~EWF<8{P##;u}yfV&H0L|ci~y+VDM9La!Sy7 zd&*X|q7bXg`&e2sKlO>C(Z_Rv9wy%Qhfn{>EAReF69O~6zdl|@jZ)ha^>{tLoKh3{ z-><>2NBtT0Kg4BLS4aIXhF%}?+ zOvjE8#SPvICG>k%3@0D7+>54L58scXxJ)OFp>It$jTc54HjQD}Iw1=TdB6M44++hd z%Nn@&6+aqQg2y~X)1rei4cb$tL|B70s3g_Q!i*~2I&zIl(!LOvD$7|%?O4dFmZ#Ln zHsThJzhyu)R5Wg5RGz_1N!lX+vx;{j6oJ)bS>!1yOT+fRs(4Nn6~(za2-c-3@SRp= z$$pWi*+ouZUaOL{P~IGx0b8muA^7(OLIFLR`?B(m&Q_bcKA7J&xp0_Kly!yA*7)^< ztbD0Wza+D4Tb3U~zBSK(h+Q;p-oAcoT%hASH;4Ibbn|>R?!xP^3)$j{!njRr{G2-w z>$>lAE$f7z&*33=5)ca+Goe*)?wj)=W1?3%=6=qJvIi{n%;cO zqoeh2@Mh_j!&6M#kCcAXKeT4u<%uQsbx}sUVbp@D!qKpQJp$r|sCo30*%mz7GRSK^ zj`MW!Uypnfe)61z+6Z0((r^EJnCU8ezges^^SxVz<9a4i z(e}O{{`(0V_RnO$sZ?&i50?miyu@*TDc&YM*95#_*859|{d$916^8IL^#@dELP56o ze?7Vigo)mP;?o*HHMtJpU(=uHRgPnH7!>a+6 z=d@1=@y@{{L5D|!nLm4YW0G7)u(3|v(s)q~qnxaWaX%Kx3E$JHg{KqZT;EJ_A*~Vw z9_M0Bc%X3mluE$LSbsr#yE*7w^tcK!FJHQaPkpr}^Q4^60 zwDnTgKcTbnWaVV7W*@z?6B$8- z@zd}{3W}Ts8M#E2d6zxHWPCWbbWm1?2?b7FphkcJ-h$iwqRJ&doC57I_TIHxj9`tG z5;Ch==PVk%RE~w6pY=i%dkd3dkF1)x>{1EVK_&0hj7Ac|V%AY}xg05+z&QwiLZ$^B z0J14`;99Wq+5^B)!pY25Vl-B_)QoqS>5=YbR;**z6|CE6uLE%A0;g)b5yQsduemFhMNTn&LdFi}S5A6OmJ$Gtl5PUixjJO1~-v_DQX+c@Hy3 zM?~+nJ^(Q1So76X3Q(DtBc^9bm_{fEZiRIB@=SD37seVlXY4vS{+n8?+BbW!WLRJ9@3@wl7*;g*-UsTTYksniGb;F8??-#@bnHT z-GbsY!Y&luo(L+(JLo&xeJSp7)T!J*#RZ7n=6;_iE11a4#Zt)@HqDwujfI0HsDzfX zhc9Oj(VdGE+%2LiQ%D9sTB-ZDJ~b|Sf0c;&R(@}BU~9dr86rY0g8`f^5q5uVsC8E= zx7_Nw2rsl0vz8B9IcsNfE?k`X=m)*m`MbX3L=)DK8Mpfw2(h;Af(YV0kp zvot>h8}guX#R3t7Z6HM2voULdp=s;8`k~K#)E{vm_wpSa@RR?hY_lB>2!NTT~p)b}I0ZSLRSL=!Cx2&!^c z)oQ<0B0^CadL;+{;QY+cZ5qy1f5|g7+pK7j$hJ8a{g)>RiUZcauaA zzqBpxI=_r{>uJilf&l#!{vzZyzx+<|gIIc9qTvydeCw~DKV|nY<8!GFIh}N9$$* z5r;bOE!2^x`mY~C!FgS)#CeZkrH?b%d7p&)UY5SASMWV*Gtu8XxPR-|aCh!k@5ezx zuX|;FFHub1_s1UZ)5q}l$Yj1R=!UWnX+EDE+PRe6g$ShzCf#Kr>EsT4;4C}?8PjL` zk&H|h`yMt;-HqBYKpI-*?+qf-NdSO`k~C2SQW;cu0FSdO;57h(Ulk_NLPdTK0BQwd z&`{F02c~0UGjjVd;{>ux2cl~MXgol;&mL5BLHH?rEZjllG$1MuORVxhsnx)a6%fK| zFqu}6m^45_I)uRz?Q4+x_pg|3yWd-liJkWCOEi$m_Ha!-tSmhEI7>oh21D5&LQ{cZ z>?~oHG^B{e0FRSUoWaURDq&sxN< z;h?v0`)fG11@!oBF#wb&@WnD1ejNCL6NgNjfNB*7-9d^`fzfmqhfC{mQBMl+j6<`E zC-#g%piRUhji+8qfW>A0cFg#4hx!v74=g8v!x$k1e?jbqU}<)yEW?T-qz3jmB=JN5 z`PPy;ZjwYI?7zDGlpNQRu1Mw`Px?6`B}@xckx6z{N~yI-VrWdpo=et+Pcg7cP}NTU zT@EyhNMe6M{SXF}U!y9lY3S1?k3goHyx2HerDB0n1v}CVGi=PMt%=oyQ0EZ(zkF8O zkWNVu5j8X})R3n0k^bwpeL+l_Mfe2Ips|e_m0+D|u_AGqqF)eW;WH9tGT7DCTR<6^ z;~BZ1ycsQ^*eWwNArrv`F6JdYfhQw{Hj6za<1?j~hnrbMOWaM1)7z0*!;}3P&TERu zZtckKz?GWz%w#bpt60-{2a^C?Ur^75Q4&ZH6;Bm@X=hDDWKGEs&8!8M*QX<5WY@}M zH;m^tXJogHXLqjUsIA0}I^*b5Mo$3X8k7umBQi!v5F43QZ&hq7HPNV8lT%ePghT!# z&^C7S0dxhC!UYZHXxQs%xL)~K3HgZD`p9(ONxg8$CxkJ*lngTpWk(9Wbs8|e<^$=9 zD9-HoRxx~EP(OG3M-jy^1F#Wu1&pr+%&$f0vPG2E1yI&}FquX4XT|&oC4zK?B6R#g zCaUq!+K>q-(~yYDq|wZ~jcUbCRjT->gDOGVT_3$c(Z77R+CHm_IeEW?5DdmEhQCuQq4X`V0Gs}Hs{k-PN zU0=)Hb;>(#G&ry;G4(%0T71M${EQK+EK0H7pC}q!BEsvRzK?%>ULfS( zB!IsFls?3Mxa@v}ZeU*5e<&I%KN5g{0OS7*MI+-Mr1&2cjV61L?tf4;#Qu)P&C1}A>sdLC|b4#=T{7#o7A>KG$9bW%v`6WBf4}#r#U~4tq+EX zahDz+m7gQF!&iErbF6@Z(PCva-#08j)n6Lm49vi2Y&a9V%w4>S-OhLhJbR6?YT)?i z5b@I8u>gcOG>pG4QnoqQS@c%mno3J(ZKDcZOCTMb@yyLRUAO$`H9!5w z#_!|8Z>NLbHUsH9AsGKOO4t?7jtEnC#g>0~cwH!c6La~G!*z%LPFeGN` zFZpWZ_c^ZwVGMBq3Y4hw7-iyj(PTRjY6?*T@scr9QPSZh)<%)OQxQ~(mEb=Td@kbJ z_hKXJ64meG(olcmV+b`4Bx;c*TWi);vj5ZwG(wO{s14(XQb>mfM!R0x)m$XkM$KNrY409b-uDAGOLf!$OVjZpI(QCE%LZ^{Fd>aK@-^3eNy z9Q%4phE%yg27~>^mp$<%gC>r>1asZs5Zy5Iof2r8vO_J&OKlki?M@Dzi||g~G7Tl7 zavPU4SYRin{(&CjVG^c}`t(81gW46Q{_Tk2UWoon!_h{F!9Qq&0 zOW%%fQViUB4LoYG%_FskKD__hGk4 zVH3v8obLx5%R&T`AQ|bUrO|s%H=M5-*lnO(oGjb!7+kywmNTt517RHqjh)aWUAU=T zwR?fcu+CoT+gNdwqi(Zhi8 z*#NXce%%GXT1h4;=KOys`ma1av`GcLgrUivfDmbdbZLUq z-a~lP+sZvdn55TqaDtUQf>gC$T+X+Hf`ssQ5g`)btFNEX-cVcX5g>P;%m_NKR-d)u zf)y=;#KVImaY8A95$0nNpVf*$kBIql?A|y)5?pxnYUrIFf!RJ1R6#MIwhpHOamn}1 zG~sO!HF6l-$E4~FXf6j1kHyTF$9ChyZqv5y7{>1P#Z+p2Y=rd>TrI(Ca(4` z+)=?ev?F3O_di48(4A*C=hR?+}(Dy z-JcDH$M41Ua@_w#+TtXd@|2Y;7N+!W4UMExZFFkpYpM~AI}kXRLz@&rk5w&OLsT&F zqS#!`tEvf!t+2uEbU2wKmZtEY=X$>0;SFo(;PbM4@X=uNP53J;MZIv1!M|fvsk4e7 z?R&9uKmUW$e)0yL{QlW>*^6i|bQgRZL$O&L#3c9vP@#&~TF;E_oQiZT#nCp)xWt$E z;2ACqq*`ivy1 zp}jD6S|+Q=LD{C~tX+jht!3`3fu-xXl%i<}LYCAri8U9{^1mg%Pe8fG%mi8*1vwy+^ps&-Hm=JgS13PuI)6 z1FATDCXPdf&^8MrWt7)n(f>Bl)jce%_+Xu5CN?-@NW{c-POat5H7to~NTO`@TP=2lfN7 z)ZGrBC>p=x2=j*(G;ZwT$lboLD3eoSIP^8 zp{x~Ekb{jhQ%fuM`3o@;GmW4!sA02S&cU+6d=bLQ1xWTA@V0o_L;>l_p|PZr!btM* ze0ZXS<`loln8iu&42EERWsv1cct(6e@8ex?D1vy@h`xO&ixcQrnVxDzGkiwwgX-(m zp=Geq($ZS|wG#B|OyYSr9N=Ox#DQi|f7+YFyJd03f&L`q9bfKZJa8y*x`5(@wymRQ zhc~halhPtaA}~?>qHN%BXk3&+NkLX7te?ENsp3E+PkwPgh|H|dhX^X8d@*rMG7;CO zszjbhnZun{Drn0xUK2N%d-p5lt==*k$Ib!hw{@62?_gD2G8rLV!ieHzLma~>t4GGz zFcld~t;n#l9D=ecZ+k!^30g6l9hlkT^X6hrg7-2_>6IvVl;c&6(AiP6O*k{S7{#KS zH2tAeSU7KSr1xmjSZIgB7IC{jMVa{KWANN5Fs+f@vXo~^s1sC)Y5pE$N%|T6f}XHp zQ1Hzh%*s*%UtC9m_!~+5k}YrE#LzOs#|jfNinvPQlNE4^(e2vBHJpGd>koz4us6S` zAseKU{JybE;993QNAZ$`RD_%==egkj&*Ibxr!S}Z^bB#~fa znKu(LyO|B5FrkN*kyNwcT2RswwOQpi{KLE! zYKo?DHq3_*vU0jpMLBR11Qr=}jMqQeBVKoaHqtMP8CVajhlQ6A|A|B5wF*gkdkRGh z2C}vg1heE(z^ifm=2O=Sqz+4$wd$m5t|QnZEb5%qIz8oZ<$feSpgCgZ*9AmQr@HOS z9>~-*vX5X;;QT26$x=&O;VxW8Bo-3JmQBwumt#x>{lci=MTb@6nEZ^zo38WfC=hrf_3-geyy`!bY(l^tD4O;WvaM z2HEb%(-E#)ov`Gn0vegi1ISDnD~j~|#G+#Z4nw?QNqDcr&=E3FMc2$STX!r!jcK$Z zfsP3g(asTi{l(Gl;9n?EC8o*H@QX|n&v9vzlG%Z4G@?iCzu)l8x?VP6Ra5x8WT#ZR zv>qBo_U1yOwA4U~Ri;`(&e)+|qJW&)s2GQ?F_yp61^&XgxP2^^6&v$(LJiD|ZWQrh z#g#aOr*~H*@4^^WPzh+jC}9*_4CUukQrNjGf3h6D&p9WB7(4~r$u3YT``W6GQ`ScD zA}h@nGY8uEpxjPVrR*e_TF@%f#m;SDRf{Syei%t+xccw^!PZ*_#Tl+!n+XycZ`|G8 z9fG^Ny95sbf(L>(?(Xi^IKkaQkl+ND#@(eq_CDXKnyH!J@BgRjz1O&(J`oW2z* z$uFTUuQ1#Gnr!{9kY`gUO!-w6SHeW}|kdJ&NDLm6RZDE1Y>O2U@;aC3sqrpVMOWx{Nb2vLrMz zHJ%n=`C3Omos6LWX{G1hBVNg46m=jrjD@?5{pL-+xa7WJ7;TfZrj{c)t-Nxkx+Zb0e^RHZ$UDa8Bf6YJDZq75q0 z7{W{$xLwp@M)ZvfFJGZ4g}u1`W}zxqfw^MeR8=A)MaXABSeP0D?vdEX8yei=!Z0uK<^fFh zAS6C7Brb`fRo@s!f+7Z?B4lbJN8Egb%P_%CLcWjzaYpLj50Xm1 z2IlZ11YOubPrkj+~Q-qvR1%xZ6_&HPyjB(9QpW#)% zj9hLCO3}2Uad#<+Q;rG1FiN@H2=#>#-yNKud4c1@uPj+T_f- zD8Uet`SeoI1~Y7Pl5P<_{6(YsYdr1nb2#~IG+UNPXnLL6Ukn%FMuWfDw%an)zF6+q zvdrz^uhg(Xt^gZ|44I&aO9$A3p2JtT*iT8yI|O0sVZ@D7DiB+`eyN7d9I>q&B-vKR z3YJ_VN`QtZqeM7H3F*t7UlW9ffTOeJVw*5!AK>RC%D2_ZmF?q2k4LAt%0J1|hv=23 zR@0|)$R}ry1((a`w#maL$c0Up%h@5u1+nqEcjdo?6?D=RF%P7uE0p??mr0GoBousA ztH>8)WORW2PAx)!8JE%#QRBx@HYGtD7?kp=K|ZlLrwiOhrRE}e88=e2xK`likan1QnzE6Kay+) z2&nefAViAS?x^5hPR(-yBv(L}%zu13l5eO}&K*@RlhLnUV1?i&vo5$7v(c~2I+>0* zfTkROdmgC0z;!QSY~1#YO#lsac-x>AHaCGtQU#u*f9;Gw)H{eMGu*EYn^o(n$-H) z=&~;p4eC?T$Qs0fY>)l2R6}g98XA^<<0QhWHK19F5)E1j5Y_KG>b+DJY2iA(dT0=T zaJDTwNigQ7Tm)hxAkN|wkgAL4HJn#FE&ZovRQw#qPK@9yJ8L>G(~RclADSXd4Pqsl zQjC8kS)xqAKrEpMY&R)h#|AuPbYdoe%y-)9BCVi$E$meZ+*L#s7JzE#95cau0KK-- zk8x$5eidU-`iJ>EgUA4{{-lpM$CTgzc1}BqOpR)UDX)r%!&!Bzq85lY-{U+hR!5GZT<^9ClwLcjs;-Ryr9*ugXm6C1sMtWfSoHmP=Y;7F`(We3|KR2<#XF}Gw!0X#ixLpZ`SXV^O~go0zHV^W1T=y^oCZ}s z_XYlwUAfRiBNq&J2#{Oi8nF?DTrNLyLJ~D}48}Ke%S)3@3zU#w@rJ<(L>`GGhNu*! z7?jSYRJrDh8W!Ak79=`zY8B@B>^Q>SsvKKM!4FtLmoaoDWYAMsRv!oq*PGxRd9va4 zw$vCF#g+2gk7Qn%4!+oE{^6a}2Meu+9TCJ<&UMSjVx%O=#AM$zBSg5ha$KLjP%oEB z>c=qW!#|G&n64M0hV1Z=i{Fa=A%gs?^=iA~VYpu2Rzh%S@}*YDjqjSgcui-FVKo8m zuw9+*R3C3^Y6gJ1%w(mQaN$6DhId)jTtXQYXK03C;#P)IH`#^RegXr5JWrJQSz6&l zdI$qbSFm_?gka9M{Yp)#4Y71bR+|BSo3A?i*>?N(GNQVQ`~M8;3JY2*#tL*L32aH% z-MYR=?OOsdvKB5dtV<5unhydOl7l!*sX5J*%pt!bY@v<#auj~Hut?h6r4TO_&F39k zH)n|Jp>5&j!99Uo3~ziw?Uz(_yO7Uo@wgi@5_a<;b`LyhtT~4dbB8(mhq-r$d7qB* zagPdUj|zE@ie!$8b&g7Gj!Hd_%EFGyQ;#Z2k1AV^s)moM7mjN7k81CZ>OLLU<2pQ4 zbZ^V2If0YOnlr&RL@g>rt=-ATRdyc+nycoAzzGhmV-80<-R&|l*Gc3(>%+>%mT0QzlzY z;-^oRS@US>AQ^a!@t#*E>sdsnX|YhJ@?r~mF=z=_*2iooSS6y(GpAMx=M@zKByIrm z%gNu5m8wOt0C%E2=RtT!q9dK&-?T(0HqOcneMi)VfA>jTgp)1s#V=Jd&ez3mZ0t6s zd$Fv}Q`Emc*qkcr_rW-blfMA)9na?3Lu5vYk|5$QZ{m?_R20RTql=n~d81n_^p z!lEO>1zdbIb-`Qviu8xk9Y94@EOBa*Ay>ZAnIM5K+D>hfqKQmYzIT(O2X&LHTmrr(^bBsKs;Ge5^gXX zH~#9`iI1!JkbLl>SW-&Z6(`!2>i9}PSPJ^4biuJPAo1eL9pJ(fC&?@7_VaEi-b{+~ zMoKwxa7~NgM`)J(%Bk$jpfb`> z(UL;&Q5#aT&fwKpZV@k0j+0hBkXB3kYB38+6eCpEGVTGMObni$!k*zEz0~%5@5OufvP}Pg zk$}2;aQa9voY0}#XmUlO7=K;Bk|z`>l@(kk8=~dq*>ts#@Ab3Oi!b43ZpkZZL^c}g zH3xVMA@hz4D2PMBj20${VFn~Bos$Godb^?|f+_;=Ze1YDu zY~BszPkHA}`3G(w8}B?%{rnBN0=D?;)r;HlTD}9y8I1@QZLRWkx&$3~zS&z(%?JwVdgC#f3a#biZV97d@#Cqs0LCr8 zln8}BHidrGC$N`ap}X4HmyGdyC%M=1eo?Vr)t8C$m$4qiCMnM57wn&^1aqzBIahHx zi`a9EkB6?3DXx?eu75=YYrXb%j`t-`gmNf7AlZzty%l6m^eep$ z^S$iHP4wR=&XOVbx%>BLPwci%OqRVJoWC6-K*hQIkG~+zA}G&vD!Ft1{+&HphyI&% z70{<=F=upJoCBS44;Y051whlsp6(A!83O-{qFqo7hLvD4x`#~V3I>jMBQoFBr8fq` zAQDR9Us8`JBh#@qfz+u+;>aX9iS#eXrBehw8Ljj$ErtV#gr=|sE=uKd6?{Eh@29C6 zGf|iru$ym=rb>}SJeY@@DTF-qMk<+0<|(u)kSmay6z*yU8&T(Yt)Bm|taSqRIE#gv zD^0p=atcYxbqe0qc!5M7K4}Zb{pD2X$S5*0*mOftDZKtKDFwTKvaUUNQS=L}22fcn z7laMI9F~{S&Do3!ULThY*#-!%Ms+cm}m>1YfO7`FAFHg{*3vwI#(c? zeTGDKR{!W$J5z>SUCUe|dQRV``0mK-_`dt@$kXjv_x8O!pBT{<3iw6;Z@CQUYmCTE z>US`fM)DH|?Ljq=>`-=Hbl-Ty>_-&Im5LMG{I@iTY)3jZHRK@)84Yy7Ci8HxAHLa7 zN=B_h35yDRjHqsJK%p3C;?i^k!+M)q>`43Qj_Bt%$s#fFeePljX@zDg69vx4xFj`B z>JnwPF#hdCs952HmDziNahbrzM_Zm~_3`G9&<49EIuW$jjWj2gzi>~&rm(_>!!f7= z7!K1AI3dc*Iv6W@D1LY#+E*;_C)0^CS@SNVVMu+^=?hL!iY@dz{Y4bO?QPH4YsxN|aNbZrsr22R0f=FYO zawJ~wE(qtLPodS|Nx^6ICKGrnwE~!ky>iKqXa_Z7o2(N`jhQJ#43YCl?oKTt>Vu~a z7o=GyowuCs=S@#<19dIXM1joSt4N2hO%EClEG?+WaO{Kg{)!ia2)fzq!>`UK7uxd- z?!&pz^~$1=2AyyJaT2l@O_IG1Qzr2lC2w!KFd`4WtMLZ>K$G07)sqxtgwLu)`ADzm zGcqID#j|_|j`LHbw=a#Un!2Z#6S{wl8W#kwPq?PrBmQwN%hJX0PTBkZ_E9Sgu zvsAuc(5pplF*#f^nzQySNSqSp`@*aybmUhQOVs|RZo6SX$g00x$h_Xhxx|S5xSJAy zbRf0?`33;1ImfnX=W?C3jTLJ;3+&4}_&}x z=$3vUcZ#Q~2S80~ET^%m(mw!t0D>f_w?(5tQrN8DSdhL^Vvli3gS2L-#EnLQQC@@8 z3gucRj@wvi!6_V{i=(0ZmZ17_X_N6NE*8x_u7ac?sMDOP0ko;W>8qzu;m~s+4^f{{v|%J8J8cozM4(@<8Ccv&7e|EOic^(Erdh* zomKObA^;0eGK@9xXPHN!To@^d8e&cd;x^F^iIr#JgQo+tAq9aEw$ii;(-!#2eE2wt z?!1d?aYyjQP;5JCWrMH~d#w_Z<~YTuPnwCO?xh6AqY@6Tnzy^y`KTBWIYl4!yh84B zrcl6$lGJprScvp!!z4f56-ekeVnnPLzG`75FjC`|LPr}}hon%uwibF>Wrg98RNB!{ z=?bYt({^BJv7c@U`cCIElxU=`P~1^?TZ=iyWZ1Q$oAZ)V?Z(4oj+3}BaMWDoW8kRI zeyrCg!vIdgxObmM89k|&-)vy_$weglo>9#II`qm4A(h_N{85+yHm<5D){ zu&_8(aj!k;v?hIHaTJ1I3*H@W8TsUvG5sMm6dhIr#fXxW#mkT2(vxQ~+bld$QgTX1?`eb0`dHuoOy}PM_&Hwfo z_brI^%X__767B{4;i;tnXz z?6EihE_Q920=A+3^*E-U>zY!Ry%*}(K4FS>oj&1L%9X{>7VLbTh0gLtda<3!%l{^q z=Jbo$wH{5HGq_+U+g8xwaVmDft@v5Vj@*zCM{(G_5<}!bdi8Oxe*ao@^5sB5GNf;a z9Pl-k1P3Kx&n6HAAG0!t@daBF7YtJ1t4sZdrirv{q7UV5R4J$h zWT?EZBs3;HlodKTz>l# zWvAdO!;O=DzSg)d7q4(%>T6cMKDykq@4l`ShCim{XVt?_dnHJb?D>oEG-6qs!YC65 z$Hz)YFj5-V_QJ$t+u=E{Gud3Y1kj%(z24$ddx#-9ZzI!Ome+|@yAV}R&}_z=+qmER zFGhOD%vRu4PMzQ3XQ<~S&i40uw&9~fJGq5FXxBBP+4~x7J_^j3agR>M1mO4B+JYlO z2M&hIGlL+xEIP^yWr%Mheu!#Y?6wM$bG~^evP zX-JpKb;&zyzPIBC!Y4VZzL3?=k*ni~bj&cwdfA0oIbLu!F4wnt?bei=e^3|&FQYUE zKjYRcy}!0mVA6=ZmwnkD(BPC*XWa9Th=WnG*P)=-tqmJLQ_zj+V~*()BKdR9|1hiIr_!;v3Vfn1e&rW>mRpb{ZkuNmk~dfok6Sd%6yko~M%$vGTc>2c+h%>+ChNAK zgxO(4+R^jcj=`tmV3q!VTeki`Xj3qZG=tHDs+L4JfJz}-u7R>I6orDZX|$n8HW;7J zKIGvYZ30n{#0rmr_aviH$vU$2IjtwdsO@~#9_q9z!s6Bl2H>kuRdVDou5J*u=+%pa zlN3^xugl8wC8J1l1ix2kSF5(VDjzl5>68nM%rg7VS1gp<({PeN0PkNX(_gQtA?Rgo zatBD&zI^BF-2orxuwUZ-6Vbmin!F^{{u>FWQS}&GYS5Wq%sm>egd}>+7+%(K5H~EYjKbb$1LEX+yb_&k3TCq6!^Z z<#+8Xv>1aj4WA@(oZWPU;Chh=iC=7wWy#icoB7_K#D$ZYz6m$p9E*hKiChaT-S%7!r-;?t zj(`@oSwx+6J)naq6KyFY8Nqs6(kxf>J8?XpBB(qB2@k1ac##CCwLb|6P{s41LF9xy z=iS1nvc0I{nFDUPX`~H39<9?YQ{}fZK9y9&rkO=PqG#Cj6C`B2gT2eLe9p%9vK>|; z4zdE#cy05-U?Mlj&LMlKcrf27|A@X@lD`zfi!(BmK=mRkNKX}81&1Mbi)68LzX2sd#CgH#`XOxJ6VWl&)#^s5 z7}KfPJg0Bcd#!1r2E5MdZPPaA;mguC7#YRfe*8wOz;HM@5X}s=)v=6mX0L%rbZ8xf=*R>-e@&_`p!u&pTNXL&P!NZ(4?LCOPZv(s_?>a_x47LvH~UA?bfRK`gXFwNZwP$M z=k}^HQPRhwT)wlX{rW{(Qm!FkOayu1AJ@tv#wU=Y)AsW-a;a`uHsP|t<0+x59t6{; zkV15HyiR{%|D`%FY4~%bjVuU6cMF8{?F%F*ig~y zMd;P*nb7Fl6CV9@1KZC}1e+8P-CigOdjPCDIqa>K*bAb|j~ByyTWk$HU;JtmDM}C@ z{(d>bHy{b=3j&~vFCJsPDnwGy97$J>Mk|3`4+%>eK@`6qcRgNLX_f*B>OCqE*mj}j zl1PE!;3b96NUOZ@bNS{?9WfAF68PPP$UdKb2&9FfsrR?gw#}z9|fDB%xjpv zGC@(DnM!;mT}Gs4CQ8SB2Y*JLDnkA!(PFQ@~7)aw0Vy%XT}wq+_89Kd*Oa`?9zDp6DX}oANz80(Mra*Pnd8f2~SbmaI?5hj_rao zC*Wv#!x5D?mFBX>no9XYA18CgdK3y zu3j6-;aRrDJ*klW3Ec}&zL!gsT!GFBLUJ(7WtJ2;*vKPG3#mHFxwtxJVmSfDMv@RY zjKZ1Rbayd&96KTOS&dj%01t=up%R^zonnG$u)57wM)3whlp{4|86mA<~_}qtK9l3C@6n6bX_Q} zoUc+tWzyd9(YCVZsWG;8Fxgv4-#0Lb6_n)H*r&DW<63rPtB~FL0_QaJ>8*TCdYoOT%L08Emjp>mgM@ za%!zSvASG&r{3$t;_0rqwny07LWcp*%o@tbnQh^lPZb>QCm)B?K}&k{NGRpUh;yj1 zNVG8I?AY=gb5@AkX}UA$6{V1RNXXIUqtB+idi*b-SGN;)CI3g2@4pv&&z`fKqkui4 z&EM(w-SAVazF05+E;#kXlDydi=Y2P$uI{^VbJ>)o+}W7l`bel?rdNy_TL~Yhu+FZh zzREEpV->Y^ZQ&3{N#AYbTk3Ihw|t9q6OOMx)gwQGG+2#Jq>wLe4N9J6i$%Z0;nI2A zezv*N%0{s!R%{>FYz8M<8xgT?=nV;e;z}HO*+~LWLNzAK5deK!Tz4efKYki*3@dC& zAj(Qj(0aR>?5?F76;4ihy@lr@4uA1|B%t`o8j-&v{6%u(d|ApZOjbuJSL>ikTS!ZSkl`jG$@&IdyBGI|$?)1cH^@SHM7PvD^i6 z3yf>8_owz45pd)Q=sLz;C&oc`8G01{AaA=iz#G>}E^hsXmv9Y&2p=-FVu@#>xn)Rp zF=?=M%*S=Rl@QGwsNDOQCP=tf9%P^BnLaH9yxlbG78lksjQA23jw%Rl1IKM-?)|Qs z5BIG#h@CFcjbA1a~DDz()2{=RWzYMp!*7TP*|M_@8j@b6&_1+)r zhVhE-=Z&lzHbvl~Y~b^k_x^tXA>=2lo+QpCAA__G+zjI6jLP0L{J{;yTQkvFAwDxb zkd+_E4k6@}3$DDxV;>+90N@MR>apPmcW?yr&ajISStrg^#XkokE);-t^(N9$b}W9 zW8E$~LGy*M`egB~@cTv)!+U9V5NKztS;t4CF}I@aaAM{j*l8?cXcMAOOJgwlVsfzA z;3#7L(*NAn!&=gdwGRhE05Q^6G4lZ98FBKf2lUf=G*@Z-Keqb!OR-z!aU~C5UfW_a zQ)AzoUCf$-ZhiPj>TDZ7MX@!IdZrO;T#zPVVkZBi4g$mhP2pg8(&E|bAM7G^6Ruqn z&XN*{mJ`VA^eF@qX`qkRCxMBKhk;lX{)J`<_;zGmhY4ujNz`_UcYR3#^@+m^iQa)`bobi66GtBMEa6du6dq&`V6xc1o@e9;#%&cy4{gsXKg_Bm$gYvkK4i#hs>n7C2X=rph2WI~ z*t72P@wiI#(=GH}!@eG+#v@$j?Gfa2aOK~q@ z;~LiXWyXgoC6u{v9Pdk-rLI4nECkCKwadN`R_Iig`b3sfR+hUUmB%P(#ywR$aGgfq=p( zJr%<|73LEDYykKfqxRCEW`8AjFtc`;v1+Zddh)3H6{&8Hv98~zmQ>t}Faqfk-b_av z2j!#LKucA5eS%7;Qx-)-k5~iFF%a(;4#9*OQ4|u%Dk9l&AcliCmSF>m2N(>6011z= zn2#II2*I2}U~UI6-?v8B;6}lB(H0Zo39uNO!i_4hkvB#Y+)?1mQBnU=4=iZLl#H8D^&y@7r%zz6&A z7J#ee^B3o=7R2CIU`ku$ueRE&R)9HTG*Nq^P(4M{8p8MRMPt;K; z)KP5MQR>@Kp4CzLtK)yrrh1}ZV4+`4hQC_=7j5cX{nh>atCy&=U#N4?uyfeAb2O`S z{D0A=X`-%Kq5q3EEoF7B{OVd;?OK2SU$kl0uzUai4{f?J?790d+Vu3R=jFd>(+A?- z|FLX+^7|jOsTXDK|5~;%{~u_RD?C=Wmm2R(AM~d0XH}mN2Bsu(BeOk)(>L7EOexBi ze)Er&qkXt$m$>vsecUIwwp*md>iF^B2&ZNT(mxU|Q4W?Cuu&6N!fg?VMh})_5KoGe zOi{E&ejK7RAORUt=&TVh6cpoj4r#0nZ4{8CvoUT%}h(wJ1L?;fHD4&OB@-Ng5k@lc>2wc3@QJk+t(b#x?{n1=5J(@%rm2__<< zi9Y#-F7-vmUV|+uyzuUC0$PZg<+ z&Gw%n=9I(zJuS{7X2~N2D;^;+CGW2Oc-`;?W@VxUyb`H z%=dD_XXnNrm(KtC(hH5|{}@ADlO#~5*@`neU3fhWh#e zeKwwZ!up#ZQ6s@E`D0$H5`{#eSVH+#lC@J(qee|7W&(wHo_kkSzf0QXuQWhh79j@P zlY7DYuj&`q1<;bb9`|2G;ssata697#EDY}kZpG?%j3HT}s7ayZuR<#vofip4_KnVK zeEXHrQh>5zDfbctPUYsW((bN`5Ay)+yQ)fR`BY0O&1n&%V0mI*aqVLW+zh%)SL`9S zN_LI%e#kOif*REcGx%SBg-Ay;>MC}EraVnSowybqyjIt1anGrSRy1~JPI)T{#+Wim zcNbBw2u=jNp2LuynY5l|3T}rn=3Gu}6m(w42VOU{^B>vFzpxo?nGp13L11LedTAiIS$|}Y^u8wZQCXWi(}3YO4)oLr-n?#t1&Huw@N3WL#dvd# z+YEwZo*Sk{R%%9}<2R_V^`PzeA!Q3EteH5rhSYh>D!&!xvh^5skx*xgnAiNZ*{ppL z(+1a?Y2R7*lci$mJlVG$lhhrHFl&+SuO${X-8bkTyjSl(?%LjgWcMwka);_^?YnjC z%Sz?@WgPKT$Upl7yL4=OQuiuazO?Pz*R3hTUfK|KNW^}Sd#YdmtT4e+8{1~SXA!&C zS86}tu^-^!cv9+e7WQoy!}&_a83TIo4I2*+mk)wY8H(2W4Y>I2ljquSarE0l(P`J( z7%k-O4ifg}GH3HO<@1PBE8f?8RJjqiFC*^md~uDx3n>pgWXg`L)4tm-evf9xv6J}D z*}A)((O%3BjEY}rjC}{3j%-F;YjZt*`Fqxm_J-4zdXLv9^F%IbKeTQA0{Y4 z0REuUg8+GwpXhQwS;a4&%6=fk1#YzlB9k3sst2%LyNW!aD>(p*$bp08zyUKPs2MVT z=OG$f5HKJR1@IF)FX+|@s11dLiRp!@@`uNF6L3NEzm|u784VRs#U1}<0U|s({(%Od zK!N2z!I?x-5C;l<1zO^V@S)#mj!LA1B7OOziAth|A0oT>`+M7N-BxZ*x}#FcaZ_B- zUp6t9#3raOr8DtkTJ?Z7q7=61c)RqFeYrSPySQjj+!_5AZeC3Nx@&-Hd?0$lIX#a2 zDdu(e=v8z4LHdKo8%0n+ylRBGnLtXMZi?)3ngKx?RbryDK$;pu@_V_`XDn6jF_ljL zNn{M?Vd@gu1VeFx)Z_5+I(yD^R zxQr#T3MC|&{YpoLAJk7adIN^wFo_?2&*iDyoNzFCU62h1!80r{?To53gpi2%!yP6V z%O%n%=SpR0>?x$O7SB(C?TL|l=isEkSQ zic`I^@;wPwnel%Z`(Vwck%IdWLJ4ZC!|7tI20$H~(s*e3+2|3rz>gFQ2Y$L2oTf$3GESOT-#X2@MgL1)D6fHCSxJk5L){Rs zp;PN#i{XDPTSnhT{)0CCk>)f0zG&TQ?70!jXX1TO(rV&+KE!AG<9@HzGyn?EZx)C^ z+h!L0{CZg&g3jt`9!Bz<>s|GFt|4u=i=8JCoF$h^+N^*U=zwP8a5kwxA|3T2h~BiM1Db9uPr~e7;}gW5 zk<@FEoK~VtGW0A<=g$FTpsf3fB>=Z_RZx6L0Y?OQ?1crjF?BQrN@N2}M9{#=f%LHS zFy5%wfWiW$i$HwXf?@n{>$I64A+p>ziq0_V2sbDp#F-DWoHq|uhm+@IKQ_mAZLhlm zFQh1wDIz#&F#tjFuoTn4VM@2=sJI77oK%QOlx^@Z0_7liS$y#3CymVWh$1Sak7Ib! zk5vh4lvsCWL_U$cl&K$LS;oy2RO1)HRZ3DBzle3d@ACr{m89H-pjwEdQXi2sUj~S* z_@(()W#dD{LrAUhN15{FnO&(5$%@Tjl_SODy1e1y>1WnO{rS@ur@2H`kJhDN3=+P> zI8aYNBd}YfVr5mxc~WBx3Z(~O>=dYbZKz3Y``<*lqNw6VT%+*Q>rR`DIgu+!NHYYf zk9}LY4yNHivQn~*5A@ixTR7Qqtd*FdNodluW6!3yxz6;d7pL-UClbe(ehH5pZ$TK~PhIEE! z!P;drYHqWu17aPAAO#~&j6yc_RKWU&u*sl^_}2au9YP5eC6c?#_EdmnlG=1qO>`w?|tQDd) z{6mMCSLpL5p1OTz18lR4)UK%#-uTMIik+CzSUQE6+m~S+ZGG5QwAWD__DiLvKN-gbe}*NitDj_QfLzt>OBO!kkBYws{E_6r@iU#+ zoxUdO{YF-3{$89@6XVQEm_Hy!<|x!r-HKVSleQkHNwdGf+{J9Dtjb>r4TDm_WkWbe zQ3(cr7ZqS&RY~e3m0ad8C_~*$QS0ueRu)=^zt?{6axl4HS?u}bQ6DPeXo0u7G$P{x zPU&*A;agq)6XwxWBI0DPySlPC?9tNP<>c(Sy1Mbnvu#Mk*)?r-?Lfw}W4_DT1ASul z6m9Mo&ER6{7}39&8emr*@>gGh>bd1lN?9)=cFHcC_m6w~Qfr&vkTXoMH;y2t$U;1OrmF#6{wmMYXb;)- zapQ5wq5$!Wc&$LZCyG^TiL3_`rQh$mztCKQG6(*66SA}=Jj*+1`Kze2DaG^PSxB=a z2oU9?Jp(2x&Z~E(L z-T_{sZc}WXH)L_IZG)o7eWa)6nLjPU&c{T}SF68{(w$WR;9e3x5`$o}tIncgZyyo( z-N+su!&`f4Z3e_ptr*d6#Mlt~&V2J8wj$B3(B8z!K2%nP)OWm?^;x;~HAnV=GsK@d zF!6-jKO~C7Y>RhoV*G)WU%EEO*5?OovfH}l2ZHjcr9d=}666dLTKxU=ehiE!`49lb z_j&~Pr-oSeg0+iZw$J_S+@zvRlF-p#iQL$dyut-s(P*cM1S^?Mq=X_ZP_)Nit^6P zPZ!BatgX+Us;rno?3)TGuh`#JfvhoHFvA~FixvkB2k0@1F=uV~GOFhnTclS8dS#4A z4NY1#6%&FUn+Bhh!k;JqymFJ)Rz{}o)m7WG@PQN*-X@wvvScElH#(6qn?pvsRojP~X~a~=Ea}7g&4go(hSwa6&y!0K+K1UZgFUaD zEJy0Y4(hE$)gosekYGN`oQ}<}Mn0-W;pCPb7h9p9r8@2I%Os)Ij%@bU2mxu(W@{Xb zYV@vX(45Xf2cBk!f;2qKt2w_T^3#AAzT;1ibId*w%4gOnV3JV!Fqvi(2<}FsE(;L$*(*f$C%SJ(o#JR6L?6wv9^oZ%S}#X;zp2|B zpUsa42;JnbyQ!27d|3QRqF2wb6bv6F%FN?SQ|E^h6Lq?nyQCLLA~Ex@6vh+rdQ=Bh zi1|QNUris4;2@ur43E^vj^Y5?s*w2bn#K(bk)3AeQj}KTtXsQa`+&us{d*aviaPgp zS)r{S1W`)6WB_nhtYe>JRU?rk{1!=$_UwNf~MsUTH!*IDZpU%}zr{yFu zq#@$f_c^q|_v*8rOqOL>$t82L`3z9f7k$~dz6L&UUlRI_bNi>Y=SsxY4w23`1xK9X?i$cW>m!{O#3Fx)F$R> z6~fu3qfb_>c0>k|M)spv^+`R>x>0)JVoZWLe!b86soDwGanvqB4xMv zzEH-+Z}VWgZ8^hjI6sSam!{#hD)Ol)C_Eoa7#3@33cH z9=oz(yKMh&M=GLnI zB%pt-frsJPuyrdR_9Thgj0M77>i5VsF!_(=1edM(8TR=EY#7b?^>A@q%Qcunmo_bv ztf%%M`8I;>HVz?e(MfIgcgZ*%Z6M1GKEyB1&U;>~HZhhq`-%t7rI@MD{0KkH4b252 zKeW#}VtIK8pi2K`p81lw^+n|_D&SN5Pn#X4RO?Jw!UCZKqsMkSWTY?^2vl3eBD6&y z%;dna1`^(Fn>_*Pyb#E@WQe=lM+@evEXpJ?>M+R=v?&*)Fgj$jJ51~Dhk@;FQm zI}G#S&n~qi+&!cr{34a}tFBQf8V<{VJhX8lsj&7}vyhfLseSl2`+C^9a$3wbDtj$* zqK-!Ugvq0deZkthj9!~ICn0H61Mpj;^aKq9`n!^rV3L-?c)fAp5&W44*& z0k;A6M~Cjuww?SU<8FovShihi{CDG6Lw!|$6&->4j@|r@V=cnttd5YjlaVpU$<>ns zh~qrdry(>aZhwZQq_Q2w?!D{8J^pe7ORQ;cmDz?aj}piarq2uAPSC~X_^qhydH=D6 z;ZrIVr)@0fRh{nbmVI7W(PIM9qpZZ?+NgP&F9$^=kks1ylf-l1&!?n+&OFY}W4ljN z&)P}PPgu_{SUXz9dm0TypWS*`EBI|~l0v<|K1q^3qV+N?_oN4&KRNWg(I!IAdLBq! znm)_i@ArJzIETaQEgsE9{5t`AbIN!~3GUO09}U)$3k}crx*tHdft> z6&HbBCf3|>!SL-8DZCd+pbu56PdwYXBR+U~{C5BZA<-q2sr?dT@*8PsJSBn@rja;S zH6e!46_uy!owzvd;y1`e-+N32>Fi+MBD3Kai2KPkLJLx2hl8@Eg}>?Rv?KSkjwCW8 zNU$Q?8=N=V#;6wZg_@Z71HZ;*rLk^64s(ZACYe?Ry+!1Ds)bv#ayL?C_&=MPEJ zCX)vw@d1xCa@DI(6577vPpOZY46&9WbN=n56-wtp?*<2A%vQhvy1pk13XE zF~6KM*xpmvwPHH)-35R=a1l5=^#`5k2A%2dQ$E}aYkA5=-zqapi|rm5ds5Or0knGI z$?uQ7=!TTbJOl1L{r(Sa=hPip7dG1N4m!4N+qP|WY^#%wla8xm+qP}nwrzJ@C-3)- zb9?U282b;@#U88ndY(DwPj}ghe6-m*KEv}ZlmtF_o`&NaYnVW?<3wzxQ}F!{A2f7qeI z)6JX0d1Dw>c{sIp_>cE58g8!|hhaYaVRyE-YKviqU@xDAa_{`NhM%?G6=bcT%T5D{ zK76m9YuHF{sQ`dfG~EaQO1hv6X#jB~icBi(0%i1g#Q$AtSW>DY%G=LnWOVs`NN^ z=mCTLnM>w7bnt<6?~?-N+s}|5H}P@AIEEkiIomphQ)azE zpuT)$C`EE<9KTrxTUm`1V})e1)KZ)eyN&4$h8nc%skI^%1w-DYRZ7(JBw8sFTiGha zJt54X%kGCa7a2gtG(n4+yPU4ud>=3U$<{NVGRNI9Gl^ve{X|bh(0w`*Mk)^mwTkWq z_ti$5+x?ZEWh;weZxB4KSoqWL`Jre@S%!~)&Szh`sCErF-eTL?SiQ9&yLSV_%?eaj z&?Fm|>0E+hwnA5$+v2hjM5oD6g+8`I6xT0Ws2|!VO{ngYV1Hr2q^$c)^RHvM zFC`RXR)@z)>2Q|U_J~S~-1hr?s&CEhKRx&TL^plUbMl2PuUjV;10T=^<*X+B)^kORk!5*Bt&wf_b9K2I6y)?7lOg>eTagxq0o&@l_cZke82DcmjeTorm348x^)}7hBD5C`QH$zT zt)oX_cqO<<(t;@@rT)IpAu&C&weH6wl5>NyGQ`4!u77> z_=m;5+i_{h~VNuY_=cyuj$wwG;nf&(o44WtjdO0iZ^4mdF*x}Uzq1_2q&M^9{lji(ea};tS zXCj7OkokuH%mQ_!7=T-=C$g6m<6;?v>bCkz)KQcbLg1V#;~TMRg9$S7XJ8OEb1tva zb27S4O|Y(iZknN#D6TPhD36+v1kbK$%D36C&vGbaM&kj80wi|6_fV9^y*`R9u@Dq& zV`xRGL3|1)Ame)^CgzVJ+_2g(-&SLc=DvXTM)vmsLtB*!x(S+igIEEVe0O#6yBT7hUt{;C6;Bw)MwlZ9|!k}Z(BGH%AY1bbOnP9=i!pEni!CUjJ@OG1;^Dm02Y7Yfik;lTPtFyrZ(r6D(a^y5l zVRqpCxI;T3ZgFA7ej_5-Ti?@J5{O}Sb-%(zmV=~9v(TOy7I9;u5dgV6Rc&zB5^?@A zmFzLKVg}Hoy-H!3dTp6{m2ZDJLS(GgrG!Q<%3_I>JZ<9&%wn^~<5$_0Vjv23wYmA*n3`IqM47JEe$1dYM;t7ai&Q=M|BtuCUhW_ur6b@pbt_D9-M zA;)4vko=`CYP%MLaV!y>oS6njUV7ykSRi$Wxnpet(oMv0y3kpW!^g?+&W{kL0d|I! zxb(zA7R|!&0ETbD(wjkW$pnLTBTkLw8=CCPT00+=?&Scy^EAx%YdHqD@tG~vPR%y; z1P704S-pci&hEEGH9u7@y>IiHJ*VQ=f0D}$t~m~ou8`oY7)jK%Mu?NR)ndHq_c9G* zb|XL?j}gJl8EO%>E&cBAH|~rqdnnll1L4xQZ5kCu+KwyzUg5QXRAFP(Y?xu}CaG{A zIOE8Pl#w)+x~SL*6HLJ$L&Ql^@iw{#u*X`JDp$ARe%@vYP^m-x7sk|v-x1A}#<5xe zgJczJ&}uDpLrQbjw10&cTt-BMA$n15(&H(pN>eB0Tv;;?aL^F6J;auYR|*~e0zc5OZ~>nNX8-g+%nXGTb-G1tuh zMBXiJ)-9y5gk0}zlL2NqRe`M-v$9k3n0uwZh|R=nJ`Mik2l{3Z1)@AjLKzb>ddV|L zoYph)?1D-HZK3I@alDn<&Y^038=<-Gr~H+bD%$3zTC>8+$v zd!9?0DE}E&YTH7&y=&0cJBj2r51?)8aY{#T9o~;;h1~b4#*qKayt#37P`|2KGwsru zkf;5e;9r9v-F1Yk=UU<9zm#*In;PVf-ORw}0Ycx)2)ELG_D47UE&NE15czd9J=y9B z)GeKiVUJdU>6vjqio@^U|DO$@z(N^lIro~}{!k=R8M2WZgF)a|1ISzJc5f(}i1Lpb zR$YN~5E*}#F19n-csvaVh(aEN%41lp^x-jzTG*S)?r^lRT7M!E2k!q_4^%By&Sy?! z!GCSAR7;Z$=BXUJx1K2yYvp(-X`m=`x&K60Ek2GRt)&<>W)Ih(|JCd$J4QZoYP;5G zw|xZB>Snmz_V*UyQ!C|ayFCEY#6|(XFI&l z^1JHl5Te`w1WLw#c)9}X4pekloFOG!J4%&E5rX)GzcM$MW%`kyceP(4#qGpA(p`N6K3V*-K5C`D673G0XGL zDkl32#J0%t!jVDB`};{sl^e;UqniPQY_rTw(tj<^3uKYWCJOungT)3%zmMk3L=mI0 zEG`0lf!Sc4)-+{crDHUepcNdOs`|S#+NvL?V>Z==pE|ZRAA=;(Isps*>b#&5RYlAU zHR}?pDG}OAp#`1r$|i5;H(TaegtyZI9*bbF+V&Zi zF*CPy?}iCsE~ORuK@F}@emDrW1-(#=kJEkdgm*V757N3fz0d{|HT_7aC(MJyCUPvp z=b3PIgETg}&ch{05iAp=;}dntQ91chEutjo;X)I5Dxrn^AaA=FFnIowS*bU;22v4J z_{Mx`MZL#)NfY|VIW1p{5LPMzCS+_G1|5XPXw$kQCYc+v%QUEC zYje8;->uf?x&v<~;9TDQ%k`YqTps=gpS2%2J?XA^@0y2E2-!*+698`B)mj4Kk!9$e z%Ua^WoRR#=ef9vH;yDFRMew{Ri=MK&td>PczNozSZM$X!_5nHZ$5d2>`R7&Xqt$Vu z`B=w($tm4WZ;uo_j57N1^Gub4eLM}jIeZAMgje%NZKz)JzwTHN?gK70742X58Ha%J zXDz!U{Xd~qLe_0eS+&YGmHtltBboJ*@OdfoMTF zKgmZ>68|Dv!to8(rznRaqKpJR2pNg0ag|`iF|jfw>8B} zdPD3IBO6F%ph7x@h(7G9^2PPWe(WQIgo1^>PFV&>QZ{0BWi_^s-n~ka((^ zbUMoJk#CoFrJZM9dI&E(7b%H?1B+EAl9dGyE7)}C$Zw{C*CELgO%RY{CdgfP^jN@b zcG_>Mp616Ul;DR)>n52RDJ(mcKS5e7fJ2P~Z4e;-U4~@5r4DP5D_E`p5GJ{zoV{2f z`I$rt6YUFGKw@WwAy0#p5T#OhZc-|n`h7lj>Y-rV7*gSwGCgVOFrWC*O4>hdE)iz9 z#7fv&PFhBl6vDM6cil?StZgApf3cL08@#b5A1*lG=9&%JZcNP1p#@P|fK6h5sf ze7oit#Zz^};6*x{m*!MaV_i;gxn-m=zWPTXY(PsqXNypVD9Dz9z@j9GPw2i$g$_Wn zVk&I|@#EL(ToX}~8NR*i_^-9kKSb#VqmBl+>%x;wP0f>+_MqAIV*&_Rr|AlrWMQ%779x)^A%nm!6* z=77+GUC4EdK|*^cfFh|0DyzE>jk#0*pNv$3`R4%+4x}jIuQCv35Y;x)wy#Vqf~V3o zqN`BYeV4FoYFlGAO3vf*EfB8fXFmxn699j*M0FWlWo3Bxzl@ z!nnsnLLmw&v)KEX?O2=0Yb!eaqoX|=9ET*Zi8XDp!h(agZQ4%&kO84L&r)4ClOWMh z=<|9g5o%!}^pz&fdW_Chm-+ph6ioipu+1;Sh}z2&oR3d5`mbIBWvPCnkS;%x*1i0a zblGF&dZCT}o98_4YjMpl9|4nW>!q=wM|8Kz2>of;HDqXxav(jD4QcuknD(El*2_x? ze_qKs0=GtJw<}xL^v!8smzI703y)!(_0y$4_3fDs@i|~(Q?&$?Gar$E+(Zb7A|Yx+ zObwen_YBX2$9riLZY1b8e!~+k_mc|THY=S-VS&0G^f~nLf>}3qkr+b;sx_Swa9P^; zj68;I?wn)4tdb|?FM|$I+leO|UWA+|6VeLz@reBU#ES?w#j5m_d+nMz<$YK_vuGzY1!1~c^+vfSYqMn0n3-d}7!_a`^ETab@)CRH71}Tm> z9hzI)X$F_?={n{HuRWpaVFep%;TXFIn`t54qYzkW+1hZS+DU~N8-+Nfp#6RhmX``% zKMe7J3e{~fw0;hClXAoT4gi~lL;jO!1FO(2;;AST z-GO70qUp~7{bwL6O4v42*o-M!+B0ItGg4LxX~juc$}{rc5uQ3O;1QAwxDjHhWq5)m zuv!bPmMa`VIXq4)q5#S@84R|)P!dBGM)v`>xCZ{Kc+;YU$j2@NGKBjdG6Xu>kT0=L z5H`>|C>Cd%II_Tn&C574^KazZNaPljN+C(qfo0T*B^L2WRK#x7{P*YuuIS~I$n}-T z?Uv|$t*B$H(6eV!!$E0qDRp_#F;l4NxMd<$`E9*pINiCrgvk4P73Ci4w>Z>wf{)rroiFz-I zM%+o2T1lKPD3+y3D$Lg%m$|EPfycNQ+5E9c@oJR>MhdDK9G%*P}Da9i>EH#;8HpS*NSwkABXp|>WI=P%X zEREW-@w?3Hh#Z&`X2xHP?ib})t9XZeLiJvbE@rB354<1583QjsM%N6Y#Ek1BqzMl^ zc<7ATRg8Xa#6ggDW~p=LcM^>C({w-V)H&*`g;CWdZMYR+Fio?gT|Z*(X&lojV*U%F z*G*<9Qr13n_91ol@hJMKG~4uO)(&?jm~d9Ban=|&GHb2iZ4VP74E~rQTniFh{0y|% zENkx${KgjqWSUtOOWAG0*X@`K?u4g1no9ta2OWYys*^{llSN$?p{SfoAC}vShJ(A7 zONf)lA(Kb(icM7pM?-@laF&NnQ^2BA!0wqZ4U=i#n9t9HnP!Hx+k=qLoo2w44?6%& z5>~*CldE%9KnGJOe1;<`Q=}eNBvY0zH+I>H`y-+(wx? zMv%T%3OIug8!L%gWB9>k3?oq*Z&;c_Q(`q-8uD6Ji&It)Q_3`pXYddQDGU=!gk<=N zsC^@t#)H~*R$2p7mM2pln^xTHS$6a_OUJ1UdM(eUDbLp_7mTG33_~x4v@9P$I$2Rc z<-xk>KO#AbQQ^U$!!;)M5u7kD} zgP3<32O$gvpUaVUR&#A#^Uz8RT~2sjW(9vsOQ$l?bgx%svlNqknn1d;zde`X^>lQPq*t?hdb4MH zv-f(l?_2X<+?D{|mY`oPAzm$j^#4Gai1n7Jx0aay3(6#UwWg%ErnUcn0A+BI8G0KQ z(;Jp~I~ij;$9K`SzhfkU_BvH-(L+eObc_PlXeElD(A9`>6P&Q3{jt^Wx{_kC#0JF# ztgs$ou}@_?F-yAvz1@AYxJ+qyKW)$_Z}GZ`@vTI9W{i3Wc{>m~dbrvP!JUX+cJ*lY z2%oEO=Wy6i8B zdwc3*|3S)sN2=9FVcbV+lP82shar6-ESu3Gzd@mxfgJOLrq_g8y@EQoF2pKsFs_ce z>a@SipE{O>T7?R)pMNcN-sv?mB-`)$G*rFJ5;V{RoYnAK{{dXFca?l3DiC~ z?g6-o9Z*CNSQQ?~|HzNb|ZA+%}UIe8A59iAGqy&5X$%Jc7f00Vy`J z+d$*l-&0TheCKriJIaFBs`v?eb6IWye@$)LP|3JmesH$OM)g&-K{d|cX?T%U)kN{$<>eo-*#J28)&}+LOLh6hX}Vjj!bHvZLZp&I zja=6iMB(+=Le1hw?Y2stj!UF2JFT46`jX4#VY~Ir;Pt*vtpPpsS2Nv}Lfth8Lma$% zLgmeUkn83|jqXFDK2?RY@$Tk(;@U;dT9h5prMT`Jy1`-a=CQiLp|olkcnudk>ryJ-X9Z@BV&>9i22;@5URAvwJmx(LvoFscX>ORq#dz8D6vmg@qa8a zS*`V-%yo5piD!2$LM&{C%#t;%jW`CI$i0>3Fn5S{r-V@n{P%Jo_ka@CWS@IzV-5>X z)(?=5KXUEYk8HP#Cia#b#6BHHF&zID9b7$GW=i5+i`W^}W^?Ehl~Fh-`r1m^+x!T1 zkhOP&;&kQv=`0)SDsSP0H?m1c?8-2FBrxnEeC**&OM=+*WtbkXTg;$b7Zfmmd6AkK5EZ>jjzu!lWn?}4nKD;lF&lmpr9a3Jz zuqjyX!hy|Zmu($_Yh83s`HeF8^=|!T81X+;4=PwAqfPPWTDd&I^>1VI-_`fuN0<_U zOauRl-poP?@WH|>Q;WJ&@s?cCPz4-R1qGE@`8*?TPK5XaLUnUPgQ0@IIQO5`fWb8+ zXRwp;&BMezo9vQQh36e#sX8E+<|rVnXD$K=z0_kK*0}=gm%6L4y5p-w_)xkH099GV z^;uIZhSMU3O}R%T5F=r0N8(8*5MoD3V#i8r$JK4dH`~()K|ef}#5`*yh+P+xww_8w z_tP<7vJzf`-`+#LJm9BBb80`R3&y5RCeRKf+rA`gQl~h1q$gV?x3$jUeov1ceQG#; zN&u#{Q2%pZMdhtUDD8X%bNUH6n{6CJmN}zub(&%$nC{P=(lq+dDLd6Ao2;`m=Uf`; zk~^mZD;E-{b|~Xzs`aIJHRmcdH+$P6w|X*A@wr3$46!XIBlt(;A->y(zXmGAIW_E=Z;w_VK}pr;ZcjfaJNo1Ma~GK@D= zKYM^mBvk-$0ben1v#G++lyj{YVYHYWhQ>Zrk1pXT<3KWraVaW?V}LveY|?vWERL>eS}Tre5X3BjZBbAwf$K29Ecue=943iR_%1`2=nWUaFp$G@Hw@8ld`drJ;>HL0|Fv>IWuo?IX?YanfXay2eUjEoEBqUNMs&mwfrNXqWrqp*y=<# zUXIe;BX}TG%z3Qx<&r{PhLeoI;G8r3epv0(4SA!1&-ob=gE0tou09FNGZM4b<%t2s z31YxYMf3iADu-qa@tCNw8D}tgkYC?R+r2EUi zEQ8rg5mMJv>US71X72wOkuvoNJF2tN3m={?8Wm5S%uP!V2z_%1Z!o@gwlQSX=2Alo z9R(%Da}UTp-**9j4X82imiL2`mFT3Q<3(%+fm~G?AiMu>!TCYs|X58 zml^5mrR4$|`%FWXr+1Z){$2!i?krUYu z$mHL&+oIST0U5o-h`>D62a93aD^c>pS4h^e+v+%52>d6eEU~cxprG6(?k9;f<;7#P zRtzyo+}kK?jj;5+%LQSRDS0l*k1zP2-q_tEWA%!n+0$DT*^f(%=j4{(8#^ZH_63dg zd`HA{wJOm7#22=^@~=gB(KH5>0?q(eguuB0okY_rA@=81?(x|e4Vl`al1wE`w1br7 zF(r{Nu(=*w;3C;D0&2*-xsE_z1}%Apg!d2?8ZE4hvb$uZ^DKtaLSs~BygXCZdJpi2 zjG25v<;3>~a%e(>0@|jj1Z?d~{E#%6wcu*v^tZ!!d0V=I>(o+3qP_~^r0)vokI-~@ z#StTk(k|WKAnA;e;dB>FR1~GbsqA40O?3B&GLginc}|f4Q}A{|jU_ZbA>pz+eOQxe z3u!Twv9jKQ_&9RV+*7yFN<_wG=c}UHsk_AhEu}woM6`4Yvp_qxassm*@G&(`W`Rp~ z^2U4vkk0yp1pS#3Nwt;)XVNX)FRA^i1MGf6??KUn!K*(4s^y6OEAgy@`H`FPnJf{) zG15?dS^T4cYJ%li%$F$mc(K7e9m%Q-0YN&n5HiLPBJ1TeLBwWcrHWL@$i^2M{En%k z;w*KsQ3;}dNIax9bXgLX3c+)iHW5|g>Jn1eU?|j?@uJ0IqkT4zIzig>8h2jXKPnZv zM-CnSLR{btT)6dMvE2BhckJAdrSu|(I0ljPeMzrY`Y?waL)bfv5ZqS!2_c;T;(W#^ z$twet5>8?29bc;jD}#(7P7!8&COFG0L!3iSQLY^(1piis1tFbdg858IFjq$;C7k0D zK^>+PoX{2WpAmk|dxlgNA!Bi|&e7j=%{ol6sWdqvyqYWa>9U3-4X?tJWnT}_&Y7gl zFe1M=(xVBSJXH?M;wxjZA z00ZZ*)C)-QV@y_{ithlL1)Uwa+^~XDTgL=+IC1H)x_noHL@nLInY9)#j7s?vK_$8I zNp^=F!DN!RSHwR~ugO;+pXLc3AU#1W(Tp`B zhU(%8$8U-j-j+qkT1U3D59e5?fvS2{XZ<_n{GCU8>~kO@2^eyIcJnm?Ci#<={6XW* zq6IU/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 z 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

jIk{jl#@gOOfkVDhM%;00Lo~HrqGKU- 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 P3tl^nEsd@jIGy}2)2Bs) diff --git a/packages/docs-site/src/assets/content/docs/taiko-protocol/based-economics.png b/packages/docs-site/src/assets/content/docs/taiko-protocol/based-economics.png new file mode 100644 index 0000000000000000000000000000000000000000..e714579a5957985764cdd9cff6a02b9558c17bef GIT binary patch literal 214929 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%0D*Dd!fs-75@$>Ta|+yFM|LP#SOqMfqeL=%lEM6 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%0AQFx}99<$zPH12tWJmhe_ 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 A3IG5A literal 0 HcmV?d00001 diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/proposed.png b/packages/docs-site/src/assets/content/docs/taiko-protocol/proposed.png similarity index 100% rename from packages/docs-site/src/assets/content/docs/core-concepts/proposed.png rename to packages/docs-site/src/assets/content/docs/taiko-protocol/proposed.png diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/proved.png b/packages/docs-site/src/assets/content/docs/taiko-protocol/proved.png similarity index 100% rename from packages/docs-site/src/assets/content/docs/core-concepts/proved.png rename to packages/docs-site/src/assets/content/docs/taiko-protocol/proved.png diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/taiko-nodes.png b/packages/docs-site/src/assets/content/docs/taiko-protocol/taiko-nodes.png similarity index 100% rename from packages/docs-site/src/assets/content/docs/core-concepts/taiko-nodes.png rename to packages/docs-site/src/assets/content/docs/taiko-protocol/taiko-nodes.png diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/verified.png b/packages/docs-site/src/assets/content/docs/taiko-protocol/verified.png similarity index 100% rename from packages/docs-site/src/assets/content/docs/core-concepts/verified.png rename to packages/docs-site/src/assets/content/docs/taiko-protocol/verified.png diff --git a/packages/docs-site/src/content/config.ts b/packages/docs-site/src/content/config.ts index 35f8545faaf..96cdce61ff5 100644 --- a/packages/docs-site/src/content/config.ts +++ b/packages/docs-site/src/content/config.ts @@ -8,6 +8,9 @@ export const collections = { description: z .string() .max(160, { message: "Must be 160 characters or less." }).optional(), + // banner: z.object({ content: z.string() }).default({ + // content: '', + // }), }), }), }), diff --git a/packages/docs-site/src/content/docs/core-concepts/based-sequencing.md b/packages/docs-site/src/content/docs/core-concepts/based-rollup.md similarity index 58% rename from packages/docs-site/src/content/docs/core-concepts/based-sequencing.md rename to packages/docs-site/src/content/docs/core-concepts/based-rollup.md index b431f95bc77..acf2b80380f 100644 --- a/packages/docs-site/src/content/docs/core-concepts/based-sequencing.md +++ b/packages/docs-site/src/content/docs/core-concepts/based-rollup.md @@ -1,8 +1,8 @@ --- -title: Based sequencing -description: Core concept page for "Based sequencing". +title: Based rollup +description: Core concept page for based rollups. --- One of Taiko's major differentiators from other rollups is that it is a **based rollup**. That is, it's sequencing is driven by the base L1. On Taiko, there is **no centralized sequencer**. The sequencer role instead falls on the shoulders of the Ethereum L1 validator. -Check out plenty of great resources on based sequencing in our [Learning resources](/resources/learning-resources)! +Check out plenty of great resources on **based sequencing** in our [Learning resources](/resources/learning-resources)! diff --git a/packages/docs-site/src/content/docs/core-concepts/contestable-rollup.md b/packages/docs-site/src/content/docs/core-concepts/contestable-rollup.md new file mode 100644 index 00000000000..18f71b74922 --- /dev/null +++ b/packages/docs-site/src/content/docs/core-concepts/contestable-rollup.md @@ -0,0 +1,27 @@ +--- +title: Contestable rollups +description: Core concept page for "Contestable rollups". +--- + +## Based Contestable Rollup + +In based rollups, block building is permissionless. But permissionless block building comes at a cost, in the form of permissionless attacks to the chain if there is a vulnerability in the Taiko codebase. Centralized rollups can tolerate these risks due to their centralized nature, but Taiko cannot as fully decentralized design. Therefore, Taiko needs a robust multi-proof structure to prevent malicious behaviours. + +Taiko is configured as a based contestable rollup (BCR). This means that there is a hierarchy of proofs in Taiko and it's permissionless to contest all tiers of proofs. Currently Taiko has SGX as a TEE proof, RiscO(RiscZero) and SP1(Succinct) as ZK proofs, Guardian (multi-sig) proof which is owned by Taiko Labs. Guardian proof is not contestable and we plan to phase out after the next protocol hard fork. + +![Proof Tiers](~/assets/content/docs/core-concepts/proof-tiers.png) + +**Scenario:** + +The process begins when a proposer submits a new block, followed by a tier-1 (SGX) prover who submits a proof with a TAIKO bond. During the 4 hour cooldown period, anyone can contest this proof by posting their own bond, as demonstrated by Cindy. + +The system then supports two possible scenarios: If a higher-tier proof confirms the original proof was correct, the original prover receives back their bond plus a reward, while the contester loses their bond. Conversely, if the higher-tier proof shows the original was wrong, the contester receives back their bond plus a reward, and the original prover loses their stake. + +If the contester wins: The contester receives their contestation bond back plus 1/4 of the original prover's validity bond. The new prover receives 1/4 of the original prover's validity bond as a proving fee. The remaining 1/2 goes to the DAO treasury. + +If the original prover wins: The original prover reclaims their validity bond and receives 1/4 of the contestation bond as a reward. The new prover (who may be the original prover) earns 1/4 of the contestation bond. The remaining 1/2 goes to the DAO treasury. + +![BCR Workflow](~/assets/content/docs/core-concepts/contestable.png) + + +Check out our blog post on the [Based Contestable Rollup (BCR): A configurable, multi-proof rollup design](https://taiko.mirror.xyz/Z4I5ZhreGkyfdaL5I9P0Rj0DNX4zaWFmcws-0CVMJ2A). diff --git a/packages/docs-site/src/content/docs/core-concepts/contestable-rollups.md b/packages/docs-site/src/content/docs/core-concepts/contestable-rollups.md deleted file mode 100644 index 4d1c9275e61..00000000000 --- a/packages/docs-site/src/content/docs/core-concepts/contestable-rollups.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Contestable rollups -description: Core concept page for "Contestable rollups". ---- - -The current Taiko mainnet and testnet are both configured as a based contestable rollup (BCR). - -Check out our blog post on the [Based Contestable Rollup (BCR): A configurable, multi-proof rollup design](https://taiko.mirror.xyz/Z4I5ZhreGkyfdaL5I9P0Rj0DNX4zaWFmcws-0CVMJ2A). diff --git a/packages/docs-site/src/content/docs/core-concepts/inception-layers.md b/packages/docs-site/src/content/docs/core-concepts/inception-layers.md index 4b7b3d99fbf..ebcc602c304 100644 --- a/packages/docs-site/src/content/docs/core-concepts/inception-layers.md +++ b/packages/docs-site/src/content/docs/core-concepts/inception-layers.md @@ -17,4 +17,4 @@ Further, Ethereum-equivalence across L2s, L3s, and beyond means inheriting some ![Inception layers diagram](~/assets/content/docs/core-concepts/inception-layers-diagram.png) -For more information on how Taiko's message passing works see the concept page on [Bridging](/core-concepts/bridging). +For more information on how Taiko's message passing works see the concept page on [Bridging](/taiko-protocol/bridging). diff --git a/packages/docs-site/src/content/docs/core-concepts/multi-proofs.md b/packages/docs-site/src/content/docs/core-concepts/multi-proofs.md index a0f79048ebe..84be7328275 100644 --- a/packages/docs-site/src/content/docs/core-concepts/multi-proofs.md +++ b/packages/docs-site/src/content/docs/core-concepts/multi-proofs.md @@ -21,19 +21,23 @@ We already know what a proposed block is (must pass at least the block-level int Now, a block can be proved, but also further "verified". What's the difference? A block is proved if it has a valid proof which proves a state transition from one state (parent block) to another (current block). However, blocks are proven in parallel by the decentralized provers. So while a block can prove a parent block transitions to the current block, we don't know if the parent block itself has been proven. As you can see, for a block to be "verified", it needs to prove the valid state transition to the current block, but the parent also needs to be verified. We assume that the genesis block (which has no parent), is verified. So all the children blocks from genesis to the current block need to have proofs of their state transition for the current block to be "verified". +A recent change in our protocol means we verify blocks in batches. Previously, so long as a block was verified it's `verifiedTransitionId` in block data would be non-zero; now that we verify in batches, only the last block in a batch will have a non-zero `verifiedTransitionId`. + +i.e. It is now possible for a block to be verified, and have `verifiedTransitionId` == 0. + For the visual learners here is a visualization of the three stages (proposed -> proved -> verified) **Proposed:** -![proposed](~/assets/content/docs/core-concepts/proposed.png) +![proposed](~/assets/content/docs/taiko-protocol/proposed.png) **Proved:** -![proved](~/assets/content/docs/core-concepts/proved.png) +![proved](~/assets/content/docs/taiko-protocol/proved.png) **Verified:** -![verified](~/assets/content/docs/core-concepts/verified.png) +![verified](~/assets/content/docs/taiko-protocol/verified.png) ## Off chain prover market (PBS style) diff --git a/packages/docs-site/src/content/docs/core-concepts/what-is-taiko.md b/packages/docs-site/src/content/docs/core-concepts/what-is-taiko.md index 2380604a9c6..41ca6aa6ddd 100644 --- a/packages/docs-site/src/content/docs/core-concepts/what-is-taiko.md +++ b/packages/docs-site/src/content/docs/core-concepts/what-is-taiko.md @@ -5,9 +5,9 @@ description: Core concept page for "What is Taiko?". Ethereum is too expensive. We believe in Ethereum's core properties (e.g., censorship-resistant, permissionless, secure). We also believe that rollups should **extend** (not augment) these properties. -Taiko is a [based rollup](/core-concepts/based-sequencing) which makes Ethereum cheaper while maintaining its properties: +Taiko is a [based rollup](/core-concepts/based-rollup) which makes Ethereum cheaper while maintaining its properties: -- [Based contestable rollup](/core-concepts/contestable-rollups): A configurable rollup to reduce transaction fees on Ethereum. +- [Based contestable rollup](/core-concepts/contestable-rollup): A configurable rollup to reduce transaction fees on Ethereum. - [Based booster rollup](/core-concepts/booster-rollups): An innovative approach to **native L1 scaling**. Taiko is a **highly configurable, fully open source, permissionless (based), Ethereum-equivalent rollup**. @@ -32,7 +32,7 @@ It can be easily configured as a fully ZK rollup, optimistic rollup, or anything ### Non-critical infrastructure :::note -Anyone can run these components, not just Taiko Labs. Yes you can sequence blocks on Taiko, host your own bridge using our [signal service](/core-concepts/bridging#the-signal-service), etc. +Anyone can run these components, not just Taiko Labs. Yes you can sequence blocks on Taiko, host your own bridge using our [signal service](/taiko-protocol/bridging#the-signal-service), etc. ::: #### Frontends diff --git a/packages/docs-site/src/content/docs/guides/node-operators/deploy-a-proverset.mdx b/packages/docs-site/src/content/docs/guides/node-operators/deploy-a-proverset.mdx new file mode 100644 index 00000000000..dabf6a58b97 --- /dev/null +++ b/packages/docs-site/src/content/docs/guides/node-operators/deploy-a-proverset.mdx @@ -0,0 +1,185 @@ +--- +title: Deploy a ProverSet +description: This guide will you help you deploy a ProverSet which enables you to use 2 separate EOAs to propose and prove blocks with the new protocol design. +--- + +import { Aside, Card, Steps, Tabs, TabItem } from '@astrojs/starlight/components' + +The recent protocol upgrade now requires that the address of the prover and proposer are the same. This can be achieved by simply using the same private keys to run the proposer and prover software, +but this is not recommended as it can cause nonce issues. + +This guide outlines how to achieve this with separate EOAs running prover and proposer through the ProverSet smart contract. + +

diff --git a/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/classes.ts b/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/classes.ts index cb7a271949e..6100a65bc33 100644 --- a/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/classes.ts +++ b/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/classes.ts @@ -9,7 +9,16 @@ export const modalTitleClasses = classNames( 'border-border-divider-default', ); export const bodyWrapperClasses = classNames('text-content-primary', 'py-4'); -export const footerWrapperClasses = classNames('w-full', 'flex', 'flex-row', 'items-center', 'justify-center', 'gap-4'); +export const footerWrapperClasses = classNames( + 'w-full', + 'flex', + 'flex-row', + 'items-center', + 'justify-center', + 'gap-4', + 'my-6', + 'md:mb-6', +); export const spinnerSmWrapper = classNames( 'bg-interactive-tertiary', 'rounded-md', diff --git a/packages/snaefell-ui/src/generated/abi/index.ts b/packages/snaefell-ui/src/generated/abi/index.ts index 6238c3ac833..f83de706149 100644 --- a/packages/snaefell-ui/src/generated/abi/index.ts +++ b/packages/snaefell-ui/src/generated/abi/index.ts @@ -3,7 +3,8 @@ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** - * + * - + * - [__View Contract on Taiko Mainnet Taikoscan__](https://taikoscan.network/address/0xA5804b2a764f9808858355c1f1832588f47ab654) */ export const snaefellTokenAbi = [ { @@ -37,6 +38,13 @@ export const snaefellTokenAbi = [ outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], stateMutability: 'view', }, + { + type: 'function', + inputs: [], + name: 'baseURI', + outputs: [{ name: '', internalType: 'string', type: 'string' }], + stateMutability: 'view', + }, { type: 'function', inputs: [], @@ -284,6 +292,13 @@ export const snaefellTokenAbi = [ outputs: [], stateMutability: 'nonpayable', }, + { + type: 'function', + inputs: [{ name: '_rootURI', internalType: 'string', type: 'string' }], + name: 'updateBaseURI', + outputs: [], + stateMutability: 'nonpayable', + }, { type: 'function', inputs: [ @@ -581,15 +596,17 @@ export const snaefellTokenAbi = [ ] as const; /** - * + * - + * - [__View Contract on Taiko Mainnet Taikoscan__](https://taikoscan.network/address/0xA5804b2a764f9808858355c1f1832588f47ab654) */ export const snaefellTokenAddress = { - 31337: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0', - 167000: '0xD57b9EE8f597801e82018ed44e07E9065645B0c1', + 31337: '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512', + 167000: '0xA5804b2a764f9808858355c1f1832588f47ab654', } as const; /** - * + * - + * - [__View Contract on Taiko Mainnet Taikoscan__](https://taikoscan.network/address/0xA5804b2a764f9808858355c1f1832588f47ab654) */ export const snaefellTokenConfig = { address: snaefellTokenAddress, diff --git a/packages/snaefell-ui/src/lib/ipfs/config.ts b/packages/snaefell-ui/src/lib/ipfs/config.ts deleted file mode 100644 index ce6b37a9aab..00000000000 --- a/packages/snaefell-ui/src/lib/ipfs/config.ts +++ /dev/null @@ -1 +0,0 @@ -export { PUBLIC_IPFS_GATEWAY } from '$env/static/public'; diff --git a/packages/snaefell-ui/src/lib/ipfs/get.ts b/packages/snaefell-ui/src/lib/ipfs/get.ts index f43218d7068..a0aa7c91445 100644 --- a/packages/snaefell-ui/src/lib/ipfs/get.ts +++ b/packages/snaefell-ui/src/lib/ipfs/get.ts @@ -1,6 +1,4 @@ -import { PUBLIC_IPFS_GATEWAY } from './config'; - -export default async function get(hash: string, json?: boolean): Promise { - const response = await fetch(`${PUBLIC_IPFS_GATEWAY}${hash}`); +export default async function get(tokenURI: string, json?: boolean): Promise { + const response = await fetch(tokenURI); return json ? response.json() : response.text(); } diff --git a/packages/snaefell-ui/src/lib/ipfs/getMetadata.ts b/packages/snaefell-ui/src/lib/ipfs/getMetadata.ts index a402e91fc8d..eb0edcafbfc 100644 --- a/packages/snaefell-ui/src/lib/ipfs/getMetadata.ts +++ b/packages/snaefell-ui/src/lib/ipfs/getMetadata.ts @@ -1,6 +1,4 @@ -import { IpfsError } from '../error'; import Token from '../token'; -import { PUBLIC_IPFS_GATEWAY } from './config'; import get from './get'; export interface ITokenMetadata { @@ -10,16 +8,6 @@ export interface ITokenMetadata { } export default async function getMetadata(tokenId: number): Promise { const tokenURI = await Token.tokenURI(tokenId); - const hash = tokenURI.split('ipfs://').pop(); - if (!hash) throw new IpfsError('Invalid token URI:' + tokenURI); - const metadata = (await get(hash, true)) as ITokenMetadata; - - const imageHash = metadata.image.split('ipfs://').pop(); - - if (!imageHash) throw new IpfsError('Invalid image URI:' + metadata.image); - - return { - ...metadata, - image: `${PUBLIC_IPFS_GATEWAY}${imageHash}`, - }; + const metadata = (await get(tokenURI, true)) as ITokenMetadata; + return metadata; } diff --git a/packages/snaefell-ui/src/lib/util/isCountdownActive.ts b/packages/snaefell-ui/src/lib/util/isCountdownActive.ts deleted file mode 100644 index cff30d478c1..00000000000 --- a/packages/snaefell-ui/src/lib/util/isCountdownActive.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { PUBLIC_LAUNCH_DATE } from '$env/static/public'; - -export default function isCountdownActive(): boolean { - const launchDate = new Date(PUBLIC_LAUNCH_DATE); - return Date.now() < launchDate.getTime(); -} diff --git a/packages/snaefell-ui/src/lib/wagmi/watcher.ts b/packages/snaefell-ui/src/lib/wagmi/watcher.ts index 5572430c272..31001fdc7b8 100644 --- a/packages/snaefell-ui/src/lib/wagmi/watcher.ts +++ b/packages/snaefell-ui/src/lib/wagmi/watcher.ts @@ -20,7 +20,7 @@ export async function startWatching() { refreshUserBalance(); // We need to check if the chain is supported, and if not // we present the user with a modal to switch networks. - const isLocalHost = window.location.hostname === 'localhost'; + const isLocalHost = false; //window.location.hostname === 'localhost'; const isSupportedChainId = isLocalHost ? isSupportedChain(Number(data.chainId)) : data.chainId === taiko.id; const isConnected = data.address !== undefined; diff --git a/packages/snaefell-ui/vite.config.ts b/packages/snaefell-ui/vite.config.ts index 081d527adfa..c0aeaec2a0a 100644 --- a/packages/snaefell-ui/vite.config.ts +++ b/packages/snaefell-ui/vite.config.ts @@ -11,6 +11,12 @@ export default defineConfig({ }, optimizeDeps: { exclude: ['@urql/svelte'], - } + }, + /* + define: { + 'process.env': { + 'PUBLIC_WALLETCONNECT_PROJECT_ID': '' + } + }*/ // other properties }) diff --git a/packages/snaefell-ui/wagmi.config.ts b/packages/snaefell-ui/wagmi.config.ts index 575a4db7419..5d780a54c2a 100644 --- a/packages/snaefell-ui/wagmi.config.ts +++ b/packages/snaefell-ui/wagmi.config.ts @@ -40,7 +40,7 @@ function generateWhitelistJson() { mkdirSync(whitelistDir, { recursive: true }); } generateNetworkWhitelist('mainnet') - generateNetworkWhitelist('hardhat') + // generateNetworkWhitelist('hardhat') } generateWhitelistJson(); diff --git a/packages/supplementary-contracts/contracts/blacklist/IMinimalBlacklist.sol b/packages/supplementary-contracts/contracts/blacklist/IMinimalBlacklist.sol index cd70fd7879a..25f1c089aef 100644 --- a/packages/supplementary-contracts/contracts/blacklist/IMinimalBlacklist.sol +++ b/packages/supplementary-contracts/contracts/blacklist/IMinimalBlacklist.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title Minimal Blacklist Interface interface IMinimalBlacklist { diff --git a/packages/supplementary-contracts/deployments/blacklist/hekla.json b/packages/supplementary-contracts/deployments/blacklist/hekla.json new file mode 100644 index 00000000000..84a53c5c7c2 --- /dev/null +++ b/packages/supplementary-contracts/deployments/blacklist/hekla.json @@ -0,0 +1,3 @@ +{ + "Blacklist": "0xD10a2c799F61A89B8f6D8C695c48A4F38684ab30" +} diff --git a/packages/supplementary-contracts/deployments/blacklist/mainnet.json b/packages/supplementary-contracts/deployments/blacklist/mainnet.json new file mode 100644 index 00000000000..bcadc7ecfea --- /dev/null +++ b/packages/supplementary-contracts/deployments/blacklist/mainnet.json @@ -0,0 +1,3 @@ +{ + "Blacklist": "0x5e3052424E51a62c4FDFf4F1dD42300F59c9C57A" +} diff --git a/packages/supplementary-contracts/package.json b/packages/supplementary-contracts/package.json index 83b8293a862..ba6c6f93d6e 100644 --- a/packages/supplementary-contracts/package.json +++ b/packages/supplementary-contracts/package.json @@ -9,7 +9,9 @@ "layout": "./deployments/gen-layouts.sh", "fmt:sol": "forge fmt", "lint:sol": "forge fmt && pnpm solhint 'contracts/**/*.sol'", - "test": "forge test -vvv --match-path test/*.t.sol" + "test": "forge test -vvv --match-path test/*.t.sol", + "deploy:blacklist:hekla": "forge script script/blacklist/Deploy.sol --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "deploy:blacklist:mainnet": "forge script script/blacklist/Deploy.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --gas-estimate-multiplier 100" }, "devDependencies": { "@types/node": "^20.11.30", @@ -33,7 +35,7 @@ "@openzeppelin/contracts-upgradeable": "4.9.6", "ds-test": "github:dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0", "forge-std": "github:foundry-rs/forge-std#v1.7.5", - "merkletreejs": "^0.3.11", + "merkletreejs": "^0.4.0", "p256-verifier": "github:taikoxyz/p256-verifier#v0.1.0", "solady": "github:Vectorized/solady#v0.0.167" } diff --git a/packages/supplementary-contracts/script/blacklist/Deploy.data.json b/packages/supplementary-contracts/script/blacklist/Deploy.data.json index 415c666f0a7..f0f0137813c 100644 --- a/packages/supplementary-contracts/script/blacklist/Deploy.data.json +++ b/packages/supplementary-contracts/script/blacklist/Deploy.data.json @@ -1,6 +1,6 @@ { - "admin": "0xf8ff2AF0DC1D5BA4811f22aCb02936A1529fd2Be", - "updater": "0xf8ff2AF0DC1D5BA4811f22aCb02936A1529fd2Be", + "admin": "0x7d70236E2517f5B95247AF1d806A9E3C328a7860", + "updater": "0x7d70236E2517f5B95247AF1d806A9E3C328a7860", "blacklist": [ "0x098B716B8Aaf21512996dC57EB0615e2383E2f96", "0xa0e1c89Ef1a489c9C7dE96311eD5Ce5D32c20E4B", @@ -155,6 +155,155 @@ "0x175d44451403Edf28469dF03A9280c1197ADb92c", "0x21B8d56BDA776bbE68655A16895afd96F5534feD", "0xE950DC316b836e4EeFb8308bf32Bf7C72a1358FF", - "0x19F8f2B0915Daa12a3f5C9CF01dF9E24D53794F7" + "0x19F8f2B0915Daa12a3f5C9CF01dF9E24D53794F7", + "0xB9C144ee9Db3850BB5c1598f9b1B03CD68812e30", + "0x683279542eD04d7C60DC56E4EA230fe621eDD4Ca", + "0x29E866A8471DA4f89b4AFF3FD41c801d8027058b", + "0xa2C13a6913D1DF18ff4f5de2bc342023Cd683C38", + "0x5c913285DD9421EDc9d8f1000A35D9bbDF0DCb62", + "0x4ee49B318B785BC358f947BfdCec46dFA12b1Ac1", + "0x6d9999D1aC0027F1E3Dc1e3F154e3366726743b7", + "0x4342F35851fa88873496A49F55ECF79671042bF9", + "0xb226eFF9Be0F679CfB703626C911113513B63bd4", + "0x93ff385916cfcDDA8EB0858276B0074e061E98F4", + "0x29aC5D7972C8B672bF2Ae60eFbc1bEFf48F1F038", + "0xA241038Cb362BDAbd55fDa08233de6f75c764C63", + "0x3d96638B127463e136dAaD12d9bfEAeaFA5437De", + "0x60E9c48A50828c4DC4e36D28fc7EF1b25124e002", + "0xB4c9105B0bF3785C30676D13D210D698Dde84F11", + "0xa4426fA0F0e53Cd06dc41d4fEcF4Bf8783dC5a27", + "0x509BBc835912dF27Fb19837b604b92664A5B8FF1", + "0x08103076D7b1219c7135D89fC0a1c90D26FB307F", + "0x2Cfd96Fb65a990F1b5193992a47e0b6D918Df0Dc", + "0xB33e272E9B62409a53dA0171Eaf88eFef8eE4692", + "0x64FF010064656dF2FC55a3b7D99420Bc4A07c56A", + "0xcDc7306b3c9E0F2947a7B62A137eF90806901f37", + "0xAF5c672f943cd547B7938158A46D08b584c492E8", + "0xAd5e1B0Ed51b625519f81D43117b479DE7e9AbDC", + "0xF8f5811d342DdC2a6320C205856977CfE3289f29", + "0xdd8BD6CEDE3D9eD2D453216df394C5bC8b05046a", + "0x72a2B878e6A909192b0aD91AF976494Ba5143855", + "0xBa5613D19214eD93844AabD24F1102040aceae4f", + "0xaf00a8b4e83A005921D0f878d20006DE0cDA044C", + "0x1a903fe2f732F96bAa7292A05f4121766dD7e07a", + "0xB84F419FD6DC9C30cCAA6ecbF5d194Af065A33ff", + "0xb787c56Bd3c21FB6C18Ceb9a3E49637ab7cD4Dd9", + "0xE2189aa87c1Ad7654bE7Ee258f348d6484F68165", + "0xbdaD5D2d23c0d5D6B17E402a79658f787328ee08", + "0xA189b646c8983253De9eE06C815c51171F265f81", + "0x660888f021BB7da1004869C6a51059Ed97d9e7c0", + "0x1dCFB0dB0D1A774Da525F1200E2c549Bf8A9DC70", + "0x4BA67EC73A7aBF9E015eeFC1979053CE0E56B369", + "0xF46dC57a0d8B614a0e8571217316d24B840ED9BC", + "0x3099cE94b9dDB6715B1169F61Aa0e16ad818Ce89", + "0x24317cAB3C632E0B1eD0d21De1E0a009359B1296", + "0xb692c229A8622Ad1dB19b18065E69B2b6116b9ef", + "0xC478e784b91b19665470CeAaCfa39Ba17D0f6183", + "0xEF8F0d7684D4405B5c51AEF023675946D5992b29", + "0xE9F41a0090fcc7eaf626037003AAD44B17098E7C", + "0x57B7F15C80461E83Ee56daE6a813A57f41E9b61d", + "0x05431cD62F011Cb44Ec803Fe4AC96FAC651CA494", + "0xcaFd650401708ca4f65a22340D07f78E18f8C332", + "0xbB7Cc747f5279Fde28b0878C928D92Eb6c90deBd", + "0x0f883a80a11Ba4057c265ad3a4C0c4e3869ac4c3", + "0xab2ECcf82a5b66396419da7a6e9fbF6630Bb7521", + "0xEc1C61c1c5cfEaA49141C24fB88815052D2fa6B1", + "0x7282aB49b58C7c493F49F2d5D1a723BdEd47C420", + "0x688c0a468ad7BE8Dc2e1cB92cc1b9b6fdca84d5A", + "0x5065d72003878656670f8C67498924704108C00C", + "0x8B59C939bE050814e56D69A68B7c8E485f79f9c3", + "0x38c104275141eaaE188dE0017eFf125FEb87F218", + "0xEe74356635A216A1fC89D4921495124c1533b0C8", + "0x394702830B44476C919389Cb7bA3726a1A885F3A", + "0xBA7770994a63d874127bC6eF8a0c78CCd5174E13", + "0x4edb34De5A54B42cDb88D7E535EC767AcdCa9Ce1", + "0x9c6F685403491272E6CF6258c32ccaA8E9A1ed21", + "0xdd7B2F2b821Ff20ee52A8787b3D9614b91A2b8B1", + "0xE86d78381c4cd7B4a67278e1194cA7bABc363Af9", + "0x873415F6633A0C42b8717bC898354638F52b13f3", + "0xB439b0844D0D9aF237FF37dc2379f07B6CD06171", + "0x796e3F689D8d475Dc82ce801440B184A76e68175", + "0xCe5CDb2Da5A7F30163126388Dd22a1e8084a9ad1", + "0x85204a5E932b69455822033F33E378DFF4Bb8960", + "0x588137e7c1Fce64a78e092611609B259bb524DaE", + "0x6De556d0d262BCC52fc5594abCcBc3b78524Ae17", + "0x52539Ea869f7162BC18f9c3C2dB595f2Cd69f63b", + "0xA706009f64b8eeDE2005546d18d2cbB87DDd95dF", + "0xD1799f7B0Bb7F48b0e997358eEEac349bA776c49", + "0x8fe67f559f6D6dED602E954d45897ebEE5F7FFec", + "0x464E1e588Bb3f49D039Ab8C4D5E33bB47fF8915C", + "0x9905d5753a005cd3e13D71bD030f0B6654703B81", + "0x4d7bF7e16fA37867b4Efcf7c05BD3d889ACB6ac9", + "0x026649F79905E4c5Fa26DafFbD905B3522d37e10", + "0x160EE9Bc0a0Fa051C6fEE189e9107669ed07DB0a", + "0x84a6b0C091c57313E3350B1C9d59472517f60D41", + "0x6d9807d18374F33213DE86917937544A7095e39e", + "0x9c9a2d9826b7c7e95D686e5714Fb0eF948EbC6B8", + "0x6aca843DD19AE4bfA43b6C53fC2e0c3a0bF6a002", + "0x381a0241a2A6e0217376A44C113707D5F9993e1b", + "0xC12B1050553c11993ed3A6aaB6818de7EC4DE4E2", + "0xc3F6b750Ab8b42D0455Cc90cac0E7B1F6bb6953a", + "0x07C35EF7A4AC953F5B8bBC79E6D497d114c38e6E", + "0x0395c16F061E8D2d79DFadF957fFcb97F2D765D3", + "0x6FFE37F348CCB189aC63BfB69ba6B4Aa0beDC3FB", + "0x7C22a14E676657Ebd573B7BE96AcFb21f09171dc", + "0xEC5568Bb595a311D2060506437D0f16Da8B8562D", + "0xea3D4D7f3484a683c39494D0b2A62C83cD52E8d4", + "0xDbd300Eba0F755Bb06DA769A4E1A84E4330068AF", + "0xE7eeb97861761e0AEE35F3e5dE42e1501C283495", + "0x0DC74caBcfB00ab5Fdeef60088685A71fef97003", + "0x45d993393f7B3Fe781935e1155118C7f830d4415", + "0x96BCa503a3ae8bEb794DaD2602202BB5ECD4AAE6", + "0x3Ad16031c0b29A2a6B7A3FBB5996649e39f4127b", + "0x8Cc38ceC2535DE89f2D573F6a50E74a717B45829", + "0x9fE7EDeDcd7DCF206cBe7F00bD23A6e70b398d74", + "0xa58b94936C196d5263b54232EB7D6C2B99A745b4", + "0xd8C860D789Ec1c6aE9631B680E6555F25Bc28331", + "0x6AEF558e7ebE574D692c2acd4C47232fd54e62b6", + "0xea99b1e741779a99646B7F9D57aF0F8264d94020", + "0x924eC99107E0F6fF59Ab33460ae6be9E8A6f5017", + "0x9a80ba749a649B2604d796e01D8A64Cc7B58ff78", + "0x904F40730023CC632c9dF65606dA0809D00D3B9a", + "0x9ECEc759D9F899Db97C6decDe38731f0A9DB449d", + "0xD6AFE7BA2E3c42C6A2729b861F33B54F8b2E6f2F", + "0xDE367Ba53E9EDC9381Ce00cDBba3DB01497E7974", + "0x37C4334EB5d24DCcCCfEBCC54680C433313EB040", + "0x87cCe15D359633EB901889E1B7CBa95c21053C19", + "0xE0B61B1EE0aa4Cb23d8667fda8F720F9f707c4B1", + "0x697F9Ab686b2834ACd86750B8A9Fd9f26b1f640e", + "0x6873a48E3A67E240D62E6Ec510900C0b9480cF8C", + "0x855980B2B60d8E3b60CFCf92413e3E3aF04AA101", + "0x435f6Fef6f7c1CadcD77CCB4ef1AD66C27FcFe79", + "0x735026cA2D9a0Cd24Da088eD3E1853EDe083Fc97", + "0x41ad8DD494057E87cE16dAeb20A06649E8ca2B50", + "0x87dFedBFD4FBBFDb8153fec55c82A983c299e5ad", + "0xEaA132575a13F88B715738562C7c1A545EC24300", + "0x3D3Aa68b54df9666CB6670A93aBE7A80CA01fbc3", + "0x7135603DAF6E50a76c3603582bdC2f33Fc558494", + "0x321186Ed48B0112Cc7Ed232e621d932c6EB84c61", + "0xc1B906579E383bE6Cb1B1Cc737DBA2e63CCEFa04", + "0x9471e8B1903Ef7f65f4002cFCE147b2646b6BB0f", + "0xc3fd682bdfb5ABab39Eb2c92E3411978e0b57E3f", + "0x477992B48247c889d50c9B0A87B2b2E34cbCA623", + "0x049dD5F736B851419cde65BB94DcE74d48324269", + "0xD9E6718b1C294CCe6EBC67eb6eBdbc02c343E489", + "0x830a02416Fc210C6F50A5afe65384F6c88132BE7", + "0x1b39f5ee1Fb4958F2E4049f69B53F78b75Bf1888", + "0x1742289017b61C48A5B4340666711AEd2Db72B4E", + "0x523c2937b6A1A0df143032033d6824dce499ddBF", + "0xB0a5eA798249fb30E9E1c81d475B051279962BB2", + "0xd2c7EeDBE8D68b045388A79b65915253dB582385", + "0xc1b44b014cD87d88BB04e176ba9324e086e9cd73", + "0x9D9854f6C9588bF5A56158a47090E0DFAC89d596", + "0x40eF5243c64BFa49301adF18b09A79A190CFa266", + "0xCF3c579061fB243aeFab480055B49e9038e6E488", + "0x0117Ce17Bc661d9bc331A328DC57C05d99B087D3", + "0xB2de33b99A59877d0780D4315690a600f47B5996", + "0xd50c9d01223F0EC1184A82eBEA3730Bdbc82238e", + "0x1F4a6756Da7592fc0f9a031D127d016ACc0BfcB2", + "0x63c9E4f81716dEBc57dB9Fbc60600106a44B9964", + "0xB7Cd2CEF367bf5536d7fdF6c491CE158D2651d97", + "0x1aa4a66Ef0cfA99cA9D39FdAD2B05489744C972a", + "0x3150BdCdA1b41E0F2A550955839F6b2C723aD0B7" ] } diff --git a/packages/supplementary-contracts/script/blacklist/Deploy.sol b/packages/supplementary-contracts/script/blacklist/Deploy.sol index f3ce0ced2c0..67ee1c65a2a 100644 --- a/packages/supplementary-contracts/script/blacklist/Deploy.sol +++ b/packages/supplementary-contracts/script/blacklist/Deploy.sol @@ -9,25 +9,75 @@ import "../../contracts/blacklist/Blacklist.sol"; contract DeployBlacklist is Script { using stdJson for string; - function setUp() public { } + uint256 public chainId; + + string public lowercaseNetworkKey; + string public uppercaseNetworkKey; + string public jsonLocation; + + uint256 public deployerPrivateKey; + address public deployerAddress; + + function getPrivateKey() public view returns (uint256) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_PRIVATE_KEY"); + return vm.envUint(lookupKey); + } + + function getContractJsonLocation() public view returns (string memory) { + string memory root = vm.projectRoot(); + return string.concat(root, "/deployments/blacklist/", lowercaseNetworkKey, ".json"); + } + + function setUp() public { + // load all network configs + chainId = block.chainid; + + if (chainId == 31_337) { + lowercaseNetworkKey = "localhost"; + uppercaseNetworkKey = "LOCALHOST"; + } else if (chainId == 17_000) { + lowercaseNetworkKey = "holesky"; + uppercaseNetworkKey = "HOLESKY"; + } else if (chainId == 167_001) { + lowercaseNetworkKey = "devnet"; + uppercaseNetworkKey = "DEVNET"; + } else if (chainId == 11_155_111) { + lowercaseNetworkKey = "sepolia"; + uppercaseNetworkKey = "SEPOLIA"; + } else if (chainId == 167_008) { + lowercaseNetworkKey = "katla"; + uppercaseNetworkKey = "KATLA"; + } else if (chainId == 167_000) { + lowercaseNetworkKey = "mainnet"; + uppercaseNetworkKey = "MAINNET"; + } else if (chainId == 167_009) { + lowercaseNetworkKey = "hekla"; + uppercaseNetworkKey = "HEKLA"; + } else { + revert("Unsupported chainId"); + } + + deployerPrivateKey = getPrivateKey(); + deployerAddress = vm.addr(deployerPrivateKey); + jsonLocation = getContractJsonLocation(); + } function run() external { string memory path = "/script/blacklist/Deploy.data.json"; string memory json = vm.readFile(string.concat(vm.projectRoot(), path)); - // get admin address - bytes memory rawPortion = json.parseRaw(".admin"); - address admin = abi.decode(rawPortion, (address)); - // get updater address - rawPortion = json.parseRaw(".updater"); - address updater = abi.decode(rawPortion, (address)); // get initial blacklist - rawPortion = json.parseRaw(".blacklist"); + bytes memory rawPortion = json.parseRaw(".blacklist"); address[] memory blacklist = abi.decode(rawPortion, (address[])); - vm.startBroadcast(); + vm.startBroadcast(deployerPrivateKey); + + Blacklist target = new Blacklist(deployerAddress, deployerAddress, blacklist); + console2.log("Blacklist deployed to ", address(target)); + + string memory finalJson = vm.serializeAddress("", "Blacklist", address(target)); + vm.writeJson(finalJson, jsonLocation); - Blacklist target = new Blacklist(admin, updater, blacklist); - console2.log("Deployed!\n", address(target)); + vm.stopBroadcast(); } } diff --git a/packages/supplementary-contracts/script/utils/safe_batch_transfer.py b/packages/supplementary-contracts/script/utils/safe_batch_transfer.py new file mode 100644 index 00000000000..915443a3932 --- /dev/null +++ b/packages/supplementary-contracts/script/utils/safe_batch_transfer.py @@ -0,0 +1,89 @@ +import json +import sys +import time + +# Taiko Labs Wallet (on Taiko): 0x7aEeed56d1B21baD7b66f1357A6Ed51DA848a698 +#:Token Bridged USDC (Stargate) 0x19e26B0638bf63aa9fa4d14c6baF8D52eBE86C5C (DECIMAL 6) +def generate_json(input_file_path, safe_address, token_address, decimals): + transactions = [] + multiplier = 10 ** decimals + total_amount = 0 + num_recipients = 0 + + with open(input_file_path, mode='r') as file: + for line in file: + parts = line.strip().split() + if len(parts) != 2: + print(f"Invalid line format: {line}") + continue + recipient = parts[0] + amount = int(parts[1]) * multiplier + total_amount += amount + num_recipients += 1 + + print(f"Recipient: {recipient}, Amount: {amount}") + + transactions.append({ + "to": token_address, + "value": "0", + "data": None, + "contractMethod": { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "payable": False + }, + "contractInputsValues": { + "to": recipient, + "amount": str(amount) + } + }) + + print(f"Number of Recipients: {num_recipients}") + print(f"Total Token Amount: {total_amount}") + + result = { + "version": "1.0", + "chainId": "167000", + "createdAt": int(time.time()), + "meta": { + "name": "Transactions Batch", + "description": "", + "txBuilderVersion": "1.16.5", + "createdFromSafeAddress": safe_address + }, + "transactions": transactions + } + + print("safe_batch_transfers.json created") + with open("safe_batch_transfers.json", 'w') as json_file: + json.dump(result, json_file, indent=4) + +if __name__ == "__main__": + if len(sys.argv) != 5: + print("Usage: python3 safe_batch_transfer.py ") + sys.exit(1) + + input_file_path = sys.argv[1] + print(f"input file: {input_file_path}") + + safe_address = sys.argv[2] + print(f"safe address: {safe_address}") + + token_address = sys.argv[3] + print(f"token address: {token_address}") + + decimals = int(sys.argv[4]) + print(f"decimals: {decimals}") + + generate_json(input_file_path, safe_address, token_address, decimals) diff --git a/packages/taiko-client/.golangci.yml b/packages/taiko-client/.golangci.yml index 680090bcc94..53d4dc4b38f 100644 --- a/packages/taiko-client/.golangci.yml +++ b/packages/taiko-client/.golangci.yml @@ -3,21 +3,10 @@ run: timeout: 20m tests: true - skip-dirs-use-default: true - skip-files: - - bindings/gen_taiko_l1.go - - bindings/gen_taiko_l2.go issues: - # List of regexps of issue texts to exclude. - # - # But independently of this option we use default exclude patterns, - # it can be disabled by `exclude-use-default: false`. - # To list all excluded by default patterns execute `golangci-lint run --help` - # - # Default: https://golangci-lint.run/usage/false-positives/#default-exclusions - exclude: - - abcdef + exclude-dirs: + - bindings linters: disable-all: true @@ -35,7 +24,6 @@ linters: - goimports - gosimple - govet - - gosec - gofmt - ineffassign - importas @@ -43,13 +31,12 @@ linters: - makezero - misspell - misspell - - megacheck - - revive + - gosimple + - staticcheck - staticcheck - sqlclosecheck - staticcheck - stylecheck - - typecheck - unconvert - unused - whitespace diff --git a/packages/taiko-client/.swaggo b/packages/taiko-client/.swaggo index 8cc34d878a4..e69de29bb2d 100644 --- a/packages/taiko-client/.swaggo +++ b/packages/taiko-client/.swaggo @@ -1,2 +0,0 @@ -replace common.Address string -replace encoding.TierFee uint64 \ No newline at end of file diff --git a/packages/taiko-client/CHANGELOG.md b/packages/taiko-client/CHANGELOG.md index 49713e514e6..4e605d12020 100644 --- a/packages/taiko-client/CHANGELOG.md +++ b/packages/taiko-client/CHANGELOG.md @@ -1,5 +1,583 @@ # Changelog +## [0.42.1](https://github.com/taikoxyz/taiko-mono/compare/taiko-alethia-client-v0.42.0...taiko-alethia-client-v0.42.1) (2025-01-07) + + +### Chores + +* **taiko-client:** always use `blockID` instead of `height` for L2 blocks in logs ([#18719](https://github.com/taikoxyz/taiko-mono/issues/18719)) ([a02b96d](https://github.com/taikoxyz/taiko-mono/commit/a02b96d609b17070fd0b071127d84c21e1f3a8ef)) +* **taiko-client:** improve proposer gas estimation ([#18727](https://github.com/taikoxyz/taiko-mono/issues/18727)) ([6aed5b3](https://github.com/taikoxyz/taiko-mono/commit/6aed5b3bc5f46e089784405133fcf83c6befe495)) + +## [0.42.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-alethia-client-v0.41.1...taiko-alethia-client-v0.42.0) (2025-01-06) + + +### Features + +* **taiko-client:** build blob transactions when gas estimation failed ([#18712](https://github.com/taikoxyz/taiko-mono/issues/18712)) ([6c0ef37](https://github.com/taikoxyz/taiko-mono/commit/6c0ef3706ebae8059b9ff554f45c2dcad00c0535)) +* **taiko-client:** introduce `TxBuilderWithFallback` ([#18690](https://github.com/taikoxyz/taiko-mono/issues/18690)) ([f1d7b20](https://github.com/taikoxyz/taiko-mono/commit/f1d7b20b722b1e15db3f3f2953c8afb89287537f)) +* **taiko-client:** remove an unused flag for proposer ([#18709](https://github.com/taikoxyz/taiko-mono/issues/18709)) ([6fb1fd2](https://github.com/taikoxyz/taiko-mono/commit/6fb1fd25696a5251d864e8869c4a360e9915d787)) + + +### Bug Fixes + +* **taiko-client:** add [#18442](https://github.com/taikoxyz/taiko-mono/issues/18442) back ([#18685](https://github.com/taikoxyz/taiko-mono/issues/18685)) ([abc0554](https://github.com/taikoxyz/taiko-mono/commit/abc0554eb0b0a640a8b1a4e9762f7d691b089d40)) +* **taiko-client:** add timestamp as a new parameter to getBasefeeV2 ([#18691](https://github.com/taikoxyz/taiko-mono/issues/18691)) ([4a4d908](https://github.com/taikoxyz/taiko-mono/commit/4a4d908b0290046d1098d943a9ebc685c7ca533e)) +* **taiko-client:** fix blob transactions estimation when proposing ([#18703](https://github.com/taikoxyz/taiko-mono/issues/18703)) ([395ac5f](https://github.com/taikoxyz/taiko-mono/commit/395ac5fdfb0d8eccae96fafda423d19766a94556)) +* **taiko-client:** fix proposing fee estimation ([#18702](https://github.com/taikoxyz/taiko-mono/issues/18702)) ([13a5b1b](https://github.com/taikoxyz/taiko-mono/commit/13a5b1b50e0bf9f030449af49cb0b58ce4288729)) + + +### Chores + +* **taiko-client:** add more metrics for `TxBuilderWithFallback` ([#18711](https://github.com/taikoxyz/taiko-mono/issues/18711)) ([b62d390](https://github.com/taikoxyz/taiko-mono/commit/b62d3906a650d8b58ad1d45b068638823ce05121)) +* **taiko-client:** add more proof generation metrics ([#18715](https://github.com/taikoxyz/taiko-mono/issues/18715)) ([ae07365](https://github.com/taikoxyz/taiko-mono/commit/ae07365e560c51bcc197335d0ac0ba61964f0b49)) +* **taiko-client:** cleanup pre-ontake prover code ([#18677](https://github.com/taikoxyz/taiko-mono/issues/18677)) ([fef6884](https://github.com/taikoxyz/taiko-mono/commit/fef6884bc318e4f09d9c59930a0565cc15e25996)) +* **taiko-client:** fix docs ([#18698](https://github.com/taikoxyz/taiko-mono/issues/18698)) ([fc545ee](https://github.com/taikoxyz/taiko-mono/commit/fc545ee89fd907a20161195ef174e7d96d4beae3)) +* **taiko-client:** improve prover logs ([#18718](https://github.com/taikoxyz/taiko-mono/issues/18718)) ([3246071](https://github.com/taikoxyz/taiko-mono/commit/32460713052351789f3d7b452ccd0251a000e2f8)) +* **taiko-client:** more cost estimation metrics ([#18713](https://github.com/taikoxyz/taiko-mono/issues/18713)) ([b9bd6ea](https://github.com/taikoxyz/taiko-mono/commit/b9bd6ea479da8943b96ddca00a3bbb0e8148774c)) +* **taiko-client:** optimize logging ([#18674](https://github.com/taikoxyz/taiko-mono/issues/18674)) ([60bda60](https://github.com/taikoxyz/taiko-mono/commit/60bda60df922e5dd04f6186f8a67d7cb56351c6d)) +* **taiko-client:** remove some unused flags ([#18678](https://github.com/taikoxyz/taiko-mono/issues/18678)) ([63f9d26](https://github.com/taikoxyz/taiko-mono/commit/63f9d26b42518a995e093d7db6bc43ef3b57ecca)) + + +### Tests + +* **taiko-client:** add more fallback proposing tests ([#18705](https://github.com/taikoxyz/taiko-mono/issues/18705)) ([0e8ef0d](https://github.com/taikoxyz/taiko-mono/commit/0e8ef0d6df36cc05956574b38dabdbbd83f7ce5a)) + +## [0.41.1](https://github.com/taikoxyz/taiko-mono/compare/taiko-alethia-client-v0.41.0...taiko-alethia-client-v0.41.1) (2024-12-30) + + +### Chores + +* **taiko-client:** cleanup pre-ontake proposer code ([#18672](https://github.com/taikoxyz/taiko-mono/issues/18672)) ([a52d9a7](https://github.com/taikoxyz/taiko-mono/commit/a52d9a79bb99027061f4719a62361157365a5625)) + +## [0.41.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-alethia-client-v0.40.0...taiko-alethia-client-v0.41.0) (2024-12-30) + + +### Features + +* **protocol:** introduce `AssembleAnchorV2Tx` method in `AnchorTxConstructor` ([#17850](https://github.com/taikoxyz/taiko-mono/issues/17850)) ([f71b178](https://github.com/taikoxyz/taiko-mono/commit/f71b1780eb98ff3cbbcf7def4388837f33e3fe37)) +* **protocol:** introduce risc0 proof ([#17877](https://github.com/taikoxyz/taiko-mono/issues/17877)) ([bcb57cb](https://github.com/taikoxyz/taiko-mono/commit/bcb57cb81d12d0c09656582ad9140b38015b3a58)) +* **protocol:** propose a batch blocks conditionally ([#18570](https://github.com/taikoxyz/taiko-mono/issues/18570)) ([e846f62](https://github.com/taikoxyz/taiko-mono/commit/e846f6289fea0b046ddcfcdfaf46f3727efbdf11)) +* **taiko-client:** add `proposer_pool_content_fetch_time` metric ([#18190](https://github.com/taikoxyz/taiko-mono/issues/18190)) ([35579df](https://github.com/taikoxyz/taiko-mono/commit/35579dfa938562969da2395492f4472c300574dd)) +* **taiko-client:** add `RaikoZKVMHostEndpoint` and rename ([#17926](https://github.com/taikoxyz/taiko-mono/issues/17926)) ([0838f79](https://github.com/taikoxyz/taiko-mono/commit/0838f7993015fc9fc9cacfb3da7b100d52bc856c)) +* **taiko-client:** add chain ID to `TryDecompress()` ([#18444](https://github.com/taikoxyz/taiko-mono/issues/18444)) ([10d99d5](https://github.com/taikoxyz/taiko-mono/commit/10d99d50d3866a6e233d9e3749ea5eb753335815)) +* **taiko-client:** add optional `l1.private` ([#17962](https://github.com/taikoxyz/taiko-mono/issues/17962)) ([9274f2d](https://github.com/taikoxyz/taiko-mono/commit/9274f2dc90f18c58cc208146f584c9f9715d3d60)) +* **taiko-client:** add two more new ZK related metrics ([#18043](https://github.com/taikoxyz/taiko-mono/issues/18043)) ([e43eeac](https://github.com/taikoxyz/taiko-mono/commit/e43eeacb5b7a3d1fc412ffafc39f329f68ff7b40)) +* **taiko-client:** allow `--l1.beacon` to be optional when a blob server is given ([#18094](https://github.com/taikoxyz/taiko-mono/issues/18094)) ([f4d47a3](https://github.com/taikoxyz/taiko-mono/commit/f4d47a3f988462605f04106b14394bb400fc9669)) +* **taiko-client:** catch raiko deserialization errors ([#18644](https://github.com/taikoxyz/taiko-mono/issues/18644)) ([98a98fd](https://github.com/taikoxyz/taiko-mono/commit/98a98fd4636e3cd5f3ec019493a72880e141f494)) +* **taiko-client:** changes based on the latest basefee improvements ([#17911](https://github.com/taikoxyz/taiko-mono/issues/17911)) ([0c10ac9](https://github.com/taikoxyz/taiko-mono/commit/0c10ac9c4973d3ef8a5e35a8646516639b328fa0)) +* **taiko-client:** client changes based on [#18150](https://github.com/taikoxyz/taiko-mono/issues/18150) ([#18350](https://github.com/taikoxyz/taiko-mono/issues/18350)) ([ddc6473](https://github.com/taikoxyz/taiko-mono/commit/ddc647327e8d58f5a2def5b902ad06800982544b)) +* **taiko-client:** client changes for `ontake` fork ([#17746](https://github.com/taikoxyz/taiko-mono/issues/17746)) ([2aabf3d](https://github.com/taikoxyz/taiko-mono/commit/2aabf3de3456ce8cbd56d15be336d08445b9f242)) +* **taiko-client:** client updates based on [#17871](https://github.com/taikoxyz/taiko-mono/issues/17871) ([#17873](https://github.com/taikoxyz/taiko-mono/issues/17873)) ([dbed3ab](https://github.com/taikoxyz/taiko-mono/commit/dbed3aba3d7f49f982f6335b79f5d5b096f890a3)) +* **taiko-client:** compatible changes for `lastProposedIn` ([#18442](https://github.com/taikoxyz/taiko-mono/issues/18442)) ([28f32a7](https://github.com/taikoxyz/taiko-mono/commit/28f32a790cc680ecb3e6345221e4183af4f34b2e)) +* **taiko-client:** enable proof aggregation (batch proofs) ([#18163](https://github.com/taikoxyz/taiko-mono/issues/18163)) ([7642961](https://github.com/taikoxyz/taiko-mono/commit/7642961a9031840183f4d00d0a4c19fdb8a68058)) +* **taiko-client:** improve `ProofBuffer` ([#18627](https://github.com/taikoxyz/taiko-mono/issues/18627)) ([c386589](https://github.com/taikoxyz/taiko-mono/commit/c3865896523712afa108be810e75b511e7ecc0c4)) +* **taiko-client:** improve some logs in zk producer ([#18117](https://github.com/taikoxyz/taiko-mono/issues/18117)) ([109595e](https://github.com/taikoxyz/taiko-mono/commit/109595e7b285709833a782ee0959fd1a815ef706)) +* **taiko-client:** introduce `BasefeeSharingPctg` in `BlockMetadata` ([#17853](https://github.com/taikoxyz/taiko-mono/issues/17853)) ([5f2d696](https://github.com/taikoxyz/taiko-mono/commit/5f2d6961b9d077e47f34bf7f5d1fbffaf380bde1)) +* **taiko-client:** introduce `CalculateBaseFee()` method ([#17989](https://github.com/taikoxyz/taiko-mono/issues/17989)) ([fdee419](https://github.com/taikoxyz/taiko-mono/commit/fdee4195541e5c675561cf34c5e1a9e3e3990bbf)) +* **taiko-client:** introduce `TaikoDataBlockV2` ([#17936](https://github.com/taikoxyz/taiko-mono/issues/17936)) ([c608116](https://github.com/taikoxyz/taiko-mono/commit/c608116523922fa4664968dc73608a118b5b97ba)) +* **taiko-client:** introduce `TaikoL2.GetBasefeeV2` ([#18660](https://github.com/taikoxyz/taiko-mono/issues/18660)) ([4abfaa9](https://github.com/taikoxyz/taiko-mono/commit/4abfaa9e28a619c1edfa82548a00eae0790f784b)) +* **taiko-client:** introduce `TierZkVMRisc0ID` ([#17915](https://github.com/taikoxyz/taiko-mono/issues/17915)) ([96aa5c2](https://github.com/taikoxyz/taiko-mono/commit/96aa5c2a5cd096ac3560fe17106ec042a877bfc1)) +* **taiko-client:** introduce `TxMgrSelector` for proposer / prover ([#17986](https://github.com/taikoxyz/taiko-mono/issues/17986)) ([6eb298f](https://github.com/taikoxyz/taiko-mono/commit/6eb298f31723e838ac4261fbecbfcfce371d8606)) +* **taiko-client:** introduce sp1 zk proof ([#18003](https://github.com/taikoxyz/taiko-mono/issues/18003)) ([492c208](https://github.com/taikoxyz/taiko-mono/commit/492c208b97e8fa08eb3e11b0a8712a5542eba660)) +* **taiko-client:** make p2p-sync required ([#18571](https://github.com/taikoxyz/taiko-mono/issues/18571)) ([de92b28](https://github.com/taikoxyz/taiko-mono/commit/de92b28c03b747845a8a1aa26991307d1ed47fd0)) +* **taiko-client:** optimising statistics on proof request times ([#17976](https://github.com/taikoxyz/taiko-mono/issues/17976)) ([791f44f](https://github.com/taikoxyz/taiko-mono/commit/791f44f381fa362f24c4beff5b5b25c47929bbc4)) +* **taiko-client:** optimize aggregation loggingain ([#18643](https://github.com/taikoxyz/taiko-mono/issues/18643)) ([688a426](https://github.com/taikoxyz/taiko-mono/commit/688a42646d185694c7cfd2bc091084dd782782f5)) +* **taiko-client:** remove `basefeeSharingPctg` from metadata ([#17890](https://github.com/taikoxyz/taiko-mono/issues/17890)) ([57c8f6f](https://github.com/taikoxyz/taiko-mono/commit/57c8f6f3a8f920bab8fecd75bfa36a6b71ef808d)) +* **taiko-client:** remove an unused field in prover ([#18024](https://github.com/taikoxyz/taiko-mono/issues/18024)) ([5d416d2](https://github.com/taikoxyz/taiko-mono/commit/5d416d2366e485b242818fb1a15eb0281cb7cedf)) +* **taiko-client:** remove an unused filed in proposer ([#18021](https://github.com/taikoxyz/taiko-mono/issues/18021)) ([64fdf5c](https://github.com/taikoxyz/taiko-mono/commit/64fdf5c80708b14d2cefadfbd78ee59810df3f65)) +* **taiko-client:** remove an unused package ([#18668](https://github.com/taikoxyz/taiko-mono/issues/18668)) ([e1af55a](https://github.com/taikoxyz/taiko-mono/commit/e1af55abcf99ba4a1de6cc22072a457f45ad55be)) +* **taiko-client:** remove the legacy `290` tier ([#18035](https://github.com/taikoxyz/taiko-mono/issues/18035)) ([5064037](https://github.com/taikoxyz/taiko-mono/commit/50640377db773763c3ccba1bc4f342cd1e497147)) +* **taiko-client:** revert pr 18442 ([#18450](https://github.com/taikoxyz/taiko-mono/issues/18450)) ([0706f0a](https://github.com/taikoxyz/taiko-mono/commit/0706f0aee9c318d8de298f98480a46de6337937c)) +* **taiko-client:** revert pr-18571 ([#18648](https://github.com/taikoxyz/taiko-mono/issues/18648)) ([842f812](https://github.com/taikoxyz/taiko-mono/commit/842f8122305f8cbf3153bb645e3107abb4af3cf4)) +* **taiko-client:** support `TaikoL1.proposeBlocksV2` ([#18116](https://github.com/taikoxyz/taiko-mono/issues/18116)) ([d0c0fed](https://github.com/taikoxyz/taiko-mono/commit/d0c0fed57c8b8ba139b65d0215df1976358e7635)) +* **taiko-client:** update `BlockParamsV2` struct ([#17893](https://github.com/taikoxyz/taiko-mono/issues/17893)) ([a1043a8](https://github.com/taikoxyz/taiko-mono/commit/a1043a85631892e0b03e0f9f4bb850d4e9a70967)) +* **taiko-client:** update `OntakeForkHeight` in mainnet ([#18253](https://github.com/taikoxyz/taiko-mono/issues/18253)) ([21c6235](https://github.com/taikoxyz/taiko-mono/commit/21c62355575adae6d99e1a117f357c6429d79b4c)) +* **taiko-client:** update `ontakeForkHeight` to Sep 24, 2024 ([#18047](https://github.com/taikoxyz/taiko-mono/issues/18047)) ([a1ff620](https://github.com/taikoxyz/taiko-mono/commit/a1ff620507e4a8077705c981c3622e3787a55ecd)) +* **taiko-client:** update contract binding & add `Proposer` ([#18053](https://github.com/taikoxyz/taiko-mono/issues/18053)) ([d0554a2](https://github.com/taikoxyz/taiko-mono/commit/d0554a208c4913751ff5b273f3e96ca298279d14)) +* **taiko-client:** update contract bingdings ([#18182](https://github.com/taikoxyz/taiko-mono/issues/18182)) ([8954764](https://github.com/taikoxyz/taiko-mono/commit/8954764d96c256408c1cfd77deb1621da288a33c)) +* **taiko-client:** update Go contract bindings ([#17869](https://github.com/taikoxyz/taiko-mono/issues/17869)) ([d9bd72b](https://github.com/taikoxyz/taiko-mono/commit/d9bd72b76aa0bed4ccfe834053f6561a53e1367d)) +* **taiko-client:** update Go contract bindings ([#17885](https://github.com/taikoxyz/taiko-mono/issues/17885)) ([3179074](https://github.com/taikoxyz/taiko-mono/commit/31790747cfc743b218d5a3568b9d70b64df5a86c)) +* **taiko-client:** update Go contract bindings ([#17997](https://github.com/taikoxyz/taiko-mono/issues/17997)) ([606114f](https://github.com/taikoxyz/taiko-mono/commit/606114faa0b5642055455f07cbd7ec2c3c23b00c)) +* **taiko-client:** update Go contract bindings ([#18012](https://github.com/taikoxyz/taiko-mono/issues/18012)) ([7f054ca](https://github.com/taikoxyz/taiko-mono/commit/7f054ca4505313f8fc500cdb28bf223a254424e2)) +* **taiko-client:** update Go contract bindings ([#18381](https://github.com/taikoxyz/taiko-mono/issues/18381)) ([71cfc5c](https://github.com/taikoxyz/taiko-mono/commit/71cfc5ce1ef06dcf099a4ce9b22bea6100406148)) +* **taiko-client:** update Go contract bindings ([#18384](https://github.com/taikoxyz/taiko-mono/issues/18384)) ([8dd14a1](https://github.com/taikoxyz/taiko-mono/commit/8dd14a1b4b21ce77ed3aac935b1d2c950e11e729)) +* **taiko-client:** update Go contract bindings ([#18462](https://github.com/taikoxyz/taiko-mono/issues/18462)) ([bc0ee99](https://github.com/taikoxyz/taiko-mono/commit/bc0ee9952234cc6722d3a0e9d9ebd92bca706999)) +* **taiko-client:** update Go contract bindings after protocol restructure ([#18075](https://github.com/taikoxyz/taiko-mono/issues/18075)) ([57f4953](https://github.com/taikoxyz/taiko-mono/commit/57f49530828e6da2d28ab3979576befdee626c7d)) +* **taiko-client:** update hekla's protocol config ([#17955](https://github.com/taikoxyz/taiko-mono/issues/17955)) ([4b6a70d](https://github.com/taikoxyz/taiko-mono/commit/4b6a70dd4fb22146ee6702b8484a4a2b4fbce6c2)) +* **taiko-client:** update ontake basefee calculation ([#17892](https://github.com/taikoxyz/taiko-mono/issues/17892)) ([6972dea](https://github.com/taikoxyz/taiko-mono/commit/6972dea313edbc9a30617d2f7aea2dfc9230c432)) +* **taiko-client:** update protocol configs temporarily ([#17999](https://github.com/taikoxyz/taiko-mono/issues/17999)) ([7893700](https://github.com/taikoxyz/taiko-mono/commit/789370090ffb7d985b2d9d55bf4efec8495df6bd)) +* **taiko-client:** update prover balance check to include bond balance ([#18092](https://github.com/taikoxyz/taiko-mono/issues/18092)) ([5d5ca74](https://github.com/taikoxyz/taiko-mono/commit/5d5ca74970f88493ea75b14a13fe852f840f019a)) +* **taiko-client:** use `proveBlocks` by default for post ontake blocks ([#18042](https://github.com/taikoxyz/taiko-mono/issues/18042)) ([15709af](https://github.com/taikoxyz/taiko-mono/commit/15709af1520251f4baeba7d2bbbc8de841bee718)) + + +### Bug Fixes + +* **protocol:** fix issue in mainnet deployment script ([#18283](https://github.com/taikoxyz/taiko-mono/issues/18283)) ([5c371a1](https://github.com/taikoxyz/taiko-mono/commit/5c371a181af444999f611e03774ec096ffbd1226)) +* **taiko-client:** dont check l1heightInAnchor vs l1Height when detecting reorg ([#18110](https://github.com/taikoxyz/taiko-mono/issues/18110)) ([7ed9b6f](https://github.com/taikoxyz/taiko-mono/commit/7ed9b6f647fd1611e036ce12e4fd96696ef231ea)) +* **taiko-client:** fix `GetBasefeeV2` usage ([#18664](https://github.com/taikoxyz/taiko-mono/issues/18664)) ([03537c7](https://github.com/taikoxyz/taiko-mono/commit/03537c7d86700427976da556fed88ea4df5299d7)) +* **taiko-client:** fix `lastVerifiedBlockHash` fetch ([#18277](https://github.com/taikoxyz/taiko-mono/issues/18277)) ([8512f45](https://github.com/taikoxyz/taiko-mono/commit/8512f456f033130ecb0e5493a3c36be025908228)) +* **taiko-client:** fix blob server API URL when fetching blob data ([#18109](https://github.com/taikoxyz/taiko-mono/issues/18109)) ([7230dfd](https://github.com/taikoxyz/taiko-mono/commit/7230dfd1150edc7c08be6f97a46c1184a0b2d289)) +* **taiko-client:** fix CallOpts and `TestTreasuryIncome` test case ([#18000](https://github.com/taikoxyz/taiko-mono/issues/18000)) ([5707a08](https://github.com/taikoxyz/taiko-mono/commit/5707a08ffab3c981f0f23bcb8c7833176903d183)) +* **taiko-client:** fix path parsing in `/eth/v1/config/spec` ([#18295](https://github.com/taikoxyz/taiko-mono/issues/18295)) ([6633c80](https://github.com/taikoxyz/taiko-mono/commit/6633c80fbcabb6f06ce5467501da4207bc84be84)) +* **taiko-client:** fix process in handling empty proof ([#18128](https://github.com/taikoxyz/taiko-mono/issues/18128)) ([d6d90d8](https://github.com/taikoxyz/taiko-mono/commit/d6d90d887be8955f844c52c4fb100fa46d66fa47)) +* **taiko-client:** fix revert case when propose blob blocks ([#18185](https://github.com/taikoxyz/taiko-mono/issues/18185)) ([656e757](https://github.com/taikoxyz/taiko-mono/commit/656e757d629131cb03af894269ef447c39e9741e)) +* **taiko-client:** fix some issues about `calculateBaseFee` ([#17978](https://github.com/taikoxyz/taiko-mono/issues/17978)) ([b010efe](https://github.com/taikoxyz/taiko-mono/commit/b010efe195259e7c98e0ad6fb91b0c6484ae2b80)) +* **taiko-client:** fix timestamp calculation n `CalculateBaseFee()` ([#18057](https://github.com/taikoxyz/taiko-mono/issues/18057)) ([78c876e](https://github.com/taikoxyz/taiko-mono/commit/78c876e5df27d9e0fffc9e0fbf7ecbe518533025)) +* **taiko-client:** fix zk status recognition ([#17946](https://github.com/taikoxyz/taiko-mono/issues/17946)) ([164e476](https://github.com/taikoxyz/taiko-mono/commit/164e47686f41cbb119a230c7a1ad56ef4d0b3117)) +* **taiko-client:** improve prover balance check based on 18092 ([#18129](https://github.com/taikoxyz/taiko-mono/issues/18129)) ([b6cd50b](https://github.com/taikoxyz/taiko-mono/commit/b6cd50b61577d1eaa7aa29bd3e728271bcd4996f)) +* **taiko-client:** initialize private mempool transaction sender in `InitFromConfig` ([#18005](https://github.com/taikoxyz/taiko-mono/issues/18005)) ([58f1c85](https://github.com/taikoxyz/taiko-mono/commit/58f1c85ad471a545f8f00bfd32b3241657f38e8f)) +* **taiko-client:** prints logs when using `privateTxMgr` ([#17980](https://github.com/taikoxyz/taiko-mono/issues/17980)) ([a0c3388](https://github.com/taikoxyz/taiko-mono/commit/a0c33882ca00fb834001abac95b6ade656d55e87)) +* **taiko-client:** record `lastProposedAt` after ontake fork ([#18166](https://github.com/taikoxyz/taiko-mono/issues/18166)) ([ea0ca90](https://github.com/taikoxyz/taiko-mono/commit/ea0ca9040cc3d1d9fec50777d40b3cf69803c115)) +* **taiko-client:** revert path changes about SocialScan endpoint ([#18119](https://github.com/taikoxyz/taiko-mono/issues/18119)) ([38fa03a](https://github.com/taikoxyz/taiko-mono/commit/38fa03ab78d9cf4e70df8c623a74a4d69cf85682)) +* **taiko-client:** temp support tier 290 ([#18030](https://github.com/taikoxyz/taiko-mono/issues/18030)) ([f1aeac3](https://github.com/taikoxyz/taiko-mono/commit/f1aeac39d3c2ce06578a64bbe8a2fe4343d212f4)) +* **taiko-client:** use proposed at, not timestamp when fetching blob ([#18055](https://github.com/taikoxyz/taiko-mono/issues/18055)) ([32d95c1](https://github.com/taikoxyz/taiko-mono/commit/32d95c1d9e887e886da57e580554413b4f3a19c5)) +* **taiko-client:** valid status check in `BatchGetBlocksProofStatus` ([#18595](https://github.com/taikoxyz/taiko-mono/issues/18595)) ([ec5f599](https://github.com/taikoxyz/taiko-mono/commit/ec5f5999750f70efe58cc061c5856250dcef5ce2)) + + +### Chores + +* **main:** release taiko-client 0.30.0 ([#17770](https://github.com/taikoxyz/taiko-mono/issues/17770)) ([92879e9](https://github.com/taikoxyz/taiko-mono/commit/92879e91fba74118e701065513c5a0937393d299)) +* **main:** release taiko-client 0.31.0 ([#17952](https://github.com/taikoxyz/taiko-mono/issues/17952)) ([1d09fd2](https://github.com/taikoxyz/taiko-mono/commit/1d09fd229376c211914cdb3ec59a46774deed70b)) +* **main:** release taiko-client 0.32.0 ([#17956](https://github.com/taikoxyz/taiko-mono/issues/17956)) ([3a0bfa7](https://github.com/taikoxyz/taiko-mono/commit/3a0bfa7173345d35e2a7d2b0303a6ab4cfc9da0f)) +* **main:** release taiko-client 0.33.0 ([#17988](https://github.com/taikoxyz/taiko-mono/issues/17988)) ([c4653e5](https://github.com/taikoxyz/taiko-mono/commit/c4653e5f67a57e1debc02b98cabfed95e2edc2b4)) +* **main:** release taiko-client 0.33.1 ([#18008](https://github.com/taikoxyz/taiko-mono/issues/18008)) ([af794de](https://github.com/taikoxyz/taiko-mono/commit/af794de19672b7890e82fed1f58671ec574eb159)) +* **main:** release taiko-client 0.34.0 ([#18013](https://github.com/taikoxyz/taiko-mono/issues/18013)) ([cd5a6d9](https://github.com/taikoxyz/taiko-mono/commit/cd5a6d99a49237edfe417d82847cc47821bccbfd)) +* **main:** release taiko-client 0.34.1 ([#18031](https://github.com/taikoxyz/taiko-mono/issues/18031)) ([428dd49](https://github.com/taikoxyz/taiko-mono/commit/428dd49fb678ddeb5a942d4ed924ce760709a350)) +* **main:** release taiko-client 0.35.0 ([#18036](https://github.com/taikoxyz/taiko-mono/issues/18036)) ([61f31b6](https://github.com/taikoxyz/taiko-mono/commit/61f31b6a0fedd53c6e6cce3e208dc731f8b0ce4c)) +* **main:** release taiko-client 0.36.0 ([#18076](https://github.com/taikoxyz/taiko-mono/issues/18076)) ([d895cd8](https://github.com/taikoxyz/taiko-mono/commit/d895cd8c0b9a7ab6de94fe80ac8f6d6f686d11f4)) +* **main:** release taiko-client 0.37.0 ([#18093](https://github.com/taikoxyz/taiko-mono/issues/18093)) ([02a71dd](https://github.com/taikoxyz/taiko-mono/commit/02a71dd26e0650b39754fbac7100e6e9b5d0ce38)) +* **main:** release taiko-client 0.38.0 ([#18191](https://github.com/taikoxyz/taiko-mono/issues/18191)) ([f3ed20b](https://github.com/taikoxyz/taiko-mono/commit/f3ed20bca65cfb87a182f6876795983a4b3cd792)) +* **main:** release taiko-client 0.39.0 ([#18247](https://github.com/taikoxyz/taiko-mono/issues/18247)) ([be08e8b](https://github.com/taikoxyz/taiko-mono/commit/be08e8b846f798bb8259bfa0ae73bd729a5aaf79)) +* **main:** release taiko-client 0.39.1 ([#18278](https://github.com/taikoxyz/taiko-mono/issues/18278)) ([191480d](https://github.com/taikoxyz/taiko-mono/commit/191480d06159951aa6db0c550a0cc576917a7935)) +* **main:** release taiko-client 0.39.2 ([#18284](https://github.com/taikoxyz/taiko-mono/issues/18284)) ([52a9362](https://github.com/taikoxyz/taiko-mono/commit/52a936299487ee4db83e88ba740aec025561a2b9)) +* **main:** release taiko-client 0.40.0 ([#18436](https://github.com/taikoxyz/taiko-mono/issues/18436)) ([2a82c94](https://github.com/taikoxyz/taiko-mono/commit/2a82c945a2f6436a36f393105621bb011d8a4325)) +* **protocol:** remove reliance on taiko contracts and update golangci-lint ([#18151](https://github.com/taikoxyz/taiko-mono/issues/18151)) ([92f571a](https://github.com/taikoxyz/taiko-mono/commit/92f571a15daa4ad300b4665bbace9248c439fd11)) +* **protocol:** revert `TAIKO_TOKEN` name changes in `DeployOnL1` ([#17927](https://github.com/taikoxyz/taiko-mono/issues/17927)) ([cf1a15f](https://github.com/taikoxyz/taiko-mono/commit/cf1a15f46344e60448c5fdcbcae02521fb5b7c04)) +* **repo:** fix broken links ([#18635](https://github.com/taikoxyz/taiko-mono/issues/18635)) ([8e53a6e](https://github.com/taikoxyz/taiko-mono/commit/8e53a6e6a2654b8a599fe1df187e2fd88c22d96e)) +* **taiko-client:** add `BaseFeeConfig.SharingPctg` to mainnet protocol config ([#18341](https://github.com/taikoxyz/taiko-mono/issues/18341)) ([75d14a7](https://github.com/taikoxyz/taiko-mono/commit/75d14a7afac83b4578a3c32456a28ae70373d5cb)) +* **taiko-client:** add hive tests to workflow ([#17897](https://github.com/taikoxyz/taiko-mono/issues/17897)) ([323d728](https://github.com/taikoxyz/taiko-mono/commit/323d7285d83b83adfd220747fb3f55b5cd72d877)) +* **taiko-client:** bump dependencies ([#18202](https://github.com/taikoxyz/taiko-mono/issues/18202)) ([219a7e8](https://github.com/taikoxyz/taiko-mono/commit/219a7e87c09c7e4ac8d545c65c77a29e6f818701)) +* **taiko-client:** don't use color prefix in log's terminal handler ([#17991](https://github.com/taikoxyz/taiko-mono/issues/17991)) ([1675cec](https://github.com/taikoxyz/taiko-mono/commit/1675cecab5773d1c4fdf82b8e000a6f5bebddfc6)) +* **taiko-client:** fix lint errors ([#17969](https://github.com/taikoxyz/taiko-mono/issues/17969)) ([eedec99](https://github.com/taikoxyz/taiko-mono/commit/eedec991c92d5fcd418cde4db9d16c9b36122a0a)) +* **taiko-client:** improve `proofBuffer` logs ([#18669](https://github.com/taikoxyz/taiko-mono/issues/18669)) ([3b0d786](https://github.com/taikoxyz/taiko-mono/commit/3b0d786fe42205394a8a293aa6e5913e158323c4)) +* **taiko-client:** keep env vars same with the flag name ([#17964](https://github.com/taikoxyz/taiko-mono/issues/17964)) ([d08a1de](https://github.com/taikoxyz/taiko-mono/commit/d08a1de8a36a4bac484bf0390728cb8ed87b3a0b)) +* **taiko-client:** revert building changes ([#18174](https://github.com/taikoxyz/taiko-mono/issues/18174)) ([485b2ee](https://github.com/taikoxyz/taiko-mono/commit/485b2ee9a4bf4e16b9d0ab7b704eba0b0a46996c)) +* **taiko-client:** try cross-compile taiko-client to speed up docker building ([#18171](https://github.com/taikoxyz/taiko-mono/issues/18171)) ([9dbad24](https://github.com/taikoxyz/taiko-mono/commit/9dbad24cefcd260e2b452c9e8a46fcbe5f327cb4)) +* **taiko-client:** update `hive_tests.sh` ([#17923](https://github.com/taikoxyz/taiko-mono/issues/17923)) ([05d49b0](https://github.com/taikoxyz/taiko-mono/commit/05d49b07f9131bc034d00ad6cb7b7868a9af2bfc)) +* **taiko-client:** update CI badge and path ([#18441](https://github.com/taikoxyz/taiko-mono/issues/18441)) ([6aef03e](https://github.com/taikoxyz/taiko-mono/commit/6aef03e87eaf3cdbfb7637bd6122525f75c611f0)) +* **taiko-client:** update docker-compose config ([#18330](https://github.com/taikoxyz/taiko-mono/issues/18330)) ([74e4ca4](https://github.com/taikoxyz/taiko-mono/commit/74e4ca4aaef07af4958a7b61c95e385022b1cf3c)) +* **taiko-client:** update Go contract bindings generation script ([#18324](https://github.com/taikoxyz/taiko-mono/issues/18324)) ([4f698a0](https://github.com/taikoxyz/taiko-mono/commit/4f698a02bb1714caf527629a637323a9964cdb11)) + + +### Documentation + +* **taiko-client:** update readme how to do integration test ([#18256](https://github.com/taikoxyz/taiko-mono/issues/18256)) ([b12b32e](https://github.com/taikoxyz/taiko-mono/commit/b12b32e92b5803f15047a6da2b73135f12b9406d)) + + +### Code Refactoring + +* **taiko-client:** move `utils` package from `internal/` to `pkg/` ([#18516](https://github.com/taikoxyz/taiko-mono/issues/18516)) ([b674857](https://github.com/taikoxyz/taiko-mono/commit/b67485732832fb90849179a7a8c8093f2228eb5a)) + + +### Tests + +* **taiko-client:** cleanup pre-ontake tests ([#18647](https://github.com/taikoxyz/taiko-mono/issues/18647)) ([b577b3b](https://github.com/taikoxyz/taiko-mono/commit/b577b3b40f51bf35efe46151e459d37b87548614)) +* **taiko-client:** disable docker pull in hive test ([#18101](https://github.com/taikoxyz/taiko-mono/issues/18101)) ([95c9da2](https://github.com/taikoxyz/taiko-mono/commit/95c9da29fdd432de156f331802b79703a2311898)) +* **taiko-client:** fix some lint issues for `taiko-client` ([#18517](https://github.com/taikoxyz/taiko-mono/issues/18517)) ([ac7eba6](https://github.com/taikoxyz/taiko-mono/commit/ac7eba69bfe13f026bc6e08074ebaec5dcb067eb)) +* **taiko-client:** introduce `taiko-reth` as another L2 node in testing ([#18223](https://github.com/taikoxyz/taiko-mono/issues/18223)) ([e856273](https://github.com/taikoxyz/taiko-mono/commit/e85627365d423fd8353b5bff92e80978774e9c50)) +* **taiko-client:** introduce `TestProposeTxListOntake` ([#18167](https://github.com/taikoxyz/taiko-mono/issues/18167)) ([5023226](https://github.com/taikoxyz/taiko-mono/commit/5023226a7aa2e7355e835f9447b17eb85c60032a)) +* **taiko-client:** introduce blob-server and blob-l1-beacon hive tests ([#18121](https://github.com/taikoxyz/taiko-mono/issues/18121)) ([c544fe8](https://github.com/taikoxyz/taiko-mono/commit/c544fe8c33e26bfae951fb15c423aec2b749d092)) +* **taiko-client:** introduce multi nodes hive test ([#17981](https://github.com/taikoxyz/taiko-mono/issues/17981)) ([9910863](https://github.com/taikoxyz/taiko-mono/commit/9910863865ecf7f583552e74f6a5d2e1a4060dca)) +* **taiko-client:** introduce reorg hive test ([#17965](https://github.com/taikoxyz/taiko-mono/issues/17965)) ([ab601ee](https://github.com/taikoxyz/taiko-mono/commit/ab601eea813190a314555c1773a982de16da0e59)) +* **taiko-client:** introduce TestTxPoolContentWithMinTip test case ([#18285](https://github.com/taikoxyz/taiko-mono/issues/18285)) ([d572f4c](https://github.com/taikoxyz/taiko-mono/commit/d572f4c412e59094ea9a4c5ff0b0667c9c04bd66)) +* **taiko-client:** open container logs and close build image logs ([#17959](https://github.com/taikoxyz/taiko-mono/issues/17959)) ([b541201](https://github.com/taikoxyz/taiko-mono/commit/b54120141f0e18f1912db66d28390d2a92af36c9)) +* **taiko-client:** remove an unnecessary test ([#18218](https://github.com/taikoxyz/taiko-mono/issues/18218)) ([d624e29](https://github.com/taikoxyz/taiko-mono/commit/d624e29ce1c0ae9ef6704d96516d632600213e13)) +* **taiko-client:** skip `TestCheckL1ReorgToSameHeightFork` temporarily ([#18522](https://github.com/taikoxyz/taiko-mono/issues/18522)) ([385fed2](https://github.com/taikoxyz/taiko-mono/commit/385fed2ce273d131635c54e99a11704a4ed385b8)) +* **taiko-client:** support full sync and snap sync in hive test ([#17995](https://github.com/taikoxyz/taiko-mono/issues/17995)) ([831198b](https://github.com/taikoxyz/taiko-mono/commit/831198baecc5f0e10c5c8fac1c04f9dad320c63c)) +* **taiko-client:** support multi clusters reorg hive test ([#17987](https://github.com/taikoxyz/taiko-mono/issues/17987)) ([28d9072](https://github.com/taikoxyz/taiko-mono/commit/28d90729adc391cb04b58fa2c32a9e3bfbd989a5)) +* **taiko-client:** update hive dependence and fix bug about hive test ([#17930](https://github.com/taikoxyz/taiko-mono/issues/17930)) ([dd40a4e](https://github.com/taikoxyz/taiko-mono/commit/dd40a4e6696b9c27135823cd545e7e5249a66e8c)) +* **taiko-client:** update HIVE test configurations ([#17950](https://github.com/taikoxyz/taiko-mono/issues/17950)) ([4818274](https://github.com/taikoxyz/taiko-mono/commit/4818274860e8d626e5456479a520229e7c17f31c)) +* **taiko-client:** upgrade full sync and snap sync hive tests ([#18010](https://github.com/taikoxyz/taiko-mono/issues/18010)) ([1d18c17](https://github.com/taikoxyz/taiko-mono/commit/1d18c170566aed645e2e03b024e7fe2f2a01756d)) +* **taiko-client:** use env names which defined in flag configs ([#17921](https://github.com/taikoxyz/taiko-mono/issues/17921)) ([196b74e](https://github.com/taikoxyz/taiko-mono/commit/196b74eb2b4498bc3e6511915e011a885fcc530f)) + + +### Workflow + +* **protocol:** avoid installing `netcat` in action ([#18159](https://github.com/taikoxyz/taiko-mono/issues/18159)) ([7e27d1d](https://github.com/taikoxyz/taiko-mono/commit/7e27d1de388755b167d864df37133bfedafa2462)) +* **protocol:** trigger patch release (1.10.1) ([#18358](https://github.com/taikoxyz/taiko-mono/issues/18358)) ([f4f4796](https://github.com/taikoxyz/taiko-mono/commit/f4f4796488059b02c79d6fb15170df58dd31dc4e)) +* **repo:** change to trigger hive test manually ([#18514](https://github.com/taikoxyz/taiko-mono/issues/18514)) ([63dec66](https://github.com/taikoxyz/taiko-mono/commit/63dec6695b3e330ba7bd69857743741d7608e2a4)) +* **repo:** update go mod and use random port ([#18515](https://github.com/taikoxyz/taiko-mono/issues/18515)) ([3c2e943](https://github.com/taikoxyz/taiko-mono/commit/3c2e943ab2d6ff636ad69dc7e93df34d8f549c4d)) + + +### Build + +* **deps:** bump github.com/stretchr/testify from 1.9.0 to 1.10.0 ([#18539](https://github.com/taikoxyz/taiko-mono/issues/18539)) ([79f3fab](https://github.com/taikoxyz/taiko-mono/commit/79f3fab5f1d1ec1bb4ee18afb9268b622e894780)) +* **deps:** bump golang.org/x/sync from 0.9.0 to 0.10.0 ([#18560](https://github.com/taikoxyz/taiko-mono/issues/18560)) ([3d51970](https://github.com/taikoxyz/taiko-mono/commit/3d51970aa0953bbfecaeebf76ea7e664c875c0e4)) + +## [0.40.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.39.2...taiko-client-v0.40.0) (2024-12-23) + + +### Features + +* **protocol:** propose a batch blocks conditionally ([#18570](https://github.com/taikoxyz/taiko-mono/issues/18570)) ([e846f62](https://github.com/taikoxyz/taiko-mono/commit/e846f6289fea0b046ddcfcdfaf46f3727efbdf11)) +* **taiko-client:** add chain ID to `TryDecompress()` ([#18444](https://github.com/taikoxyz/taiko-mono/issues/18444)) ([10d99d5](https://github.com/taikoxyz/taiko-mono/commit/10d99d50d3866a6e233d9e3749ea5eb753335815)) +* **taiko-client:** client changes based on [#18150](https://github.com/taikoxyz/taiko-mono/issues/18150) ([#18350](https://github.com/taikoxyz/taiko-mono/issues/18350)) ([ddc6473](https://github.com/taikoxyz/taiko-mono/commit/ddc647327e8d58f5a2def5b902ad06800982544b)) +* **taiko-client:** compatible changes for `lastProposedIn` ([#18442](https://github.com/taikoxyz/taiko-mono/issues/18442)) ([28f32a7](https://github.com/taikoxyz/taiko-mono/commit/28f32a790cc680ecb3e6345221e4183af4f34b2e)) +* **taiko-client:** enable proof aggregation (batch proofs) ([#18163](https://github.com/taikoxyz/taiko-mono/issues/18163)) ([7642961](https://github.com/taikoxyz/taiko-mono/commit/7642961a9031840183f4d00d0a4c19fdb8a68058)) +* **taiko-client:** improve `ProofBuffer` ([#18627](https://github.com/taikoxyz/taiko-mono/issues/18627)) ([c386589](https://github.com/taikoxyz/taiko-mono/commit/c3865896523712afa108be810e75b511e7ecc0c4)) +* **taiko-client:** make p2p-sync required ([#18571](https://github.com/taikoxyz/taiko-mono/issues/18571)) ([de92b28](https://github.com/taikoxyz/taiko-mono/commit/de92b28c03b747845a8a1aa26991307d1ed47fd0)) +* **taiko-client:** revert pr 18442 ([#18450](https://github.com/taikoxyz/taiko-mono/issues/18450)) ([0706f0a](https://github.com/taikoxyz/taiko-mono/commit/0706f0aee9c318d8de298f98480a46de6337937c)) +* **taiko-client:** update Go contract bindings ([#18381](https://github.com/taikoxyz/taiko-mono/issues/18381)) ([71cfc5c](https://github.com/taikoxyz/taiko-mono/commit/71cfc5ce1ef06dcf099a4ce9b22bea6100406148)) +* **taiko-client:** update Go contract bindings ([#18384](https://github.com/taikoxyz/taiko-mono/issues/18384)) ([8dd14a1](https://github.com/taikoxyz/taiko-mono/commit/8dd14a1b4b21ce77ed3aac935b1d2c950e11e729)) +* **taiko-client:** update Go contract bindings ([#18462](https://github.com/taikoxyz/taiko-mono/issues/18462)) ([bc0ee99](https://github.com/taikoxyz/taiko-mono/commit/bc0ee9952234cc6722d3a0e9d9ebd92bca706999)) + + +### Bug Fixes + +* **taiko-client:** valid status check in `BatchGetBlocksProofStatus` ([#18595](https://github.com/taikoxyz/taiko-mono/issues/18595)) ([ec5f599](https://github.com/taikoxyz/taiko-mono/commit/ec5f5999750f70efe58cc061c5856250dcef5ce2)) + + +### Chores + +* **taiko-client:** add `BaseFeeConfig.SharingPctg` to mainnet protocol config ([#18341](https://github.com/taikoxyz/taiko-mono/issues/18341)) ([75d14a7](https://github.com/taikoxyz/taiko-mono/commit/75d14a7afac83b4578a3c32456a28ae70373d5cb)) +* **taiko-client:** update CI badge and path ([#18441](https://github.com/taikoxyz/taiko-mono/issues/18441)) ([6aef03e](https://github.com/taikoxyz/taiko-mono/commit/6aef03e87eaf3cdbfb7637bd6122525f75c611f0)) +* **taiko-client:** update docker-compose config ([#18330](https://github.com/taikoxyz/taiko-mono/issues/18330)) ([74e4ca4](https://github.com/taikoxyz/taiko-mono/commit/74e4ca4aaef07af4958a7b61c95e385022b1cf3c)) +* **taiko-client:** update Go contract bindings generation script ([#18324](https://github.com/taikoxyz/taiko-mono/issues/18324)) ([4f698a0](https://github.com/taikoxyz/taiko-mono/commit/4f698a02bb1714caf527629a637323a9964cdb11)) + + +### Code Refactoring + +* **taiko-client:** move `utils` package from `internal/` to `pkg/` ([#18516](https://github.com/taikoxyz/taiko-mono/issues/18516)) ([b674857](https://github.com/taikoxyz/taiko-mono/commit/b67485732832fb90849179a7a8c8093f2228eb5a)) + + +### Tests + +* **taiko-client:** fix some lint issues for `taiko-client` ([#18517](https://github.com/taikoxyz/taiko-mono/issues/18517)) ([ac7eba6](https://github.com/taikoxyz/taiko-mono/commit/ac7eba69bfe13f026bc6e08074ebaec5dcb067eb)) +* **taiko-client:** introduce TestTxPoolContentWithMinTip test case ([#18285](https://github.com/taikoxyz/taiko-mono/issues/18285)) ([d572f4c](https://github.com/taikoxyz/taiko-mono/commit/d572f4c412e59094ea9a4c5ff0b0667c9c04bd66)) +* **taiko-client:** skip `TestCheckL1ReorgToSameHeightFork` temporarily ([#18522](https://github.com/taikoxyz/taiko-mono/issues/18522)) ([385fed2](https://github.com/taikoxyz/taiko-mono/commit/385fed2ce273d131635c54e99a11704a4ed385b8)) + + +### Workflow + +* **protocol:** trigger patch release (1.10.1) ([#18358](https://github.com/taikoxyz/taiko-mono/issues/18358)) ([f4f4796](https://github.com/taikoxyz/taiko-mono/commit/f4f4796488059b02c79d6fb15170df58dd31dc4e)) +* **repo:** change to trigger hive test manually ([#18514](https://github.com/taikoxyz/taiko-mono/issues/18514)) ([63dec66](https://github.com/taikoxyz/taiko-mono/commit/63dec6695b3e330ba7bd69857743741d7608e2a4)) +* **repo:** update go mod and use random port ([#18515](https://github.com/taikoxyz/taiko-mono/issues/18515)) ([3c2e943](https://github.com/taikoxyz/taiko-mono/commit/3c2e943ab2d6ff636ad69dc7e93df34d8f549c4d)) + + +### Build + +* **deps:** bump github.com/stretchr/testify from 1.9.0 to 1.10.0 ([#18539](https://github.com/taikoxyz/taiko-mono/issues/18539)) ([79f3fab](https://github.com/taikoxyz/taiko-mono/commit/79f3fab5f1d1ec1bb4ee18afb9268b622e894780)) +* **deps:** bump golang.org/x/sync from 0.9.0 to 0.10.0 ([#18560](https://github.com/taikoxyz/taiko-mono/issues/18560)) ([3d51970](https://github.com/taikoxyz/taiko-mono/commit/3d51970aa0953bbfecaeebf76ea7e664c875c0e4)) + +## [0.39.2](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.39.1...taiko-client-v0.39.2) (2024-10-24) + + +### Bug Fixes + +* **protocol:** fix issue in mainnet deployment script ([#18283](https://github.com/taikoxyz/taiko-mono/issues/18283)) ([5c371a1](https://github.com/taikoxyz/taiko-mono/commit/5c371a181af444999f611e03774ec096ffbd1226)) +* **taiko-client:** fix path parsing in `/eth/v1/config/spec` ([#18295](https://github.com/taikoxyz/taiko-mono/issues/18295)) ([6633c80](https://github.com/taikoxyz/taiko-mono/commit/6633c80fbcabb6f06ce5467501da4207bc84be84)) + +## [0.39.1](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.39.0...taiko-client-v0.39.1) (2024-10-22) + + +### Bug Fixes + +* **taiko-client:** fix `lastVerifiedBlockHash` fetch ([#18277](https://github.com/taikoxyz/taiko-mono/issues/18277)) ([8512f45](https://github.com/taikoxyz/taiko-mono/commit/8512f456f033130ecb0e5493a3c36be025908228)) + +## [0.39.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.38.0...taiko-client-v0.39.0) (2024-10-21) + + +### Features + +* **taiko-client:** update `OntakeForkHeight` in mainnet ([#18253](https://github.com/taikoxyz/taiko-mono/issues/18253)) ([21c6235](https://github.com/taikoxyz/taiko-mono/commit/21c62355575adae6d99e1a117f357c6429d79b4c)) + + +### Documentation + +* **taiko-client:** update readme how to do integration test ([#18256](https://github.com/taikoxyz/taiko-mono/issues/18256)) ([b12b32e](https://github.com/taikoxyz/taiko-mono/commit/b12b32e92b5803f15047a6da2b73135f12b9406d)) + + +### Tests + +* **taiko-client:** introduce `taiko-reth` as another L2 node in testing ([#18223](https://github.com/taikoxyz/taiko-mono/issues/18223)) ([e856273](https://github.com/taikoxyz/taiko-mono/commit/e85627365d423fd8353b5bff92e80978774e9c50)) + +## [0.38.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.37.0...taiko-client-v0.38.0) (2024-10-09) + + +### Features + +* **taiko-client:** add `proposer_pool_content_fetch_time` metric ([#18190](https://github.com/taikoxyz/taiko-mono/issues/18190)) ([35579df](https://github.com/taikoxyz/taiko-mono/commit/35579dfa938562969da2395492f4472c300574dd)) + + +### Chores + +* **taiko-client:** bump dependencies ([#18202](https://github.com/taikoxyz/taiko-mono/issues/18202)) ([219a7e8](https://github.com/taikoxyz/taiko-mono/commit/219a7e87c09c7e4ac8d545c65c77a29e6f818701)) + + +### Tests + +* **taiko-client:** remove an unnecessary test ([#18218](https://github.com/taikoxyz/taiko-mono/issues/18218)) ([d624e29](https://github.com/taikoxyz/taiko-mono/commit/d624e29ce1c0ae9ef6704d96516d632600213e13)) + +## [0.37.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.36.0...taiko-client-v0.37.0) (2024-09-28) + + +### Features + +* **taiko-client:** allow `--l1.beacon` to be optional when a blob server is given ([#18094](https://github.com/taikoxyz/taiko-mono/issues/18094)) ([f4d47a3](https://github.com/taikoxyz/taiko-mono/commit/f4d47a3f988462605f04106b14394bb400fc9669)) +* **taiko-client:** improve some logs in zk producer ([#18117](https://github.com/taikoxyz/taiko-mono/issues/18117)) ([109595e](https://github.com/taikoxyz/taiko-mono/commit/109595e7b285709833a782ee0959fd1a815ef706)) +* **taiko-client:** support `TaikoL1.proposeBlocksV2` ([#18116](https://github.com/taikoxyz/taiko-mono/issues/18116)) ([d0c0fed](https://github.com/taikoxyz/taiko-mono/commit/d0c0fed57c8b8ba139b65d0215df1976358e7635)) +* **taiko-client:** update contract bingdings ([#18182](https://github.com/taikoxyz/taiko-mono/issues/18182)) ([8954764](https://github.com/taikoxyz/taiko-mono/commit/8954764d96c256408c1cfd77deb1621da288a33c)) +* **taiko-client:** update prover balance check to include bond balance ([#18092](https://github.com/taikoxyz/taiko-mono/issues/18092)) ([5d5ca74](https://github.com/taikoxyz/taiko-mono/commit/5d5ca74970f88493ea75b14a13fe852f840f019a)) + + +### Bug Fixes + +* **taiko-client:** dont check l1heightInAnchor vs l1Height when detecting reorg ([#18110](https://github.com/taikoxyz/taiko-mono/issues/18110)) ([7ed9b6f](https://github.com/taikoxyz/taiko-mono/commit/7ed9b6f647fd1611e036ce12e4fd96696ef231ea)) +* **taiko-client:** fix blob server API URL when fetching blob data ([#18109](https://github.com/taikoxyz/taiko-mono/issues/18109)) ([7230dfd](https://github.com/taikoxyz/taiko-mono/commit/7230dfd1150edc7c08be6f97a46c1184a0b2d289)) +* **taiko-client:** fix process in handling empty proof ([#18128](https://github.com/taikoxyz/taiko-mono/issues/18128)) ([d6d90d8](https://github.com/taikoxyz/taiko-mono/commit/d6d90d887be8955f844c52c4fb100fa46d66fa47)) +* **taiko-client:** fix revert case when propose blob blocks ([#18185](https://github.com/taikoxyz/taiko-mono/issues/18185)) ([656e757](https://github.com/taikoxyz/taiko-mono/commit/656e757d629131cb03af894269ef447c39e9741e)) +* **taiko-client:** improve prover balance check based on 18092 ([#18129](https://github.com/taikoxyz/taiko-mono/issues/18129)) ([b6cd50b](https://github.com/taikoxyz/taiko-mono/commit/b6cd50b61577d1eaa7aa29bd3e728271bcd4996f)) +* **taiko-client:** record `lastProposedAt` after ontake fork ([#18166](https://github.com/taikoxyz/taiko-mono/issues/18166)) ([ea0ca90](https://github.com/taikoxyz/taiko-mono/commit/ea0ca9040cc3d1d9fec50777d40b3cf69803c115)) +* **taiko-client:** revert path changes about SocialScan endpoint ([#18119](https://github.com/taikoxyz/taiko-mono/issues/18119)) ([38fa03a](https://github.com/taikoxyz/taiko-mono/commit/38fa03ab78d9cf4e70df8c623a74a4d69cf85682)) + + +### Chores + +* **protocol:** remove reliance on taiko contracts and update golangci-lint ([#18151](https://github.com/taikoxyz/taiko-mono/issues/18151)) ([92f571a](https://github.com/taikoxyz/taiko-mono/commit/92f571a15daa4ad300b4665bbace9248c439fd11)) +* **taiko-client:** revert building changes ([#18174](https://github.com/taikoxyz/taiko-mono/issues/18174)) ([485b2ee](https://github.com/taikoxyz/taiko-mono/commit/485b2ee9a4bf4e16b9d0ab7b704eba0b0a46996c)) +* **taiko-client:** try cross-compile taiko-client to speed up docker building ([#18171](https://github.com/taikoxyz/taiko-mono/issues/18171)) ([9dbad24](https://github.com/taikoxyz/taiko-mono/commit/9dbad24cefcd260e2b452c9e8a46fcbe5f327cb4)) + + +### Tests + +* **taiko-client:** disable docker pull in hive test ([#18101](https://github.com/taikoxyz/taiko-mono/issues/18101)) ([95c9da2](https://github.com/taikoxyz/taiko-mono/commit/95c9da29fdd432de156f331802b79703a2311898)) +* **taiko-client:** introduce `TestProposeTxListOntake` ([#18167](https://github.com/taikoxyz/taiko-mono/issues/18167)) ([5023226](https://github.com/taikoxyz/taiko-mono/commit/5023226a7aa2e7355e835f9447b17eb85c60032a)) +* **taiko-client:** introduce blob-server and blob-l1-beacon hive tests ([#18121](https://github.com/taikoxyz/taiko-mono/issues/18121)) ([c544fe8](https://github.com/taikoxyz/taiko-mono/commit/c544fe8c33e26bfae951fb15c423aec2b749d092)) +* **taiko-client:** upgrade full sync and snap sync hive tests ([#18010](https://github.com/taikoxyz/taiko-mono/issues/18010)) ([1d18c17](https://github.com/taikoxyz/taiko-mono/commit/1d18c170566aed645e2e03b024e7fe2f2a01756d)) + + +### Workflow + +* **protocol:** avoid installing `netcat` in action ([#18159](https://github.com/taikoxyz/taiko-mono/issues/18159)) ([7e27d1d](https://github.com/taikoxyz/taiko-mono/commit/7e27d1de388755b167d864df37133bfedafa2462)) + +## [0.36.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.35.0...taiko-client-v0.36.0) (2024-09-12) + + +### Features + +* **taiko-client:** update Go contract bindings after protocol restructure ([#18075](https://github.com/taikoxyz/taiko-mono/issues/18075)) ([57f4953](https://github.com/taikoxyz/taiko-mono/commit/57f49530828e6da2d28ab3979576befdee626c7d)) + +## [0.35.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.34.1...taiko-client-v0.35.0) (2024-09-10) + + +### Features + +* **taiko-client:** add two more new ZK related metrics ([#18043](https://github.com/taikoxyz/taiko-mono/issues/18043)) ([e43eeac](https://github.com/taikoxyz/taiko-mono/commit/e43eeacb5b7a3d1fc412ffafc39f329f68ff7b40)) +* **taiko-client:** remove the legacy `290` tier ([#18035](https://github.com/taikoxyz/taiko-mono/issues/18035)) ([5064037](https://github.com/taikoxyz/taiko-mono/commit/50640377db773763c3ccba1bc4f342cd1e497147)) +* **taiko-client:** update `ontakeForkHeight` to Sep 24, 2024 ([#18047](https://github.com/taikoxyz/taiko-mono/issues/18047)) ([a1ff620](https://github.com/taikoxyz/taiko-mono/commit/a1ff620507e4a8077705c981c3622e3787a55ecd)) +* **taiko-client:** update contract binding & add `Proposer` ([#18053](https://github.com/taikoxyz/taiko-mono/issues/18053)) ([d0554a2](https://github.com/taikoxyz/taiko-mono/commit/d0554a208c4913751ff5b273f3e96ca298279d14)) +* **taiko-client:** use `proveBlocks` by default for post ontake blocks ([#18042](https://github.com/taikoxyz/taiko-mono/issues/18042)) ([15709af](https://github.com/taikoxyz/taiko-mono/commit/15709af1520251f4baeba7d2bbbc8de841bee718)) + + +### Bug Fixes + +* **taiko-client:** use proposed at, not timestamp when fetching blob ([#18055](https://github.com/taikoxyz/taiko-mono/issues/18055)) ([32d95c1](https://github.com/taikoxyz/taiko-mono/commit/32d95c1d9e887e886da57e580554413b4f3a19c5)) + +## [0.34.1](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.34.0...taiko-client-v0.34.1) (2024-09-04) + + +### Bug Fixes + +* **taiko-client:** temp support tier 290 ([#18030](https://github.com/taikoxyz/taiko-mono/issues/18030)) ([f1aeac3](https://github.com/taikoxyz/taiko-mono/commit/f1aeac39d3c2ce06578a64bbe8a2fe4343d212f4)) + +## [0.34.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.33.1...taiko-client-v0.34.0) (2024-09-02) + + +### Features + +* **taiko-client:** introduce sp1 zk proof ([#18003](https://github.com/taikoxyz/taiko-mono/issues/18003)) ([492c208](https://github.com/taikoxyz/taiko-mono/commit/492c208b97e8fa08eb3e11b0a8712a5542eba660)) +* **taiko-client:** remove an unused field in prover ([#18024](https://github.com/taikoxyz/taiko-mono/issues/18024)) ([5d416d2](https://github.com/taikoxyz/taiko-mono/commit/5d416d2366e485b242818fb1a15eb0281cb7cedf)) +* **taiko-client:** remove an unused filed in proposer ([#18021](https://github.com/taikoxyz/taiko-mono/issues/18021)) ([64fdf5c](https://github.com/taikoxyz/taiko-mono/commit/64fdf5c80708b14d2cefadfbd78ee59810df3f65)) +* **taiko-client:** update Go contract bindings ([#18012](https://github.com/taikoxyz/taiko-mono/issues/18012)) ([7f054ca](https://github.com/taikoxyz/taiko-mono/commit/7f054ca4505313f8fc500cdb28bf223a254424e2)) + +## [0.33.1](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.33.0...taiko-client-v0.33.1) (2024-08-30) + + +### Bug Fixes + +* **taiko-client:** initialize private mempool transaction sender in `InitFromConfig` ([#18005](https://github.com/taikoxyz/taiko-mono/issues/18005)) ([58f1c85](https://github.com/taikoxyz/taiko-mono/commit/58f1c85ad471a545f8f00bfd32b3241657f38e8f)) + +## [0.33.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.32.0...taiko-client-v0.33.0) (2024-08-29) + + +### Features + +* **taiko-client:** introduce `CalculateBaseFee()` method ([#17989](https://github.com/taikoxyz/taiko-mono/issues/17989)) ([fdee419](https://github.com/taikoxyz/taiko-mono/commit/fdee4195541e5c675561cf34c5e1a9e3e3990bbf)) +* **taiko-client:** introduce `TxMgrSelector` for proposer / prover ([#17986](https://github.com/taikoxyz/taiko-mono/issues/17986)) ([6eb298f](https://github.com/taikoxyz/taiko-mono/commit/6eb298f31723e838ac4261fbecbfcfce371d8606)) +* **taiko-client:** update Go contract bindings ([#17997](https://github.com/taikoxyz/taiko-mono/issues/17997)) ([606114f](https://github.com/taikoxyz/taiko-mono/commit/606114faa0b5642055455f07cbd7ec2c3c23b00c)) +* **taiko-client:** update protocol configs temporarily ([#17999](https://github.com/taikoxyz/taiko-mono/issues/17999)) ([7893700](https://github.com/taikoxyz/taiko-mono/commit/789370090ffb7d985b2d9d55bf4efec8495df6bd)) + + +### Bug Fixes + +* **taiko-client:** fix CallOpts and `TestTreasuryIncome` test case ([#18000](https://github.com/taikoxyz/taiko-mono/issues/18000)) ([5707a08](https://github.com/taikoxyz/taiko-mono/commit/5707a08ffab3c981f0f23bcb8c7833176903d183)) + + +### Chores + +* **taiko-client:** don't use color prefix in log's terminal handler ([#17991](https://github.com/taikoxyz/taiko-mono/issues/17991)) ([1675cec](https://github.com/taikoxyz/taiko-mono/commit/1675cecab5773d1c4fdf82b8e000a6f5bebddfc6)) + + +### Tests + +* **taiko-client:** support full sync and snap sync in hive test ([#17995](https://github.com/taikoxyz/taiko-mono/issues/17995)) ([831198b](https://github.com/taikoxyz/taiko-mono/commit/831198baecc5f0e10c5c8fac1c04f9dad320c63c)) +* **taiko-client:** support multi clusters reorg hive test ([#17987](https://github.com/taikoxyz/taiko-mono/issues/17987)) ([28d9072](https://github.com/taikoxyz/taiko-mono/commit/28d90729adc391cb04b58fa2c32a9e3bfbd989a5)) + +## [0.32.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.31.0...taiko-client-v0.32.0) (2024-08-27) + + +### Features + +* **taiko-client:** add optional `l1.private` ([#17962](https://github.com/taikoxyz/taiko-mono/issues/17962)) ([9274f2d](https://github.com/taikoxyz/taiko-mono/commit/9274f2dc90f18c58cc208146f584c9f9715d3d60)) +* **taiko-client:** optimising statistics on proof request times ([#17976](https://github.com/taikoxyz/taiko-mono/issues/17976)) ([791f44f](https://github.com/taikoxyz/taiko-mono/commit/791f44f381fa362f24c4beff5b5b25c47929bbc4)) + + +### Bug Fixes + +* **taiko-client:** fix some issues about `calculateBaseFee` ([#17978](https://github.com/taikoxyz/taiko-mono/issues/17978)) ([b010efe](https://github.com/taikoxyz/taiko-mono/commit/b010efe195259e7c98e0ad6fb91b0c6484ae2b80)) +* **taiko-client:** prints logs when using `privateTxMgr` ([#17980](https://github.com/taikoxyz/taiko-mono/issues/17980)) ([a0c3388](https://github.com/taikoxyz/taiko-mono/commit/a0c33882ca00fb834001abac95b6ade656d55e87)) + + +### Chores + +* **taiko-client:** fix lint errors ([#17969](https://github.com/taikoxyz/taiko-mono/issues/17969)) ([eedec99](https://github.com/taikoxyz/taiko-mono/commit/eedec991c92d5fcd418cde4db9d16c9b36122a0a)) +* **taiko-client:** keep env vars same with the flag name ([#17964](https://github.com/taikoxyz/taiko-mono/issues/17964)) ([d08a1de](https://github.com/taikoxyz/taiko-mono/commit/d08a1de8a36a4bac484bf0390728cb8ed87b3a0b)) + + +### Tests + +* **taiko-client:** introduce multi nodes hive test ([#17981](https://github.com/taikoxyz/taiko-mono/issues/17981)) ([9910863](https://github.com/taikoxyz/taiko-mono/commit/9910863865ecf7f583552e74f6a5d2e1a4060dca)) +* **taiko-client:** introduce reorg hive test ([#17965](https://github.com/taikoxyz/taiko-mono/issues/17965)) ([ab601ee](https://github.com/taikoxyz/taiko-mono/commit/ab601eea813190a314555c1773a982de16da0e59)) +* **taiko-client:** open container logs and close build image logs ([#17959](https://github.com/taikoxyz/taiko-mono/issues/17959)) ([b541201](https://github.com/taikoxyz/taiko-mono/commit/b54120141f0e18f1912db66d28390d2a92af36c9)) +* **taiko-client:** update HIVE test configurations ([#17950](https://github.com/taikoxyz/taiko-mono/issues/17950)) ([4818274](https://github.com/taikoxyz/taiko-mono/commit/4818274860e8d626e5456479a520229e7c17f31c)) + +## [0.31.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.30.0...taiko-client-v0.31.0) (2024-08-20) + + +### Features + +* **taiko-client:** update hekla's protocol config ([#17955](https://github.com/taikoxyz/taiko-mono/issues/17955)) ([4b6a70d](https://github.com/taikoxyz/taiko-mono/commit/4b6a70dd4fb22146ee6702b8484a4a2b4fbce6c2)) + +## [0.30.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.29.0...taiko-client-v0.30.0) (2024-08-19) + + +### Features + +* **protocol:** introduce `AssembleAnchorV2Tx` method in `AnchorTxConstructor` ([#17850](https://github.com/taikoxyz/taiko-mono/issues/17850)) ([f71b178](https://github.com/taikoxyz/taiko-mono/commit/f71b1780eb98ff3cbbcf7def4388837f33e3fe37)) +* **protocol:** introduce risc0 proof ([#17877](https://github.com/taikoxyz/taiko-mono/issues/17877)) ([bcb57cb](https://github.com/taikoxyz/taiko-mono/commit/bcb57cb81d12d0c09656582ad9140b38015b3a58)) +* **taiko-client:** add `RaikoZKVMHostEndpoint` and rename ([#17926](https://github.com/taikoxyz/taiko-mono/issues/17926)) ([0838f79](https://github.com/taikoxyz/taiko-mono/commit/0838f7993015fc9fc9cacfb3da7b100d52bc856c)) +* **taiko-client:** changes based on the latest basefee improvements ([#17911](https://github.com/taikoxyz/taiko-mono/issues/17911)) ([0c10ac9](https://github.com/taikoxyz/taiko-mono/commit/0c10ac9c4973d3ef8a5e35a8646516639b328fa0)) +* **taiko-client:** client changes for `ontake` fork ([#17746](https://github.com/taikoxyz/taiko-mono/issues/17746)) ([2aabf3d](https://github.com/taikoxyz/taiko-mono/commit/2aabf3de3456ce8cbd56d15be336d08445b9f242)) +* **taiko-client:** client updates based on [#17871](https://github.com/taikoxyz/taiko-mono/issues/17871) ([#17873](https://github.com/taikoxyz/taiko-mono/issues/17873)) ([dbed3ab](https://github.com/taikoxyz/taiko-mono/commit/dbed3aba3d7f49f982f6335b79f5d5b096f890a3)) +* **taiko-client:** introduce `BasefeeSharingPctg` in `BlockMetadata` ([#17853](https://github.com/taikoxyz/taiko-mono/issues/17853)) ([5f2d696](https://github.com/taikoxyz/taiko-mono/commit/5f2d6961b9d077e47f34bf7f5d1fbffaf380bde1)) +* **taiko-client:** introduce `TaikoDataBlockV2` ([#17936](https://github.com/taikoxyz/taiko-mono/issues/17936)) ([c608116](https://github.com/taikoxyz/taiko-mono/commit/c608116523922fa4664968dc73608a118b5b97ba)) +* **taiko-client:** introduce `TierZkVMRisc0ID` ([#17915](https://github.com/taikoxyz/taiko-mono/issues/17915)) ([96aa5c2](https://github.com/taikoxyz/taiko-mono/commit/96aa5c2a5cd096ac3560fe17106ec042a877bfc1)) +* **taiko-client:** remove `basefeeSharingPctg` from metadata ([#17890](https://github.com/taikoxyz/taiko-mono/issues/17890)) ([57c8f6f](https://github.com/taikoxyz/taiko-mono/commit/57c8f6f3a8f920bab8fecd75bfa36a6b71ef808d)) +* **taiko-client:** update `BlockParamsV2` struct ([#17893](https://github.com/taikoxyz/taiko-mono/issues/17893)) ([a1043a8](https://github.com/taikoxyz/taiko-mono/commit/a1043a85631892e0b03e0f9f4bb850d4e9a70967)) +* **taiko-client:** update Go contract bindings ([#17869](https://github.com/taikoxyz/taiko-mono/issues/17869)) ([d9bd72b](https://github.com/taikoxyz/taiko-mono/commit/d9bd72b76aa0bed4ccfe834053f6561a53e1367d)) +* **taiko-client:** update Go contract bindings ([#17885](https://github.com/taikoxyz/taiko-mono/issues/17885)) ([3179074](https://github.com/taikoxyz/taiko-mono/commit/31790747cfc743b218d5a3568b9d70b64df5a86c)) +* **taiko-client:** update ontake basefee calculation ([#17892](https://github.com/taikoxyz/taiko-mono/issues/17892)) ([6972dea](https://github.com/taikoxyz/taiko-mono/commit/6972dea313edbc9a30617d2f7aea2dfc9230c432)) + + +### Bug Fixes + +* **taiko-client:** avoid seting nil value to `GuardianProverHeartbeater` ([#17802](https://github.com/taikoxyz/taiko-mono/issues/17802)) ([4076324](https://github.com/taikoxyz/taiko-mono/commit/40763241b5f2960f019d6be7e1040c65765f938a)) +* **taiko-client:** fix zk status recognition ([#17946](https://github.com/taikoxyz/taiko-mono/issues/17946)) ([164e476](https://github.com/taikoxyz/taiko-mono/commit/164e47686f41cbb119a230c7a1ad56ef4d0b3117)) + + +### Chores + +* **protocol:** revert `TAIKO_TOKEN` name changes in `DeployOnL1` ([#17927](https://github.com/taikoxyz/taiko-mono/issues/17927)) ([cf1a15f](https://github.com/taikoxyz/taiko-mono/commit/cf1a15f46344e60448c5fdcbcae02521fb5b7c04)) +* **taiko-client:** add hive tests to workflow ([#17897](https://github.com/taikoxyz/taiko-mono/issues/17897)) ([323d728](https://github.com/taikoxyz/taiko-mono/commit/323d7285d83b83adfd220747fb3f55b5cd72d877)) +* **taiko-client:** update `hive_tests.sh` ([#17923](https://github.com/taikoxyz/taiko-mono/issues/17923)) ([05d49b0](https://github.com/taikoxyz/taiko-mono/commit/05d49b07f9131bc034d00ad6cb7b7868a9af2bfc)) + + +### Code Refactoring + +* **taiko-client:** rm unused `L1_NODE_HTTP_ENDPOINT` ([#17768](https://github.com/taikoxyz/taiko-mono/issues/17768)) ([73c7aee](https://github.com/taikoxyz/taiko-mono/commit/73c7aeeffaffbf875af84e8be595af828877be2b)) + + +### Tests + +* **taiko-client:** update hive dependence and fix bug about hive test ([#17930](https://github.com/taikoxyz/taiko-mono/issues/17930)) ([dd40a4e](https://github.com/taikoxyz/taiko-mono/commit/dd40a4e6696b9c27135823cd545e7e5249a66e8c)) +* **taiko-client:** use env names which defined in flag configs ([#17921](https://github.com/taikoxyz/taiko-mono/issues/17921)) ([196b74e](https://github.com/taikoxyz/taiko-mono/commit/196b74eb2b4498bc3e6511915e011a885fcc530f)) + +## [0.29.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.28.0...taiko-client-v0.29.0) (2024-07-05) + + +### Features + +* **taiko-client:** add `--epoch.minTip` flag ([#17726](https://github.com/taikoxyz/taiko-mono/issues/17726)) ([a331e9d](https://github.com/taikoxyz/taiko-mono/commit/a331e9d88b72f5f07e43a711dd9a3ac913c4d4f6)) +* **taiko-client:** add `defaultRequestTimeout` for `SGXProofProducer` ([#17724](https://github.com/taikoxyz/taiko-mono/issues/17724)) ([e301451](https://github.com/taikoxyz/taiko-mono/commit/e3014519cebaef6a5a37d7982121c39f5b82ee27)) +* **taiko-client:** add proof status check before generating proof ([#17711](https://github.com/taikoxyz/taiko-mono/issues/17711)) ([9a8e15e](https://github.com/taikoxyz/taiko-mono/commit/9a8e15eccb720dda3a703937aae5c8ae3dc495c2)) +* **taiko-client:** call `CreateAccessList` ([#17691](https://github.com/taikoxyz/taiko-mono/issues/17691)) ([9bb4b9c](https://github.com/taikoxyz/taiko-mono/commit/9bb4b9c94f3bc2a8fef1c793d13bf749d8c0614f)) +* **taiko-client:** improve `ProverProvenByGuardianGauge` metric ([#17703](https://github.com/taikoxyz/taiko-mono/issues/17703)) ([c88fcd1](https://github.com/taikoxyz/taiko-mono/commit/c88fcd11fa29beb6a7529e5b8bf172a6a9cd6ecd)) +* **taiko-client:** introduce `--epoch.allowZeroInterval` flag ([#17727](https://github.com/taikoxyz/taiko-mono/issues/17727)) ([e76890d](https://github.com/taikoxyz/taiko-mono/commit/e76890d9223cdd68d3d97202a9a12a1f6d9b217f)) +* **taiko-client:** introduce `AccessList` ([#17676](https://github.com/taikoxyz/taiko-mono/issues/17676)) ([3c95477](https://github.com/taikoxyz/taiko-mono/commit/3c95477a284ac94c7e3ce85c9cefdadc1aaacd06)) +* **taiko-client:** introduce `TryDecompressHekla()` ([#17735](https://github.com/taikoxyz/taiko-mono/issues/17735)) ([67a7a37](https://github.com/taikoxyz/taiko-mono/commit/67a7a372a3931a0959a2422c753e97bddaa35961)) +* **taiko-client:** make request timeout to raiko configurable ([#17728](https://github.com/taikoxyz/taiko-mono/issues/17728)) ([f8f796c](https://github.com/taikoxyz/taiko-mono/commit/f8f796cc87e1d2398af299716960c9d03cdfcb35)) +* **taiko-client:** remove prover server package ([#17748](https://github.com/taikoxyz/taiko-mono/issues/17748)) ([b064ea0](https://github.com/taikoxyz/taiko-mono/commit/b064ea0a22413a7856cd7d41a2ac92a0beeba556)) +* **taiko-client:** revert access list changes ([#17694](https://github.com/taikoxyz/taiko-mono/issues/17694)) ([fd15dab](https://github.com/taikoxyz/taiko-mono/commit/fd15dabc01666fdbee949a9ecb6805d2ce8fc7f9)) +* **taiko-client:** update bindings && fix tests ([#17680](https://github.com/taikoxyz/taiko-mono/issues/17680)) ([10b95e1](https://github.com/taikoxyz/taiko-mono/commit/10b95e1c54dfe77de2badbe77439c2449cc9a65e)) +* **taiko-client:** update Go contract bindings ([#17733](https://github.com/taikoxyz/taiko-mono/issues/17733)) ([9d18504](https://github.com/taikoxyz/taiko-mono/commit/9d185041c7fe9c3787f1a73f89bb0dc6cfce32bc)) + + +### Code Refactoring + +* **taiko-client:** rm tier fee related flag ([#17750](https://github.com/taikoxyz/taiko-mono/issues/17750)) ([b41437b](https://github.com/taikoxyz/taiko-mono/commit/b41437b47a8ad3bc68edbfb8d9aea6b2fbbe9b05)) +* **taiko-client:** rm unused code and refactor ([#17723](https://github.com/taikoxyz/taiko-mono/issues/17723)) ([8c9a032](https://github.com/taikoxyz/taiko-mono/commit/8c9a0329b2702d68e18ba97c506c5d1ad20c92c7)) +* **taiko-client:** rm unused tier fee ([#17740](https://github.com/taikoxyz/taiko-mono/issues/17740)) ([3e139fa](https://github.com/taikoxyz/taiko-mono/commit/3e139fa4114807d68d02d2af30c7d5ad3759ec38)) + +## [0.28.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.27.1...taiko-client-v0.28.0) (2024-06-24) + + +### Features + +* **taiko-client:** improve some comments in prover ([#17668](https://github.com/taikoxyz/taiko-mono/issues/17668)) ([e7afcfe](https://github.com/taikoxyz/taiko-mono/commit/e7afcfe18399240fbac04a7d90a52fe17edcab67)) + + +### Chores + +* **taiko-client:** revert the failed cross-compilation ([#17670](https://github.com/taikoxyz/taiko-mono/issues/17670)) ([0a1de79](https://github.com/taikoxyz/taiko-mono/commit/0a1de792eaf0c17de1b873a465febe1dca9ce16a)) + +## [0.27.1](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.27.0...taiko-client-v0.27.1) (2024-06-24) + + +### Bug Fixes + +* **taiko-client:** remove Go build cache ([#17661](https://github.com/taikoxyz/taiko-mono/issues/17661)) ([f6075f7](https://github.com/taikoxyz/taiko-mono/commit/f6075f75ca57b8136e7edfed2b73912c79ccec63)) + +## [0.27.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.26.0...taiko-client-v0.27.0) (2024-06-24) + + +### Features + +* **taiko-client:** build using cross-compilation ([#17564](https://github.com/taikoxyz/taiko-mono/issues/17564)) ([e66a0c8](https://github.com/taikoxyz/taiko-mono/commit/e66a0c889eade8e323255d3129faa4fd512d5c94)) +* **taiko-client:** disable hook in client ([#17642](https://github.com/taikoxyz/taiko-mono/issues/17642)) ([099ce22](https://github.com/taikoxyz/taiko-mono/commit/099ce22139e8c545a46369dce158de4b9bb6297e)) +* **taiko-client:** update Go contract bindings ([#17568](https://github.com/taikoxyz/taiko-mono/issues/17568)) ([f190919](https://github.com/taikoxyz/taiko-mono/commit/f19091941362609b736bbbf1eee28fc459fc324a)) + +## [0.26.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.25.0...taiko-client-v0.26.0) (2024-06-08) + + +### Features + +* **taiko-client:** allow hooks to be empty if prover and proposer are the same address ([#17520](https://github.com/taikoxyz/taiko-mono/issues/17520)) ([2db6d2c](https://github.com/taikoxyz/taiko-mono/commit/2db6d2c3a978b75f0f57337f1481d1a1066594ea)) + + +### Bug Fixes + +* **taiko-client:** fix an address check in `AssignProver` ([#17526](https://github.com/taikoxyz/taiko-mono/issues/17526)) ([d6001d3](https://github.com/taikoxyz/taiko-mono/commit/d6001d3f52bed12ff962c7558b9fc173fc964ddb)) + ## [0.25.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.24.0...taiko-client-v0.25.0) (2024-06-04) diff --git a/packages/taiko-client/Dockerfile b/packages/taiko-client/Dockerfile index 6e3a83944b6..12edb318ae7 100644 --- a/packages/taiko-client/Dockerfile +++ b/packages/taiko-client/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21-alpine as builder +FROM golang:1.23-alpine as builder RUN apk update && apk add --no-cache --update gcc musl-dev linux-headers git make build-base @@ -10,8 +10,7 @@ COPY packages/taiko-client/ packages/taiko-client/ WORKDIR /build/packages/taiko-client -RUN --mount=type=cache,target=/root/.cache/go-build,sharing=locked \ - make build +RUN make build FROM alpine:latest @@ -20,5 +19,7 @@ RUN apk add --no-cache ca-certificates libstdc++ COPY --from=builder /build/packages/taiko-client/bin/taiko-client /usr/local/bin/ EXPOSE 6060 +EXPOSE 1234 +EXPOSE 1235 ENTRYPOINT ["taiko-client"] diff --git a/packages/taiko-client/Makefile b/packages/taiko-client/Makefile index e375ef6799f..3bfdd7396e6 100644 --- a/packages/taiko-client/Makefile +++ b/packages/taiko-client/Makefile @@ -14,15 +14,20 @@ clean: lint: @go install golang.org/x/tools/cmd/goimports@latest \ - && go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.56.2 \ + && go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.60 \ && goimports -local "github.com/taikoxyz/taiko-mono/packages/taiko-client" -w ./ \ && golangci-lint run -test: lint +test: @PACKAGE=${PACKAGE} \ + L2_NODE=$${L2_NODE:-l2_geth} \ RUN_TESTS=true \ ./integration_test/entrypoint.sh +# HIVE_BASE_DIR(the path of git@github.com:taikoxyz/hive.git) is necessary when run hive_test in local environment. +hive_tests: + @sh ./integration_test/hive_tests.sh + dev_net: @COMPILE_PROTOCOL=${COMPILE_PROTOCOL} \ ./integration_test/entrypoint.sh @@ -35,5 +40,6 @@ gen_bindings: clean \ lint \ test \ + hive_tests \ dev_net \ gen_bindings diff --git a/packages/taiko-client/README.md b/packages/taiko-client/README.md index 5ba73def53c..70ff96eadbe 100644 --- a/packages/taiko-client/README.md +++ b/packages/taiko-client/README.md @@ -1,11 +1,11 @@ # taiko-client -[![CI](https://github.com/taikoxyz/taiko-mono/actions/workflows/taiko-client-test.yml/badge.svg)](https://github.com/taikoxyz/taiko-mono/actions/workflows/taiko-client-test.yml) +[![CI](https://github.com/taikoxyz/taiko-mono/actions/workflows/taiko-client--test.yml/badge.svg)](https://github.com/taikoxyz/taiko-mono/actions/workflows/taiko-client-test.yml) -Taiko protocol's client software implementation in Go. Learn more about Taiko nodes with [the docs](https://docs.taiko.xyz/core-concepts/taiko-nodes/). +Taiko protocol's client software implementation in Go. Learn more about Taiko nodes with [the docs](https://docs.taiko.xyz/taiko-protocol/taiko-nodes). ## Project structure diff --git a/packages/taiko-client/bindings/.githead b/packages/taiko-client/bindings/.githead index c574c41185b..98ef6c34a28 100644 --- a/packages/taiko-client/bindings/.githead +++ b/packages/taiko-client/bindings/.githead @@ -1 +1 @@ -3ae25fdfc1452c0088afd2711dfbdbbefb670efc +54d27a0c7ac9afb266a3a7deb19947d1ef0c78e7 diff --git a/packages/taiko-client/bindings/encoding/custom_error.go b/packages/taiko-client/bindings/encoding/custom_error.go index 0c78ab8b8da..f453500c4e7 100644 --- a/packages/taiko-client/bindings/encoding/custom_error.go +++ b/packages/taiko-client/bindings/encoding/custom_error.go @@ -89,6 +89,12 @@ func getErrorData(err error) string { return errData } } + + // Anvil node custom errors with reasons, example: + // execution reverted: custom error 1a83d90e:, reason: 0x1a83d90e" + if strings.Contains(err.Error(), "custom error") && strings.Contains(err.Error(), "reason") { + return "0x" + err.Error()[len(err.Error())-8:len(err.Error())] + } // Anvil node custom errors, example: // "execution reverted: custom error 712eb087:" if strings.Contains(err.Error(), "custom error") { diff --git a/packages/taiko-client/bindings/encoding/input.go b/packages/taiko-client/bindings/encoding/input.go index 2aa5b021efc..cf6aa6ab893 100644 --- a/packages/taiko-client/bindings/encoding/input.go +++ b/packages/taiko-client/bindings/encoding/input.go @@ -1,17 +1,15 @@ package encoding import ( - "bytes" - "encoding/binary" "errors" "fmt" + "math/big" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) // ABI arguments marshaling components. @@ -73,6 +71,118 @@ var ( Name: "sender", Type: "address", }, + { + Name: "blobTxListOffset", + Type: "uint32", + }, + { + Name: "blobTxListLength", + Type: "uint32", + }, + } + blockMetadataV2Components = []abi.ArgumentMarshaling{ + { + Name: "anchorBlockHash", + Type: "bytes32", + }, + { + Name: "difficulty", + Type: "bytes32", + }, + { + Name: "blobHash", + Type: "bytes32", + }, + { + Name: "extraData", + Type: "bytes32", + }, + { + Name: "coinbase", + Type: "address", + }, + { + Name: "id", + Type: "uint64", + }, + { + Name: "gasLimit", + Type: "uint32", + }, + { + Name: "timestamp", + Type: "uint64", + }, + { + Name: "anchorBlockId", + Type: "uint64", + }, + { + Name: "minTier", + Type: "uint16", + }, + { + Name: "blobUsed", + Type: "bool", + }, + { + Name: "parentMetaHash", + Type: "bytes32", + }, + { + Name: "proposer", + Type: "address", + }, + { + Name: "livenessBond", + Type: "uint96", + }, + { + Name: "proposedAt", + Type: "uint64", + }, + { + Name: "proposedIn", + Type: "uint64", + }, + { + Name: "blobTxListOffset", + Type: "uint32", + }, + { + Name: "blobTxListLength", + Type: "uint32", + }, + { + Name: "blobIndex", + Type: "uint8", + }, + { + Name: "baseFeeConfig", + Type: "tuple", + Components: []abi.ArgumentMarshaling{ + { + Name: "adjustmentQuotient", + Type: "uint8", + }, + { + Name: "sharingPctg", + Type: "uint8", + }, + { + Name: "gasIssuancePerSecond", + Type: "uint32", + }, + { + Name: "minGasExcess", + Type: "uint64", + }, + { + Name: "maxGasIssuancePerBlock", + Type: "uint32", + }, + }, + }, } transitionComponents = []abi.ArgumentMarshaling{ { @@ -137,104 +247,92 @@ var ( Name: "signature", Type: "bytes", }, - } - proverAssignmentComponents = []abi.ArgumentMarshaling{ { - Name: "feeToken", - Type: "address", + Name: "l1StateBlockNumber", + Type: "uint32", }, { - Name: "expiry", + Name: "timestamp", Type: "uint64", }, { - Name: "maxBlockId", - Type: "uint64", + Name: "blobTxListOffset", + Type: "uint32", }, { - Name: "maxProposedIn", - Type: "uint64", + Name: "blobTxListLength", + Type: "uint32", }, { - Name: "metaHash", - Type: "bytes32", + Name: "blobIndex", + Type: "uint8", + }, + } + blockParamsV2Components = []abi.ArgumentMarshaling{ + { + Name: "proposer", + Type: "address", + }, + { + Name: "coinbase", + Type: "address", }, { Name: "parentMetaHash", Type: "bytes32", }, { - Name: "tierFees", - Type: "tuple[]", - Components: []abi.ArgumentMarshaling{ - { - Name: "tier", - Type: "uint16", - }, - { - Name: "fee", - Type: "uint128", - }, - }, + Name: "anchorBlockId", + Type: "uint64", }, { - Name: "signature", - Type: "bytes", + Name: "timestamp", + Type: "uint64", }, - } - assignmentHookInputComponents = []abi.ArgumentMarshaling{ { - Name: "assignment", - Type: "tuple", - Components: proverAssignmentComponents, + Name: "blobTxListOffset", + Type: "uint32", }, { - Name: "tip", - Type: "uint256", + Name: "blobTxListLength", + Type: "uint32", + }, + { + Name: "blobIndex", + Type: "uint8", }, } ) var ( - assignmentHookInputType, _ = abi.NewType("tuple", "AssignmentHook.Input", assignmentHookInputComponents) - assignmentHookInputArgs = abi.Arguments{{Name: "AssignmentHook.Input", Type: assignmentHookInputType}} - blockParamsComponentsType, _ = abi.NewType("tuple", "TaikoData.BlockParams", blockParamsComponents) - blockParamsComponentsArgs = abi.Arguments{{Name: "TaikoData.BlockParams", Type: blockParamsComponentsType}} - // ProverAssignmentPayload - bytes32Type, _ = abi.NewType("bytes32", "", nil) - addressType, _ = abi.NewType("address", "", nil) - uint64Type, _ = abi.NewType("uint64", "", nil) - tierFeesType, _ = abi.NewType( - "tuple[]", - "", - []abi.ArgumentMarshaling{ - { - Name: "tier", - Type: "uint16", - }, - { - Name: "fee", - Type: "uint128", - }, - }, - ) - proverAssignmentHashPayloadArgs = abi.Arguments{ - {Name: "_assignment.metaHash", Type: bytes32Type}, - {Name: "_assignment.parentMetaHash", Type: bytes32Type}, - {Name: "_assignment.feeToken", Type: addressType}, - {Name: "_assignment.expiry", Type: uint64Type}, - {Name: "_assignment.maxBlockId", Type: uint64Type}, - {Name: "_assignment.maxProposedIn", Type: uint64Type}, - {Name: "_assignment.tierFees", Type: tierFeesType}, - } - blockMetadataComponentsType, _ = abi.NewType("tuple", "TaikoData.BlockMetadata", blockMetadataComponents) - transitionComponentsType, _ = abi.NewType("tuple", "TaikoData.Transition", transitionComponents) - tierProofComponentsType, _ = abi.NewType("tuple", "TaikoData.TierProof", tierProofComponents) - proveBlockInputArgs = abi.Arguments{ + blockParamsComponentsType, _ = abi.NewType("tuple", "TaikoData.BlockParams", blockParamsComponents) + blockParamsComponentsArgs = abi.Arguments{{Name: "TaikoData.BlockParams", Type: blockParamsComponentsType}} + blockParamsV2ComponentsType, _ = abi.NewType("tuple", "TaikoData.BlockParamsV2", blockParamsV2Components) + blockParamsV2ComponentsArgs = abi.Arguments{{Name: "TaikoData.BlockParamsV2", Type: blockParamsV2ComponentsType}} + blockMetadataComponentsType, _ = abi.NewType("tuple", "TaikoData.BlockMetadata", blockMetadataComponents) + blockMetadataV2ComponentsType, _ = abi.NewType("tuple", "TaikoData.BlockMetadataV2", blockMetadataV2Components) + transitionComponentsType, _ = abi.NewType("tuple", "TaikoData.Transition", transitionComponents) + tierProofComponentsType, _ = abi.NewType("tuple", "TaikoData.TierProof", tierProofComponents) + proveBlockInputArgs = abi.Arguments{ {Name: "TaikoData.BlockMetadata", Type: blockMetadataComponentsType}, {Name: "TaikoData.Transition", Type: transitionComponentsType}, {Name: "TaikoData.TierProof", Type: tierProofComponentsType}, } + proveOntakeBlockInputArgs = abi.Arguments{ + {Name: "TaikoData.BlockMetadataV2", Type: blockMetadataV2ComponentsType}, + {Name: "TaikoData.Transition", Type: transitionComponentsType}, + {Name: "TaikoData.TierProof", Type: tierProofComponentsType}, + } + stringType, _ = abi.NewType("string", "TAIKO_DIFFICULTY", nil) + uint64Type, _ = abi.NewType("uint64", "local.b.numBlocks", nil) + difficultyCalculationInputArgs = abi.Arguments{{Type: stringType}, {Type: uint64Type}} + proveBlocksInputArgs = abi.Arguments{ + {Name: "TaikoData.BlockMetadata", Type: blockMetadataV2ComponentsType}, + {Name: "TaikoData.Transition", Type: transitionComponentsType}, + } + proveBlocksBatchProofArgs = abi.Arguments{ + {Name: "TaikoData.TierProof", Type: tierProofComponentsType}, + } ) // Contract ABIs. @@ -247,7 +345,6 @@ var ( LibProvingABI *abi.ABI LibUtilsABI *abi.ABI LibVerifyingABI *abi.ABI - AssignmentHookABI *abi.ABI SGXVerifierABI *abi.ABI GuardianVerifierABI *abi.ABI ProverSetABI *abi.ABI @@ -290,10 +387,6 @@ func init() { log.Crit("Get LibVerifying ABI error", "error", err) } - if AssignmentHookABI, err = bindings.AssignmentHookMetaData.GetAbi(); err != nil { - log.Crit("Get AssignmentHook ABI error", "error", err) - } - if SGXVerifierABI, err = bindings.SgxVerifierMetaData.GetAbi(); err != nil { log.Crit("Get SGXVerifier ABI error", err) } @@ -314,7 +407,6 @@ func init() { LibProvingABI.Errors, LibUtilsABI.Errors, LibVerifyingABI.Errors, - AssignmentHookABI.Errors, SGXVerifierABI.Errors, GuardianVerifierABI.Errors, ProverSetABI.Errors, @@ -330,68 +422,91 @@ func EncodeBlockParams(params *BlockParams) ([]byte, error) { return b, nil } -// EncodeAssignmentHookInput performs the solidity `abi.encode` for the given input -func EncodeAssignmentHookInput(input *AssignmentHookInput) ([]byte, error) { - b, err := assignmentHookInputArgs.Pack(input) +// EncodeBlockParamsOntake performs the solidity `abi.encode` for the given ontake blockParams. +func EncodeBlockParamsOntake(params *BlockParamsV2) ([]byte, error) { + b, err := blockParamsV2ComponentsArgs.Pack(params) if err != nil { - return nil, fmt.Errorf("failed to abi.encode assignment hook input params, %w", err) + return nil, fmt.Errorf("failed to abi.encode ontake block params, %w", err) } return b, nil } -// EncodeProverAssignmentPayload performs the solidity `abi.encode` for the given proverAssignment payload. -func EncodeProverAssignmentPayload( - chainID uint64, - taikoAddress common.Address, - assignmentHookAddress common.Address, - blockProposer common.Address, - assignedProver common.Address, - blobHash common.Hash, - feeToken common.Address, - expiry uint64, - maxBlockID uint64, - maxProposedIn uint64, - tierFees []TierFee, +// EncodeProveBlockInput performs the solidity `abi.encode` for the given TaikoL1.proveBlock input. +func EncodeProveBlockInput( + meta metadata.TaikoBlockMetaData, + transition *bindings.TaikoDataTransition, + tierProof *bindings.TaikoDataTierProof, ) ([]byte, error) { - hashBytesPayload, err := proverAssignmentHashPayloadArgs.Pack( - common.Hash{}, - common.Hash{}, - feeToken, - expiry, - maxBlockID, - maxProposedIn, - tierFees, + var ( + b []byte + err error ) + if meta.IsOntakeBlock() { + if b, err = proveOntakeBlockInputArgs.Pack( + meta.(*metadata.TaikoDataBlockMetadataOntake).InnerMetadata(), + transition, + tierProof, + ); err != nil { + return nil, fmt.Errorf("failed to abi.encode TakoL1.proveBlock input after ontake fork, %w", err) + } + } else { + if b, err = proveBlockInputArgs.Pack( + meta.(*metadata.TaikoDataBlockMetadataLegacy).InnerMetadata(), + transition, + tierProof, + ); err != nil { + return nil, fmt.Errorf("failed to abi.encode TakoL1.proveBlock input, %w", err) + } + } + + return b, nil +} + +// EncodeDifficultCalcutionParams performs the solidity `abi.encode` for the +// `block.difficulty` hash payload. +func EncodeDifficultyCalcutionParams(numBlocks uint64) ([]byte, error) { + b, err := difficultyCalculationInputArgs.Pack("TAIKO_DIFFICULTY", numBlocks) if err != nil { - return nil, fmt.Errorf("failed to abi.encode prover assignment hash payload, %w", err) - } - - chainIDBytes := make([]byte, 8) - binary.BigEndian.PutUint64(chainIDBytes, chainID) - - return bytes.Join([][]byte{ - common.RightPadBytes([]byte("PROVER_ASSIGNMENT"), 32), - chainIDBytes, - taikoAddress.Bytes(), - blockProposer.Bytes(), - assignedProver.Bytes(), - blobHash.Bytes(), - crypto.Keccak256Hash(hashBytesPayload).Bytes(), - assignmentHookAddress.Bytes(), - }, nil), nil + return nil, fmt.Errorf("failed to abi.encode `block.difficulty` hash payload, %w", err) + } + return b, nil } -// EncodeProveBlockInput performs the solidity `abi.encode` for the given TaikoL1.proveBlock input. -func EncodeProveBlockInput( - meta *bindings.TaikoDataBlockMetadata, - transition *bindings.TaikoDataTransition, +// EncodeProveBlocksInput performs the solidity `abi.encode` for the given TaikoL1.proveBlocks input. +func EncodeProveBlocksInput( + metas []metadata.TaikoBlockMetaData, + transitions []bindings.TaikoDataTransition, +) ([][]byte, error) { + if len(metas) != len(transitions) { + return nil, fmt.Errorf("both arrays of TaikoBlockMetaData and TaikoDataTransition must be equal in length") + } + b := make([][]byte, 0, len(metas)) + for i := range metas { + input, err := proveBlocksInputArgs.Pack( + metas[i].(*metadata.TaikoDataBlockMetadataOntake).InnerMetadata(), + transitions[i], + ) + if err != nil { + return nil, fmt.Errorf("failed to abi.encode TaikoL1.proveBlocks input item after ontake fork, %w", err) + } + + b = append(b, input) + } + + return b, nil +} + +// EncodeProveBlocksBatchProof performs the solidity `abi.encode` for the given TaikoL1.proveBlocks batchProof. +func EncodeProveBlocksBatchProof( tierProof *bindings.TaikoDataTierProof, ) ([]byte, error) { - b, err := proveBlockInputArgs.Pack(meta, transition, tierProof) + input, err := proveBlocksBatchProofArgs.Pack( + tierProof, + ) if err != nil { - return nil, fmt.Errorf("failed to abi.encode TakoL1.proveBlock input, %w", err) + return nil, fmt.Errorf("failed to abi.encode TaikoL1.proveBlocks input item after ontake fork, %w", err) } - return b, nil + return input, nil } // UnpackTxListBytes unpacks the input data of a TaikoL1.proposeBlock transaction, and returns the txList bytes. @@ -402,7 +517,7 @@ func UnpackTxListBytes(txData []byte) ([]byte, error) { } // Only check for safety. - if method.Name != "proposeBlock" { + if method.Name != "proposeBlock" && method.Name != "proposeBlockV2" { return nil, fmt.Errorf("invalid method name: %s", method.Name) } @@ -420,3 +535,13 @@ func UnpackTxListBytes(txData []byte) ([]byte, error) { return inputs, nil } + +// EncodeBaseFeeConfig encodes the block.extraData field from the given base fee config. +func EncodeBaseFeeConfig(baseFeeConfig *bindings.LibSharedDataBaseFeeConfig) [32]byte { + var ( + bytes32Value [32]byte + uintValue = new(big.Int).SetUint64(uint64(baseFeeConfig.SharingPctg)) + ) + copy(bytes32Value[32-len(uintValue.Bytes()):], uintValue.Bytes()) + return bytes32Value +} diff --git a/packages/taiko-client/bindings/encoding/input_test.go b/packages/taiko-client/bindings/encoding/input_test.go index ea99ad7a9f2..761bcef252a 100644 --- a/packages/taiko-client/bindings/encoding/input_test.go +++ b/packages/taiko-client/bindings/encoding/input_test.go @@ -2,7 +2,6 @@ package encoding import ( "context" - "math/big" "os" "testing" @@ -16,43 +15,6 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" ) -func TestEncodeProverAssignmentPayload(t *testing.T) { - encoded, err := EncodeProverAssignmentPayload( - randomHash().Big().Uint64(), - common.BytesToAddress(randomBytes(20)), - common.BytesToAddress(randomBytes(20)), - common.BytesToAddress(randomBytes(20)), - common.BytesToAddress(randomBytes(20)), - common.BytesToHash(randomBytes(32)), - common.BytesToAddress(randomBytes(20)), - 120, - 1024, - 0, - []TierFee{{Tier: 0, Fee: common.Big1}}, - ) - - require.Nil(t, err) - require.NotNil(t, encoded) -} - -func TestEncodeAssignmentHookInput(t *testing.T) { - encoded, err := EncodeAssignmentHookInput(&AssignmentHookInput{ - Assignment: &ProverAssignment{ - FeeToken: common.Address{}, - Expiry: 1, - MaxBlockId: 1, - MaxProposedIn: 1, - MetaHash: [32]byte{0xff}, - TierFees: []TierFee{{Tier: 0, Fee: common.Big1}}, - Signature: []byte{0xff}, - }, - Tip: big.NewInt(1), - }) - - require.Nil(t, err) - require.NotNil(t, encoded) -} - func TestUnpackTxListBytes(t *testing.T) { _, err := UnpackTxListBytes(randomBytes(1024)) require.NotNil(t, err) @@ -65,14 +27,14 @@ func TestUnpackTxListBytes(t *testing.T) { ) require.ErrorContains(t, err, "no method with id") - cli, err := ethclient.Dial(os.Getenv("L1_NODE_WS_ENDPOINT")) + cli, err := ethclient.Dial(os.Getenv("L1_WS")) require.Nil(t, err) chainID, err := cli.ChainID(context.Background()) require.Nil(t, err) taikoL1, err := bindings.NewTaikoL1Client( - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), + common.HexToAddress(os.Getenv("TAIKO_L1")), cli, ) require.Nil(t, err) @@ -88,7 +50,7 @@ func TestUnpackTxListBytes(t *testing.T) { txListBytes := randomBytes(1024) - tx, err := taikoL1.ProposeBlock( + tx, err := taikoL1.ProposeBlockV2( opts, randomBytes(1024), txListBytes, diff --git a/packages/taiko-client/bindings/encoding/struct.go b/packages/taiko-client/bindings/encoding/struct.go index e230bb94e18..1997f2e3f84 100644 --- a/packages/taiko-client/bindings/encoding/struct.go +++ b/packages/taiko-client/bindings/encoding/struct.go @@ -6,23 +6,20 @@ import ( "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" ) // Tier IDs defined in protocol. var ( TierOptimisticID uint16 = 100 TierSgxID uint16 = 200 + TierZkVMRisc0ID uint16 = 250 + TierZkVMSp1ID uint16 = 251 TierSgxAndZkVMID uint16 = 300 TierGuardianMinorityID uint16 = 900 TierGuardianMajorityID uint16 = 1000 - ProtocolTiers = []uint16{ - TierOptimisticID, - TierSgxID, - TierSgxAndZkVMID, - TierGuardianMinorityID, - TierGuardianMajorityID, - } - GoldenTouchPrivKey = "92954368afd3caa1f3ce3ead0069c1af414054aefe1ef9aeacc1bf426222ce38" + GoldenTouchPrivKey = "92954368afd3caa1f3ce3ead0069c1af414054aefe1ef9aeacc1bf426222ce38" ) // HookCall should be same with TaikoData.HookCall @@ -33,12 +30,29 @@ type HookCall struct { // BlockParams should be same with TaikoData.BlockParams. type BlockParams struct { - AssignedProver common.Address - Coinbase common.Address - ExtraData [32]byte - ParentMetaHash [32]byte - HookCalls []HookCall - Signature []byte + AssignedProver common.Address + Coinbase common.Address + ExtraData [32]byte + ParentMetaHash [32]byte + HookCalls []HookCall + Signature []byte + L1StateBlockNumber uint32 + Timestamp uint64 + BlobTxListOffset uint32 + BlobTxListLength uint32 + BlobIndex uint8 +} + +// BlockParamsV2 should be same with TaikoData.BlockParamsV2. +type BlockParamsV2 struct { + Proposer common.Address + Coinbase common.Address + ParentMetaHash [32]byte + AnchorBlockId uint64 + Timestamp uint64 + BlobTxListOffset uint32 + BlobTxListLength uint32 + BlobIndex uint8 } // TierFee should be same with TaikoData.TierFee. @@ -47,24 +61,6 @@ type TierFee struct { Fee *big.Int } -// ProverAssignment should be same with TaikoData.ProverAssignment. -type ProverAssignment struct { - FeeToken common.Address - Expiry uint64 - MaxBlockId uint64 // nolint: revive,stylecheck - MaxProposedIn uint64 - MetaHash [32]byte - ParentMetaHash [32]byte - TierFees []TierFee - Signature []byte -} - -// AssignmentHookInput should be same as AssignmentHook.Input -type AssignmentHookInput struct { - Assignment *ProverAssignment - Tip *big.Int -} - // ToExecutableData converts a GETH *types.Header to *engine.ExecutableData. func ToExecutableData(header *types.Header) *engine.ExecutableData { executableData := &engine.ExecutableData{ @@ -91,6 +87,66 @@ func ToExecutableData(header *types.Header) *engine.ExecutableData { return executableData } +// TransitionProvedEventToV2 converts a *bindings.TaikoL1ClientTransitionProved +// to *bindings.TaikoL1ClientTransitionProvedV2. +func TransitionProvedEventToV2( + e *bindings.TaikoL1ClientTransitionProved, + proposedIn uint64, +) *bindings.TaikoL1ClientTransitionProvedV2 { + return &bindings.TaikoL1ClientTransitionProvedV2{ + BlockId: e.BlockId, + Tran: e.Tran, + Prover: e.Prover, + ValidityBond: e.ValidityBond, + Tier: e.Tier, + ProposedIn: proposedIn, + Raw: e.Raw, + } +} + +// TransitionContestedEventToV2 converts a *bindings.TaikoL1ClientTransitionContested +// to *bindings.TaikoL1ClientTransitionContestedV2. +func TransitionContestedEventToV2( + e *bindings.TaikoL1ClientTransitionContested, + proposedIn uint64, +) *bindings.TaikoL1ClientTransitionContestedV2 { + return &bindings.TaikoL1ClientTransitionContestedV2{ + BlockId: e.BlockId, + Tran: e.Tran, + Contester: e.Contester, + ContestBond: e.ContestBond, + Tier: e.Tier, + ProposedIn: proposedIn, + Raw: e.Raw, + } +} + +// BlockVerifiedEventToV2 converts a *bindings.TaikoL1ClientBlockVerified to *bindings.TaikoL1ClientBlockVerifiedV2. +func BlockVerifiedEventToV2(e *bindings.TaikoL1ClientBlockVerified) *bindings.TaikoL1ClientBlockVerifiedV2 { + return &bindings.TaikoL1ClientBlockVerifiedV2{ + BlockId: e.BlockId, + Prover: e.Prover, + BlockHash: e.BlockHash, + Tier: e.Tier, + Raw: e.Raw, + } +} + +// BlockVerifiedEventToV2 converts a *bindings.TaikoDataBlock to *bindings.TaikoDataBlockV2. +func TaikoDataBlockToV2(b *bindings.TaikoDataBlock) *bindings.TaikoDataBlockV2 { + return &bindings.TaikoDataBlockV2{ + MetaHash: b.MetaHash, + AssignedProver: b.AssignedProver, + LivenessBond: b.LivenessBond, + BlockId: b.BlockId, + ProposedAt: b.ProposedAt, + ProposedIn: b.ProposedIn, + NextTransitionId: big.NewInt(int64(b.NextTransitionId)), + LivenessBondReturned: false, + VerifiedTransitionId: big.NewInt(int64(b.VerifiedTransitionId)), + } +} + // BloomToBytes converts a types.Bloom to [8][32]byte slice. func BloomToBytes(bloom types.Bloom) [8][32]byte { b := [8][32]byte{} diff --git a/packages/taiko-client/bindings/encoding/struct_test.go b/packages/taiko-client/bindings/encoding/struct_test.go index 8caf76b66ad..96763b69222 100644 --- a/packages/taiko-client/bindings/encoding/struct_test.go +++ b/packages/taiko-client/bindings/encoding/struct_test.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/stretchr/testify/require" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) var ( diff --git a/packages/taiko-client/bindings/gen_address_manager.go b/packages/taiko-client/bindings/gen_address_manager.go index ea9f99a412e..f7f31e0f586 100644 --- a/packages/taiko-client/bindings/gen_address_manager.go +++ b/packages/taiko-client/bindings/gen_address_manager.go @@ -31,7 +31,7 @@ var ( // AddressManagerMetaData contains all meta data concerning the AddressManager contract. var AddressManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAddress\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setAddress\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_newAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AddressSet\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"oldAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAddress\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setAddress\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_newAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AddressSet\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"oldAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // AddressManagerABI is the input ABI used to generate the binding from. diff --git a/packages/taiko-client/bindings/gen_assignment_hook.go b/packages/taiko-client/bindings/gen_assignment_hook.go deleted file mode 100644 index 5c327c3ac1f..00000000000 --- a/packages/taiko-client/bindings/gen_assignment_hook.go +++ /dev/null @@ -1,2026 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package bindings - -import ( - "errors" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// AssignmentHookProverAssignment is an auto generated low-level Go binding around an user-defined struct. -type AssignmentHookProverAssignment struct { - FeeToken common.Address - Expiry uint64 - MaxBlockId uint64 - MaxProposedIn uint64 - MetaHash [32]byte - ParentMetaHash [32]byte - TierFees []TaikoDataTierFee - Signature []byte -} - -// TaikoDataTierFee is an auto generated low-level Go binding around an user-defined struct. -type TaikoDataTierFee struct { - Tier uint16 - Fee *big.Int -} - -// AssignmentHookMetaData contains all meta data concerning the AssignmentHook contract. -var AssignmentHookMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hashAssignment\",\"inputs\":[{\"name\":\"_assignment\",\"type\":\"tuple\",\"internalType\":\"structAssignmentHook.ProverAssignment\",\"components\":[{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxProposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tierFees\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TierFee[]\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"fee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_taikoL1Address\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockProposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"inputs\":[{\"name\":\"_blk\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"_meta\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"maxGas\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", -} - -// AssignmentHookABI is the input ABI used to generate the binding from. -// Deprecated: Use AssignmentHookMetaData.ABI instead. -var AssignmentHookABI = AssignmentHookMetaData.ABI - -// AssignmentHook is an auto generated Go binding around an Ethereum contract. -type AssignmentHook struct { - AssignmentHookCaller // Read-only binding to the contract - AssignmentHookTransactor // Write-only binding to the contract - AssignmentHookFilterer // Log filterer for contract events -} - -// AssignmentHookCaller is an auto generated read-only Go binding around an Ethereum contract. -type AssignmentHookCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// AssignmentHookTransactor is an auto generated write-only Go binding around an Ethereum contract. -type AssignmentHookTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// AssignmentHookFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type AssignmentHookFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// AssignmentHookSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type AssignmentHookSession struct { - Contract *AssignmentHook // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// AssignmentHookCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type AssignmentHookCallerSession struct { - Contract *AssignmentHookCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// AssignmentHookTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type AssignmentHookTransactorSession struct { - Contract *AssignmentHookTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// AssignmentHookRaw is an auto generated low-level Go binding around an Ethereum contract. -type AssignmentHookRaw struct { - Contract *AssignmentHook // Generic contract binding to access the raw methods on -} - -// AssignmentHookCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type AssignmentHookCallerRaw struct { - Contract *AssignmentHookCaller // Generic read-only contract binding to access the raw methods on -} - -// AssignmentHookTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type AssignmentHookTransactorRaw struct { - Contract *AssignmentHookTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewAssignmentHook creates a new instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHook(address common.Address, backend bind.ContractBackend) (*AssignmentHook, error) { - contract, err := bindAssignmentHook(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &AssignmentHook{AssignmentHookCaller: AssignmentHookCaller{contract: contract}, AssignmentHookTransactor: AssignmentHookTransactor{contract: contract}, AssignmentHookFilterer: AssignmentHookFilterer{contract: contract}}, nil -} - -// NewAssignmentHookCaller creates a new read-only instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHookCaller(address common.Address, caller bind.ContractCaller) (*AssignmentHookCaller, error) { - contract, err := bindAssignmentHook(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &AssignmentHookCaller{contract: contract}, nil -} - -// NewAssignmentHookTransactor creates a new write-only instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHookTransactor(address common.Address, transactor bind.ContractTransactor) (*AssignmentHookTransactor, error) { - contract, err := bindAssignmentHook(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &AssignmentHookTransactor{contract: contract}, nil -} - -// NewAssignmentHookFilterer creates a new log filterer instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHookFilterer(address common.Address, filterer bind.ContractFilterer) (*AssignmentHookFilterer, error) { - contract, err := bindAssignmentHook(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &AssignmentHookFilterer{contract: contract}, nil -} - -// bindAssignmentHook binds a generic wrapper to an already deployed contract. -func bindAssignmentHook(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := AssignmentHookMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_AssignmentHook *AssignmentHookRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _AssignmentHook.Contract.AssignmentHookCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_AssignmentHook *AssignmentHookRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.Contract.AssignmentHookTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_AssignmentHook *AssignmentHookRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _AssignmentHook.Contract.AssignmentHookTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_AssignmentHook *AssignmentHookCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _AssignmentHook.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_AssignmentHook *AssignmentHookTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_AssignmentHook *AssignmentHookTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _AssignmentHook.Contract.contract.Transact(opts, method, params...) -} - -// MAXGASPAYINGPROVER is a free data retrieval call binding the contract method 0x12925031. -// -// Solidity: function MAX_GAS_PAYING_PROVER() view returns(uint256) -func (_AssignmentHook *AssignmentHookCaller) MAXGASPAYINGPROVER(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "MAX_GAS_PAYING_PROVER") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// MAXGASPAYINGPROVER is a free data retrieval call binding the contract method 0x12925031. -// -// Solidity: function MAX_GAS_PAYING_PROVER() view returns(uint256) -func (_AssignmentHook *AssignmentHookSession) MAXGASPAYINGPROVER() (*big.Int, error) { - return _AssignmentHook.Contract.MAXGASPAYINGPROVER(&_AssignmentHook.CallOpts) -} - -// MAXGASPAYINGPROVER is a free data retrieval call binding the contract method 0x12925031. -// -// Solidity: function MAX_GAS_PAYING_PROVER() view returns(uint256) -func (_AssignmentHook *AssignmentHookCallerSession) MAXGASPAYINGPROVER() (*big.Int, error) { - return _AssignmentHook.Contract.MAXGASPAYINGPROVER(&_AssignmentHook.CallOpts) -} - -// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. -// -// Solidity: function addressManager() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) AddressManager(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "addressManager") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. -// -// Solidity: function addressManager() view returns(address) -func (_AssignmentHook *AssignmentHookSession) AddressManager() (common.Address, error) { - return _AssignmentHook.Contract.AddressManager(&_AssignmentHook.CallOpts) -} - -// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. -// -// Solidity: function addressManager() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) AddressManager() (common.Address, error) { - return _AssignmentHook.Contract.AddressManager(&_AssignmentHook.CallOpts) -} - -// HashAssignment is a free data retrieval call binding the contract method 0xaf3a0228. -// -// Solidity: function hashAssignment((address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) _assignment, address _taikoL1Address, address _blockProposer, address _assignedProver, bytes32 _blobHash) view returns(bytes32) -func (_AssignmentHook *AssignmentHookCaller) HashAssignment(opts *bind.CallOpts, _assignment AssignmentHookProverAssignment, _taikoL1Address common.Address, _blockProposer common.Address, _assignedProver common.Address, _blobHash [32]byte) ([32]byte, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "hashAssignment", _assignment, _taikoL1Address, _blockProposer, _assignedProver, _blobHash) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// HashAssignment is a free data retrieval call binding the contract method 0xaf3a0228. -// -// Solidity: function hashAssignment((address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) _assignment, address _taikoL1Address, address _blockProposer, address _assignedProver, bytes32 _blobHash) view returns(bytes32) -func (_AssignmentHook *AssignmentHookSession) HashAssignment(_assignment AssignmentHookProverAssignment, _taikoL1Address common.Address, _blockProposer common.Address, _assignedProver common.Address, _blobHash [32]byte) ([32]byte, error) { - return _AssignmentHook.Contract.HashAssignment(&_AssignmentHook.CallOpts, _assignment, _taikoL1Address, _blockProposer, _assignedProver, _blobHash) -} - -// HashAssignment is a free data retrieval call binding the contract method 0xaf3a0228. -// -// Solidity: function hashAssignment((address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) _assignment, address _taikoL1Address, address _blockProposer, address _assignedProver, bytes32 _blobHash) view returns(bytes32) -func (_AssignmentHook *AssignmentHookCallerSession) HashAssignment(_assignment AssignmentHookProverAssignment, _taikoL1Address common.Address, _blockProposer common.Address, _assignedProver common.Address, _blobHash [32]byte) ([32]byte, error) { - return _AssignmentHook.Contract.HashAssignment(&_AssignmentHook.CallOpts, _assignment, _taikoL1Address, _blockProposer, _assignedProver, _blobHash) -} - -// Impl is a free data retrieval call binding the contract method 0x8abf6077. -// -// Solidity: function impl() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Impl(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "impl") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Impl is a free data retrieval call binding the contract method 0x8abf6077. -// -// Solidity: function impl() view returns(address) -func (_AssignmentHook *AssignmentHookSession) Impl() (common.Address, error) { - return _AssignmentHook.Contract.Impl(&_AssignmentHook.CallOpts) -} - -// Impl is a free data retrieval call binding the contract method 0x8abf6077. -// -// Solidity: function impl() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Impl() (common.Address, error) { - return _AssignmentHook.Contract.Impl(&_AssignmentHook.CallOpts) -} - -// InNonReentrant is a free data retrieval call binding the contract method 0x3075db56. -// -// Solidity: function inNonReentrant() view returns(bool) -func (_AssignmentHook *AssignmentHookCaller) InNonReentrant(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "inNonReentrant") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// InNonReentrant is a free data retrieval call binding the contract method 0x3075db56. -// -// Solidity: function inNonReentrant() view returns(bool) -func (_AssignmentHook *AssignmentHookSession) InNonReentrant() (bool, error) { - return _AssignmentHook.Contract.InNonReentrant(&_AssignmentHook.CallOpts) -} - -// InNonReentrant is a free data retrieval call binding the contract method 0x3075db56. -// -// Solidity: function inNonReentrant() view returns(bool) -func (_AssignmentHook *AssignmentHookCallerSession) InNonReentrant() (bool, error) { - return _AssignmentHook.Contract.InNonReentrant(&_AssignmentHook.CallOpts) -} - -// LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. -// -// Solidity: function lastUnpausedAt() view returns(uint64) -func (_AssignmentHook *AssignmentHookCaller) LastUnpausedAt(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "lastUnpausedAt") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. -// -// Solidity: function lastUnpausedAt() view returns(uint64) -func (_AssignmentHook *AssignmentHookSession) LastUnpausedAt() (uint64, error) { - return _AssignmentHook.Contract.LastUnpausedAt(&_AssignmentHook.CallOpts) -} - -// LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. -// -// Solidity: function lastUnpausedAt() view returns(uint64) -func (_AssignmentHook *AssignmentHookCallerSession) LastUnpausedAt() (uint64, error) { - return _AssignmentHook.Contract.LastUnpausedAt(&_AssignmentHook.CallOpts) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Owner(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "owner") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_AssignmentHook *AssignmentHookSession) Owner() (common.Address, error) { - return _AssignmentHook.Contract.Owner(&_AssignmentHook.CallOpts) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Owner() (common.Address, error) { - return _AssignmentHook.Contract.Owner(&_AssignmentHook.CallOpts) -} - -// Paused is a free data retrieval call binding the contract method 0x5c975abb. -// -// Solidity: function paused() view returns(bool) -func (_AssignmentHook *AssignmentHookCaller) Paused(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "paused") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// Paused is a free data retrieval call binding the contract method 0x5c975abb. -// -// Solidity: function paused() view returns(bool) -func (_AssignmentHook *AssignmentHookSession) Paused() (bool, error) { - return _AssignmentHook.Contract.Paused(&_AssignmentHook.CallOpts) -} - -// Paused is a free data retrieval call binding the contract method 0x5c975abb. -// -// Solidity: function paused() view returns(bool) -func (_AssignmentHook *AssignmentHookCallerSession) Paused() (bool, error) { - return _AssignmentHook.Contract.Paused(&_AssignmentHook.CallOpts) -} - -// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. -// -// Solidity: function pendingOwner() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) PendingOwner(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "pendingOwner") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. -// -// Solidity: function pendingOwner() view returns(address) -func (_AssignmentHook *AssignmentHookSession) PendingOwner() (common.Address, error) { - return _AssignmentHook.Contract.PendingOwner(&_AssignmentHook.CallOpts) -} - -// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. -// -// Solidity: function pendingOwner() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) PendingOwner() (common.Address, error) { - return _AssignmentHook.Contract.PendingOwner(&_AssignmentHook.CallOpts) -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. -// -// Solidity: function proxiableUUID() view returns(bytes32) -func (_AssignmentHook *AssignmentHookCaller) ProxiableUUID(opts *bind.CallOpts) ([32]byte, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "proxiableUUID") - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. -// -// Solidity: function proxiableUUID() view returns(bytes32) -func (_AssignmentHook *AssignmentHookSession) ProxiableUUID() ([32]byte, error) { - return _AssignmentHook.Contract.ProxiableUUID(&_AssignmentHook.CallOpts) -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. -// -// Solidity: function proxiableUUID() view returns(bytes32) -func (_AssignmentHook *AssignmentHookCallerSession) ProxiableUUID() ([32]byte, error) { - return _AssignmentHook.Contract.ProxiableUUID(&_AssignmentHook.CallOpts) -} - -// Resolve is a free data retrieval call binding the contract method 0x3eb6b8cf. -// -// Solidity: function resolve(uint64 _chainId, bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Resolve(opts *bind.CallOpts, _chainId uint64, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "resolve", _chainId, _name, _allowZeroAddress) - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Resolve is a free data retrieval call binding the contract method 0x3eb6b8cf. -// -// Solidity: function resolve(uint64 _chainId, bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookSession) Resolve(_chainId uint64, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve(&_AssignmentHook.CallOpts, _chainId, _name, _allowZeroAddress) -} - -// Resolve is a free data retrieval call binding the contract method 0x3eb6b8cf. -// -// Solidity: function resolve(uint64 _chainId, bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Resolve(_chainId uint64, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve(&_AssignmentHook.CallOpts, _chainId, _name, _allowZeroAddress) -} - -// Resolve0 is a free data retrieval call binding the contract method 0xa86f9d9e. -// -// Solidity: function resolve(bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Resolve0(opts *bind.CallOpts, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "resolve0", _name, _allowZeroAddress) - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Resolve0 is a free data retrieval call binding the contract method 0xa86f9d9e. -// -// Solidity: function resolve(bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookSession) Resolve0(_name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve0(&_AssignmentHook.CallOpts, _name, _allowZeroAddress) -} - -// Resolve0 is a free data retrieval call binding the contract method 0xa86f9d9e. -// -// Solidity: function resolve(bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Resolve0(_name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve0(&_AssignmentHook.CallOpts, _name, _allowZeroAddress) -} - -// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. -// -// Solidity: function acceptOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "acceptOwnership") -} - -// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. -// -// Solidity: function acceptOwnership() returns() -func (_AssignmentHook *AssignmentHookSession) AcceptOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.AcceptOwnership(&_AssignmentHook.TransactOpts) -} - -// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. -// -// Solidity: function acceptOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) AcceptOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.AcceptOwnership(&_AssignmentHook.TransactOpts) -} - -// Init is a paid mutator transaction binding the contract method 0xf09a4016. -// -// Solidity: function init(address _owner, address _addressManager) returns() -func (_AssignmentHook *AssignmentHookTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "init", _owner, _addressManager) -} - -// Init is a paid mutator transaction binding the contract method 0xf09a4016. -// -// Solidity: function init(address _owner, address _addressManager) returns() -func (_AssignmentHook *AssignmentHookSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.Init(&_AssignmentHook.TransactOpts, _owner, _addressManager) -} - -// Init is a paid mutator transaction binding the contract method 0xf09a4016. -// -// Solidity: function init(address _owner, address _addressManager) returns() -func (_AssignmentHook *AssignmentHookTransactorSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.Init(&_AssignmentHook.TransactOpts, _owner, _addressManager) -} - -// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. -// -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() -func (_AssignmentHook *AssignmentHookTransactor) OnBlockProposed(opts *bind.TransactOpts, _blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "onBlockProposed", _blk, _meta, _data) -} - -// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. -// -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() -func (_AssignmentHook *AssignmentHookSession) OnBlockProposed(_blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.OnBlockProposed(&_AssignmentHook.TransactOpts, _blk, _meta, _data) -} - -// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. -// -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() -func (_AssignmentHook *AssignmentHookTransactorSession) OnBlockProposed(_blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.OnBlockProposed(&_AssignmentHook.TransactOpts, _blk, _meta, _data) -} - -// Pause is a paid mutator transaction binding the contract method 0x8456cb59. -// -// Solidity: function pause() returns() -func (_AssignmentHook *AssignmentHookTransactor) Pause(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "pause") -} - -// Pause is a paid mutator transaction binding the contract method 0x8456cb59. -// -// Solidity: function pause() returns() -func (_AssignmentHook *AssignmentHookSession) Pause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Pause(&_AssignmentHook.TransactOpts) -} - -// Pause is a paid mutator transaction binding the contract method 0x8456cb59. -// -// Solidity: function pause() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) Pause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Pause(&_AssignmentHook.TransactOpts) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "renounceOwnership") -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_AssignmentHook *AssignmentHookSession) RenounceOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.RenounceOwnership(&_AssignmentHook.TransactOpts) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) RenounceOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.RenounceOwnership(&_AssignmentHook.TransactOpts) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_AssignmentHook *AssignmentHookTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "transferOwnership", newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_AssignmentHook *AssignmentHookSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.TransferOwnership(&_AssignmentHook.TransactOpts, newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_AssignmentHook *AssignmentHookTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.TransferOwnership(&_AssignmentHook.TransactOpts, newOwner) -} - -// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. -// -// Solidity: function unpause() returns() -func (_AssignmentHook *AssignmentHookTransactor) Unpause(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "unpause") -} - -// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. -// -// Solidity: function unpause() returns() -func (_AssignmentHook *AssignmentHookSession) Unpause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Unpause(&_AssignmentHook.TransactOpts) -} - -// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. -// -// Solidity: function unpause() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) Unpause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Unpause(&_AssignmentHook.TransactOpts) -} - -// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. -// -// Solidity: function upgradeTo(address newImplementation) returns() -func (_AssignmentHook *AssignmentHookTransactor) UpgradeTo(opts *bind.TransactOpts, newImplementation common.Address) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "upgradeTo", newImplementation) -} - -// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. -// -// Solidity: function upgradeTo(address newImplementation) returns() -func (_AssignmentHook *AssignmentHookSession) UpgradeTo(newImplementation common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeTo(&_AssignmentHook.TransactOpts, newImplementation) -} - -// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. -// -// Solidity: function upgradeTo(address newImplementation) returns() -func (_AssignmentHook *AssignmentHookTransactorSession) UpgradeTo(newImplementation common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeTo(&_AssignmentHook.TransactOpts, newImplementation) -} - -// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. -// -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_AssignmentHook *AssignmentHookTransactor) UpgradeToAndCall(opts *bind.TransactOpts, newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "upgradeToAndCall", newImplementation, data) -} - -// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. -// -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_AssignmentHook *AssignmentHookSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeToAndCall(&_AssignmentHook.TransactOpts, newImplementation, data) -} - -// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. -// -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_AssignmentHook *AssignmentHookTransactorSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeToAndCall(&_AssignmentHook.TransactOpts, newImplementation, data) -} - -// AssignmentHookAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the AssignmentHook contract. -type AssignmentHookAdminChangedIterator struct { - Event *AssignmentHookAdminChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookAdminChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookAdminChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookAdminChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookAdminChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookAdminChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookAdminChanged represents a AdminChanged event raised by the AssignmentHook contract. -type AssignmentHookAdminChanged struct { - PreviousAdmin common.Address - NewAdmin common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterAdminChanged is a free log retrieval operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. -// -// Solidity: event AdminChanged(address previousAdmin, address newAdmin) -func (_AssignmentHook *AssignmentHookFilterer) FilterAdminChanged(opts *bind.FilterOpts) (*AssignmentHookAdminChangedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "AdminChanged") - if err != nil { - return nil, err - } - return &AssignmentHookAdminChangedIterator{contract: _AssignmentHook.contract, event: "AdminChanged", logs: logs, sub: sub}, nil -} - -// WatchAdminChanged is a free log subscription operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. -// -// Solidity: event AdminChanged(address previousAdmin, address newAdmin) -func (_AssignmentHook *AssignmentHookFilterer) WatchAdminChanged(opts *bind.WatchOpts, sink chan<- *AssignmentHookAdminChanged) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "AdminChanged") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookAdminChanged) - if err := _AssignmentHook.contract.UnpackLog(event, "AdminChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseAdminChanged is a log parse operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. -// -// Solidity: event AdminChanged(address previousAdmin, address newAdmin) -func (_AssignmentHook *AssignmentHookFilterer) ParseAdminChanged(log types.Log) (*AssignmentHookAdminChanged, error) { - event := new(AssignmentHookAdminChanged) - if err := _AssignmentHook.contract.UnpackLog(event, "AdminChanged", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookBeaconUpgradedIterator is returned from FilterBeaconUpgraded and is used to iterate over the raw logs and unpacked data for BeaconUpgraded events raised by the AssignmentHook contract. -type AssignmentHookBeaconUpgradedIterator struct { - Event *AssignmentHookBeaconUpgraded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookBeaconUpgradedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookBeaconUpgraded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookBeaconUpgraded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookBeaconUpgradedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookBeaconUpgradedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookBeaconUpgraded represents a BeaconUpgraded event raised by the AssignmentHook contract. -type AssignmentHookBeaconUpgraded struct { - Beacon common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBeaconUpgraded is a free log retrieval operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. -// -// Solidity: event BeaconUpgraded(address indexed beacon) -func (_AssignmentHook *AssignmentHookFilterer) FilterBeaconUpgraded(opts *bind.FilterOpts, beacon []common.Address) (*AssignmentHookBeaconUpgradedIterator, error) { - - var beaconRule []interface{} - for _, beaconItem := range beacon { - beaconRule = append(beaconRule, beaconItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "BeaconUpgraded", beaconRule) - if err != nil { - return nil, err - } - return &AssignmentHookBeaconUpgradedIterator{contract: _AssignmentHook.contract, event: "BeaconUpgraded", logs: logs, sub: sub}, nil -} - -// WatchBeaconUpgraded is a free log subscription operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. -// -// Solidity: event BeaconUpgraded(address indexed beacon) -func (_AssignmentHook *AssignmentHookFilterer) WatchBeaconUpgraded(opts *bind.WatchOpts, sink chan<- *AssignmentHookBeaconUpgraded, beacon []common.Address) (event.Subscription, error) { - - var beaconRule []interface{} - for _, beaconItem := range beacon { - beaconRule = append(beaconRule, beaconItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "BeaconUpgraded", beaconRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookBeaconUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "BeaconUpgraded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseBeaconUpgraded is a log parse operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. -// -// Solidity: event BeaconUpgraded(address indexed beacon) -func (_AssignmentHook *AssignmentHookFilterer) ParseBeaconUpgraded(log types.Log) (*AssignmentHookBeaconUpgraded, error) { - event := new(AssignmentHookBeaconUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "BeaconUpgraded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookEtherPaymentFailedIterator is returned from FilterEtherPaymentFailed and is used to iterate over the raw logs and unpacked data for EtherPaymentFailed events raised by the AssignmentHook contract. -type AssignmentHookEtherPaymentFailedIterator struct { - Event *AssignmentHookEtherPaymentFailed // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookEtherPaymentFailedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookEtherPaymentFailed) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookEtherPaymentFailed) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookEtherPaymentFailedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookEtherPaymentFailedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookEtherPaymentFailed represents a EtherPaymentFailed event raised by the AssignmentHook contract. -type AssignmentHookEtherPaymentFailed struct { - To common.Address - MaxGas *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterEtherPaymentFailed is a free log retrieval operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. -// -// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) -func (_AssignmentHook *AssignmentHookFilterer) FilterEtherPaymentFailed(opts *bind.FilterOpts) (*AssignmentHookEtherPaymentFailedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "EtherPaymentFailed") - if err != nil { - return nil, err - } - return &AssignmentHookEtherPaymentFailedIterator{contract: _AssignmentHook.contract, event: "EtherPaymentFailed", logs: logs, sub: sub}, nil -} - -// WatchEtherPaymentFailed is a free log subscription operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. -// -// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) -func (_AssignmentHook *AssignmentHookFilterer) WatchEtherPaymentFailed(opts *bind.WatchOpts, sink chan<- *AssignmentHookEtherPaymentFailed) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "EtherPaymentFailed") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookEtherPaymentFailed) - if err := _AssignmentHook.contract.UnpackLog(event, "EtherPaymentFailed", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseEtherPaymentFailed is a log parse operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. -// -// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) -func (_AssignmentHook *AssignmentHookFilterer) ParseEtherPaymentFailed(log types.Log) (*AssignmentHookEtherPaymentFailed, error) { - event := new(AssignmentHookEtherPaymentFailed) - if err := _AssignmentHook.contract.UnpackLog(event, "EtherPaymentFailed", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the AssignmentHook contract. -type AssignmentHookInitializedIterator struct { - Event *AssignmentHookInitialized // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookInitializedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookInitialized represents a Initialized event raised by the AssignmentHook contract. -type AssignmentHookInitialized struct { - Version uint8 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_AssignmentHook *AssignmentHookFilterer) FilterInitialized(opts *bind.FilterOpts) (*AssignmentHookInitializedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return &AssignmentHookInitializedIterator{contract: _AssignmentHook.contract, event: "Initialized", logs: logs, sub: sub}, nil -} - -// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_AssignmentHook *AssignmentHookFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *AssignmentHookInitialized) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookInitialized) - if err := _AssignmentHook.contract.UnpackLog(event, "Initialized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_AssignmentHook *AssignmentHookFilterer) ParseInitialized(log types.Log) (*AssignmentHookInitialized, error) { - event := new(AssignmentHookInitialized) - if err := _AssignmentHook.contract.UnpackLog(event, "Initialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookOwnershipTransferStartedIterator is returned from FilterOwnershipTransferStarted and is used to iterate over the raw logs and unpacked data for OwnershipTransferStarted events raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferStartedIterator struct { - Event *AssignmentHookOwnershipTransferStarted // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookOwnershipTransferStartedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookOwnershipTransferStarted) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookOwnershipTransferStarted) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookOwnershipTransferStartedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookOwnershipTransferStartedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookOwnershipTransferStarted represents a OwnershipTransferStarted event raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferStarted struct { - PreviousOwner common.Address - NewOwner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterOwnershipTransferStarted is a free log retrieval operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. -// -// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) FilterOwnershipTransferStarted(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*AssignmentHookOwnershipTransferStartedIterator, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return &AssignmentHookOwnershipTransferStartedIterator{contract: _AssignmentHook.contract, event: "OwnershipTransferStarted", logs: logs, sub: sub}, nil -} - -// WatchOwnershipTransferStarted is a free log subscription operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. -// -// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) WatchOwnershipTransferStarted(opts *bind.WatchOpts, sink chan<- *AssignmentHookOwnershipTransferStarted, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookOwnershipTransferStarted) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseOwnershipTransferStarted is a log parse operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. -// -// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) ParseOwnershipTransferStarted(log types.Log) (*AssignmentHookOwnershipTransferStarted, error) { - event := new(AssignmentHookOwnershipTransferStarted) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferredIterator struct { - Event *AssignmentHookOwnershipTransferred // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookOwnershipTransferredIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookOwnershipTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookOwnershipTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookOwnershipTransferredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookOwnershipTransferredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookOwnershipTransferred represents a OwnershipTransferred event raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferred struct { - PreviousOwner common.Address - NewOwner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*AssignmentHookOwnershipTransferredIterator, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return &AssignmentHookOwnershipTransferredIterator{contract: _AssignmentHook.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil -} - -// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *AssignmentHookOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookOwnershipTransferred) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) ParseOwnershipTransferred(log types.Log) (*AssignmentHookOwnershipTransferred, error) { - event := new(AssignmentHookOwnershipTransferred) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the AssignmentHook contract. -type AssignmentHookPausedIterator struct { - Event *AssignmentHookPaused // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookPausedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookPaused) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookPaused) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookPausedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookPausedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookPaused represents a Paused event raised by the AssignmentHook contract. -type AssignmentHookPaused struct { - Account common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPaused is a free log retrieval operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. -// -// Solidity: event Paused(address account) -func (_AssignmentHook *AssignmentHookFilterer) FilterPaused(opts *bind.FilterOpts) (*AssignmentHookPausedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Paused") - if err != nil { - return nil, err - } - return &AssignmentHookPausedIterator{contract: _AssignmentHook.contract, event: "Paused", logs: logs, sub: sub}, nil -} - -// WatchPaused is a free log subscription operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. -// -// Solidity: event Paused(address account) -func (_AssignmentHook *AssignmentHookFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *AssignmentHookPaused) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Paused") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookPaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Paused", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParsePaused is a log parse operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. -// -// Solidity: event Paused(address account) -func (_AssignmentHook *AssignmentHookFilterer) ParsePaused(log types.Log) (*AssignmentHookPaused, error) { - event := new(AssignmentHookPaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Paused", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the AssignmentHook contract. -type AssignmentHookUnpausedIterator struct { - Event *AssignmentHookUnpaused // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookUnpausedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookUnpaused) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookUnpaused) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookUnpausedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookUnpausedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookUnpaused represents a Unpaused event raised by the AssignmentHook contract. -type AssignmentHookUnpaused struct { - Account common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterUnpaused is a free log retrieval operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. -// -// Solidity: event Unpaused(address account) -func (_AssignmentHook *AssignmentHookFilterer) FilterUnpaused(opts *bind.FilterOpts) (*AssignmentHookUnpausedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Unpaused") - if err != nil { - return nil, err - } - return &AssignmentHookUnpausedIterator{contract: _AssignmentHook.contract, event: "Unpaused", logs: logs, sub: sub}, nil -} - -// WatchUnpaused is a free log subscription operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. -// -// Solidity: event Unpaused(address account) -func (_AssignmentHook *AssignmentHookFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *AssignmentHookUnpaused) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Unpaused") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookUnpaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Unpaused", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseUnpaused is a log parse operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. -// -// Solidity: event Unpaused(address account) -func (_AssignmentHook *AssignmentHookFilterer) ParseUnpaused(log types.Log) (*AssignmentHookUnpaused, error) { - event := new(AssignmentHookUnpaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Unpaused", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the AssignmentHook contract. -type AssignmentHookUpgradedIterator struct { - Event *AssignmentHookUpgraded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *AssignmentHookUpgradedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(AssignmentHookUpgraded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(AssignmentHookUpgraded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *AssignmentHookUpgradedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookUpgradedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookUpgraded represents a Upgraded event raised by the AssignmentHook contract. -type AssignmentHookUpgraded struct { - Implementation common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_AssignmentHook *AssignmentHookFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*AssignmentHookUpgradedIterator, error) { - - var implementationRule []interface{} - for _, implementationItem := range implementation { - implementationRule = append(implementationRule, implementationItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Upgraded", implementationRule) - if err != nil { - return nil, err - } - return &AssignmentHookUpgradedIterator{contract: _AssignmentHook.contract, event: "Upgraded", logs: logs, sub: sub}, nil -} - -// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_AssignmentHook *AssignmentHookFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *AssignmentHookUpgraded, implementation []common.Address) (event.Subscription, error) { - - var implementationRule []interface{} - for _, implementationItem := range implementation { - implementationRule = append(implementationRule, implementationItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Upgraded", implementationRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(AssignmentHookUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "Upgraded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_AssignmentHook *AssignmentHookFilterer) ParseUpgraded(log types.Log) (*AssignmentHookUpgraded, error) { - event := new(AssignmentHookUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "Upgraded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/packages/taiko-client/bindings/gen_guardian_prover.go b/packages/taiko-client/bindings/gen_guardian_prover.go index 8b42670d6f3..546b89e0554 100644 --- a/packages/taiko-client/bindings/gen_guardian_prover.go +++ b/packages/taiko-client/bindings/gen_guardian_prover.go @@ -40,6 +40,18 @@ type IVerifierContext struct { MsgSender common.Address } +// IVerifierContextV2 is an auto generated low-level Go binding around an user-defined struct. +type IVerifierContextV2 struct { + MetaHash [32]byte + BlobHash [32]byte + Prover common.Address + BlockId uint64 + IsContesting bool + BlobUsed bool + MsgSender common.Address + Tran TaikoDataTransition +} + // TaikoDataTierProof is an auto generated low-level Go binding around an user-defined struct. type TaikoDataTierProof struct { Tier uint16 @@ -48,7 +60,7 @@ type TaikoDataTierProof struct { // GuardianProverMetaData contains all meta data concerning the GuardianProver contract. var GuardianProverMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approvals\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proofHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"approvalBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"_meta\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"approved_\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"inputs\":[{\"name\":\"_enable\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"inputs\":[{\"name\":\"_enable\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"guardianIds\",\"inputs\":[{\"name\":\"guardian\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"guardians\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestProofHash\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minGuardians\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numGuardians\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setGuardians\",\"inputs\":[{\"name\":\"_newGuardians\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_minGuardians\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"_clearData\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyProof\",\"inputs\":[{\"name\":\"_ctx\",\"type\":\"tuple\",\"internalType\":\"structIVerifier.Context\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Approved\",\"inputs\":[{\"name\":\"operationId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"approvalBits\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minGuardiansReached\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConflictingProofs\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"guardian\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentProofHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"newProofHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GuardianApproval\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"approved\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"proofData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GuardiansUpdated\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"guardians\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"name\":\"enabled\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approvals\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proofHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"approvalBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approveV2\",\"inputs\":[{\"name\":\"_metaV2\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]},{\"name\":\"_tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableBondAllowance\",\"inputs\":[{\"name\":\"_enable\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"inputs\":[{\"name\":\"_enable\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"guardianIds\",\"inputs\":[{\"name\":\"guardian\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"guardians\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestProofHash\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minGuardians\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numGuardians\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setGuardians\",\"inputs\":[{\"name\":\"_newGuardians\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_minGuardians\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"_clearData\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBatchProof\",\"inputs\":[{\"name\":\"_ctxs\",\"type\":\"tuple[]\",\"internalType\":\"structIVerifier.ContextV2[]\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyProof\",\"inputs\":[{\"name\":\"_ctx\",\"type\":\"tuple\",\"internalType\":\"structIVerifier.Context\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawBond\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Approved\",\"inputs\":[{\"name\":\"operationId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"approvalBits\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minGuardiansReached\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConflictingProofs\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"guardian\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentProofHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"newProofHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GuardianApproval\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"approved\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"proofData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GuardiansUpdated\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"guardians\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"name\":\"enabled\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_BOND_NOT_ERC20\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // GuardianProverABI is the input ABI used to generate the binding from. @@ -724,6 +736,35 @@ func (_GuardianProver *GuardianProverCallerSession) Resolve0(_name [32]byte, _al return _GuardianProver.Contract.Resolve0(&_GuardianProver.CallOpts, _name, _allowZeroAddress) } +// VerifyBatchProof is a free data retrieval call binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] _ctxs, (uint16,bytes) ) view returns() +func (_GuardianProver *GuardianProverCaller) VerifyBatchProof(opts *bind.CallOpts, _ctxs []IVerifierContextV2, arg1 TaikoDataTierProof) error { + var out []interface{} + err := _GuardianProver.contract.Call(opts, &out, "verifyBatchProof", _ctxs, arg1) + + if err != nil { + return err + } + + return err + +} + +// VerifyBatchProof is a free data retrieval call binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] _ctxs, (uint16,bytes) ) view returns() +func (_GuardianProver *GuardianProverSession) VerifyBatchProof(_ctxs []IVerifierContextV2, arg1 TaikoDataTierProof) error { + return _GuardianProver.Contract.VerifyBatchProof(&_GuardianProver.CallOpts, _ctxs, arg1) +} + +// VerifyBatchProof is a free data retrieval call binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] _ctxs, (uint16,bytes) ) view returns() +func (_GuardianProver *GuardianProverCallerSession) VerifyBatchProof(_ctxs []IVerifierContextV2, arg1 TaikoDataTierProof) error { + return _GuardianProver.Contract.VerifyBatchProof(&_GuardianProver.CallOpts, _ctxs, arg1) +} + // VerifyProof is a free data retrieval call binding the contract method 0x21e89968. // // Solidity: function verifyProof((bytes32,bytes32,address,uint64,bool,bool,address) _ctx, (bytes32,bytes32,bytes32,bytes32) , (uint16,bytes) ) view returns() @@ -805,25 +846,46 @@ func (_GuardianProver *GuardianProverTransactorSession) AcceptOwnership() (*type return _GuardianProver.Contract.AcceptOwnership(&_GuardianProver.TransactOpts) } -// Approve is a paid mutator transaction binding the contract method 0x98984761. +// ApproveV2 is a paid mutator transaction binding the contract method 0x360d230a. +// +// Solidity: function approveV2((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) _metaV2, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns(bool) +func (_GuardianProver *GuardianProverTransactor) ApproveV2(opts *bind.TransactOpts, _metaV2 TaikoDataBlockMetadataV2, _tran TaikoDataTransition, _proof TaikoDataTierProof) (*types.Transaction, error) { + return _GuardianProver.contract.Transact(opts, "approveV2", _metaV2, _tran, _proof) +} + +// ApproveV2 is a paid mutator transaction binding the contract method 0x360d230a. +// +// Solidity: function approveV2((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) _metaV2, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns(bool) +func (_GuardianProver *GuardianProverSession) ApproveV2(_metaV2 TaikoDataBlockMetadataV2, _tran TaikoDataTransition, _proof TaikoDataTierProof) (*types.Transaction, error) { + return _GuardianProver.Contract.ApproveV2(&_GuardianProver.TransactOpts, _metaV2, _tran, _proof) +} + +// ApproveV2 is a paid mutator transaction binding the contract method 0x360d230a. +// +// Solidity: function approveV2((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) _metaV2, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns(bool) +func (_GuardianProver *GuardianProverTransactorSession) ApproveV2(_metaV2 TaikoDataBlockMetadataV2, _tran TaikoDataTransition, _proof TaikoDataTierProof) (*types.Transaction, error) { + return _GuardianProver.Contract.ApproveV2(&_GuardianProver.TransactOpts, _metaV2, _tran, _proof) +} + +// EnableBondAllowance is a paid mutator transaction binding the contract method 0x640b4cac. // -// Solidity: function approve((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns(bool approved_) -func (_GuardianProver *GuardianProverTransactor) Approve(opts *bind.TransactOpts, _meta TaikoDataBlockMetadata, _tran TaikoDataTransition, _proof TaikoDataTierProof) (*types.Transaction, error) { - return _GuardianProver.contract.Transact(opts, "approve", _meta, _tran, _proof) +// Solidity: function enableBondAllowance(bool _enable) returns() +func (_GuardianProver *GuardianProverTransactor) EnableBondAllowance(opts *bind.TransactOpts, _enable bool) (*types.Transaction, error) { + return _GuardianProver.contract.Transact(opts, "enableBondAllowance", _enable) } -// Approve is a paid mutator transaction binding the contract method 0x98984761. +// EnableBondAllowance is a paid mutator transaction binding the contract method 0x640b4cac. // -// Solidity: function approve((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns(bool approved_) -func (_GuardianProver *GuardianProverSession) Approve(_meta TaikoDataBlockMetadata, _tran TaikoDataTransition, _proof TaikoDataTierProof) (*types.Transaction, error) { - return _GuardianProver.Contract.Approve(&_GuardianProver.TransactOpts, _meta, _tran, _proof) +// Solidity: function enableBondAllowance(bool _enable) returns() +func (_GuardianProver *GuardianProverSession) EnableBondAllowance(_enable bool) (*types.Transaction, error) { + return _GuardianProver.Contract.EnableBondAllowance(&_GuardianProver.TransactOpts, _enable) } -// Approve is a paid mutator transaction binding the contract method 0x98984761. +// EnableBondAllowance is a paid mutator transaction binding the contract method 0x640b4cac. // -// Solidity: function approve((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns(bool approved_) -func (_GuardianProver *GuardianProverTransactorSession) Approve(_meta TaikoDataBlockMetadata, _tran TaikoDataTransition, _proof TaikoDataTierProof) (*types.Transaction, error) { - return _GuardianProver.Contract.Approve(&_GuardianProver.TransactOpts, _meta, _tran, _proof) +// Solidity: function enableBondAllowance(bool _enable) returns() +func (_GuardianProver *GuardianProverTransactorSession) EnableBondAllowance(_enable bool) (*types.Transaction, error) { + return _GuardianProver.Contract.EnableBondAllowance(&_GuardianProver.TransactOpts, _enable) } // EnableProvingAutoPause is a paid mutator transaction binding the contract method 0xe93640db. @@ -847,46 +909,25 @@ func (_GuardianProver *GuardianProverTransactorSession) EnableProvingAutoPause(_ return _GuardianProver.Contract.EnableProvingAutoPause(&_GuardianProver.TransactOpts, _enable) } -// EnableTaikoTokenAllowance is a paid mutator transaction binding the contract method 0x8e1bacd7. -// -// Solidity: function enableTaikoTokenAllowance(bool _enable) returns() -func (_GuardianProver *GuardianProverTransactor) EnableTaikoTokenAllowance(opts *bind.TransactOpts, _enable bool) (*types.Transaction, error) { - return _GuardianProver.contract.Transact(opts, "enableTaikoTokenAllowance", _enable) -} - -// EnableTaikoTokenAllowance is a paid mutator transaction binding the contract method 0x8e1bacd7. -// -// Solidity: function enableTaikoTokenAllowance(bool _enable) returns() -func (_GuardianProver *GuardianProverSession) EnableTaikoTokenAllowance(_enable bool) (*types.Transaction, error) { - return _GuardianProver.Contract.EnableTaikoTokenAllowance(&_GuardianProver.TransactOpts, _enable) -} - -// EnableTaikoTokenAllowance is a paid mutator transaction binding the contract method 0x8e1bacd7. -// -// Solidity: function enableTaikoTokenAllowance(bool _enable) returns() -func (_GuardianProver *GuardianProverTransactorSession) EnableTaikoTokenAllowance(_enable bool) (*types.Transaction, error) { - return _GuardianProver.Contract.EnableTaikoTokenAllowance(&_GuardianProver.TransactOpts, _enable) -} - // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_GuardianProver *GuardianProverTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _GuardianProver.contract.Transact(opts, "init", _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_GuardianProver *GuardianProverTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _GuardianProver.contract.Transact(opts, "init", _owner, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_GuardianProver *GuardianProverSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _GuardianProver.Contract.Init(&_GuardianProver.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_GuardianProver *GuardianProverSession) Init(_owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _GuardianProver.Contract.Init(&_GuardianProver.TransactOpts, _owner, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_GuardianProver *GuardianProverTransactorSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _GuardianProver.Contract.Init(&_GuardianProver.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_GuardianProver *GuardianProverTransactorSession) Init(_owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _GuardianProver.Contract.Init(&_GuardianProver.TransactOpts, _owner, _rollupAddressManager) } // Pause is a paid mutator transaction binding the contract method 0x8456cb59. @@ -1057,25 +1098,25 @@ func (_GuardianProver *GuardianProverTransactorSession) UpgradeToAndCall(newImpl return _GuardianProver.Contract.UpgradeToAndCall(&_GuardianProver.TransactOpts, newImplementation, data) } -// WithdrawTaikoToken is a paid mutator transaction binding the contract method 0x694074c0. +// WithdrawBond is a paid mutator transaction binding the contract method 0xca288f18. // -// Solidity: function withdrawTaikoToken(address _to, uint256 _amount) returns() -func (_GuardianProver *GuardianProverTransactor) WithdrawTaikoToken(opts *bind.TransactOpts, _to common.Address, _amount *big.Int) (*types.Transaction, error) { - return _GuardianProver.contract.Transact(opts, "withdrawTaikoToken", _to, _amount) +// Solidity: function withdrawBond(address _to, uint256 _amount) returns() +func (_GuardianProver *GuardianProverTransactor) WithdrawBond(opts *bind.TransactOpts, _to common.Address, _amount *big.Int) (*types.Transaction, error) { + return _GuardianProver.contract.Transact(opts, "withdrawBond", _to, _amount) } -// WithdrawTaikoToken is a paid mutator transaction binding the contract method 0x694074c0. +// WithdrawBond is a paid mutator transaction binding the contract method 0xca288f18. // -// Solidity: function withdrawTaikoToken(address _to, uint256 _amount) returns() -func (_GuardianProver *GuardianProverSession) WithdrawTaikoToken(_to common.Address, _amount *big.Int) (*types.Transaction, error) { - return _GuardianProver.Contract.WithdrawTaikoToken(&_GuardianProver.TransactOpts, _to, _amount) +// Solidity: function withdrawBond(address _to, uint256 _amount) returns() +func (_GuardianProver *GuardianProverSession) WithdrawBond(_to common.Address, _amount *big.Int) (*types.Transaction, error) { + return _GuardianProver.Contract.WithdrawBond(&_GuardianProver.TransactOpts, _to, _amount) } -// WithdrawTaikoToken is a paid mutator transaction binding the contract method 0x694074c0. +// WithdrawBond is a paid mutator transaction binding the contract method 0xca288f18. // -// Solidity: function withdrawTaikoToken(address _to, uint256 _amount) returns() -func (_GuardianProver *GuardianProverTransactorSession) WithdrawTaikoToken(_to common.Address, _amount *big.Int) (*types.Transaction, error) { - return _GuardianProver.Contract.WithdrawTaikoToken(&_GuardianProver.TransactOpts, _to, _amount) +// Solidity: function withdrawBond(address _to, uint256 _amount) returns() +func (_GuardianProver *GuardianProverTransactorSession) WithdrawBond(_to common.Address, _amount *big.Int) (*types.Transaction, error) { + return _GuardianProver.Contract.WithdrawBond(&_GuardianProver.TransactOpts, _to, _amount) } // GuardianProverAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the GuardianProver contract. diff --git a/packages/taiko-client/bindings/gen_lib_proposing.go b/packages/taiko-client/bindings/gen_lib_proposing.go index 3e35789ee88..133643b6ce6 100644 --- a/packages/taiko-client/bindings/gen_lib_proposing.go +++ b/packages/taiko-client/bindings/gen_lib_proposing.go @@ -31,7 +31,7 @@ var ( // LibProposingMetaData contains all meta data concerning the LibProposing contract. var LibProposingMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]}]", + ABI: "[{\"type\":\"event\",\"name\":\"BlockProposedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CalldataTxList\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"txList\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_FORK_HEIGHT_ERROR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_ANCHOR_BLOCK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CUSTOM_PROPOSER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROPOSER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIMESTAMP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]}]", } // LibProposingABI is the input ABI used to generate the binding from. @@ -180,9 +180,9 @@ func (_LibProposing *LibProposingTransactorRaw) Transact(opts *bind.TransactOpts return _LibProposing.Contract.contract.Transact(opts, method, params...) } -// LibProposingBlockProposedIterator is returned from FilterBlockProposed and is used to iterate over the raw logs and unpacked data for BlockProposed events raised by the LibProposing contract. -type LibProposingBlockProposedIterator struct { - Event *LibProposingBlockProposed // Event containing the contract specifics and raw log +// LibProposingBlockProposedV2Iterator is returned from FilterBlockProposedV2 and is used to iterate over the raw logs and unpacked data for BlockProposedV2 events raised by the LibProposing contract. +type LibProposingBlockProposedV2Iterator struct { + Event *LibProposingBlockProposedV2 // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -196,7 +196,7 @@ type LibProposingBlockProposedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *LibProposingBlockProposedIterator) Next() bool { +func (it *LibProposingBlockProposedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -205,7 +205,7 @@ func (it *LibProposingBlockProposedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(LibProposingBlockProposed) + it.Event = new(LibProposingBlockProposedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -220,7 +220,7 @@ func (it *LibProposingBlockProposedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(LibProposingBlockProposed) + it.Event = new(LibProposingBlockProposedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -236,63 +236,197 @@ func (it *LibProposingBlockProposedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *LibProposingBlockProposedIterator) Error() error { +func (it *LibProposingBlockProposedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *LibProposingBlockProposedIterator) Close() error { +func (it *LibProposingBlockProposedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// LibProposingBlockProposed represents a BlockProposed event raised by the LibProposing contract. -type LibProposingBlockProposed struct { - BlockId *big.Int - AssignedProver common.Address - LivenessBond *big.Int - Meta TaikoDataBlockMetadata - DepositsProcessed []TaikoDataEthDeposit - Raw types.Log // Blockchain specific contextual infos +// LibProposingBlockProposedV2 represents a BlockProposedV2 event raised by the LibProposing contract. +type LibProposingBlockProposedV2 struct { + BlockId *big.Int + Meta TaikoDataBlockMetadataV2 + Raw types.Log // Blockchain specific contextual infos } -// FilterBlockProposed is a free log retrieval operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// FilterBlockProposedV2 is a free log retrieval operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_LibProposing *LibProposingFilterer) FilterBlockProposed(opts *bind.FilterOpts, blockId []*big.Int, assignedProver []common.Address) (*LibProposingBlockProposedIterator, error) { +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_LibProposing *LibProposingFilterer) FilterBlockProposedV2(opts *bind.FilterOpts, blockId []*big.Int) (*LibProposingBlockProposedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + + logs, sub, err := _LibProposing.contract.FilterLogs(opts, "BlockProposedV2", blockIdRule) + if err != nil { + return nil, err } + return &LibProposingBlockProposedV2Iterator{contract: _LibProposing.contract, event: "BlockProposedV2", logs: logs, sub: sub}, nil +} - logs, sub, err := _LibProposing.contract.FilterLogs(opts, "BlockProposed", blockIdRule, assignedProverRule) +// WatchBlockProposedV2 is a free log subscription operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_LibProposing *LibProposingFilterer) WatchBlockProposedV2(opts *bind.WatchOpts, sink chan<- *LibProposingBlockProposedV2, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _LibProposing.contract.WatchLogs(opts, "BlockProposedV2", blockIdRule) if err != nil { return nil, err } - return &LibProposingBlockProposedIterator{contract: _LibProposing.contract, event: "BlockProposed", logs: logs, sub: sub}, nil + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LibProposingBlockProposedV2) + if err := _LibProposing.contract.UnpackLog(event, "BlockProposedV2", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBlockProposedV2 is a log parse operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_LibProposing *LibProposingFilterer) ParseBlockProposedV2(log types.Log) (*LibProposingBlockProposedV2, error) { + event := new(LibProposingBlockProposedV2) + if err := _LibProposing.contract.UnpackLog(event, "BlockProposedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LibProposingCalldataTxListIterator is returned from FilterCalldataTxList and is used to iterate over the raw logs and unpacked data for CalldataTxList events raised by the LibProposing contract. +type LibProposingCalldataTxListIterator struct { + Event *LibProposingCalldataTxList // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LibProposingCalldataTxListIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LibProposingCalldataTxList) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LibProposingCalldataTxList) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LibProposingCalldataTxListIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LibProposingCalldataTxListIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LibProposingCalldataTxList represents a CalldataTxList event raised by the LibProposing contract. +type LibProposingCalldataTxList struct { + BlockId *big.Int + TxList []byte + Raw types.Log // Blockchain specific contextual infos } -// WatchBlockProposed is a free log subscription operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// FilterCalldataTxList is a free log retrieval operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_LibProposing *LibProposingFilterer) WatchBlockProposed(opts *bind.WatchOpts, sink chan<- *LibProposingBlockProposed, blockId []*big.Int, assignedProver []common.Address) (event.Subscription, error) { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_LibProposing *LibProposingFilterer) FilterCalldataTxList(opts *bind.FilterOpts, blockId []*big.Int) (*LibProposingCalldataTxListIterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + + logs, sub, err := _LibProposing.contract.FilterLogs(opts, "CalldataTxList", blockIdRule) + if err != nil { + return nil, err + } + return &LibProposingCalldataTxListIterator{contract: _LibProposing.contract, event: "CalldataTxList", logs: logs, sub: sub}, nil +} + +// WatchCalldataTxList is a free log subscription operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_LibProposing *LibProposingFilterer) WatchCalldataTxList(opts *bind.WatchOpts, sink chan<- *LibProposingCalldataTxList, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _LibProposing.contract.WatchLogs(opts, "BlockProposed", blockIdRule, assignedProverRule) + logs, sub, err := _LibProposing.contract.WatchLogs(opts, "CalldataTxList", blockIdRule) if err != nil { return nil, err } @@ -302,8 +436,8 @@ func (_LibProposing *LibProposingFilterer) WatchBlockProposed(opts *bind.WatchOp select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(LibProposingBlockProposed) - if err := _LibProposing.contract.UnpackLog(event, "BlockProposed", log); err != nil { + event := new(LibProposingCalldataTxList) + if err := _LibProposing.contract.UnpackLog(event, "CalldataTxList", log); err != nil { return err } event.Raw = log @@ -324,12 +458,12 @@ func (_LibProposing *LibProposingFilterer) WatchBlockProposed(opts *bind.WatchOp }), nil } -// ParseBlockProposed is a log parse operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// ParseCalldataTxList is a log parse operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_LibProposing *LibProposingFilterer) ParseBlockProposed(log types.Log) (*LibProposingBlockProposed, error) { - event := new(LibProposingBlockProposed) - if err := _LibProposing.contract.UnpackLog(event, "BlockProposed", log); err != nil { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_LibProposing *LibProposingFilterer) ParseCalldataTxList(log types.Log) (*LibProposingCalldataTxList, error) { + event := new(LibProposingCalldataTxList) + if err := _LibProposing.contract.UnpackLog(event, "CalldataTxList", log); err != nil { return nil, err } event.Raw = log diff --git a/packages/taiko-client/bindings/gen_lib_proving.go b/packages/taiko-client/bindings/gen_lib_proving.go index a95a8249d99..07079d73e3e 100644 --- a/packages/taiko-client/bindings/gen_lib_proving.go +++ b/packages/taiko-client/bindings/gen_lib_proving.go @@ -31,7 +31,7 @@ var ( // LibProvingMetaData contains all meta data concerning the LibProving contract. var LibProvingMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]}]", + ABI: "[{\"type\":\"event\",\"name\":\"BlockVerifiedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondCredited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDebited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDeposited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContestedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProvedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_DIFF_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ETH_NOT_PAID_AS_BOND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_MSG_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]}]", } // LibProvingABI is the input ABI used to generate the binding from. @@ -180,6 +180,598 @@ func (_LibProving *LibProvingTransactorRaw) Transact(opts *bind.TransactOpts, me return _LibProving.Contract.contract.Transact(opts, method, params...) } +// LibProvingBlockVerifiedV2Iterator is returned from FilterBlockVerifiedV2 and is used to iterate over the raw logs and unpacked data for BlockVerifiedV2 events raised by the LibProving contract. +type LibProvingBlockVerifiedV2Iterator struct { + Event *LibProvingBlockVerifiedV2 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LibProvingBlockVerifiedV2Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LibProvingBlockVerifiedV2) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LibProvingBlockVerifiedV2) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LibProvingBlockVerifiedV2Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LibProvingBlockVerifiedV2Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LibProvingBlockVerifiedV2 represents a BlockVerifiedV2 event raised by the LibProving contract. +type LibProvingBlockVerifiedV2 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerifiedV2 is a free log retrieval operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_LibProving *LibProvingFilterer) FilterBlockVerifiedV2(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*LibProvingBlockVerifiedV2Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _LibProving.contract.FilterLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &LibProvingBlockVerifiedV2Iterator{contract: _LibProving.contract, event: "BlockVerifiedV2", logs: logs, sub: sub}, nil +} + +// WatchBlockVerifiedV2 is a free log subscription operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_LibProving *LibProvingFilterer) WatchBlockVerifiedV2(opts *bind.WatchOpts, sink chan<- *LibProvingBlockVerifiedV2, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _LibProving.contract.WatchLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LibProvingBlockVerifiedV2) + if err := _LibProving.contract.UnpackLog(event, "BlockVerifiedV2", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBlockVerifiedV2 is a log parse operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_LibProving *LibProvingFilterer) ParseBlockVerifiedV2(log types.Log) (*LibProvingBlockVerifiedV2, error) { + event := new(LibProvingBlockVerifiedV2) + if err := _LibProving.contract.UnpackLog(event, "BlockVerifiedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LibProvingBondCreditedIterator is returned from FilterBondCredited and is used to iterate over the raw logs and unpacked data for BondCredited events raised by the LibProving contract. +type LibProvingBondCreditedIterator struct { + Event *LibProvingBondCredited // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LibProvingBondCreditedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LibProvingBondCredited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LibProvingBondCredited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LibProvingBondCreditedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LibProvingBondCreditedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LibProvingBondCredited represents a BondCredited event raised by the LibProving contract. +type LibProvingBondCredited struct { + User common.Address + BlockId *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondCredited is a free log retrieval operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_LibProving *LibProvingFilterer) FilterBondCredited(opts *bind.FilterOpts, user []common.Address) (*LibProvingBondCreditedIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _LibProving.contract.FilterLogs(opts, "BondCredited", userRule) + if err != nil { + return nil, err + } + return &LibProvingBondCreditedIterator{contract: _LibProving.contract, event: "BondCredited", logs: logs, sub: sub}, nil +} + +// WatchBondCredited is a free log subscription operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_LibProving *LibProvingFilterer) WatchBondCredited(opts *bind.WatchOpts, sink chan<- *LibProvingBondCredited, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _LibProving.contract.WatchLogs(opts, "BondCredited", userRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LibProvingBondCredited) + if err := _LibProving.contract.UnpackLog(event, "BondCredited", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBondCredited is a log parse operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_LibProving *LibProvingFilterer) ParseBondCredited(log types.Log) (*LibProvingBondCredited, error) { + event := new(LibProvingBondCredited) + if err := _LibProving.contract.UnpackLog(event, "BondCredited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LibProvingBondDebitedIterator is returned from FilterBondDebited and is used to iterate over the raw logs and unpacked data for BondDebited events raised by the LibProving contract. +type LibProvingBondDebitedIterator struct { + Event *LibProvingBondDebited // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LibProvingBondDebitedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LibProvingBondDebited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LibProvingBondDebited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LibProvingBondDebitedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LibProvingBondDebitedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LibProvingBondDebited represents a BondDebited event raised by the LibProving contract. +type LibProvingBondDebited struct { + User common.Address + BlockId *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondDebited is a free log retrieval operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_LibProving *LibProvingFilterer) FilterBondDebited(opts *bind.FilterOpts, user []common.Address) (*LibProvingBondDebitedIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _LibProving.contract.FilterLogs(opts, "BondDebited", userRule) + if err != nil { + return nil, err + } + return &LibProvingBondDebitedIterator{contract: _LibProving.contract, event: "BondDebited", logs: logs, sub: sub}, nil +} + +// WatchBondDebited is a free log subscription operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_LibProving *LibProvingFilterer) WatchBondDebited(opts *bind.WatchOpts, sink chan<- *LibProvingBondDebited, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _LibProving.contract.WatchLogs(opts, "BondDebited", userRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LibProvingBondDebited) + if err := _LibProving.contract.UnpackLog(event, "BondDebited", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBondDebited is a log parse operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_LibProving *LibProvingFilterer) ParseBondDebited(log types.Log) (*LibProvingBondDebited, error) { + event := new(LibProvingBondDebited) + if err := _LibProving.contract.UnpackLog(event, "BondDebited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LibProvingBondDepositedIterator is returned from FilterBondDeposited and is used to iterate over the raw logs and unpacked data for BondDeposited events raised by the LibProving contract. +type LibProvingBondDepositedIterator struct { + Event *LibProvingBondDeposited // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LibProvingBondDepositedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LibProvingBondDeposited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LibProvingBondDeposited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LibProvingBondDepositedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LibProvingBondDepositedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LibProvingBondDeposited represents a BondDeposited event raised by the LibProving contract. +type LibProvingBondDeposited struct { + User common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondDeposited is a free log retrieval operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_LibProving *LibProvingFilterer) FilterBondDeposited(opts *bind.FilterOpts, user []common.Address) (*LibProvingBondDepositedIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _LibProving.contract.FilterLogs(opts, "BondDeposited", userRule) + if err != nil { + return nil, err + } + return &LibProvingBondDepositedIterator{contract: _LibProving.contract, event: "BondDeposited", logs: logs, sub: sub}, nil +} + +// WatchBondDeposited is a free log subscription operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_LibProving *LibProvingFilterer) WatchBondDeposited(opts *bind.WatchOpts, sink chan<- *LibProvingBondDeposited, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _LibProving.contract.WatchLogs(opts, "BondDeposited", userRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LibProvingBondDeposited) + if err := _LibProving.contract.UnpackLog(event, "BondDeposited", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBondDeposited is a log parse operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_LibProving *LibProvingFilterer) ParseBondDeposited(log types.Log) (*LibProvingBondDeposited, error) { + event := new(LibProvingBondDeposited) + if err := _LibProving.contract.UnpackLog(event, "BondDeposited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // LibProvingProvingPausedIterator is returned from FilterProvingPaused and is used to iterate over the raw logs and unpacked data for ProvingPaused events raised by the LibProving contract. type LibProvingProvingPausedIterator struct { Event *LibProvingProvingPaused // Event containing the contract specifics and raw log @@ -314,9 +906,9 @@ func (_LibProving *LibProvingFilterer) ParseProvingPaused(log types.Log) (*LibPr return event, nil } -// LibProvingTransitionContestedIterator is returned from FilterTransitionContested and is used to iterate over the raw logs and unpacked data for TransitionContested events raised by the LibProving contract. -type LibProvingTransitionContestedIterator struct { - Event *LibProvingTransitionContested // Event containing the contract specifics and raw log +// LibProvingTransitionContestedV2Iterator is returned from FilterTransitionContestedV2 and is used to iterate over the raw logs and unpacked data for TransitionContestedV2 events raised by the LibProving contract. +type LibProvingTransitionContestedV2Iterator struct { + Event *LibProvingTransitionContestedV2 // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -330,7 +922,7 @@ type LibProvingTransitionContestedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *LibProvingTransitionContestedIterator) Next() bool { +func (it *LibProvingTransitionContestedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -339,7 +931,7 @@ func (it *LibProvingTransitionContestedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(LibProvingTransitionContested) + it.Event = new(LibProvingTransitionContestedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -354,7 +946,7 @@ func (it *LibProvingTransitionContestedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(LibProvingTransitionContested) + it.Event = new(LibProvingTransitionContestedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -370,55 +962,56 @@ func (it *LibProvingTransitionContestedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *LibProvingTransitionContestedIterator) Error() error { +func (it *LibProvingTransitionContestedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *LibProvingTransitionContestedIterator) Close() error { +func (it *LibProvingTransitionContestedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// LibProvingTransitionContested represents a TransitionContested event raised by the LibProving contract. -type LibProvingTransitionContested struct { +// LibProvingTransitionContestedV2 represents a TransitionContestedV2 event raised by the LibProving contract. +type LibProvingTransitionContestedV2 struct { BlockId *big.Int Tran TaikoDataTransition Contester common.Address ContestBond *big.Int Tier uint16 + ProposedIn uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterTransitionContested is a free log retrieval operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// FilterTransitionContestedV2 is a free log retrieval operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_LibProving *LibProvingFilterer) FilterTransitionContested(opts *bind.FilterOpts, blockId []*big.Int) (*LibProvingTransitionContestedIterator, error) { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_LibProving *LibProvingFilterer) FilterTransitionContestedV2(opts *bind.FilterOpts, blockId []*big.Int) (*LibProvingTransitionContestedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _LibProving.contract.FilterLogs(opts, "TransitionContested", blockIdRule) + logs, sub, err := _LibProving.contract.FilterLogs(opts, "TransitionContestedV2", blockIdRule) if err != nil { return nil, err } - return &LibProvingTransitionContestedIterator{contract: _LibProving.contract, event: "TransitionContested", logs: logs, sub: sub}, nil + return &LibProvingTransitionContestedV2Iterator{contract: _LibProving.contract, event: "TransitionContestedV2", logs: logs, sub: sub}, nil } -// WatchTransitionContested is a free log subscription operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// WatchTransitionContestedV2 is a free log subscription operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_LibProving *LibProvingFilterer) WatchTransitionContested(opts *bind.WatchOpts, sink chan<- *LibProvingTransitionContested, blockId []*big.Int) (event.Subscription, error) { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_LibProving *LibProvingFilterer) WatchTransitionContestedV2(opts *bind.WatchOpts, sink chan<- *LibProvingTransitionContestedV2, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _LibProving.contract.WatchLogs(opts, "TransitionContested", blockIdRule) + logs, sub, err := _LibProving.contract.WatchLogs(opts, "TransitionContestedV2", blockIdRule) if err != nil { return nil, err } @@ -428,8 +1021,8 @@ func (_LibProving *LibProvingFilterer) WatchTransitionContested(opts *bind.Watch select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(LibProvingTransitionContested) - if err := _LibProving.contract.UnpackLog(event, "TransitionContested", log); err != nil { + event := new(LibProvingTransitionContestedV2) + if err := _LibProving.contract.UnpackLog(event, "TransitionContestedV2", log); err != nil { return err } event.Raw = log @@ -450,21 +1043,21 @@ func (_LibProving *LibProvingFilterer) WatchTransitionContested(opts *bind.Watch }), nil } -// ParseTransitionContested is a log parse operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// ParseTransitionContestedV2 is a log parse operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_LibProving *LibProvingFilterer) ParseTransitionContested(log types.Log) (*LibProvingTransitionContested, error) { - event := new(LibProvingTransitionContested) - if err := _LibProving.contract.UnpackLog(event, "TransitionContested", log); err != nil { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_LibProving *LibProvingFilterer) ParseTransitionContestedV2(log types.Log) (*LibProvingTransitionContestedV2, error) { + event := new(LibProvingTransitionContestedV2) + if err := _LibProving.contract.UnpackLog(event, "TransitionContestedV2", log); err != nil { return nil, err } event.Raw = log return event, nil } -// LibProvingTransitionProvedIterator is returned from FilterTransitionProved and is used to iterate over the raw logs and unpacked data for TransitionProved events raised by the LibProving contract. -type LibProvingTransitionProvedIterator struct { - Event *LibProvingTransitionProved // Event containing the contract specifics and raw log +// LibProvingTransitionProvedV2Iterator is returned from FilterTransitionProvedV2 and is used to iterate over the raw logs and unpacked data for TransitionProvedV2 events raised by the LibProving contract. +type LibProvingTransitionProvedV2Iterator struct { + Event *LibProvingTransitionProvedV2 // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -478,7 +1071,7 @@ type LibProvingTransitionProvedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *LibProvingTransitionProvedIterator) Next() bool { +func (it *LibProvingTransitionProvedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -487,7 +1080,7 @@ func (it *LibProvingTransitionProvedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(LibProvingTransitionProved) + it.Event = new(LibProvingTransitionProvedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -502,7 +1095,7 @@ func (it *LibProvingTransitionProvedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(LibProvingTransitionProved) + it.Event = new(LibProvingTransitionProvedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -518,55 +1111,56 @@ func (it *LibProvingTransitionProvedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *LibProvingTransitionProvedIterator) Error() error { +func (it *LibProvingTransitionProvedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *LibProvingTransitionProvedIterator) Close() error { +func (it *LibProvingTransitionProvedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// LibProvingTransitionProved represents a TransitionProved event raised by the LibProving contract. -type LibProvingTransitionProved struct { +// LibProvingTransitionProvedV2 represents a TransitionProvedV2 event raised by the LibProving contract. +type LibProvingTransitionProvedV2 struct { BlockId *big.Int Tran TaikoDataTransition Prover common.Address ValidityBond *big.Int Tier uint16 + ProposedIn uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterTransitionProved is a free log retrieval operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// FilterTransitionProvedV2 is a free log retrieval operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_LibProving *LibProvingFilterer) FilterTransitionProved(opts *bind.FilterOpts, blockId []*big.Int) (*LibProvingTransitionProvedIterator, error) { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_LibProving *LibProvingFilterer) FilterTransitionProvedV2(opts *bind.FilterOpts, blockId []*big.Int) (*LibProvingTransitionProvedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _LibProving.contract.FilterLogs(opts, "TransitionProved", blockIdRule) + logs, sub, err := _LibProving.contract.FilterLogs(opts, "TransitionProvedV2", blockIdRule) if err != nil { return nil, err } - return &LibProvingTransitionProvedIterator{contract: _LibProving.contract, event: "TransitionProved", logs: logs, sub: sub}, nil + return &LibProvingTransitionProvedV2Iterator{contract: _LibProving.contract, event: "TransitionProvedV2", logs: logs, sub: sub}, nil } -// WatchTransitionProved is a free log subscription operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// WatchTransitionProvedV2 is a free log subscription operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_LibProving *LibProvingFilterer) WatchTransitionProved(opts *bind.WatchOpts, sink chan<- *LibProvingTransitionProved, blockId []*big.Int) (event.Subscription, error) { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_LibProving *LibProvingFilterer) WatchTransitionProvedV2(opts *bind.WatchOpts, sink chan<- *LibProvingTransitionProvedV2, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _LibProving.contract.WatchLogs(opts, "TransitionProved", blockIdRule) + logs, sub, err := _LibProving.contract.WatchLogs(opts, "TransitionProvedV2", blockIdRule) if err != nil { return nil, err } @@ -576,8 +1170,8 @@ func (_LibProving *LibProvingFilterer) WatchTransitionProved(opts *bind.WatchOpt select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(LibProvingTransitionProved) - if err := _LibProving.contract.UnpackLog(event, "TransitionProved", log); err != nil { + event := new(LibProvingTransitionProvedV2) + if err := _LibProving.contract.UnpackLog(event, "TransitionProvedV2", log); err != nil { return err } event.Raw = log @@ -598,12 +1192,12 @@ func (_LibProving *LibProvingFilterer) WatchTransitionProved(opts *bind.WatchOpt }), nil } -// ParseTransitionProved is a log parse operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// ParseTransitionProvedV2 is a log parse operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_LibProving *LibProvingFilterer) ParseTransitionProved(log types.Log) (*LibProvingTransitionProved, error) { - event := new(LibProvingTransitionProved) - if err := _LibProving.contract.UnpackLog(event, "TransitionProved", log); err != nil { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_LibProving *LibProvingFilterer) ParseTransitionProvedV2(log types.Log) (*LibProvingTransitionProvedV2, error) { + event := new(LibProvingTransitionProvedV2) + if err := _LibProving.contract.UnpackLog(event, "TransitionProvedV2", log); err != nil { return nil, err } event.Raw = log diff --git a/packages/taiko-client/bindings/gen_lib_utils.go b/packages/taiko-client/bindings/gen_lib_utils.go index 09043e7ebba..640b9986040 100644 --- a/packages/taiko-client/bindings/gen_lib_utils.go +++ b/packages/taiko-client/bindings/gen_lib_utils.go @@ -31,7 +31,7 @@ var ( // LibUtilsMetaData contains all meta data concerning the LibUtils contract. var LibUtilsMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]}]", + ABI: "[{\"type\":\"event\",\"name\":\"BlockVerifiedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]}]", } // LibUtilsABI is the input ABI used to generate the binding from. @@ -179,3 +179,158 @@ func (_LibUtils *LibUtilsTransactorRaw) Transfer(opts *bind.TransactOpts) (*type func (_LibUtils *LibUtilsTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { return _LibUtils.Contract.contract.Transact(opts, method, params...) } + +// LibUtilsBlockVerifiedV2Iterator is returned from FilterBlockVerifiedV2 and is used to iterate over the raw logs and unpacked data for BlockVerifiedV2 events raised by the LibUtils contract. +type LibUtilsBlockVerifiedV2Iterator struct { + Event *LibUtilsBlockVerifiedV2 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *LibUtilsBlockVerifiedV2Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(LibUtilsBlockVerifiedV2) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(LibUtilsBlockVerifiedV2) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *LibUtilsBlockVerifiedV2Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LibUtilsBlockVerifiedV2Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LibUtilsBlockVerifiedV2 represents a BlockVerifiedV2 event raised by the LibUtils contract. +type LibUtilsBlockVerifiedV2 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerifiedV2 is a free log retrieval operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_LibUtils *LibUtilsFilterer) FilterBlockVerifiedV2(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*LibUtilsBlockVerifiedV2Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _LibUtils.contract.FilterLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &LibUtilsBlockVerifiedV2Iterator{contract: _LibUtils.contract, event: "BlockVerifiedV2", logs: logs, sub: sub}, nil +} + +// WatchBlockVerifiedV2 is a free log subscription operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_LibUtils *LibUtilsFilterer) WatchBlockVerifiedV2(opts *bind.WatchOpts, sink chan<- *LibUtilsBlockVerifiedV2, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _LibUtils.contract.WatchLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(LibUtilsBlockVerifiedV2) + if err := _LibUtils.contract.UnpackLog(event, "BlockVerifiedV2", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBlockVerifiedV2 is a log parse operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_LibUtils *LibUtilsFilterer) ParseBlockVerifiedV2(log types.Log) (*LibUtilsBlockVerifiedV2, error) { + event := new(LibUtilsBlockVerifiedV2) + if err := _LibUtils.contract.UnpackLog(event, "BlockVerifiedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/packages/taiko-client/bindings/gen_lib_verifying.go b/packages/taiko-client/bindings/gen_lib_verifying.go index 7e8dba63910..92626c25e59 100644 --- a/packages/taiko-client/bindings/gen_lib_verifying.go +++ b/packages/taiko-client/bindings/gen_lib_verifying.go @@ -31,7 +31,7 @@ var ( // LibVerifyingMetaData contains all meta data concerning the LibVerifying contract. var LibVerifyingMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]}]", + ABI: "[{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]}]", } // LibVerifyingABI is the input ABI used to generate the binding from. @@ -179,293 +179,3 @@ func (_LibVerifying *LibVerifyingTransactorRaw) Transfer(opts *bind.TransactOpts func (_LibVerifying *LibVerifyingTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { return _LibVerifying.Contract.contract.Transact(opts, method, params...) } - -// LibVerifyingBlockVerifiedIterator is returned from FilterBlockVerified and is used to iterate over the raw logs and unpacked data for BlockVerified events raised by the LibVerifying contract. -type LibVerifyingBlockVerifiedIterator struct { - Event *LibVerifyingBlockVerified // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LibVerifyingBlockVerifiedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LibVerifyingBlockVerified) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LibVerifyingBlockVerified) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LibVerifyingBlockVerifiedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LibVerifyingBlockVerifiedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LibVerifyingBlockVerified represents a BlockVerified event raised by the LibVerifying contract. -type LibVerifyingBlockVerified struct { - BlockId *big.Int - Prover common.Address - BlockHash [32]byte - StateRoot [32]byte - Tier uint16 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBlockVerified is a free log retrieval operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. -// -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_LibVerifying *LibVerifyingFilterer) FilterBlockVerified(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*LibVerifyingBlockVerifiedIterator, error) { - - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - - logs, sub, err := _LibVerifying.contract.FilterLogs(opts, "BlockVerified", blockIdRule, proverRule) - if err != nil { - return nil, err - } - return &LibVerifyingBlockVerifiedIterator{contract: _LibVerifying.contract, event: "BlockVerified", logs: logs, sub: sub}, nil -} - -// WatchBlockVerified is a free log subscription operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. -// -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_LibVerifying *LibVerifyingFilterer) WatchBlockVerified(opts *bind.WatchOpts, sink chan<- *LibVerifyingBlockVerified, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { - - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - - logs, sub, err := _LibVerifying.contract.WatchLogs(opts, "BlockVerified", blockIdRule, proverRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LibVerifyingBlockVerified) - if err := _LibVerifying.contract.UnpackLog(event, "BlockVerified", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseBlockVerified is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. -// -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_LibVerifying *LibVerifyingFilterer) ParseBlockVerified(log types.Log) (*LibVerifyingBlockVerified, error) { - event := new(LibVerifyingBlockVerified) - if err := _LibVerifying.contract.UnpackLog(event, "BlockVerified", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LibVerifyingStateVariablesUpdatedIterator is returned from FilterStateVariablesUpdated and is used to iterate over the raw logs and unpacked data for StateVariablesUpdated events raised by the LibVerifying contract. -type LibVerifyingStateVariablesUpdatedIterator struct { - Event *LibVerifyingStateVariablesUpdated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LibVerifyingStateVariablesUpdatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LibVerifyingStateVariablesUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LibVerifyingStateVariablesUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LibVerifyingStateVariablesUpdatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LibVerifyingStateVariablesUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LibVerifyingStateVariablesUpdated represents a StateVariablesUpdated event raised by the LibVerifying contract. -type LibVerifyingStateVariablesUpdated struct { - SlotB TaikoDataSlotB - Raw types.Log // Blockchain specific contextual infos -} - -// FilterStateVariablesUpdated is a free log retrieval operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_LibVerifying *LibVerifyingFilterer) FilterStateVariablesUpdated(opts *bind.FilterOpts) (*LibVerifyingStateVariablesUpdatedIterator, error) { - - logs, sub, err := _LibVerifying.contract.FilterLogs(opts, "StateVariablesUpdated") - if err != nil { - return nil, err - } - return &LibVerifyingStateVariablesUpdatedIterator{contract: _LibVerifying.contract, event: "StateVariablesUpdated", logs: logs, sub: sub}, nil -} - -// WatchStateVariablesUpdated is a free log subscription operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_LibVerifying *LibVerifyingFilterer) WatchStateVariablesUpdated(opts *bind.WatchOpts, sink chan<- *LibVerifyingStateVariablesUpdated) (event.Subscription, error) { - - logs, sub, err := _LibVerifying.contract.WatchLogs(opts, "StateVariablesUpdated") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LibVerifyingStateVariablesUpdated) - if err := _LibVerifying.contract.UnpackLog(event, "StateVariablesUpdated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseStateVariablesUpdated is a log parse operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_LibVerifying *LibVerifyingFilterer) ParseStateVariablesUpdated(log types.Log) (*LibVerifyingStateVariablesUpdated, error) { - event := new(LibVerifyingStateVariablesUpdated) - if err := _LibVerifying.contract.UnpackLog(event, "StateVariablesUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/packages/taiko-client/bindings/gen_prover_set.go b/packages/taiko-client/bindings/gen_prover_set.go index 65aeb3cadad..9ce5ee76b8a 100644 --- a/packages/taiko-client/bindings/gen_prover_set.go +++ b/packages/taiko-client/bindings/gen_prover_set.go @@ -31,7 +31,7 @@ var ( // ProverSetMetaData contains all meta data concerning the ProverSet contract. var ProverSetMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"admin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"_delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableProver\",\"inputs\":[{\"name\":\"_prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_isProver\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isProver\",\"inputs\":[{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isProver\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isValidSignature\",\"inputs\":[{\"name\":\"_hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"magicValue_\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawToAdmin\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProvenBy\",\"inputs\":[{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProverEnabled\",\"inputs\":[{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"enabled\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"admin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approveAllowance\",\"inputs\":[{\"name\":\"_address\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_allowance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"_delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositBond\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableProver\",\"inputs\":[{\"name\":\"_prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_isProver\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isProver\",\"inputs\":[{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isProver\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isValidSignature\",\"inputs\":[{\"name\":\"_hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"magicValue_\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlockV2\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proposeBlocksV2\",\"inputs\":[{\"name\":\"_paramsArr\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_txListArr\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proposeBlocksV2Conditionally\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_txList\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proveBlocks\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"_input\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_batchProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawBond\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawEtherToAdmin\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawToAdmin\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProverEnabled\",\"inputs\":[{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"enabled\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_BOND_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NOT_FIRST_PROPOSAL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // ProverSetABI is the input ABI used to generate the binding from. @@ -604,6 +604,27 @@ func (_ProverSet *ProverSetTransactorSession) AcceptOwnership() (*types.Transact return _ProverSet.Contract.AcceptOwnership(&_ProverSet.TransactOpts) } +// ApproveAllowance is a paid mutator transaction binding the contract method 0x0a1553a5. +// +// Solidity: function approveAllowance(address _address, uint256 _allowance) returns() +func (_ProverSet *ProverSetTransactor) ApproveAllowance(opts *bind.TransactOpts, _address common.Address, _allowance *big.Int) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "approveAllowance", _address, _allowance) +} + +// ApproveAllowance is a paid mutator transaction binding the contract method 0x0a1553a5. +// +// Solidity: function approveAllowance(address _address, uint256 _allowance) returns() +func (_ProverSet *ProverSetSession) ApproveAllowance(_address common.Address, _allowance *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.ApproveAllowance(&_ProverSet.TransactOpts, _address, _allowance) +} + +// ApproveAllowance is a paid mutator transaction binding the contract method 0x0a1553a5. +// +// Solidity: function approveAllowance(address _address, uint256 _allowance) returns() +func (_ProverSet *ProverSetTransactorSession) ApproveAllowance(_address common.Address, _allowance *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.ApproveAllowance(&_ProverSet.TransactOpts, _address, _allowance) +} + // Delegate is a paid mutator transaction binding the contract method 0x5c19a95c. // // Solidity: function delegate(address _delegatee) returns() @@ -625,6 +646,27 @@ func (_ProverSet *ProverSetTransactorSession) Delegate(_delegatee common.Address return _ProverSet.Contract.Delegate(&_ProverSet.TransactOpts, _delegatee) } +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) returns() +func (_ProverSet *ProverSetTransactor) DepositBond(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "depositBond", _amount) +} + +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) returns() +func (_ProverSet *ProverSetSession) DepositBond(_amount *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.DepositBond(&_ProverSet.TransactOpts, _amount) +} + +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) returns() +func (_ProverSet *ProverSetTransactorSession) DepositBond(_amount *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.DepositBond(&_ProverSet.TransactOpts, _amount) +} + // EnableProver is a paid mutator transaction binding the contract method 0xcb4cd0a4. // // Solidity: function enableProver(address _prover, bool _isProver) returns() @@ -648,23 +690,23 @@ func (_ProverSet *ProverSetTransactorSession) EnableProver(_prover common.Addres // Init is a paid mutator transaction binding the contract method 0x184b9559. // -// Solidity: function init(address _owner, address _admin, address _addressManager) returns() -func (_ProverSet *ProverSetTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _admin common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _ProverSet.contract.Transact(opts, "init", _owner, _admin, _addressManager) +// Solidity: function init(address _owner, address _admin, address _rollupAddressManager) returns() +func (_ProverSet *ProverSetTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _admin common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "init", _owner, _admin, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0x184b9559. // -// Solidity: function init(address _owner, address _admin, address _addressManager) returns() -func (_ProverSet *ProverSetSession) Init(_owner common.Address, _admin common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _ProverSet.Contract.Init(&_ProverSet.TransactOpts, _owner, _admin, _addressManager) +// Solidity: function init(address _owner, address _admin, address _rollupAddressManager) returns() +func (_ProverSet *ProverSetSession) Init(_owner common.Address, _admin common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _ProverSet.Contract.Init(&_ProverSet.TransactOpts, _owner, _admin, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0x184b9559. // -// Solidity: function init(address _owner, address _admin, address _addressManager) returns() -func (_ProverSet *ProverSetTransactorSession) Init(_owner common.Address, _admin common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _ProverSet.Contract.Init(&_ProverSet.TransactOpts, _owner, _admin, _addressManager) +// Solidity: function init(address _owner, address _admin, address _rollupAddressManager) returns() +func (_ProverSet *ProverSetTransactorSession) Init(_owner common.Address, _admin common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _ProverSet.Contract.Init(&_ProverSet.TransactOpts, _owner, _admin, _rollupAddressManager) } // Pause is a paid mutator transaction binding the contract method 0x8456cb59. @@ -688,6 +730,69 @@ func (_ProverSet *ProverSetTransactorSession) Pause() (*types.Transaction, error return _ProverSet.Contract.Pause(&_ProverSet.TransactOpts) } +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns() +func (_ProverSet *ProverSetTransactor) ProposeBlockV2(opts *bind.TransactOpts, _params []byte, _txList []byte) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "proposeBlockV2", _params, _txList) +} + +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns() +func (_ProverSet *ProverSetSession) ProposeBlockV2(_params []byte, _txList []byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProposeBlockV2(&_ProverSet.TransactOpts, _params, _txList) +} + +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns() +func (_ProverSet *ProverSetTransactorSession) ProposeBlockV2(_params []byte, _txList []byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProposeBlockV2(&_ProverSet.TransactOpts, _params, _txList) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns() +func (_ProverSet *ProverSetTransactor) ProposeBlocksV2(opts *bind.TransactOpts, _paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "proposeBlocksV2", _paramsArr, _txListArr) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns() +func (_ProverSet *ProverSetSession) ProposeBlocksV2(_paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProposeBlocksV2(&_ProverSet.TransactOpts, _paramsArr, _txListArr) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns() +func (_ProverSet *ProverSetTransactorSession) ProposeBlocksV2(_paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProposeBlocksV2(&_ProverSet.TransactOpts, _paramsArr, _txListArr) +} + +// ProposeBlocksV2Conditionally is a paid mutator transaction binding the contract method 0xe4882785. +// +// Solidity: function proposeBlocksV2Conditionally(bytes[] _params, bytes[] _txList) returns() +func (_ProverSet *ProverSetTransactor) ProposeBlocksV2Conditionally(opts *bind.TransactOpts, _params [][]byte, _txList [][]byte) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "proposeBlocksV2Conditionally", _params, _txList) +} + +// ProposeBlocksV2Conditionally is a paid mutator transaction binding the contract method 0xe4882785. +// +// Solidity: function proposeBlocksV2Conditionally(bytes[] _params, bytes[] _txList) returns() +func (_ProverSet *ProverSetSession) ProposeBlocksV2Conditionally(_params [][]byte, _txList [][]byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProposeBlocksV2Conditionally(&_ProverSet.TransactOpts, _params, _txList) +} + +// ProposeBlocksV2Conditionally is a paid mutator transaction binding the contract method 0xe4882785. +// +// Solidity: function proposeBlocksV2Conditionally(bytes[] _params, bytes[] _txList) returns() +func (_ProverSet *ProverSetTransactorSession) ProposeBlocksV2Conditionally(_params [][]byte, _txList [][]byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProposeBlocksV2Conditionally(&_ProverSet.TransactOpts, _params, _txList) +} + // ProveBlock is a paid mutator transaction binding the contract method 0x10d008bd. // // Solidity: function proveBlock(uint64 _blockId, bytes _input) returns() @@ -709,6 +814,27 @@ func (_ProverSet *ProverSetTransactorSession) ProveBlock(_blockId uint64, _input return _ProverSet.Contract.ProveBlock(&_ProverSet.TransactOpts, _blockId, _input) } +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockId, bytes[] _input, bytes _batchProof) returns() +func (_ProverSet *ProverSetTransactor) ProveBlocks(opts *bind.TransactOpts, _blockId []uint64, _input [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "proveBlocks", _blockId, _input, _batchProof) +} + +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockId, bytes[] _input, bytes _batchProof) returns() +func (_ProverSet *ProverSetSession) ProveBlocks(_blockId []uint64, _input [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProveBlocks(&_ProverSet.TransactOpts, _blockId, _input, _batchProof) +} + +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockId, bytes[] _input, bytes _batchProof) returns() +func (_ProverSet *ProverSetTransactorSession) ProveBlocks(_blockId []uint64, _input [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProveBlocks(&_ProverSet.TransactOpts, _blockId, _input, _batchProof) +} + // RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. // // Solidity: function renounceOwnership() returns() @@ -814,6 +940,48 @@ func (_ProverSet *ProverSetTransactorSession) UpgradeToAndCall(newImplementation return _ProverSet.Contract.UpgradeToAndCall(&_ProverSet.TransactOpts, newImplementation, data) } +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. +// +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_ProverSet *ProverSetTransactor) WithdrawBond(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "withdrawBond", _amount) +} + +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. +// +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_ProverSet *ProverSetSession) WithdrawBond(_amount *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.WithdrawBond(&_ProverSet.TransactOpts, _amount) +} + +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. +// +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_ProverSet *ProverSetTransactorSession) WithdrawBond(_amount *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.WithdrawBond(&_ProverSet.TransactOpts, _amount) +} + +// WithdrawEtherToAdmin is a paid mutator transaction binding the contract method 0x7ddb9fec. +// +// Solidity: function withdrawEtherToAdmin(uint256 _amount) returns() +func (_ProverSet *ProverSetTransactor) WithdrawEtherToAdmin(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "withdrawEtherToAdmin", _amount) +} + +// WithdrawEtherToAdmin is a paid mutator transaction binding the contract method 0x7ddb9fec. +// +// Solidity: function withdrawEtherToAdmin(uint256 _amount) returns() +func (_ProverSet *ProverSetSession) WithdrawEtherToAdmin(_amount *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.WithdrawEtherToAdmin(&_ProverSet.TransactOpts, _amount) +} + +// WithdrawEtherToAdmin is a paid mutator transaction binding the contract method 0x7ddb9fec. +// +// Solidity: function withdrawEtherToAdmin(uint256 _amount) returns() +func (_ProverSet *ProverSetTransactorSession) WithdrawEtherToAdmin(_amount *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.WithdrawEtherToAdmin(&_ProverSet.TransactOpts, _amount) +} + // WithdrawToAdmin is a paid mutator transaction binding the contract method 0x8bd809fd. // // Solidity: function withdrawToAdmin(uint256 _amount) returns() @@ -835,27 +1003,6 @@ func (_ProverSet *ProverSetTransactorSession) WithdrawToAdmin(_amount *big.Int) return _ProverSet.Contract.WithdrawToAdmin(&_ProverSet.TransactOpts, _amount) } -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_ProverSet *ProverSetTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ProverSet.contract.RawTransact(opts, nil) // calldata is disallowed for receive function -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_ProverSet *ProverSetSession) Receive() (*types.Transaction, error) { - return _ProverSet.Contract.Receive(&_ProverSet.TransactOpts) -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_ProverSet *ProverSetTransactorSession) Receive() (*types.Transaction, error) { - return _ProverSet.Contract.Receive(&_ProverSet.TransactOpts) -} - // ProverSetAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the ProverSet contract. type ProverSetAdminChangedIterator struct { Event *ProverSetAdminChanged // Event containing the contract specifics and raw log @@ -1135,159 +1282,6 @@ func (_ProverSet *ProverSetFilterer) ParseBeaconUpgraded(log types.Log) (*Prover return event, nil } -// ProverSetBlockProvenByIterator is returned from FilterBlockProvenBy and is used to iterate over the raw logs and unpacked data for BlockProvenBy events raised by the ProverSet contract. -type ProverSetBlockProvenByIterator struct { - Event *ProverSetBlockProvenBy // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ProverSetBlockProvenByIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ProverSetBlockProvenBy) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ProverSetBlockProvenBy) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ProverSetBlockProvenByIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ProverSetBlockProvenByIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ProverSetBlockProvenBy represents a BlockProvenBy event raised by the ProverSet contract. -type ProverSetBlockProvenBy struct { - Prover common.Address - BlockId uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBlockProvenBy is a free log retrieval operation binding the contract event 0x97c6d17699a8ef67a471a4e5025eb88ae673f626a5eb443e0539af38b4e56746. -// -// Solidity: event BlockProvenBy(address indexed prover, uint64 indexed blockId) -func (_ProverSet *ProverSetFilterer) FilterBlockProvenBy(opts *bind.FilterOpts, prover []common.Address, blockId []uint64) (*ProverSetBlockProvenByIterator, error) { - - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - - logs, sub, err := _ProverSet.contract.FilterLogs(opts, "BlockProvenBy", proverRule, blockIdRule) - if err != nil { - return nil, err - } - return &ProverSetBlockProvenByIterator{contract: _ProverSet.contract, event: "BlockProvenBy", logs: logs, sub: sub}, nil -} - -// WatchBlockProvenBy is a free log subscription operation binding the contract event 0x97c6d17699a8ef67a471a4e5025eb88ae673f626a5eb443e0539af38b4e56746. -// -// Solidity: event BlockProvenBy(address indexed prover, uint64 indexed blockId) -func (_ProverSet *ProverSetFilterer) WatchBlockProvenBy(opts *bind.WatchOpts, sink chan<- *ProverSetBlockProvenBy, prover []common.Address, blockId []uint64) (event.Subscription, error) { - - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - - logs, sub, err := _ProverSet.contract.WatchLogs(opts, "BlockProvenBy", proverRule, blockIdRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ProverSetBlockProvenBy) - if err := _ProverSet.contract.UnpackLog(event, "BlockProvenBy", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseBlockProvenBy is a log parse operation binding the contract event 0x97c6d17699a8ef67a471a4e5025eb88ae673f626a5eb443e0539af38b4e56746. -// -// Solidity: event BlockProvenBy(address indexed prover, uint64 indexed blockId) -func (_ProverSet *ProverSetFilterer) ParseBlockProvenBy(log types.Log) (*ProverSetBlockProvenBy, error) { - event := new(ProverSetBlockProvenBy) - if err := _ProverSet.contract.UnpackLog(event, "BlockProvenBy", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // ProverSetInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ProverSet contract. type ProverSetInitializedIterator struct { Event *ProverSetInitialized // Event containing the contract specifics and raw log diff --git a/packages/taiko-client/bindings/gen_sgx_verifier.go b/packages/taiko-client/bindings/gen_sgx_verifier.go index f8923ffefa9..a782f3a5269 100644 --- a/packages/taiko-client/bindings/gen_sgx_verifier.go +++ b/packages/taiko-client/bindings/gen_sgx_verifier.go @@ -88,7 +88,7 @@ type V3StructQEAuthData struct { // SgxVerifierMetaData contains all meta data concerning the SgxVerifier contract. var SgxVerifierMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addInstances\",\"inputs\":[{\"name\":\"_instances\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addressRegistered\",\"inputs\":[{\"name\":\"instanceAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"alreadyAttested\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteInstances\",\"inputs\":[{\"name\":\"_ids\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"instances\",\"inputs\":[{\"name\":\"instanceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerInstance\",\"inputs\":[{\"name\":\"_attestation\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ParsedV3QuoteStruct\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.Header\",\"components\":[{\"name\":\"version\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"attestationKeyType\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"teeType\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"qeSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"pceSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"qeVendorId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"userData\",\"type\":\"bytes20\",\"internalType\":\"bytes20\"}]},{\"name\":\"localEnclaveReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"v3AuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ECDSAQuoteV3AuthData\",\"components\":[{\"name\":\"ecdsa256BitSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"ecdsaAttestationKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"pckSignedQeReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"qeReportSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"qeAuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.QEAuthData\",\"components\":[{\"name\":\"parsedDataSize\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"certification\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.CertificationData\",\"components\":[{\"name\":\"certType\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"certDataSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"decodedCertDataArray\",\"type\":\"bytes[3]\",\"internalType\":\"bytes[3]\"}]}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyProof\",\"inputs\":[{\"name\":\"_ctx\",\"type\":\"tuple\",\"internalType\":\"structIVerifier.Context\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceAdded\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"replaced\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceDeleted\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addInstances\",\"inputs\":[{\"name\":\"_instances\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addressRegistered\",\"inputs\":[{\"name\":\"instanceAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"alreadyAttested\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteInstances\",\"inputs\":[{\"name\":\"_ids\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"instances\",\"inputs\":[{\"name\":\"instanceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerInstance\",\"inputs\":[{\"name\":\"_attestation\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ParsedV3QuoteStruct\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.Header\",\"components\":[{\"name\":\"version\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"attestationKeyType\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"teeType\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"qeSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"pceSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"qeVendorId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"userData\",\"type\":\"bytes20\",\"internalType\":\"bytes20\"}]},{\"name\":\"localEnclaveReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"v3AuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ECDSAQuoteV3AuthData\",\"components\":[{\"name\":\"ecdsa256BitSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"ecdsaAttestationKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"pckSignedQeReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"qeReportSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"qeAuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.QEAuthData\",\"components\":[{\"name\":\"parsedDataSize\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"certification\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.CertificationData\",\"components\":[{\"name\":\"certType\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"certDataSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"decodedCertDataArray\",\"type\":\"bytes[3]\",\"internalType\":\"bytes[3]\"}]}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBatchProof\",\"inputs\":[{\"name\":\"_ctxs\",\"type\":\"tuple[]\",\"internalType\":\"structIVerifier.ContextV2[]\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyProof\",\"inputs\":[{\"name\":\"_ctx\",\"type\":\"tuple\",\"internalType\":\"structIVerifier.Context\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceAdded\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"replaced\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceDeleted\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // SgxVerifierABI is the input ABI used to generate the binding from. @@ -781,23 +781,23 @@ func (_SgxVerifier *SgxVerifierTransactorSession) DeleteInstances(_ids []*big.In // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_SgxVerifier *SgxVerifierTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _SgxVerifier.contract.Transact(opts, "init", _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_SgxVerifier *SgxVerifierTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _SgxVerifier.contract.Transact(opts, "init", _owner, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_SgxVerifier *SgxVerifierSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_SgxVerifier *SgxVerifierSession) Init(_owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_SgxVerifier *SgxVerifierTransactorSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_SgxVerifier *SgxVerifierTransactorSession) Init(_owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _rollupAddressManager) } // Pause is a paid mutator transaction binding the contract method 0x8456cb59. @@ -947,6 +947,27 @@ func (_SgxVerifier *SgxVerifierTransactorSession) UpgradeToAndCall(newImplementa return _SgxVerifier.Contract.UpgradeToAndCall(&_SgxVerifier.TransactOpts, newImplementation, data) } +// VerifyBatchProof is a paid mutator transaction binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] _ctxs, (uint16,bytes) _proof) returns() +func (_SgxVerifier *SgxVerifierTransactor) VerifyBatchProof(opts *bind.TransactOpts, _ctxs []IVerifierContextV2, _proof TaikoDataTierProof) (*types.Transaction, error) { + return _SgxVerifier.contract.Transact(opts, "verifyBatchProof", _ctxs, _proof) +} + +// VerifyBatchProof is a paid mutator transaction binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] _ctxs, (uint16,bytes) _proof) returns() +func (_SgxVerifier *SgxVerifierSession) VerifyBatchProof(_ctxs []IVerifierContextV2, _proof TaikoDataTierProof) (*types.Transaction, error) { + return _SgxVerifier.Contract.VerifyBatchProof(&_SgxVerifier.TransactOpts, _ctxs, _proof) +} + +// VerifyBatchProof is a paid mutator transaction binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] _ctxs, (uint16,bytes) _proof) returns() +func (_SgxVerifier *SgxVerifierTransactorSession) VerifyBatchProof(_ctxs []IVerifierContextV2, _proof TaikoDataTierProof) (*types.Transaction, error) { + return _SgxVerifier.Contract.VerifyBatchProof(&_SgxVerifier.TransactOpts, _ctxs, _proof) +} + // VerifyProof is a paid mutator transaction binding the contract method 0x21e89968. // // Solidity: function verifyProof((bytes32,bytes32,address,uint64,bool,bool,address) _ctx, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns() diff --git a/packages/taiko-client/bindings/gen_taiko_l1.go b/packages/taiko-client/bindings/gen_taiko_l1.go index 96d1bf12ceb..6c18d3621ea 100644 --- a/packages/taiko-client/bindings/gen_taiko_l1.go +++ b/packages/taiko-client/bindings/gen_taiko_l1.go @@ -29,6 +29,15 @@ var ( _ = abi.ConvertType ) +// LibSharedDataBaseFeeConfig is an auto generated low-level Go binding around an user-defined struct. +type LibSharedDataBaseFeeConfig struct { + AdjustmentQuotient uint8 + SharingPctg uint8 + GasIssuancePerSecond uint32 + MinGasExcess uint64 + MaxGasIssuancePerBlock uint32 +} + // TaikoDataBlock is an auto generated low-level Go binding around an user-defined struct. type TaikoDataBlock struct { MetaHash [32]byte @@ -59,15 +68,55 @@ type TaikoDataBlockMetadata struct { Sender common.Address } +// TaikoDataBlockMetadataV2 is an auto generated low-level Go binding around an user-defined struct. +type TaikoDataBlockMetadataV2 struct { + AnchorBlockHash [32]byte + Difficulty [32]byte + BlobHash [32]byte + ExtraData [32]byte + Coinbase common.Address + Id uint64 + GasLimit uint32 + Timestamp uint64 + AnchorBlockId uint64 + MinTier uint16 + BlobUsed bool + ParentMetaHash [32]byte + Proposer common.Address + LivenessBond *big.Int + ProposedAt uint64 + ProposedIn uint64 + BlobTxListOffset uint32 + BlobTxListLength uint32 + BlobIndex uint8 + BaseFeeConfig LibSharedDataBaseFeeConfig +} + +// TaikoDataBlockV2 is an auto generated low-level Go binding around an user-defined struct. +type TaikoDataBlockV2 struct { + MetaHash [32]byte + AssignedProver common.Address + LivenessBond *big.Int + BlockId uint64 + ProposedAt uint64 + ProposedIn uint64 + NextTransitionId *big.Int + LivenessBondReturned bool + VerifiedTransitionId *big.Int +} + // TaikoDataConfig is an auto generated low-level Go binding around an user-defined struct. type TaikoDataConfig struct { - ChainId uint64 - BlockMaxProposals uint64 - BlockRingBufferSize uint64 - MaxBlocksToVerifyPerProposal uint64 - BlockMaxGasLimit uint32 - LivenessBond *big.Int - BlockSyncThreshold uint8 + ChainId uint64 + BlockMaxProposals uint64 + BlockRingBufferSize uint64 + MaxBlocksToVerify uint64 + BlockMaxGasLimit uint32 + LivenessBond *big.Int + StateRootSyncInternal uint8 + MaxAnchorHeightOffset uint64 + BaseFeeConfig LibSharedDataBaseFeeConfig + OntakeForkHeight uint64 } // TaikoDataEthDeposit is an auto generated low-level Go binding around an user-defined struct. @@ -87,6 +136,14 @@ type TaikoDataSlotA struct { // TaikoDataSlotB is an auto generated low-level Go binding around an user-defined struct. type TaikoDataSlotB struct { + NumBlocks uint64 + LastVerifiedBlockId uint64 + ProvingPaused bool + LastProposedIn *big.Int + LastUnpausedAt uint64 +} + +type TaikoDataSlotBV1 struct { NumBlocks uint64 LastVerifiedBlockId uint64 ProvingPaused bool @@ -120,7 +177,7 @@ type TaikoDataTransitionState struct { // TaikoL1ClientMetaData contains all meta data concerning the TaikoL1Client contract. var TaikoL1ClientMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerifyPerProposal\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockSyncThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_tid\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_toPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resetGenesisHash\",\"inputs\":[{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slotA\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slotB\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"inputs\":[{\"name\":\"_user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositBond\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockV2\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockV2\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"livenessBondReturned\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint24\",\"internalType\":\"uint24\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"stateRootSyncInternal\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"maxAnchorHeightOffset\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"ontakeForkHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"blockId_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"verifiedAt_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"blockId_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"verifiedAt_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"lastProposedIn\",\"type\":\"uint56\",\"internalType\":\"uint56\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_tid\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransitions\",\"inputs\":[{\"name\":\"_blockIds\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"_parentHashes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TransitionState[]\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"prover_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_toPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init3\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastProposedIn\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint56\",\"internalType\":\"uint56\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlockV2\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proposeBlocksV2\",\"inputs\":[{\"name\":\"_paramsArr\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_txListArr\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[{\"name\":\"metaArr_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.BlockMetadataV2[]\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proveBlocks\",\"inputs\":[{\"name\":\"_blockIds\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"_inputs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_batchProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"lastProposedIn\",\"type\":\"uint56\",\"internalType\":\"uint56\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawBond\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerifiedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerifiedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondCredited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondCredited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDebited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDebited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDeposited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDeposited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondWithdrawn\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CalldataTxList\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"txList\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CalldataTxList\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"txList\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"lastProposedIn\",\"type\":\"uint56\",\"internalType\":\"uint56\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContestedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProvedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ETH_NOT_PAID_AS_BOND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_FORK_HEIGHT_ERROR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_FORK_HEIGHT_ERROR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_ANCHOR_BLOCK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CUSTOM_PROPOSER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_MSG_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROPOSER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIMESTAMP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // TaikoL1ClientABI is the input ABI used to generate the binding from. @@ -300,6 +357,37 @@ func (_TaikoL1Client *TaikoL1ClientCallerSession) AddressManager() (common.Addre return _TaikoL1Client.Contract.AddressManager(&_TaikoL1Client.CallOpts) } +// BondBalanceOf is a free data retrieval call binding the contract method 0xa9c2c835. +// +// Solidity: function bondBalanceOf(address _user) view returns(uint256) +func (_TaikoL1Client *TaikoL1ClientCaller) BondBalanceOf(opts *bind.CallOpts, _user common.Address) (*big.Int, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "bondBalanceOf", _user) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BondBalanceOf is a free data retrieval call binding the contract method 0xa9c2c835. +// +// Solidity: function bondBalanceOf(address _user) view returns(uint256) +func (_TaikoL1Client *TaikoL1ClientSession) BondBalanceOf(_user common.Address) (*big.Int, error) { + return _TaikoL1Client.Contract.BondBalanceOf(&_TaikoL1Client.CallOpts, _user) +} + +// BondBalanceOf is a free data retrieval call binding the contract method 0xa9c2c835. +// +// Solidity: function bondBalanceOf(address _user) view returns(uint256) +func (_TaikoL1Client *TaikoL1ClientCallerSession) BondBalanceOf(_user common.Address) (*big.Int, error) { + return _TaikoL1Client.Contract.BondBalanceOf(&_TaikoL1Client.CallOpts, _user) +} + // GetBlock is a free data retrieval call binding the contract method 0x5fa15e79. // // Solidity: function getBlock(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) blk_) @@ -331,9 +419,40 @@ func (_TaikoL1Client *TaikoL1ClientCallerSession) GetBlock(_blockId uint64) (Tai return _TaikoL1Client.Contract.GetBlock(&_TaikoL1Client.CallOpts, _blockId) } +// GetBlockV2 is a free data retrieval call binding the contract method 0x3f0c544a. +// +// Solidity: function getBlockV2(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint24,bool,uint24) blk_) +func (_TaikoL1Client *TaikoL1ClientCaller) GetBlockV2(opts *bind.CallOpts, _blockId uint64) (TaikoDataBlockV2, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "getBlockV2", _blockId) + + if err != nil { + return *new(TaikoDataBlockV2), err + } + + out0 := *abi.ConvertType(out[0], new(TaikoDataBlockV2)).(*TaikoDataBlockV2) + + return out0, err + +} + +// GetBlockV2 is a free data retrieval call binding the contract method 0x3f0c544a. +// +// Solidity: function getBlockV2(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint24,bool,uint24) blk_) +func (_TaikoL1Client *TaikoL1ClientSession) GetBlockV2(_blockId uint64) (TaikoDataBlockV2, error) { + return _TaikoL1Client.Contract.GetBlockV2(&_TaikoL1Client.CallOpts, _blockId) +} + +// GetBlockV2 is a free data retrieval call binding the contract method 0x3f0c544a. +// +// Solidity: function getBlockV2(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint24,bool,uint24) blk_) +func (_TaikoL1Client *TaikoL1ClientCallerSession) GetBlockV2(_blockId uint64) (TaikoDataBlockV2, error) { + return _TaikoL1Client.Contract.GetBlockV2(&_TaikoL1Client.CallOpts, _blockId) +} + // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,uint64,(uint8,uint8,uint32,uint64,uint32),uint64)) func (_TaikoL1Client *TaikoL1ClientCaller) GetConfig(opts *bind.CallOpts) (TaikoDataConfig, error) { var out []interface{} err := _TaikoL1Client.contract.Call(opts, &out, "getConfig") @@ -350,21 +469,131 @@ func (_TaikoL1Client *TaikoL1ClientCaller) GetConfig(opts *bind.CallOpts) (Taiko // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,uint64,(uint8,uint8,uint32,uint64,uint32),uint64)) func (_TaikoL1Client *TaikoL1ClientSession) GetConfig() (TaikoDataConfig, error) { return _TaikoL1Client.Contract.GetConfig(&_TaikoL1Client.CallOpts) } // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,uint64,(uint8,uint8,uint32,uint64,uint32),uint64)) func (_TaikoL1Client *TaikoL1ClientCallerSession) GetConfig() (TaikoDataConfig, error) { return _TaikoL1Client.Contract.GetConfig(&_TaikoL1Client.CallOpts) } +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1Client *TaikoL1ClientCaller) GetLastSyncedBlock(opts *bind.CallOpts) (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "getLastSyncedBlock") + + outstruct := new(struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 + }) + if err != nil { + return *outstruct, err + } + + outstruct.BlockId = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.BlockHash = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.StateRoot = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) + outstruct.VerifiedAt = *abi.ConvertType(out[3], new(uint64)).(*uint64) + + return *outstruct, err + +} + +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1Client *TaikoL1ClientSession) GetLastSyncedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1Client.Contract.GetLastSyncedBlock(&_TaikoL1Client.CallOpts) +} + +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1Client *TaikoL1ClientCallerSession) GetLastSyncedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1Client.Contract.GetLastSyncedBlock(&_TaikoL1Client.CallOpts) +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1Client *TaikoL1ClientCaller) GetLastVerifiedBlock(opts *bind.CallOpts) (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "getLastVerifiedBlock") + + outstruct := new(struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 + }) + if err != nil { + return *outstruct, err + } + + outstruct.BlockId = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.BlockHash = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.StateRoot = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) + outstruct.VerifiedAt = *abi.ConvertType(out[3], new(uint64)).(*uint64) + + return *outstruct, err + +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1Client *TaikoL1ClientSession) GetLastVerifiedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1Client.Contract.GetLastVerifiedBlock(&_TaikoL1Client.CallOpts) +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1Client *TaikoL1ClientCallerSession) GetLastVerifiedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1Client.Contract.GetLastVerifiedBlock(&_TaikoL1Client.CallOpts) +} + // GetStateVariables is a free data retrieval call binding the contract method 0xdde89cf5. // -// Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint8,uint16,uint32,uint64)) +// Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint56,uint64)) func (_TaikoL1Client *TaikoL1ClientCaller) GetStateVariables(opts *bind.CallOpts) (TaikoDataSlotA, TaikoDataSlotB, error) { var out []interface{} err := _TaikoL1Client.contract.Call(opts, &out, "getStateVariables") @@ -380,16 +609,31 @@ func (_TaikoL1Client *TaikoL1ClientCaller) GetStateVariables(opts *bind.CallOpts } +func (_TaikoL1Client *TaikoL1ClientCaller) GetStateVariablesV1(opts *bind.CallOpts) (TaikoDataSlotA, TaikoDataSlotBV1, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "getStateVariables") + + if err != nil { + return *new(TaikoDataSlotA), *new(TaikoDataSlotBV1), err + } + + out0 := *abi.ConvertType(out[0], new(TaikoDataSlotA)).(*TaikoDataSlotA) + out1 := *abi.ConvertType(out[1], new(TaikoDataSlotB)).(*TaikoDataSlotBV1) + + return out0, out1, err + +} + // GetStateVariables is a free data retrieval call binding the contract method 0xdde89cf5. // -// Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint8,uint16,uint32,uint64)) +// Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint56,uint64)) func (_TaikoL1Client *TaikoL1ClientSession) GetStateVariables() (TaikoDataSlotA, TaikoDataSlotB, error) { return _TaikoL1Client.Contract.GetStateVariables(&_TaikoL1Client.CallOpts) } // GetStateVariables is a free data retrieval call binding the contract method 0xdde89cf5. // -// Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint8,uint16,uint32,uint64)) +// Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint56,uint64)) func (_TaikoL1Client *TaikoL1ClientCallerSession) GetStateVariables() (TaikoDataSlotA, TaikoDataSlotB, error) { return _TaikoL1Client.Contract.GetStateVariables(&_TaikoL1Client.CallOpts) } @@ -456,6 +700,68 @@ func (_TaikoL1Client *TaikoL1ClientCallerSession) GetTransition0(_blockId uint64 return _TaikoL1Client.Contract.GetTransition0(&_TaikoL1Client.CallOpts, _blockId, _parentHash) } +// GetTransitions is a free data retrieval call binding the contract method 0xb89c61bc. +// +// Solidity: function getTransitions(uint64[] _blockIds, bytes32[] _parentHashes) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1Client *TaikoL1ClientCaller) GetTransitions(opts *bind.CallOpts, _blockIds []uint64, _parentHashes [][32]byte) ([]TaikoDataTransitionState, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "getTransitions", _blockIds, _parentHashes) + + if err != nil { + return *new([]TaikoDataTransitionState), err + } + + out0 := *abi.ConvertType(out[0], new([]TaikoDataTransitionState)).(*[]TaikoDataTransitionState) + + return out0, err + +} + +// GetTransitions is a free data retrieval call binding the contract method 0xb89c61bc. +// +// Solidity: function getTransitions(uint64[] _blockIds, bytes32[] _parentHashes) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1Client *TaikoL1ClientSession) GetTransitions(_blockIds []uint64, _parentHashes [][32]byte) ([]TaikoDataTransitionState, error) { + return _TaikoL1Client.Contract.GetTransitions(&_TaikoL1Client.CallOpts, _blockIds, _parentHashes) +} + +// GetTransitions is a free data retrieval call binding the contract method 0xb89c61bc. +// +// Solidity: function getTransitions(uint64[] _blockIds, bytes32[] _parentHashes) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1Client *TaikoL1ClientCallerSession) GetTransitions(_blockIds []uint64, _parentHashes [][32]byte) ([]TaikoDataTransitionState, error) { + return _TaikoL1Client.Contract.GetTransitions(&_TaikoL1Client.CallOpts, _blockIds, _parentHashes) +} + +// GetVerifiedBlockProver is a free data retrieval call binding the contract method 0x6074b8c1. +// +// Solidity: function getVerifiedBlockProver(uint64 _blockId) view returns(address prover_) +func (_TaikoL1Client *TaikoL1ClientCaller) GetVerifiedBlockProver(opts *bind.CallOpts, _blockId uint64) (common.Address, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "getVerifiedBlockProver", _blockId) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetVerifiedBlockProver is a free data retrieval call binding the contract method 0x6074b8c1. +// +// Solidity: function getVerifiedBlockProver(uint64 _blockId) view returns(address prover_) +func (_TaikoL1Client *TaikoL1ClientSession) GetVerifiedBlockProver(_blockId uint64) (common.Address, error) { + return _TaikoL1Client.Contract.GetVerifiedBlockProver(&_TaikoL1Client.CallOpts, _blockId) +} + +// GetVerifiedBlockProver is a free data retrieval call binding the contract method 0x6074b8c1. +// +// Solidity: function getVerifiedBlockProver(uint64 _blockId) view returns(address prover_) +func (_TaikoL1Client *TaikoL1ClientCallerSession) GetVerifiedBlockProver(_blockId uint64) (common.Address, error) { + return _TaikoL1Client.Contract.GetVerifiedBlockProver(&_TaikoL1Client.CallOpts, _blockId) +} + // Impl is a free data retrieval call binding the contract method 0x8abf6077. // // Solidity: function impl() view returns(address) @@ -518,6 +824,37 @@ func (_TaikoL1Client *TaikoL1ClientCallerSession) InNonReentrant() (bool, error) return _TaikoL1Client.Contract.InNonReentrant(&_TaikoL1Client.CallOpts) } +// LastProposedIn is a free data retrieval call binding the contract method 0x5979f17c. +// +// Solidity: function lastProposedIn() view returns(uint56) +func (_TaikoL1Client *TaikoL1ClientCaller) LastProposedIn(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "lastProposedIn") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// LastProposedIn is a free data retrieval call binding the contract method 0x5979f17c. +// +// Solidity: function lastProposedIn() view returns(uint56) +func (_TaikoL1Client *TaikoL1ClientSession) LastProposedIn() (*big.Int, error) { + return _TaikoL1Client.Contract.LastProposedIn(&_TaikoL1Client.CallOpts) +} + +// LastProposedIn is a free data retrieval call binding the contract method 0x5979f17c. +// +// Solidity: function lastProposedIn() view returns(uint56) +func (_TaikoL1Client *TaikoL1ClientCallerSession) LastProposedIn() (*big.Int, error) { + return _TaikoL1Client.Contract.LastProposedIn(&_TaikoL1Client.CallOpts) +} + // LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. // // Solidity: function lastUnpausedAt() view returns(uint64) @@ -735,71 +1072,9 @@ func (_TaikoL1Client *TaikoL1ClientCallerSession) Resolve0(_name [32]byte, _allo return _TaikoL1Client.Contract.Resolve0(&_TaikoL1Client.CallOpts, _name, _allowZeroAddress) } -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1Client *TaikoL1ClientCaller) SlotA(opts *bind.CallOpts) (TaikoDataSlotA, error) { - var out []interface{} - err := _TaikoL1Client.contract.Call(opts, &out, "slotA") - - if err != nil { - return *new(TaikoDataSlotA), err - } - - out0 := *abi.ConvertType(out[0], new(TaikoDataSlotA)).(*TaikoDataSlotA) - - return out0, err - -} - -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1Client *TaikoL1ClientSession) SlotA() (TaikoDataSlotA, error) { - return _TaikoL1Client.Contract.SlotA(&_TaikoL1Client.CallOpts) -} - -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1Client *TaikoL1ClientCallerSession) SlotA() (TaikoDataSlotA, error) { - return _TaikoL1Client.Contract.SlotA(&_TaikoL1Client.CallOpts) -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1Client *TaikoL1ClientCaller) SlotB(opts *bind.CallOpts) (TaikoDataSlotB, error) { - var out []interface{} - err := _TaikoL1Client.contract.Call(opts, &out, "slotB") - - if err != nil { - return *new(TaikoDataSlotB), err - } - - out0 := *abi.ConvertType(out[0], new(TaikoDataSlotB)).(*TaikoDataSlotB) - - return out0, err - -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1Client *TaikoL1ClientSession) SlotB() (TaikoDataSlotB, error) { - return _TaikoL1Client.Contract.SlotB(&_TaikoL1Client.CallOpts) -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1Client *TaikoL1ClientCallerSession) SlotB() (TaikoDataSlotB, error) { - return _TaikoL1Client.Contract.SlotB(&_TaikoL1Client.CallOpts) -} - // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint56,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientCaller) State(opts *bind.CallOpts) (struct { Reserve1 [32]byte SlotA TaikoDataSlotA @@ -827,7 +1102,7 @@ func (_TaikoL1Client *TaikoL1ClientCaller) State(opts *bind.CallOpts) (struct { // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint56,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientSession) State() (struct { Reserve1 [32]byte SlotA TaikoDataSlotA @@ -838,7 +1113,7 @@ func (_TaikoL1Client *TaikoL1ClientSession) State() (struct { // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint56,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientCallerSession) State() (struct { Reserve1 [32]byte SlotA TaikoDataSlotA @@ -868,25 +1143,46 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) AcceptOwnership() (*types. return _TaikoL1Client.Contract.AcceptOwnership(&_TaikoL1Client.TransactOpts) } +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) payable returns() +func (_TaikoL1Client *TaikoL1ClientTransactor) DepositBond(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "depositBond", _amount) +} + +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) payable returns() +func (_TaikoL1Client *TaikoL1ClientSession) DepositBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1Client.Contract.DepositBond(&_TaikoL1Client.TransactOpts, _amount) +} + +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) payable returns() +func (_TaikoL1Client *TaikoL1ClientTransactorSession) DepositBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1Client.Contract.DepositBond(&_TaikoL1Client.TransactOpts, _amount) +} + // Init is a paid mutator transaction binding the contract method 0x29d1b62f. // -// Solidity: function init(address _owner, address _addressManager, bytes32 _genesisBlockHash, bool _toPause) returns() -func (_TaikoL1Client *TaikoL1ClientTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { - return _TaikoL1Client.contract.Transact(opts, "init", _owner, _addressManager, _genesisBlockHash, _toPause) +// Solidity: function init(address _owner, address _rollupAddressManager, bytes32 _genesisBlockHash, bool _toPause) returns() +func (_TaikoL1Client *TaikoL1ClientTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _rollupAddressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "init", _owner, _rollupAddressManager, _genesisBlockHash, _toPause) } // Init is a paid mutator transaction binding the contract method 0x29d1b62f. // -// Solidity: function init(address _owner, address _addressManager, bytes32 _genesisBlockHash, bool _toPause) returns() -func (_TaikoL1Client *TaikoL1ClientSession) Init(_owner common.Address, _addressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { - return _TaikoL1Client.Contract.Init(&_TaikoL1Client.TransactOpts, _owner, _addressManager, _genesisBlockHash, _toPause) +// Solidity: function init(address _owner, address _rollupAddressManager, bytes32 _genesisBlockHash, bool _toPause) returns() +func (_TaikoL1Client *TaikoL1ClientSession) Init(_owner common.Address, _rollupAddressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { + return _TaikoL1Client.Contract.Init(&_TaikoL1Client.TransactOpts, _owner, _rollupAddressManager, _genesisBlockHash, _toPause) } // Init is a paid mutator transaction binding the contract method 0x29d1b62f. // -// Solidity: function init(address _owner, address _addressManager, bytes32 _genesisBlockHash, bool _toPause) returns() -func (_TaikoL1Client *TaikoL1ClientTransactorSession) Init(_owner common.Address, _addressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { - return _TaikoL1Client.Contract.Init(&_TaikoL1Client.TransactOpts, _owner, _addressManager, _genesisBlockHash, _toPause) +// Solidity: function init(address _owner, address _rollupAddressManager, bytes32 _genesisBlockHash, bool _toPause) returns() +func (_TaikoL1Client *TaikoL1ClientTransactorSession) Init(_owner common.Address, _rollupAddressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { + return _TaikoL1Client.Contract.Init(&_TaikoL1Client.TransactOpts, _owner, _rollupAddressManager, _genesisBlockHash, _toPause) } // Init2 is a paid mutator transaction binding the contract method 0x069489a2. @@ -910,6 +1206,27 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) Init2() (*types.Transactio return _TaikoL1Client.Contract.Init2(&_TaikoL1Client.TransactOpts) } +// Init3 is a paid mutator transaction binding the contract method 0x486e3cd7. +// +// Solidity: function init3() returns() +func (_TaikoL1Client *TaikoL1ClientTransactor) Init3(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "init3") +} + +// Init3 is a paid mutator transaction binding the contract method 0x486e3cd7. +// +// Solidity: function init3() returns() +func (_TaikoL1Client *TaikoL1ClientSession) Init3() (*types.Transaction, error) { + return _TaikoL1Client.Contract.Init3(&_TaikoL1Client.TransactOpts) +} + +// Init3 is a paid mutator transaction binding the contract method 0x486e3cd7. +// +// Solidity: function init3() returns() +func (_TaikoL1Client *TaikoL1ClientTransactorSession) Init3() (*types.Transaction, error) { + return _TaikoL1Client.Contract.Init3(&_TaikoL1Client.TransactOpts) +} + // Pause is a paid mutator transaction binding the contract method 0x8456cb59. // // Solidity: function pause() returns() @@ -952,25 +1269,46 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) PauseProving(_pause bool) return _TaikoL1Client.Contract.PauseProving(&_TaikoL1Client.TransactOpts, _pause) } -// ProposeBlock is a paid mutator transaction binding the contract method 0xef16e845. +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta_) +func (_TaikoL1Client *TaikoL1ClientTransactor) ProposeBlockV2(opts *bind.TransactOpts, _params []byte, _txList []byte) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "proposeBlockV2", _params, _txList) +} + +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta_) +func (_TaikoL1Client *TaikoL1ClientSession) ProposeBlockV2(_params []byte, _txList []byte) (*types.Transaction, error) { + return _TaikoL1Client.Contract.ProposeBlockV2(&_TaikoL1Client.TransactOpts, _params, _txList) +} + +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. // -// Solidity: function proposeBlock(bytes _params, bytes _txList) payable returns((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta_, (address,uint96,uint64)[] deposits_) -func (_TaikoL1Client *TaikoL1ClientTransactor) ProposeBlock(opts *bind.TransactOpts, _params []byte, _txList []byte) (*types.Transaction, error) { - return _TaikoL1Client.contract.Transact(opts, "proposeBlock", _params, _txList) +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta_) +func (_TaikoL1Client *TaikoL1ClientTransactorSession) ProposeBlockV2(_params []byte, _txList []byte) (*types.Transaction, error) { + return _TaikoL1Client.Contract.ProposeBlockV2(&_TaikoL1Client.TransactOpts, _params, _txList) } -// ProposeBlock is a paid mutator transaction binding the contract method 0xef16e845. +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. // -// Solidity: function proposeBlock(bytes _params, bytes _txList) payable returns((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta_, (address,uint96,uint64)[] deposits_) -func (_TaikoL1Client *TaikoL1ClientSession) ProposeBlock(_params []byte, _txList []byte) (*types.Transaction, error) { - return _TaikoL1Client.Contract.ProposeBlock(&_TaikoL1Client.TransactOpts, _params, _txList) +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32))[] metaArr_) +func (_TaikoL1Client *TaikoL1ClientTransactor) ProposeBlocksV2(opts *bind.TransactOpts, _paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "proposeBlocksV2", _paramsArr, _txListArr) } -// ProposeBlock is a paid mutator transaction binding the contract method 0xef16e845. +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. // -// Solidity: function proposeBlock(bytes _params, bytes _txList) payable returns((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta_, (address,uint96,uint64)[] deposits_) -func (_TaikoL1Client *TaikoL1ClientTransactorSession) ProposeBlock(_params []byte, _txList []byte) (*types.Transaction, error) { - return _TaikoL1Client.Contract.ProposeBlock(&_TaikoL1Client.TransactOpts, _params, _txList) +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32))[] metaArr_) +func (_TaikoL1Client *TaikoL1ClientSession) ProposeBlocksV2(_paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _TaikoL1Client.Contract.ProposeBlocksV2(&_TaikoL1Client.TransactOpts, _paramsArr, _txListArr) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32))[] metaArr_) +func (_TaikoL1Client *TaikoL1ClientTransactorSession) ProposeBlocksV2(_paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _TaikoL1Client.Contract.ProposeBlocksV2(&_TaikoL1Client.TransactOpts, _paramsArr, _txListArr) } // ProveBlock is a paid mutator transaction binding the contract method 0x10d008bd. @@ -994,6 +1332,27 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) ProveBlock(_blockId uint64 return _TaikoL1Client.Contract.ProveBlock(&_TaikoL1Client.TransactOpts, _blockId, _input) } +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockIds, bytes[] _inputs, bytes _batchProof) returns() +func (_TaikoL1Client *TaikoL1ClientTransactor) ProveBlocks(opts *bind.TransactOpts, _blockIds []uint64, _inputs [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "proveBlocks", _blockIds, _inputs, _batchProof) +} + +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockIds, bytes[] _inputs, bytes _batchProof) returns() +func (_TaikoL1Client *TaikoL1ClientSession) ProveBlocks(_blockIds []uint64, _inputs [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _TaikoL1Client.Contract.ProveBlocks(&_TaikoL1Client.TransactOpts, _blockIds, _inputs, _batchProof) +} + +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockIds, bytes[] _inputs, bytes _batchProof) returns() +func (_TaikoL1Client *TaikoL1ClientTransactorSession) ProveBlocks(_blockIds []uint64, _inputs [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _TaikoL1Client.Contract.ProveBlocks(&_TaikoL1Client.TransactOpts, _blockIds, _inputs, _batchProof) +} + // RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. // // Solidity: function renounceOwnership() returns() @@ -1015,27 +1374,6 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) RenounceOwnership() (*type return _TaikoL1Client.Contract.RenounceOwnership(&_TaikoL1Client.TransactOpts) } -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1Client *TaikoL1ClientTransactor) ResetGenesisHash(opts *bind.TransactOpts, _genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1Client.contract.Transact(opts, "resetGenesisHash", _genesisBlockHash) -} - -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1Client *TaikoL1ClientSession) ResetGenesisHash(_genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1Client.Contract.ResetGenesisHash(&_TaikoL1Client.TransactOpts, _genesisBlockHash) -} - -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1Client *TaikoL1ClientTransactorSession) ResetGenesisHash(_genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1Client.Contract.ResetGenesisHash(&_TaikoL1Client.TransactOpts, _genesisBlockHash) -} - // TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. // // Solidity: function transferOwnership(address newOwner) returns() @@ -1141,25 +1479,25 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) VerifyBlocks(_maxBlocksToV return _TaikoL1Client.Contract.VerifyBlocks(&_TaikoL1Client.TransactOpts, _maxBlocksToVerify) } -// Receive is a paid mutator transaction binding the contract receive function. +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. // -// Solidity: receive() payable returns() -func (_TaikoL1Client *TaikoL1ClientTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _TaikoL1Client.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_TaikoL1Client *TaikoL1ClientTransactor) WithdrawBond(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "withdrawBond", _amount) } -// Receive is a paid mutator transaction binding the contract receive function. +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. // -// Solidity: receive() payable returns() -func (_TaikoL1Client *TaikoL1ClientSession) Receive() (*types.Transaction, error) { - return _TaikoL1Client.Contract.Receive(&_TaikoL1Client.TransactOpts) +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_TaikoL1Client *TaikoL1ClientSession) WithdrawBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1Client.Contract.WithdrawBond(&_TaikoL1Client.TransactOpts, _amount) } -// Receive is a paid mutator transaction binding the contract receive function. +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. // -// Solidity: receive() payable returns() -func (_TaikoL1Client *TaikoL1ClientTransactorSession) Receive() (*types.Transaction, error) { - return _TaikoL1Client.Contract.Receive(&_TaikoL1Client.TransactOpts) +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_TaikoL1Client *TaikoL1ClientTransactorSession) WithdrawBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1Client.Contract.WithdrawBond(&_TaikoL1Client.TransactOpts, _amount) } // TaikoL1ClientAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the TaikoL1Client contract. @@ -1597,9 +1935,9 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockProposed(log types.Log) ( return event, nil } -// TaikoL1ClientBlockProposed0Iterator is returned from FilterBlockProposed0 and is used to iterate over the raw logs and unpacked data for BlockProposed0 events raised by the TaikoL1Client contract. -type TaikoL1ClientBlockProposed0Iterator struct { - Event *TaikoL1ClientBlockProposed0 // Event containing the contract specifics and raw log +// TaikoL1ClientBlockProposedV2Iterator is returned from FilterBlockProposedV2 and is used to iterate over the raw logs and unpacked data for BlockProposedV2 events raised by the TaikoL1Client contract. +type TaikoL1ClientBlockProposedV2Iterator struct { + Event *TaikoL1ClientBlockProposedV2 // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1613,7 +1951,7 @@ type TaikoL1ClientBlockProposed0Iterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *TaikoL1ClientBlockProposed0Iterator) Next() bool { +func (it *TaikoL1ClientBlockProposedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1622,7 +1960,7 @@ func (it *TaikoL1ClientBlockProposed0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1ClientBlockProposed0) + it.Event = new(TaikoL1ClientBlockProposedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1637,7 +1975,7 @@ func (it *TaikoL1ClientBlockProposed0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1ClientBlockProposed0) + it.Event = new(TaikoL1ClientBlockProposedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1653,63 +1991,197 @@ func (it *TaikoL1ClientBlockProposed0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1ClientBlockProposed0Iterator) Error() error { +func (it *TaikoL1ClientBlockProposedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1ClientBlockProposed0Iterator) Close() error { +func (it *TaikoL1ClientBlockProposedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1ClientBlockProposed0 represents a BlockProposed0 event raised by the TaikoL1Client contract. -type TaikoL1ClientBlockProposed0 struct { - BlockId *big.Int - AssignedProver common.Address - LivenessBond *big.Int - Meta TaikoDataBlockMetadata - DepositsProcessed []TaikoDataEthDeposit - Raw types.Log // Blockchain specific contextual infos +// TaikoL1ClientBlockProposedV2 represents a BlockProposedV2 event raised by the TaikoL1Client contract. +type TaikoL1ClientBlockProposedV2 struct { + BlockId *big.Int + Meta TaikoDataBlockMetadataV2 + Raw types.Log // Blockchain specific contextual infos } -// FilterBlockProposed0 is a free log retrieval operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// FilterBlockProposedV2 is a free log retrieval operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBlockProposed0(opts *bind.FilterOpts, blockId []*big.Int, assignedProver []common.Address) (*TaikoL1ClientBlockProposed0Iterator, error) { +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBlockProposedV2(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientBlockProposedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BlockProposedV2", blockIdRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBlockProposedV2Iterator{contract: _TaikoL1Client.contract, event: "BlockProposedV2", logs: logs, sub: sub}, nil +} + +// WatchBlockProposedV2 is a free log subscription operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockProposedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBlockProposedV2, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BlockProposed0", blockIdRule, assignedProverRule) + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockProposedV2", blockIdRule) if err != nil { return nil, err } - return &TaikoL1ClientBlockProposed0Iterator{contract: _TaikoL1Client.contract, event: "BlockProposed0", logs: logs, sub: sub}, nil + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1ClientBlockProposedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockProposedV2", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil } -// WatchBlockProposed0 is a free log subscription operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// ParseBlockProposedV2 is a log parse operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockProposed0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBlockProposed0, blockId []*big.Int, assignedProver []common.Address) (event.Subscription, error) { +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockProposedV2(log types.Log) (*TaikoL1ClientBlockProposedV2, error) { + event := new(TaikoL1ClientBlockProposedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockProposedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBlockProposedV20Iterator is returned from FilterBlockProposedV20 and is used to iterate over the raw logs and unpacked data for BlockProposedV20 events raised by the TaikoL1Client contract. +type TaikoL1ClientBlockProposedV20Iterator struct { + Event *TaikoL1ClientBlockProposedV20 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1ClientBlockProposedV20Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBlockProposedV20) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBlockProposedV20) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1ClientBlockProposedV20Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBlockProposedV20Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBlockProposedV20 represents a BlockProposedV20 event raised by the TaikoL1Client contract. +type TaikoL1ClientBlockProposedV20 struct { + BlockId *big.Int + Meta TaikoDataBlockMetadataV2 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockProposedV20 is a free log retrieval operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBlockProposedV20(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientBlockProposedV20Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BlockProposedV20", blockIdRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBlockProposedV20Iterator{contract: _TaikoL1Client.contract, event: "BlockProposedV20", logs: logs, sub: sub}, nil +} + +// WatchBlockProposedV20 is a free log subscription operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockProposedV20(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBlockProposedV20, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockProposed0", blockIdRule, assignedProverRule) + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockProposedV20", blockIdRule) if err != nil { return nil, err } @@ -1719,8 +2191,8 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockProposed0(opts *bind.Watc select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1ClientBlockProposed0) - if err := _TaikoL1Client.contract.UnpackLog(event, "BlockProposed0", log); err != nil { + event := new(TaikoL1ClientBlockProposedV20) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockProposedV20", log); err != nil { return err } event.Raw = log @@ -1741,12 +2213,12 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockProposed0(opts *bind.Watc }), nil } -// ParseBlockProposed0 is a log parse operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// ParseBlockProposedV20 is a log parse operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockProposed0(log types.Log) (*TaikoL1ClientBlockProposed0, error) { - event := new(TaikoL1ClientBlockProposed0) - if err := _TaikoL1Client.contract.UnpackLog(event, "BlockProposed0", log); err != nil { +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockProposedV20(log types.Log) (*TaikoL1ClientBlockProposedV20, error) { + event := new(TaikoL1ClientBlockProposedV20) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockProposedV20", log); err != nil { return nil, err } event.Raw = log @@ -1860,12 +2332,1486 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerified(opts *bind.Watch for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockVerified", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1ClientBlockVerified) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerified", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBlockVerified is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockVerified(log types.Log) (*TaikoL1ClientBlockVerified, error) { + event := new(TaikoL1ClientBlockVerified) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBlockVerifiedV2Iterator is returned from FilterBlockVerifiedV2 and is used to iterate over the raw logs and unpacked data for BlockVerifiedV2 events raised by the TaikoL1Client contract. +type TaikoL1ClientBlockVerifiedV2Iterator struct { + Event *TaikoL1ClientBlockVerifiedV2 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1ClientBlockVerifiedV2Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBlockVerifiedV2) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBlockVerifiedV2) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1ClientBlockVerifiedV2Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBlockVerifiedV2Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBlockVerifiedV2 represents a BlockVerifiedV2 event raised by the TaikoL1Client contract. +type TaikoL1ClientBlockVerifiedV2 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerifiedV2 is a free log retrieval operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBlockVerifiedV2(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1ClientBlockVerifiedV2Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBlockVerifiedV2Iterator{contract: _TaikoL1Client.contract, event: "BlockVerifiedV2", logs: logs, sub: sub}, nil +} + +// WatchBlockVerifiedV2 is a free log subscription operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerifiedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBlockVerifiedV2, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1ClientBlockVerifiedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerifiedV2", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBlockVerifiedV2 is a log parse operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockVerifiedV2(log types.Log) (*TaikoL1ClientBlockVerifiedV2, error) { + event := new(TaikoL1ClientBlockVerifiedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerifiedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBlockVerifiedV20Iterator is returned from FilterBlockVerifiedV20 and is used to iterate over the raw logs and unpacked data for BlockVerifiedV20 events raised by the TaikoL1Client contract. +type TaikoL1ClientBlockVerifiedV20Iterator struct { + Event *TaikoL1ClientBlockVerifiedV20 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1ClientBlockVerifiedV20Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBlockVerifiedV20) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBlockVerifiedV20) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1ClientBlockVerifiedV20Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBlockVerifiedV20Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBlockVerifiedV20 represents a BlockVerifiedV20 event raised by the TaikoL1Client contract. +type TaikoL1ClientBlockVerifiedV20 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerifiedV20 is a free log retrieval operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBlockVerifiedV20(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1ClientBlockVerifiedV20Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BlockVerifiedV20", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBlockVerifiedV20Iterator{contract: _TaikoL1Client.contract, event: "BlockVerifiedV20", logs: logs, sub: sub}, nil +} + +// WatchBlockVerifiedV20 is a free log subscription operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerifiedV20(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBlockVerifiedV20, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockVerifiedV20", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1ClientBlockVerifiedV20) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerifiedV20", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBlockVerifiedV20 is a log parse operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockVerifiedV20(log types.Log) (*TaikoL1ClientBlockVerifiedV20, error) { + event := new(TaikoL1ClientBlockVerifiedV20) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerifiedV20", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondCreditedIterator is returned from FilterBondCredited and is used to iterate over the raw logs and unpacked data for BondCredited events raised by the TaikoL1Client contract. +type TaikoL1ClientBondCreditedIterator struct { + Event *TaikoL1ClientBondCredited // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1ClientBondCreditedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondCredited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondCredited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1ClientBondCreditedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondCreditedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondCredited represents a BondCredited event raised by the TaikoL1Client contract. +type TaikoL1ClientBondCredited struct { + User common.Address + BlockId *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondCredited is a free log retrieval operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondCredited(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondCreditedIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondCredited", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondCreditedIterator{contract: _TaikoL1Client.contract, event: "BondCredited", logs: logs, sub: sub}, nil +} + +// WatchBondCredited is a free log subscription operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondCredited(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondCredited, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondCredited", userRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1ClientBondCredited) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondCredited", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBondCredited is a log parse operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondCredited(log types.Log) (*TaikoL1ClientBondCredited, error) { + event := new(TaikoL1ClientBondCredited) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondCredited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondCredited0Iterator is returned from FilterBondCredited0 and is used to iterate over the raw logs and unpacked data for BondCredited0 events raised by the TaikoL1Client contract. +type TaikoL1ClientBondCredited0Iterator struct { + Event *TaikoL1ClientBondCredited0 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1ClientBondCredited0Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondCredited0) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondCredited0) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1ClientBondCredited0Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondCredited0Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondCredited0 represents a BondCredited0 event raised by the TaikoL1Client contract. +type TaikoL1ClientBondCredited0 struct { + User common.Address + BlockId *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondCredited0 is a free log retrieval operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondCredited0(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondCredited0Iterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondCredited0", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondCredited0Iterator{contract: _TaikoL1Client.contract, event: "BondCredited0", logs: logs, sub: sub}, nil +} + +// WatchBondCredited0 is a free log subscription operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondCredited0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondCredited0, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondCredited0", userRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1ClientBondCredited0) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondCredited0", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBondCredited0 is a log parse operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondCredited0(log types.Log) (*TaikoL1ClientBondCredited0, error) { + event := new(TaikoL1ClientBondCredited0) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondCredited0", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondDebitedIterator is returned from FilterBondDebited and is used to iterate over the raw logs and unpacked data for BondDebited events raised by the TaikoL1Client contract. +type TaikoL1ClientBondDebitedIterator struct { + Event *TaikoL1ClientBondDebited // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1ClientBondDebitedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondDebited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondDebited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1ClientBondDebitedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondDebitedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondDebited represents a BondDebited event raised by the TaikoL1Client contract. +type TaikoL1ClientBondDebited struct { + User common.Address + BlockId *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondDebited is a free log retrieval operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondDebited(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondDebitedIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondDebited", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondDebitedIterator{contract: _TaikoL1Client.contract, event: "BondDebited", logs: logs, sub: sub}, nil +} + +// WatchBondDebited is a free log subscription operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondDebited(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondDebited, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondDebited", userRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1ClientBondDebited) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDebited", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBondDebited is a log parse operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondDebited(log types.Log) (*TaikoL1ClientBondDebited, error) { + event := new(TaikoL1ClientBondDebited) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDebited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondDebited0Iterator is returned from FilterBondDebited0 and is used to iterate over the raw logs and unpacked data for BondDebited0 events raised by the TaikoL1Client contract. +type TaikoL1ClientBondDebited0Iterator struct { + Event *TaikoL1ClientBondDebited0 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1ClientBondDebited0Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondDebited0) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondDebited0) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1ClientBondDebited0Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondDebited0Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondDebited0 represents a BondDebited0 event raised by the TaikoL1Client contract. +type TaikoL1ClientBondDebited0 struct { + User common.Address + BlockId *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondDebited0 is a free log retrieval operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondDebited0(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondDebited0Iterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondDebited0", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondDebited0Iterator{contract: _TaikoL1Client.contract, event: "BondDebited0", logs: logs, sub: sub}, nil +} + +// WatchBondDebited0 is a free log subscription operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondDebited0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondDebited0, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondDebited0", userRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1ClientBondDebited0) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDebited0", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBondDebited0 is a log parse operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondDebited0(log types.Log) (*TaikoL1ClientBondDebited0, error) { + event := new(TaikoL1ClientBondDebited0) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDebited0", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondDepositedIterator is returned from FilterBondDeposited and is used to iterate over the raw logs and unpacked data for BondDeposited events raised by the TaikoL1Client contract. +type TaikoL1ClientBondDepositedIterator struct { + Event *TaikoL1ClientBondDeposited // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1ClientBondDepositedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondDeposited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondDeposited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1ClientBondDepositedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondDepositedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondDeposited represents a BondDeposited event raised by the TaikoL1Client contract. +type TaikoL1ClientBondDeposited struct { + User common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondDeposited is a free log retrieval operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondDeposited(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondDepositedIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondDeposited", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondDepositedIterator{contract: _TaikoL1Client.contract, event: "BondDeposited", logs: logs, sub: sub}, nil +} + +// WatchBondDeposited is a free log subscription operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondDeposited(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondDeposited, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondDeposited", userRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1ClientBondDeposited) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDeposited", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBondDeposited is a log parse operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondDeposited(log types.Log) (*TaikoL1ClientBondDeposited, error) { + event := new(TaikoL1ClientBondDeposited) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDeposited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondDeposited0Iterator is returned from FilterBondDeposited0 and is used to iterate over the raw logs and unpacked data for BondDeposited0 events raised by the TaikoL1Client contract. +type TaikoL1ClientBondDeposited0Iterator struct { + Event *TaikoL1ClientBondDeposited0 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1ClientBondDeposited0Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondDeposited0) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondDeposited0) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1ClientBondDeposited0Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondDeposited0Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondDeposited0 represents a BondDeposited0 event raised by the TaikoL1Client contract. +type TaikoL1ClientBondDeposited0 struct { + User common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondDeposited0 is a free log retrieval operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondDeposited0(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondDeposited0Iterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondDeposited0", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondDeposited0Iterator{contract: _TaikoL1Client.contract, event: "BondDeposited0", logs: logs, sub: sub}, nil +} + +// WatchBondDeposited0 is a free log subscription operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondDeposited0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondDeposited0, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondDeposited0", userRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1ClientBondDeposited0) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDeposited0", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBondDeposited0 is a log parse operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondDeposited0(log types.Log) (*TaikoL1ClientBondDeposited0, error) { + event := new(TaikoL1ClientBondDeposited0) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDeposited0", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondWithdrawnIterator is returned from FilterBondWithdrawn and is used to iterate over the raw logs and unpacked data for BondWithdrawn events raised by the TaikoL1Client contract. +type TaikoL1ClientBondWithdrawnIterator struct { + Event *TaikoL1ClientBondWithdrawn // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1ClientBondWithdrawnIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientBondWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1ClientBondWithdrawnIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondWithdrawnIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondWithdrawn represents a BondWithdrawn event raised by the TaikoL1Client contract. +type TaikoL1ClientBondWithdrawn struct { + User common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondWithdrawn is a free log retrieval operation binding the contract event 0x0d41118e36df44efb77a471fc49fb9c0be0406d802ef95520e9fbf606e65b455. +// +// Solidity: event BondWithdrawn(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondWithdrawn(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondWithdrawnIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondWithdrawn", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondWithdrawnIterator{contract: _TaikoL1Client.contract, event: "BondWithdrawn", logs: logs, sub: sub}, nil +} + +// WatchBondWithdrawn is a free log subscription operation binding the contract event 0x0d41118e36df44efb77a471fc49fb9c0be0406d802ef95520e9fbf606e65b455. +// +// Solidity: event BondWithdrawn(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondWithdrawn(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondWithdrawn, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondWithdrawn", userRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1ClientBondWithdrawn) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondWithdrawn", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBondWithdrawn is a log parse operation binding the contract event 0x0d41118e36df44efb77a471fc49fb9c0be0406d802ef95520e9fbf606e65b455. +// +// Solidity: event BondWithdrawn(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondWithdrawn(log types.Log) (*TaikoL1ClientBondWithdrawn, error) { + event := new(TaikoL1ClientBondWithdrawn) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondWithdrawn", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientCalldataTxListIterator is returned from FilterCalldataTxList and is used to iterate over the raw logs and unpacked data for CalldataTxList events raised by the TaikoL1Client contract. +type TaikoL1ClientCalldataTxListIterator struct { + Event *TaikoL1ClientCalldataTxList // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1ClientCalldataTxListIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientCalldataTxList) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientCalldataTxList) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1ClientCalldataTxListIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientCalldataTxListIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientCalldataTxList represents a CalldataTxList event raised by the TaikoL1Client contract. +type TaikoL1ClientCalldataTxList struct { + BlockId *big.Int + TxList []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCalldataTxList is a free log retrieval operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterCalldataTxList(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientCalldataTxListIterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "CalldataTxList", blockIdRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientCalldataTxListIterator{contract: _TaikoL1Client.contract, event: "CalldataTxList", logs: logs, sub: sub}, nil +} + +// WatchCalldataTxList is a free log subscription operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchCalldataTxList(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientCalldataTxList, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockVerified", blockIdRule, proverRule) + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "CalldataTxList", blockIdRule) if err != nil { return nil, err } @@ -1875,8 +3821,8 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerified(opts *bind.Watch select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1ClientBlockVerified) - if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerified", log); err != nil { + event := new(TaikoL1ClientCalldataTxList) + if err := _TaikoL1Client.contract.UnpackLog(event, "CalldataTxList", log); err != nil { return err } event.Raw = log @@ -1897,21 +3843,21 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerified(opts *bind.Watch }), nil } -// ParseBlockVerified is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// ParseCalldataTxList is a log parse operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockVerified(log types.Log) (*TaikoL1ClientBlockVerified, error) { - event := new(TaikoL1ClientBlockVerified) - if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerified", log); err != nil { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseCalldataTxList(log types.Log) (*TaikoL1ClientCalldataTxList, error) { + event := new(TaikoL1ClientCalldataTxList) + if err := _TaikoL1Client.contract.UnpackLog(event, "CalldataTxList", log); err != nil { return nil, err } event.Raw = log return event, nil } -// TaikoL1ClientBlockVerified0Iterator is returned from FilterBlockVerified0 and is used to iterate over the raw logs and unpacked data for BlockVerified0 events raised by the TaikoL1Client contract. -type TaikoL1ClientBlockVerified0Iterator struct { - Event *TaikoL1ClientBlockVerified0 // Event containing the contract specifics and raw log +// TaikoL1ClientCalldataTxList0Iterator is returned from FilterCalldataTxList0 and is used to iterate over the raw logs and unpacked data for CalldataTxList0 events raised by the TaikoL1Client contract. +type TaikoL1ClientCalldataTxList0Iterator struct { + Event *TaikoL1ClientCalldataTxList0 // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1925,7 +3871,7 @@ type TaikoL1ClientBlockVerified0Iterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *TaikoL1ClientBlockVerified0Iterator) Next() bool { +func (it *TaikoL1ClientCalldataTxList0Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1934,7 +3880,7 @@ func (it *TaikoL1ClientBlockVerified0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1ClientBlockVerified0) + it.Event = new(TaikoL1ClientCalldataTxList0) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1949,7 +3895,7 @@ func (it *TaikoL1ClientBlockVerified0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1ClientBlockVerified0) + it.Event = new(TaikoL1ClientCalldataTxList0) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1965,63 +3911,52 @@ func (it *TaikoL1ClientBlockVerified0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1ClientBlockVerified0Iterator) Error() error { +func (it *TaikoL1ClientCalldataTxList0Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1ClientBlockVerified0Iterator) Close() error { +func (it *TaikoL1ClientCalldataTxList0Iterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1ClientBlockVerified0 represents a BlockVerified0 event raised by the TaikoL1Client contract. -type TaikoL1ClientBlockVerified0 struct { - BlockId *big.Int - Prover common.Address - BlockHash [32]byte - StateRoot [32]byte - Tier uint16 - Raw types.Log // Blockchain specific contextual infos +// TaikoL1ClientCalldataTxList0 represents a CalldataTxList0 event raised by the TaikoL1Client contract. +type TaikoL1ClientCalldataTxList0 struct { + BlockId *big.Int + TxList []byte + Raw types.Log // Blockchain specific contextual infos } -// FilterBlockVerified0 is a free log retrieval operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// FilterCalldataTxList0 is a free log retrieval operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBlockVerified0(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1ClientBlockVerified0Iterator, error) { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterCalldataTxList0(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientCalldataTxList0Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BlockVerified0", blockIdRule, proverRule) + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "CalldataTxList0", blockIdRule) if err != nil { return nil, err } - return &TaikoL1ClientBlockVerified0Iterator{contract: _TaikoL1Client.contract, event: "BlockVerified0", logs: logs, sub: sub}, nil + return &TaikoL1ClientCalldataTxList0Iterator{contract: _TaikoL1Client.contract, event: "CalldataTxList0", logs: logs, sub: sub}, nil } -// WatchBlockVerified0 is a free log subscription operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// WatchCalldataTxList0 is a free log subscription operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerified0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBlockVerified0, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchCalldataTxList0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientCalldataTxList0, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockVerified0", blockIdRule, proverRule) + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "CalldataTxList0", blockIdRule) if err != nil { return nil, err } @@ -2031,8 +3966,8 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerified0(opts *bind.Watc select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1ClientBlockVerified0) - if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerified0", log); err != nil { + event := new(TaikoL1ClientCalldataTxList0) + if err := _TaikoL1Client.contract.UnpackLog(event, "CalldataTxList0", log); err != nil { return err } event.Raw = log @@ -2053,12 +3988,12 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerified0(opts *bind.Watc }), nil } -// ParseBlockVerified0 is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// ParseCalldataTxList0 is a log parse operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockVerified0(log types.Log) (*TaikoL1ClientBlockVerified0, error) { - event := new(TaikoL1ClientBlockVerified0) - if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerified0", log); err != nil { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseCalldataTxList0(log types.Log) (*TaikoL1ClientCalldataTxList0, error) { + event := new(TaikoL1ClientCalldataTxList0) + if err := _TaikoL1Client.contract.UnpackLog(event, "CalldataTxList0", log); err != nil { return nil, err } event.Raw = log @@ -2773,140 +4708,6 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) ParseProvingPaused(log types.Log) ( return event, nil } -// TaikoL1ClientProvingPaused0Iterator is returned from FilterProvingPaused0 and is used to iterate over the raw logs and unpacked data for ProvingPaused0 events raised by the TaikoL1Client contract. -type TaikoL1ClientProvingPaused0Iterator struct { - Event *TaikoL1ClientProvingPaused0 // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *TaikoL1ClientProvingPaused0Iterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(TaikoL1ClientProvingPaused0) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(TaikoL1ClientProvingPaused0) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1ClientProvingPaused0Iterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *TaikoL1ClientProvingPaused0Iterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// TaikoL1ClientProvingPaused0 represents a ProvingPaused0 event raised by the TaikoL1Client contract. -type TaikoL1ClientProvingPaused0 struct { - Paused bool - Raw types.Log // Blockchain specific contextual infos -} - -// FilterProvingPaused0 is a free log retrieval operation binding the contract event 0xed64db85835d07c3c990b8ebdd55e32d64e5ed53143b6ef2179e7bfaf17ddc3b. -// -// Solidity: event ProvingPaused(bool paused) -func (_TaikoL1Client *TaikoL1ClientFilterer) FilterProvingPaused0(opts *bind.FilterOpts) (*TaikoL1ClientProvingPaused0Iterator, error) { - - logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "ProvingPaused0") - if err != nil { - return nil, err - } - return &TaikoL1ClientProvingPaused0Iterator{contract: _TaikoL1Client.contract, event: "ProvingPaused0", logs: logs, sub: sub}, nil -} - -// WatchProvingPaused0 is a free log subscription operation binding the contract event 0xed64db85835d07c3c990b8ebdd55e32d64e5ed53143b6ef2179e7bfaf17ddc3b. -// -// Solidity: event ProvingPaused(bool paused) -func (_TaikoL1Client *TaikoL1ClientFilterer) WatchProvingPaused0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientProvingPaused0) (event.Subscription, error) { - - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "ProvingPaused0") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(TaikoL1ClientProvingPaused0) - if err := _TaikoL1Client.contract.UnpackLog(event, "ProvingPaused0", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseProvingPaused0 is a log parse operation binding the contract event 0xed64db85835d07c3c990b8ebdd55e32d64e5ed53143b6ef2179e7bfaf17ddc3b. -// -// Solidity: event ProvingPaused(bool paused) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseProvingPaused0(log types.Log) (*TaikoL1ClientProvingPaused0, error) { - event := new(TaikoL1ClientProvingPaused0) - if err := _TaikoL1Client.contract.UnpackLog(event, "ProvingPaused0", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // TaikoL1ClientStateVariablesUpdatedIterator is returned from FilterStateVariablesUpdated and is used to iterate over the raw logs and unpacked data for StateVariablesUpdated events raised by the TaikoL1Client contract. type TaikoL1ClientStateVariablesUpdatedIterator struct { Event *TaikoL1ClientStateVariablesUpdated // Event containing the contract specifics and raw log @@ -2980,9 +4781,9 @@ type TaikoL1ClientStateVariablesUpdated struct { Raw types.Log // Blockchain specific contextual infos } -// FilterStateVariablesUpdated is a free log retrieval operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. +// FilterStateVariablesUpdated is a free log retrieval operation binding the contract event 0xb4be1a16d35fdd62eeaf9f552e025df3639847ddf2d61f011c72565056785ad2. // -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint56,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientFilterer) FilterStateVariablesUpdated(opts *bind.FilterOpts) (*TaikoL1ClientStateVariablesUpdatedIterator, error) { logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "StateVariablesUpdated") @@ -2992,9 +4793,9 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) FilterStateVariablesUpdated(opts *b return &TaikoL1ClientStateVariablesUpdatedIterator{contract: _TaikoL1Client.contract, event: "StateVariablesUpdated", logs: logs, sub: sub}, nil } -// WatchStateVariablesUpdated is a free log subscription operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. +// WatchStateVariablesUpdated is a free log subscription operation binding the contract event 0xb4be1a16d35fdd62eeaf9f552e025df3639847ddf2d61f011c72565056785ad2. // -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint56,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientFilterer) WatchStateVariablesUpdated(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientStateVariablesUpdated) (event.Subscription, error) { logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "StateVariablesUpdated") @@ -3029,9 +4830,9 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchStateVariablesUpdated(opts *bi }), nil } -// ParseStateVariablesUpdated is a log parse operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. +// ParseStateVariablesUpdated is a log parse operation binding the contract event 0xb4be1a16d35fdd62eeaf9f552e025df3639847ddf2d61f011c72565056785ad2. // -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint56,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientFilterer) ParseStateVariablesUpdated(log types.Log) (*TaikoL1ClientStateVariablesUpdated, error) { event := new(TaikoL1ClientStateVariablesUpdated) if err := _TaikoL1Client.contract.UnpackLog(event, "StateVariablesUpdated", log); err != nil { @@ -3041,140 +4842,6 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) ParseStateVariablesUpdated(log type return event, nil } -// TaikoL1ClientStateVariablesUpdated0Iterator is returned from FilterStateVariablesUpdated0 and is used to iterate over the raw logs and unpacked data for StateVariablesUpdated0 events raised by the TaikoL1Client contract. -type TaikoL1ClientStateVariablesUpdated0Iterator struct { - Event *TaikoL1ClientStateVariablesUpdated0 // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *TaikoL1ClientStateVariablesUpdated0Iterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(TaikoL1ClientStateVariablesUpdated0) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(TaikoL1ClientStateVariablesUpdated0) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1ClientStateVariablesUpdated0Iterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *TaikoL1ClientStateVariablesUpdated0Iterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// TaikoL1ClientStateVariablesUpdated0 represents a StateVariablesUpdated0 event raised by the TaikoL1Client contract. -type TaikoL1ClientStateVariablesUpdated0 struct { - SlotB TaikoDataSlotB - Raw types.Log // Blockchain specific contextual infos -} - -// FilterStateVariablesUpdated0 is a free log retrieval operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1Client *TaikoL1ClientFilterer) FilterStateVariablesUpdated0(opts *bind.FilterOpts) (*TaikoL1ClientStateVariablesUpdated0Iterator, error) { - - logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "StateVariablesUpdated0") - if err != nil { - return nil, err - } - return &TaikoL1ClientStateVariablesUpdated0Iterator{contract: _TaikoL1Client.contract, event: "StateVariablesUpdated0", logs: logs, sub: sub}, nil -} - -// WatchStateVariablesUpdated0 is a free log subscription operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1Client *TaikoL1ClientFilterer) WatchStateVariablesUpdated0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientStateVariablesUpdated0) (event.Subscription, error) { - - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "StateVariablesUpdated0") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(TaikoL1ClientStateVariablesUpdated0) - if err := _TaikoL1Client.contract.UnpackLog(event, "StateVariablesUpdated0", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseStateVariablesUpdated0 is a log parse operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseStateVariablesUpdated0(log types.Log) (*TaikoL1ClientStateVariablesUpdated0, error) { - event := new(TaikoL1ClientStateVariablesUpdated0) - if err := _TaikoL1Client.contract.UnpackLog(event, "StateVariablesUpdated0", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // TaikoL1ClientTransitionContestedIterator is returned from FilterTransitionContested and is used to iterate over the raw logs and unpacked data for TransitionContested events raised by the TaikoL1Client contract. type TaikoL1ClientTransitionContestedIterator struct { Event *TaikoL1ClientTransitionContested // Event containing the contract specifics and raw log @@ -3323,9 +4990,9 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) ParseTransitionContested(log types. return event, nil } -// TaikoL1ClientTransitionContested0Iterator is returned from FilterTransitionContested0 and is used to iterate over the raw logs and unpacked data for TransitionContested0 events raised by the TaikoL1Client contract. -type TaikoL1ClientTransitionContested0Iterator struct { - Event *TaikoL1ClientTransitionContested0 // Event containing the contract specifics and raw log +// TaikoL1ClientTransitionContestedV2Iterator is returned from FilterTransitionContestedV2 and is used to iterate over the raw logs and unpacked data for TransitionContestedV2 events raised by the TaikoL1Client contract. +type TaikoL1ClientTransitionContestedV2Iterator struct { + Event *TaikoL1ClientTransitionContestedV2 // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -3339,7 +5006,7 @@ type TaikoL1ClientTransitionContested0Iterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *TaikoL1ClientTransitionContested0Iterator) Next() bool { +func (it *TaikoL1ClientTransitionContestedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3348,7 +5015,7 @@ func (it *TaikoL1ClientTransitionContested0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1ClientTransitionContested0) + it.Event = new(TaikoL1ClientTransitionContestedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3363,7 +5030,7 @@ func (it *TaikoL1ClientTransitionContested0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1ClientTransitionContested0) + it.Event = new(TaikoL1ClientTransitionContestedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3379,55 +5046,56 @@ func (it *TaikoL1ClientTransitionContested0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1ClientTransitionContested0Iterator) Error() error { +func (it *TaikoL1ClientTransitionContestedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1ClientTransitionContested0Iterator) Close() error { +func (it *TaikoL1ClientTransitionContestedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1ClientTransitionContested0 represents a TransitionContested0 event raised by the TaikoL1Client contract. -type TaikoL1ClientTransitionContested0 struct { +// TaikoL1ClientTransitionContestedV2 represents a TransitionContestedV2 event raised by the TaikoL1Client contract. +type TaikoL1ClientTransitionContestedV2 struct { BlockId *big.Int Tran TaikoDataTransition Contester common.Address ContestBond *big.Int Tier uint16 + ProposedIn uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterTransitionContested0 is a free log retrieval operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// FilterTransitionContestedV2 is a free log retrieval operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) FilterTransitionContested0(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientTransitionContested0Iterator, error) { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterTransitionContestedV2(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientTransitionContestedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "TransitionContested0", blockIdRule) + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "TransitionContestedV2", blockIdRule) if err != nil { return nil, err } - return &TaikoL1ClientTransitionContested0Iterator{contract: _TaikoL1Client.contract, event: "TransitionContested0", logs: logs, sub: sub}, nil + return &TaikoL1ClientTransitionContestedV2Iterator{contract: _TaikoL1Client.contract, event: "TransitionContestedV2", logs: logs, sub: sub}, nil } -// WatchTransitionContested0 is a free log subscription operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// WatchTransitionContestedV2 is a free log subscription operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionContested0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientTransitionContested0, blockId []*big.Int) (event.Subscription, error) { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionContestedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientTransitionContestedV2, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "TransitionContested0", blockIdRule) + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "TransitionContestedV2", blockIdRule) if err != nil { return nil, err } @@ -3437,8 +5105,8 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionContested0(opts *bin select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1ClientTransitionContested0) - if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionContested0", log); err != nil { + event := new(TaikoL1ClientTransitionContestedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionContestedV2", log); err != nil { return err } event.Raw = log @@ -3459,12 +5127,12 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionContested0(opts *bin }), nil } -// ParseTransitionContested0 is a log parse operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// ParseTransitionContestedV2 is a log parse operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseTransitionContested0(log types.Log) (*TaikoL1ClientTransitionContested0, error) { - event := new(TaikoL1ClientTransitionContested0) - if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionContested0", log); err != nil { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseTransitionContestedV2(log types.Log) (*TaikoL1ClientTransitionContestedV2, error) { + event := new(TaikoL1ClientTransitionContestedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionContestedV2", log); err != nil { return nil, err } event.Raw = log @@ -3619,9 +5287,9 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) ParseTransitionProved(log types.Log return event, nil } -// TaikoL1ClientTransitionProved0Iterator is returned from FilterTransitionProved0 and is used to iterate over the raw logs and unpacked data for TransitionProved0 events raised by the TaikoL1Client contract. -type TaikoL1ClientTransitionProved0Iterator struct { - Event *TaikoL1ClientTransitionProved0 // Event containing the contract specifics and raw log +// TaikoL1ClientTransitionProvedV2Iterator is returned from FilterTransitionProvedV2 and is used to iterate over the raw logs and unpacked data for TransitionProvedV2 events raised by the TaikoL1Client contract. +type TaikoL1ClientTransitionProvedV2Iterator struct { + Event *TaikoL1ClientTransitionProvedV2 // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -3635,7 +5303,7 @@ type TaikoL1ClientTransitionProved0Iterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *TaikoL1ClientTransitionProved0Iterator) Next() bool { +func (it *TaikoL1ClientTransitionProvedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3644,7 +5312,7 @@ func (it *TaikoL1ClientTransitionProved0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1ClientTransitionProved0) + it.Event = new(TaikoL1ClientTransitionProvedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3659,7 +5327,7 @@ func (it *TaikoL1ClientTransitionProved0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1ClientTransitionProved0) + it.Event = new(TaikoL1ClientTransitionProvedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3675,55 +5343,56 @@ func (it *TaikoL1ClientTransitionProved0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1ClientTransitionProved0Iterator) Error() error { +func (it *TaikoL1ClientTransitionProvedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1ClientTransitionProved0Iterator) Close() error { +func (it *TaikoL1ClientTransitionProvedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1ClientTransitionProved0 represents a TransitionProved0 event raised by the TaikoL1Client contract. -type TaikoL1ClientTransitionProved0 struct { +// TaikoL1ClientTransitionProvedV2 represents a TransitionProvedV2 event raised by the TaikoL1Client contract. +type TaikoL1ClientTransitionProvedV2 struct { BlockId *big.Int Tran TaikoDataTransition Prover common.Address ValidityBond *big.Int Tier uint16 + ProposedIn uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterTransitionProved0 is a free log retrieval operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// FilterTransitionProvedV2 is a free log retrieval operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) FilterTransitionProved0(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientTransitionProved0Iterator, error) { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterTransitionProvedV2(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientTransitionProvedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "TransitionProved0", blockIdRule) + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "TransitionProvedV2", blockIdRule) if err != nil { return nil, err } - return &TaikoL1ClientTransitionProved0Iterator{contract: _TaikoL1Client.contract, event: "TransitionProved0", logs: logs, sub: sub}, nil + return &TaikoL1ClientTransitionProvedV2Iterator{contract: _TaikoL1Client.contract, event: "TransitionProvedV2", logs: logs, sub: sub}, nil } -// WatchTransitionProved0 is a free log subscription operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// WatchTransitionProvedV2 is a free log subscription operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionProved0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientTransitionProved0, blockId []*big.Int) (event.Subscription, error) { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionProvedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientTransitionProvedV2, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "TransitionProved0", blockIdRule) + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "TransitionProvedV2", blockIdRule) if err != nil { return nil, err } @@ -3733,8 +5402,8 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionProved0(opts *bind.W select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1ClientTransitionProved0) - if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionProved0", log); err != nil { + event := new(TaikoL1ClientTransitionProvedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionProvedV2", log); err != nil { return err } event.Raw = log @@ -3755,12 +5424,12 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionProved0(opts *bind.W }), nil } -// ParseTransitionProved0 is a log parse operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// ParseTransitionProvedV2 is a log parse operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseTransitionProved0(log types.Log) (*TaikoL1ClientTransitionProved0, error) { - event := new(TaikoL1ClientTransitionProved0) - if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionProved0", log); err != nil { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseTransitionProvedV2(log types.Log) (*TaikoL1ClientTransitionProvedV2, error) { + event := new(TaikoL1ClientTransitionProvedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionProvedV2", log); err != nil { return nil, err } event.Raw = log diff --git a/packages/taiko-client/bindings/gen_taiko_l2.go b/packages/taiko-client/bindings/gen_taiko_l2.go index 677a2bbe24c..9a40b4c2830 100644 --- a/packages/taiko-client/bindings/gen_taiko_l2.go +++ b/packages/taiko-client/bindings/gen_taiko_l2.go @@ -29,15 +29,9 @@ var ( _ = abi.ConvertType ) -// LibL2ConfigConfig is an auto generated low-level Go binding around an user-defined struct. -type LibL2ConfigConfig struct { - GasTargetPerL1Block uint32 - BasefeeAdjustmentQuotient uint8 -} - // TaikoL2ClientMetaData contains all meta data concerning the TaikoL2Client contract. var TaikoL2ClientMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"GOLDEN_TOUCH_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"anchor\",\"inputs\":[{\"name\":\"_l1BlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1StateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1BlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"gasExcess\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBasefee\",\"inputs\":[{\"name\":\"_l1BlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"basefee_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasExcess_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockHash\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structLibL2Config.Config\",\"components\":[{\"name\":\"gasTargetPerL1Block\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"basefeeAdjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_l1ChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_gasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l1ChainId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l2Hashes\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastSyncedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"publicInputHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"skipFeeCheck\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Anchored\",\"inputs\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"gasExcess\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"EIP1559_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_BASEFEE_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_L1_CHAIN_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_L2_CHAIN_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_SENDER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_PUBLIC_INPUT_HASH_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Overflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"GOLDEN_TOUCH_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"adjustExcess\",\"inputs\":[{\"name\":\"_currGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_currGasTarget\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_newGasTarget\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"newGasExcess_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"anchor\",\"inputs\":[{\"name\":\"_l1BlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1StateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1BlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"anchorV2\",\"inputs\":[{\"name\":\"_anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_anchorStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateBaseFee\",\"inputs\":[{\"name\":\"_baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"_blocktime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"basefee_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"parentGasExcess_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getBasefee\",\"inputs\":[{\"name\":\"_anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"basefee_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"parentGasExcess_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getBasefeeV2\",\"inputs\":[{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_blockTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"basefee_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newGasTarget_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newGasExcess_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockHash\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_l1ChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_initialGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l1ChainId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastSyncedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ontakeForkHeight\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"parentGasExcess\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"parentGasTarget\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"parentTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"publicInputHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"skipFeeCheck\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Anchored\",\"inputs\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"parentGasExcess\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP1559Update\",\"inputs\":[{\"name\":\"oldGasTarget\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newGasTarget\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"oldGasExcess\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newGasExcess\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"basefee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_BASEFEE_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_DEPRECATED_METHOD\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_FORK_ERROR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_L1_CHAIN_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_L2_CHAIN_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_SENDER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_PUBLIC_INPUT_HASH_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // TaikoL2ClientABI is the input ABI used to generate the binding from. @@ -248,12 +242,12 @@ func (_TaikoL2Client *TaikoL2ClientCallerSession) AddressManager() (common.Addre return _TaikoL2Client.Contract.AddressManager(&_TaikoL2Client.CallOpts) } -// GasExcess is a free data retrieval call binding the contract method 0xf535bd56. +// AdjustExcess is a free data retrieval call binding the contract method 0x136dc4a8. // -// Solidity: function gasExcess() view returns(uint64) -func (_TaikoL2Client *TaikoL2ClientCaller) GasExcess(opts *bind.CallOpts) (uint64, error) { +// Solidity: function adjustExcess(uint64 _currGasExcess, uint64 _currGasTarget, uint64 _newGasTarget) pure returns(uint64 newGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCaller) AdjustExcess(opts *bind.CallOpts, _currGasExcess uint64, _currGasTarget uint64, _newGasTarget uint64) (uint64, error) { var out []interface{} - err := _TaikoL2Client.contract.Call(opts, &out, "gasExcess") + err := _TaikoL2Client.contract.Call(opts, &out, "adjustExcess", _currGasExcess, _currGasTarget, _newGasTarget) if err != nil { return *new(uint64), err @@ -265,40 +259,85 @@ func (_TaikoL2Client *TaikoL2ClientCaller) GasExcess(opts *bind.CallOpts) (uint6 } -// GasExcess is a free data retrieval call binding the contract method 0xf535bd56. +// AdjustExcess is a free data retrieval call binding the contract method 0x136dc4a8. +// +// Solidity: function adjustExcess(uint64 _currGasExcess, uint64 _currGasTarget, uint64 _newGasTarget) pure returns(uint64 newGasExcess_) +func (_TaikoL2Client *TaikoL2ClientSession) AdjustExcess(_currGasExcess uint64, _currGasTarget uint64, _newGasTarget uint64) (uint64, error) { + return _TaikoL2Client.Contract.AdjustExcess(&_TaikoL2Client.CallOpts, _currGasExcess, _currGasTarget, _newGasTarget) +} + +// AdjustExcess is a free data retrieval call binding the contract method 0x136dc4a8. +// +// Solidity: function adjustExcess(uint64 _currGasExcess, uint64 _currGasTarget, uint64 _newGasTarget) pure returns(uint64 newGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCallerSession) AdjustExcess(_currGasExcess uint64, _currGasTarget uint64, _newGasTarget uint64) (uint64, error) { + return _TaikoL2Client.Contract.AdjustExcess(&_TaikoL2Client.CallOpts, _currGasExcess, _currGasTarget, _newGasTarget) +} + +// CalculateBaseFee is a free data retrieval call binding the contract method 0xe902461a. +// +// Solidity: function calculateBaseFee((uint8,uint8,uint32,uint64,uint32) _baseFeeConfig, uint64 _blocktime, uint64 _parentGasExcess, uint32 _parentGasUsed) pure returns(uint256 basefee_, uint64 parentGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCaller) CalculateBaseFee(opts *bind.CallOpts, _baseFeeConfig LibSharedDataBaseFeeConfig, _blocktime uint64, _parentGasExcess uint64, _parentGasUsed uint32) (struct { + Basefee *big.Int + ParentGasExcess uint64 +}, error) { + var out []interface{} + err := _TaikoL2Client.contract.Call(opts, &out, "calculateBaseFee", _baseFeeConfig, _blocktime, _parentGasExcess, _parentGasUsed) + + outstruct := new(struct { + Basefee *big.Int + ParentGasExcess uint64 + }) + if err != nil { + return *outstruct, err + } + + outstruct.Basefee = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + outstruct.ParentGasExcess = *abi.ConvertType(out[1], new(uint64)).(*uint64) + + return *outstruct, err + +} + +// CalculateBaseFee is a free data retrieval call binding the contract method 0xe902461a. // -// Solidity: function gasExcess() view returns(uint64) -func (_TaikoL2Client *TaikoL2ClientSession) GasExcess() (uint64, error) { - return _TaikoL2Client.Contract.GasExcess(&_TaikoL2Client.CallOpts) +// Solidity: function calculateBaseFee((uint8,uint8,uint32,uint64,uint32) _baseFeeConfig, uint64 _blocktime, uint64 _parentGasExcess, uint32 _parentGasUsed) pure returns(uint256 basefee_, uint64 parentGasExcess_) +func (_TaikoL2Client *TaikoL2ClientSession) CalculateBaseFee(_baseFeeConfig LibSharedDataBaseFeeConfig, _blocktime uint64, _parentGasExcess uint64, _parentGasUsed uint32) (struct { + Basefee *big.Int + ParentGasExcess uint64 +}, error) { + return _TaikoL2Client.Contract.CalculateBaseFee(&_TaikoL2Client.CallOpts, _baseFeeConfig, _blocktime, _parentGasExcess, _parentGasUsed) } -// GasExcess is a free data retrieval call binding the contract method 0xf535bd56. +// CalculateBaseFee is a free data retrieval call binding the contract method 0xe902461a. // -// Solidity: function gasExcess() view returns(uint64) -func (_TaikoL2Client *TaikoL2ClientCallerSession) GasExcess() (uint64, error) { - return _TaikoL2Client.Contract.GasExcess(&_TaikoL2Client.CallOpts) +// Solidity: function calculateBaseFee((uint8,uint8,uint32,uint64,uint32) _baseFeeConfig, uint64 _blocktime, uint64 _parentGasExcess, uint32 _parentGasUsed) pure returns(uint256 basefee_, uint64 parentGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCallerSession) CalculateBaseFee(_baseFeeConfig LibSharedDataBaseFeeConfig, _blocktime uint64, _parentGasExcess uint64, _parentGasUsed uint32) (struct { + Basefee *big.Int + ParentGasExcess uint64 +}, error) { + return _TaikoL2Client.Contract.CalculateBaseFee(&_TaikoL2Client.CallOpts, _baseFeeConfig, _blocktime, _parentGasExcess, _parentGasUsed) } // GetBasefee is a free data retrieval call binding the contract method 0xa7e022d1. // -// Solidity: function getBasefee(uint64 _l1BlockId, uint32 _parentGasUsed) view returns(uint256 basefee_, uint64 gasExcess_) -func (_TaikoL2Client *TaikoL2ClientCaller) GetBasefee(opts *bind.CallOpts, _l1BlockId uint64, _parentGasUsed uint32) (struct { - Basefee *big.Int - GasExcess uint64 +// Solidity: function getBasefee(uint64 _anchorBlockId, uint32 _parentGasUsed) pure returns(uint256 basefee_, uint64 parentGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCaller) GetBasefee(opts *bind.CallOpts, _anchorBlockId uint64, _parentGasUsed uint32) (struct { + Basefee *big.Int + ParentGasExcess uint64 }, error) { var out []interface{} - err := _TaikoL2Client.contract.Call(opts, &out, "getBasefee", _l1BlockId, _parentGasUsed) + err := _TaikoL2Client.contract.Call(opts, &out, "getBasefee", _anchorBlockId, _parentGasUsed) outstruct := new(struct { - Basefee *big.Int - GasExcess uint64 + Basefee *big.Int + ParentGasExcess uint64 }) if err != nil { return *outstruct, err } outstruct.Basefee = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - outstruct.GasExcess = *abi.ConvertType(out[1], new(uint64)).(*uint64) + outstruct.ParentGasExcess = *abi.ConvertType(out[1], new(uint64)).(*uint64) return *outstruct, err @@ -306,84 +345,103 @@ func (_TaikoL2Client *TaikoL2ClientCaller) GetBasefee(opts *bind.CallOpts, _l1Bl // GetBasefee is a free data retrieval call binding the contract method 0xa7e022d1. // -// Solidity: function getBasefee(uint64 _l1BlockId, uint32 _parentGasUsed) view returns(uint256 basefee_, uint64 gasExcess_) -func (_TaikoL2Client *TaikoL2ClientSession) GetBasefee(_l1BlockId uint64, _parentGasUsed uint32) (struct { - Basefee *big.Int - GasExcess uint64 +// Solidity: function getBasefee(uint64 _anchorBlockId, uint32 _parentGasUsed) pure returns(uint256 basefee_, uint64 parentGasExcess_) +func (_TaikoL2Client *TaikoL2ClientSession) GetBasefee(_anchorBlockId uint64, _parentGasUsed uint32) (struct { + Basefee *big.Int + ParentGasExcess uint64 }, error) { - return _TaikoL2Client.Contract.GetBasefee(&_TaikoL2Client.CallOpts, _l1BlockId, _parentGasUsed) + return _TaikoL2Client.Contract.GetBasefee(&_TaikoL2Client.CallOpts, _anchorBlockId, _parentGasUsed) } // GetBasefee is a free data retrieval call binding the contract method 0xa7e022d1. // -// Solidity: function getBasefee(uint64 _l1BlockId, uint32 _parentGasUsed) view returns(uint256 basefee_, uint64 gasExcess_) -func (_TaikoL2Client *TaikoL2ClientCallerSession) GetBasefee(_l1BlockId uint64, _parentGasUsed uint32) (struct { - Basefee *big.Int - GasExcess uint64 +// Solidity: function getBasefee(uint64 _anchorBlockId, uint32 _parentGasUsed) pure returns(uint256 basefee_, uint64 parentGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCallerSession) GetBasefee(_anchorBlockId uint64, _parentGasUsed uint32) (struct { + Basefee *big.Int + ParentGasExcess uint64 }, error) { - return _TaikoL2Client.Contract.GetBasefee(&_TaikoL2Client.CallOpts, _l1BlockId, _parentGasUsed) + return _TaikoL2Client.Contract.GetBasefee(&_TaikoL2Client.CallOpts, _anchorBlockId, _parentGasUsed) } -// GetBlockHash is a free data retrieval call binding the contract method 0x23ac7136. +// GetBasefeeV2 is a free data retrieval call binding the contract method 0x893f5460. // -// Solidity: function getBlockHash(uint64 _blockId) view returns(bytes32) -func (_TaikoL2Client *TaikoL2ClientCaller) GetBlockHash(opts *bind.CallOpts, _blockId uint64) ([32]byte, error) { +// Solidity: function getBasefeeV2(uint32 _parentGasUsed, uint64 _blockTimestamp, (uint8,uint8,uint32,uint64,uint32) _baseFeeConfig) view returns(uint256 basefee_, uint64 newGasTarget_, uint64 newGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCaller) GetBasefeeV2(opts *bind.CallOpts, _parentGasUsed uint32, _blockTimestamp uint64, _baseFeeConfig LibSharedDataBaseFeeConfig) (struct { + Basefee *big.Int + NewGasTarget uint64 + NewGasExcess uint64 +}, error) { var out []interface{} - err := _TaikoL2Client.contract.Call(opts, &out, "getBlockHash", _blockId) + err := _TaikoL2Client.contract.Call(opts, &out, "getBasefeeV2", _parentGasUsed, _blockTimestamp, _baseFeeConfig) + outstruct := new(struct { + Basefee *big.Int + NewGasTarget uint64 + NewGasExcess uint64 + }) if err != nil { - return *new([32]byte), err + return *outstruct, err } - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + outstruct.Basefee = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + outstruct.NewGasTarget = *abi.ConvertType(out[1], new(uint64)).(*uint64) + outstruct.NewGasExcess = *abi.ConvertType(out[2], new(uint64)).(*uint64) - return out0, err + return *outstruct, err } -// GetBlockHash is a free data retrieval call binding the contract method 0x23ac7136. +// GetBasefeeV2 is a free data retrieval call binding the contract method 0x893f5460. // -// Solidity: function getBlockHash(uint64 _blockId) view returns(bytes32) -func (_TaikoL2Client *TaikoL2ClientSession) GetBlockHash(_blockId uint64) ([32]byte, error) { - return _TaikoL2Client.Contract.GetBlockHash(&_TaikoL2Client.CallOpts, _blockId) +// Solidity: function getBasefeeV2(uint32 _parentGasUsed, uint64 _blockTimestamp, (uint8,uint8,uint32,uint64,uint32) _baseFeeConfig) view returns(uint256 basefee_, uint64 newGasTarget_, uint64 newGasExcess_) +func (_TaikoL2Client *TaikoL2ClientSession) GetBasefeeV2(_parentGasUsed uint32, _blockTimestamp uint64, _baseFeeConfig LibSharedDataBaseFeeConfig) (struct { + Basefee *big.Int + NewGasTarget uint64 + NewGasExcess uint64 +}, error) { + return _TaikoL2Client.Contract.GetBasefeeV2(&_TaikoL2Client.CallOpts, _parentGasUsed, _blockTimestamp, _baseFeeConfig) } -// GetBlockHash is a free data retrieval call binding the contract method 0x23ac7136. +// GetBasefeeV2 is a free data retrieval call binding the contract method 0x893f5460. // -// Solidity: function getBlockHash(uint64 _blockId) view returns(bytes32) -func (_TaikoL2Client *TaikoL2ClientCallerSession) GetBlockHash(_blockId uint64) ([32]byte, error) { - return _TaikoL2Client.Contract.GetBlockHash(&_TaikoL2Client.CallOpts, _blockId) +// Solidity: function getBasefeeV2(uint32 _parentGasUsed, uint64 _blockTimestamp, (uint8,uint8,uint32,uint64,uint32) _baseFeeConfig) view returns(uint256 basefee_, uint64 newGasTarget_, uint64 newGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCallerSession) GetBasefeeV2(_parentGasUsed uint32, _blockTimestamp uint64, _baseFeeConfig LibSharedDataBaseFeeConfig) (struct { + Basefee *big.Int + NewGasTarget uint64 + NewGasExcess uint64 +}, error) { + return _TaikoL2Client.Contract.GetBasefeeV2(&_TaikoL2Client.CallOpts, _parentGasUsed, _blockTimestamp, _baseFeeConfig) } -// GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. +// GetBlockHash is a free data retrieval call binding the contract method 0xee82ac5e. // -// Solidity: function getConfig() view returns((uint32,uint8)) -func (_TaikoL2Client *TaikoL2ClientCaller) GetConfig(opts *bind.CallOpts) (LibL2ConfigConfig, error) { +// Solidity: function getBlockHash(uint256 _blockId) view returns(bytes32) +func (_TaikoL2Client *TaikoL2ClientCaller) GetBlockHash(opts *bind.CallOpts, _blockId *big.Int) ([32]byte, error) { var out []interface{} - err := _TaikoL2Client.contract.Call(opts, &out, "getConfig") + err := _TaikoL2Client.contract.Call(opts, &out, "getBlockHash", _blockId) if err != nil { - return *new(LibL2ConfigConfig), err + return *new([32]byte), err } - out0 := *abi.ConvertType(out[0], new(LibL2ConfigConfig)).(*LibL2ConfigConfig) + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) return out0, err } -// GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. +// GetBlockHash is a free data retrieval call binding the contract method 0xee82ac5e. // -// Solidity: function getConfig() view returns((uint32,uint8)) -func (_TaikoL2Client *TaikoL2ClientSession) GetConfig() (LibL2ConfigConfig, error) { - return _TaikoL2Client.Contract.GetConfig(&_TaikoL2Client.CallOpts) +// Solidity: function getBlockHash(uint256 _blockId) view returns(bytes32) +func (_TaikoL2Client *TaikoL2ClientSession) GetBlockHash(_blockId *big.Int) ([32]byte, error) { + return _TaikoL2Client.Contract.GetBlockHash(&_TaikoL2Client.CallOpts, _blockId) } -// GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. +// GetBlockHash is a free data retrieval call binding the contract method 0xee82ac5e. // -// Solidity: function getConfig() view returns((uint32,uint8)) -func (_TaikoL2Client *TaikoL2ClientCallerSession) GetConfig() (LibL2ConfigConfig, error) { - return _TaikoL2Client.Contract.GetConfig(&_TaikoL2Client.CallOpts) +// Solidity: function getBlockHash(uint256 _blockId) view returns(bytes32) +func (_TaikoL2Client *TaikoL2ClientCallerSession) GetBlockHash(_blockId *big.Int) ([32]byte, error) { + return _TaikoL2Client.Contract.GetBlockHash(&_TaikoL2Client.CallOpts, _blockId) } // Impl is a free data retrieval call binding the contract method 0x8abf6077. @@ -479,37 +537,6 @@ func (_TaikoL2Client *TaikoL2ClientCallerSession) L1ChainId() (uint64, error) { return _TaikoL2Client.Contract.L1ChainId(&_TaikoL2Client.CallOpts) } -// L2Hashes is a free data retrieval call binding the contract method 0x8551f41e. -// -// Solidity: function l2Hashes(uint256 blockId) view returns(bytes32 blockHash) -func (_TaikoL2Client *TaikoL2ClientCaller) L2Hashes(opts *bind.CallOpts, blockId *big.Int) ([32]byte, error) { - var out []interface{} - err := _TaikoL2Client.contract.Call(opts, &out, "l2Hashes", blockId) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// L2Hashes is a free data retrieval call binding the contract method 0x8551f41e. -// -// Solidity: function l2Hashes(uint256 blockId) view returns(bytes32 blockHash) -func (_TaikoL2Client *TaikoL2ClientSession) L2Hashes(blockId *big.Int) ([32]byte, error) { - return _TaikoL2Client.Contract.L2Hashes(&_TaikoL2Client.CallOpts, blockId) -} - -// L2Hashes is a free data retrieval call binding the contract method 0x8551f41e. -// -// Solidity: function l2Hashes(uint256 blockId) view returns(bytes32 blockHash) -func (_TaikoL2Client *TaikoL2ClientCallerSession) L2Hashes(blockId *big.Int) ([32]byte, error) { - return _TaikoL2Client.Contract.L2Hashes(&_TaikoL2Client.CallOpts, blockId) -} - // LastSyncedBlock is a free data retrieval call binding the contract method 0x33d5ac9b. // // Solidity: function lastSyncedBlock() view returns(uint64) @@ -572,6 +599,37 @@ func (_TaikoL2Client *TaikoL2ClientCallerSession) LastUnpausedAt() (uint64, erro return _TaikoL2Client.Contract.LastUnpausedAt(&_TaikoL2Client.CallOpts) } +// OntakeForkHeight is a free data retrieval call binding the contract method 0x356aec04. +// +// Solidity: function ontakeForkHeight() pure returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCaller) OntakeForkHeight(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _TaikoL2Client.contract.Call(opts, &out, "ontakeForkHeight") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// OntakeForkHeight is a free data retrieval call binding the contract method 0x356aec04. +// +// Solidity: function ontakeForkHeight() pure returns(uint64) +func (_TaikoL2Client *TaikoL2ClientSession) OntakeForkHeight() (uint64, error) { + return _TaikoL2Client.Contract.OntakeForkHeight(&_TaikoL2Client.CallOpts) +} + +// OntakeForkHeight is a free data retrieval call binding the contract method 0x356aec04. +// +// Solidity: function ontakeForkHeight() pure returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCallerSession) OntakeForkHeight() (uint64, error) { + return _TaikoL2Client.Contract.OntakeForkHeight(&_TaikoL2Client.CallOpts) +} + // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. // // Solidity: function owner() view returns(address) @@ -603,6 +661,99 @@ func (_TaikoL2Client *TaikoL2ClientCallerSession) Owner() (common.Address, error return _TaikoL2Client.Contract.Owner(&_TaikoL2Client.CallOpts) } +// ParentGasExcess is a free data retrieval call binding the contract method 0xb8c7b30c. +// +// Solidity: function parentGasExcess() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCaller) ParentGasExcess(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _TaikoL2Client.contract.Call(opts, &out, "parentGasExcess") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// ParentGasExcess is a free data retrieval call binding the contract method 0xb8c7b30c. +// +// Solidity: function parentGasExcess() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientSession) ParentGasExcess() (uint64, error) { + return _TaikoL2Client.Contract.ParentGasExcess(&_TaikoL2Client.CallOpts) +} + +// ParentGasExcess is a free data retrieval call binding the contract method 0xb8c7b30c. +// +// Solidity: function parentGasExcess() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCallerSession) ParentGasExcess() (uint64, error) { + return _TaikoL2Client.Contract.ParentGasExcess(&_TaikoL2Client.CallOpts) +} + +// ParentGasTarget is a free data retrieval call binding the contract method 0xa7137c0f. +// +// Solidity: function parentGasTarget() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCaller) ParentGasTarget(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _TaikoL2Client.contract.Call(opts, &out, "parentGasTarget") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// ParentGasTarget is a free data retrieval call binding the contract method 0xa7137c0f. +// +// Solidity: function parentGasTarget() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientSession) ParentGasTarget() (uint64, error) { + return _TaikoL2Client.Contract.ParentGasTarget(&_TaikoL2Client.CallOpts) +} + +// ParentGasTarget is a free data retrieval call binding the contract method 0xa7137c0f. +// +// Solidity: function parentGasTarget() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCallerSession) ParentGasTarget() (uint64, error) { + return _TaikoL2Client.Contract.ParentGasTarget(&_TaikoL2Client.CallOpts) +} + +// ParentTimestamp is a free data retrieval call binding the contract method 0x539b8ade. +// +// Solidity: function parentTimestamp() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCaller) ParentTimestamp(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _TaikoL2Client.contract.Call(opts, &out, "parentTimestamp") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// ParentTimestamp is a free data retrieval call binding the contract method 0x539b8ade. +// +// Solidity: function parentTimestamp() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientSession) ParentTimestamp() (uint64, error) { + return _TaikoL2Client.Contract.ParentTimestamp(&_TaikoL2Client.CallOpts) +} + +// ParentTimestamp is a free data retrieval call binding the contract method 0x539b8ade. +// +// Solidity: function parentTimestamp() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCallerSession) ParentTimestamp() (uint64, error) { + return _TaikoL2Client.Contract.ParentTimestamp(&_TaikoL2Client.CallOpts) +} + // Paused is a free data retrieval call binding the contract method 0x5c975abb. // // Solidity: function paused() view returns(bool) @@ -862,25 +1013,46 @@ func (_TaikoL2Client *TaikoL2ClientTransactorSession) Anchor(_l1BlockHash [32]by return _TaikoL2Client.Contract.Anchor(&_TaikoL2Client.TransactOpts, _l1BlockHash, _l1StateRoot, _l1BlockId, _parentGasUsed) } +// AnchorV2 is a paid mutator transaction binding the contract method 0xfd85eb2d. +// +// Solidity: function anchorV2(uint64 _anchorBlockId, bytes32 _anchorStateRoot, uint32 _parentGasUsed, (uint8,uint8,uint32,uint64,uint32) _baseFeeConfig) returns() +func (_TaikoL2Client *TaikoL2ClientTransactor) AnchorV2(opts *bind.TransactOpts, _anchorBlockId uint64, _anchorStateRoot [32]byte, _parentGasUsed uint32, _baseFeeConfig LibSharedDataBaseFeeConfig) (*types.Transaction, error) { + return _TaikoL2Client.contract.Transact(opts, "anchorV2", _anchorBlockId, _anchorStateRoot, _parentGasUsed, _baseFeeConfig) +} + +// AnchorV2 is a paid mutator transaction binding the contract method 0xfd85eb2d. +// +// Solidity: function anchorV2(uint64 _anchorBlockId, bytes32 _anchorStateRoot, uint32 _parentGasUsed, (uint8,uint8,uint32,uint64,uint32) _baseFeeConfig) returns() +func (_TaikoL2Client *TaikoL2ClientSession) AnchorV2(_anchorBlockId uint64, _anchorStateRoot [32]byte, _parentGasUsed uint32, _baseFeeConfig LibSharedDataBaseFeeConfig) (*types.Transaction, error) { + return _TaikoL2Client.Contract.AnchorV2(&_TaikoL2Client.TransactOpts, _anchorBlockId, _anchorStateRoot, _parentGasUsed, _baseFeeConfig) +} + +// AnchorV2 is a paid mutator transaction binding the contract method 0xfd85eb2d. +// +// Solidity: function anchorV2(uint64 _anchorBlockId, bytes32 _anchorStateRoot, uint32 _parentGasUsed, (uint8,uint8,uint32,uint64,uint32) _baseFeeConfig) returns() +func (_TaikoL2Client *TaikoL2ClientTransactorSession) AnchorV2(_anchorBlockId uint64, _anchorStateRoot [32]byte, _parentGasUsed uint32, _baseFeeConfig LibSharedDataBaseFeeConfig) (*types.Transaction, error) { + return _TaikoL2Client.Contract.AnchorV2(&_TaikoL2Client.TransactOpts, _anchorBlockId, _anchorStateRoot, _parentGasUsed, _baseFeeConfig) +} + // Init is a paid mutator transaction binding the contract method 0x5950f9f1. // -// Solidity: function init(address _owner, address _addressManager, uint64 _l1ChainId, uint64 _gasExcess) returns() -func (_TaikoL2Client *TaikoL2ClientTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address, _l1ChainId uint64, _gasExcess uint64) (*types.Transaction, error) { - return _TaikoL2Client.contract.Transact(opts, "init", _owner, _addressManager, _l1ChainId, _gasExcess) +// Solidity: function init(address _owner, address _rollupAddressManager, uint64 _l1ChainId, uint64 _initialGasExcess) returns() +func (_TaikoL2Client *TaikoL2ClientTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _rollupAddressManager common.Address, _l1ChainId uint64, _initialGasExcess uint64) (*types.Transaction, error) { + return _TaikoL2Client.contract.Transact(opts, "init", _owner, _rollupAddressManager, _l1ChainId, _initialGasExcess) } // Init is a paid mutator transaction binding the contract method 0x5950f9f1. // -// Solidity: function init(address _owner, address _addressManager, uint64 _l1ChainId, uint64 _gasExcess) returns() -func (_TaikoL2Client *TaikoL2ClientSession) Init(_owner common.Address, _addressManager common.Address, _l1ChainId uint64, _gasExcess uint64) (*types.Transaction, error) { - return _TaikoL2Client.Contract.Init(&_TaikoL2Client.TransactOpts, _owner, _addressManager, _l1ChainId, _gasExcess) +// Solidity: function init(address _owner, address _rollupAddressManager, uint64 _l1ChainId, uint64 _initialGasExcess) returns() +func (_TaikoL2Client *TaikoL2ClientSession) Init(_owner common.Address, _rollupAddressManager common.Address, _l1ChainId uint64, _initialGasExcess uint64) (*types.Transaction, error) { + return _TaikoL2Client.Contract.Init(&_TaikoL2Client.TransactOpts, _owner, _rollupAddressManager, _l1ChainId, _initialGasExcess) } // Init is a paid mutator transaction binding the contract method 0x5950f9f1. // -// Solidity: function init(address _owner, address _addressManager, uint64 _l1ChainId, uint64 _gasExcess) returns() -func (_TaikoL2Client *TaikoL2ClientTransactorSession) Init(_owner common.Address, _addressManager common.Address, _l1ChainId uint64, _gasExcess uint64) (*types.Transaction, error) { - return _TaikoL2Client.Contract.Init(&_TaikoL2Client.TransactOpts, _owner, _addressManager, _l1ChainId, _gasExcess) +// Solidity: function init(address _owner, address _rollupAddressManager, uint64 _l1ChainId, uint64 _initialGasExcess) returns() +func (_TaikoL2Client *TaikoL2ClientTransactorSession) Init(_owner common.Address, _rollupAddressManager common.Address, _l1ChainId uint64, _initialGasExcess uint64) (*types.Transaction, error) { + return _TaikoL2Client.Contract.Init(&_TaikoL2Client.TransactOpts, _owner, _rollupAddressManager, _l1ChainId, _initialGasExcess) } // Pause is a paid mutator transaction binding the contract method 0x8456cb59. @@ -1234,14 +1406,14 @@ func (it *TaikoL2ClientAnchoredIterator) Close() error { // TaikoL2ClientAnchored represents a Anchored event raised by the TaikoL2Client contract. type TaikoL2ClientAnchored struct { - ParentHash [32]byte - GasExcess uint64 - Raw types.Log // Blockchain specific contextual infos + ParentHash [32]byte + ParentGasExcess uint64 + Raw types.Log // Blockchain specific contextual infos } // FilterAnchored is a free log retrieval operation binding the contract event 0x41c3f410f5c8ac36bb46b1dccef0de0f964087c9e688795fa02ecfa2c20b3fe4. // -// Solidity: event Anchored(bytes32 parentHash, uint64 gasExcess) +// Solidity: event Anchored(bytes32 parentHash, uint64 parentGasExcess) func (_TaikoL2Client *TaikoL2ClientFilterer) FilterAnchored(opts *bind.FilterOpts) (*TaikoL2ClientAnchoredIterator, error) { logs, sub, err := _TaikoL2Client.contract.FilterLogs(opts, "Anchored") @@ -1253,7 +1425,7 @@ func (_TaikoL2Client *TaikoL2ClientFilterer) FilterAnchored(opts *bind.FilterOpt // WatchAnchored is a free log subscription operation binding the contract event 0x41c3f410f5c8ac36bb46b1dccef0de0f964087c9e688795fa02ecfa2c20b3fe4. // -// Solidity: event Anchored(bytes32 parentHash, uint64 gasExcess) +// Solidity: event Anchored(bytes32 parentHash, uint64 parentGasExcess) func (_TaikoL2Client *TaikoL2ClientFilterer) WatchAnchored(opts *bind.WatchOpts, sink chan<- *TaikoL2ClientAnchored) (event.Subscription, error) { logs, sub, err := _TaikoL2Client.contract.WatchLogs(opts, "Anchored") @@ -1290,7 +1462,7 @@ func (_TaikoL2Client *TaikoL2ClientFilterer) WatchAnchored(opts *bind.WatchOpts, // ParseAnchored is a log parse operation binding the contract event 0x41c3f410f5c8ac36bb46b1dccef0de0f964087c9e688795fa02ecfa2c20b3fe4. // -// Solidity: event Anchored(bytes32 parentHash, uint64 gasExcess) +// Solidity: event Anchored(bytes32 parentHash, uint64 parentGasExcess) func (_TaikoL2Client *TaikoL2ClientFilterer) ParseAnchored(log types.Log) (*TaikoL2ClientAnchored, error) { event := new(TaikoL2ClientAnchored) if err := _TaikoL2Client.contract.UnpackLog(event, "Anchored", log); err != nil { @@ -1444,6 +1616,144 @@ func (_TaikoL2Client *TaikoL2ClientFilterer) ParseBeaconUpgraded(log types.Log) return event, nil } +// TaikoL2ClientEIP1559UpdateIterator is returned from FilterEIP1559Update and is used to iterate over the raw logs and unpacked data for EIP1559Update events raised by the TaikoL2Client contract. +type TaikoL2ClientEIP1559UpdateIterator struct { + Event *TaikoL2ClientEIP1559Update // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL2ClientEIP1559UpdateIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL2ClientEIP1559Update) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL2ClientEIP1559Update) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL2ClientEIP1559UpdateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL2ClientEIP1559UpdateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL2ClientEIP1559Update represents a EIP1559Update event raised by the TaikoL2Client contract. +type TaikoL2ClientEIP1559Update struct { + OldGasTarget uint64 + NewGasTarget uint64 + OldGasExcess uint64 + NewGasExcess uint64 + Basefee *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEIP1559Update is a free log retrieval operation binding the contract event 0x781ae5c2215806150d5c71a4ed5336e5dc3ad32aef04fc0f626a6ee0c2f8d1c8. +// +// Solidity: event EIP1559Update(uint64 oldGasTarget, uint64 newGasTarget, uint64 oldGasExcess, uint64 newGasExcess, uint256 basefee) +func (_TaikoL2Client *TaikoL2ClientFilterer) FilterEIP1559Update(opts *bind.FilterOpts) (*TaikoL2ClientEIP1559UpdateIterator, error) { + + logs, sub, err := _TaikoL2Client.contract.FilterLogs(opts, "EIP1559Update") + if err != nil { + return nil, err + } + return &TaikoL2ClientEIP1559UpdateIterator{contract: _TaikoL2Client.contract, event: "EIP1559Update", logs: logs, sub: sub}, nil +} + +// WatchEIP1559Update is a free log subscription operation binding the contract event 0x781ae5c2215806150d5c71a4ed5336e5dc3ad32aef04fc0f626a6ee0c2f8d1c8. +// +// Solidity: event EIP1559Update(uint64 oldGasTarget, uint64 newGasTarget, uint64 oldGasExcess, uint64 newGasExcess, uint256 basefee) +func (_TaikoL2Client *TaikoL2ClientFilterer) WatchEIP1559Update(opts *bind.WatchOpts, sink chan<- *TaikoL2ClientEIP1559Update) (event.Subscription, error) { + + logs, sub, err := _TaikoL2Client.contract.WatchLogs(opts, "EIP1559Update") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL2ClientEIP1559Update) + if err := _TaikoL2Client.contract.UnpackLog(event, "EIP1559Update", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEIP1559Update is a log parse operation binding the contract event 0x781ae5c2215806150d5c71a4ed5336e5dc3ad32aef04fc0f626a6ee0c2f8d1c8. +// +// Solidity: event EIP1559Update(uint64 oldGasTarget, uint64 newGasTarget, uint64 oldGasExcess, uint64 newGasExcess, uint256 basefee) +func (_TaikoL2Client *TaikoL2ClientFilterer) ParseEIP1559Update(log types.Log) (*TaikoL2ClientEIP1559Update, error) { + event := new(TaikoL2ClientEIP1559Update) + if err := _TaikoL2Client.contract.UnpackLog(event, "EIP1559Update", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // TaikoL2ClientInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the TaikoL2Client contract. type TaikoL2ClientInitializedIterator struct { Event *TaikoL2ClientInitialized // Event containing the contract specifics and raw log diff --git a/packages/taiko-client/bindings/gen_taiko_token.go b/packages/taiko-client/bindings/gen_taiko_token.go index 49f9bc2ae77..8a6387703e3 100644 --- a/packages/taiko-client/bindings/gen_taiko_token.go +++ b/packages/taiko-client/bindings/gen_taiko_token.go @@ -37,7 +37,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // TaikoTokenMetaData contains all meta data concerning the TaikoToken contract. var TaikoTokenMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"batchTransfer\",\"inputs\":[{\"name\":\"recipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // TaikoTokenABI is the input ABI used to generate the binding from. @@ -1104,6 +1104,27 @@ func (_TaikoToken *TaikoTokenTransactorSession) Approve(spender common.Address, return _TaikoToken.Contract.Approve(&_TaikoToken.TransactOpts, spender, amount) } +// BatchTransfer is a paid mutator transaction binding the contract method 0x88d695b2. +// +// Solidity: function batchTransfer(address[] recipients, uint256[] amounts) returns(bool) +func (_TaikoToken *TaikoTokenTransactor) BatchTransfer(opts *bind.TransactOpts, recipients []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _TaikoToken.contract.Transact(opts, "batchTransfer", recipients, amounts) +} + +// BatchTransfer is a paid mutator transaction binding the contract method 0x88d695b2. +// +// Solidity: function batchTransfer(address[] recipients, uint256[] amounts) returns(bool) +func (_TaikoToken *TaikoTokenSession) BatchTransfer(recipients []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _TaikoToken.Contract.BatchTransfer(&_TaikoToken.TransactOpts, recipients, amounts) +} + +// BatchTransfer is a paid mutator transaction binding the contract method 0x88d695b2. +// +// Solidity: function batchTransfer(address[] recipients, uint256[] amounts) returns(bool) +func (_TaikoToken *TaikoTokenTransactorSession) BatchTransfer(recipients []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _TaikoToken.Contract.BatchTransfer(&_TaikoToken.TransactOpts, recipients, amounts) +} + // DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7. // // Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool) diff --git a/packages/taiko-client/bindings/gen_tier_provider.go b/packages/taiko-client/bindings/gen_tier_provider.go index 60f5ef20972..e0449320610 100644 --- a/packages/taiko-client/bindings/gen_tier_provider.go +++ b/packages/taiko-client/bindings/gen_tier_provider.go @@ -41,7 +41,7 @@ type ITierProviderTier struct { // TierProviderMetaData contains all meta data concerning the TierProvider contract. var TierProviderMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"getMinTier\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getProvider\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTier\",\"inputs\":[{\"name\":\"_tierId\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structITierProvider.Tier\",\"components\":[{\"name\":\"verifierName\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"cooldownWindow\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"provingWindow\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxBlocksToVerifyPerProof\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTierIds\",\"inputs\":[],\"outputs\":[{\"name\":\"tiers_\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"stateMutability\":\"pure\"},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_daoFallbackProposer\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BOND_UNIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint96\",\"internalType\":\"uint96\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DAO_FALLBACK_PROPOSER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinTier\",\"inputs\":[{\"name\":\"_proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rand\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProvider\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTier\",\"inputs\":[{\"name\":\"_tierId\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structITierProvider.Tier\",\"components\":[{\"name\":\"verifierName\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"cooldownWindow\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"provingWindow\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxBlocksToVerifyPerProof\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTierIds\",\"inputs\":[],\"outputs\":[{\"name\":\"tiers_\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"stateMutability\":\"pure\"},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]}]", } // TierProviderABI is the input ABI used to generate the binding from. @@ -190,12 +190,74 @@ func (_TierProvider *TierProviderTransactorRaw) Transact(opts *bind.TransactOpts return _TierProvider.Contract.contract.Transact(opts, method, params...) } -// GetMinTier is a free data retrieval call binding the contract method 0x59ab4e23. +// BONDUNIT is a free data retrieval call binding the contract method 0x8165fd26. // -// Solidity: function getMinTier(uint256 ) pure returns(uint16) -func (_TierProvider *TierProviderCaller) GetMinTier(opts *bind.CallOpts, arg0 *big.Int) (uint16, error) { +// Solidity: function BOND_UNIT() view returns(uint96) +func (_TierProvider *TierProviderCaller) BONDUNIT(opts *bind.CallOpts) (*big.Int, error) { var out []interface{} - err := _TierProvider.contract.Call(opts, &out, "getMinTier", arg0) + err := _TierProvider.contract.Call(opts, &out, "BOND_UNIT") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BONDUNIT is a free data retrieval call binding the contract method 0x8165fd26. +// +// Solidity: function BOND_UNIT() view returns(uint96) +func (_TierProvider *TierProviderSession) BONDUNIT() (*big.Int, error) { + return _TierProvider.Contract.BONDUNIT(&_TierProvider.CallOpts) +} + +// BONDUNIT is a free data retrieval call binding the contract method 0x8165fd26. +// +// Solidity: function BOND_UNIT() view returns(uint96) +func (_TierProvider *TierProviderCallerSession) BONDUNIT() (*big.Int, error) { + return _TierProvider.Contract.BONDUNIT(&_TierProvider.CallOpts) +} + +// DAOFALLBACKPROPOSER is a free data retrieval call binding the contract method 0xbf62514d. +// +// Solidity: function DAO_FALLBACK_PROPOSER() view returns(address) +func (_TierProvider *TierProviderCaller) DAOFALLBACKPROPOSER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _TierProvider.contract.Call(opts, &out, "DAO_FALLBACK_PROPOSER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// DAOFALLBACKPROPOSER is a free data retrieval call binding the contract method 0xbf62514d. +// +// Solidity: function DAO_FALLBACK_PROPOSER() view returns(address) +func (_TierProvider *TierProviderSession) DAOFALLBACKPROPOSER() (common.Address, error) { + return _TierProvider.Contract.DAOFALLBACKPROPOSER(&_TierProvider.CallOpts) +} + +// DAOFALLBACKPROPOSER is a free data retrieval call binding the contract method 0xbf62514d. +// +// Solidity: function DAO_FALLBACK_PROPOSER() view returns(address) +func (_TierProvider *TierProviderCallerSession) DAOFALLBACKPROPOSER() (common.Address, error) { + return _TierProvider.Contract.DAOFALLBACKPROPOSER(&_TierProvider.CallOpts) +} + +// GetMinTier is a free data retrieval call binding the contract method 0x52c5c56b. +// +// Solidity: function getMinTier(address _proposer, uint256 _rand) view returns(uint16) +func (_TierProvider *TierProviderCaller) GetMinTier(opts *bind.CallOpts, _proposer common.Address, _rand *big.Int) (uint16, error) { + var out []interface{} + err := _TierProvider.contract.Call(opts, &out, "getMinTier", _proposer, _rand) if err != nil { return *new(uint16), err @@ -207,18 +269,18 @@ func (_TierProvider *TierProviderCaller) GetMinTier(opts *bind.CallOpts, arg0 *b } -// GetMinTier is a free data retrieval call binding the contract method 0x59ab4e23. +// GetMinTier is a free data retrieval call binding the contract method 0x52c5c56b. // -// Solidity: function getMinTier(uint256 ) pure returns(uint16) -func (_TierProvider *TierProviderSession) GetMinTier(arg0 *big.Int) (uint16, error) { - return _TierProvider.Contract.GetMinTier(&_TierProvider.CallOpts, arg0) +// Solidity: function getMinTier(address _proposer, uint256 _rand) view returns(uint16) +func (_TierProvider *TierProviderSession) GetMinTier(_proposer common.Address, _rand *big.Int) (uint16, error) { + return _TierProvider.Contract.GetMinTier(&_TierProvider.CallOpts, _proposer, _rand) } -// GetMinTier is a free data retrieval call binding the contract method 0x59ab4e23. +// GetMinTier is a free data retrieval call binding the contract method 0x52c5c56b. // -// Solidity: function getMinTier(uint256 ) pure returns(uint16) -func (_TierProvider *TierProviderCallerSession) GetMinTier(arg0 *big.Int) (uint16, error) { - return _TierProvider.Contract.GetMinTier(&_TierProvider.CallOpts, arg0) +// Solidity: function getMinTier(address _proposer, uint256 _rand) view returns(uint16) +func (_TierProvider *TierProviderCallerSession) GetMinTier(_proposer common.Address, _rand *big.Int) (uint16, error) { + return _TierProvider.Contract.GetMinTier(&_TierProvider.CallOpts, _proposer, _rand) } // GetProvider is a free data retrieval call binding the contract method 0x5c42d079. diff --git a/packages/taiko-client/bindings/metadata/interface.go b/packages/taiko-client/bindings/metadata/interface.go new file mode 100644 index 00000000000..52e9e66b173 --- /dev/null +++ b/packages/taiko-client/bindings/metadata/interface.go @@ -0,0 +1,40 @@ +package metadata + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" +) + +// struct BlockM +// TaikoBlockMetaData defines all the metadata of a Taiko block. +type TaikoBlockMetaData interface { + GetAnchorBlockHash() common.Hash + GetDifficulty() common.Hash + GetBlobHash() common.Hash + GetExtraData() []byte + GetCoinbase() common.Address + GetBlockID() *big.Int + GetGasLimit() uint32 + GetTimestamp() uint64 + GetAnchorBlockID() uint64 + GetMinTier() uint16 + GetBlobUsed() bool + GetParentMetaHash() common.Hash + GetProposer() common.Address + GetAssignedProver() common.Address + GetLivenessBond() *big.Int + GetProposedAt() uint64 + GetProposedIn() uint64 + GetBlobTxListOffset() uint32 + GetBlobTxListLength() uint32 + GetBlobIndex() uint8 + GetBaseFeeConfig() *bindings.LibSharedDataBaseFeeConfig + GetRawBlockHeight() *big.Int + GetRawBlockHash() common.Hash + GetTxIndex() uint + GetTxHash() common.Hash + IsOntakeBlock() bool +} diff --git a/packages/taiko-client/bindings/metadata/metadata_legacy.go b/packages/taiko-client/bindings/metadata/metadata_legacy.go new file mode 100644 index 00000000000..10b1b0eef2e --- /dev/null +++ b/packages/taiko-client/bindings/metadata/metadata_legacy.go @@ -0,0 +1,168 @@ +package metadata + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" +) + +// Ensure TaikoDataBlockMetadataLegacy implements TaikoBlockMetaData. +var _ TaikoBlockMetaData = (*TaikoDataBlockMetadataLegacy)(nil) + +// TaikoDataBlockMetadataLegacy is the metadata of a legacy Taiko block. +type TaikoDataBlockMetadataLegacy struct { + bindings.TaikoDataBlockMetadata + types.Log + assignedProver common.Address + livenessBond *big.Int +} + +// NewTaikoDataBlockMetadataLegacy creates a new instance of TaikoDataBlockMetadataLegacy +// from the TaikoL1.BlockProposed event. +func NewTaikoDataBlockMetadataLegacy(e *bindings.TaikoL1ClientBlockProposed) *TaikoDataBlockMetadataLegacy { + return &TaikoDataBlockMetadataLegacy{ + TaikoDataBlockMetadata: e.Meta, + Log: e.Raw, + assignedProver: e.AssignedProver, + livenessBond: e.LivenessBond, + } +} + +// GetAnchorBlockHash returns the anchor block hash. +func (m *TaikoDataBlockMetadataLegacy) GetAnchorBlockHash() common.Hash { + return m.L1Hash +} + +// GetDifficulty returns the difficulty. +func (m *TaikoDataBlockMetadataLegacy) GetDifficulty() common.Hash { + return m.Difficulty +} + +// GetBlobHash returns the blob hash. +func (m *TaikoDataBlockMetadataLegacy) GetBlobHash() common.Hash { + return m.BlobHash +} + +// GetExtraData returns the extra data. +func (m *TaikoDataBlockMetadataLegacy) GetExtraData() []byte { + return m.ExtraData[:] +} + +// GetCoinbase returns the coinbase. +func (m *TaikoDataBlockMetadataLegacy) GetCoinbase() common.Address { + return m.Coinbase +} + +// GetBlockID returns the L2 block ID. +func (m *TaikoDataBlockMetadataLegacy) GetBlockID() *big.Int { + return new(big.Int).SetUint64(m.Id) +} + +// GetGasLimit returns the gas limit. +func (m *TaikoDataBlockMetadataLegacy) GetGasLimit() uint32 { + return m.GasLimit +} + +// GetTimestamp returns the timestamp. +func (m *TaikoDataBlockMetadataLegacy) GetTimestamp() uint64 { + return m.Timestamp +} + +// GetAnchorBlockID returns the L1 block number which should be used in anchor transaction. +func (m *TaikoDataBlockMetadataLegacy) GetAnchorBlockID() uint64 { + return m.L1Height +} + +// GetMinTier returns the minimum tier. +func (m *TaikoDataBlockMetadataLegacy) GetMinTier() uint16 { + return m.MinTier +} + +// GetBlobUsed returns whether the blob is used. +func (m *TaikoDataBlockMetadataLegacy) GetBlobUsed() bool { + return m.BlobUsed +} + +// GetParentMetaHash returns the parent meta hash. +func (m *TaikoDataBlockMetadataLegacy) GetParentMetaHash() common.Hash { + return m.ParentMetaHash +} + +// GetProposer returns the proposer address. +func (m *TaikoDataBlockMetadataLegacy) GetProposer() common.Address { + return m.Sender +} + +// GetAssignedProver returns the assigned prover address, right now +// this address should be equal to the proposer address. +func (m *TaikoDataBlockMetadataLegacy) GetAssignedProver() common.Address { + return m.assignedProver +} + +// GetLivenessBond returns the liveness bond. +func (m *TaikoDataBlockMetadataLegacy) GetLivenessBond() *big.Int { + return m.livenessBond +} + +// GetProposedAt returns the proposedAt timestamp. +func (m *TaikoDataBlockMetadataLegacy) GetProposedAt() uint64 { + return m.Timestamp +} + +// GetProposedIn returns the proposedIn block number. +func (m *TaikoDataBlockMetadataLegacy) GetProposedIn() uint64 { + return m.BlockNumber +} + +// GetBlobTxListOffset returns the blob tx list offset. +func (m *TaikoDataBlockMetadataLegacy) GetBlobTxListOffset() uint32 { + return 0 +} + +// GetBlobTxListLength returns the blob tx list length. +func (m *TaikoDataBlockMetadataLegacy) GetBlobTxListLength() uint32 { + return 0 +} + +// GetBlobIndex returns the blob index. +func (m *TaikoDataBlockMetadataLegacy) GetBlobIndex() uint8 { + return 0 +} + +// GetBaseFeeConfig returns the L2 block basefee configs. +func (m *TaikoDataBlockMetadataLegacy) GetBaseFeeConfig() *bindings.LibSharedDataBaseFeeConfig { + return &bindings.LibSharedDataBaseFeeConfig{} +} + +// GetRawBlockHeight returns the raw L1 block height. +func (m *TaikoDataBlockMetadataLegacy) GetRawBlockHeight() *big.Int { + return new(big.Int).SetUint64(m.BlockNumber) +} + +// GetRawBlockHash returns the raw L1 block hash. +func (m *TaikoDataBlockMetadataLegacy) GetRawBlockHash() common.Hash { + return m.BlockHash +} + +// GetTxIndex returns the transaction index. +func (m *TaikoDataBlockMetadataLegacy) GetTxIndex() uint { + return m.Log.TxIndex +} + +// GetTxHash returns the transaction hash. +func (m *TaikoDataBlockMetadataLegacy) GetTxHash() common.Hash { + return m.Log.TxHash +} + +// IsOntakeBlock returns whether the block is an Ontake block. +func (m *TaikoDataBlockMetadataLegacy) IsOntakeBlock() bool { + return false +} + +// InnerMetadata returns the inner metadata. +func (m *TaikoDataBlockMetadataLegacy) InnerMetadata() *bindings.TaikoDataBlockMetadata { + return &m.TaikoDataBlockMetadata +} diff --git a/packages/taiko-client/bindings/metadata/metadata_ontake.go b/packages/taiko-client/bindings/metadata/metadata_ontake.go new file mode 100644 index 00000000000..5ae06a9e11b --- /dev/null +++ b/packages/taiko-client/bindings/metadata/metadata_ontake.go @@ -0,0 +1,164 @@ +package metadata + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" +) + +// Ensure TaikoDataBlockMetadataOntake implements TaikoBlockMetaData. +var _ TaikoBlockMetaData = (*TaikoDataBlockMetadataOntake)(nil) + +// TaikoDataBlockMetadataOntake is the metadata of an ontake Taiko block. +type TaikoDataBlockMetadataOntake struct { + bindings.TaikoDataBlockMetadataV2 + types.Log +} + +// NewTaikoDataBlockMetadataOntake creates a new instance of TaikoDataBlockMetadataOntake +// from the TaikoL1.BlockProposedV2 event. +func NewTaikoDataBlockMetadataOntake(e *bindings.TaikoL1ClientBlockProposedV2) *TaikoDataBlockMetadataOntake { + return &TaikoDataBlockMetadataOntake{ + TaikoDataBlockMetadataV2: e.Meta, + Log: e.Raw, + } +} + +// GetAnchorBlockHash returns the anchor block hash. +func (m *TaikoDataBlockMetadataOntake) GetAnchorBlockHash() common.Hash { + return m.AnchorBlockHash +} + +// GetDifficulty returns the difficulty. +func (m *TaikoDataBlockMetadataOntake) GetDifficulty() common.Hash { + return m.Difficulty +} + +// GetBlobHash returns the blob hash. +func (m *TaikoDataBlockMetadataOntake) GetBlobHash() common.Hash { + return m.BlobHash +} + +// GetExtraData returns the extra data. +func (m *TaikoDataBlockMetadataOntake) GetExtraData() []byte { + return m.ExtraData[:] +} + +// GetCoinbase returns the coinbase. +func (m *TaikoDataBlockMetadataOntake) GetCoinbase() common.Address { + return m.Coinbase +} + +// GetBlockID returns the L2 block ID. +func (m *TaikoDataBlockMetadataOntake) GetBlockID() *big.Int { + return new(big.Int).SetUint64(m.Id) +} + +// GetGasLimit returns the gas limit. +func (m *TaikoDataBlockMetadataOntake) GetGasLimit() uint32 { + return m.GasLimit +} + +// GetTimestamp returns the timestamp. +func (m *TaikoDataBlockMetadataOntake) GetTimestamp() uint64 { + return m.Timestamp +} + +// GetAnchorBlockID returns the L1 block number which should be used in anchor transaction. +func (m *TaikoDataBlockMetadataOntake) GetAnchorBlockID() uint64 { + return m.AnchorBlockId +} + +// GetMinTier returns the minimum tier. +func (m *TaikoDataBlockMetadataOntake) GetMinTier() uint16 { + return m.MinTier +} + +// GetBlobUsed returns whether the blob is used. +func (m *TaikoDataBlockMetadataOntake) GetBlobUsed() bool { + return m.BlobUsed +} + +// GetParentMetaHash returns the parent meta hash. +func (m *TaikoDataBlockMetadataOntake) GetParentMetaHash() common.Hash { + return m.ParentMetaHash +} + +// GetProposer returns the proposer address. +func (m *TaikoDataBlockMetadataOntake) GetProposer() common.Address { + return m.Proposer +} + +// GetAssignedProver returns the assigned prover address, right now +// this address should be equal to the proposer address. +func (m *TaikoDataBlockMetadataOntake) GetAssignedProver() common.Address { + return m.Proposer +} + +// GetLivenessBond returns the liveness bond. +func (m *TaikoDataBlockMetadataOntake) GetLivenessBond() *big.Int { + return m.LivenessBond +} + +// GetProposedAt returns the proposedAt timestamp. +func (m *TaikoDataBlockMetadataOntake) GetProposedAt() uint64 { + return m.ProposedAt +} + +// GetProposedIn returns the proposedIn block number. +func (m *TaikoDataBlockMetadataOntake) GetProposedIn() uint64 { + return m.ProposedIn +} + +// GetBlobTxListOffset returns the blob tx list offset. +func (m *TaikoDataBlockMetadataOntake) GetBlobTxListOffset() uint32 { + return m.BlobTxListOffset +} + +// GetBlobTxListLength returns the blob tx list length. +func (m *TaikoDataBlockMetadataOntake) GetBlobTxListLength() uint32 { + return m.BlobTxListLength +} + +// GetBlobIndex returns the blob index. +func (m *TaikoDataBlockMetadataOntake) GetBlobIndex() uint8 { + return m.BlobIndex +} + +// GetBaseFeeConfig returns the L2 block basefee configs. +func (m *TaikoDataBlockMetadataOntake) GetBaseFeeConfig() *bindings.LibSharedDataBaseFeeConfig { + return &m.BaseFeeConfig +} + +// GetRawBlockHeight returns the raw L1 block height. +func (m *TaikoDataBlockMetadataOntake) GetRawBlockHeight() *big.Int { + return new(big.Int).SetUint64(m.BlockNumber) +} + +// GetRawBlockHash returns the raw L1 block hash. +func (m *TaikoDataBlockMetadataOntake) GetRawBlockHash() common.Hash { + return m.BlockHash +} + +// GetTxIndex returns the transaction index. +func (m *TaikoDataBlockMetadataOntake) GetTxIndex() uint { + return m.Log.TxIndex +} + +// GetTxHash returns the transaction hash. +func (m *TaikoDataBlockMetadataOntake) GetTxHash() common.Hash { + return m.Log.TxHash +} + +// IsOntakeBlock returns whether the block is an ontake block. +func (m *TaikoDataBlockMetadataOntake) IsOntakeBlock() bool { + return true +} + +// InnerMetadata returns the inner metadata. +func (m *TaikoDataBlockMetadataOntake) InnerMetadata() *bindings.TaikoDataBlockMetadataV2 { + return &m.TaikoDataBlockMetadataV2 +} diff --git a/packages/taiko-client/cmd/flags/common.go b/packages/taiko-client/cmd/flags/common.go index 2c9c6babfa2..834dd8d3d67 100644 --- a/packages/taiko-client/cmd/flags/common.go +++ b/packages/taiko-client/cmd/flags/common.go @@ -5,6 +5,8 @@ import ( "github.com/cenkalti/backoff/v4" "github.com/urfave/cli/v2" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) var ( @@ -26,6 +28,12 @@ var ( Category: commonCategory, EnvVars: []string{"L1_WS"}, } + L1PrivateEndpoint = &cli.StringFlag{ + Name: "l1.private", + Usage: "RPC endpoint of a L1 node with private mempool", + Category: commonCategory, + EnvVars: []string{"L1_PRIVATE"}, + } L2WSEndpoint = &cli.StringFlag{ Name: "l2.ws", Usage: "Websocket RPC endpoint of a L2 taiko-geth execution engine", @@ -33,13 +41,6 @@ var ( Category: commonCategory, EnvVars: []string{"L2_WS"}, } - L1HTTPEndpoint = &cli.StringFlag{ - Name: "l1.http", - Usage: "HTTP RPC endpoint of a L1 ethereum node", - Required: true, - Category: commonCategory, - EnvVars: []string{"L1_HTTP"}, - } L1BeaconEndpoint = &cli.StringFlag{ Name: "l1.beacon", Usage: "HTTP RPC endpoint of a L1 beacon node", @@ -147,11 +148,12 @@ var ( Value: 12 * time.Second, EnvVars: []string{"RPC_TIMEOUT"}, } - AssignmentHookAddress = &cli.StringFlag{ - Name: "assignmentHookAddress", - Usage: "Address of the AssignmentHook contract", + ProverSetAddress = &cli.StringFlag{ + Name: "proverSet", + Usage: "ProverSet contract `address`", + Value: rpc.ZeroAddress.Hex(), Category: commonCategory, - EnvVars: []string{"ASSIGNMENT_HOOK_ADDRESS"}, + EnvVars: []string{"PROVER_SET"}, } ) @@ -162,6 +164,7 @@ var CommonFlags = []cli.Flag{ TaikoL1Address, TaikoL2Address, // Optional + ProverSetAddress, Verbosity, LogJSON, MetricsEnabled, @@ -170,6 +173,7 @@ var CommonFlags = []cli.Flag{ BackOffMaxRetries, BackOffRetryInterval, RPCTimeout, + L1PrivateEndpoint, } // MergeFlags merges the given flag slices. diff --git a/packages/taiko-client/cmd/flags/driver.go b/packages/taiko-client/cmd/flags/driver.go index 3c28dc7571a..48bcf693962 100644 --- a/packages/taiko-client/cmd/flags/driver.go +++ b/packages/taiko-client/cmd/flags/driver.go @@ -30,7 +30,7 @@ var ( Category: driverCategory, EnvVars: []string{"P2P_CHECK_POINT_SYNC_URL"}, } - // syncer specific flag + // Chain syncer specific flag MaxExponent = &cli.Uint64Flag{ Name: "syncer.maxExponent", Usage: "Maximum exponent of retrieving L1 blocks when there is a mismatch between protocol and L2 EE," + @@ -52,6 +52,40 @@ var ( Category: driverCategory, EnvVars: []string{"BLOB_SOCIAL_SCAN_ENDPOINT"}, } + RPCWriteTimeout = &cli.DurationFlag{ + Name: "rpc.writeTimeout", + Usage: "HTTP RPC write timeout", + Category: driverCategory, + Value: 120 * time.Second, + EnvVars: []string{"RPC_WRITE_TIMEOUT"}, + } + // soft block server + SoftBlockServerPort = &cli.Uint64Flag{ + Name: "softBlock.port", + Usage: "HTTP port of the soft block server, 0 means disabled", + Category: driverCategory, + EnvVars: []string{"SOFT_BLOCK_SERVER_PORT"}, + } + SoftBlockServerJWTSecret = &cli.StringFlag{ + Name: "softBlock.jwtSecret", + Usage: "Path to a JWT secret to use for the soft block server", + Category: driverCategory, + EnvVars: []string{"SOFT_BLOCK_SERVER_JWT_SECRET"}, + } + SoftBlockServerCORSOrigins = &cli.StringFlag{ + Name: "softBlock.corsOrigins", + Usage: "CORS Origins settings for the soft block server", + Category: driverCategory, + Value: "*", + EnvVars: []string{"SOFT_BLOCK_SERVER_CORS_ORIGINS"}, + } + SoftBlockServerCheckSig = &cli.BoolFlag{ + Name: "softBlock.signatureCheck", + Usage: "If the soft block server will check the signature of the incoming transactions batches", + Category: driverCategory, + Value: false, + EnvVars: []string{"SOFT_BLOCK_SERVER_SIGNATURE_CHECK"}, + } ) // DriverFlags All driver flags. @@ -66,4 +100,9 @@ var DriverFlags = MergeFlags(CommonFlags, []cli.Flag{ MaxExponent, BlobServerEndpoint, SocialScanEndpoint, + RPCWriteTimeout, + SoftBlockServerPort, + SoftBlockServerJWTSecret, + SoftBlockServerCORSOrigins, + SoftBlockServerCheckSig, }) diff --git a/packages/taiko-client/cmd/flags/proposer.go b/packages/taiko-client/cmd/flags/proposer.go index d47399e6fbc..8d05cc7a0a4 100644 --- a/packages/taiko-client/cmd/flags/proposer.go +++ b/packages/taiko-client/cmd/flags/proposer.go @@ -2,8 +2,6 @@ package flags import ( "github.com/urfave/cli/v2" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/version" ) // Required flags used by proposer. @@ -15,13 +13,6 @@ var ( Category: proposerCategory, EnvVars: []string{"L1_PROPOSER_PRIV_KEY"}, } - ProverEndpoints = &cli.StringFlag{ - Name: "proverEndpoints", - Usage: "Comma-delineated list of prover endpoints proposer should query when attempting to propose a block", - Required: true, - Category: proposerCategory, - EnvVars: []string{"PROVER_ENDPOINTS"}, - } L2SuggestedFeeRecipient = &cli.StringFlag{ Name: "l2.suggestedFeeRecipient", Usage: "Address of the proposed block's suggested L2 fee recipient", @@ -33,33 +24,6 @@ var ( // Optional flags used by proposer. var ( - // Tier fee related. - OptimisticTierFee = &cli.Float64Flag{ - Name: "tierFee.optimistic", - Usage: "Initial tier fee (in GWei) paid to prover to generate an optimistic proofs", - Category: proposerCategory, - EnvVars: []string{"TIER_FEE_OPTIMISTIC"}, - } - SgxTierFee = &cli.Float64Flag{ - Name: "tierFee.sgx", - Usage: "Initial tier fee (in GWei) paid to prover to generate a SGX proofs", - Category: proposerCategory, - EnvVars: []string{"TIER_FEE_SGX"}, - } - TierFeePriceBump = &cli.Uint64Flag{ - Name: "tierFee.priceBump", - Usage: "Price bump percentage when no prover wants to accept the block at initial fee", - Value: 10, - Category: proposerCategory, - EnvVars: []string{"TIER_FEE_PRICE_BUMP"}, - } - MaxTierFeePriceBumps = &cli.Uint64Flag{ - Name: "tierFee.maxPriceBumps", - Usage: "If nobody accepts block at initial tier fee, how many iterations to increase tier fee before giving up", - Category: proposerCategory, - Value: 3, - EnvVars: []string{"TIER_FEE_MAX_PRICE_BUMPS"}, - } // Proposing epoch related. ProposeInterval = &cli.DurationFlag{ Name: "epoch.interval", @@ -82,6 +46,13 @@ var ( Value: 0, EnvVars: []string{"EPOCH_MIN_TX_LIST_BYTES"}, } + MinTip = &cli.Float64Flag{ + Name: "epoch.minTip", + Usage: "Minimum tip (in GWei) for a transaction to propose", + Category: proposerCategory, + Value: 0, + EnvVars: []string{"EPOCH_MIN_TIP"}, + } MinProposingInternal = &cli.DurationFlag{ Name: "epoch.minProposingInterval", Usage: "Minimum time interval to force proposing a block, even if there are no transaction in mempool", @@ -89,13 +60,12 @@ var ( Value: 0, EnvVars: []string{"EPOCH_MIN_PROPOSING_INTERNAL"}, } - // Proposing metadata related. - ExtraData = &cli.StringFlag{ - Name: "extraData", - Usage: "Block extra data set by the proposer (default = client version)", - Value: version.CommitVersion(), + AllowZeroInterval = &cli.Uint64Flag{ + Name: "epoch.allowZeroInterval", + Usage: "If set, after this many epochs, proposer will allow propose zero tip transactions once", Category: proposerCategory, - EnvVars: []string{"EXTRA_DATA"}, + Value: 0, + EnvVars: []string{"EPOCH_ALLOW_ZERO_INTERVAL"}, } // Transactions pool related. TxPoolLocals = &cli.StringSliceFlag{ @@ -118,13 +88,6 @@ var ( Category: proposerCategory, EnvVars: []string{"TX_POOL_MAX_TX_LISTS_PER_EPOCH"}, } - ProposeBlockIncludeParentMetaHash = &cli.BoolFlag{ - Name: "includeParentMetaHash", - Usage: "Include parent meta hash when proposing block", - Value: false, - Category: proposerCategory, - EnvVars: []string{"INCLUDE_PARENT_META_HASH"}, - } // Transaction related. BlobAllowed = &cli.BoolFlag{ Name: "l1.blobAllowed", @@ -132,12 +95,20 @@ var ( Value: false, EnvVars: []string{"L1_BLOB_ALLOWED"}, } - L1BlockBuilderTip = &cli.Uint64Flag{ - Name: "l1.blockBuilderTip", - Usage: "Amount you wish to tip the L1 block builder", - Value: 0, + FallbackToCalldata = &cli.BoolFlag{ + Name: "l1.fallbackToCalldata", + Usage: "If set to true, proposer will use calldata as DA when blob fee is more expensive than using calldata", + Value: false, + Category: proposerCategory, + EnvVars: []string{"L1_FALLBACK_TO_CALLDATA"}, + } + RevertProtectionEnabled = &cli.BoolFlag{ + Name: "l1.revertProtection", + Usage: "Enable revert protection within your ProverSet contract, " + + "this is effective only if your PBS service supports revert protection", + Value: false, Category: proposerCategory, - EnvVars: []string{"L1_BLOCK_BUILDER_TIP"}, + EnvVars: []string{"L1_REVERT_PROTECTION"}, } ) @@ -152,18 +123,13 @@ var ProposerFlags = MergeFlags(CommonFlags, []cli.Flag{ ProposeInterval, TxPoolLocals, TxPoolLocalsOnly, - ExtraData, MinGasUsed, MinTxListBytes, + MinTip, MinProposingInternal, + AllowZeroInterval, MaxProposedTxListsPerEpoch, - ProverEndpoints, - OptimisticTierFee, - SgxTierFee, - TierFeePriceBump, - MaxTierFeePriceBumps, - ProposeBlockIncludeParentMetaHash, - AssignmentHookAddress, BlobAllowed, - L1BlockBuilderTip, + FallbackToCalldata, + RevertProtectionEnabled, }, TxmgrFlags) diff --git a/packages/taiko-client/cmd/flags/prover.go b/packages/taiko-client/cmd/flags/prover.go index 9ec65dfa1bf..ba24227d482 100644 --- a/packages/taiko-client/cmd/flags/prover.go +++ b/packages/taiko-client/cmd/flags/prover.go @@ -17,36 +17,35 @@ var ( Category: proverCategory, EnvVars: []string{"L1_PROVER_PRIV_KEY"}, } - ProverCapacity = &cli.Uint64Flag{ - Name: "prover.capacity", - Usage: "Capacity of prover", - Required: true, - Category: proverCategory, - EnvVars: []string{"PROVER_CAPACITY"}, - } ) // Optional flags used by prover. var ( - ProverSetAddress = &cli.StringFlag{ - Name: "proverSet", - Usage: "ProverSet contract `address`", - Value: rpc.ZeroAddress.Hex(), - Category: proverCategory, - EnvVars: []string{"PROVER_SET"}, - } RaikoHostEndpoint = &cli.StringFlag{ Name: "raiko.host", Usage: "RPC endpoint of a Raiko host service", Category: proverCategory, EnvVars: []string{"RAIKO_HOST"}, } + RaikoZKVMHostEndpoint = &cli.StringFlag{ + Name: "raiko.host.zkvm", + Usage: "RPC endpoint of a Raiko ZKVM host service", + Category: proverCategory, + EnvVars: []string{"RAIKO_HOST_ZKVM"}, + } RaikoJWTPath = &cli.StringFlag{ Name: "raiko.jwtPath", Usage: "Path to a JWT secret for the Raiko service", Category: proverCategory, EnvVars: []string{"RAIKO_JWT_PATH"}, } + RaikoRequestTimeout = &cli.DurationFlag{ + Name: "raiko.requestTimeout", + Usage: "Timeout in minutes for raiko request", + Category: commonCategory, + Value: 10 * time.Minute, + EnvVars: []string{"RAIKO_REQUEST_TIMEOUT"}, + } StartingBlockID = &cli.Uint64Flag{ Name: "prover.startingBlockID", Usage: "If set, prover will start proving blocks from the block with this ID", @@ -68,39 +67,6 @@ var ( Value: false, EnvVars: []string{"PROVER_PROVE_UNASSIGNED_BLOCKS"}, } - MinEthBalance = &cli.Float64Flag{ - Name: "prover.minEthBalance", - Usage: "Minimum ETH balance (in Ether) a prover wants to keep", - Category: proverCategory, - Value: 0, - EnvVars: []string{"PROVER_MIN_ETH_BALANCE"}, - } - MinTaikoTokenBalance = &cli.Float64Flag{ - Name: "prover.minTaikoTokenBalance", - Usage: "Minimum Taiko token balance without decimal a prover wants to keep", - Category: proverCategory, - Value: 0, - EnvVars: []string{"PROVER_MIN_TAIKO_TOKEN_BALANCE"}, - } - // Tier fee related. - MinOptimisticTierFee = &cli.Uint64Flag{ - Name: "minTierFee.optimistic", - Usage: "Minimum accepted fee for generating an optimistic proof", - Category: proverCategory, - EnvVars: []string{"MIN_TIER_FEE_OPTIMISTIC"}, - } - MinSgxTierFee = &cli.Uint64Flag{ - Name: "minTierFee.sgx", - Usage: "Minimum accepted fee for generating a SGX proof", - Category: proverCategory, - EnvVars: []string{"MIN_TIER_FEE_SGX"}, - } - MinSgxAndZkVMTierFee = &cli.Uint64Flag{ - Name: "minTierFee.sgxAndZkvm", - Usage: "Minimum accepted fee for generating a SGX + zkVM proof", - Category: proverCategory, - EnvVars: []string{"MIN_TIER_FEE_SGX_AND_ZKVM"}, - } // Running mode ContesterMode = &cli.BoolFlag{ Name: "mode.contester", @@ -132,25 +98,10 @@ var ( Category: proverCategory, EnvVars: []string{"PROVER_DUMMY"}, } - // Max slippage allowed - MaxAcceptableBlockSlippage = &cli.Uint64Flag{ - Name: "prover.blockSlippage", - Usage: "Maximum accepted slippage difference for blockID for accepting proving a block", - Value: 1024, - Category: proverCategory, - EnvVars: []string{"PROVER_BLOCK_SLIPPAGE"}, - } // Max amount of L1 blocks that can pass before block is invalid - MaxProposedIn = &cli.Uint64Flag{ - Name: "prover.maxProposedIn", - Usage: "Maximum amount of L1 blocks that can pass before block can not be proposed. 0 means no limit.", - Value: 0, - Category: proverCategory, - EnvVars: []string{"PROVER_MAX_PROPOSED_IN"}, - } Allowance = &cli.Float64Flag{ Name: "prover.allowance", - Usage: "Amount without decimal to approve AssignmentHook contract for TaikoToken usage", + Usage: "Amount without decimal to approve TaikoL1 contract for TaikoToken usage", Category: proverCategory, EnvVars: []string{"PROVER_ALLOWANCE"}, } @@ -208,22 +159,40 @@ var ( Category: proverCategory, EnvVars: []string{"PROVER_BLOCK_CONFIRMATIONS"}, } + // Batch proof related flag + SGXBatchSize = &cli.Uint64Flag{ + Name: "prover.sgx.batchSize", + Usage: "The default size of batch sgx proofs, when it arrives, submit a batch of proof immediately, " + + "this flag only works post Ontake fork", + Value: 1, + Category: proverCategory, + EnvVars: []string{"PROVER_SGX_BATCH_SIZE"}, + } + ZKVMBatchSize = &cli.Uint64Flag{ + Name: "prover.zkvm.batchSize", + Usage: "The size of batch ZKVM proof, when it arrives, submit a batch of proof immediately, " + + "this flag only works post Ontake fork", + Value: 1, + Category: proverCategory, + EnvVars: []string{"PROVER_ZKVM_BATCH_SIZE"}, + } + ForceBatchProvingInterval = &cli.DurationFlag{ + Name: "prover.forceBatchProvingInterval", + Usage: "Time interval to prove blocks even the number of pending proof do not exceed prover.batchSize, " + + "this flag only works post Ontake fork", + Category: proverCategory, + Value: 30 * time.Minute, + EnvVars: []string{"PROVER_FORCE_BATCH_PROVING_INTERVAL"}, + } ) // ProverFlags All prover flags. var ProverFlags = MergeFlags(CommonFlags, []cli.Flag{ - L1HTTPEndpoint, L2WSEndpoint, L2HTTPEndpoint, - ProverSetAddress, RaikoHostEndpoint, RaikoJWTPath, L1ProverPrivKey, - MinOptimisticTierFee, - MinSgxTierFee, - MinSgxAndZkVMTierFee, - MinEthBalance, - MinTaikoTokenBalance, StartingBlockID, Dummy, GuardianProverMinority, @@ -234,14 +203,15 @@ var ProverFlags = MergeFlags(CommonFlags, []cli.Flag{ ProveUnassignedBlocks, ContesterMode, ProverHTTPServerPort, - ProverCapacity, MaxExpiry, - MaxProposedIn, TaikoTokenAddress, - MaxAcceptableBlockSlippage, - AssignmentHookAddress, Allowance, L1NodeVersion, L2NodeVersion, BlockConfirmations, + RaikoRequestTimeout, + RaikoZKVMHostEndpoint, + SGXBatchSize, + ZKVMBatchSize, + ForceBatchProvingInterval, }, TxmgrFlags) diff --git a/packages/taiko-client/cmd/logger/logger.go b/packages/taiko-client/cmd/logger/logger.go index 7c150b81f57..7481c23ad14 100644 --- a/packages/taiko-client/cmd/logger/logger.go +++ b/packages/taiko-client/cmd/logger/logger.go @@ -20,7 +20,7 @@ func InitLogger(c *cli.Context) { glogger.Verbosity(slogVerbosity) log.SetDefault(log.NewLogger(glogger)) } else { - glogger := log.NewGlogHandler(log.NewTerminalHandler(os.Stdout, true)) + glogger := log.NewGlogHandler(log.NewTerminalHandler(os.Stdout, false)) glogger.Verbosity(slogVerbosity) log.SetDefault(log.NewLogger(glogger)) } diff --git a/packages/taiko-client/docs/docs.go b/packages/taiko-client/docs/docs.go index 82a6b6bfdc2..ca9a73974e5 100644 --- a/packages/taiko-client/docs/docs.go +++ b/packages/taiko-client/docs/docs.go @@ -17,30 +17,50 @@ const docTemplate = `{ }, "license": { "name": "MIT", - "url": "https://github.com/taikoxyz/taiko-mono/packages/taiko-client/blob/main/LICENSE.md" + "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md" }, "version": "{{.Version}}" }, "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { - "/assignment": { + "/healthz": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Get current server health status", + "operationId": "health-check", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/softBlocks": { "post": { + "description": "Insert a batch of transactions into a soft block for preconfirmation. If the batch is the\nfirst for a block, a new soft block will be created. Otherwise, the transactions will\nbe appended to the existing soft block. The API will fail if:\n1) the block is not soft\n2) block-level parameters are invalid or do not match the current soft block’s parameters\n3) the batch ID is not exactly 1 greater than the previous one\n4) the last batch of the block indicates no further transactions are allowed", "consumes": [ "application/json" ], "produces": [ "application/json" ], - "summary": "Try to accept a block proof assignment", "parameters": [ { - "description": "assignment request body", + "description": "soft block creation request body", "name": "body", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/server.CreateAssignmentRequestBody" + "$ref": "#/definitions/softblocks.BuildSoftBlockRequestBody" } } ], @@ -48,33 +68,35 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/server.ProposeBlockResponse" - } - }, - "422": { - "description": "prover does not have capacity", - "schema": { - "type": "string" + "$ref": "#/definitions/softblocks.BuildSoftBlockResponseBody" } } } - } - }, - "/status": { - "get": { + }, + "delete": { + "description": "Remove all soft blocks from the blockchain beyond the specified block height,\nensuring the latest block ID does not exceed the given height. This method will fail if\nthe block with an ID one greater than the specified height is not a soft block. If the\nspecified block height is greater than the latest soft block ID, the method will succeed\nwithout modifying the blockchain.", "consumes": [ "application/json" ], "produces": [ "application/json" ], - "summary": "Get current prover server status", - "operationId": "get-status", + "parameters": [ + { + "description": "soft blocks removing request body", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/softblocks.RemoveSoftBlocksRequestBody" + } + } + ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/server.Status" + "$ref": "#/definitions/softblocks.RemoveSoftBlocksResponseBody" } } } @@ -82,45 +104,121 @@ const docTemplate = `{ } }, "definitions": { - "server.CreateAssignmentRequestBody": { + "big.Int": { + "type": "object" + }, + "softblocks.BuildSoftBlockRequestBody": { "type": "object", "properties": { - "blobHash": { - "type": "array", - "items": { - "type": "integer" - } + "transactionBatch": { + "description": "@param transactionBatch TransactionBatch Transaction batch to be inserted into the soft block", + "allOf": [ + { + "$ref": "#/definitions/softblocks.TransactionBatch" + } + ] + } + } + }, + "softblocks.BuildSoftBlockResponseBody": { + "type": "object", + "properties": { + "blockHeader": { + "description": "@param blockHeader types.Header of the soft block", + "allOf": [ + { + "$ref": "#/definitions/types.Header" + } + ] + } + } + }, + "softblocks.RemoveSoftBlocksRequestBody": { + "type": "object", + "properties": { + "newLastBlockId": { + "description": "@param newLastBlockID uint64 New last block ID of the blockchain, it should\n@param not smaller than the canonical chain's highest block ID.", + "type": "integer" + } + } + }, + "softblocks.RemoveSoftBlocksResponseBody": { + "type": "object", + "properties": { + "headsRemoved": { + "description": "@param headsRemoved uint64 Number of soft heads removed", + "type": "integer" }, - "expiry": { + "lastBlockId": { + "description": "@param lastBlockID uint64 Current highest block ID of the blockchain (including soft blocks)", "type": "integer" }, - "feeToken": { - "type": "string" + "lastProposedBlockID": { + "description": "@param lastProposedBlockID uint64 Highest block ID of the cnonical chain", + "type": "integer" + } + } + }, + "softblocks.SoftBlockParams": { + "type": "object", + "properties": { + "anchorBlockID": { + "description": "@param anchorBlockID uint64 ` + "`" + `_anchorBlockId` + "`" + ` parameter of the ` + "`" + `anchorV2` + "`" + ` transaction in soft block", + "type": "integer" }, - "proposer": { - "type": "string" + "anchorStateRoot": { + "description": "@param anchorStateRoot string ` + "`" + `_anchorStateRoot` + "`" + ` parameter of the ` + "`" + `anchorV2` + "`" + ` transaction in soft block", + "type": "array", + "items": { + "type": "integer" + } }, - "tierFees": { + "coinbase": { + "description": "@param coinbase string Coinbase of the soft block", "type": "array", "items": { "type": "integer" } + }, + "timestamp": { + "description": "@param timestamp uint64 Timestamp of the soft block", + "type": "integer" } } }, - "server.ProposeBlockResponse": { + "softblocks.TransactionBatch": { "type": "object", "properties": { - "maxBlockID": { + "batchId": { + "description": "@param batchId uint64 ID of this transaction batch", "type": "integer" }, - "maxProposedIn": { + "batchType": { + "description": "@param batchType TransactionBatchMarker Marker of the transaction batch,\n@param either ` + "`" + `end_of_block` + "`" + `, ` + "`" + `end_of_preconf` + "`" + ` or empty", + "allOf": [ + { + "$ref": "#/definitions/softblocks.TransactionBatchMarker" + } + ] + }, + "blockId": { + "description": "@param blockId uint64 Block ID of the soft block", "type": "integer" }, - "prover": { + "blockParams": { + "description": "@param blockParams SoftBlockParams Block parameters of the soft block", + "allOf": [ + { + "$ref": "#/definitions/softblocks.SoftBlockParams" + } + ] + }, + "signature": { + "description": "@param signature string Signature of this transaction batch", "type": "string" }, - "signedPayload": { + "transactions": { + "description": "@param transactions string zlib compressed RLP encoded bytes of a transactions list", "type": "array", "items": { "type": "integer" @@ -128,23 +226,133 @@ const docTemplate = `{ } } }, - "server.Status": { + "softblocks.TransactionBatchMarker": { + "type": "string", + "enum": [ + "", + "endOfBlock", + "endOfPreconf" + ], + "x-enum-varnames": [ + "BatchMarkerEmpty", + "BatchMarkerEOB", + "BatchMarkerEOP" + ] + }, + "types.Header": { "type": "object", "properties": { - "maxExpiry": { + "baseFeePerGas": { + "description": "BaseFee was added by EIP-1559 and is ignored in legacy headers.", + "allOf": [ + { + "$ref": "#/definitions/big.Int" + } + ] + }, + "blobGasUsed": { + "description": "BlobGasUsed was added by EIP-4844 and is ignored in legacy headers.", "type": "integer" }, - "minOptimisticTierFee": { + "difficulty": { + "$ref": "#/definitions/big.Int" + }, + "excessBlobGas": { + "description": "ExcessBlobGas was added by EIP-4844 and is ignored in legacy headers.", "type": "integer" }, - "minSgxAndZkVMTierFee": { + "extraData": { + "type": "array", + "items": { + "type": "integer" + } + }, + "gasLimit": { "type": "integer" }, - "minSgxTierFee": { + "gasUsed": { "type": "integer" }, - "prover": { - "type": "string" + "logsBloom": { + "type": "array", + "items": { + "type": "integer" + } + }, + "miner": { + "type": "array", + "items": { + "type": "integer" + } + }, + "mixHash": { + "type": "array", + "items": { + "type": "integer" + } + }, + "nonce": { + "type": "array", + "items": { + "type": "integer" + } + }, + "number": { + "$ref": "#/definitions/big.Int" + }, + "parentBeaconBlockRoot": { + "description": "ParentBeaconRoot was added by EIP-4788 and is ignored in legacy headers.", + "type": "array", + "items": { + "type": "integer" + } + }, + "parentHash": { + "type": "array", + "items": { + "type": "integer" + } + }, + "receiptsRoot": { + "type": "array", + "items": { + "type": "integer" + } + }, + "requestsRoot": { + "description": "RequestsHash was added by EIP-7685 and is ignored in legacy headers.", + "type": "array", + "items": { + "type": "integer" + } + }, + "sha3Uncles": { + "type": "array", + "items": { + "type": "integer" + } + }, + "stateRoot": { + "type": "array", + "items": { + "type": "integer" + } + }, + "timestamp": { + "type": "integer" + }, + "transactionsRoot": { + "type": "array", + "items": { + "type": "integer" + } + }, + "withdrawalsRoot": { + "description": "WithdrawalsHash was added by EIP-4895 and is ignored in legacy headers.", + "type": "array", + "items": { + "type": "integer" + } } } } @@ -157,7 +365,7 @@ var SwaggerInfo = &swag.Spec{ Host: "", BasePath: "", Schemes: []string{}, - Title: "Taiko Prover Server API", + Title: "Taiko Soft Block Server API", Description: "", InfoInstanceName: "swagger", SwaggerTemplate: docTemplate, diff --git a/packages/taiko-client/docs/index.html b/packages/taiko-client/docs/index.html index f6092ef03c9..fd6da6d8abf 100644 --- a/packages/taiko-client/docs/index.html +++ b/packages/taiko-client/docs/index.html @@ -1,9 +1,9 @@ - - - Prover Server API + + + Taiko Preconfirmation Server API
@@ -11,7 +11,7 @@ window.onload = function () { // Begin Swagger UI call region const ui = SwaggerUIBundle({ - url: "/swagger.json", // Location of Open API spec in the repo + url: "swagger.json", //Location of Open API spec in the repo dom_id: '#swagger-ui', deepLinking: true, presets: [ diff --git a/packages/taiko-client/docs/swagger.json b/packages/taiko-client/docs/swagger.json index 64110df27cc..2e72737ed95 100644 --- a/packages/taiko-client/docs/swagger.json +++ b/packages/taiko-client/docs/swagger.json @@ -1,7 +1,7 @@ { "swagger": "2.0", "info": { - "title": "Taiko Prover Server API", + "title": "Taiko Soft Block Server API", "termsOfService": "http://swagger.io/terms/", "contact": { "name": "API Support", @@ -10,24 +10,40 @@ }, "license": { "name": "MIT", - "url": "https://github.com/taikoxyz/taiko-mono/packages/taiko-client/blob/main/LICENSE.md" + "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md" }, "version": "1.0" }, "paths": { - "/assignment": { + "/healthz": { + "get": { + "consumes": ["application/json"], + "produces": ["application/json"], + "summary": "Get current server health status", + "operationId": "health-check", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/softBlocks": { "post": { + "description": "Insert a batch of transactions into a soft block for preconfirmation. If the batch is the\nfirst for a block, a new soft block will be created. Otherwise, the transactions will\nbe appended to the existing soft block. The API will fail if:\n1) the block is not soft\n2) block-level parameters are invalid or do not match the current soft block’s parameters\n3) the batch ID is not exactly 1 greater than the previous one\n4) the last batch of the block indicates no further transactions are allowed", "consumes": ["application/json"], "produces": ["application/json"], - "summary": "Try to accept a block proof assignment", "parameters": [ { - "description": "assignment request body", + "description": "soft block creation request body", "name": "body", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/server.CreateAssignmentRequestBody" + "$ref": "#/definitions/softblocks.BuildSoftBlockRequestBody" } } ], @@ -35,29 +51,31 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/server.ProposeBlockResponse" - } - }, - "422": { - "description": "prover does not have capacity", - "schema": { - "type": "string" + "$ref": "#/definitions/softblocks.BuildSoftBlockResponseBody" } } } - } - }, - "/status": { - "get": { + }, + "delete": { + "description": "Remove all soft blocks from the blockchain beyond the specified block height,\nensuring the latest block ID does not exceed the given height. This method will fail if\nthe block with an ID one greater than the specified height is not a soft block. If the\nspecified block height is greater than the latest soft block ID, the method will succeed\nwithout modifying the blockchain.", "consumes": ["application/json"], "produces": ["application/json"], - "summary": "Get current prover server status", - "operationId": "get-status", + "parameters": [ + { + "description": "soft blocks removing request body", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/softblocks.RemoveSoftBlocksRequestBody" + } + } + ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/server.Status" + "$ref": "#/definitions/softblocks.RemoveSoftBlocksResponseBody" } } } @@ -65,45 +83,121 @@ } }, "definitions": { - "server.CreateAssignmentRequestBody": { + "big.Int": { + "type": "object" + }, + "softblocks.BuildSoftBlockRequestBody": { "type": "object", "properties": { - "blobHash": { - "type": "array", - "items": { - "type": "integer" - } + "transactionBatch": { + "description": "@param transactionBatch TransactionBatch Transaction batch to be inserted into the soft block", + "allOf": [ + { + "$ref": "#/definitions/softblocks.TransactionBatch" + } + ] + } + } + }, + "softblocks.BuildSoftBlockResponseBody": { + "type": "object", + "properties": { + "blockHeader": { + "description": "@param blockHeader types.Header of the soft block", + "allOf": [ + { + "$ref": "#/definitions/types.Header" + } + ] + } + } + }, + "softblocks.RemoveSoftBlocksRequestBody": { + "type": "object", + "properties": { + "newLastBlockId": { + "description": "@param newLastBlockID uint64 New last block ID of the blockchain, it should\n@param not smaller than the canonical chain's highest block ID.", + "type": "integer" + } + } + }, + "softblocks.RemoveSoftBlocksResponseBody": { + "type": "object", + "properties": { + "headsRemoved": { + "description": "@param headsRemoved uint64 Number of soft heads removed", + "type": "integer" }, - "expiry": { + "lastBlockId": { + "description": "@param lastBlockID uint64 Current highest block ID of the blockchain (including soft blocks)", "type": "integer" }, - "feeToken": { - "type": "string" + "lastProposedBlockID": { + "description": "@param lastProposedBlockID uint64 Highest block ID of the cnonical chain", + "type": "integer" + } + } + }, + "softblocks.SoftBlockParams": { + "type": "object", + "properties": { + "anchorBlockID": { + "description": "@param anchorBlockID uint64 `_anchorBlockId` parameter of the `anchorV2` transaction in soft block", + "type": "integer" }, - "proposer": { - "type": "string" + "anchorStateRoot": { + "description": "@param anchorStateRoot string `_anchorStateRoot` parameter of the `anchorV2` transaction in soft block", + "type": "array", + "items": { + "type": "integer" + } }, - "tierFees": { + "coinbase": { + "description": "@param coinbase string Coinbase of the soft block", "type": "array", "items": { "type": "integer" } + }, + "timestamp": { + "description": "@param timestamp uint64 Timestamp of the soft block", + "type": "integer" } } }, - "server.ProposeBlockResponse": { + "softblocks.TransactionBatch": { "type": "object", "properties": { - "maxBlockID": { + "batchId": { + "description": "@param batchId uint64 ID of this transaction batch", "type": "integer" }, - "maxProposedIn": { + "batchType": { + "description": "@param batchType TransactionBatchMarker Marker of the transaction batch,\n@param either `end_of_block`, `end_of_preconf` or empty", + "allOf": [ + { + "$ref": "#/definitions/softblocks.TransactionBatchMarker" + } + ] + }, + "blockId": { + "description": "@param blockId uint64 Block ID of the soft block", "type": "integer" }, - "prover": { + "blockParams": { + "description": "@param blockParams SoftBlockParams Block parameters of the soft block", + "allOf": [ + { + "$ref": "#/definitions/softblocks.SoftBlockParams" + } + ] + }, + "signature": { + "description": "@param signature string Signature of this transaction batch", "type": "string" }, - "signedPayload": { + "transactions": { + "description": "@param transactions string zlib compressed RLP encoded bytes of a transactions list", "type": "array", "items": { "type": "integer" @@ -111,23 +205,129 @@ } } }, - "server.Status": { + "softblocks.TransactionBatchMarker": { + "type": "string", + "enum": ["", "endOfBlock", "endOfPreconf"], + "x-enum-varnames": [ + "BatchMarkerEmpty", + "BatchMarkerEOB", + "BatchMarkerEOP" + ] + }, + "types.Header": { "type": "object", "properties": { - "maxExpiry": { + "baseFeePerGas": { + "description": "BaseFee was added by EIP-1559 and is ignored in legacy headers.", + "allOf": [ + { + "$ref": "#/definitions/big.Int" + } + ] + }, + "blobGasUsed": { + "description": "BlobGasUsed was added by EIP-4844 and is ignored in legacy headers.", "type": "integer" }, - "minOptimisticTierFee": { + "difficulty": { + "$ref": "#/definitions/big.Int" + }, + "excessBlobGas": { + "description": "ExcessBlobGas was added by EIP-4844 and is ignored in legacy headers.", "type": "integer" }, - "minSgxAndZkVMTierFee": { + "extraData": { + "type": "array", + "items": { + "type": "integer" + } + }, + "gasLimit": { "type": "integer" }, - "minSgxTierFee": { + "gasUsed": { "type": "integer" }, - "prover": { - "type": "string" + "logsBloom": { + "type": "array", + "items": { + "type": "integer" + } + }, + "miner": { + "type": "array", + "items": { + "type": "integer" + } + }, + "mixHash": { + "type": "array", + "items": { + "type": "integer" + } + }, + "nonce": { + "type": "array", + "items": { + "type": "integer" + } + }, + "number": { + "$ref": "#/definitions/big.Int" + }, + "parentBeaconBlockRoot": { + "description": "ParentBeaconRoot was added by EIP-4788 and is ignored in legacy headers.", + "type": "array", + "items": { + "type": "integer" + } + }, + "parentHash": { + "type": "array", + "items": { + "type": "integer" + } + }, + "receiptsRoot": { + "type": "array", + "items": { + "type": "integer" + } + }, + "requestsRoot": { + "description": "RequestsHash was added by EIP-7685 and is ignored in legacy headers.", + "type": "array", + "items": { + "type": "integer" + } + }, + "sha3Uncles": { + "type": "array", + "items": { + "type": "integer" + } + }, + "stateRoot": { + "type": "array", + "items": { + "type": "integer" + } + }, + "timestamp": { + "type": "integer" + }, + "transactionsRoot": { + "type": "array", + "items": { + "type": "integer" + } + }, + "withdrawalsRoot": { + "description": "WithdrawalsHash was added by EIP-4895 and is ignored in legacy headers.", + "type": "array", + "items": { + "type": "integer" + } } } } diff --git a/packages/taiko-client/docs/swagger.yaml b/packages/taiko-client/docs/swagger.yaml index 1c1a1495322..88bafda32e4 100644 --- a/packages/taiko-client/docs/swagger.yaml +++ b/packages/taiko-client/docs/swagger.yaml @@ -1,46 +1,193 @@ definitions: - server.CreateAssignmentRequestBody: + big.Int: + type: object + softblocks.BuildSoftBlockRequestBody: + properties: + transactionBatch: + allOf: + - $ref: "#/definitions/softblocks.TransactionBatch" + description: + "@param transactionBatch TransactionBatch Transaction batch to + be inserted into the soft block" + type: object + softblocks.BuildSoftBlockResponseBody: + properties: + blockHeader: + allOf: + - $ref: "#/definitions/types.Header" + description: "@param blockHeader types.Header of the soft block" + type: object + softblocks.RemoveSoftBlocksRequestBody: + properties: + newLastBlockId: + description: |- + @param newLastBlockID uint64 New last block ID of the blockchain, it should + @param not smaller than the canonical chain's highest block ID. + type: integer + type: object + softblocks.RemoveSoftBlocksResponseBody: + properties: + headsRemoved: + description: "@param headsRemoved uint64 Number of soft heads removed" + type: integer + lastBlockId: + description: + "@param lastBlockID uint64 Current highest block ID of the blockchain + (including soft blocks)" + type: integer + lastProposedBlockID: + description: + "@param lastProposedBlockID uint64 Highest block ID of the cnonical + chain" + type: integer + type: object + softblocks.SoftBlockParams: properties: - blobHash: + anchorBlockID: + description: + "@param anchorBlockID uint64 `_anchorBlockId` parameter of the + `anchorV2` transaction in soft block" + type: integer + anchorStateRoot: + description: + "@param anchorStateRoot string `_anchorStateRoot` parameter of + the `anchorV2` transaction in soft block" items: type: integer type: array - expiry: - type: integer - feeToken: - type: string - proposer: - type: string - tierFees: + coinbase: + description: "@param coinbase string Coinbase of the soft block" items: type: integer type: array + timestamp: + description: "@param timestamp uint64 Timestamp of the soft block" + type: integer type: object - server.ProposeBlockResponse: + softblocks.TransactionBatch: properties: - maxBlockID: + batchId: + description: "@param batchId uint64 ID of this transaction batch" type: integer - maxProposedIn: + batchType: + allOf: + - $ref: "#/definitions/softblocks.TransactionBatchMarker" + description: |- + @param batchType TransactionBatchMarker Marker of the transaction batch, + @param either `end_of_block`, `end_of_preconf` or empty + blockId: + description: "@param blockId uint64 Block ID of the soft block" type: integer - prover: + blockParams: + allOf: + - $ref: "#/definitions/softblocks.SoftBlockParams" + description: + "@param blockParams SoftBlockParams Block parameters of the soft + block" + signature: + description: "@param signature string Signature of this transaction batch" type: string - signedPayload: + transactions: + description: + "@param transactions string zlib compressed RLP encoded bytes + of a transactions list" items: type: integer type: array type: object - server.Status: + softblocks.TransactionBatchMarker: + enum: + - "" + - endOfBlock + - endOfPreconf + type: string + x-enum-varnames: + - BatchMarkerEmpty + - BatchMarkerEOB + - BatchMarkerEOP + types.Header: properties: - maxExpiry: + baseFeePerGas: + allOf: + - $ref: "#/definitions/big.Int" + description: BaseFee was added by EIP-1559 and is ignored in legacy headers. + blobGasUsed: + description: BlobGasUsed was added by EIP-4844 and is ignored in legacy headers. type: integer - minOptimisticTierFee: + difficulty: + $ref: "#/definitions/big.Int" + excessBlobGas: + description: + ExcessBlobGas was added by EIP-4844 and is ignored in legacy + headers. type: integer - minSgxAndZkVMTierFee: + extraData: + items: + type: integer + type: array + gasLimit: type: integer - minSgxTierFee: + gasUsed: type: integer - prover: - type: string + logsBloom: + items: + type: integer + type: array + miner: + items: + type: integer + type: array + mixHash: + items: + type: integer + type: array + nonce: + items: + type: integer + type: array + number: + $ref: "#/definitions/big.Int" + parentBeaconBlockRoot: + description: + ParentBeaconRoot was added by EIP-4788 and is ignored in legacy + headers. + items: + type: integer + type: array + parentHash: + items: + type: integer + type: array + receiptsRoot: + items: + type: integer + type: array + requestsRoot: + description: RequestsHash was added by EIP-7685 and is ignored in legacy headers. + items: + type: integer + type: array + sha3Uncles: + items: + type: integer + type: array + stateRoot: + items: + type: integer + type: array + timestamp: + type: integer + transactionsRoot: + items: + type: integer + type: array + withdrawalsRoot: + description: + WithdrawalsHash was added by EIP-4895 and is ignored in legacy + headers. + items: + type: integer + type: array type: object info: contact: @@ -49,45 +196,71 @@ info: url: https://community.taiko.xyz/ license: name: MIT - url: https://github.com/taikoxyz/taiko-mono/packages/taiko-client/blob/main/LICENSE.md + url: https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md termsOfService: http://swagger.io/terms/ - title: Taiko Prover Server API + title: Taiko Soft Block Server API version: "1.0" paths: - /assignment: - post: + /healthz: + get: + consumes: + - application/json + operationId: health-check + produces: + - application/json + responses: + "200": + description: OK + schema: + type: string + summary: Get current server health status + /softBlocks: + delete: consumes: - application/json + description: |- + Remove all soft blocks from the blockchain beyond the specified block height, + ensuring the latest block ID does not exceed the given height. This method will fail if + the block with an ID one greater than the specified height is not a soft block. If the + specified block height is greater than the latest soft block ID, the method will succeed + without modifying the blockchain. parameters: - - description: assignment request body + - description: soft blocks removing request body in: body name: body required: true schema: - $ref: "#/definitions/server.CreateAssignmentRequestBody" + $ref: "#/definitions/softblocks.RemoveSoftBlocksRequestBody" produces: - application/json responses: "200": description: OK schema: - $ref: "#/definitions/server.ProposeBlockResponse" - "422": - description: prover does not have capacity - schema: - type: string - summary: Try to accept a block proof assignment - /status: - get: + $ref: "#/definitions/softblocks.RemoveSoftBlocksResponseBody" + post: consumes: - application/json - operationId: get-status + description: |- + Insert a batch of transactions into a soft block for preconfirmation. If the batch is the + first for a block, a new soft block will be created. Otherwise, the transactions will + be appended to the existing soft block. The API will fail if: + 1) the block is not soft + 2) block-level parameters are invalid or do not match the current soft block’s parameters + 3) the batch ID is not exactly 1 greater than the previous one + 4) the last batch of the block indicates no further transactions are allowed + parameters: + - description: soft block creation request body + in: body + name: body + required: true + schema: + $ref: "#/definitions/softblocks.BuildSoftBlockRequestBody" produces: - application/json responses: "200": description: OK schema: - $ref: "#/definitions/server.Status" - summary: Get current prover server status + $ref: "#/definitions/softblocks.BuildSoftBlockResponseBody" swagger: "2.0" diff --git a/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor.go b/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor.go index c17cbc5a0f5..5bc43b1fd6a 100644 --- a/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor.go +++ b/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor.go @@ -12,10 +12,11 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/signer" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) // AnchorTxConstructor is responsible for assembling the anchor transaction (TaikoL2.anchor) in @@ -69,12 +70,17 @@ func (c *AnchorTxConstructor) AssembleAnchorTx( return c.rpc.TaikoL2.Anchor(opts, l1Hash, l1Header.Root, l1Height.Uint64(), uint32(parentGasUsed)) } -func (c *AnchorTxConstructor) AssembleNullAnchorTx( +// AssembleAnchorV2Tx assembles a signed TaikoL2.anchorV2 transaction. +func (c *AnchorTxConstructor) AssembleAnchorV2Tx( ctx context.Context, - // Height of the L2 block which including the TaikoL2.anchor transaction. + // Parameters of the TaikoL2.anchorV2 transaction. + anchorBlockID *big.Int, + anchorStateRoot common.Hash, + parentGasUsed uint64, + baseFeeConfig *bindings.LibSharedDataBaseFeeConfig, + // Height of the L2 block which including the TaikoL2.anchorV2 transaction. l2Height *big.Int, baseFee *big.Int, - gasUsed uint64, ) (*types.Transaction, error) { opts, err := c.transactOpts(ctx, l2Height, baseFee) if err != nil { @@ -82,18 +88,22 @@ func (c *AnchorTxConstructor) AssembleNullAnchorTx( } log.Info( - "Null anchor arguments", + "AnchorV2 arguments", "l2Height", l2Height, + "anchorBlockId", anchorBlockID, + "anchorStateRoot", anchorStateRoot, + "parentGasUsed", parentGasUsed, + "gasIssuancePerSecond", baseFeeConfig.GasIssuancePerSecond, + "basefeeAdjustmentQuotient", baseFeeConfig.AdjustmentQuotient, "baseFee", utils.WeiToGWei(baseFee), - "gasUsed", gasUsed, ) - return c.rpc.TaikoL2.Anchor( + return c.rpc.TaikoL2.AnchorV2( opts, - common.BigToHash(common.Big0), - common.BigToHash(common.Big0), - common.Big0.Uint64(), - uint32(gasUsed), + anchorBlockID.Uint64(), + anchorStateRoot, + uint32(parentGasUsed), + *baseFeeConfig, ) } diff --git a/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor_test.go b/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor_test.go index 4b6e2831bdb..e5bb427a639 100644 --- a/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor_test.go +++ b/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor_test.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/suite" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" ) @@ -42,6 +43,20 @@ func (s *AnchorTxConstructorTestSuite) TestAssembleAnchorTx() { s.NotNil(tx) } +func (s *AnchorTxConstructorTestSuite) TestAssembleAnchorV2Tx() { + tx, err := s.c.AssembleAnchorV2Tx( + context.Background(), + s.l1Height, + s.l1Hash, + 1024, + &bindings.LibSharedDataBaseFeeConfig{}, + common.Big1, + common.Big256, + ) + s.Nil(err) + s.NotNil(tx) +} + func (s *AnchorTxConstructorTestSuite) TestNewAnchorTransactor() { goldenTouchAddress, err := s.RPCClient.TaikoL2.GOLDENTOUCHADDRESS(nil) s.Nil(err) diff --git a/packages/taiko-client/driver/chain_syncer/beaconsync/syncer.go b/packages/taiko-client/driver/chain_syncer/beaconsync/syncer.go index 62f49f762a3..0860dc9d46e 100644 --- a/packages/taiko-client/driver/chain_syncer/beaconsync/syncer.go +++ b/packages/taiko-client/driver/chain_syncer/beaconsync/syncer.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/log" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" @@ -71,9 +72,7 @@ func (s *Syncer) TriggerBeaconSync(blockID uint64) error { } fcRes, err := s.rpc.L2Engine.ForkchoiceUpdate(s.ctx, &engine.ForkchoiceStateV1{ - HeadBlockHash: headPayload.BlockHash, - SafeBlockHash: headPayload.BlockHash, - FinalizedBlockHash: headPayload.BlockHash, + HeadBlockHash: headPayload.BlockHash, }, nil) if err != nil { return err @@ -104,11 +103,22 @@ func (s *Syncer) getBlockPayload(ctx context.Context, blockID uint64) (*engine.E // If the sync mode is `full`, we need to verify the protocol verified block hash before syncing. if s.syncMode == downloader.FullSync.String() { - blockInfo, err := s.rpc.GetL2BlockInfo(ctx, new(big.Int).SetUint64(blockID)) + blockNum := new(big.Int).SetUint64(blockID) + var blockInfo bindings.TaikoDataBlockV2 + if s.state.IsOnTake(blockNum) { + blockInfo, err = s.rpc.GetL2BlockInfoV2(ctx, blockNum) + } else { + blockInfo, err = s.rpc.GetL2BlockInfo(ctx, blockNum) + } if err != nil { return nil, err } - ts, err := s.rpc.GetTransition(ctx, new(big.Int).SetUint64(blockInfo.BlockId), blockInfo.VerifiedTransitionId) + ts, err := s.rpc.GetTransition( + ctx, + new(big.Int).SetUint64(blockInfo.BlockId), + + uint32(blockInfo.VerifiedTransitionId.Uint64()), + ) if err != nil { return nil, err } diff --git a/packages/taiko-client/driver/chain_syncer/blob/soft_block.go b/packages/taiko-client/driver/chain_syncer/blob/soft_block.go new file mode 100644 index 00000000000..4c4e6e5064a --- /dev/null +++ b/packages/taiko-client/driver/chain_syncer/blob/soft_block.go @@ -0,0 +1,298 @@ +package blob + +import ( + "context" + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/common" + consensus "github.com/ethereum/go-ethereum/consensus/taiko" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + softblocks "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/soft_blocks" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" +) + +// InsertSoftBlockFromTransactionsBatch inserts a soft block into the L2 execution engine's blockchain +// from the given transactions batch. +func (s *Syncer) InsertSoftBlockFromTransactionsBatch( + ctx context.Context, + blockID uint64, + batchID uint64, + txListBytes []byte, + batchMarker softblocks.TransactionBatchMarker, + blockParams *softblocks.SoftBlockParams, +) (*types.Header, error) { + s.mutex.Lock() + defer s.mutex.Unlock() + + parent, err := s.rpc.L2.HeaderByNumber(ctx, new(big.Int).Sub(new(big.Int).SetUint64(blockID), common.Big1)) + if err != nil { + return nil, err + } + + if parent.Number.Uint64()+1 != blockID { + return nil, fmt.Errorf("parent block number (%d) is not equal to blockID - 1 (%d)", parent.Number.Uint64(), blockID) + } + + // Calculate the other block parameters + difficultyHashPaylaod, err := encoding.EncodeDifficultyCalcutionParams(blockID) + if err != nil { + return nil, fmt.Errorf("failed to encode `block.difficulty` calculation parameters: %w", err) + } + protocolConfigs, err := rpc.GetProtocolConfigs(s.rpc.TaikoL1, &bind.CallOpts{Context: ctx}) + if err != nil { + return nil, fmt.Errorf("failed to fetch protocol configs: %w", err) + } + + var ( + txList []*types.Transaction + fc = &engine.ForkchoiceStateV1{HeadBlockHash: parent.Hash()} + difficulty = crypto.Keccak256Hash(difficultyHashPaylaod) + extraData = encoding.EncodeBaseFeeConfig(&protocolConfigs.BaseFeeConfig) + ) + + if err := rlp.DecodeBytes(txListBytes, &txList); err != nil { + return nil, fmt.Errorf("failed to RLP decode txList bytes: %w", err) + } + + baseFee, err := s.rpc.CalculateBaseFee( + ctx, + parent, + new(big.Int).SetUint64(blockParams.AnchorBlockID), + true, + &protocolConfigs.BaseFeeConfig, + blockParams.Timestamp, + ) + if err != nil { + return nil, fmt.Errorf("failed to calculate base fee: %w", err) + } + + // Insert the anchor transaction at the head of the transactions list. + if batchID == 0 { + // Assemble a TaikoL2.anchorV2 transaction. + anchorTx, err := s.anchorConstructor.AssembleAnchorV2Tx( + ctx, + new(big.Int).SetUint64(blockParams.AnchorBlockID), + blockParams.AnchorStateRoot, + parent.GasUsed, + &protocolConfigs.BaseFeeConfig, + new(big.Int).SetUint64(blockID), + baseFee, + ) + if err != nil { + return nil, fmt.Errorf("failed to create TaikoL2.anchorV2 transaction: %w", err) + } + + txList = append([]*types.Transaction{anchorTx}, txList...) + } else { + prevSoftBlock, err := s.rpc.L2.BlockByNumber(ctx, new(big.Int).SetUint64(blockID)) + if err != nil { + return nil, fmt.Errorf("failed to fetch previous soft block (%d): %w", blockID, err) + } + + // Ensure the previous soft block is the current chain head. + blockNums, err := s.rpc.L2.BlockNumber(ctx) + if err != nil { + return nil, fmt.Errorf("failed to fetch the chain block number: %w", err) + } + + if prevSoftBlock.Number().Uint64() != blockNums { + return nil, fmt.Errorf( + "soft block (%d) to update is not the current chain head (%d)", + prevSoftBlock.Number().Uint64(), + blockNums, + ) + } + + // Check baseFee + if prevSoftBlock.BaseFee().Cmp(baseFee) != 0 { + return nil, fmt.Errorf( + "baseFee is not equal to the latest soft block's, expect: %s, actual: %s", + prevSoftBlock.BaseFee().String(), + baseFee.String(), + ) + } + + // Check the previous soft block status. + l1Origin, err := s.rpc.L2.L1OriginByID(ctx, prevSoftBlock.Number()) + if err != nil { + return nil, fmt.Errorf("failed to fetch L1 origin for block %d: %w", blockID, err) + } + if l1Origin.BatchID == nil { + return nil, fmt.Errorf("batch ID is nil for block %d", blockID) + } + if l1Origin.BatchID.Uint64()+1 != batchID { + return nil, fmt.Errorf("batch ID mismatch: expected %d, got %d", l1Origin.BatchID.Uint64()+1, batchID) + } + if l1Origin.EndOfBlock { + return nil, fmt.Errorf("soft block %d has already been marked as ended", blockID) + } + if l1Origin.EndOfPreconf { + return nil, fmt.Errorf("preconfirmation from %s has already been marked as ended", blockParams.Coinbase) + } + + txList = append(prevSoftBlock.Transactions(), txList...) + } + + if txListBytes, err = rlp.EncodeToBytes(txList); err != nil { + log.Error("Encode txList error", "blockID", blockID, "error", err) + return nil, err + } + + attributes := &engine.PayloadAttributes{ + Timestamp: blockParams.Timestamp, + Random: difficulty, + SuggestedFeeRecipient: blockParams.Coinbase, + Withdrawals: []*types.Withdrawal{}, + BlockMetadata: &engine.BlockMetadata{ + Beneficiary: blockParams.Coinbase, + GasLimit: uint64(protocolConfigs.BlockMaxGasLimit) + consensus.AnchorGasLimit, + Timestamp: blockParams.Timestamp, + TxList: txListBytes, + MixHash: difficulty, + ExtraData: extraData[:], + }, + BaseFeePerGas: baseFee, + L1Origin: &rawdb.L1Origin{ + BlockID: new(big.Int).SetUint64(blockID), + L2BlockHash: common.Hash{}, // Will be set by taiko-geth. + L1BlockHeight: nil, // No L1 block height for soft blocks. + L1BlockHash: common.Hash{}, // No L1 block hash for soft blocks. + BatchID: new(big.Int).SetUint64(batchID), + EndOfBlock: batchMarker == softblocks.BatchMarkerEOB, + EndOfPreconf: batchMarker == softblocks.BatchMarkerEOP, + Preconfer: blockParams.Coinbase, + }, + } + + log.Info( + "Soft block payloadAttributes", + "blockID", blockID, + "batchID", batchID, + "timestamp", attributes.Timestamp, + "random", attributes.Random, + "suggestedFeeRecipient", attributes.SuggestedFeeRecipient, + "withdrawals", len(attributes.Withdrawals), + "gasLimit", attributes.BlockMetadata.GasLimit, + "timestamp", attributes.BlockMetadata.Timestamp, + "mixHash", attributes.BlockMetadata.MixHash, + "baseFee", utils.WeiToGWei(attributes.BaseFeePerGas), + "extraData", common.Bytes2Hex(attributes.BlockMetadata.ExtraData), + "transactions", len(txList), + ) + + // Step 1, prepare a payload + fcRes, err := s.rpc.L2Engine.ForkchoiceUpdate(ctx, fc, attributes) + if err != nil { + return nil, fmt.Errorf("failed to update fork choice: %w", err) + } + if fcRes.PayloadStatus.Status != engine.VALID { + return nil, fmt.Errorf("unexpected ForkchoiceUpdate response status: %s", fcRes.PayloadStatus.Status) + } + if fcRes.PayloadID == nil { + return nil, errors.New("empty payload ID") + } + + // Step 2, get the payload + payload, err := s.rpc.L2Engine.GetPayload(ctx, fcRes.PayloadID) + if err != nil { + return nil, fmt.Errorf("failed to get payload: %w", err) + } + + log.Info( + "Soft block payload", + "blockID", blockID, + "batchID", batchID, + "baseFee", utils.WeiToGWei(payload.BaseFeePerGas), + "number", payload.Number, + "hash", payload.BlockHash, + "gasLimit", payload.GasLimit, + "gasUsed", payload.GasUsed, + "timestamp", payload.Timestamp, + "withdrawalsHash", payload.WithdrawalsHash, + ) + + // Step 3, execute the payload + execStatus, err := s.rpc.L2Engine.NewPayload(ctx, payload) + if err != nil { + return nil, fmt.Errorf("failed to create a new payload: %w", err) + } + if execStatus.Status != engine.VALID { + return nil, fmt.Errorf("unexpected NewPayload response status: %s", execStatus.Status) + } + + lastVerifiedBlockInfo, err := s.rpc.GetLastVerifiedBlock(ctx) + if err != nil { + return nil, fmt.Errorf("failed to fetch last verified block hash: %w", err) + } + + canonicalHead, err := s.rpc.L2.HeadL1Origin(ctx) + if err != nil { + return nil, fmt.Errorf("failed to fetch canonical head: %w", err) + } + + // Step 4, update the fork choice + fc = &engine.ForkchoiceStateV1{ + HeadBlockHash: payload.BlockHash, + SafeBlockHash: canonicalHead.L2BlockHash, + FinalizedBlockHash: lastVerifiedBlockInfo.BlockHash, + } + fcRes, err = s.rpc.L2Engine.ForkchoiceUpdate(ctx, fc, nil) + if err != nil { + return nil, err + } + if fcRes.PayloadStatus.Status != engine.VALID { + return nil, fmt.Errorf("unexpected ForkchoiceUpdate response status: %s", fcRes.PayloadStatus.Status) + } + + header, err := s.rpc.L2.HeaderByHash(ctx, payload.BlockHash) + if err != nil { + return nil, err + } + + log.Info( + "⏰ New soft L2 block inserted", + "blockID", blockID, + "batchID", batchID, + "hash", header.Hash(), + "transactions", len(payload.Transactions), + "baseFee", utils.WeiToGWei(header.BaseFee), + "withdrawals", len(payload.Withdrawals), + "endOfBlock", attributes.L1Origin.EndOfBlock, + "endOfPreconf", attributes.L1Origin.EndOfPreconf, + ) + + return header, nil +} + +// RemoveSoftBlocks removes soft blocks from the L2 execution engine's blockchain. +func (s *Syncer) RemoveSoftBlocks(ctx context.Context, newLastBlockID uint64) error { + s.mutex.Lock() + defer s.mutex.Unlock() + + newHead, err := s.rpc.L2.HeaderByNumber(ctx, new(big.Int).SetUint64(newLastBlockID)) + if err != nil { + return err + } + + fc := &engine.ForkchoiceStateV1{HeadBlockHash: newHead.Hash()} + fcRes, err := s.rpc.L2Engine.ForkchoiceUpdate(ctx, fc, nil) + if err != nil { + return err + } + if fcRes.PayloadStatus.Status != engine.VALID { + return fmt.Errorf("unexpected ForkchoiceUpdate response status: %s", fcRes.PayloadStatus.Status) + } + + return nil +} diff --git a/packages/taiko-client/driver/chain_syncer/blob/syncer.go b/packages/taiko-client/driver/chain_syncer/blob/syncer.go index e5765cb82a0..0182d98855e 100644 --- a/packages/taiko-client/driver/chain_syncer/blob/syncer.go +++ b/packages/taiko-client/driver/chain_syncer/blob/syncer.go @@ -6,6 +6,7 @@ import ( "fmt" "math/big" "net/url" + "sync" "time" "golang.org/x/exp/slog" @@ -21,12 +22,12 @@ import ( "github.com/ethereum/go-ethereum/rlp" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer/beaconsync" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" anchorTxConstructor "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/anchor_tx_constructor" txListDecompressor "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/txlist_decompressor" @@ -48,6 +49,7 @@ type Syncer struct { reorgDetectedFlag bool maxRetrieveExponent uint64 blobDatasource *rpc.BlobDataSource + mutex sync.Mutex } // NewSyncer creates a new syncer instance. @@ -60,14 +62,14 @@ func NewSyncer( blobServerEndpoint *url.URL, socialScanEndpoint *url.URL, ) (*Syncer, error) { - configs, err := client.TaikoL1.GetConfig(&bind.CallOpts{Context: ctx}) + constructor, err := anchorTxConstructor.New(client) if err != nil { - return nil, fmt.Errorf("failed to get protocol configs: %w", err) + return nil, fmt.Errorf("failed to initialize anchor constructor: %w", err) } - constructor, err := anchorTxConstructor.New(client) + protocolConfigs, err := rpc.GetProtocolConfigs(client.TaikoL1, &bind.CallOpts{Context: ctx}) if err != nil { - return nil, fmt.Errorf("failed to initialize anchor constructor: %w", err) + return nil, err } return &Syncer{ @@ -77,7 +79,7 @@ func NewSyncer( progressTracker: progressTracker, anchorConstructor: constructor, txListDecompressor: txListDecompressor.NewTxListDecompressor( - uint64(configs.BlockMaxGasLimit), + uint64(protocolConfigs.BlockMaxGasLimit), rpc.BlockMaxTxListBytes, client.L2.ChainID, ), @@ -94,6 +96,8 @@ func NewSyncer( // ProcessL1Blocks fetches all `TaikoL1.BlockProposed` events between given // L1 block heights, and then tries inserting them into L2 execution engine's blockchain. func (s *Syncer) ProcessL1Blocks(ctx context.Context) error { + s.mutex.Lock() + defer s.mutex.Unlock() for { if err := s.processL1Blocks(ctx); err != nil { return err @@ -135,6 +139,7 @@ func (s *Syncer) processL1Blocks(ctx context.Context) error { s.lastInsertedBlockID = nil } + log.Info("iterating", "start", s.state.GetL1Current().Number.String(), "end", l1End.Number.String()) iter, err := eventIterator.NewBlockProposedIterator(ctx, &eventIterator.BlockProposedIteratorConfig{ Client: s.rpc.L1, TaikoL1: s.rpc.TaikoL1, @@ -164,18 +169,20 @@ func (s *Syncer) processL1Blocks(ctx context.Context) error { // inserting the proposed block one by one to the L2 execution engine. func (s *Syncer) onBlockProposed( ctx context.Context, - event *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, endIter eventIterator.EndBlockProposedEventIterFunc, ) error { + log.Info("onBlockProposed", "blockID", meta.GetBlockID()) + // We simply ignore the genesis block's `BlockProposed` event. - if event.BlockId.Cmp(common.Big0) == 0 { + if meta.GetBlockID().Cmp(common.Big0) == 0 { return nil } // If we are not inserting a block whose parent block is the latest verified block in protocol, // and the node hasn't just finished the P2P sync, we check if the L1 chain has been reorged. if !s.progressTracker.Triggered() { - reorgCheckResult, err := s.checkReorg(ctx, event) + reorgCheckResult, err := s.checkReorg(ctx, meta.GetBlockID()) if err != nil { return err } @@ -199,23 +206,22 @@ func (s *Syncer) onBlockProposed( } } // Ignore those already inserted blocks. - if s.lastInsertedBlockID != nil && event.BlockId.Cmp(s.lastInsertedBlockID) <= 0 { + if s.lastInsertedBlockID != nil && meta.GetBlockID().Cmp(s.lastInsertedBlockID) <= 0 { return nil } log.Info( "New BlockProposed event", - "l1Height", event.Raw.BlockNumber, - "l1Hash", event.Raw.BlockHash, - "blockID", event.BlockId, - "removed", event.Raw.Removed, + "l1Height", meta.GetRawBlockHeight(), + "l1Hash", meta.GetRawBlockHash(), + "blockID", meta.GetBlockID(), ) // If the event's timestamp is in the future, we wait until the timestamp is reached, should // only happen when testing. - if event.Meta.Timestamp > uint64(time.Now().Unix()) { - log.Warn("Future L2 block, waiting", "L2BlockTimestamp", event.Meta.Timestamp, "now", time.Now().Unix()) - time.Sleep(time.Until(time.Unix(int64(event.Meta.Timestamp), 0))) + if meta.GetTimestamp() > uint64(time.Now().Unix()) { + log.Warn("Future L2 block, waiting", "L2BlockTimestamp", meta.GetTimestamp(), "now", time.Now().Unix()) + time.Sleep(time.Until(time.Unix(int64(meta.GetTimestamp()), 0))) } // Fetch the L2 parent block, if the node is just finished a P2P sync, we simply use the tracker's @@ -226,13 +232,13 @@ func (s *Syncer) onBlockProposed( ) if s.progressTracker.Triggered() { // Already synced through beacon sync, just skip this event. - if event.BlockId.Cmp(s.progressTracker.LastSyncedBlockID()) <= 0 { + if meta.GetBlockID().Cmp(s.progressTracker.LastSyncedBlockID()) <= 0 { return nil } parent, err = s.rpc.L2.HeaderByHash(ctx, s.progressTracker.LastSyncedBlockHash()) } else { - parent, err = s.rpc.L2ParentByBlockID(ctx, event.BlockId) + parent, err = s.rpc.L2ParentByBlockID(ctx, meta.GetBlockID()) } if err != nil { return fmt.Errorf("failed to fetch L2 parent block: %w", err) @@ -240,40 +246,44 @@ func (s *Syncer) onBlockProposed( log.Debug( "Parent block", - "height", parent.Number, + "blockID", parent.Number, "hash", parent.Hash(), "beaconSyncTriggered", s.progressTracker.Triggered(), ) - tx, err := s.rpc.L1.TransactionInBlock(ctx, event.Raw.BlockHash, event.Raw.TxIndex) + tx, err := s.rpc.L1.TransactionInBlock(ctx, meta.GetRawBlockHash(), meta.GetTxIndex()) if err != nil { return fmt.Errorf("failed to fetch original TaikoL1.proposeBlock transaction: %w", err) } // Decode transactions list. var txListFetcher txlistFetcher.TxListFetcher - if event.Meta.BlobUsed { + if meta.GetBlobUsed() { txListFetcher = txlistFetcher.NewBlobTxListFetcher(s.rpc.L1Beacon, s.blobDatasource) } else { - txListFetcher = new(txlistFetcher.CalldataFetcher) + txListFetcher = txlistFetcher.NewCalldataFetch(s.rpc) } - txListBytes, err := txListFetcher.Fetch(ctx, tx, &event.Meta) + txListBytes, err := txListFetcher.Fetch(ctx, tx, meta) if err != nil { - return fmt.Errorf("failed to fetch tx list: %w", err) + return fmt.Errorf("failed to get transaction receipt: %w", err) } // Decompress the transactions list and try to insert a new head block to L2 EE. payloadData, err := s.insertNewHead( ctx, - event, + meta, parent, - s.state.GetHeadBlockID(), - s.txListDecompressor.TryDecompress(event.BlockId, txListBytes, event.Meta.BlobUsed), + s.txListDecompressor.TryDecompress( + s.rpc.L2.ChainID, + meta.GetBlockID(), + txListBytes, + meta.GetBlobUsed(), + ), &rawdb.L1Origin{ - BlockID: event.BlockId, + BlockID: meta.GetBlockID(), L2BlockHash: common.Hash{}, // Will be set by taiko-geth. - L1BlockHeight: new(big.Int).SetUint64(event.Raw.BlockNumber), - L1BlockHash: event.Raw.BlockHash, + L1BlockHeight: meta.GetRawBlockHeight(), + L1BlockHash: meta.GetRawBlockHash(), }, ) if err != nil { @@ -284,16 +294,15 @@ func (s *Syncer) onBlockProposed( log.Info( "🔗 New L2 block inserted", - "blockID", event.BlockId, - "height", payloadData.Number, + "blockID", meta.GetBlockID(), "hash", payloadData.BlockHash, "transactions", len(payloadData.Transactions), "baseFee", utils.WeiToGWei(payloadData.BaseFeePerGas), "withdrawals", len(payloadData.Withdrawals), ) - metrics.DriverL1CurrentHeightGauge.Set(float64(event.Raw.BlockNumber)) - s.lastInsertedBlockID = event.BlockId + metrics.DriverL1CurrentHeightGauge.Set(float64(meta.GetRawBlockHeight().Uint64())) + s.lastInsertedBlockID = meta.GetBlockID() if s.progressTracker.Triggered() { s.progressTracker.ClearMeta() @@ -306,9 +315,8 @@ func (s *Syncer) onBlockProposed( // block chain through Engine APIs. func (s *Syncer) insertNewHead( ctx context.Context, - event *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, parent *types.Header, - headBlockID *big.Int, txListBytes []byte, l1Origin *rawdb.L1Origin, ) (*engine.ExecutableData, error) { @@ -316,81 +324,108 @@ func (s *Syncer) insertNewHead( "Try to insert a new L2 head block", "parentNumber", parent.Number, "parentHash", parent.Hash(), - "headBlockID", headBlockID, "l1Origin", l1Origin, ) - // Insert a TaikoL2.anchor transaction at transactions list head - var txList []*types.Transaction + // Insert a TaikoL2.anchor / TaikoL2.anchorV2 transaction at transactions list head + var ( + txList []*types.Transaction + anchorTx *types.Transaction + baseFee *big.Int + err error + ) if len(txListBytes) != 0 { if err := rlp.DecodeBytes(txListBytes, &txList); err != nil { - log.Error("Invalid txList bytes", "blockID", event.BlockId) + log.Error("Invalid txList bytes", "blockID", meta.GetBlockID()) return nil, err } } - // Get L2 baseFee - baseFeeInfo, err := s.rpc.TaikoL2.GetBasefee( - &bind.CallOpts{BlockNumber: parent.Number, Context: ctx}, - event.Meta.L1Height, - uint32(parent.GasUsed), - ) - if err != nil { - return nil, fmt.Errorf("failed to get L2 baseFee: %w", encoding.TryParsingCustomError(err)) + if baseFee, err = s.rpc.CalculateBaseFee( + ctx, + parent, + new(big.Int).SetUint64(meta.GetAnchorBlockID()), + meta.IsOntakeBlock(), + meta.GetBaseFeeConfig(), + meta.GetTimestamp(), + ); err != nil { + return nil, err + } + + if !meta.IsOntakeBlock() { + // Assemble a TaikoL2.anchor transaction + anchorTx, err = s.anchorConstructor.AssembleAnchorTx( + ctx, + new(big.Int).SetUint64(meta.GetAnchorBlockID()), + meta.GetAnchorBlockHash(), + new(big.Int).Add(parent.Number, common.Big1), + baseFee, + parent.GasUsed, + ) + if err != nil { + return nil, fmt.Errorf("failed to create TaikoL2.anchor transaction: %w", err) + } + } else { + // Assemble a TaikoL2.anchorV2 transaction + anchorBlockHeader, err := s.rpc.L1.HeaderByHash(ctx, meta.GetAnchorBlockHash()) + if err != nil { + return nil, fmt.Errorf("failed to fetch anchor block: %w", err) + } + anchorTx, err = s.anchorConstructor.AssembleAnchorV2Tx( + ctx, + new(big.Int).SetUint64(meta.GetAnchorBlockID()), + anchorBlockHeader.Root, + parent.GasUsed, + meta.GetBaseFeeConfig(), + new(big.Int).Add(parent.Number, common.Big1), + baseFee, + ) + if err != nil { + return nil, fmt.Errorf("failed to create TaikoL2.anchorV2 transaction: %w", err) + } } log.Info( "L2 baseFee", - "blockID", event.BlockId, - "baseFee", utils.WeiToGWei(baseFeeInfo.Basefee), - "syncedL1Height", event.Meta.L1Height, + "blockID", meta.GetBlockID(), + "baseFee", utils.WeiToGWei(baseFee), + "syncedL1Height", meta.GetRawBlockHeight(), "parentGasUsed", parent.GasUsed, ) - // Get withdrawals - withdrawals := make(types.Withdrawals, len(event.DepositsProcessed)) - for i, d := range event.DepositsProcessed { - withdrawals[i] = &types.Withdrawal{Address: d.Recipient, Amount: d.Amount.Uint64(), Index: d.Id} - } - - // Assemble a TaikoL2.anchor transaction - anchorTx, err := s.anchorConstructor.AssembleAnchorTx( - ctx, - new(big.Int).SetUint64(event.Meta.L1Height), - event.Meta.L1Hash, - new(big.Int).Add(parent.Number, common.Big1), - baseFeeInfo.Basefee, - parent.GasUsed, - ) - if err != nil { - return nil, fmt.Errorf("failed to create TaikoL2.anchor transaction: %w", err) - } - // Insert the anchor transaction at the head of the transactions list txList = append([]*types.Transaction{anchorTx}, txList...) if txListBytes, err = rlp.EncodeToBytes(txList); err != nil { - log.Error("Encode txList error", "blockID", event.BlockId, "error", err) + log.Error("Encode txList error", "blockID", meta.GetBlockID(), "error", err) return nil, err } payload, err := s.createExecutionPayloads( ctx, - event, + meta, parent.Hash(), l1Origin, - headBlockID, txListBytes, - baseFeeInfo.Basefee, - withdrawals, + baseFee, + make(types.Withdrawals, 0), ) if err != nil { return nil, fmt.Errorf("failed to create execution payloads: %w", err) } + var lastVerifiedBlockHash common.Hash + lastVerifiedBlockInfo, err := s.rpc.GetLastVerifiedBlock(ctx) + if err != nil { + return nil, fmt.Errorf("failed to fetch last verified block: %w", err) + } + if payload.Number > lastVerifiedBlockInfo.BlockId { + lastVerifiedBlockHash = lastVerifiedBlockInfo.BlockHash + } + fc := &engine.ForkchoiceStateV1{ HeadBlockHash: payload.BlockHash, SafeBlockHash: payload.BlockHash, - FinalizedBlockHash: payload.BlockHash, + FinalizedBlockHash: lastVerifiedBlockHash, } // Update the fork choice @@ -408,35 +443,21 @@ func (s *Syncer) insertNewHead( func (s *Syncer) MoveTheHead( ctx context.Context, txList []*types.Transaction, - gasUsed uint64, ) error { - lastInsertedBlockHeader, err := s.rpc.L1.HeaderByNumber(ctx, nil) + lastInsertedL1BlockHeader, err := s.rpc.L1.HeaderByNumber(ctx, nil) if err != nil { return fmt.Errorf("failed to get latest block ID from L1: %w", err) } - // Ignore those already inserted blocks. - // if s.lastInsertedBlockID != nil && event.BlockId.Cmp(s.lastInsertedBlockID) <= 0 { - if s.lastInsertedBlockID != nil && lastInsertedBlockHeader.Number.Cmp(s.lastInsertedBlockID) <= 0 { - return nil - } - - // Fetch the L2 parent block, if the node is just finished a P2P sync, we simply use the tracker's - // last synced verified block as the parent, otherwise, we fetch the parent block from L2 EE. - var ( - parent *types.Header - ) - if s.progressTracker.Triggered() { - parent, err = s.rpc.L2.HeaderByHash(ctx, s.progressTracker.LastSyncedBlockHash()) - } else { - // taking last block from L2 instead of parent based on L1 block id - // parent, err = s.rpc.L2ParentByBlockID(ctx, event.BlockId) - parent, err = s.rpc.L2.HeaderByNumber(ctx, nil) - } + // taking last block from L2 instead of parent based on L1 block id + parent, err := s.rpc.L2.HeaderByNumber(ctx, nil) if err != nil { return fmt.Errorf("failed to fetch L2 parent block: %w", err) } + //TODO: verify if this is correct (no other blocks will come in between) + newL2BlockID := new(big.Int).Add(parent.Number, common.Big1) + log.Debug( "Parent block", "height", parent.Number, @@ -451,21 +472,20 @@ func (s *Syncer) MoveTheHead( s.state.GetHeadBlockID(), txList, &rawdb.L1Origin{ - BlockID: lastInsertedBlockHeader.Number, // event.BlockId - L2BlockHash: common.Hash{}, // Will be set by taiko-geth. - L1BlockHeight: lastInsertedBlockHeader.Number, // new(big.Int).SetUint64(event.Raw.BlockNumber), - L1BlockHash: lastInsertedBlockHeader.Hash(), // event.Raw.BlockHash, + BlockID: newL2BlockID, // event.BlockId + L2BlockHash: common.Hash{}, // Will be set by taiko-geth. + L1BlockHeight: lastInsertedL1BlockHeader.Number, // new(big.Int).SetUint64(event.Raw.BlockNumber), + L1BlockHash: lastInsertedL1BlockHeader.Hash(), // event.Raw.BlockHash, }, - gasUsed, ) if err != nil { return fmt.Errorf("failed to insert new head to L2 execution engine: %w", err) } //(float64(event.Raw.BlockNumber)) - metrics.DriverL1CurrentHeightGauge.Set(float64(lastInsertedBlockHeader.Number.Uint64())) + metrics.DriverL1CurrentHeightGauge.Set(float64(lastInsertedL1BlockHeader.Number.Uint64())) //event.BlockId - s.lastInsertedBlockID = lastInsertedBlockHeader.Number + s.lastInsertedBlockID = newL2BlockID if s.progressTracker.Triggered() { s.progressTracker.ClearMeta() @@ -482,7 +502,6 @@ func (s *Syncer) insertNewHeadUsingDecodedTxList( headBlockID *big.Int, txList []*types.Transaction, l1Origin *rawdb.L1Origin, - gasUsed uint64, ) error { log.Debug( "Try to insert a new L2 head block", @@ -492,42 +511,50 @@ func (s *Syncer) insertNewHeadUsingDecodedTxList( "l1Origin", l1Origin, ) - l1Height, err := s.rpc.L1.BlockNumber(ctx) - if err != nil { - return fmt.Errorf("failed to get L1 height: %w", err) - } + // l1Height, err := s.rpc.L1.BlockNumber(ctx) + // if err != nil { + // return fmt.Errorf("failed to get L1 height: %w", err) + // } // Get L2 baseFee - baseFeeInfo, err := s.rpc.TaikoL2.GetBasefee( - &bind.CallOpts{BlockNumber: parent.Number, Context: ctx}, - l1Height, // event.Meta.L1Height, - uint32(parent.GasUsed), + var ( + baseFee *big.Int + err error ) - if err != nil { - return fmt.Errorf("failed to get L2 baseFee: %w", encoding.TryParsingCustomError(err)) + if baseFee, err = s.rpc.CalculateBaseFee( + ctx, + parent, + nil, + true, + // TODO: get from config? + &bindings.LibSharedDataBaseFeeConfig{ + GasIssuancePerSecond: uint32(1000000000), + AdjustmentQuotient: uint8(200), + MinGasExcess: uint64(1000000000), + MaxGasIssuancePerBlock: uint32(1000000000), + }, + uint64(time.Now().Unix()), + ); err != nil { + return err } log.Info( "L2 baseFee", "blockID", l1Origin.BlockID, // event.BlockId, - "baseFee", utils.WeiToGWei(baseFeeInfo.Basefee), + "baseFee", utils.WeiToGWei(baseFee), "syncedL1Height", l1Origin.BlockID, // event.Meta.L1Height, "parentGasUsed", parent.GasUsed, ) - // Get withdrawals - withdrawals := types.Withdrawals{} - // withdrawals := make(types.Withdrawals, len(l1Origin.DepositsProcessed)) - // for i, d := range l1Origin.DepositsProcessed { - // withdrawals[i] = &types.Withdrawal{Address: d.Recipient, Amount: d.Amount.Uint64(), Index: d.Id} - // } - // Assemble a TaikoL2.anchor transaction - anchorTx, err := s.anchorConstructor.AssembleNullAnchorTx( + l1CurrentBlock := s.state.GetL1Current() + anchorTx, err := s.anchorConstructor.AssembleAnchorTx( ctx, + new(big.Int).SetUint64(l1CurrentBlock.Number.Uint64()), + l1CurrentBlock.Hash(), new(big.Int).Add(parent.Number, common.Big1), - baseFeeInfo.Basefee, - gasUsed, + baseFee, + parent.GasUsed, ) if err != nil { return fmt.Errorf("failed to create TaikoL2.anchor transaction: %w", err) @@ -551,19 +578,18 @@ func (s *Syncer) insertNewHeadUsingDecodedTxList( nil, parent.Hash(), l1Origin, - headBlockID, txListBytes, - baseFeeInfo.Basefee, - withdrawals, + baseFee, + make(types.Withdrawals, 0), ) if err != nil { return fmt.Errorf("failed to create execution payloads: %w", err) } - + finalized := s.state.GetL2Head().Hash() fc := &engine.ForkchoiceStateV1{ HeadBlockHash: payload.BlockHash, - SafeBlockHash: payload.BlockHash, - FinalizedBlockHash: payload.BlockHash, + SafeBlockHash: finalized, + FinalizedBlockHash: finalized, } // Update the fork choice @@ -584,10 +610,9 @@ func (s *Syncer) insertNewHeadUsingDecodedTxList( // Engine APIs. func (s *Syncer) createExecutionPayloads( ctx context.Context, - event *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, parentHash common.Hash, l1Origin *rawdb.L1Origin, - headBlockID *big.Int, txListBytes []byte, baseFee *big.Int, withdrawals types.Withdrawals, @@ -595,7 +620,7 @@ func (s *Syncer) createExecutionPayloads( fc := &engine.ForkchoiceStateV1{HeadBlockHash: parentHash} var attributes *engine.PayloadAttributes - if event == nil { + if meta == nil { currentTimestamp := uint64(time.Now().Unix()) attributes = &engine.PayloadAttributes{ Timestamp: currentTimestamp, @@ -603,44 +628,42 @@ func (s *Syncer) createExecutionPayloads( SuggestedFeeRecipient: common.Address{}, Withdrawals: withdrawals, BlockMetadata: &engine.BlockMetadata{ - HighestBlockID: headBlockID, - Beneficiary: common.Address{}, - GasLimit: 240000000 + consensus.AnchorGasLimit, //TODO: replace constant with value from config - Timestamp: currentTimestamp, - TxList: txListBytes, - MixHash: common.Hash{}, - ExtraData: []byte{}, + Beneficiary: common.Address{}, + GasLimit: 240000000 + consensus.AnchorGasLimit, //TODO: replace constant with value from config + Timestamp: currentTimestamp, + TxList: txListBytes, + MixHash: common.Hash{}, + ExtraData: []byte{}, }, BaseFeePerGas: baseFee, L1Origin: l1Origin, } } else { attributes = &engine.PayloadAttributes{ - Timestamp: event.Meta.Timestamp, - Random: event.Meta.Difficulty, - SuggestedFeeRecipient: event.Meta.Coinbase, + Timestamp: meta.GetTimestamp(), + Random: meta.GetDifficulty(), + SuggestedFeeRecipient: meta.GetCoinbase(), Withdrawals: withdrawals, BlockMetadata: &engine.BlockMetadata{ - HighestBlockID: headBlockID, - Beneficiary: event.Meta.Coinbase, - GasLimit: uint64(event.Meta.GasLimit) + consensus.AnchorGasLimit, - Timestamp: event.Meta.Timestamp, - TxList: txListBytes, - MixHash: event.Meta.Difficulty, - ExtraData: event.Meta.ExtraData[:], + Beneficiary: meta.GetCoinbase(), + GasLimit: uint64(meta.GetGasLimit()) + consensus.AnchorGasLimit, + Timestamp: meta.GetTimestamp(), + TxList: txListBytes, + MixHash: meta.GetDifficulty(), + ExtraData: meta.GetExtraData(), }, BaseFeePerGas: baseFee, L1Origin: l1Origin, } log.Debug( - "Event GasLimit and Consensus AnchorGasLimit", - "eventGasLimit", event.Meta.GasLimit, + "Meta GasLimit and Consensus AnchorGasLimit", + "metaGasLimit", meta.GetGasLimit(), "consensusAnchorGasLimit", consensus.AnchorGasLimit, ) log.Debug( - "blockID", event.BlockId, + "blockID", meta.GetBlockID(), ) } log.Debug( @@ -649,12 +672,11 @@ func (s *Syncer) createExecutionPayloads( "random", attributes.Random, "suggestedFeeRecipient", attributes.SuggestedFeeRecipient, "withdrawals", len(attributes.Withdrawals), - "highestBlockID", attributes.BlockMetadata.HighestBlockID, "gasLimit", attributes.BlockMetadata.GasLimit, "timestamp", attributes.BlockMetadata.Timestamp, "mixHash", attributes.BlockMetadata.MixHash, "baseFee", utils.WeiToGWei(attributes.BaseFeePerGas), - "extraData", string(attributes.BlockMetadata.ExtraData), + "extraData", common.Bytes2Hex(attributes.BlockMetadata.ExtraData), "l1OriginHeight", attributes.L1Origin.L1BlockHeight, "l1OriginHash", attributes.L1Origin.L1BlockHash, ) @@ -677,8 +699,8 @@ func (s *Syncer) createExecutionPayloads( return nil, fmt.Errorf("failed to get payload: %w", err) } - if event != nil { - log.Debug("Event BlockId", "blockID", event.BlockId) + if meta != nil { + log.Debug("Meta BlockId", "blockID", meta.GetBlockID()) } log.Debug( "Payload", @@ -766,11 +788,22 @@ func (s *Syncer) retrievePastBlock( currentBlockID = 0 } - blockInfo, err := s.rpc.GetL2BlockInfo(ctx, new(big.Int).SetUint64(currentBlockID)) + blockNum := new(big.Int).SetUint64(currentBlockID) + var blockInfo bindings.TaikoDataBlockV2 + if s.state.IsOnTake(blockNum) { + blockInfo, err = s.rpc.GetL2BlockInfoV2(ctx, blockNum) + } else { + blockInfo, err = s.rpc.GetL2BlockInfo(ctx, blockNum) + } + if err != nil { return nil, err } - ts, err := s.rpc.GetTransition(ctx, new(big.Int).SetUint64(blockInfo.BlockId), blockInfo.VerifiedTransitionId) + ts, err := s.rpc.GetTransition( + ctx, + new(big.Int).SetUint64(blockInfo.BlockId), + uint32(blockInfo.VerifiedTransitionId.Uint64()), + ) if err != nil { return nil, err } @@ -827,7 +860,7 @@ func (s *Syncer) retrievePastBlock( // checkReorg checks whether the L1 chain has been reorged, and resets the L1Current cursor if necessary. func (s *Syncer) checkReorg( ctx context.Context, - event *bindings.TaikoL1ClientBlockProposed, + blockID *big.Int, ) (*rpc.ReorgCheckResult, error) { // If the L2 chain is at genesis, we don't need to check L1 reorg. if s.state.GetL1Current().Number == s.state.GenesisL1Height { @@ -844,7 +877,7 @@ func (s *Syncer) checkReorg( // 2. Parent block reorgCheckResult, err = s.rpc.CheckL1Reorg( ctx, - new(big.Int).Sub(event.BlockId, common.Big1), + new(big.Int).Sub(blockID, common.Big1), ) if err != nil { return nil, fmt.Errorf("failed to check whether L1 chain has been reorged: %w", err) diff --git a/packages/taiko-client/driver/chain_syncer/blob/syncer_test.go b/packages/taiko-client/driver/chain_syncer/blob/syncer_test.go index cfca064d497..062247a61ef 100644 --- a/packages/taiko-client/driver/chain_syncer/blob/syncer_test.go +++ b/packages/taiko-client/driver/chain_syncer/blob/syncer_test.go @@ -18,19 +18,22 @@ import ( "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer/beaconsync" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer" ) type BlobSyncerTestSuite struct { testutils.ClientTestSuite - s *Syncer - p testutils.Proposer + s *Syncer + p testutils.Proposer + eventChan chan *bindings.TaikoL1ClientBlockProposed } func (s *BlobSyncerTestSuite) SetupTest() { @@ -39,6 +42,8 @@ func (s *BlobSyncerTestSuite) SetupTest() { state2, err := state.New(context.Background(), s.RPCClient) s.Nil(err) + s.eventChan = make(chan *bindings.TaikoL1ClientBlockProposed, 200) + syncer, err := NewSyncer( context.Background(), s.RPCClient, @@ -53,28 +58,12 @@ func (s *BlobSyncerTestSuite) SetupTest() { s.initProposer() } -func (s *BlobSyncerTestSuite) TestCancelNewSyncer() { - ctx, cancel := context.WithCancel(context.Background()) - cancel() - syncer, err := NewSyncer( - ctx, - s.RPCClient, - s.s.state, - s.s.progressTracker, - 0, - nil, - nil, - ) - s.Nil(syncer) - s.NotNil(err) -} func (s *BlobSyncerTestSuite) TestProcessL1Blocks() { s.Nil(s.s.ProcessL1Blocks(context.Background())) } func (s *BlobSyncerTestSuite) TestProcessL1BlocksReorg() { - s.T().Skip("Skipping, preconfer changes") s.ProposeAndInsertEmptyBlocks(s.p, s.s) s.Nil(s.s.ProcessL1Blocks(context.Background())) } @@ -82,12 +71,12 @@ func (s *BlobSyncerTestSuite) TestProcessL1BlocksReorg() { func (s *BlobSyncerTestSuite) TestOnBlockProposed() { s.Nil(s.s.onBlockProposed( context.Background(), - &bindings.TaikoL1ClientBlockProposed{BlockId: common.Big0}, + &metadata.TaikoDataBlockMetadataOntake{TaikoDataBlockMetadataV2: bindings.TaikoDataBlockMetadataV2{Id: 0}}, func() {}, )) s.NotNil(s.s.onBlockProposed( context.Background(), - &bindings.TaikoL1ClientBlockProposed{BlockId: common.Big1}, + &metadata.TaikoDataBlockMetadataOntake{TaikoDataBlockMetadataV2: bindings.TaikoDataBlockMetadataV2{Id: 1}}, func() {}, )) } @@ -97,23 +86,28 @@ func (s *BlobSyncerTestSuite) TestInsertNewHead() { s.Nil(err) l1Head, err := s.s.rpc.L1.BlockByNumber(context.Background(), nil) s.Nil(err) + protocolConfigs, err := s.s.rpc.TaikoL1.GetConfig(nil) + s.Nil(err) _, err = s.s.insertNewHead( context.Background(), - &bindings.TaikoL1ClientBlockProposed{ - BlockId: common.Big1, - Meta: bindings.TaikoDataBlockMetadata{ - Id: 1, - L1Height: l1Head.NumberU64(), - L1Hash: l1Head.Hash(), - Coinbase: common.BytesToAddress(testutils.RandomBytes(1024)), - BlobHash: testutils.RandomHash(), - Difficulty: testutils.RandomHash(), - GasLimit: utils.RandUint32(nil), - Timestamp: uint64(time.Now().Unix()), + &metadata.TaikoDataBlockMetadataOntake{ + TaikoDataBlockMetadataV2: bindings.TaikoDataBlockMetadataV2{ + Id: 1, + AnchorBlockId: l1Head.NumberU64(), + AnchorBlockHash: l1Head.Hash(), + Coinbase: common.BytesToAddress(testutils.RandomBytes(1024)), + BlobHash: testutils.RandomHash(), + Difficulty: testutils.RandomHash(), + GasLimit: utils.RandUint32(nil), + Timestamp: uint64(time.Now().Unix()), + BaseFeeConfig: protocolConfigs.BaseFeeConfig, + }, + Log: types.Log{ + BlockNumber: l1Head.Number().Uint64(), + BlockHash: l1Head.Hash(), }, }, parent, - common.Big2, []byte{}, &rawdb.L1Origin{ BlockID: common.Big1, @@ -142,7 +136,6 @@ func (s *BlobSyncerTestSuite) TestInsertNewHeadUsingDecodedTxList() { L1BlockHeight: common.Big1, L1BlockHash: l1Head.Hash(), }, - 100000000, ) s.Nil(err) } @@ -172,7 +165,6 @@ func (s *BlobSyncerTestSuite) TestMoveTheHead() { err = s.s.MoveTheHead( context.Background(), txList, - 100000000, ) s.Nil(err) @@ -228,7 +220,10 @@ func (s *BlobSyncerTestSuite) FetchChainID() (*big.Int, error) { } func (s *BlobSyncerTestSuite) TestTreasuryIncomeAllAnchors() { - s.T().Skip("Skipping, preconfer changes") + // TODO: Temporarily skip this test case when using l2_reth node. + if os.Getenv("L2_NODE") == "l2_reth" { + s.T().Skip() + } treasury := common.HexToAddress(os.Getenv("TREASURY")) s.NotZero(treasury.Big().Uint64()) @@ -247,11 +242,14 @@ func (s *BlobSyncerTestSuite) TestTreasuryIncomeAllAnchors() { s.Nil(err) s.Greater(headAfter, headBefore) - s.Zero(balanceAfter.Cmp(balance)) + s.Equal(1, balanceAfter.Cmp(balance)) } func (s *BlobSyncerTestSuite) TestTreasuryIncome() { - s.T().Skip("Skipping, preconfer changes") + // TODO: Temporarily skip this test case when using l2_reth node. + if os.Getenv("L2_NODE") == "l2_reth" { + s.T().Skip() + } treasury := common.HexToAddress(os.Getenv("TREASURY")) s.NotZero(treasury.Big().Uint64()) @@ -273,7 +271,11 @@ func (s *BlobSyncerTestSuite) TestTreasuryIncome() { s.Greater(headAfter, headBefore) s.True(balanceAfter.Cmp(balance) > 0) + protocolConfigs, err := rpc.GetProtocolConfigs(s.RPCClient.TaikoL1, nil) + s.Nil(err) + var hasNoneAnchorTxs bool + chainConfig := config.NewChainConfig(&protocolConfigs) for i := headBefore + 1; i <= headAfter; i++ { block, err := s.RPCClient.L2.BlockByNumber(context.Background(), new(big.Int).SetUint64(i)) s.Nil(err) @@ -290,8 +292,16 @@ func (s *BlobSyncerTestSuite) TestTreasuryIncome() { s.Nil(err) fee := new(big.Int).Mul(block.BaseFee(), new(big.Int).SetUint64(receipt.GasUsed)) - - balance = new(big.Int).Add(balance, fee) + if chainConfig.IsOntake(block.Number()) { + feeCoinbase := new(big.Int).Div( + new(big.Int).Mul(fee, new(big.Int).SetUint64(uint64(chainConfig.ProtocolConfigs.BaseFeeConfig.SharingPctg))), + new(big.Int).SetUint64(100), + ) + feeTreasury := new(big.Int).Sub(fee, feeCoinbase) + balance = new(big.Int).Add(balance, feeTreasury) + } else { + balance = new(big.Int).Add(balance, fee) + } } } @@ -310,27 +320,35 @@ func (s *BlobSyncerTestSuite) initProposer() { s.Nil(prop.InitFromConfig(context.Background(), &proposer.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: string(jwtSecret), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: s.ProverEndpoints, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - MaxTierFeePriceBumps: 3, - TierFeePriceBump: common.Big2, - L1BlockBuilderTip: common.Big0, TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), @@ -344,7 +362,7 @@ func (s *BlobSyncerTestSuite) initProposer() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - })) + }, nil, nil)) s.p = prop } diff --git a/packages/taiko-client/driver/chain_syncer/chain_syncer.go b/packages/taiko-client/driver/chain_syncer/chain_syncer.go index 6e17215d73d..5402b5766f6 100644 --- a/packages/taiko-client/driver/chain_syncer/chain_syncer.go +++ b/packages/taiko-client/driver/chain_syncer/chain_syncer.go @@ -182,15 +182,14 @@ func (s *L2ChainSyncer) needNewBeaconSyncTriggered() (uint64, bool, error) { // For full sync mode, we will use the verified block head, // and for snap sync mode, we will use the latest block head. - var ( - blockID uint64 - err error - ) + var blockID uint64 switch s.syncMode { case downloader.SnapSync.String(): - if blockID, err = s.rpc.L2CheckPoint.BlockNumber(s.ctx); err != nil { + headL1Origin, err := s.rpc.L2CheckPoint.HeadL1Origin(s.ctx) + if err != nil { return 0, false, err } + blockID = headL1Origin.BlockID.Uint64() case downloader.FullSync.String(): stateVars, err := s.rpc.GetProtocolStateVariables(&bind.CallOpts{Context: s.ctx}) if err != nil { diff --git a/packages/taiko-client/driver/chain_syncer/chain_syncer_test.go b/packages/taiko-client/driver/chain_syncer/chain_syncer_test.go index 9360e02cc27..71a40d9729f 100644 --- a/packages/taiko-client/driver/chain_syncer/chain_syncer_test.go +++ b/packages/taiko-client/driver/chain_syncer/chain_syncer_test.go @@ -17,6 +17,7 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer" ) @@ -50,30 +51,40 @@ func (s *ChainSyncerTestSuite) SetupTest() { prop := new(proposer.Proposer) l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) s.Nil(err) + jwtSecret, err := jwt.ParseSecretFromFile(os.Getenv("JWT_SECRET")) + s.Nil(err) s.Nil(prop.InitFromConfig(context.Background(), &proposer.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), + JwtSecret: string(jwtSecret), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: s.ProverEndpoints, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - MaxTierFeePriceBumps: 3, - TierFeePriceBump: common.Big2, - ExtraData: "test", - L1BlockBuilderTip: common.Big0, TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), @@ -87,7 +98,7 @@ func (s *ChainSyncerTestSuite) SetupTest() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - })) + }, nil, nil)) s.p = prop } @@ -105,7 +116,7 @@ func (s *ChainSyncerTestSuite) TestAheadOfProtocolVerifiedHead2() { s.T().Skip("Skipping, preconfer changes") s.TakeSnapshot() // propose a couple blocks - s.ProposeAndInsertEmptyBlocks(s.p, s.s.blobSyncer) + blockMeta := s.ProposeAndInsertEmptyBlocks(s.p, s.s.blobSyncer) // NOTE: need to prove the proposed blocks to be verified, writing helper function // generate transactopts to interact with TaikoL1 contract with. @@ -119,7 +130,9 @@ func (s *ChainSyncerTestSuite) TestAheadOfProtocolVerifiedHead2() { l2Head, err := s.RPCClient.L2.HeaderByNumber(context.Background(), nil) s.Nil(err) - s.Equal("test", string(bytes.TrimRight(l2Head.Extra, "\x00"))) + if !blockMeta[len(blockMeta)-1].IsOntakeBlock() { + s.Equal("test", string(bytes.TrimRight(l2Head.Extra, "\x00"))) + } log.Info("L1HeaderByNumber head", "number", head.Number) // (equiv to s.state.GetL2Head().Number) log.Info("L2HeaderByNumber head", "number", l2Head.Number) diff --git a/packages/taiko-client/driver/config.go b/packages/taiko-client/driver/config.go index ebe792c7b47..ea8019f044f 100644 --- a/packages/taiko-client/driver/config.go +++ b/packages/taiko-client/driver/config.go @@ -17,12 +17,17 @@ import ( // Config contains the configurations to initialize a Taiko driver. type Config struct { *rpc.ClientConfig - P2PSync bool - P2PSyncTimeout time.Duration - RetryInterval time.Duration - MaxExponent uint64 - BlobServerEndpoint *url.URL - SocialScanEndpoint *url.URL + P2PSync bool + P2PSyncTimeout time.Duration + RetryInterval time.Duration + MaxExponent uint64 + BlobServerEndpoint *url.URL + SocialScanEndpoint *url.URL + RPCWriteTimeout time.Duration + SoftBlockServerPort uint64 + SoftBlockServerJWTSecret []byte + SoftBlockServerCORSOrigins string + SoftBlockServerCheckSig bool } // NewConfigFromCliContext creates a new config instance from @@ -42,8 +47,9 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { return nil, errors.New("empty L2 check point URL") } - if !c.IsSet(flags.L1BeaconEndpoint.Name) { - return nil, errors.New("empty L1 beacon endpoint") + var beaconEndpoint string + if c.IsSet(flags.L1BeaconEndpoint.Name) { + beaconEndpoint = c.String(flags.L1BeaconEndpoint.Name) } var blobServerEndpoint *url.URL @@ -64,11 +70,25 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { } } + if beaconEndpoint == "" && blobServerEndpoint == nil && socialScanEndpoint == nil { + return nil, errors.New("empty L1 beacon endpoint, blob server and Social Scan endpoint") + } + + var softBlockServerJWTSecret []byte + if c.String(flags.SoftBlockServerJWTSecret.Name) != "" { + if softBlockServerJWTSecret, err = jwt.ParseSecretFromFile( + c.String(flags.SoftBlockServerJWTSecret.Name), + ); err != nil { + return nil, fmt.Errorf("invalid JWT secret file: %w", err) + } + } + var timeout = c.Duration(flags.RPCTimeout.Name) + var rpcWriteTimeout = c.Duration(flags.RPCWriteTimeout.Name) return &Config{ ClientConfig: &rpc.ClientConfig{ L1Endpoint: c.String(flags.L1WSEndpoint.Name), - L1BeaconEndpoint: c.String(flags.L1BeaconEndpoint.Name), + L1BeaconEndpoint: beaconEndpoint, L2Endpoint: c.String(flags.L2WSEndpoint.Name), L2CheckPoint: l2CheckPoint, TaikoL1Address: common.HexToAddress(c.String(flags.TaikoL1Address.Name)), @@ -77,11 +97,16 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { JwtSecret: string(jwtSecret), Timeout: timeout, }, - RetryInterval: c.Duration(flags.BackOffRetryInterval.Name), - P2PSync: p2pSync, - P2PSyncTimeout: c.Duration(flags.P2PSyncTimeout.Name), - MaxExponent: c.Uint64(flags.MaxExponent.Name), - BlobServerEndpoint: blobServerEndpoint, - SocialScanEndpoint: socialScanEndpoint, + RetryInterval: c.Duration(flags.BackOffRetryInterval.Name), + P2PSync: p2pSync, + P2PSyncTimeout: c.Duration(flags.P2PSyncTimeout.Name), + MaxExponent: c.Uint64(flags.MaxExponent.Name), + BlobServerEndpoint: blobServerEndpoint, + SocialScanEndpoint: socialScanEndpoint, + RPCWriteTimeout: rpcWriteTimeout, + SoftBlockServerPort: c.Uint64(flags.SoftBlockServerPort.Name), + SoftBlockServerJWTSecret: softBlockServerJWTSecret, + SoftBlockServerCORSOrigins: c.String(flags.SoftBlockServerCORSOrigins.Name), + SoftBlockServerCheckSig: c.Bool(flags.SoftBlockServerCheckSig.Name), }, nil } diff --git a/packages/taiko-client/driver/config_test.go b/packages/taiko-client/driver/config_test.go index d6a94b0a0ee..f65359467dd 100644 --- a/packages/taiko-client/driver/config_test.go +++ b/packages/taiko-client/driver/config_test.go @@ -11,13 +11,13 @@ import ( ) var ( - l1Endpoint = os.Getenv("L1_NODE_WS_ENDPOINT") - l1BeaconEndpoint = os.Getenv("L1_NODE_HTTP_ENDPOINT") - l2Endpoint = os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT") - l2CheckPoint = os.Getenv("L2_EXECUTION_ENGINE_HTTP_ENDPOINT") - l2EngineEndpoint = os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT") - taikoL1 = os.Getenv("TAIKO_L1_ADDRESS") - taikoL2 = os.Getenv("TAIKO_L2_ADDRESS") + l1Endpoint = os.Getenv("L1_WS") + l1BeaconEndpoint = os.Getenv("L1_HTTP") + l2Endpoint = os.Getenv("L2_WS") + l2CheckPoint = os.Getenv("L2_HTTP") + l2EngineEndpoint = os.Getenv("L2_AUTH") + taikoL1 = os.Getenv("TAIKO_L1") + taikoL2 = os.Getenv("TAIKO_L2") ) func (s *DriverTestSuite) TestNewConfigFromCliContext() { diff --git a/packages/taiko-client/driver/driver.go b/packages/taiko-client/driver/driver.go index 77acfe1fd06..33f142bb9fc 100644 --- a/packages/taiko-client/driver/driver.go +++ b/packages/taiko-client/driver/driver.go @@ -22,6 +22,7 @@ import ( "github.com/urfave/cli/v2" chainSyncer "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer" + softblocks "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/soft_blocks" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) @@ -35,9 +36,10 @@ const ( // contract. type Driver struct { *Config - rpc *rpc.Client - l2ChainSyncer *chainSyncer.L2ChainSyncer - state *state.State + rpc *rpc.Client + l2ChainSyncer *chainSyncer.L2ChainSyncer + softblockServer *softblocks.SoftBlockAPIServer + state *state.State l1HeadCh chan *types.Header l1HeadSub event.Subscription @@ -63,10 +65,12 @@ func (d *Driver) InitFromConfig(ctx context.Context, cfg *Config) (err error) { d.Config = cfg if d.rpc, err = rpc.NewClient(d.ctx, cfg.ClientConfig); err != nil { + log.Error("error initializing rpc.NewClient", "error", err) return err } if d.state, err = state.New(d.ctx, d.rpc); err != nil { + log.Error("error initializing state.New", "error", err) return err } @@ -94,6 +98,18 @@ func (d *Driver) InitFromConfig(ctx context.Context, cfg *Config) (err error) { d.l1HeadSub = d.state.SubL1HeadsFeed(d.l1HeadCh) + if d.SoftBlockServerPort > 0 { + if d.softblockServer, err = softblocks.New( + d.SoftBlockServerCORSOrigins, + d.SoftBlockServerJWTSecret, + d.l2ChainSyncer.BlobSyncer(), + d.rpc, + d.Config.SoftBlockServerCheckSig, + ); err != nil { + return err + } + } + return nil } @@ -104,6 +120,16 @@ func (d *Driver) Start() error { go d.reportProtocolStatus() go d.exchangeTransitionConfigLoop() + // Start the soft block server if it is enabled. + if d.softblockServer != nil { + log.Info("Starting soft block server", "port", d.SoftBlockServerPort) + go func() { + if err := d.softblockServer.Start(d.SoftBlockServerPort); err != nil { + log.Crit("Failed to start soft block server", "error", err) + } + }() + } + return nil } @@ -111,6 +137,12 @@ func (d *Driver) Start() error { func (d *Driver) Close(_ context.Context) { d.l1HeadSub.Unsubscribe() d.state.Close() + // Close the soft block server if it is enabled. + if d.softblockServer != nil { + if err := d.softblockServer.Shutdown(d.ctx); err != nil { + log.Error("Failed to shutdown soft block server", "error", err) + } + } d.wg.Wait() } @@ -180,9 +212,15 @@ func (d *Driver) ChainSyncer() *chainSyncer.L2ChainSyncer { // reportProtocolStatus reports some protocol status intervally. func (d *Driver) reportProtocolStatus() { + protocolConfigs, err := rpc.GetProtocolConfigs(d.rpc.TaikoL1, &bind.CallOpts{Context: d.ctx}) + if err != nil { + log.Error("Failed to get protocol configs", "error", err) + return + } + var ( ticker = time.NewTicker(protocolStatusReportInterval) - maxNumBlocks uint64 + maxNumBlocks = protocolConfigs.BlockMaxProposals ) d.wg.Add(1) @@ -191,25 +229,6 @@ func (d *Driver) reportProtocolStatus() { d.wg.Done() }() - if err := backoff.Retry( - func() error { - if d.ctx.Err() != nil { - return nil - } - configs, err := d.rpc.TaikoL1.GetConfig(&bind.CallOpts{Context: d.ctx}) - if err != nil { - return err - } - - maxNumBlocks = configs.BlockMaxProposals - return nil - }, - backoff.WithContext(backoff.NewConstantBackOff(d.RetryInterval), d.ctx), - ); err != nil { - log.Error("Failed to get protocol state variables", "error", err) - return - } - for { select { case <-d.ctx.Done(): @@ -282,7 +301,7 @@ func (p *RPC) AdvanceL2ChainHeadWithNewBlocks(_ *http.Request, args *Args, reply syncer := p.driver.l2ChainSyncer.BlobSyncer() for _, txList := range args.TxLists { - err := syncer.MoveTheHead(p.driver.ctx, txList, args.GasUsed) + err := syncer.MoveTheHead(p.driver.ctx, txList) if err != nil { log.Error("Failed to move the head with new block", "error", err) return err @@ -304,13 +323,13 @@ func (d *Driver) startRPCServer() { } http.Handle("/rpc", s) - log.Info("Starting JSON-RPC server", "port", rpcPort) + log.Info("Starting JSON-RPC server", "port", rpcPort, "writeTimeout", d.RPCWriteTimeout) // Create a custom HTTP server with timeouts server := &http.Server{ Addr: fmt.Sprintf(":%d", rpcPort), Handler: s, ReadTimeout: 10 * time.Second, - WriteTimeout: 10 * time.Second, + WriteTimeout: d.RPCWriteTimeout, IdleTimeout: 15 * time.Second, } diff --git a/packages/taiko-client/driver/driver_test.go b/packages/taiko-client/driver/driver_test.go index 82f00fd9048..cbcac077581 100644 --- a/packages/taiko-client/driver/driver_test.go +++ b/packages/taiko-client/driver/driver_test.go @@ -1,18 +1,28 @@ package driver import ( + "bytes" + "compress/zlib" "context" + "fmt" "math/big" + "net/url" "os" "testing" "time" "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/go-resty/resty/v2" "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + softblocks "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/soft_blocks" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" @@ -38,11 +48,11 @@ func (s *DriverTestSuite) SetupTest() { ctx, cancel := context.WithCancel(context.Background()) s.Nil(d.InitFromConfig(ctx, &Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), JwtSecret: string(jwtSecret), }, })) @@ -58,7 +68,6 @@ func (s *DriverTestSuite) TestName() { } func (s *DriverTestSuite) TestProcessL1Blocks() { - s.T().Skip("Skipping, preconfer changes") l2Head1, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) s.Nil(err) @@ -87,20 +96,22 @@ func (s *DriverTestSuite) TestProcessL1Blocks() { txCount, err := s.d.rpc.L2.TransactionCount(context.Background(), header.Hash()) s.Nil(err) - s.Equal(uint(1), txCount) + s.GreaterOrEqual(txCount, uint(1)) anchorTx, err := s.d.rpc.L2.TransactionInBlock(context.Background(), header.Hash(), 0) s.Nil(err) method, err := encoding.TaikoL2ABI.MethodById(anchorTx.Data()) s.Nil(err) - s.Equal("anchor", method.Name) + s.Contains(method.Name, "anchor") } } func (s *DriverTestSuite) TestCheckL1ReorgToHigherFork() { - s.T().Skip("Skipping preconfer changes") - + // TODO: Temporarily skip this test case when use l2_reth node. + if os.Getenv("L2_NODE") == "l2_reth" { + s.T().Skip() + } var ( testnetL1SnapshotID = s.SetL1Snapshot() ) @@ -135,7 +146,7 @@ func (s *DriverTestSuite) TestCheckL1ReorgToHigherFork() { // Because of evm_revert operation, the nonce of the proposer need to be adjusted. // Propose ten blocks on another fork for i := 0; i < 10; i++ { - s.ProposeInvalidTxListBytes(s.p) + s.ProposeAndInsertValidBlock(s.p, s.d.ChainSyncer().BlobSyncer()) } l1Head4, err := s.d.rpc.L1.HeaderByNumber(context.Background(), nil) @@ -143,8 +154,6 @@ func (s *DriverTestSuite) TestCheckL1ReorgToHigherFork() { s.Greater(l1Head4.Number.Uint64(), l1Head2.Number.Uint64()) - s.Nil(s.d.ChainSyncer().BlobSyncer().ProcessL1Blocks(context.Background())) - l2Head3, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) s.Nil(err) @@ -157,7 +166,6 @@ func (s *DriverTestSuite) TestCheckL1ReorgToHigherFork() { } func (s *DriverTestSuite) TestCheckL1ReorgToLowerFork() { - s.T().Skip("Skipping, preconfer changes") var ( testnetL1SnapshotID = s.SetL1Snapshot() ) @@ -194,7 +202,7 @@ func (s *DriverTestSuite) TestCheckL1ReorgToLowerFork() { s.GreaterOrEqual(l1Head3.Number.Uint64(), l1Head1.Number.Uint64()) // Propose one blocks on another fork - s.ProposeInvalidTxListBytes(s.p) + s.ProposeValidBlock(s.p) l1Head4, err := s.d.rpc.L1.HeaderByNumber(context.Background(), nil) s.Nil(err) @@ -214,7 +222,7 @@ func (s *DriverTestSuite) TestCheckL1ReorgToLowerFork() { } func (s *DriverTestSuite) TestCheckL1ReorgToSameHeightFork() { - s.T().Skip("Skipping, preconfer changes") + s.T().Skip("Skip this test case because of the anvil timestamp issue after rollback.") var ( testnetL1SnapshotID = s.SetL1Snapshot() ) @@ -251,9 +259,9 @@ func (s *DriverTestSuite) TestCheckL1ReorgToSameHeightFork() { s.GreaterOrEqual(l1Head3.Number.Uint64(), l1Head1.Number.Uint64()) // Propose two blocks on another fork - s.ProposeInvalidTxListBytes(s.p) + s.ProposeValidBlock(s.p) time.Sleep(3 * time.Second) - s.ProposeInvalidTxListBytes(s.p) + s.ProposeValidBlock(s.p) l1Head4, err := s.d.rpc.L1.HeaderByNumber(context.Background(), nil) s.Nil(err) @@ -283,7 +291,6 @@ func (s *DriverTestSuite) TestStartClose() { } func (s *DriverTestSuite) TestL1Current() { - s.T().Skip("Skipping, preconfer changes") // propose and insert a block s.ProposeAndInsertEmptyBlocks(s.p, s.d.ChainSyncer().BlobSyncer()) // reset L1 current with increased height @@ -302,27 +309,20 @@ func (s *DriverTestSuite) InitProposer() { s.Nil(p.InitFromConfig(context.Background(), &proposer.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: string(jwtSecret), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: s.ProverEndpoints, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - MaxTierFeePriceBumps: 3, - TierFeePriceBump: common.Big2, - L1BlockBuilderTip: common.Big0, TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), @@ -336,10 +336,369 @@ func (s *DriverTestSuite) InitProposer() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - })) + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + }, nil, nil)) s.p = p } +func (s *DriverTestSuite) TestInsertSoftBlocks() { + var ( + port = uint64(testutils.RandomPort()) + err error + ) + s.d.softblockServer, err = softblocks.New("*", nil, s.d.ChainSyncer().BlobSyncer(), s.RPCClient, true) + s.Nil(err) + go func() { s.NotNil(s.d.softblockServer.Start(port)) }() + defer func() { s.Nil(s.d.softblockServer.Shutdown(s.d.ctx)) }() + + url, err := url.Parse(fmt.Sprintf("http://localhost:%v", port)) + s.Nil(err) + + l2Head1, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + s.Nil(s.d.ChainSyncer().BlobSyncer().ProcessL1Blocks(context.Background())) + + // Propose a valid L2 block + s.ProposeAndInsertValidBlock(s.p, s.d.ChainSyncer().BlobSyncer()) + + l2Head2, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + l1Head1, err := s.d.rpc.L1.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + s.Greater(l2Head2.Number.Uint64(), l2Head1.Number.Uint64()) + + res, err := resty.New().R().Get(url.String() + "/healthz") + s.Nil(err) + s.True(res.IsSuccess()) + + // Try to insert a soft block with batch ID 0 + s.True(s.insertSoftBlock(url, l1Head1, l2Head2.Number.Uint64()+1, 0, false, false).IsSuccess()) + l2Head3, err := s.d.rpc.L2.BlockByNumber(context.Background(), nil) + s.Nil(err) + + s.Equal(2, len(l2Head3.Transactions())) + + l1Origin, err := s.RPCClient.L2.L1OriginByID(context.Background(), new(big.Int).Add(l2Head2.Number, common.Big1)) + s.Nil(err) + s.Equal(l2Head3.Number().Uint64(), l1Origin.BlockID.Uint64()) + s.Equal(l2Head3.Hash(), l1Origin.L2BlockHash) + s.Equal(uint64(0), l1Origin.L1BlockHeight.Uint64()) + s.Equal(common.Hash{}, l1Origin.L1BlockHash) + s.Equal(false, l1Origin.EndOfBlock) + s.Equal(false, l1Origin.EndOfPreconf) + s.Equal(uint64(0), l1Origin.BatchID.Uint64()) + s.True(l1Origin.IsSoftBlock()) + + // Try to patch a soft block with batch ID 1 + s.True(s.insertSoftBlock(url, l1Head1, l2Head2.Number.Uint64()+1, 1, true, false).IsSuccess()) + l2Head4, err := s.d.rpc.L2.BlockByNumber(context.Background(), nil) + s.Nil(err) + s.Equal(3, len(l2Head4.Transactions())) + s.Equal(l2Head3.Number().Uint64(), l2Head4.Number().Uint64()) + s.NotEqual(l2Head3.Hash(), l2Head4.Hash()) + + l1Origin2, err := s.RPCClient.L2.L1OriginByID(context.Background(), new(big.Int).Add(l2Head2.Number, common.Big1)) + s.Nil(err) + s.Equal(l2Head4.Number().Uint64(), l1Origin2.BlockID.Uint64()) + s.Equal(l2Head4.Hash(), l1Origin2.L2BlockHash) + s.Equal(uint64(0), l1Origin2.L1BlockHeight.Uint64()) + s.Equal(common.Hash{}, l1Origin2.L1BlockHash) + s.Equal(true, l1Origin2.EndOfBlock) + s.Equal(false, l1Origin2.EndOfPreconf) + s.Equal(uint64(1), l1Origin2.BatchID.Uint64()) + s.True(l1Origin2.IsSoftBlock()) + + canonicalL1Origin, err := s.RPCClient.L2.HeadL1Origin(context.Background()) + s.Nil(err) + s.Equal(l2Head2.Number.Uint64(), canonicalL1Origin.BlockID.Uint64()) + + // Try to patch an ended soft block + s.False(s.insertSoftBlock(url, l1Head1, l2Head2.Number.Uint64()+1, 1, true, false).IsSuccess()) + + // Try to insert a new soft block with batch ID 0 + s.True(s.insertSoftBlock(url, l1Head1, l2Head2.Number.Uint64()+2, 0, false, false).IsSuccess()) + l2Head5, err := s.d.rpc.L2.BlockByNumber(context.Background(), nil) + s.Nil(err) + s.Equal(2, len(l2Head5.Transactions())) + + // Propose 3 valid L2 blocks + s.ProposeAndInsertEmptyBlocks(s.p, s.d.ChainSyncer().BlobSyncer()) + + l2Head6, err := s.d.rpc.L2.BlockByNumber(context.Background(), l2Head3.Number()) + s.Nil(err) + s.Equal(l2Head3.Number().Uint64(), l2Head6.Number().Uint64()) + s.Equal(1, len(l2Head6.Transactions())) + + l1Origin3, err := s.RPCClient.L2.L1OriginByID(context.Background(), l2Head6.Number()) + s.Nil(err) + s.Equal(l2Head3.Number().Uint64(), l1Origin3.BlockID.Uint64()) + s.Equal(l2Head6.Hash(), l1Origin3.L2BlockHash) + s.NotZero(l1Origin3.L1BlockHeight.Uint64()) + s.NotEmpty(l1Origin3.L1BlockHash) + s.Equal(false, l1Origin3.EndOfBlock) + s.Equal(false, l1Origin3.EndOfPreconf) + s.Nil(l1Origin3.BatchID) + s.False(l1Origin3.IsSoftBlock()) +} + +func (s *DriverTestSuite) TestInsertSoftBlocksAfterEOB() { + var ( + port = uint64(testutils.RandomPort()) + epochs = testutils.RandomHash().Big().Uint64()%10 + 5 + err error + ) + s.d.softblockServer, err = softblocks.New("*", nil, s.d.ChainSyncer().BlobSyncer(), s.RPCClient, true) + s.Nil(err) + go func() { s.NotNil(s.d.softblockServer.Start(port)) }() + defer func() { s.Nil(s.d.softblockServer.Shutdown(s.d.ctx)) }() + + url, err := url.Parse(fmt.Sprintf("http://localhost:%v", port)) + s.Nil(err) + + headL1Origin, err := s.RPCClient.L2.HeadL1Origin(context.Background()) + s.Nil(err) + + for range headL1Origin.BlockID.Uint64() + epochs + 1 { + s.ProposeAndInsertEmptyBlocks(s.p, s.d.ChainSyncer().BlobSyncer()) + } + + l1Head, err := s.d.rpc.L1.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + l2Head, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + for i := range epochs { + s.True(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1+i, 0, false, false).IsSuccess()) + s.True(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1+i, 1, true, false).IsSuccess()) + s.False(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1+i, 0, true, false).IsSuccess()) + } + s.True(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1+epochs, 0, true, false).IsSuccess()) + s.False(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1+epochs, 1, false, false).IsSuccess()) + s.True(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+2+epochs, 0, false, true).IsSuccess()) + s.False(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+2+epochs, 1, true, false).IsSuccess()) + + l2Head2, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + s.Equal(l2Head.Number.Uint64()+2+epochs, l2Head2.Number.Uint64()) + + l1Origin, err := s.RPCClient.L2.L1OriginByID(context.Background(), l2Head2.Number) + s.Nil(err) + + s.Equal(l2Head2.Number.Uint64(), l1Origin.BlockID.Uint64()) + s.Equal(false, l1Origin.EndOfBlock) + s.Equal(true, l1Origin.EndOfPreconf) + s.True(l1Origin.IsSoftBlock()) + + headL1Origin, err = s.RPCClient.L2.HeadL1Origin(context.Background()) + s.Nil(err) + s.Equal(l2Head.Number.Uint64(), headL1Origin.BlockID.Uint64()) + s.False(headL1Origin.IsSoftBlock()) + + s.ProposeAndInsertEmptyBlocks(s.p, s.d.ChainSyncer().BlobSyncer()) + + l2Head3, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + s.Less(l2Head3.Number.Uint64(), l2Head2.Number.Uint64()) + headL1Origin, err = s.RPCClient.L2.HeadL1Origin(context.Background()) + s.Nil(err) + s.Equal(l2Head3.Number.Uint64(), headL1Origin.BlockID.Uint64()) + s.False(headL1Origin.IsSoftBlock()) +} + +func (s *DriverTestSuite) TestInsertSoftBlocksAfterEOP() { + var ( + port = uint64(testutils.RandomPort()) + epochs = testutils.RandomHash().Big().Uint64() % 5 + err error + ) + s.d.softblockServer, err = softblocks.New("*", nil, s.d.ChainSyncer().BlobSyncer(), s.RPCClient, true) + s.Nil(err) + go func() { s.NotNil(s.d.softblockServer.Start(port)) }() + defer func() { s.Nil(s.d.softblockServer.Shutdown(s.d.ctx)) }() + + url, err := url.Parse(fmt.Sprintf("http://localhost:%v", port)) + s.Nil(err) + + headL1Origin, err := s.RPCClient.L2.HeadL1Origin(context.Background()) + s.Nil(err) + + for range headL1Origin.BlockID.Uint64() + epochs + 1 { + s.ProposeAndInsertEmptyBlocks(s.p, s.d.ChainSyncer().BlobSyncer()) + } + + l1Head, err := s.d.rpc.L1.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + l2Head, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + for i := range epochs { + s.True(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1, i, false, false).IsSuccess()) + + latestSafeBlock, err := s.RPCClient.L2.HeaderByNumber(context.Background(), big.NewInt(-4)) + s.Nil(err) + s.Equal(l2Head.Number.Uint64(), latestSafeBlock.Number.Uint64()) + + latestFinalizedBlock, err := s.RPCClient.L2.HeaderByNumber(context.Background(), big.NewInt(-3)) + s.Nil(err) + s.Equal(uint64(0), latestFinalizedBlock.Number.Uint64()) + } + s.True(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1, epochs, false, true).IsSuccess()) + s.False(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1, epochs+1, false, false).IsSuccess()) + + latestSafeBlock, err := s.RPCClient.L2.HeaderByNumber(context.Background(), big.NewInt(-4)) + s.Nil(err) + s.Equal(l2Head.Number.Uint64(), latestSafeBlock.Number.Uint64()) + + l2Head2, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + // Remove soft blocks + res, err := resty.New(). + R(). + SetBody(&softblocks.RemoveSoftBlocksRequestBody{ + NewLastBlockID: l2Head2.Number.Uint64() - 1, + }). + Delete(url.String() + "/softBlocks") + s.Nil(err) + s.True(res.IsSuccess()) + + l2Head3, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + s.Equal(l2Head2.Number.Uint64()-1, l2Head3.Number.Uint64()) + + latestFinalizedBlock, err := s.RPCClient.L2.HeaderByNumber(context.Background(), big.NewInt(-3)) + s.Nil(err) + s.Equal(uint64(0), latestFinalizedBlock.Number.Uint64()) +} + func TestDriverTestSuite(t *testing.T) { suite.Run(t, new(DriverTestSuite)) } + +// insertSoftBlock inserts a soft block with the given parameters. +func (s *DriverTestSuite) insertSoftBlock( + url *url.URL, + anchoredL1Block *types.Header, + l2BlockID uint64, + batchID uint64, + endOfBlock bool, + endOfPreconf bool, +) *resty.Response { + preconferPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) + s.Nil(err) + + preconferAddress := crypto.PubkeyToAddress(preconferPrivKey.PublicKey) + + nonce, err := s.RPCClient.L2.NonceAt(context.Background(), s.TestAddr, nil) + s.Nil(err) + + tx := types.NewTransaction( + nonce, + common.BytesToAddress(testutils.RandomBytes(32)), + common.Big0, + 100_000, + new(big.Int).SetUint64(uint64(10*params.GWei)), + []byte{}, + ) + signedTx, err := types.SignTx(tx, types.LatestSignerForChainID(s.RPCClient.L2.ChainID), s.TestAddrPrivKey) + s.Nil(err) + + // If the transaction is underpriced, we just ingore it. + err = s.RPCClient.L2.SendTransaction(context.Background(), signedTx) + if err != nil { + s.Equal("replacement transaction underpriced", err.Error()) + } + + b, err := encodeAndCompressTxList([]*types.Transaction{signedTx}) + s.Nil(err) + + var marker softblocks.TransactionBatchMarker + if endOfBlock { + marker = softblocks.BatchMarkerEOB + } else if endOfPreconf { + marker = softblocks.BatchMarkerEOP + } else { + marker = softblocks.BatchMarkerEmpty + } + + txBatch := &softblocks.TransactionBatch{ + BlockID: l2BlockID, + ID: batchID, + TransactionsList: b, + BatchMarker: marker, + Signature: "", + BlockParams: &softblocks.SoftBlockParams{ + AnchorBlockID: anchoredL1Block.Number.Uint64(), + AnchorStateRoot: anchoredL1Block.Root, + Timestamp: anchoredL1Block.Time + 12, + Coinbase: preconferAddress, + }, + } + + payload, err := rlp.EncodeToBytes(txBatch) + s.Nil(err) + s.NotEmpty(payload) + + sig, err := crypto.Sign(crypto.Keccak256(payload), preconferPrivKey) + s.Nil(err) + txBatch.Signature = common.Bytes2Hex(sig) + + // Try to propose a soft block with batch ID 0 + res, err := resty.New(). + R(). + SetBody(&softblocks.BuildSoftBlockRequestBody{ + TransactionBatch: txBatch, + }). + Post(url.String() + "/softBlocks") + s.Nil(err) + log.Info("Soft block response", "body", res.String()) + return res +} + +// compress compresses the given txList bytes using zlib. +func compress(txListBytes []byte) ([]byte, error) { + var b bytes.Buffer + w := zlib.NewWriter(&b) + defer w.Close() + + if _, err := w.Write(txListBytes); err != nil { + return nil, err + } + + if err := w.Flush(); err != nil { + return nil, err + } + + return b.Bytes(), nil +} + +// encodeAndCompressTxList encodes and compresses the given transactions list. +func encodeAndCompressTxList(txs types.Transactions) ([]byte, error) { + b, err := rlp.EncodeToBytes(txs) + if err != nil { + return nil, err + } + + return compress(b) +} diff --git a/packages/taiko-client/driver/signer/fixed_k_signer.go b/packages/taiko-client/driver/signer/fixed_k_signer.go index de50decaf46..119c37ff3ec 100644 --- a/packages/taiko-client/driver/signer/fixed_k_signer.go +++ b/packages/taiko-client/driver/signer/fixed_k_signer.go @@ -13,7 +13,7 @@ var ( zero32 [32]byte ) -// FixedKSigner is a ethereum ECDSA signer who always sign payload with the given K value. +// FixedKSigner is an ethereum ECDSA signer who always sign payload with the given K value. // In theory K value is randomly selected in ECDSA algorithm's step 3: // https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm, // but here we use a fixed K value instead. diff --git a/packages/taiko-client/driver/soft_blocks/api.go b/packages/taiko-client/driver/soft_blocks/api.go new file mode 100644 index 00000000000..a51bcd7b0bc --- /dev/null +++ b/packages/taiko-client/driver/soft_blocks/api.go @@ -0,0 +1,306 @@ +package softblocks + +import ( + "errors" + "math/big" + "net/http" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" + "github.com/labstack/echo/v4" +) + +// TransactionBatchMarker represents the status of a soft block transactions group. +type TransactionBatchMarker string + +// BatchMarker valid values. +const ( + BatchMarkerEmpty TransactionBatchMarker = "" + BatchMarkerEOB TransactionBatchMarker = "endOfBlock" + BatchMarkerEOP TransactionBatchMarker = "endOfPreconf" +) + +// SoftBlockParams represents the parameters for building a soft block. +type SoftBlockParams struct { + // @param timestamp uint64 Timestamp of the soft block + Timestamp uint64 `json:"timestamp"` + // @param coinbase string Coinbase of the soft block + Coinbase common.Address `json:"coinbase"` + + // @param anchorBlockID uint64 `_anchorBlockId` parameter of the `anchorV2` transaction in soft block + AnchorBlockID uint64 `json:"anchorBlockID"` + // @param anchorStateRoot string `_anchorStateRoot` parameter of the `anchorV2` transaction in soft block + AnchorStateRoot common.Hash `json:"anchorStateRoot"` +} + +// TransactionBatch represents a soft block group. +type TransactionBatch struct { + // @param blockId uint64 Block ID of the soft block + BlockID uint64 `json:"blockId"` + // @param batchId uint64 ID of this transaction batch + ID uint64 `json:"batchId"` + // @param transactions string zlib compressed RLP encoded bytes of a transactions list + TransactionsList []byte `json:"transactions"` + // @param batchType TransactionBatchMarker Marker of the transaction batch, + // @param either `end_of_block`, `end_of_preconf` or empty + BatchMarker TransactionBatchMarker `json:"batchType"` + // @param signature string Signature of this transaction batch + Signature string `json:"signature" rlp:"-"` + // @param blockParams SoftBlockParams Block parameters of the soft block + BlockParams *SoftBlockParams `json:"blockParams"` +} + +// ValidateSignature validates the signature of the transaction batch. +func (b *TransactionBatch) ValidateSignature() (bool, error) { + payload, err := rlp.EncodeToBytes(b) + if err != nil { + return false, err + } + + pubKey, err := crypto.SigToPub(crypto.Keccak256(payload), common.FromHex(b.Signature)) + if err != nil { + return false, err + } + + return crypto.PubkeyToAddress(*pubKey).Hex() == b.BlockParams.Coinbase.Hex(), nil +} + +// BuildSoftBlockRequestBody represents a request body when handling +// soft blocks creation requests. +type BuildSoftBlockRequestBody struct { + // @param transactionBatch TransactionBatch Transaction batch to be inserted into the soft block + TransactionBatch *TransactionBatch `json:"transactionBatch"` +} + +// CreateOrUpdateBlocksFromBatchResponseBody represents a response body when handling soft +// blocks creation requests. +type BuildSoftBlockResponseBody struct { + // @param blockHeader types.Header of the soft block + BlockHeader *types.Header `json:"blockHeader"` +} + +// BuildSoftBlock handles a soft block creation request, +// if the soft block transactions batch in request are valid, it will insert or reorg the correspoinding the soft +// block to the backend L2 execution engine and return a success response. +// +// @Summary Insert a soft block with a batch of given transactions for preconfirmation. +// @Description Insert a batch of transactions into a soft block for preconfirmation. If the batch is the +// @Description first for a block, a new soft block will be created. Otherwise, the transactions will +// @Description be appended to the existing soft block. The API will fail if: +// @Description 1) the block is not soft +// @Description 2) block-level parameters are invalid or do not match the current soft block’s parameters +// @Description 3) the batch ID is not exactly 1 greater than the previous one +// @Description 4) the last batch of the block indicates no further transactions are allowed +// @Param body body BuildSoftBlockRequestBody true "soft block creation request body" +// @Accept json +// @Produce json +// @Success 200 {object} BuildSoftBlockResponseBody +// @Router /softBlocks [post] +func (s *SoftBlockAPIServer) BuildSoftBlock(c echo.Context) error { + // Parse the request body. + reqBody := new(BuildSoftBlockRequestBody) + if err := c.Bind(reqBody); err != nil { + return s.returnError(c, http.StatusUnprocessableEntity, err) + } + if reqBody.TransactionBatch == nil { + return s.returnError(c, http.StatusBadRequest, errors.New("transactionBatch is required")) + } + + log.Info( + "New soft block building request", + "blockID", reqBody.TransactionBatch.BlockID, + "batchID", reqBody.TransactionBatch.ID, + "batchMarker", reqBody.TransactionBatch.BatchMarker, + "transactionsListBytes", len(reqBody.TransactionBatch.TransactionsList), + "signature", reqBody.TransactionBatch.Signature, + "timestamp", reqBody.TransactionBatch.BlockParams.Timestamp, + "coinbase", reqBody.TransactionBatch.BlockParams.Coinbase, + "anchorBlockID", reqBody.TransactionBatch.BlockParams.AnchorBlockID, + "anchorStateRoot", reqBody.TransactionBatch.BlockParams.AnchorStateRoot, + ) + + // Request body validation. + if reqBody.TransactionBatch.BlockParams == nil { + return s.returnError(c, http.StatusBadRequest, errors.New("blockParams is required")) + } + if reqBody.TransactionBatch.BlockParams.AnchorBlockID == 0 { + return s.returnError(c, http.StatusBadRequest, errors.New("non-zero anchorBlockID is required")) + } + if reqBody.TransactionBatch.BlockParams.AnchorStateRoot == (common.Hash{}) { + return s.returnError(c, http.StatusBadRequest, errors.New("empty anchorStateRoot")) + } + if reqBody.TransactionBatch.BlockParams.Timestamp == 0 { + return s.returnError(c, http.StatusBadRequest, errors.New("non-zero timestamp is required")) + } + if reqBody.TransactionBatch.BlockParams.Coinbase == (common.Address{}) { + return s.returnError(c, http.StatusBadRequest, errors.New("empty coinbase")) + } + + // If the `--softBlock.signatureCheck` flag is enabled, validate the signature. + if s.checkSig { + ok, err := reqBody.TransactionBatch.ValidateSignature() + if err != nil { + return c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()}) + } + if !ok { + log.Warn( + "Invalid signature", + "signature", reqBody.TransactionBatch.Signature, + "coinbase", reqBody.TransactionBatch.BlockParams.Coinbase.Hex(), + ) + return s.returnError(c, http.StatusBadRequest, errors.New("invalid signature")) + } + } + + // Check if the L2 execution engine is syncing from L1. + progress, err := s.rpc.L2ExecutionEngineSyncProgress(c.Request().Context()) + if err != nil { + return c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()}) + } + if progress.IsSyncing() { + return s.returnError(c, http.StatusBadRequest, errors.New("L2 execution engine is syncing")) + } + + // Check if the softblock batch or the current preconf process is ended. + l1Origin, err := s.rpc.L2.L1OriginByID( + c.Request().Context(), + new(big.Int).SetUint64(reqBody.TransactionBatch.BlockID), + ) + if err != nil && err.Error() != ethereum.NotFound.Error() { + return s.returnError(c, http.StatusInternalServerError, err) + } + if l1Origin != nil { + if l1Origin.EndOfBlock { + return s.returnError(c, http.StatusBadRequest, errors.New("soft block has already been marked as ended")) + } + if l1Origin.EndOfPreconf { + return s.returnError( + c, + http.StatusBadRequest, + errors.New("preconfirmation has already been marked as ended"), + ) + } + } + + // Insert the soft block. + header, err := s.chainSyncer.InsertSoftBlockFromTransactionsBatch( + c.Request().Context(), + reqBody.TransactionBatch.BlockID, + reqBody.TransactionBatch.ID, + s.txListDecompressor.TryDecompress( + s.rpc.L2.ChainID, + new(big.Int).SetUint64(reqBody.TransactionBatch.BlockID), + reqBody.TransactionBatch.TransactionsList, + true, + ), + reqBody.TransactionBatch.BatchMarker, + reqBody.TransactionBatch.BlockParams, + ) + if err != nil { + return s.returnError(c, http.StatusInternalServerError, err) + } + + return c.JSON(http.StatusOK, BuildSoftBlockResponseBody{BlockHeader: header}) +} + +// RemoveSoftBlocksRequestBody represents a request body when resetting the backend +// L2 execution engine soft head. +type RemoveSoftBlocksRequestBody struct { + // @param newLastBlockID uint64 New last block ID of the blockchain, it should + // @param not smaller than the canonical chain's highest block ID. + NewLastBlockID uint64 `json:"newLastBlockId"` +} + +// RemoveSoftBlocksResponseBody represents a response body when resetting the backend +// L2 execution engine soft head. +type RemoveSoftBlocksResponseBody struct { + // @param lastBlockID uint64 Current highest block ID of the blockchain (including soft blocks) + LastBlockID uint64 `json:"lastBlockId"` + // @param lastProposedBlockID uint64 Highest block ID of the cnonical chain + LastProposedBlockID uint64 `json:"lastProposedBlockID"` + // @param headsRemoved uint64 Number of soft heads removed + HeadsRemoved uint64 `json:"headsRemoved"` +} + +// RemoveSoftBlocks removes the backend L2 execution engine soft head. +// +// @Summary Remove the soft blocks beyond the specified block height. +// @Description Remove all soft blocks from the blockchain beyond the specified block height, +// @Description ensuring the latest block ID does not exceed the given height. This method will fail if +// @Description the block with an ID one greater than the specified height is not a soft block. If the +// @Description specified block height is greater than the latest soft block ID, the method will succeed +// @Description without modifying the blockchain. +// @Param body body RemoveSoftBlocksRequestBody true "soft blocks removing request body" +// @Accept json +// @Produce json +// @Success 200 {object} RemoveSoftBlocksResponseBody +// @Router /softBlocks [delete] +func (s *SoftBlockAPIServer) RemoveSoftBlocks(c echo.Context) error { + // Parse the request body. + reqBody := new(RemoveSoftBlocksRequestBody) + if err := c.Bind(reqBody); err != nil { + return s.returnError(c, http.StatusUnprocessableEntity, err) + } + + // Request body validation. + canonicalHeadL1Origin, err := s.rpc.L2.HeadL1Origin(c.Request().Context()) + if err != nil { + return s.returnError(c, http.StatusInternalServerError, err) + } + + currentHead, err := s.rpc.L2.HeaderByNumber(c.Request().Context(), nil) + if err != nil { + return s.returnError(c, http.StatusInternalServerError, err) + } + + log.Info( + "New soft block removing request", + "newLastBlockId", reqBody.NewLastBlockID, + "canonicalHead", canonicalHeadL1Origin.BlockID.Uint64(), + "currentHead", currentHead.Number.Uint64(), + ) + + if reqBody.NewLastBlockID < canonicalHeadL1Origin.BlockID.Uint64() { + return s.returnError( + c, + http.StatusBadRequest, + errors.New("newLastBlockId must not be smaller than the canonical chain's highest block ID"), + ) + } + + if err := s.chainSyncer.RemoveSoftBlocks(c.Request().Context(), reqBody.NewLastBlockID); err != nil { + return s.returnError(c, http.StatusBadRequest, err) + } + + newHead, err := s.rpc.L2.HeaderByNumber(c.Request().Context(), nil) + if err != nil { + return s.returnError(c, http.StatusInternalServerError, err) + } + + return c.JSON(http.StatusOK, RemoveSoftBlocksResponseBody{ + LastBlockID: newHead.Number.Uint64(), + LastProposedBlockID: canonicalHeadL1Origin.BlockID.Uint64(), + HeadsRemoved: currentHead.Number.Uint64() - newHead.Number.Uint64(), + }) +} + +// HealthCheck is the endpoints for probes. +// +// @Summary Get current server health status +// @ID health-check +// @Accept json +// @Produce json +// @Success 200 {object} string +// @Router /healthz [get] +func (s *SoftBlockAPIServer) HealthCheck(c echo.Context) error { + return c.NoContent(http.StatusOK) +} + +// returnError is a helper function to return an error response. +func (s *SoftBlockAPIServer) returnError(c echo.Context, statusCode int, err error) error { + return c.JSON(statusCode, map[string]string{"error": err.Error()}) +} diff --git a/packages/taiko-client/driver/soft_blocks/server.go b/packages/taiko-client/driver/soft_blocks/server.go new file mode 100644 index 00000000000..e27cac912fd --- /dev/null +++ b/packages/taiko-client/driver/soft_blocks/server.go @@ -0,0 +1,130 @@ +package softblocks + +import ( + "context" + "fmt" + "os" + + "github.com/ethereum/go-ethereum/core/types" + echojwt "github.com/labstack/echo-jwt/v4" + "github.com/labstack/echo/v4" + "github.com/labstack/echo/v4/middleware" + + txListDecompressor "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/txlist_decompressor" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" +) + +// softBlockChainSyncer is an interface for soft block chain syncer. +type softBlockChainSyncer interface { + InsertSoftBlockFromTransactionsBatch( + ctx context.Context, + blockID uint64, + batchID uint64, + txListBytes []byte, + batchMarker TransactionBatchMarker, + softBlockParams *SoftBlockParams, + ) (*types.Header, error) + RemoveSoftBlocks(ctx context.Context, newLastBlockID uint64) error +} + +// @title Taiko Soft Block Server API +// @version 1.0 +// @termsOfService http://swagger.io/terms/ + +// @contact.name API Support +// @contact.url https://community.taiko.xyz/ +// @contact.email info@taiko.xyz + +// @license.name MIT +// @license.url https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md +// SoftBlockAPIServer represents a soft blcok server instance. +type SoftBlockAPIServer struct { + echo *echo.Echo + chainSyncer softBlockChainSyncer + rpc *rpc.Client + txListDecompressor *txListDecompressor.TxListDecompressor + checkSig bool +} + +// New creates a new soft blcok server instance, and starts the server. +func New( + cors string, + jwtSecret []byte, + chainSyncer softBlockChainSyncer, + cli *rpc.Client, + checkSig bool, +) (*SoftBlockAPIServer, error) { + protocolConfigs, err := rpc.GetProtocolConfigs(cli.TaikoL1, nil) + if err != nil { + return nil, fmt.Errorf("failed to fetch protocol configs: %w", err) + } + + server := &SoftBlockAPIServer{ + echo: echo.New(), + chainSyncer: chainSyncer, + txListDecompressor: txListDecompressor.NewTxListDecompressor( + uint64(protocolConfigs.BlockMaxGasLimit), + rpc.BlockMaxTxListBytes, + cli.L2.ChainID, + ), + rpc: cli, + checkSig: checkSig, + } + + server.echo.HideBanner = true + server.configureMiddleware([]string{cors}) + server.configureRoutes() + if jwtSecret != nil { + server.echo.Use(echojwt.JWT(jwtSecret)) + } + + return server, nil +} + +// LogSkipper implements the `middleware.Skipper` interface. +func LogSkipper(c echo.Context) bool { + switch c.Request().URL.Path { + case "/healthz": + return true + default: + return true + } +} + +// configureMiddleware configures the server middlewares. +func (s *SoftBlockAPIServer) configureMiddleware(corsOrigins []string) { + s.echo.Use(middleware.RequestID()) + + s.echo.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{ + Skipper: LogSkipper, + Format: `{"time":"${time_rfc3339_nano}","level":"INFO","message":{"id":"${id}","remote_ip":"${remote_ip}",` + + `"host":"${host}","method":"${method}","uri":"${uri}","user_agent":"${user_agent}",` + + `"response_status":${status},"error":"${error}","latency":${latency},"latency_human":"${latency_human}",` + + `"bytes_in":${bytes_in},"bytes_out":${bytes_out}}}` + "\n", + Output: os.Stdout, + })) + + // Add CORS middleware + s.echo.Use(middleware.CORSWithConfig(middleware.CORSConfig{ + AllowOrigins: corsOrigins, + AllowCredentials: true, + })) +} + +// Start starts the HTTP server. +func (s *SoftBlockAPIServer) Start(port uint64) error { + return s.echo.Start(fmt.Sprintf(":%v", port)) +} + +// Shutdown shuts down the HTTP server. +func (s *SoftBlockAPIServer) Shutdown(ctx context.Context) error { + return s.echo.Shutdown(ctx) +} + +// configureRoutes contains all routes which will be used by prover server. +func (s *SoftBlockAPIServer) configureRoutes() { + s.echo.GET("/", s.HealthCheck) + s.echo.GET("/healthz", s.HealthCheck) + s.echo.POST("/softBlocks", s.BuildSoftBlock) + s.echo.DELETE("/softBlocks", s.RemoveSoftBlocks) +} diff --git a/packages/taiko-client/driver/soft_blocks/server_test.go b/packages/taiko-client/driver/soft_blocks/server_test.go new file mode 100644 index 00000000000..c1aa66d1777 --- /dev/null +++ b/packages/taiko-client/driver/soft_blocks/server_test.go @@ -0,0 +1,36 @@ +package softblocks + +import ( + "context" + "testing" + + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/suite" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" +) + +type SoftBlockAPIServerTestSuite struct { + testutils.ClientTestSuite + s *SoftBlockAPIServer +} + +func (s *SoftBlockAPIServerTestSuite) SetupTest() { + s.ClientTestSuite.SetupTest() + server, err := New("*", nil, nil, s.RPCClient, true) + s.Nil(err) + s.s = server + go func() { + s.NotPanics(func() { + log.Error("Start test soft block server", "error", s.s.Start(uint64(testutils.RandomPort()))) + }) + }() +} + +func (s *SoftBlockAPIServerTestSuite) TestShutdown() { + s.Nil(s.s.Shutdown(context.Background())) +} + +func TestSoftBlockAPIServerTestSuite(t *testing.T) { + suite.Run(t, new(SoftBlockAPIServerTestSuite)) +} diff --git a/packages/taiko-client/driver/state/l1_current.go b/packages/taiko-client/driver/state/l1_current.go index 425ec1556d1..01f038387d4 100644 --- a/packages/taiko-client/driver/state/l1_current.go +++ b/packages/taiko-client/driver/state/l1_current.go @@ -5,6 +5,8 @@ import ( "errors" "math/big" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" @@ -45,7 +47,15 @@ func (s *State) ResetL1Current(ctx context.Context, blockID *big.Int) error { } // Fetch the block info from TaikoL1 contract, and set the L1 height. - blockInfo, err := s.rpc.GetL2BlockInfo(ctx, blockID) + var ( + blockInfo bindings.TaikoDataBlockV2 + err error + ) + if s.IsOnTake(blockID) { + blockInfo, err = s.rpc.GetL2BlockInfoV2(ctx, blockID) + } else { + blockInfo, err = s.rpc.GetL2BlockInfo(ctx, blockID) + } if err != nil { return err } diff --git a/packages/taiko-client/driver/state/state.go b/packages/taiko-client/driver/state/state.go index 52b818d6029..bae8c311cf7 100644 --- a/packages/taiko-client/driver/state/state.go +++ b/packages/taiko-client/driver/state/state.go @@ -28,7 +28,8 @@ type State struct { l1Current atomic.Value // Current L1 block sync cursor // Constants - GenesisL1Height *big.Int + GenesisL1Height *big.Int + OnTakeForkHeight *big.Int // RPC clients rpc *rpc.Client @@ -61,8 +62,16 @@ func (s *State) init(ctx context.Context) error { return err } - log.Info("Genesis L1 height", "height", stateVars.A.GenesisHeight) + protocolConfigs, err := rpc.GetProtocolConfigs(s.rpc.TaikoL1, &bind.CallOpts{Context: ctx}) + if err != nil { + return err + } + s.GenesisL1Height = new(big.Int).SetUint64(stateVars.A.GenesisHeight) + s.OnTakeForkHeight = new(big.Int).SetUint64(protocolConfigs.OntakeForkHeight) + + log.Info("Genesis L1 height", "height", stateVars.A.GenesisHeight) + log.Info("OnTake fork height", "blockID", s.OnTakeForkHeight) // Set the L2 head's latest known L1 origin as current L1 sync cursor. latestL2KnownL1Header, err := s.rpc.LatestL2KnownL1Header(ctx) @@ -84,7 +93,7 @@ func (s *State) init(ctx context.Context) error { return err } - log.Info("L2 execution engine head", "height", l2Head.Number, "hash", l2Head.Hash()) + log.Info("L2 execution engine head", "blockID", l2Head.Number, "hash", l2Head.Hash()) s.setL2Head(l2Head) s.setHeadBlockID(new(big.Int).SetUint64(stateVars.B.NumBlocks - 1)) @@ -99,18 +108,24 @@ func (s *State) eventLoop(ctx context.Context) { var ( // Channels for subscriptions. - l1HeadCh = make(chan *types.Header, 10) - l2HeadCh = make(chan *types.Header, 10) - blockProposedCh = make(chan *bindings.TaikoL1ClientBlockProposed, 10) - transitionProvedCh = make(chan *bindings.TaikoL1ClientTransitionProved, 10) - blockVerifiedCh = make(chan *bindings.TaikoL1ClientBlockVerified, 10) + l1HeadCh = make(chan *types.Header, 10) + l2HeadCh = make(chan *types.Header, 10) + blockProposedCh = make(chan *bindings.TaikoL1ClientBlockProposed, 10) + transitionProvedCh = make(chan *bindings.TaikoL1ClientTransitionProved, 10) + blockVerifiedCh = make(chan *bindings.TaikoL1ClientBlockVerified, 10) + blockProposedV2Ch = make(chan *bindings.TaikoL1ClientBlockProposedV2, 10) + transitionProvedV2Ch = make(chan *bindings.TaikoL1ClientTransitionProvedV2, 10) + blockVerifiedV2Ch = make(chan *bindings.TaikoL1ClientBlockVerifiedV2, 10) // Subscriptions. - l1HeadSub = rpc.SubscribeChainHead(s.rpc.L1, l1HeadCh) - l2HeadSub = rpc.SubscribeChainHead(s.rpc.L2, l2HeadCh) - l2BlockVerifiedSub = rpc.SubscribeBlockVerified(s.rpc.TaikoL1, blockVerifiedCh) - l2BlockProposedSub = rpc.SubscribeBlockProposed(s.rpc.TaikoL1, blockProposedCh) - l2TransitionProvedSub = rpc.SubscribeTransitionProved(s.rpc.TaikoL1, transitionProvedCh) + l1HeadSub = rpc.SubscribeChainHead(s.rpc.L1, l1HeadCh) + l2HeadSub = rpc.SubscribeChainHead(s.rpc.L2, l2HeadCh) + l2BlockVerifiedSub = rpc.SubscribeBlockVerified(s.rpc.TaikoL1, blockVerifiedCh) + l2BlockProposedSub = rpc.SubscribeBlockProposed(s.rpc.TaikoL1, blockProposedCh) + l2TransitionProvedSub = rpc.SubscribeTransitionProved(s.rpc.TaikoL1, transitionProvedCh) + l2BlockVerifiedV2Sub = rpc.SubscribeBlockVerifiedV2(s.rpc.TaikoL1, blockVerifiedV2Ch) + l2BlockProposedV2Sub = rpc.SubscribeBlockProposedV2(s.rpc.TaikoL1, blockProposedV2Ch) + l2TransitionProvedV2Sub = rpc.SubscribeTransitionProvedV2(s.rpc.TaikoL1, transitionProvedV2Ch) ) defer func() { @@ -119,6 +134,9 @@ func (s *State) eventLoop(ctx context.Context) { l2BlockVerifiedSub.Unsubscribe() l2BlockProposedSub.Unsubscribe() l2TransitionProvedSub.Unsubscribe() + l2BlockVerifiedV2Sub.Unsubscribe() + l2BlockProposedV2Sub.Unsubscribe() + l2TransitionProvedV2Sub.Unsubscribe() }() for { @@ -127,6 +145,8 @@ func (s *State) eventLoop(ctx context.Context) { return case e := <-blockProposedCh: s.setHeadBlockID(e.BlockId) + case e := <-blockProposedV2Ch: + s.setHeadBlockID(e.BlockId) case e := <-transitionProvedCh: log.Info( "✅ Transition proven", @@ -136,6 +156,15 @@ func (s *State) eventLoop(ctx context.Context) { "stateRoot", common.Hash(e.Tran.StateRoot), "prover", e.Prover, ) + case e := <-transitionProvedV2Ch: + log.Info( + "✅ Transition proven", + "blockID", e.BlockId, + "parentHash", common.Hash(e.Tran.ParentHash), + "hash", common.Hash(e.Tran.BlockHash), + "stateRoot", common.Hash(e.Tran.StateRoot), + "prover", e.Prover, + ) case e := <-blockVerifiedCh: log.Info( "📈 Block verified", @@ -144,6 +173,13 @@ func (s *State) eventLoop(ctx context.Context) { "stateRoot", common.Hash(e.StateRoot), "prover", e.Prover, ) + case e := <-blockVerifiedV2Ch: + log.Info( + "📈 Block verified", + "blockID", e.BlockId, + "hash", common.Hash(e.BlockHash), + "prover", e.Prover, + ) case newHead := <-l1HeadCh: s.setL1Head(newHead) s.l1HeadsFeed.Send(newHead) @@ -178,7 +214,7 @@ func (s *State) setL2Head(l2Head *types.Header) { return } - log.Trace("New L2 head", "height", l2Head.Number, "hash", l2Head.Hash(), "timestamp", l2Head.Time) + log.Trace("New L2 head", "blockID", l2Head.Number, "hash", l2Head.Hash(), "timestamp", l2Head.Time) metrics.DriverL2HeadHeightGauge.Set(float64(l2Head.Number.Uint64())) s.l2Head.Store(l2Head) @@ -205,3 +241,11 @@ func (s *State) GetHeadBlockID() *big.Int { func (s *State) SubL1HeadsFeed(ch chan *types.Header) event.Subscription { return s.l1HeadsFeed.Subscribe(ch) } + +// IsOnTake returns whether num is either equal to the ontake block or greater. +func (s *State) IsOnTake(num *big.Int) bool { + if s.OnTakeForkHeight == nil || num == nil { + return false + } + return s.OnTakeForkHeight.Cmp(num) <= 0 +} diff --git a/packages/taiko-client/driver/state/state_test.go b/packages/taiko-client/driver/state/state_test.go index f7ac90f2243..a54a726ab39 100644 --- a/packages/taiko-client/driver/state/state_test.go +++ b/packages/taiko-client/driver/state/state_test.go @@ -9,7 +9,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) type DriverStateTestSuite struct { diff --git a/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor.go b/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor.go index 80f6e553b2d..cbb6f795ec3 100644 --- a/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor.go +++ b/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor.go @@ -5,9 +5,10 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) // TxListDecompressor is responsible for validating and decompressing @@ -39,6 +40,20 @@ func NewTxListDecompressor( // less than or equal to maxBytesPerTxList. // 2. The transaction list bytes must be able to be RLP decoded into a list of transactions. func (v *TxListDecompressor) TryDecompress( + chainID *big.Int, + blockID *big.Int, + txListBytes []byte, + blobUsed bool, +) []byte { + if chainID.Cmp(params.HeklaNetworkID) == 0 { + return v.tryDecompressHekla(blockID, txListBytes, blobUsed) + } + + return v.tryDecompress(blockID, txListBytes, blobUsed) +} + +// tryDecompress is the inner implementation of TryDecompress. +func (v *TxListDecompressor) tryDecompress( blockID *big.Int, txListBytes []byte, blobUsed bool, @@ -72,6 +87,47 @@ func (v *TxListDecompressor) TryDecompress( return []byte{} } + log.Info("Transaction list is valid", "blockID", blockID, "txs", len(txs)) + return txListBytes +} + +// TryDecompressHekla is the same as tryDecompress, but it's used for Hekla network with +// an incorrect legacy bytes size check. +// ref: https://github.com/taikoxyz/taiko-client/pull/783 +func (v *TxListDecompressor) tryDecompressHekla( + blockID *big.Int, + txListBytes []byte, + blobUsed bool, +) []byte { + // If the transaction list is empty, it's valid. + if len(txListBytes) == 0 { + return []byte{} + } + + var ( + txs types.Transactions + err error + ) + + // Decompress the transaction list bytes. + if txListBytes, err = utils.Decompress(txListBytes); err != nil { + log.Info("Failed to decompress tx list bytes", "blockID", blockID, "error", err) + return []byte{} + } + + // If calldata is used, the compressed bytes of the transaction list must be + // less than or equal to maxBytesPerTxList. + if !blobUsed && (len(txListBytes) > int(v.maxBytesPerTxList)) { + log.Info("Compressed transactions list binary too large", "length", len(txListBytes), "blockID", blockID) + return []byte{} + } + + // Try to RLP decode the transaction list bytes. + if err = rlp.DecodeBytes(txListBytes, &txs); err != nil { + log.Info("Failed to decode transactions list bytes", "blockID", blockID, "error", err) + return []byte{} + } + log.Info("Transaction list is valid", "blockID", blockID) return txListBytes } diff --git a/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor_test.go b/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor_test.go index 980e866bb24..4888dd48bce 100644 --- a/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor_test.go +++ b/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor_test.go @@ -14,8 +14,8 @@ import ( "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) var ( @@ -39,12 +39,12 @@ func (s *TxListDecompressorTestSuite) SetupTest() { } func (s *TxListDecompressorTestSuite) TestZeroBytes() { - s.Empty(s.d.TryDecompress(chainID, []byte{}, false)) + s.Empty(s.d.TryDecompress(chainID, common.Big1, []byte{}, false)) } func (s *TxListDecompressorTestSuite) TestCalldataSize() { - s.Empty(s.d.TryDecompress(chainID, randBytes(rpc.BlockMaxTxListBytes+1), false)) - s.Empty(s.d.TryDecompress(chainID, randBytes(rpc.BlockMaxTxListBytes-1), false)) + s.Empty(s.d.TryDecompress(chainID, common.Big1, randBytes(rpc.BlockMaxTxListBytes+1), false)) + s.Empty(s.d.TryDecompress(chainID, common.Big1, randBytes(rpc.BlockMaxTxListBytes-1), false)) } func (s *TxListDecompressorTestSuite) TestValidTxList() { @@ -53,21 +53,21 @@ func (s *TxListDecompressorTestSuite) TestValidTxList() { decompressed, err := utils.Decompress(compressed) s.Nil(err) - s.Equal(s.d.TryDecompress(chainID, compressed, true), decompressed) - s.Equal(s.d.TryDecompress(chainID, compressed, false), decompressed) + s.Equal(s.d.TryDecompress(chainID, common.Big1, compressed, true), decompressed) + s.Equal(s.d.TryDecompress(chainID, common.Big1, compressed, false), decompressed) } func (s *TxListDecompressorTestSuite) TestInvalidTxList() { compressed, err := utils.Compress(randBytes(1024)) s.Nil(err) - s.Zero(len(s.d.TryDecompress(chainID, compressed, true))) - s.Zero(len(s.d.TryDecompress(chainID, compressed, false))) + s.Zero(len(s.d.TryDecompress(chainID, common.Big1, compressed, true))) + s.Zero(len(s.d.TryDecompress(chainID, common.Big1, compressed, false))) } func (s *TxListDecompressorTestSuite) TestInvalidZlibBytes() { - s.Zero(len(s.d.TryDecompress(chainID, randBytes(1024), true))) - s.Zero(len(s.d.TryDecompress(chainID, randBytes(1024), false))) + s.Zero(len(s.d.TryDecompress(chainID, common.Big1, randBytes(1024), true))) + s.Zero(len(s.d.TryDecompress(chainID, common.Big1, randBytes(1024), false))) } func TestDriverTestSuite(t *testing.T) { @@ -80,7 +80,6 @@ func rlpEncodedTransactionBytes(l int, signed bool) []byte { var tx *types.Transaction if signed { txData := &types.LegacyTx{Nonce: 1, To: &testAddr, GasPrice: common.Big256, Value: common.Big1, Gas: 10} - tx = types.MustSignNewTx(testKey, types.LatestSigner(¶ms.ChainConfig{ChainID: chainID}), txData) } else { tx = types.NewTransaction(1, testAddr, common.Big1, 10, new(big.Int).SetUint64(10*params.GWei), nil) diff --git a/packages/taiko-client/driver/txlist_fetcher/blob.go b/packages/taiko-client/driver/txlist_fetcher/blob.go index ecabd59b6ca..922e1975b86 100644 --- a/packages/taiko-client/driver/txlist_fetcher/blob.go +++ b/packages/taiko-client/driver/txlist_fetcher/blob.go @@ -10,15 +10,15 @@ import ( "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) // BlobFetcher is responsible for fetching the txList blob from the L1 block sidecar. type BlobFetcher struct { - l1Beacon *rpc.BeaconClient - ds *rpc.BlobDataSource + l1Beacon *rpc.BeaconClient + dataSource *rpc.BlobDataSource } // NewBlobTxListFetcher creates a new BlobFetcher instance based on the given rpc client. @@ -30,19 +30,19 @@ func NewBlobTxListFetcher(l1Beacon *rpc.BeaconClient, ds *rpc.BlobDataSource) *B func (d *BlobFetcher) Fetch( ctx context.Context, _ *types.Transaction, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, ) ([]byte, error) { - if !meta.BlobUsed { + if !meta.GetBlobUsed() { return nil, pkg.ErrBlobUsed } // Fetch the L1 block sidecars. - sidecars, err := d.ds.GetBlobs(ctx, meta) + sidecars, err := d.dataSource.GetBlobs(ctx, meta.GetProposedAt(), meta.GetBlobHash()) if err != nil { return nil, err } - log.Info("Fetch sidecars", "blockNumber", meta.L1Height+1, "sidecars", len(sidecars)) + log.Info("Fetch sidecars", "blockNumber", meta.GetRawBlockHeight(), "sidecars", len(sidecars)) // Compare the blob hash with the sidecar's kzg commitment. for i, sidecar := range sidecars { @@ -50,16 +50,21 @@ func (d *BlobFetcher) Fetch( "Block sidecar", "index", i, "KzgCommitment", sidecar.KzgCommitment, - "blobHash", common.Bytes2Hex(meta.BlobHash[:]), + "blobHash", meta.GetBlobHash(), ) commitment := kzg4844.Commitment(common.FromHex(sidecar.KzgCommitment)) - if kzg4844.CalcBlobHashV1( - sha256.New(), - &commitment, - ) == common.BytesToHash(meta.BlobHash[:]) { + if kzg4844.CalcBlobHashV1(sha256.New(), &commitment) == meta.GetBlobHash() { blob := eth.Blob(common.FromHex(sidecar.Blob)) - return blob.ToData() + bytes, err := blob.ToData() + if err != nil { + return nil, err + } + + if meta.GetBlobTxListLength() == 0 { + return bytes[meta.GetBlobTxListOffset():], nil + } + return bytes[meta.GetBlobTxListOffset() : meta.GetBlobTxListOffset()+meta.GetBlobTxListLength()], nil } } diff --git a/packages/taiko-client/driver/txlist_fetcher/calldata.go b/packages/taiko-client/driver/txlist_fetcher/calldata.go index 4cd7f4c6619..7beee95e99b 100644 --- a/packages/taiko-client/driver/txlist_fetcher/calldata.go +++ b/packages/taiko-client/driver/txlist_fetcher/calldata.go @@ -2,26 +2,55 @@ package txlistdecoder import ( "context" + "fmt" + "math/big" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) // CalldataFetcher is responsible for fetching the txList bytes from the transaction's calldata. -type CalldataFetcher struct{} +type CalldataFetcher struct { + rpc *rpc.Client +} + +// NewCalldataFetch creates a new CalldataFetcher instance based on the given rpc client. +func NewCalldataFetch(rpc *rpc.Client) *CalldataFetcher { + return &CalldataFetcher{rpc: rpc} +} -// NewCalldataTxListFetcher creates a new CalldataFetcher instance. +// Fetch fetches the txList bytes from the transaction's calldata. func (d *CalldataFetcher) Fetch( - _ context.Context, + ctx context.Context, tx *types.Transaction, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, ) ([]byte, error) { - if meta.BlobUsed { + if meta.GetBlobUsed() { return nil, pkg.ErrBlobUsed } - return encoding.UnpackTxListBytes(tx.Data()) + // If the given L2 block is not an ontake block, decode the txlist from calldata directly. + if !meta.IsOntakeBlock() { + return encoding.UnpackTxListBytes(tx.Data()) + } + + // Otherwise, fetch the txlist data from the `CalldataTxList` event. + end := meta.GetRawBlockHeight().Uint64() + iter, err := d.rpc.TaikoL1.FilterCalldataTxList( + &bind.FilterOpts{Context: ctx, Start: meta.GetRawBlockHeight().Uint64(), End: &end}, + []*big.Int{meta.GetBlockID()}, + ) + if err != nil { + return nil, err + } + for iter.Next() { + return iter.Event.TxList, nil + } + + return nil, fmt.Errorf("calldata for block %d not found", meta.GetBlockID()) } diff --git a/packages/taiko-client/driver/txlist_fetcher/interface.go b/packages/taiko-client/driver/txlist_fetcher/interface.go index 7d412ec8806..7a6250b2f89 100644 --- a/packages/taiko-client/driver/txlist_fetcher/interface.go +++ b/packages/taiko-client/driver/txlist_fetcher/interface.go @@ -5,10 +5,10 @@ import ( "github.com/ethereum/go-ethereum/core/types" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) // TxListFetcher is responsible for fetching the L2 txList bytes from L1 type TxListFetcher interface { - Fetch(ctx context.Context, tx *types.Transaction, meta *bindings.TaikoDataBlockMetadata) ([]byte, error) + Fetch(ctx context.Context, tx *types.Transaction, meta metadata.TaikoBlockMetaData) ([]byte, error) } diff --git a/packages/taiko-client/integration_test/README.md b/packages/taiko-client/integration_test/README.md index 056dbacf88d..2e3d99cb137 100644 --- a/packages/taiko-client/integration_test/README.md +++ b/packages/taiko-client/integration_test/README.md @@ -1,4 +1,8 @@ # How to debug test cases? +- set up config +``` +export L2_NODE=l2_geth +``` - start docker compose diff --git a/packages/taiko-client/integration_test/deploy_l1_contract.sh b/packages/taiko-client/integration_test/deploy_l1_contract.sh index 71e635df468..f900d106b1c 100755 --- a/packages/taiko-client/integration_test/deploy_l1_contract.sh +++ b/packages/taiko-client/integration_test/deploy_l1_contract.sh @@ -6,12 +6,12 @@ source scripts/common.sh source integration_test/l1_env.sh cd ../protocol && - forge script script/DeployOnL1.s.sol:DeployOnL1 \ - --fork-url "$L1_NODE_HTTP_ENDPOINT" \ + forge script script/layer1/DeployProtocolOnL1.s.sol:DeployProtocolOnL1 \ + --fork-url "$L1_HTTP" \ --broadcast \ --ffi \ -vvvvv \ --evm-version cancun \ --private-key "$PRIVATE_KEY" \ - --block-gas-limit 100000000 \ + --block-gas-limit 200000000 \ --legacy diff --git a/packages/taiko-client/integration_test/entrypoint.sh b/packages/taiko-client/integration_test/entrypoint.sh index 01789d508ef..e782405e73a 100755 --- a/packages/taiko-client/integration_test/entrypoint.sh +++ b/packages/taiko-client/integration_test/entrypoint.sh @@ -21,19 +21,17 @@ integration_test/deploy_l1_contract.sh source integration_test/test_env.sh # make sure environment variables are set -check_env "L1_NODE_HTTP_ENDPOINT" -check_env "L1_NODE_WS_ENDPOINT" -check_env "L2_EXECUTION_ENGINE_HTTP_ENDPOINT" -check_env "L2_EXECUTION_ENGINE_WS_ENDPOINT" -check_env "L2_EXECUTION_ENGINE_AUTH_ENDPOINT" -check_env "TAIKO_L1_ADDRESS" -check_env "TAIKO_L2_ADDRESS" -check_env "TAIKO_TOKEN_ADDRESS" -check_env "ASSIGNMENT_HOOK_ADDRESS" +check_env "L1_HTTP" +check_env "L1_WS" +check_env "L2_HTTP" +check_env "L2_WS" +check_env "L2_AUTH" +check_env "TAIKO_L1" +check_env "TAIKO_L2" +check_env "TAIKO_TOKEN" check_env "TIMELOCK_CONTROLLER" -check_env "ROLLUP_ADDRESS_MANAGER_CONTRACT_ADDRESS" -check_env "GUARDIAN_PROVER_CONTRACT_ADDRESS" -check_env "GUARDIAN_PROVER_MINORITY_ADDRESS" +check_env "GUARDIAN_PROVER_CONTRACT" +check_env "GUARDIAN_PROVER_MINORITY" check_env "L1_CONTRACT_OWNER_PRIVATE_KEY" check_env "L1_SECURITY_COUNCIL_PRIVATE_KEY" check_env "L1_PROPOSER_PRIVATE_KEY" @@ -48,6 +46,7 @@ PACKAGE=${PACKAGE:-...} # limiting tests to blob syncer for now if [ "$RUN_TESTS" == "true" ]; then go test -v -p=1 ./driver/chain_syncer/blob -run '^TestBlobSyncerTestSuite$' + go test -v -p=1 ./driver -run '^TestDriverTestSuite$' # ./"$PACKAGE" -coverprofile=coverage.out -covermode=atomic -timeout=700s else echo "💻 Local dev net started" diff --git a/packages/taiko-client/integration_test/hive_test.go b/packages/taiko-client/integration_test/hive_test.go new file mode 100644 index 00000000000..8e6a3a07cc0 --- /dev/null +++ b/packages/taiko-client/integration_test/hive_test.go @@ -0,0 +1,127 @@ +package integration_test + +import ( + "context" + "fmt" + "os" + "testing" + + "github.com/ethereum/hive/hivesim" + "github.com/stretchr/testify/assert" +) + +func TestHiveHandler(t *testing.T) { + baseDir := os.Getenv("HIVE_DIR") + if baseDir == "" { + t.SkipNow() + } + + clientGroups := [][]string{ + { + "anvil", + "taiko/taiko-geth", + "taiko/driver", + "taiko/proposer", + "taiko/prover", + }, + { + "taiko/taiko-geth", + "taiko/driver", + }, + { + "taiko/taiko-geth", + "taiko/driver", + }, + } + + // Multi clusters full sync and snap sync tests. + t.Run(fmt.Sprintf("taiko-genesis/l2-snap-sync/clusters(%d)", len(clientGroups)), func(t *testing.T) { + testDenebGenesis(t, "taiko-genesis/l2-snap-sync", clientGroups) + }) + t.Run(fmt.Sprintf("taiko-genesis/l2-full-sync/clusters(%d)", len(clientGroups)), func(t *testing.T) { + testDenebGenesis(t, "taiko-genesis/l2-full-sync", clientGroups) + }) + + // Multi clusters reorg test. + t.Run("taiko-reorg/taiko-reorg", func(t *testing.T) { + testDenebReorg(t, "taiko-reorg/taiko-reorg", [][]string{clientGroups[0]}) + }) + + t.Run("taiko-blob/blob-server", func(t *testing.T) { + testBlobAPI(t, "taiko-blob/blob-server", []string{ + "geth", + "prysm/prysm-bn", + "prysm/prysm-vc", + "taiko/taiko-geth", + "taiko/driver", + "taiko/proposer", + "taiko/prover", + "storage/redis", + "storage/postgres", + "blobscan/blobscan-api", + "blobscan/blobscan-indexer", + }) + }) + + t.Run("taiko-blob/blob-l1-beacon", func(t *testing.T) { + testBlobAPI(t, "taiko-blob/blob-l1-beacon", []string{ + "geth", + "prysm/prysm-bn", + "prysm/prysm-vc", + "taiko/taiko-geth", + "taiko/driver", + "taiko/proposer", + "taiko/prover", + }) + }) +} + +func testBlobAPI(t *testing.T, pattern string, clients []string) { + handler, err := hivesim.NewHiveFramework(&hivesim.HiveConfig{ + BuildOutput: false, + ContainerOutput: true, + DockerPull: false, + BaseDir: os.Getenv("HIVE_DIR"), + SimPattern: "taiko", + SimTestPattern: pattern, + ClientGroups: [][]string{clients}, + }) + assert.NoError(t, err) + + failedCount, err := handler.Run(context.Background()) + assert.NoError(t, err) + assert.Equal(t, 0, failedCount) +} + +func testDenebGenesis(t *testing.T, simPattern string, clientGroups [][]string) { + handler, err := hivesim.NewHiveFramework(&hivesim.HiveConfig{ + BuildOutput: false, + ContainerOutput: true, + DockerPull: true, + BaseDir: os.Getenv("HIVE_DIR"), + SimPattern: "taiko", + SimTestPattern: simPattern, + ClientGroups: clientGroups, + }) + assert.NoError(t, err) + + failedCount, err := handler.Run(context.Background()) + assert.NoError(t, err) + assert.Equal(t, 0, failedCount) +} + +func testDenebReorg(t *testing.T, simPattern string, clientGroups [][]string) { + handler, err := hivesim.NewHiveFramework(&hivesim.HiveConfig{ + BuildOutput: false, + ContainerOutput: true, + BaseDir: os.Getenv("HIVE_DIR"), + SimPattern: "taiko", + SimTestPattern: simPattern, + ClientGroups: clientGroups, + }) + assert.NoError(t, err) + + failedCount, err := handler.Run(context.Background()) + assert.NoError(t, err) + assert.Equal(t, 0, failedCount) +} diff --git a/packages/taiko-client/integration_test/l1_env.sh b/packages/taiko-client/integration_test/l1_env.sh index 6fefaef7d11..7bde57f70aa 100755 --- a/packages/taiko-client/integration_test/l1_env.sh +++ b/packages/taiko-client/integration_test/l1_env.sh @@ -10,15 +10,15 @@ export PROVER_SET_ADMIN=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 export TAIKO_TOKEN_PREMINT_RECIPIENT=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 export TAIKO_TOKEN_NAME="Taiko Token Test" export TAIKO_TOKEN_SYMBOL="TTKOt" -export TIER_PROVIDER="devnet" +export TIER_ROUTER="devnet" export PAUSE_TAIKO_L1="false" export PAUSE_BRIDGE="false" export TAIKO_TOKEN=0x0000000000000000000000000000000000000000 export SHARED_ADDRESS_MANAGER=0x0000000000000000000000000000000000000000 export PROPOSER=0x0000000000000000000000000000000000000000 export PROPOSER_ONE=0x0000000000000000000000000000000000000000 -export NUM_MIN_MAJORITY_GUARDIANS=7 -export NUM_MIN_MINORITY_GUARDIANS=2 +export NUM_MIN_MAJORITY_GUARDIANS=6 +export NUM_MIN_MINORITY_GUARDIANS=1 GUARDIAN_PROVERS_ADDRESSES_LIST=( "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" @@ -40,6 +40,6 @@ export L2_GENESIS_HASH=$( -X POST \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":0,"method":"eth_getBlockByNumber","params":["0x0", false]}' \ - $L2_EXECUTION_ENGINE_HTTP_ENDPOINT | jq .result.hash | sed 's/\"//g' + $L2_HTTP | jq .result.hash | sed 's/\"//g' ) echo "L2_GENESIS_HASH: $L2_GENESIS_HASH" diff --git a/packages/taiko-client/integration_test/test_env.sh b/packages/taiko-client/integration_test/test_env.sh index 0ce1b01f547..8976d49b8cb 100755 --- a/packages/taiko-client/integration_test/test_env.sh +++ b/packages/taiko-client/integration_test/test_env.sh @@ -5,41 +5,35 @@ source scripts/common.sh # get deployed contract address. DEPLOYMENT_JSON=$(cat ../protocol/deployments/deploy_l1.json) -export TAIKO_L1_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.taiko' | sed 's/\"//g') -export TAIKO_L2_ADDRESS=0x1670010000000000000000000000000000010001 -export TAIKO_TOKEN_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.taiko_token' | sed 's/\"//g') -export ASSIGNMENT_HOOK_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.assignment_hook' | sed 's/\"//g') +export TAIKO_L1=$(echo "$DEPLOYMENT_JSON" | jq '.taiko' | sed 's/\"//g') +export TAIKO_L2=0x1670010000000000000000000000000000010001 +export TAIKO_TOKEN=$(echo "$DEPLOYMENT_JSON" | jq '.taiko_token' | sed 's/\"//g') export TIMELOCK_CONTROLLER=$(echo "$DEPLOYMENT_JSON" | jq '.timelock_controller' | sed 's/\"//g') -export ROLLUP_ADDRESS_MANAGER_CONTRACT_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.rollup_address_manager' | sed 's/\"//g') -export GUARDIAN_PROVER_CONTRACT_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.guardian_prover' | sed 's/\"//g') -export GUARDIAN_PROVER_MINORITY_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.guardian_prover_minority' | sed 's/\"//g') -export PROVER_SET_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.prover_set' | sed 's/\"//g') +export GUARDIAN_PROVER_CONTRACT=$(echo "$DEPLOYMENT_JSON" | jq '.guardian_prover' | sed 's/\"//g') +export GUARDIAN_PROVER_MINORITY=$(echo "$DEPLOYMENT_JSON" | jq '.guardian_prover_minority' | sed 's/\"//g') export L1_CONTRACT_OWNER_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 export L1_SECURITY_COUNCIL_PRIVATE_KEY=0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97 export L1_PROPOSER_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 export L2_SUGGESTED_FEE_RECIPIENT=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 -export L1_PROVER_PRIVATE_KEY=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d +export L1_PROVER_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 export TREASURY=0x1670010000000000000000000000000000010001 export VERBOSITY=3 # show the integration test environment variables. -# L1_BEACON_HTTP_ENDPOINT=$L1_BEACON_HTTP_ENDPOINT +# L1_BEACON=$L1_BEACON echo "RUN_TESTS=true -L1_NODE_HTTP_ENDPOINT=$L1_NODE_HTTP_ENDPOINT -L1_NODE_WS_ENDPOINT=$L1_NODE_WS_ENDPOINT +L1_HTTP=$L1_HTTP +L1_WS=$L1_WS L2_SUGGESTED_FEE_RECIPIENT=$L2_SUGGESTED_FEE_RECIPIENT -L2_EXECUTION_ENGINE_HTTP_ENDPOINT=$L2_EXECUTION_ENGINE_HTTP_ENDPOINT -L2_EXECUTION_ENGINE_WS_ENDPOINT=$L2_EXECUTION_ENGINE_WS_ENDPOINT -L2_EXECUTION_ENGINE_AUTH_ENDPOINT=$L2_EXECUTION_ENGINE_AUTH_ENDPOINT -TAIKO_L1_ADDRESS=$TAIKO_L1_ADDRESS -TAIKO_L2_ADDRESS=$TAIKO_L2_ADDRESS -TAIKO_TOKEN_ADDRESS=$TAIKO_TOKEN_ADDRESS -PROVER_SET_ADDRESS=$PROVER_SET_ADDRESS -ASSIGNMENT_HOOK_ADDRESS=$ASSIGNMENT_HOOK_ADDRESS +L2_HTTP=$L2_HTTP +L2_WS=$L2_WS +L2_AUTH=$L2_AUTH +TAIKO_L1=$TAIKO_L1 +TAIKO_L2=$TAIKO_L2 +TAIKO_TOKEN=$TAIKO_TOKEN TIMELOCK_CONTROLLER=$TIMELOCK_CONTROLLER -ROLLUP_ADDRESS_MANAGER_CONTRACT_ADDRESS=$ROLLUP_ADDRESS_MANAGER_CONTRACT_ADDRESS -GUARDIAN_PROVER_CONTRACT_ADDRESS=$GUARDIAN_PROVER_CONTRACT_ADDRESS -GUARDIAN_PROVER_MINORITY_ADDRESS=$GUARDIAN_PROVER_MINORITY_ADDRESS +GUARDIAN_PROVER_CONTRACT=$GUARDIAN_PROVER_CONTRACT +GUARDIAN_PROVER_MINORITY=$GUARDIAN_PROVER_MINORITY L1_CONTRACT_OWNER_PRIVATE_KEY=$L1_CONTRACT_OWNER_PRIVATE_KEY L1_SECURITY_COUNCIL_PRIVATE_KEY=$L1_SECURITY_COUNCIL_PRIVATE_KEY L1_PROPOSER_PRIVATE_KEY=$L1_PROPOSER_PRIVATE_KEY diff --git a/packages/taiko-client/internal/docker/docker_env.sh b/packages/taiko-client/internal/docker/docker_env.sh index ccaab9a033c..b5ae4ffdd4c 100755 --- a/packages/taiko-client/internal/docker/docker_env.sh +++ b/packages/taiko-client/internal/docker/docker_env.sh @@ -9,25 +9,25 @@ until cast chain-id --rpc-url "$L1_PROBE_URL" 2> /dev/null; do done # check until L2 chain is ready -L2_PROBE_URL=ws://localhost:$(docker port l2_node | grep "0.0.0.0" | awk -F ':' 'NR==2 {print $2}') +L2_PROBE_URL=ws://localhost:$(docker port $L2_NODE | grep "0.0.0.0" | awk -F ':' 'NR==2 {print $2}') until cast chain-id --rpc-url "$L2_PROBE_URL" 2> /dev/null; do sleep 1 done L1_NODE_PORT=$(docker port l1_node | grep '0.0.0.0' | awk -F ':' '{print $2}') -export L1_NODE_HTTP_ENDPOINT=http://localhost:$L1_NODE_PORT -export L1_NODE_WS_ENDPOINT=ws://localhost:$L1_NODE_PORT +export L1_HTTP=http://localhost:$L1_NODE_PORT +export L1_WS=ws://localhost:$L1_NODE_PORT -export L2_EXECUTION_ENGINE_HTTP_ENDPOINT=http://localhost:$(docker port l2_node | grep "0.0.0.0" | awk -F ':' 'NR==1 {print $2}') -export L2_EXECUTION_ENGINE_WS_ENDPOINT=ws://localhost:$(docker port l2_node | grep "0.0.0.0" | awk -F ':' 'NR==2 {print $2}') -export L2_EXECUTION_ENGINE_AUTH_ENDPOINT=http://localhost:$(docker port l2_node | grep "0.0.0.0" | awk -F ':' 'NR==3 {print $2}') +export L2_HTTP=http://localhost:$(docker port $L2_NODE | grep "0.0.0.0" | awk -F ':' 'NR==1 {print $2}') +export L2_WS=ws://localhost:$(docker port $L2_NODE | grep "0.0.0.0" | awk -F ':' 'NR==2 {print $2}') +export L2_AUTH=http://localhost:$(docker port $L2_NODE | grep "0.0.0.0" | awk -F ':' 'NR==3 {print $2}') export JWT_SECRET=$DIR/nodes/jwt.hex -echo -e "L1_NODE PORTS: \n$(docker port l1_node)" -echo -e "L2_NODE PORTS: \n$(docker port l2_node)" +echo -e "L1_NODE PORTS: \n\t$(docker port l1_node)" +echo -e "L2_NODE PORTS: \n\t$(docker port $L2_NODE)" -echo "L1_NODE_HTTP_ENDPOINT: $L1_NODE_HTTP_ENDPOINT" -echo "L1_NODE_WS_ENDPOINT: $L1_NODE_WS_ENDPOINT" -echo "L2_EXECUTION_ENGINE_HTTP_ENDPOINT: $L2_EXECUTION_ENGINE_HTTP_ENDPOINT" -echo "L2_EXECUTION_ENGINE_WS_ENDPOINT: $L2_EXECUTION_ENGINE_WS_ENDPOINT" -echo "L2_EXECUTION_ENGINE_AUTH_ENDPOINT: $L2_EXECUTION_ENGINE_AUTH_ENDPOINT" +echo "L1_HTTP: $L1_HTTP" +echo "L1_WS: $L1_WS" +echo "L2_HTTP: $L2_HTTP" +echo "L2_WS: $L2_WS" +echo "L2_AUTH: $L2_AUTH" diff --git a/packages/taiko-client/internal/docker/nodes/docker-compose.yml b/packages/taiko-client/internal/docker/nodes/docker-compose.yml index 4880101823c..3da01faf1c4 100644 --- a/packages/taiko-client/internal/docker/nodes/docker-compose.yml +++ b/packages/taiko-client/internal/docker/nodes/docker-compose.yml @@ -13,12 +13,10 @@ services: - "32301" - --host - "0.0.0.0" - - --hardfork - - cancun - l2_execution_engine: - container_name: l2_node - image: us-docker.pkg.dev/evmchain/images/taiko-geth:taiko + l2_geth: + container_name: l2_geth + image: us-docker.pkg.dev/evmchain/images/taiko-geth:softblock restart: unless-stopped pull_policy: always volumes: @@ -67,3 +65,41 @@ services: - --ws.api - admin,debug,eth,net,web3,txpool,miner,taiko - --taiko + + l2_reth: + container_name: l2_reth + image: us-docker.pkg.dev/evmchain/images/taiko-reth:v1.0.0 + restart: unless-stopped + pull_policy: always + volumes: + - .:/host + ports: + - "8545" + - "8546" + - "8551" + command: + - node + - --datadir + - /data/taiko-geth + - --chain + - "167001" + - --http + - --http.addr + - "0.0.0.0" + - --http.corsdomain + - "*" + - --ws + - --ws.addr + - "0.0.0.0" + - --ws.origins + - "*" + - --authrpc.addr + - "0.0.0.0" + - --authrpc.port + - "8551" + - --authrpc.jwtsecret + - /host/jwt.hex + - --http.api + - admin,debug,eth,net,web3,txpool,taiko + - --ws.api + - admin,debug,eth,net,web3,txpool,taiko diff --git a/packages/taiko-client/internal/docker/start.sh b/packages/taiko-client/internal/docker/start.sh index cde4a56a28c..b5839a0e2ed 100755 --- a/packages/taiko-client/internal/docker/start.sh +++ b/packages/taiko-client/internal/docker/start.sh @@ -2,10 +2,17 @@ source scripts/common.sh -DOCKER_SERVICE_LIST=("l1_node" "l2_execution_engine") +if [ "$L2_NODE" == "l2_reth" ];then + DOCKER_SERVICE_LIST=("l1_node" "l2_reth") + elif [ "$L2_NODE" == "l2_geth" ];then + DOCKER_SERVICE_LIST=("l1_node" "l2_geth") + else + echo "unsupported L2_NODE: $L2_NODE" + exit 1 +fi -# start docker compose service list -echo "start docker compose service: ${DOCKER_SERVICE_LIST[*]}" +# start docker compose services +echo "starting docker compose service: ${DOCKER_SERVICE_LIST[*]}" compose_up "${DOCKER_SERVICE_LIST[@]}" diff --git a/packages/taiko-client/internal/docker/stop.sh b/packages/taiko-client/internal/docker/stop.sh index 0a69ade3282..38e36534a96 100755 --- a/packages/taiko-client/internal/docker/stop.sh +++ b/packages/taiko-client/internal/docker/stop.sh @@ -2,7 +2,14 @@ source scripts/common.sh -DOCKER_SERVICE_LIST=("l1_node" "l2_execution_engine") +if [ "$L2_NODE" == "l2_reth" ];then + DOCKER_SERVICE_LIST=("l1_node" "l2_reth") + elif [ "$L2_NODE" == "l2_geth" ];then + DOCKER_SERVICE_LIST=("l1_node" "l2_geth") + else + echo "unsupported L2_NODE: $L2_NODE" + exit 1 +fi echo "stop docker compose service: ${DOCKER_SERVICE_LIST[*]}" diff --git a/packages/taiko-client/internal/metrics/metrics.go b/packages/taiko-client/internal/metrics/metrics.go index a95ee32ebf3..cc220eee635 100644 --- a/packages/taiko-client/internal/metrics/metrics.go +++ b/packages/taiko-client/internal/metrics/metrics.go @@ -4,13 +4,13 @@ import ( "context" opMetrics "github.com/ethereum-optimism/optimism/op-service/metrics" - "github.com/ethereum-optimism/optimism/op-service/opio" txmgrMetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" "github.com/ethereum/go-ethereum/log" "github.com/prometheus/client_golang/prometheus" "github.com/urfave/cli/v2" "github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) // Metrics @@ -29,6 +29,12 @@ var ( ProposerProposeEpochCounter = factory.NewCounter(prometheus.CounterOpts{Name: "proposer_epoch"}) ProposerProposedTxListsCounter = factory.NewCounter(prometheus.CounterOpts{Name: "proposer_proposed_txLists"}) ProposerProposedTxsCounter = factory.NewCounter(prometheus.CounterOpts{Name: "proposer_proposed_txs"}) + ProposerPoolContentFetchTime = factory.NewGauge(prometheus.GaugeOpts{Name: "proposer_pool_content_fetch_time"}) + ProposerEstimatedCostCalldata = factory.NewGauge(prometheus.GaugeOpts{Name: "proposer_estimated_cost_calldata"}) + ProposerEstimatedCostBlob = factory.NewGauge(prometheus.GaugeOpts{Name: "proposer_estimated_cost_blob"}) + ProposerProposeByCalldata = factory.NewCounter(prometheus.CounterOpts{Name: "proposer_propose_by_calldata"}) + ProposerProposeByBlob = factory.NewCounter(prometheus.CounterOpts{Name: "proposer_propose_by_blob"}) + ProposerCostEstimationError = factory.NewGauge(prometheus.GaugeOpts{Name: "proposer_cost_estimation_error"}) // Prover ProverLatestVerifiedIDGauge = factory.NewGauge(prometheus.GaugeOpts{Name: "prover_latestVerified_id"}) @@ -46,9 +52,45 @@ var ( ProverSubmissionErrorCounter = factory.NewCounter(prometheus.CounterOpts{ Name: "prover_proof_submission_error", }) + ProverAggregationSubmissionErrorCounter = factory.NewCounter(prometheus.CounterOpts{ + Name: "prover_proof_aggregation_submission_error", + }) + ProverSGXAggregationGenerationTime = factory.NewGauge(prometheus.GaugeOpts{ + Name: "prover_proof_sgx_aggregation_generation_time", + }) ProverSgxProofGeneratedCounter = factory.NewCounter(prometheus.CounterOpts{ Name: "prover_proof_sgx_generated", }) + ProverSgxProofGenerationTime = factory.NewGauge(prometheus.GaugeOpts{ + Name: "prover_proof_sgx_generation_time", + }) + ProverSgxProofAggregationGeneratedCounter = factory.NewCounter(prometheus.CounterOpts{ + Name: "prover_proof_sgx_aggregation_generated", + }) + ProverR0AggregationGenerationTime = factory.NewGauge(prometheus.GaugeOpts{ + Name: "prover_proof_r0_aggregation_generation_time", + }) + ProverR0ProofGeneratedCounter = factory.NewCounter(prometheus.CounterOpts{ + Name: "prover_proof_r0_generated", + }) + ProverR0ProofGenerationTime = factory.NewGauge(prometheus.GaugeOpts{ + Name: "prover_proof_r0_generation_time", + }) + ProverR0ProofAggregationGeneratedCounter = factory.NewCounter(prometheus.CounterOpts{ + Name: "prover_proof_r0_aggregation_generated", + }) + ProverSP1AggregationGenerationTime = factory.NewGauge(prometheus.GaugeOpts{ + Name: "prover_proof_sp1_aggregation_generation_time", + }) + ProverSp1ProofGeneratedCounter = factory.NewCounter(prometheus.CounterOpts{ + Name: "prover_proof_sp1_generated", + }) + ProverSP1ProofGenerationTime = factory.NewGauge(prometheus.GaugeOpts{ + Name: "prover_proof_sp1_generation_time", + }) + ProverSp1ProofAggregationGeneratedCounter = factory.NewCounter(prometheus.CounterOpts{ + Name: "prover_proof_sp1_aggregation_generated", + }) ProverSubmissionRevertedCounter = factory.NewCounter(prometheus.CounterOpts{ Name: "prover_proof_submission_reverted", }) @@ -85,7 +127,7 @@ func Serve(ctx context.Context, c *cli.Context) error { } }() - opio.BlockOnInterruptsContext(ctx) + rpc.BlockOnInterruptsContext(ctx) return nil } diff --git a/packages/taiko-client/internal/testutils/helper.go b/packages/taiko-client/internal/testutils/helper.go index a1f3cc05356..169fd5866dd 100644 --- a/packages/taiko-client/internal/testutils/helper.go +++ b/packages/taiko-client/internal/testutils/helper.go @@ -4,12 +4,7 @@ import ( "context" "crypto/ecdsa" "crypto/rand" - "errors" - "fmt" "math/big" - "net/http" - "net/url" - "os" "time" "github.com/cenkalti/backoff/v4" @@ -19,39 +14,28 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rlp" - "github.com/go-resty/resty/v2" "github.com/phayes/freeport" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/server" ) -func (s *ClientTestSuite) ProposeInvalidTxListBytes(proposer Proposer) { - invalidTxListBytes := RandomBytes(256) - - s.Nil(proposer.ProposeTxList(context.Background(), invalidTxListBytes, 1)) -} - func (s *ClientTestSuite) proposeEmptyBlockOp(ctx context.Context, proposer Proposer) { - emptyTxListBytes, err := rlp.EncodeToBytes(types.Transactions{}) - s.Nil(err) - s.Nil(proposer.ProposeTxList(ctx, emptyTxListBytes, 0)) + s.Nil(proposer.ProposeTxLists(ctx, []types.Transactions{{}})) } func (s *ClientTestSuite) ProposeAndInsertEmptyBlocks( proposer Proposer, blobSyncer BlobSyncer, -) []*bindings.TaikoL1ClientBlockProposed { - var events []*bindings.TaikoL1ClientBlockProposed +) []metadata.TaikoBlockMetaData { + var metadataList []metadata.TaikoBlockMetaData l1Head, err := s.RPCClient.L1.HeaderByNumber(context.Background(), nil) s.Nil(err) - sink := make(chan *bindings.TaikoL1ClientBlockProposed) - - sub, err := s.RPCClient.TaikoL1.WatchBlockProposed(nil, sink, nil, nil) + sink := make(chan *bindings.TaikoL1ClientBlockProposedV2) + sub, err := s.RPCClient.TaikoL1.WatchBlockProposedV2(nil, sink, nil) s.Nil(err) defer func() { sub.Unsubscribe() @@ -59,20 +43,25 @@ func (s *ClientTestSuite) ProposeAndInsertEmptyBlocks( }() // RLP encoded empty list - var emptyTxs []types.Transaction - encoded, err := rlp.EncodeToBytes(emptyTxs) - s.Nil(err) - - s.Nil(proposer.ProposeTxList(context.Background(), encoded, 0)) + s.Nil(proposer.ProposeTxLists(context.Background(), []types.Transactions{{}})) + s.Nil(blobSyncer.ProcessL1Blocks(context.Background())) - s.ProposeInvalidTxListBytes(proposer) + // Valid transactions lists. + s.ProposeValidBlock(proposer) + s.Nil(blobSyncer.ProcessL1Blocks(context.Background())) // Random bytes txList s.proposeEmptyBlockOp(context.Background(), proposer) + s.Nil(blobSyncer.ProcessL1Blocks(context.Background())) - events = append(events, []*bindings.TaikoL1ClientBlockProposed{<-sink, <-sink, <-sink}...) + var txHash common.Hash + for i := 0; i < 3; i++ { + event := <-sink + metadataList = append(metadataList, metadata.NewTaikoDataBlockMetadataOntake(event)) + txHash = event.Raw.TxHash + } - _, isPending, err := s.RPCClient.L1.TransactionByHash(context.Background(), events[len(events)-1].Raw.TxHash) + _, isPending, err := s.RPCClient.L1.TransactionByHash(context.Background(), txHash) s.Nil(err) s.False(isPending) @@ -80,52 +69,39 @@ func (s *ClientTestSuite) ProposeAndInsertEmptyBlocks( s.Nil(err) s.Greater(newL1Head.Number.Uint64(), l1Head.Number.Uint64()) - ctx, cancel := context.WithTimeout(context.Background(), time.Minute) - defer cancel() - - s.Nil(backoff.Retry(func() error { - return blobSyncer.ProcessL1Blocks(ctx) - }, backoff.NewExponentialBackOff())) - s.Nil(s.RPCClient.WaitTillL2ExecutionEngineSynced(context.Background())) - return events + return metadataList } -// ProposeAndInsertValidBlock proposes an valid tx list and then insert it +// ProposeAndInsertValidBlock proposes a valid tx list and then insert it // into L2 execution engine's local chain. func (s *ClientTestSuite) ProposeAndInsertValidBlock( proposer Proposer, blobSyncer BlobSyncer, -) *bindings.TaikoL1ClientBlockProposed { +) metadata.TaikoBlockMetaData { l1Head, err := s.RPCClient.L1.HeaderByNumber(context.Background(), nil) s.Nil(err) - l2Head, err := s.RPCClient.L2.HeaderByNumber(context.Background(), nil) - s.Nil(err) - // Propose txs in L2 execution engine's mempool - sink := make(chan *bindings.TaikoL1ClientBlockProposed) - - sub, err := s.RPCClient.TaikoL1.WatchBlockProposed(nil, sink, nil, nil) + sink := make(chan *bindings.TaikoL1ClientBlockProposedV2) + sub, err := s.RPCClient.TaikoL1.WatchBlockProposedV2(nil, sink, nil) s.Nil(err) + defer func() { sub.Unsubscribe() close(sink) }() - baseFeeInfo, err := s.RPCClient.TaikoL2.GetBasefee(nil, l1Head.Number.Uint64()+1, uint32(l2Head.GasUsed)) - s.Nil(err) - nonce, err := s.RPCClient.L2.PendingNonceAt(context.Background(), s.TestAddr) s.Nil(err) tx := types.NewTransaction( nonce, common.BytesToAddress(RandomBytes(32)), - common.Big1, - 100000, - new(big.Int).SetUint64(uint64(10*params.GWei)+baseFeeInfo.Basefee.Uint64()), + common.Big0, + 100_000, + new(big.Int).SetUint64(uint64(10*params.GWei)), []byte{}, ) signedTx, err := types.SignTx(tx, types.LatestSignerForChainID(s.RPCClient.L2.ChainID), s.TestAddrPrivKey) @@ -134,13 +110,16 @@ func (s *ClientTestSuite) ProposeAndInsertValidBlock( s.Nil(proposer.ProposeOp(context.Background())) - event := <-sink - - _, isPending, err := s.RPCClient.L1.TransactionByHash(context.Background(), event.Raw.TxHash) + var ( + event = <-sink + txHash = event.Raw.TxHash + meta = metadata.NewTaikoDataBlockMetadataOntake(event) + ) + _, isPending, err := s.RPCClient.L1.TransactionByHash(context.Background(), txHash) s.Nil(err) s.False(isPending) - receipt, err := s.RPCClient.L1.TransactionReceipt(context.Background(), event.Raw.TxHash) + receipt, err := s.RPCClient.L1.TransactionReceipt(context.Background(), txHash) s.Nil(err) s.Equal(types.ReceiptStatusSuccessful, receipt.Status) @@ -151,38 +130,51 @@ func (s *ClientTestSuite) ProposeAndInsertValidBlock( ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() - s.Nil(backoff.Retry(func() error { - return blobSyncer.ProcessL1Blocks(ctx) - }, backoff.NewExponentialBackOff())) + s.Nil(backoff.Retry(func() error { return blobSyncer.ProcessL1Blocks(ctx) }, backoff.NewExponentialBackOff())) s.Nil(s.RPCClient.WaitTillL2ExecutionEngineSynced(context.Background())) _, err = s.RPCClient.L2.HeaderByNumber(context.Background(), nil) s.Nil(err) - return event + return meta } func (s *ClientTestSuite) ProposeValidBlock( proposer Proposer, -) *bindings.TaikoL1ClientBlockProposed { +) { l1Head, err := s.RPCClient.L1.HeaderByNumber(context.Background(), nil) s.Nil(err) - l2Head, err := s.RPCClient.L2.HeaderByNumber(context.Background(), nil) + state, err := s.RPCClient.GetProtocolStateVariables(nil) s.Nil(err) - // Propose txs in L2 execution engine's mempool - sink := make(chan *bindings.TaikoL1ClientBlockProposed) + l2Head, err := s.RPCClient.L2.HeaderByNumber(context.Background(), new(big.Int).SetUint64(state.B.NumBlocks-1)) + s.Nil(err) - sub, err := s.RPCClient.TaikoL1.WatchBlockProposed(nil, sink, nil, nil) + // Propose txs in L2 execution engine's mempool + sink := make(chan *bindings.TaikoL1ClientBlockProposedV2) + sub, err := s.RPCClient.TaikoL1.WatchBlockProposedV2(nil, sink, nil) s.Nil(err) defer func() { sub.Unsubscribe() close(sink) }() - baseFeeInfo, err := s.RPCClient.TaikoL2.GetBasefee(nil, l1Head.Number.Uint64()+1, uint32(l2Head.GasUsed)) + ontakeForkHeight, err := s.RPCClient.TaikoL2.OntakeForkHeight(nil) + s.Nil(err) + + protocolConfigs, err := rpc.GetProtocolConfigs(s.RPCClient.TaikoL1, nil) + s.Nil(err) + + baseFee, err := s.RPCClient.CalculateBaseFee( + context.Background(), + l2Head, + l1Head.Number, + l2Head.Number.Uint64()+1 >= ontakeForkHeight, + &protocolConfigs.BaseFeeConfig, + l1Head.Time, + ) s.Nil(err) nonce, err := s.RPCClient.L2.PendingNonceAt(context.Background(), s.TestAddr) @@ -191,9 +183,9 @@ func (s *ClientTestSuite) ProposeValidBlock( tx := types.NewTransaction( nonce, common.BytesToAddress(RandomBytes(32)), - common.Big1, - 100000, - new(big.Int).SetUint64(uint64(10*params.GWei)+baseFeeInfo.Basefee.Uint64()), + common.Big0, + 100_000, + new(big.Int).SetUint64(uint64(10*params.GWei)+baseFee.Uint64()), []byte{}, ) signedTx, err := types.SignTx(tx, types.LatestSignerForChainID(s.RPCClient.L2.ChainID), s.TestAddrPrivKey) @@ -202,69 +194,21 @@ func (s *ClientTestSuite) ProposeValidBlock( s.Nil(proposer.ProposeOp(context.Background())) - event := <-sink - - _, isPending, err := s.RPCClient.L1.TransactionByHash(context.Background(), event.Raw.TxHash) + var ( + event = <-sink + txHash = event.Raw.TxHash + ) + _, isPending, err := s.RPCClient.L1.TransactionByHash(context.Background(), txHash) s.Nil(err) s.False(isPending) - receipt, err := s.RPCClient.L1.TransactionReceipt(context.Background(), event.Raw.TxHash) + receipt, err := s.RPCClient.L1.TransactionReceipt(context.Background(), txHash) s.Nil(err) s.Equal(types.ReceiptStatusSuccessful, receipt.Status) newL1Head, err := s.RPCClient.L1.HeaderByNumber(context.Background(), nil) s.Nil(err) s.Greater(newL1Head.Number.Uint64(), l1Head.Number.Uint64()) - - return event -} - -// NewTestProverServer starts a new prover server that has channel listeners to respond and react -// to requests for capacity, which provers can call. -func (s *ClientTestSuite) NewTestProverServer( - proverPrivKey *ecdsa.PrivateKey, - url *url.URL, -) *server.ProverServer { - protocolConfig, err := s.RPCClient.TaikoL1.GetConfig(nil) - s.Nil(err) - - srv, err := server.New(&server.NewProverServerOpts{ - ProverPrivateKey: proverPrivKey, - MinOptimisticTierFee: common.Big1, - MinSgxTierFee: common.Big1, - MinSgxAndZkVMTierFee: common.Big1, - MinEthBalance: common.Big1, - MinTaikoTokenBalance: common.Big1, - MaxExpiry: 24 * time.Hour, - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - RPC: s.RPCClient, - ProtocolConfigs: &protocolConfig, - LivenessBond: protocolConfig.LivenessBond, - }) - s.Nil(err) - - go func() { - if err := srv.Start(fmt.Sprintf(":%v", url.Port())); !errors.Is(err, http.ErrServerClosed) { - log.Error("Failed to start prover server", "error", err) - } - }() - - // Wait till the server fully started. - s.Nil(backoff.Retry(func() error { - res, err := resty.New().R().Get(url.String() + "/healthz") - if err != nil { - return err - } - if !res.IsSuccess() { - return fmt.Errorf("invalid response status code: %d", res.StatusCode()) - } - - return nil - }, backoff.NewExponentialBackOff())) - - return srv } // RandomHash generates a random blob of data and returns it as a hash. @@ -294,21 +238,38 @@ func RandomPort() int { return port } -// LocalRandomProverEndpoint returns a local free random prover endpoint. -func LocalRandomProverEndpoint() *url.URL { - port := RandomPort() +// SignatureFromRSV creates the signature bytes from r,s,v. +func SignatureFromRSV(r, s string, v byte) []byte { + return append(append(hexutil.MustDecode(r), hexutil.MustDecode(s)...), v) +} - proverEndpoint, err := url.Parse(fmt.Sprintf("http://localhost:%v", port)) +func AssembleTestTx( + client *rpc.EthClient, + priv *ecdsa.PrivateKey, + nonce uint64, + to *common.Address, + value *big.Int, + data []byte, +) (*types.Transaction, error) { + auth, err := bind.NewKeyedTransactorWithChainID(priv, client.ChainID) if err != nil { - log.Crit("Failed to parse local prover endpoint", "error", err) + return nil, err } - return proverEndpoint -} + tx, err := auth.Signer(auth.From, types.NewTx(&types.DynamicFeeTx{ + To: to, + Nonce: nonce, + Value: value, + GasTipCap: new(big.Int).SetUint64(10 * params.GWei), + GasFeeCap: new(big.Int).SetUint64(20 * params.GWei), + Gas: 2_100_000, + Data: data, + })) + if err != nil { + return nil, err + } -// SignatureFromRSV creates the signature bytes from r,s,v. -func SignatureFromRSV(r, s string, v byte) []byte { - return append(append(hexutil.MustDecode(r), hexutil.MustDecode(s)...), v) + return tx, client.SendTransaction(context.Background(), tx) } // SendDynamicFeeTx sends a dynamic transaction, used for tests. diff --git a/packages/taiko-client/internal/testutils/interfaces.go b/packages/taiko-client/internal/testutils/interfaces.go index d8d1a401899..d35f125ade5 100644 --- a/packages/taiko-client/internal/testutils/interfaces.go +++ b/packages/taiko-client/internal/testutils/interfaces.go @@ -3,6 +3,8 @@ package testutils import ( "context" + "github.com/ethereum/go-ethereum/core/types" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/utils" ) @@ -13,9 +15,5 @@ type BlobSyncer interface { type Proposer interface { utils.SubcommandApplication ProposeOp(ctx context.Context) error - ProposeTxList( - ctx context.Context, - txListBytes []byte, - txNum uint, - ) error + ProposeTxLists(ctx context.Context, txLists []types.Transactions) error } diff --git a/packages/taiko-client/internal/testutils/suite.go b/packages/taiko-client/internal/testutils/suite.go index 053b9711951..b510be4f2f4 100644 --- a/packages/taiko-client/internal/testutils/suite.go +++ b/packages/taiko-client/internal/testutils/suite.go @@ -4,7 +4,6 @@ import ( "context" "crypto/ecdsa" "math/big" - "net/url" "os" "strconv" "time" @@ -19,10 +18,9 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/server" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) type ClientTestSuite struct { @@ -31,9 +29,7 @@ type ClientTestSuite struct { RPCClient *rpc.Client TestAddrPrivKey *ecdsa.PrivateKey TestAddr common.Address - ProverEndpoints []*url.URL AddressManager *bindings.AddressManager - proverServer *server.ProverServer } func (s *ClientTestSuite) SetupTest() { @@ -56,15 +52,14 @@ func (s *ClientTestSuite) SetupTest() { s.NotEmpty(jwtSecret) rpcCli, err := rpc.NewClient(context.Background(), &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - GuardianProverMajorityAddress: common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS")), - GuardianProverMinorityAddress: common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY_ADDRESS")), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), + GuardianProverMajorityAddress: common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")), + GuardianProverMinorityAddress: common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY")), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: string(jwtSecret), }) s.Nil(err) @@ -75,13 +70,14 @@ func (s *ClientTestSuite) SetupTest() { l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) s.Nil(err) - s.ProverEndpoints = []*url.URL{LocalRandomProverEndpoint()} - s.proverServer = s.NewTestProverServer(l1ProverPrivKey, s.ProverEndpoints[0]) - - balance, err := rpcCli.TaikoToken.BalanceOf(nil, crypto.PubkeyToAddress(l1ProverPrivKey.PublicKey)) + allowance, err := rpcCli.TaikoToken.Allowance( + nil, + crypto.PubkeyToAddress(l1ProverPrivKey.PublicKey), + common.HexToAddress(os.Getenv("TAIKO_L1")), + ) s.Nil(err) - if balance.Cmp(common.Big0) == 0 { + if allowance.Cmp(common.Big0) == 0 { ownerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_CONTRACT_OWNER_PRIVATE_KEY"))) s.Nil(err) @@ -98,46 +94,23 @@ func (s *ClientTestSuite) SetupTest() { _, err = rpcCli.TaikoToken.Transfer(opts, crypto.PubkeyToAddress(l1ProverPrivKey.PublicKey), proverBalance) s.Nil(err) - opts, err = bind.NewKeyedTransactorWithChainID(ownerPrivKey, rpcCli.L1.ChainID) - s.Nil(err) - _, err = rpcCli.TaikoToken.Transfer(opts, common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), proverBalance) - s.Nil(err) - - // Increase allowance for AssignmentHook and TaikoL1 - s.setAllowance(l1ProverPrivKey) - s.setAllowance(ownerPrivKey) - - t, err := txmgr.NewSimpleTxManager( - "enableProver", - log.Root(), - new(metrics.NoopTxMetrics), - txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), - NumConfirmations: 0, - SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, - PrivateKey: common.Bytes2Hex(crypto.FromECDSA(ownerPrivKey)), - FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, - FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, - MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, - MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, - ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, - ReceiptQueryInterval: 1 * time.Second, - NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, - TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, - TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, - }, + _, err = rpcCli.TaikoToken.Transfer( + opts, + common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY")), + new(big.Int).Div(proverBalance, common.Big2), ) s.Nil(err) - data, err := encoding.ProverSetABI.Pack("enableProver", crypto.PubkeyToAddress(l1ProverPrivKey.PublicKey), true) + _, err = rpcCli.TaikoToken.Transfer( + opts, + common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")), + new(big.Int).Div(proverBalance, common.Big2), + ) s.Nil(err) - proverSetAddress := common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")) - _, err = t.Send(context.Background(), txmgr.TxCandidate{ - TxData: data, - To: &proverSetAddress, - }) - s.Nil(err) + // Increase allowance for TaikoL1 + s.setAllowance(l1ProverPrivKey) + s.setAllowance(ownerPrivKey) } s.testnetL1SnapshotID = s.SetL1Snapshot() @@ -149,7 +122,7 @@ func (s *ClientTestSuite) setAllowance(key *ecdsa.PrivateKey) { log.Root(), new(metrics.NoopTxMetrics), txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(key)), @@ -171,24 +144,12 @@ func (s *ClientTestSuite) setAllowance(key *ecdsa.PrivateKey) { var ( bigInt = new(big.Int).Exp(big.NewInt(1_000_000_000), new(big.Int).SetUint64(uint64(decimal)), nil) - taikoTokenAddress = common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")) + taikoTokenAddress = common.HexToAddress(os.Getenv("TAIKO_TOKEN")) ) data, err := encoding.TaikoTokenABI.Pack( "approve", - common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - bigInt, - ) - s.Nil(err) - _, err = t.Send(context.Background(), txmgr.TxCandidate{ - TxData: data, - To: &taikoTokenAddress, - }) - s.Nil(err) - - data, err = encoding.TaikoTokenABI.Pack( - "approve", - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), + common.HexToAddress(os.Getenv("TAIKO_L1")), bigInt, ) s.Nil(err) @@ -203,7 +164,6 @@ func (s *ClientTestSuite) TearDownTest() { s.RevertL1Snapshot(s.testnetL1SnapshotID) s.Nil(rpc.SetHead(context.Background(), s.RPCClient.L2, common.Big0)) - s.Nil(s.proverServer.Shutdown(context.Background())) } func (s *ClientTestSuite) SetL1Automine(automine bool) { diff --git a/packages/taiko-client/internal/utils/test_utils.go b/packages/taiko-client/internal/utils/test_utils.go deleted file mode 100644 index a1ca5db35fe..00000000000 --- a/packages/taiko-client/internal/utils/test_utils.go +++ /dev/null @@ -1,16 +0,0 @@ -package utils - -import ( - "context" - "testing" - - "github.com/ethereum/go-ethereum/rpc" - "github.com/stretchr/testify/assert" -) - -// MineL1Block mines a block on the L1 chain. -func MineL1Block(t *testing.T, l1Client *rpc.Client) { - var blockID string - assert.Nil(t, l1Client.CallContext(context.Background(), &blockID, "evm_mine")) - assert.NotEmpty(t, blockID) -} diff --git a/packages/taiko-client/internal/version/version.go b/packages/taiko-client/internal/version/version.go index cc0463bea5e..d3fffe26dd0 100644 --- a/packages/taiko-client/internal/version/version.go +++ b/packages/taiko-client/internal/version/version.go @@ -1,7 +1,7 @@ package version // Version info. -const Version = "0.18.0" // x-release-please-version +const Version = "0.42.1" // x-release-please-version var meta = "dev" diff --git a/packages/taiko-client/package.json b/packages/taiko-client/package.json index 302adf42692..6d992d5a88d 100644 --- a/packages/taiko-client/package.json +++ b/packages/taiko-client/package.json @@ -1,5 +1,5 @@ { "name": "taiko-client", - "version": "0.25.0", + "version": "0.42.1", "private": true } diff --git a/packages/taiko-client/pkg/chain_iterator/block_batch_iterator.go b/packages/taiko-client/pkg/chain_iterator/block_batch_iterator.go index 20ee9136672..56242c39d2b 100644 --- a/packages/taiko-client/pkg/chain_iterator/block_batch_iterator.go +++ b/packages/taiko-client/pkg/chain_iterator/block_batch_iterator.go @@ -273,6 +273,15 @@ func (i *BlockBatchIterator) rewindOnReorgDetected() error { newCurrentHeight = i.current.Number.Uint64() - i.reorgRewindDepth } + head, err := i.client.BlockNumber(i.ctx) + if err != nil { + return err + } + + if newCurrentHeight > head { + newCurrentHeight = head + } + current, err := i.client.HeaderByNumber(i.ctx, new(big.Int).SetUint64(newCurrentHeight)) if err != nil { return err diff --git a/packages/taiko-client/pkg/chain_iterator/event_iterator/block_proposed_iterator.go b/packages/taiko-client/pkg/chain_iterator/event_iterator/block_proposed_iterator.go index 23b2cf73b9c..67fc0fea23d 100644 --- a/packages/taiko-client/pkg/chain_iterator/event_iterator/block_proposed_iterator.go +++ b/packages/taiko-client/pkg/chain_iterator/event_iterator/block_proposed_iterator.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" chainIterator "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/chain_iterator" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) @@ -20,7 +21,7 @@ type EndBlockProposedEventIterFunc func() // iterated. type OnBlockProposedEvent func( context.Context, - *bindings.TaikoL1ClientBlockProposed, + metadata.TaikoBlockMetaData, EndBlockProposedEventIterFunc, ) error @@ -97,7 +98,7 @@ func (i *BlockProposedIterator) end() { // by a event iterator's inner block iterator. func assembleBlockProposedIteratorCallback( client *rpc.EthClient, - taikoL1Client *bindings.TaikoL1Client, + taikoL1 *bindings.TaikoL1Client, filterQuery []*big.Int, callback OnBlockProposedEvent, eventIter *BlockProposedIterator, @@ -109,7 +110,8 @@ func assembleBlockProposedIteratorCallback( endFunc chainIterator.EndIterFunc, ) error { endHeight := end.Number.Uint64() - iter, err := taikoL1Client.FilterBlockProposed( + + iter, err := taikoL1.FilterBlockProposed( &bind.FilterOpts{Start: start.Number.Uint64(), End: &endHeight, Context: ctx}, filterQuery, nil, @@ -119,10 +121,39 @@ func assembleBlockProposedIteratorCallback( } defer iter.Close() + iterOntake, err := taikoL1.FilterBlockProposedV2( + &bind.FilterOpts{Start: start.Number.Uint64(), End: &endHeight, Context: ctx}, + filterQuery, + ) + if err != nil { + return err + } + defer iterOntake.Close() + for iter.Next() { event := iter.Event - if err := callback(ctx, event, eventIter.end); err != nil { + if err := callback(ctx, metadata.NewTaikoDataBlockMetadataLegacy(event), eventIter.end); err != nil { + return err + } + + if eventIter.isEnd { + endFunc() + return nil + } + + current, err := client.HeaderByHash(ctx, event.Raw.BlockHash) + if err != nil { + return err + } + + updateCurrentFunc(current) + } + + for iterOntake.Next() { + event := iterOntake.Event + + if err := callback(ctx, metadata.NewTaikoDataBlockMetadataOntake(event), eventIter.end); err != nil { return err } diff --git a/packages/taiko-client/pkg/config/chain_config.go b/packages/taiko-client/pkg/config/chain_config.go new file mode 100644 index 00000000000..c0a05974b2d --- /dev/null +++ b/packages/taiko-client/pkg/config/chain_config.go @@ -0,0 +1,73 @@ +package config + +import ( + "fmt" + "math/big" + "strings" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" +) + +// ChainConfig is the core config which determines the blockchain settings. +type ChainConfig struct { + // Ontake switch block (nil = no fork, 0 = already on ontake) + ProtocolConfigs *bindings.TaikoDataConfig `json:"protocolConfigs"` +} + +// NewChainConfig creates a new ChainConfig instance. +func NewChainConfig(protocolConfigs *bindings.TaikoDataConfig) *ChainConfig { + cfg := &ChainConfig{protocolConfigs} + + log.Info("") + log.Info(strings.Repeat("-", 153)) + for _, line := range strings.Split(cfg.Description(), "\n") { + log.Info(line) + } + log.Info(strings.Repeat("-", 153)) + log.Info("") + + return cfg +} + +// NetworkNames are user friendly names to use in the chain spec banner. +var NetworkNames = map[uint64]string{ + params.TaikoMainnetNetworkID.Uint64(): "Taiko Mainnet", + params.HeklaNetworkID.Uint64(): "Taiko Hekla Testnet", + params.TaikoInternalL2ANetworkID.Uint64(): "Taiko Internal Devnet", +} + +// Description returns a human-readable description of ChainConfig. +func (c *ChainConfig) Description() string { + var banner string + + // Create some basic network config output + network := NetworkNames[c.ProtocolConfigs.ChainId] + if network == "" { + network = "unknown" + } + banner += fmt.Sprintf("Chain ID: %v (%s)\n", c.ProtocolConfigs.ChainId, network) + + // Create a list of forks with a short description of them. + banner += "Hard forks (block based):\n" + banner += fmt.Sprintf(" - Ontake: #%-8v\n", c.ProtocolConfigs.OntakeForkHeight) + banner += "\n" + + return banner +} + +// IsOntake returns whether num is either equal to the ontake block or greater. +func (c *ChainConfig) IsOntake(num *big.Int) bool { + return isBlockForked(new(big.Int).SetUint64(c.ProtocolConfigs.OntakeForkHeight), num) +} + +// isBlockForked returns whether a fork scheduled at block s is active at the +// given head block. +func isBlockForked(s, head *big.Int) bool { + if s == nil || head == nil { + return false + } + return s.Cmp(head) <= 0 +} diff --git a/packages/taiko-client/pkg/jwt/jwt.go b/packages/taiko-client/pkg/jwt/jwt.go index 33ba0dacc66..0b0c9521dc0 100644 --- a/packages/taiko-client/pkg/jwt/jwt.go +++ b/packages/taiko-client/pkg/jwt/jwt.go @@ -6,7 +6,7 @@ import ( "fmt" "strings" - "github.com/prysmaticlabs/prysm/v4/io/file" + "github.com/prysmaticlabs/prysm/v5/io/file" ) // Taken from: https://github.com/prysmaticlabs/prysm/blob/v2.1.4/cmd/beacon-chain/execution/options.go#L43 diff --git a/packages/taiko-client/pkg/rpc/beaconclient.go b/packages/taiko-client/pkg/rpc/beaconclient.go index 100bc61ad8e..acf70c86b79 100644 --- a/packages/taiko-client/pkg/rpc/beaconclient.go +++ b/packages/taiko-client/pkg/rpc/beaconclient.go @@ -10,10 +10,9 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/v4/api/client" - "github.com/prysmaticlabs/prysm/v4/api/client/beacon" - "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/eth/blob" - "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/eth/config" + "github.com/prysmaticlabs/prysm/v5/api/client" + "github.com/prysmaticlabs/prysm/v5/api/client/beacon" + "github.com/prysmaticlabs/prysm/v5/api/server/structs" ) var ( @@ -86,21 +85,20 @@ func NewBeaconClient(endpoint string, timeout time.Duration) (*BeaconClient, err } // GetBlobs returns the sidecars for a given slot. -func (c *BeaconClient) GetBlobs(ctx context.Context, time uint64) ([]*blob.Sidecar, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) +func (c *BeaconClient) GetBlobs(ctx context.Context, time uint64) ([]*structs.Sidecar, error) { + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() slot, err := c.timeToSlot(time) if err != nil { return nil, err } - resBytes, err := c.Get(ctxWithTimeout, c.BaseURL().Path+fmt.Sprintf(sidecarsRequestURL, slot)) if err != nil { return nil, err } - var sidecars *blob.SidecarsResponse + var sidecars *structs.SidecarsResponse if err = json.Unmarshal(resBytes, &sidecars); err != nil { return nil, err } @@ -117,12 +115,12 @@ func (c *BeaconClient) timeToSlot(timestamp uint64) (uint64, error) { } // getConfigSpec retrieve the current configs of the network used by the beacon node. -func getConfigSpec(ctx context.Context, c *beacon.Client) (*config.GetSpecResponse, error) { +func getConfigSpec(ctx context.Context, c *beacon.Client) (*structs.GetSpecResponse, error) { body, err := c.Get(ctx, c.BaseURL().Path+getConfigSpecPath) if err != nil { return nil, errors.Wrap(err, "error requesting configSpecPath") } - fsr := &config.GetSpecResponse{} + fsr := &structs.GetSpecResponse{} err = json.Unmarshal(body, fsr) if err != nil { return nil, err diff --git a/packages/taiko-client/pkg/rpc/blob_datasource.go b/packages/taiko-client/pkg/rpc/blob_datasource.go index ed6e98bedb6..37904158540 100644 --- a/packages/taiko-client/pkg/rpc/blob_datasource.go +++ b/packages/taiko-client/pkg/rpc/blob_datasource.go @@ -3,15 +3,15 @@ package rpc import ( "context" "encoding/json" + "errors" "fmt" "net/url" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" "github.com/go-resty/resty/v2" - "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/eth/blob" + "github.com/prysmaticlabs/prysm/v5/api/server/structs" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg" ) @@ -75,34 +75,33 @@ func (p *BlobServerResponse) UnmarshalJSON(data []byte) error { // GetBlobs get blob sidecar by meta func (ds *BlobDataSource) GetBlobs( ctx context.Context, - meta *bindings.TaikoDataBlockMetadata, -) ([]*blob.Sidecar, error) { - if !meta.BlobUsed { - return nil, pkg.ErrBlobUnused - } - + timestamp uint64, + blobHash common.Hash, +) ([]*structs.Sidecar, error) { var ( - sidecars []*blob.Sidecar + sidecars []*structs.Sidecar err error ) if ds.client.L1Beacon == nil { sidecars, err = nil, pkg.ErrBeaconNotFound } else { - sidecars, err = ds.client.L1Beacon.GetBlobs(ctx, meta.Timestamp) + sidecars, err = ds.client.L1Beacon.GetBlobs(ctx, timestamp) } if err != nil { - log.Info("Failed to get blobs from beacon, try to use blob server.", "error", err.Error()) + if !errors.Is(err, pkg.ErrBeaconNotFound) { + log.Info("Failed to get blobs from beacon, try to use blob server.", "error", err.Error()) + } if ds.blobServerEndpoint == nil && ds.socialScanEndpoint == nil { log.Info("No blob server endpoint set") return nil, err } - blobs, err := ds.getBlobFromServer(ctx, meta.BlobHash) + blobs, err := ds.getBlobFromServer(ctx, blobHash) if err != nil { return nil, err } - sidecars = make([]*blob.Sidecar, len(blobs.Data)) + sidecars = make([]*structs.Sidecar, len(blobs.Data)) for index, value := range blobs.Data { - sidecars[index] = &blob.Sidecar{ + sidecars[index] = &structs.Sidecar{ KzgCommitment: value.KzgCommitment, Blob: value.Blob, } @@ -135,7 +134,7 @@ func (ds *BlobDataSource) getBlobFromServer(ctx context.Context, blobHash common SetHeader("Accept", "application/json"). Get(requestURL) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to get blob from server, request_url: %s, err: %w", requestURL, err) } if !resp.IsSuccess() { return nil, fmt.Errorf( diff --git a/packages/taiko-client/pkg/rpc/blob_datasource_test.go b/packages/taiko-client/pkg/rpc/blob_datasource_test.go deleted file mode 100644 index 3f2f78873d3..00000000000 --- a/packages/taiko-client/pkg/rpc/blob_datasource_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package rpc - -import ( - "context" - "net/url" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/require" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" -) - -func TestGetBlobsFromBlobScan(t *testing.T) { - blobScanEndpoint, err := url.Parse("https://api.holesky.blobscan.com") - require.Nil(t, err) - require.NotNil(t, blobScanEndpoint) - ds := NewBlobDataSource( - context.Background(), - &Client{}, - blobScanEndpoint, - nil, - ) - sidecars, err := ds.GetBlobs( - context.Background(), - &bindings.TaikoDataBlockMetadata{ - BlobHash: common.HexToHash("0x0145185449c57dee4e6c921b702e5d572fbeb026f96c220a6a17b79d157d921b"), - BlobUsed: true, - }, - ) - require.Nil(t, err) - require.NotNil(t, sidecars) - require.NotNil(t, sidecars[0].Blob) -} diff --git a/packages/taiko-client/pkg/rpc/client.go b/packages/taiko-client/pkg/rpc/client.go index f9be27f341a..461a77c599e 100644 --- a/packages/taiko-client/pkg/rpc/client.go +++ b/packages/taiko-client/pkg/rpc/client.go @@ -2,6 +2,7 @@ package rpc import ( "context" + "fmt" "os" "time" @@ -28,6 +29,7 @@ type Client struct { L1Beacon *BeaconClient // Protocol contracts clients TaikoL1 *bindings.TaikoL1Client + LibProposing *bindings.LibProposing TaikoL2 *bindings.TaikoL2Client TaikoToken *bindings.TaikoToken GuardianProverMajority *bindings.GuardianProver @@ -56,6 +58,7 @@ type ClientConfig struct { // NewClient initializes all RPC clients used by Taiko client software. func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { + log.Debug("Initializing new RPC client") var ( l1Client *EthClient l2Client *EthClient @@ -66,18 +69,21 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { // Keep retrying to connect to the RPC endpoints until success or context is cancelled. if err := backoff.Retry(func() error { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + log.Debug("Attempting to connect to RPC endpoints") + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() if l1Client, err = NewEthClient(ctxWithTimeout, cfg.L1Endpoint, cfg.Timeout); err != nil { log.Error("Failed to connect to L1 endpoint, retrying", "endpoint", cfg.L1Endpoint, "err", err) return err } + log.Debug("Successfully connected to L1 endpoint", "endpoint", cfg.L1Endpoint) if l2Client, err = NewEthClient(ctxWithTimeout, cfg.L2Endpoint, cfg.Timeout); err != nil { log.Error("Failed to connect to L2 endpoint, retrying", "endpoint", cfg.L2Endpoint, "err", err) return err } + log.Debug("Successfully connected to L2 endpoint", "endpoint", cfg.L2Endpoint) // NOTE: when running tests, we do not have a L1 beacon endpoint. if cfg.L1BeaconEndpoint != "" && os.Getenv("RUN_TESTS") == "" { @@ -85,6 +91,7 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { log.Error("Failed to connect to L1 beacon endpoint, retrying", "endpoint", cfg.L1BeaconEndpoint, "err", err) return err } + log.Debug("Successfully connected to L1 beacon endpoint", "endpoint", cfg.L1BeaconEndpoint) } if cfg.L2CheckPoint != "" { @@ -93,6 +100,7 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { log.Error("Failed to connect to L2 checkpoint endpoint, retrying", "endpoint", cfg.L2CheckPoint, "err", err) return err } + log.Debug("Successfully connected to L2 checkpoint endpoint", "endpoint", cfg.L2CheckPoint) } return nil @@ -100,18 +108,26 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { return nil, err } - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + log.Debug("Initializing contract clients") + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() taikoL1, err := bindings.NewTaikoL1Client(cfg.TaikoL1Address, l1Client) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize TaikoL1 client: %w", err) + } + log.Debug("TaikoL1 client initialized", "address", cfg.TaikoL1Address) + + libProposing, err := bindings.NewLibProposing(cfg.TaikoL1Address, l1Client) + if err != nil { + return nil, fmt.Errorf("failed to initialize LibProposing: %w", err) } taikoL2, err := bindings.NewTaikoL2Client(cfg.TaikoL2Address, l2Client) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize TaikoL2 client: %w", err) } + log.Debug("TaikoL2 client initialized", "address", cfg.TaikoL2Address) var ( taikoToken *bindings.TaikoToken @@ -121,22 +137,23 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { ) if cfg.TaikoTokenAddress.Hex() != ZeroAddress.Hex() { if taikoToken, err = bindings.NewTaikoToken(cfg.TaikoTokenAddress, l1Client); err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize TaikoToken: %w", err) } + log.Debug("TaikoToken initialized", "address", cfg.TaikoTokenAddress) } if cfg.GuardianProverMinorityAddress.Hex() != ZeroAddress.Hex() { if guardianProverMinority, err = bindings.NewGuardianProver(cfg.GuardianProverMinorityAddress, l1Client); err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize GuardianProverMinority: %w", err) } } if cfg.GuardianProverMajorityAddress.Hex() != ZeroAddress.Hex() { if guardianProverMajority, err = bindings.NewGuardianProver(cfg.GuardianProverMajorityAddress, l1Client); err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize GuardianProverMajority: %w", err) } } if cfg.ProverSetAddress.Hex() != ZeroAddress.Hex() { if proverSet, err = bindings.NewProverSet(cfg.ProverSetAddress, l1Client); err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize ProverSet: %w", err) } } @@ -144,9 +161,10 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { // won't be initialized. var l2AuthClient *EngineClient if len(cfg.L2EngineEndpoint) != 0 && len(cfg.JwtSecret) != 0 { + log.Debug("Initializing L2 Engine client", "endpoint", cfg.L2EngineEndpoint) l2AuthClient, err = NewJWTEngineClient(cfg.L2EngineEndpoint, cfg.JwtSecret) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize L2 Engine client: %w", err) } } @@ -157,6 +175,7 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { L2CheckPoint: l2CheckPoint, L2Engine: l2AuthClient, TaikoL1: taikoL1, + LibProposing: libProposing, TaikoL2: taikoL2, TaikoToken: taikoToken, GuardianProverMajority: guardianProverMajority, @@ -165,8 +184,9 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { } if err := client.ensureGenesisMatched(ctxWithTimeout); err != nil { - return nil, err + return nil, fmt.Errorf("genesis mismatch detected: %w", err) } + log.Debug("RPC client initialization completed successfully") return client, nil } diff --git a/packages/taiko-client/pkg/rpc/client_test.go b/packages/taiko-client/pkg/rpc/client_test.go index 7bdfc414d0e..b6ca88c9a45 100644 --- a/packages/taiko-client/pkg/rpc/client_test.go +++ b/packages/taiko-client/pkg/rpc/client_test.go @@ -12,13 +12,12 @@ import ( func newTestClient(t *testing.T) *Client { client, err := NewClient(context.Background(), &ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: os.Getenv("JWT_SECRET"), }) @@ -30,13 +29,12 @@ func newTestClient(t *testing.T) *Client { func newTestClientWithTimeout(t *testing.T) *Client { client, err := NewClient(context.Background(), &ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: os.Getenv("JWT_SECRET"), Timeout: 5 * time.Second, }) diff --git a/packages/taiko-client/pkg/rpc/dial.go b/packages/taiko-client/pkg/rpc/dial.go index 985ec0db5fb..e9649686525 100644 --- a/packages/taiko-client/pkg/rpc/dial.go +++ b/packages/taiko-client/pkg/rpc/dial.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/rpc" ) -// DialClientWithBackoff connects a ethereum RPC client at the given URL with +// DialClientWithBackoff connects an ethereum RPC client at the given URL with // a backoff strategy. Added a retry limit so it doesn't retry endlessly func DialClientWithBackoff( ctx context.Context, @@ -21,7 +21,7 @@ func DialClientWithBackoff( var client *ethclient.Client if err := backoff.Retry( func() (err error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() client, err = ethclient.DialContext(ctxWithTimeout, url) @@ -52,7 +52,7 @@ func DialEngineClientWithBackoff( var engineClient *EngineClient if err := backoff.Retry( func() (err error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() jwtAuth := node.NewJWTAuth(StringToBytes32(jwtSecret)) diff --git a/packages/taiko-client/pkg/rpc/dial_test.go b/packages/taiko-client/pkg/rpc/dial_test.go index c07cfae08bb..f488d781230 100644 --- a/packages/taiko-client/pkg/rpc/dial_test.go +++ b/packages/taiko-client/pkg/rpc/dial_test.go @@ -15,13 +15,12 @@ import ( func TestDialEngineClientWithBackoff(t *testing.T) { jwtSecret, err := jwt.ParseSecretFromFile(os.Getenv("JWT_SECRET")) - require.Nil(t, err) require.NotEmpty(t, jwtSecret) client, err := DialEngineClientWithBackoff( context.Background(), - os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + os.Getenv("L2_AUTH"), string(jwtSecret), 12*time.Second, 10, @@ -38,7 +37,7 @@ func TestDialEngineClientWithBackoff(t *testing.T) { func TestDialClientWithBackoff(t *testing.T) { client, err := DialClientWithBackoff( context.Background(), - os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), + os.Getenv("L2_WS"), 12*time.Second, 10, ) diff --git a/packages/taiko-client/pkg/rpc/engine.go b/packages/taiko-client/pkg/rpc/engine.go index e1ec3a5c841..24012f88175 100644 --- a/packages/taiko-client/pkg/rpc/engine.go +++ b/packages/taiko-client/pkg/rpc/engine.go @@ -19,6 +19,7 @@ type EngineClient struct { *rpc.Client } +// NewJWTEngineClient creates a new EngineClient with JWT authentication. func NewJWTEngineClient(url, jwtSecret string) (*EngineClient, error) { var jwt = StringToBytes32(jwtSecret) if jwt == (common.Hash{}) || url == "" { @@ -99,8 +100,8 @@ func (c *EngineClient) ExchangeTransitionConfiguration( return result, nil } -// TxPoolContent fetches the transaction pool content from the L2 execution engine. -func (c *EngineClient) TxPoolContent( +// TxPoolContentWithMinTip fetches the transaction pool content from the L2 execution engine. +func (c *EngineClient) TxPoolContentWithMinTip( ctx context.Context, beneficiary common.Address, baseFee *big.Int, @@ -108,21 +109,23 @@ func (c *EngineClient) TxPoolContent( maxBytesPerTxList uint64, locals []string, maxTransactionsLists uint64, + minTip uint64, ) ([]*miner.PreBuiltTxList, error) { timeoutCtx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() - var result []*miner.PreBuiltTxList + if err := c.CallContext( timeoutCtx, &result, - "taikoAuth_txPoolContent", + "taikoAuth_txPoolContentWithMinTip", beneficiary, baseFee, blockMaxGasLimit, maxBytesPerTxList, locals, maxTransactionsLists, + minTip, ); err != nil { return nil, err } diff --git a/packages/taiko-client/pkg/rpc/ethclient.go b/packages/taiko-client/pkg/rpc/ethclient.go index 4b6c7b7e39e..6b5e0312f3d 100644 --- a/packages/taiko-client/pkg/rpc/ethclient.go +++ b/packages/taiko-client/pkg/rpc/ethclient.go @@ -2,6 +2,8 @@ package rpc import ( "context" + "errors" + "fmt" "math/big" "time" @@ -14,10 +16,16 @@ import ( "github.com/ethereum/go-ethereum/rpc" ) +var ( + ErrInvalidLenOfParams = errors.New("invalid length of parameters") +) + +// gethClient is a wrapper for go-ethereum geth client. type gethClient struct { *gethclient.Client } +// ethClient is a wrapper for go-ethereum eth client. type ethClient struct { *ethclient.Client } @@ -33,6 +41,7 @@ type EthClient struct { timeout time.Duration } +// NewEthClient creates a new EthClient instance. func NewEthClient(ctx context.Context, url string, timeout time.Duration) (*EthClient, error) { var timeoutVal = defaultTimeout if timeout != 0 { @@ -65,19 +74,47 @@ func NewEthClient(ctx context.Context, url string, timeout time.Duration) (*EthC // Note that loading full blocks requires two requests. Use HeaderByHash // if you don't need all transactions or uncle headers. func (c *EthClient) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.BlockByHash(ctxWithTimeout, hash) } +func (c *EthClient) BatchBlocksByHashes(ctx context.Context, hashes []common.Hash) ([]*types.Block, error) { + if len(hashes) < 1 { + return nil, ErrInvalidLenOfParams + } + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) + defer cancel() + + reqs := make([]rpc.BatchElem, len(hashes)) + results := make([]*types.Block, len(hashes)) + for i, hash := range hashes { + reqs[i] = rpc.BatchElem{ + Method: "eth_getBlockByHash", + Args: []interface{}{hash, true}, + Result: &results[i], + } + } + if err := c.BatchCallContext(ctxWithTimeout, reqs); err != nil { + return nil, err + } + for i := range reqs { + if reqs[i].Error != nil { + return nil, reqs[i].Error + } + } + + return results, nil +} + // BlockByNumber returns a block from the current canonical chain. If number is nil, the // latest known block is returned. // // Note that loading full blocks requires two requests. Use HeaderByNumber // if you don't need all transactions or uncle headers. func (c *EthClient) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.BlockByNumber(ctxWithTimeout, number) @@ -85,7 +122,7 @@ func (c *EthClient) BlockByNumber(ctx context.Context, number *big.Int) (*types. // BlockNumber returns the most recent block number func (c *EthClient) BlockNumber(ctx context.Context) (uint64, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.BlockNumber(ctxWithTimeout) @@ -93,7 +130,7 @@ func (c *EthClient) BlockNumber(ctx context.Context) (uint64, error) { // PeerCount returns the number of p2p peers as reported by the net_peerCount method. func (c *EthClient) PeerCount(ctx context.Context) (uint64, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PeerCount(ctxWithTimeout) @@ -101,7 +138,7 @@ func (c *EthClient) PeerCount(ctx context.Context) (uint64, error) { // HeaderByHash returns the block header with the given hash. func (c *EthClient) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.HeaderByHash(ctxWithTimeout, hash) @@ -110,18 +147,61 @@ func (c *EthClient) HeaderByHash(ctx context.Context, hash common.Hash) (*types. // HeaderByNumber returns a block header from the current canonical chain. If number is // nil, the latest known header is returned. func (c *EthClient) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.HeaderByNumber(ctxWithTimeout, number) } +func (c *EthClient) BatchHeadersByNumbers(ctx context.Context, numbers []*big.Int) ([]*types.Header, error) { + if len(numbers) < 1 { + return nil, ErrInvalidLenOfParams + } + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) + defer cancel() + + reqs := make([]rpc.BatchElem, len(numbers)) + results := make([]*types.Header, len(numbers)) + for i, blockNum := range numbers { + reqs[i] = rpc.BatchElem{ + Method: "eth_getBlockByNumber", + Args: []interface{}{toBlockNumArg(blockNum), false}, + Result: &results[i], + } + } + if err := c.BatchCallContext(ctxWithTimeout, reqs); err != nil { + return nil, err + } + for i := range reqs { + if reqs[i].Error != nil { + return nil, reqs[i].Error + } + } + + return results, nil +} + +func toBlockNumArg(number *big.Int) string { + if number == nil { + return "latest" + } + if number.Sign() >= 0 { + return hexutil.EncodeBig(number) + } + // It's negative. + if number.IsInt64() { + return rpc.BlockNumber(number.Int64()).String() + } + // It's negative and large, which is invalid. + return fmt.Sprintf("", number) +} + // TransactionByHash returns the transaction with the given hash. func (c *EthClient) TransactionByHash( ctx context.Context, hash common.Hash, ) (tx *types.Transaction, isPending bool, err error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.TransactionByHash(ctxWithTimeout, hash) @@ -139,7 +219,7 @@ func (c *EthClient) TransactionSender( block common.Hash, index uint, ) (common.Address, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.TransactionSender(ctxWithTimeout, tx, block, index) @@ -147,7 +227,7 @@ func (c *EthClient) TransactionSender( // TransactionCount returns the total number of transactions in the given block. func (c *EthClient) TransactionCount(ctx context.Context, blockHash common.Hash) (uint, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.TransactionCount(ctxWithTimeout, blockHash) @@ -159,7 +239,7 @@ func (c *EthClient) TransactionInBlock( blockHash common.Hash, index uint, ) (*types.Transaction, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.TransactionInBlock(ctxWithTimeout, blockHash, index) @@ -168,7 +248,7 @@ func (c *EthClient) TransactionInBlock( // SyncProgress retrieves the current progress of the sync algorithm. If there's // no sync currently running, it returns nil. func (c *EthClient) SyncProgress(ctx context.Context) (*ethereum.SyncProgress, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.SyncProgress(ctxWithTimeout) @@ -176,7 +256,7 @@ func (c *EthClient) SyncProgress(ctx context.Context) (*ethereum.SyncProgress, e // NetworkID returns the network ID for this client. func (c *EthClient) NetworkID(ctx context.Context) (*big.Int, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.NetworkID(ctxWithTimeout) @@ -189,7 +269,7 @@ func (c *EthClient) BalanceAt( account common.Address, blockNumber *big.Int, ) (*big.Int, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.BalanceAt(ctxWithTimeout, account, blockNumber) @@ -203,7 +283,7 @@ func (c *EthClient) StorageAt( key common.Hash, blockNumber *big.Int, ) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.StorageAt(ctxWithTimeout, account, key, blockNumber) @@ -216,7 +296,7 @@ func (c *EthClient) CodeAt( account common.Address, blockNumber *big.Int, ) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.CodeAt(ctxWithTimeout, account, blockNumber) @@ -229,7 +309,7 @@ func (c *EthClient) NonceAt( account common.Address, blockNumber *big.Int, ) (uint64, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.NonceAt(ctxWithTimeout, account, blockNumber) @@ -237,7 +317,7 @@ func (c *EthClient) NonceAt( // PendingBalanceAt returns the wei balance of the given account in the pending state. func (c *EthClient) PendingBalanceAt(ctx context.Context, account common.Address) (*big.Int, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PendingBalanceAt(ctxWithTimeout, account) @@ -249,7 +329,7 @@ func (c *EthClient) PendingStorageAt( account common.Address, key common.Hash, ) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PendingStorageAt(ctxWithTimeout, account, key) @@ -257,7 +337,7 @@ func (c *EthClient) PendingStorageAt( // PendingCodeAt returns the contract code of the given account in the pending state. func (c *EthClient) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PendingCodeAt(ctxWithTimeout, account) @@ -266,7 +346,7 @@ func (c *EthClient) PendingCodeAt(ctx context.Context, account common.Address) ( // PendingNonceAt returns the account nonce of the given account in the pending state. // This is the nonce that should be used for the next transaction. func (c *EthClient) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PendingNonceAt(ctxWithTimeout, account) @@ -274,7 +354,7 @@ func (c *EthClient) PendingNonceAt(ctx context.Context, account common.Address) // PendingTransactionCount returns the total number of transactions in the pending state. func (c *EthClient) PendingTransactionCount(ctx context.Context) (uint, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PendingTransactionCount(ctxWithTimeout) @@ -291,7 +371,7 @@ func (c *EthClient) CallContract( msg ethereum.CallMsg, blockNumber *big.Int, ) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.CallContract(ctxWithTimeout, msg, blockNumber) @@ -304,7 +384,7 @@ func (c *EthClient) CallContractAtHash( msg ethereum.CallMsg, blockHash common.Hash, ) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.CallContractAtHash(ctxWithTimeout, msg, blockHash) @@ -313,7 +393,7 @@ func (c *EthClient) CallContractAtHash( // PendingCallContract executes a message call transaction using the EVM. // The state seen by the contract call is the pending state. func (c *EthClient) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PendingCallContract(ctxWithTimeout, msg) @@ -322,7 +402,7 @@ func (c *EthClient) PendingCallContract(ctx context.Context, msg ethereum.CallMs // SuggestGasPrice retrieves the currently suggested gas price to allow a timely // execution of a transaction. func (c *EthClient) SuggestGasPrice(ctx context.Context) (*big.Int, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.SuggestGasPrice(ctxWithTimeout) @@ -331,7 +411,7 @@ func (c *EthClient) SuggestGasPrice(ctx context.Context) (*big.Int, error) { // SuggestGasTipCap retrieves the currently suggested gas tip cap after 1559 to // allow a timely execution of a transaction. func (c *EthClient) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.SuggestGasTipCap(ctxWithTimeout) @@ -344,7 +424,7 @@ func (c *EthClient) FeeHistory( lastBlock *big.Int, rewardPercentiles []float64, ) (*ethereum.FeeHistory, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.FeeHistory(ctxWithTimeout, blockCount, lastBlock, rewardPercentiles) @@ -355,7 +435,7 @@ func (c *EthClient) FeeHistory( // the true gas limit requirement as other transactions may be added or removed by miners, // but it should provide a basis for setting a reasonable default. func (c *EthClient) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint64, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.EstimateGas(ctxWithTimeout, msg) @@ -366,7 +446,7 @@ func (c *EthClient) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint // If the transaction was a contract creation use the TransactionReceipt method to get the // contract address after the transaction has been mined. func (c *EthClient) SendTransaction(ctx context.Context, tx *types.Transaction) error { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.SendTransaction(ctxWithTimeout, tx) @@ -405,9 +485,9 @@ type SignTransactionResult struct { Tx *types.Transaction `json:"tx"` } -// FillTransaction fill transaction. +// FillTransaction fills in the missing fields of a transaction and signs it. func (c *EthClient) FillTransaction(ctx context.Context, args *TransactionArgs) (*types.Transaction, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() var result SignTransactionResult diff --git a/packages/taiko-client/pkg/rpc/ethclient_test.go b/packages/taiko-client/pkg/rpc/ethclient_test.go index 3739482b63d..608b2e9773a 100644 --- a/packages/taiko-client/pkg/rpc/ethclient_test.go +++ b/packages/taiko-client/pkg/rpc/ethclient_test.go @@ -2,6 +2,7 @@ package rpc import ( "context" + "math/big" "testing" "github.com/ethereum/go-ethereum" @@ -168,3 +169,28 @@ func TestEstimateGas(t *testing.T) { _, err := client.L1.EstimateGas(context.Background(), ethereum.CallMsg{}) require.Nil(t, err) } + +func TestBatchBlocksByNumbers(t *testing.T) { + client := newTestClientWithTimeout(t) + + headers, err := client.L1.BatchHeadersByNumbers(context.Background(), []*big.Int{big.NewInt(0), big.NewInt(1)}) + require.Nil(t, err) + require.Len(t, headers, 2) +} + +func TestBatchBlocksByHashes(t *testing.T) { + client := newTestClientWithTimeout(t) + + headers, err := client.L1.BatchHeadersByNumbers(context.Background(), []*big.Int{big.NewInt(0), big.NewInt(1)}) + require.Nil(t, err) + require.Len(t, headers, 2) + + hashes := make([]common.Hash, len(headers)) + for i, header := range headers { + hashes[i] = header.Hash() + } + + blocks, err := client.L1.BatchBlocksByHashes(context.Background(), hashes) + require.Nil(t, err) + require.Len(t, blocks, 2) +} diff --git a/packages/taiko-client/pkg/rpc/fallback.go b/packages/taiko-client/pkg/rpc/fallback.go deleted file mode 100644 index 6237f2105a0..00000000000 --- a/packages/taiko-client/pkg/rpc/fallback.go +++ /dev/null @@ -1,29 +0,0 @@ -package rpc - -import ( - "errors" - "math/big" - "strings" -) - -// Taken from: -// https://github.com/ethereum-optimism/optimism-legacy/blob/develop/bss-core/drivers/max_priority_fee_fallback.go -var ( - //lint:ignore ST1005 allow `errMaxPriorityFeePerGasNotFound` to be capitalized. - errMaxPriorityFeePerGasNotFound = errors.New( - "method eth_maxPriorityFeePerGas not found", - ) - - // FallbackGasTipCap is the default fallback gasTipCap used when we are - // unable to query an L1 backend for a suggested gasTipCap. - FallbackGasTipCap = big.NewInt(1500000000) -) - -// IsMaxPriorityFeePerGasNotFoundError returns true if the provided error -// signals that the backend does not support the eth_maxPriorityFeePerGas -// method. In this case, the caller should fallback to using the constant above. -func IsMaxPriorityFeePerGasNotFoundError(err error) bool { - return strings.Contains( - err.Error(), errMaxPriorityFeePerGasNotFound.Error(), - ) -} diff --git a/packages/taiko-client/pkg/rpc/fallback_test.go b/packages/taiko-client/pkg/rpc/fallback_test.go deleted file mode 100644 index a7d05649dc7..00000000000 --- a/packages/taiko-client/pkg/rpc/fallback_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package rpc - -import ( - "errors" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestIsMaxPriorityFeePerGasNotFoundError(t *testing.T) { - require.False(t, IsMaxPriorityFeePerGasNotFoundError(errors.New("test"))) - require.True(t, IsMaxPriorityFeePerGasNotFoundError(errMaxPriorityFeePerGasNotFound)) -} diff --git a/packages/taiko-client/pkg/rpc/methods.go b/packages/taiko-client/pkg/rpc/methods.go index c15a59ba4ea..93e04c70bf4 100644 --- a/packages/taiko-client/pkg/rpc/methods.go +++ b/packages/taiko-client/pkg/rpc/methods.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "math/big" + "strings" "time" "github.com/cenkalti/backoff/v4" @@ -19,7 +20,8 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) var ( @@ -33,48 +35,74 @@ var ( // ensureGenesisMatched fetches the L2 genesis block from TaikoL1 contract, // and checks whether the fetched genesis is same to the node local genesis. func (c *Client) ensureGenesisMatched(ctx context.Context) error { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() stateVars, err := c.GetProtocolStateVariables(&bind.CallOpts{Context: ctxWithTimeout}) if err != nil { + log.Error("error getting protocol state variables", "error", err) return err } - // Fetch the genesis `BlockVerified` event. - iter, err := c.TaikoL1.FilterBlockVerified( - &bind.FilterOpts{Start: stateVars.A.GenesisHeight, End: &stateVars.A.GenesisHeight, Context: ctxWithTimeout}, - []*big.Int{common.Big0}, - nil, - ) + // Fetch the node's genesis block. + nodeGenesis, err := c.L2.HeaderByNumber(ctxWithTimeout, common.Big0) if err != nil { + log.Error("error getting node genesis block", "error", err) return err } - // Fetch the node's genesis block. - nodeGenesis, err := c.L2.HeaderByNumber(ctxWithTimeout, common.Big0) + var ( + l2GenesisHash common.Hash + filterOpts = &bind.FilterOpts{ + Start: stateVars.A.GenesisHeight, + End: &stateVars.A.GenesisHeight, + Context: ctxWithTimeout, + } + ) + + protocolConfigs, err := GetProtocolConfigs(c.TaikoL1, &bind.CallOpts{Context: ctxWithTimeout}) if err != nil { - return err + return fmt.Errorf("error getting protocol configs: %w", err) } - if iter.Next() { - l2GenesisHash := iter.Event.BlockHash + // If chain actives ontake fork from genesis, we need to fetch the genesis block hash from `BlockVerifiedV2` event. + if protocolConfigs.OntakeForkHeight == 0 { + // Fetch the genesis `BlockVerified2` event. + iter, err := c.TaikoL1.FilterBlockVerifiedV2(filterOpts, []*big.Int{common.Big0}, nil) + if err != nil { + return fmt.Errorf("error filtering BlockVerifiedV2 event: %w", err) + } - log.Debug("Genesis hash", "node", nodeGenesis.Hash(), "TaikoL1", common.BytesToHash(l2GenesisHash[:])) + if iter.Next() { + l2GenesisHash = iter.Event.BlockHash + } + } else { + // Fetch the genesis `BlockVerified` event. + iter, err := c.TaikoL1.FilterBlockVerified(filterOpts, []*big.Int{common.Big0}, nil) + if err != nil { + return fmt.Errorf("error filtering BlockVerified event: %w", err) + } - // Node's genesis header and TaikoL1 contract's genesis header must match. - if common.BytesToHash(l2GenesisHash[:]) != nodeGenesis.Hash() { - return fmt.Errorf( - "genesis header hash mismatch, node: %s, TaikoL1 contract: %s", - nodeGenesis.Hash(), - common.BytesToHash(l2GenesisHash[:]), - ) + if iter.Next() { + l2GenesisHash = iter.Event.BlockHash } + } + log.Debug("Genesis hash", "node", nodeGenesis.Hash(), "TaikoL1", common.BytesToHash(l2GenesisHash[:])) + + if l2GenesisHash == (common.Hash{}) { + log.Warn("Genesis block not found in TaikoL1") return nil } - log.Warn("Genesis block not found in TaikoL1") + // Node's genesis header and TaikoL1 contract's genesis header must match. + if common.BytesToHash(l2GenesisHash[:]) != nodeGenesis.Hash() { + return fmt.Errorf( + "genesis header hash mismatch, node: %s, TaikoL1 contract: %s", + nodeGenesis.Hash(), + common.BytesToHash(l2GenesisHash[:]), + ) + } return nil } @@ -93,7 +121,7 @@ func (c *Client) WaitTillL2ExecutionEngineSynced(ctx context.Context) error { return err } - if progress.isSyncing() { + if progress.IsSyncing() { log.Info( "L2 execution engine is syncing", "currentBlockID", progress.CurrentBlockID, @@ -113,7 +141,7 @@ func (c *Client) WaitTillL2ExecutionEngineSynced(ctx context.Context) error { // LatestL2KnownL1Header fetches the L2 execution engine's latest known L1 header, // if we can't find the L1Origin data, we will use the L1 genesis header instead. func (c *Client) LatestL2KnownL1Header(ctx context.Context) (*types.Header, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() // Try to fetch the latest known L1 header from the L2 execution engine. @@ -150,7 +178,7 @@ func (c *Client) LatestL2KnownL1Header(ctx context.Context) (*types.Header, erro // GetGenesisL1Header fetches the L1 header that including L2 genesis block. func (c *Client) GetGenesisL1Header(ctx context.Context) (*types.Header, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() stateVars, err := c.GetProtocolStateVariables(&bind.CallOpts{Context: ctxWithTimeout}) @@ -164,7 +192,7 @@ func (c *Client) GetGenesisL1Header(ctx context.Context) (*types.Header, error) // L2ParentByBlockID fetches the block header from L2 execution engine with the largest block id that // smaller than the given `blockId`. func (c *Client) L2ParentByBlockID(ctx context.Context, blockID *big.Int) (*types.Header, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() var ( @@ -246,6 +274,51 @@ func (c *Client) WaitL2Header(ctx context.Context, blockID *big.Int) (*types.Hea return nil, fmt.Errorf("failed to fetch block header from L2 execution engine, blockID: %d", blockID) } +// CalculateBaseFee calculates the base fee from the L2 protocol. +func (c *Client) CalculateBaseFee( + ctx context.Context, + l2Head *types.Header, + anchorBlockID *big.Int, + isOntake bool, + baseFeeConfig *bindings.LibSharedDataBaseFeeConfig, + currentTimestamp uint64, +) (*big.Int, error) { + var ( + baseFee *big.Int + err error + ) + + if isOntake { + if baseFee, err = c.calculateBaseFeeOntake(ctx, l2Head, currentTimestamp, baseFeeConfig); err != nil { + return nil, err + } + } else { + baseFeeInfo, err := c.TaikoL2.GetBasefee( + &bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}, + anchorBlockID.Uint64(), + uint32(l2Head.GasUsed), + ) + if err != nil { + return nil, err + } + baseFee = baseFeeInfo.Basefee + } + + if err != nil { + return nil, err + } + + log.Info( + "Base fee information", + "fee", utils.WeiToGWei(baseFee), + "l2Head", l2Head.Number, + "anchorBlockID", anchorBlockID, + "isOntake", isOntake, + ) + + return baseFee, nil +} + // GetPoolContent fetches the transactions list from L2 execution engine's transactions pool with given // upper limit. func (c *Client) GetPoolContent( @@ -255,44 +328,75 @@ func (c *Client) GetPoolContent( maxBytesPerTxList uint64, locals []common.Address, maxTransactionsLists uint64, + minTip uint64, + chainConfig *config.ChainConfig, ) ([]*miner.PreBuiltTxList, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() - l1Head, err := c.L1.HeaderByNumber(ctx, nil) + // Get the latest L2 block header at first. + l2Head, err := c.L2.HeaderByNumber(ctx, nil) if err != nil { return nil, err } - l2Head, err := c.L2.HeaderByNumber(ctx, nil) - if err != nil { + l1Origin, err := c.L2.L1OriginByID(ctx, l2Head.Number) + if err != nil && err.Error() != ethereum.NotFound.Error() { return nil, err } - baseFeeInfo, err := c.TaikoL2.GetBasefee( - &bind.CallOpts{Context: ctx}, - l1Head.Number.Uint64(), - uint32(l2Head.GasUsed), + var ( + L1HeadNum *big.Int + L2HeadNum *big.Int + timestamp = uint64(time.Now().Unix()) ) + + if l1Origin != nil && l1Origin.IsSoftBlock() && !l1Origin.EndOfPreconf && !l1Origin.EndOfBlock { + // Check if this is an unfinished soft block, if not, we will use the latest L1 / L2 block number from the L1Origin. + // Otherwise, we will use the L1 / L2 block number in L1Origin. + L1HeadNum = l1Origin.L1BlockHeight + L2HeadNum = new(big.Int).Sub(l1Origin.BlockID, common.Big1) + } + + l1Head, err := c.L1.HeaderByNumber(ctx, L1HeadNum) if err != nil { return nil, err } - log.Info("Current base fee", "fee", utils.WeiToGWei(baseFeeInfo.Basefee)) + if L2HeadNum != nil { + timestamp = l2Head.Time + l2Head, err = c.L2.HeaderByNumber(ctx, L2HeadNum) + if err != nil { + return nil, err + } + } + + baseFee, err := c.CalculateBaseFee( + ctx, + l2Head, + l1Head.Number, + true, + &chainConfig.ProtocolConfigs.BaseFeeConfig, + timestamp, + ) + if err != nil { + return nil, err + } var localsArg []string for _, local := range locals { localsArg = append(localsArg, local.Hex()) } - return c.L2Engine.TxPoolContent( + return c.L2Engine.TxPoolContentWithMinTip( ctxWithTimeout, beneficiary, - baseFeeInfo.Basefee, + baseFee, uint64(blockMaxGasLimit), maxBytesPerTxList, localsArg, maxTransactionsLists, + minTip, ) } @@ -302,7 +406,7 @@ func (c *Client) L2AccountNonce( account common.Address, height *big.Int, ) (uint64, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() var result hexutil.Uint64 @@ -318,8 +422,8 @@ type L2SyncProgress struct { HighestBlockID *big.Int } -// isSyncing returns true if the L2 execution engine is syncing with L1. -func (p *L2SyncProgress) isSyncing() bool { +// IsSyncing returns true if the L2 execution engine is syncing with L1. +func (p *L2SyncProgress) IsSyncing() bool { if p.SyncProgress == nil { return false } @@ -333,7 +437,7 @@ func (p *L2SyncProgress) isSyncing() bool { // L2ExecutionEngineSyncProgress fetches the sync progress of the given L2 execution engine. func (c *Client) L2ExecutionEngineSyncProgress(ctx context.Context) (*L2SyncProgress, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() var ( @@ -398,12 +502,37 @@ func (c *Client) GetProtocolStateVariables(opts *bind.CallOpts) (*struct { return GetProtocolStateVariables(c.TaikoL1, opts) } +// GetLastVerifiedBlock gets the last verified block from TaikoL1 contract. +func (c *Client) GetLastVerifiedBlock(ctx context.Context) (struct { + BlockId uint64 //nolint:stylecheck + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + ctxWithTimeout, cancel := context.WithTimeout(ctx, defaultTimeout) + defer cancel() + + return c.TaikoL1.GetLastVerifiedBlock(&bind.CallOpts{Context: ctxWithTimeout}) +} + // GetL2BlockInfo fetches the L2 block information from the protocol. -func (c *Client) GetL2BlockInfo(ctx context.Context, blockID *big.Int) (bindings.TaikoDataBlock, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) +func (c *Client) GetL2BlockInfo(ctx context.Context, blockID *big.Int) (bindings.TaikoDataBlockV2, error) { + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) + defer cancel() + + blockInfo, err := c.TaikoL1.GetBlock(&bind.CallOpts{Context: ctxWithTimeout}, blockID.Uint64()) + if err != nil { + return bindings.TaikoDataBlockV2{}, err + } + return *encoding.TaikoDataBlockToV2(&blockInfo), nil +} + +// GetL2BlockInfoV2 fetches the V2 L2 block information from the protocol. +func (c *Client) GetL2BlockInfoV2(ctx context.Context, blockID *big.Int) (bindings.TaikoDataBlockV2, error) { + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() - return c.TaikoL1.GetBlock(&bind.CallOpts{Context: ctxWithTimeout}, blockID.Uint64()) + return c.TaikoL1.GetBlockV2(&bind.CallOpts{Context: ctxWithTimeout}, blockID.Uint64()) } // GetTransition fetches the L2 block's corresponding transition state from the protocol. @@ -412,7 +541,7 @@ func (c *Client) GetTransition( blockID *big.Int, transactionID uint32, ) (bindings.TaikoDataTransitionState, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() return c.TaikoL1.GetTransition( @@ -444,7 +573,7 @@ type ReorgCheckResult struct { func (c *Client) CheckL1Reorg(ctx context.Context, blockID *big.Int) (*ReorgCheckResult, error) { var ( result = new(ReorgCheckResult) - ctxWithTimeout, cancel = ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel = CtxWithTimeoutOrDefault(ctx, defaultTimeout) ) defer cancel() @@ -452,14 +581,14 @@ func (c *Client) CheckL1Reorg(ctx context.Context, blockID *big.Int) (*ReorgChec // If we rollback to the genesis block, then there is no L1Origin information recorded in the L2 execution // engine for that block, so we will query the protocol to use `GenesisHeight` value to reset the L1 cursor. if blockID.Cmp(common.Big0) == 0 { - slotA, _, err := c.TaikoL1.GetStateVariables(&bind.CallOpts{Context: ctxWithTimeout}) + state, err := GetProtocolStateVariables(c.TaikoL1, &bind.CallOpts{Context: ctxWithTimeout}) if err != nil { return result, err } if result.L1CurrentToReset, err = c.L1.HeaderByNumber( ctxWithTimeout, - new(big.Int).SetUint64(slotA.GenesisHeight), + new(big.Int).SetUint64(state.A.GenesisHeight), ); err != nil { return nil, err } @@ -542,7 +671,7 @@ func (c *Client) checkSyncedL1SnippetFromAnchor( blockID *big.Int, l1Height uint64, ) (bool, error) { - log.Info("Check synced L1 snippet from anchor", "blockID", blockID, "l1Height", l1Height) + log.Debug("Check synced L1 snippet from anchor", "blockID", blockID, "l1Height", l1Height) block, err := c.L2.BlockByNumber(ctx, blockID) if err != nil { return false, err @@ -552,23 +681,13 @@ func (c *Client) checkSyncedL1SnippetFromAnchor( return false, err } - l1BlockHash, l1StateRoot, l1HeightInAnchor, parentGasUsed, err := c.getSyncedL1SnippetFromAnchor( + l1StateRoot, l1HeightInAnchor, parentGasUsed, err := c.getSyncedL1SnippetFromAnchor( block.Transactions()[0], ) if err != nil { return false, err } - if l1HeightInAnchor+1 != l1Height { - log.Info( - "Reorg detected due to L1 height mismatch", - "blockID", blockID, - "l1HeightInAnchor", l1HeightInAnchor, - "l1Height", l1Height, - ) - return true, nil - } - if parentGasUsed != uint32(parent.GasUsed()) { log.Info( "Reorg detected due to parent gas used mismatch", @@ -584,16 +703,6 @@ func (c *Client) checkSyncedL1SnippetFromAnchor( return false, err } - if l1Header.Hash() != l1BlockHash { - log.Info( - "Reorg detected due to L1 block hash mismatch", - "blockID", blockID, - "l1BlockHashInAnchor", l1BlockHash, - "l1BlockHash", l1Header.Hash(), - ) - return true, nil - } - if l1Header.Root != l1StateRoot { log.Info( "Reorg detected due to L1 state root mismatch", @@ -611,7 +720,6 @@ func (c *Client) checkSyncedL1SnippetFromAnchor( func (c *Client) getSyncedL1SnippetFromAnchor( tx *types.Transaction, ) ( - l1BlockHash common.Hash, l1StateRoot common.Hash, l1Height uint64, parentGasUsed uint32, @@ -619,53 +727,75 @@ func (c *Client) getSyncedL1SnippetFromAnchor( ) { method, err := encoding.TaikoL2ABI.MethodById(tx.Data()) if err != nil { - return common.Hash{}, common.Hash{}, 0, 0, err + return common.Hash{}, 0, 0, err } - if method.Name != "anchor" { - return common.Hash{}, common.Hash{}, 0, 0, fmt.Errorf("invalid method name for anchor transaction: %s", method.Name) - } + var ok bool + switch method.Name { + case "anchor": + args := map[string]interface{}{} - args := map[string]interface{}{} + if err := method.Inputs.UnpackIntoMap(args, tx.Data()[4:]); err != nil { + return common.Hash{}, 0, 0, err + } - if err := method.Inputs.UnpackIntoMap(args, tx.Data()[4:]); err != nil { - return common.Hash{}, common.Hash{}, 0, 0, err - } + l1StateRoot, ok = args["_l1StateRoot"].([32]byte) + if !ok { + return common.Hash{}, + 0, + 0, + errors.New("failed to parse l1StateRoot from anchor transaction calldata") + } + l1Height, ok = args["_l1BlockId"].(uint64) + if !ok { + return common.Hash{}, + 0, + 0, + errors.New("failed to parse l1Height from anchor transaction calldata") + } + parentGasUsed, ok = args["_parentGasUsed"].(uint32) + if !ok { + return common.Hash{}, + 0, + 0, + errors.New("failed to parse parentGasUsed from anchor transaction calldata") + } + case "anchorV2": + args := map[string]interface{}{} - l1BlockHash, ok := args["_l1BlockHash"].([32]byte) - if !ok { - return common.Hash{}, - common.Hash{}, - 0, - 0, - errors.New("failed to parse l1BlockHash from anchor transaction calldata") - } - l1StateRoot, ok = args["_l1StateRoot"].([32]byte) - if !ok { - return common.Hash{}, - common.Hash{}, - 0, - 0, - errors.New("failed to parse l1StateRoot from anchor transaction calldata") - } - l1Height, ok = args["_l1BlockId"].(uint64) - if !ok { - return common.Hash{}, - common.Hash{}, - 0, - 0, - errors.New("failed to parse l1Height from anchor transaction calldata") - } - parentGasUsed, ok = args["_parentGasUsed"].(uint32) - if !ok { - return common.Hash{}, - common.Hash{}, - 0, - 0, - errors.New("failed to parse parentGasUsed from anchor transaction calldata") + if err := method.Inputs.UnpackIntoMap(args, tx.Data()[4:]); err != nil { + return common.Hash{}, 0, 0, err + } + + l1Height, ok = args["_anchorBlockId"].(uint64) + if !ok { + return common.Hash{}, + 0, + 0, + errors.New("failed to parse anchorBlockId from anchorV2 transaction calldata") + } + l1StateRoot, ok = args["_anchorStateRoot"].([32]byte) + if !ok { + return common.Hash{}, + 0, + 0, + errors.New("failed to parse anchorStateRoot from anchorV2 transaction calldata") + } + parentGasUsed, ok = args["_parentGasUsed"].(uint32) + if !ok { + return common.Hash{}, + 0, + 0, + errors.New("failed to parse parentGasUsed from anchorV2 transaction calldata") + } + default: + return common.Hash{}, 0, 0, fmt.Errorf( + "invalid method name for anchor / anchorV2 transaction: %s", + method.Name, + ) } - return l1BlockHash, l1StateRoot, l1Height, parentGasUsed, nil + return l1StateRoot, l1Height, parentGasUsed, nil } // TierProviderTierWithID wraps protocol ITierProviderTier struct with an ID. @@ -676,7 +806,7 @@ type TierProviderTierWithID struct { // GetTiers fetches all protocol supported tiers. func (c *Client) GetTiers(ctx context.Context) ([]*TierProviderTierWithID, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() tierRouterAddress, err := c.TaikoL1.Resolve0(&bind.CallOpts{Context: ctx}, StringToBytes32("tier_router"), false) @@ -737,7 +867,7 @@ func (c *Client) GetTaikoDataSlotBByNumber(ctx context.Context, number uint64) ( // GetGuardianProverAddress fetches the guardian prover address from the protocol. func (c *Client) GetGuardianProverAddress(ctx context.Context) (common.Address, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() return c.TaikoL1.Resolve0(&bind.CallOpts{Context: ctxWithTimeout}, StringToBytes32("tier_guardian"), false) @@ -749,7 +879,7 @@ func (c *Client) WaitL1NewPendingTransaction( address common.Address, oldPendingNonce uint64, ) error { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() ticker := time.NewTicker(rpcPollingInterval) @@ -772,3 +902,83 @@ func (c *Client) WaitL1NewPendingTransaction( return nil } + +// CalculateBaseFeeOnTake calculates the base fee after ontake fork from the L2 protocol. +func (c *Client) calculateBaseFeeOntake( + ctx context.Context, + l2Head *types.Header, + currentTimestamp uint64, + baseFeeConfig *bindings.LibSharedDataBaseFeeConfig, +) (*big.Int, error) { + var ( + newGasTarget = uint64(baseFeeConfig.GasIssuancePerSecond) * uint64(baseFeeConfig.AdjustmentQuotient) + parentGasExcess uint64 + ) + parentGasTarget, err := c.TaikoL2.ParentGasTarget(&bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}) + if err != nil { + return nil, fmt.Errorf("failed to fetch parent gas target: %w", err) + } + + if newGasTarget != parentGasTarget && parentGasTarget != 0 { + oldParentGasExcess, err := c.TaikoL2.ParentGasExcess(&bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}) + if err != nil { + return nil, fmt.Errorf("failed to fetch old parent gas excess: %w", err) + } + if parentGasExcess, err = c.TaikoL2.AdjustExcess( + &bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}, + oldParentGasExcess, + parentGasTarget, + newGasTarget, + ); err != nil { + // If the `calculateBaseFee()` method is deprecated, we will use the new method `getBasefeeV2()` + // to calculate the base fee. + if strings.Contains(encoding.TryParsingCustomError(err).Error(), "L2_DEPRECATED_METHOD") { + baseFeeInfo, err := c.TaikoL2.GetBasefeeV2( + &bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}, + uint32(l2Head.GasUsed), + currentTimestamp, + *baseFeeConfig, + ) + if err != nil { + return nil, fmt.Errorf("failed to calculate base fee by GetBasefeeV2: %w", err) + } + return baseFeeInfo.Basefee, nil + } + + return nil, fmt.Errorf("failed to adjust parent gas excess: %w", err) + } + } else { + if parentGasExcess, err = c.TaikoL2.ParentGasExcess(&bind.CallOpts{ + BlockNumber: l2Head.Number, Context: ctx, + }); err != nil { + return nil, fmt.Errorf("failed to fetch parent gas excess: %w", err) + } + } + + baseFeeInfo, err := c.TaikoL2.CalculateBaseFee( + &bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}, + *baseFeeConfig, + currentTimestamp-l2Head.Time, + parentGasExcess, + uint32(l2Head.GasUsed), + ) + if err != nil { + // If the `calculateBaseFee()` method is deprecated, we will use the new method `getBasefeeV2()` + // to calculate the base fee. + if strings.Contains(encoding.TryParsingCustomError(err).Error(), "L2_DEPRECATED_METHOD") { + baseFeeInfo, err := c.TaikoL2.GetBasefeeV2( + &bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}, + uint32(l2Head.GasUsed), + currentTimestamp, + *baseFeeConfig, + ) + if err != nil { + return nil, fmt.Errorf("failed to calculate base fee by GetBasefeeV2: %w", err) + } + return baseFeeInfo.Basefee, nil + } + return nil, err + } + + return baseFeeInfo.Basefee, nil +} diff --git a/packages/taiko-client/pkg/rpc/methods_test.go b/packages/taiko-client/pkg/rpc/methods_test.go index f501294b5ca..0aa743b994b 100644 --- a/packages/taiko-client/pkg/rpc/methods_test.go +++ b/packages/taiko-client/pkg/rpc/methods_test.go @@ -95,13 +95,11 @@ func TestGetSyncedL1SnippetFromAnchor(t *testing.T) { tx, err := client.TaikoL2.Anchor(opts, l1BlockHash, l1StateRoot, l1Height, parentGasUsed) require.Nil(t, err) - syncedL1BlockHash, - syncedL1StateRoot, + syncedL1StateRoot, syncedL1Height, syncedParentGasUsed, err := client.getSyncedL1SnippetFromAnchor(tx) require.Nil(t, err) - require.Equal(t, l1BlockHash, syncedL1BlockHash) require.Equal(t, l1StateRoot, syncedL1StateRoot) require.Equal(t, l1Height, syncedL1Height) require.Equal(t, parentGasUsed, syncedParentGasUsed) diff --git a/packages/taiko-client/pkg/rpc/subscription.go b/packages/taiko-client/pkg/rpc/subscription.go index 7d74c9035ad..b1e14b958d3 100644 --- a/packages/taiko-client/pkg/rpc/subscription.go +++ b/packages/taiko-client/pkg/rpc/subscription.go @@ -46,6 +46,24 @@ func SubscribeBlockVerified( }) } +// SubscribeBlockVerifiedV2 subscribes the protocol's BlockVerifiedV2 events. +func SubscribeBlockVerifiedV2( + taikoL1 *bindings.TaikoL1Client, + ch chan *bindings.TaikoL1ClientBlockVerifiedV2, +) event.Subscription { + return SubscribeEvent("BlockVerifiedV2", func(ctx context.Context) (event.Subscription, error) { + sub, err := taikoL1.WatchBlockVerifiedV2(nil, ch, nil, nil) + if err != nil { + log.Error("Create TaikoL1.BlockVerifiedV2 subscription error", "error", err) + return nil, err + } + + defer sub.Unsubscribe() + + return waitSubErr(ctx, sub) + }) +} + // SubscribeBlockProposed subscribes the protocol's BlockProposed events. func SubscribeBlockProposed( taikoL1 *bindings.TaikoL1Client, @@ -64,6 +82,24 @@ func SubscribeBlockProposed( }) } +// SubscribeBlockProposedV2 subscribes the protocol's BlockProposedV2 events. +func SubscribeBlockProposedV2( + taikoL1 *bindings.TaikoL1Client, + ch chan *bindings.TaikoL1ClientBlockProposedV2, +) event.Subscription { + return SubscribeEvent("BlockProposedV2", func(ctx context.Context) (event.Subscription, error) { + sub, err := taikoL1.WatchBlockProposedV2(nil, ch, nil) + if err != nil { + log.Error("Create TaikoL1.BlockProposedV2 subscription error", "error", err) + return nil, err + } + + defer sub.Unsubscribe() + + return waitSubErr(ctx, sub) + }) +} + // SubscribeTransitionProved subscribes the protocol's TransitionProved events. func SubscribeTransitionProved( taikoL1 *bindings.TaikoL1Client, @@ -82,6 +118,24 @@ func SubscribeTransitionProved( }) } +// SubscribeTransitionProvedV2 subscribes the protocol's TransitionProvedV2 events. +func SubscribeTransitionProvedV2( + taikoL1 *bindings.TaikoL1Client, + ch chan *bindings.TaikoL1ClientTransitionProvedV2, +) event.Subscription { + return SubscribeEvent("TransitionProvedV2", func(ctx context.Context) (event.Subscription, error) { + sub, err := taikoL1.WatchTransitionProvedV2(nil, ch, nil) + if err != nil { + log.Error("Create TaikoL1.TransitionProvedV2 subscription error", "error", err) + return nil, err + } + + defer sub.Unsubscribe() + + return waitSubErr(ctx, sub) + }) +} + // SubscribeTransitionContested subscribes the protocol's TransitionContested events. func SubscribeTransitionContested( taikoL1 *bindings.TaikoL1Client, @@ -100,6 +154,24 @@ func SubscribeTransitionContested( }) } +// SubscribeTransitionContestedV2 subscribes the protocol's TransitionContestedV2 events. +func SubscribeTransitionContestedV2( + taikoL1 *bindings.TaikoL1Client, + ch chan *bindings.TaikoL1ClientTransitionContestedV2, +) event.Subscription { + return SubscribeEvent("TransitionContestedV2", func(ctx context.Context) (event.Subscription, error) { + sub, err := taikoL1.WatchTransitionContestedV2(nil, ch, nil) + if err != nil { + log.Error("Create TaikoL1.TransitionContestedV2 subscription error", "error", err) + return nil, err + } + + defer sub.Unsubscribe() + + return waitSubErr(ctx, sub) + }) +} + // SubscribeChainHead subscribes the new chain heads. func SubscribeChainHead( client *EthClient, diff --git a/packages/taiko-client/pkg/rpc/utils.go b/packages/taiko-client/pkg/rpc/utils.go index 044b6bafe6a..c08b7f136eb 100644 --- a/packages/taiko-client/pkg/rpc/utils.go +++ b/packages/taiko-client/pkg/rpc/utils.go @@ -2,8 +2,12 @@ package rpc import ( "context" + "errors" "math/big" + "os" + "os/signal" "strings" + "syscall" "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -11,18 +15,43 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" + "golang.org/x/sync/errgroup" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) var ( ZeroAddress common.Address BlobBytes = params.BlobTxBytesPerFieldElement * params.BlobTxFieldElementsPerBlob BlockMaxTxListBytes uint64 = (params.BlobTxBytesPerFieldElement - 1) * params.BlobTxFieldElementsPerBlob + // DefaultInterruptSignals is a set of default interrupt signals. + DefaultInterruptSignals = []os.Signal{ + os.Interrupt, + os.Kill, + syscall.SIGTERM, + syscall.SIGQUIT, + } + ErrInvalidLength = errors.New("invalid length") + ErrSlotBMarshal = errors.New("abi: cannot marshal in to go type: length insufficient 160 require 192") ) +// GetProtocolConfigs gets the protocol configs from TaikoL1 contract. +func GetProtocolConfigs( + taikoL1Client *bindings.TaikoL1Client, + opts *bind.CallOpts, +) (bindings.TaikoDataConfig, error) { + var cancel context.CancelFunc + if opts == nil { + opts = &bind.CallOpts{Context: context.Background()} + } + opts.Context, cancel = CtxWithTimeoutOrDefault(opts.Context, defaultTimeout) + defer cancel() + + return taikoL1Client.GetConfig(opts) +} + // GetProtocolStateVariables gets the protocol states from TaikoL1 contract. func GetProtocolStateVariables( taikoL1Client *bindings.TaikoL1Client, @@ -31,9 +60,33 @@ func GetProtocolStateVariables( A bindings.TaikoDataSlotA B bindings.TaikoDataSlotB }, error) { + var cancel context.CancelFunc + if opts == nil { + opts = &bind.CallOpts{Context: context.Background()} + } + opts.Context, cancel = CtxWithTimeoutOrDefault(opts.Context, defaultTimeout) + defer cancel() + // Notice: sloB.LastProposedIn and slotB.LastUnpausedAt are always 0 + // before upgrading contract, but we can ignore it since we won't use it. + + var slotBV1 bindings.TaikoDataSlotBV1 slotA, slotB, err := taikoL1Client.GetStateVariables(opts) if err != nil { - return nil, err + if errors.Is(err, ErrSlotBMarshal) { + slotA, slotBV1, err = taikoL1Client.GetStateVariablesV1(opts) + if err != nil { + return nil, err + } + slotB = bindings.TaikoDataSlotB{ + NumBlocks: slotBV1.NumBlocks, + LastVerifiedBlockId: slotBV1.LastVerifiedBlockId, + ProvingPaused: slotBV1.ProvingPaused, + LastProposedIn: nil, + LastUnpausedAt: slotBV1.LastUnpausedAt, + } + } else { + return nil, err + } } return &struct { A bindings.TaikoDataSlotA @@ -50,7 +103,7 @@ func CheckProverBalance( address common.Address, bond *big.Int, ) (bool, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() // Check allowance on taiko token contract @@ -60,31 +113,47 @@ func CheckProverBalance( } log.Info( - "Prover allowance for TaikoL1 contract", + "Prover allowance for the contract", "allowance", utils.WeiToEther(allowance), "address", prover.Hex(), "bond", utils.WeiToEther(bond), ) - // Check prover's taiko token balance - balance, err := rpc.TaikoToken.BalanceOf(&bind.CallOpts{Context: ctxWithTimeout}, prover) + // Check prover's taiko token bondBalance + bondBalance, err := rpc.TaikoL1.BondBalanceOf(&bind.CallOpts{Context: ctxWithTimeout}, prover) + if err != nil { + return false, err + } + + // Check prover's taiko token tokenBalance + tokenBalance, err := rpc.TaikoToken.BalanceOf(&bind.CallOpts{Context: ctxWithTimeout}, prover) if err != nil { return false, err } log.Info( "Prover's wallet taiko token balance", - "balance", utils.WeiToEther(balance), + "bondBalance", utils.WeiToEther(bondBalance), + "tokenBalance", utils.WeiToEther(tokenBalance), "address", prover.Hex(), "bond", utils.WeiToEther(bond), ) - if bond.Cmp(allowance) > 0 || bond.Cmp(balance) > 0 { + if bond.Cmp(allowance) > 0 && bond.Cmp(bondBalance) > 0 { log.Info( - "Assigned prover does not have required on-chain token balance or allowance", - "providedProver", prover.Hex(), - "taikoTokenBalance", utils.WeiToEther(balance), + "Assigned prover does not have required on-chain token allowance", "allowance", utils.WeiToEther(allowance), + "bondBalance", utils.WeiToEther(bondBalance), + "bond", utils.WeiToEther(bond), + ) + return false, nil + } + + if bond.Cmp(bondBalance) > 0 && bond.Cmp(tokenBalance) > 0 { + log.Info( + "Assigned prover does not have required on-chain token balance", + "bondBalance", utils.WeiToEther(bondBalance), + "tokenBalance", utils.WeiToEther(tokenBalance), "bond", utils.WeiToEther(bond), ) return false, nil @@ -114,7 +183,7 @@ func GetBlockProofStatus( proverAddress common.Address, proverSetAddress common.Address, ) (*BlockProofStatus, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() // Get the local L2 parent header. @@ -143,7 +212,8 @@ func GetBlockProofStatus( return nil, err } - if header.Hash() != transition.BlockHash || transition.StateRoot != header.Root { + if header.Hash() != transition.BlockHash || + (transition.StateRoot != (common.Hash{}) && transition.StateRoot != header.Root) { log.Info( "Different block hash or state root detected, try submitting a contest", "localBlockHash", header.Hash(), @@ -197,10 +267,140 @@ func GetBlockProofStatus( }, nil } +// BatchGetBlocksProofStatus checks whether the batch of L2 blocks still need new proofs or new contests. +// Here are the possible status: +// 1. No proof on chain at all. +// 2. A valid proof has been submitted. +// 3. An invalid proof has been submitted, and there is no valid contest. +// 4. An invalid proof has been submitted, and there is a valid contest. +func BatchGetBlocksProofStatus( + ctx context.Context, + cli *Client, + ids []*big.Int, + proverAddress common.Address, + proverSetAddress common.Address, +) ([]*BlockProofStatus, error) { + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) + defer cancel() + var ( + parentHashes = make([][32]byte, len(ids)) + parentIDs = make([]*big.Int, len(ids)) + blockIDs = make([]*big.Int, len(ids)) + uint64BlockIDs = make([]uint64, len(ids)) + result = make([]*BlockProofStatus, len(ids)) + highestBlockID = big.NewInt(0) + ) + for i, id := range ids { + parentIDs[i] = new(big.Int).Sub(id, common.Big1) + blockIDs[i] = id + uint64BlockIDs[i] = id.Uint64() + if id.Cmp(highestBlockID) > 0 { + highestBlockID = id + } + } + // Get the local L2 parent headers. + parents, err := cli.L2.BatchHeadersByNumbers(ctxWithTimeout, parentIDs) + if err != nil { + return nil, err + } + if len(parents) != len(ids) { + return nil, ErrInvalidLength + } + for i := range ids { + parentHashes[i] = parents[i].Hash() + } + // Get the transition state from TaikoL1 contract. + transitions, err := cli.TaikoL1.GetTransitions( + &bind.CallOpts{Context: ctxWithTimeout}, + uint64BlockIDs, + parentHashes, + ) + if err != nil { + return nil, err + } + _, err = cli.WaitL2Header(ctxWithTimeout, highestBlockID) + if err != nil { + return nil, err + } + blockHeaders, err := cli.L2.BatchHeadersByNumbers(ctxWithTimeout, blockIDs) + if err != nil { + return nil, err + } + if len(transitions) != len(ids) || len(blockHeaders) != len(ids) { + return nil, ErrInvalidLength + } + g, _ := errgroup.WithContext(ctxWithTimeout) + for i, transition := range transitions { + // No proof on chain + if transition.BlockHash == (common.Hash{}) { + result[i] = &BlockProofStatus{IsSubmitted: false, ParentHeader: parents[i]} + continue + } + g.Go(func() error { + if blockHeaders[i].Hash() != transition.BlockHash || + (transition.StateRoot != (common.Hash{}) && transition.StateRoot != blockHeaders[i].Root) { + log.Info( + "Different block hash or state root detected, try submitting a contest", + "localBlockHash", blockHeaders[i].Hash(), + "protocolTransitionBlockHash", common.BytesToHash(transition.BlockHash[:]), + "localStateRoot", blockHeaders[i].Root, + "protocolTransitionStateRoot", common.BytesToHash(transition.StateRoot[:]), + ) + result[i] = &BlockProofStatus{ + IsSubmitted: true, + Invalid: true, + CurrentTransitionState: &transitions[i], + ParentHeader: parents[i], + } + return nil + } + + if proverAddress == transition.Prover || + (proverSetAddress != ZeroAddress && transition.Prover == proverSetAddress) { + log.Info( + "📬 Block's proof has already been submitted by current prover", + "blockID", ids[i], + "parent", parents[i].Hash().Hex(), + "hash", common.Bytes2Hex(transition.BlockHash[:]), + "stateRoot", common.Bytes2Hex(transition.StateRoot[:]), + "timestamp", transition.Timestamp, + "contester", transition.Contester, + ) + result[i] = &BlockProofStatus{ + IsSubmitted: true, + Invalid: transition.Contester != ZeroAddress, + ParentHeader: parents[i], + CurrentTransitionState: &transitions[i], + } + return nil + } + log.Info( + "📬 Block's proof has already been submitted by another prover", + "blockID", ids[i], + "prover", transition.Prover, + "parent", parents[i].Hash().Hex(), + "hash", common.Bytes2Hex(transition.BlockHash[:]), + "stateRoot", common.Bytes2Hex(transition.StateRoot[:]), + "timestamp", transition.Timestamp, + "contester", transition.Contester, + ) + + result[i] = &BlockProofStatus{ + IsSubmitted: true, + Invalid: transition.Contester != ZeroAddress, + ParentHeader: parents[i], + CurrentTransitionState: &transitions[i], + } + return nil + }) + } + return result, g.Wait() +} + // SetHead makes a `debug_setHead` RPC call to set the chain's head, should only be used // for testing purpose. func SetHead(ctx context.Context, client *EthClient, headNum *big.Int) error { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() return client.SetHead(ctxWithTimeout, headNum) @@ -214,10 +414,10 @@ func StringToBytes32(str string) [32]byte { return b } -// ctxWithTimeoutOrDefault sets a context timeout if the deadline has not passed or is not set, +// CtxWithTimeoutOrDefault sets a context timeout if the deadline has not passed or is not set, // and otherwise returns the context as passed in. cancel func is always set to an empty function // so is safe to defer the cancel. -func ctxWithTimeoutOrDefault(ctx context.Context, defaultTimeout time.Duration) (context.Context, context.CancelFunc) { +func CtxWithTimeoutOrDefault(ctx context.Context, defaultTimeout time.Duration) (context.Context, context.CancelFunc) { if utils.IsNil(ctx) { return context.WithTimeout(context.Background(), defaultTimeout) } @@ -227,3 +427,19 @@ func ctxWithTimeoutOrDefault(ctx context.Context, defaultTimeout time.Duration) return ctx, func() {} } + +// BlockOnInterruptsContext blocks until a SIGTERM is received. +// Passing in signals will override the default signals. +// The function will stop blocking if the context is closed. +func BlockOnInterruptsContext(ctx context.Context, signals ...os.Signal) { + if len(signals) == 0 { + signals = DefaultInterruptSignals + } + interruptChannel := make(chan os.Signal, 1) + signal.Notify(interruptChannel, signals...) + select { + case <-interruptChannel: + case <-ctx.Done(): + signal.Stop(interruptChannel) + } +} diff --git a/packages/taiko-client/pkg/utils/txmgr_selector.go b/packages/taiko-client/pkg/utils/txmgr_selector.go new file mode 100644 index 00000000000..1224bff4588 --- /dev/null +++ b/packages/taiko-client/pkg/utils/txmgr_selector.go @@ -0,0 +1,62 @@ +package utils + +import ( + "time" + + "github.com/ethereum-optimism/optimism/op-service/txmgr" +) + +var ( + defaultPrivateTxMgrRetryInterval = 5 * time.Minute +) + +// TxMgrSelector is responsible for selecting the correct transaction manager, +// it will choose the transaction manager for a private mempool if it is available and works well, +// otherwise it will choose the normal transaction manager. +type TxMgrSelector struct { + txMgr *txmgr.SimpleTxManager + privateTxMgr *txmgr.SimpleTxManager + privateTxMgrFailedAt *time.Time + privateTxMgrRetryInterval time.Duration +} + +// NewTxMgrSelector creates a new TxMgrSelector instance. +func NewTxMgrSelector( + txMgr *txmgr.SimpleTxManager, + privateTxMgr *txmgr.SimpleTxManager, + privateTxMgrRetryInterval *time.Duration, +) *TxMgrSelector { + retryInterval := defaultPrivateTxMgrRetryInterval + if privateTxMgrRetryInterval != nil { + retryInterval = *privateTxMgrRetryInterval + } + + return &TxMgrSelector{ + txMgr: txMgr, + privateTxMgr: privateTxMgr, + privateTxMgrFailedAt: nil, + privateTxMgrRetryInterval: retryInterval, + } +} + +// Select selects a transaction manager based on the current state. +func (s *TxMgrSelector) Select() (*txmgr.SimpleTxManager, bool) { + // If there is no private transaction manager, return the normal transaction manager. + if s.privateTxMgr == nil { + return s.txMgr, false + } + + // If the private transaction manager has failed, check if it is time to retry. + if s.privateTxMgrFailedAt == nil || time.Now().After(s.privateTxMgrFailedAt.Add(s.privateTxMgrRetryInterval)) { + return s.privateTxMgr, true + } + + // Otherwise, return the normal transaction manager. + return s.txMgr, false +} + +// RecordPrivateTxMgrFailed records the time when the private transaction manager has failed. +func (s *TxMgrSelector) RecordPrivateTxMgrFailed() { + now := time.Now() + s.privateTxMgrFailedAt = &now +} diff --git a/packages/taiko-client/pkg/utils/txmgr_selector_test.go b/packages/taiko-client/pkg/utils/txmgr_selector_test.go new file mode 100644 index 00000000000..92ff69d1d07 --- /dev/null +++ b/packages/taiko-client/pkg/utils/txmgr_selector_test.go @@ -0,0 +1,29 @@ +package utils + +import ( + "testing" + + "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/stretchr/testify/require" +) + +var ( + testTxMgr = &txmgr.SimpleTxManager{} + testSelector = NewTxMgrSelector(testTxMgr, nil, nil) +) + +func TestNewTxMgrSelector(t *testing.T) { + require.Equal(t, defaultPrivateTxMgrRetryInterval, testSelector.privateTxMgrRetryInterval) +} + +func TestSelect(t *testing.T) { + txMgr, isPrivate := testSelector.Select() + require.NotNil(t, txMgr) + require.False(t, isPrivate) +} + +func TestRecordPrivateTxMgrFailed(t *testing.T) { + require.Nil(t, testSelector.privateTxMgrFailedAt) + testSelector.RecordPrivateTxMgrFailed() + require.NotNil(t, testSelector.privateTxMgrFailedAt) +} diff --git a/packages/taiko-client/internal/utils/util_test.go b/packages/taiko-client/pkg/utils/util_test.go similarity index 93% rename from packages/taiko-client/internal/utils/util_test.go rename to packages/taiko-client/pkg/utils/util_test.go index 8ccafffc8fa..6c3da5f33de 100644 --- a/packages/taiko-client/internal/utils/util_test.go +++ b/packages/taiko-client/pkg/utils/util_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/require" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) func TestEncodeDecodeBytes(t *testing.T) { diff --git a/packages/taiko-client/internal/utils/utils.go b/packages/taiko-client/pkg/utils/utils.go similarity index 96% rename from packages/taiko-client/internal/utils/utils.go rename to packages/taiko-client/pkg/utils/utils.go index 1eaea75dd87..7c7ca2845aa 100644 --- a/packages/taiko-client/internal/utils/utils.go +++ b/packages/taiko-client/pkg/utils/utils.go @@ -6,9 +6,8 @@ import ( "crypto/rand" "errors" "fmt" - "math" - "io" + "math" "math/big" "os" "strings" @@ -70,14 +69,6 @@ func Min[T constraints.Integer](a, b T) T { return b } -// Max return the maximum value of two integers. -func Max[T constraints.Integer](a, b T) T { - if a > b { - return a - } - return b -} - // Compress compresses the given txList bytes using zlib. func Compress(txList []byte) ([]byte, error) { var b bytes.Buffer diff --git a/packages/taiko-client/proposer/config.go b/packages/taiko-client/proposer/config.go index 499aa0be7c6..2dcdec36d39 100644 --- a/packages/taiko-client/proposer/config.go +++ b/packages/taiko-client/proposer/config.go @@ -3,8 +3,6 @@ package proposer import ( "crypto/ecdsa" "fmt" - "math/big" - "net/url" "strings" "time" @@ -14,37 +12,32 @@ import ( "github.com/urfave/cli/v2" "github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + pkgFlags "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/flags" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - - pkgFlags "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/flags" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) // Config contains all configurations to initialize a Taiko proposer. type Config struct { *rpc.ClientConfig - AssignmentHookAddress common.Address L1ProposerPrivKey *ecdsa.PrivateKey L2SuggestedFeeRecipient common.Address - ExtraData string ProposeInterval time.Duration LocalAddresses []common.Address LocalAddressesOnly bool MinGasUsed uint64 MinTxListBytes uint64 + MinTip uint64 MinProposingInternal time.Duration + AllowZeroInterval uint64 MaxProposedTxListsPerEpoch uint64 ProposeBlockTxGasLimit uint64 - ProverEndpoints []*url.URL - OptimisticTierFee *big.Int - SgxTierFee *big.Int - TierFeePriceBump *big.Int - MaxTierFeePriceBumps uint64 - IncludeParentMetaHash bool BlobAllowed bool + FallbackToCalldata bool + RevertProtectionEnabled bool TxmgrConfigs *txmgr.CLIConfig - L1BlockBuilderTip *big.Int + PrivateTxmgrConfigs *txmgr.CLIConfig } // NewConfigFromCliContext initializes a Config instance from @@ -75,23 +68,14 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { } } - var proverEndpoints []*url.URL - for _, e := range strings.Split(c.String(flags.ProverEndpoints.Name), ",") { - endpoint, err := url.Parse(e) - if err != nil { - return nil, err - } - proverEndpoints = append(proverEndpoints, endpoint) - } - - optimisticTierFee, err := utils.GWeiToWei(c.Float64(flags.OptimisticTierFee.Name)) + minTip, err := utils.GWeiToWei(c.Float64(flags.MinTip.Name)) if err != nil { return nil, err } - sgxTierFee, err := utils.GWeiToWei(c.Float64(flags.SgxTierFee.Name)) - if err != nil { - return nil, err + maxProposedTxListsPerEpoch := c.Uint64(flags.MaxProposedTxListsPerEpoch.Name) + if maxProposedTxListsPerEpoch > 2 { + return nil, fmt.Errorf("max proposed tx lists per epoch should not exceed 2, got: %d", maxProposedTxListsPerEpoch) } return &Config{ @@ -104,31 +88,32 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { JwtSecret: string(jwtSecret), TaikoTokenAddress: common.HexToAddress(c.String(flags.TaikoTokenAddress.Name)), Timeout: c.Duration(flags.RPCTimeout.Name), + ProverSetAddress: common.HexToAddress(c.String(flags.ProverSetAddress.Name)), }, - AssignmentHookAddress: common.HexToAddress(c.String(flags.AssignmentHookAddress.Name)), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(l2SuggestedFeeRecipient), - ExtraData: c.String(flags.ExtraData.Name), ProposeInterval: c.Duration(flags.ProposeInterval.Name), LocalAddresses: localAddresses, LocalAddressesOnly: c.Bool(flags.TxPoolLocalsOnly.Name), MinGasUsed: c.Uint64(flags.MinGasUsed.Name), MinTxListBytes: c.Uint64(flags.MinTxListBytes.Name), + MinTip: minTip.Uint64(), MinProposingInternal: c.Duration(flags.MinProposingInternal.Name), - MaxProposedTxListsPerEpoch: c.Uint64(flags.MaxProposedTxListsPerEpoch.Name), + MaxProposedTxListsPerEpoch: maxProposedTxListsPerEpoch, + AllowZeroInterval: c.Uint64(flags.AllowZeroInterval.Name), ProposeBlockTxGasLimit: c.Uint64(flags.TxGasLimit.Name), - ProverEndpoints: proverEndpoints, - OptimisticTierFee: optimisticTierFee, - SgxTierFee: sgxTierFee, - TierFeePriceBump: new(big.Int).SetUint64(c.Uint64(flags.TierFeePriceBump.Name)), - MaxTierFeePriceBumps: c.Uint64(flags.MaxTierFeePriceBumps.Name), - IncludeParentMetaHash: c.Bool(flags.ProposeBlockIncludeParentMetaHash.Name), BlobAllowed: c.Bool(flags.BlobAllowed.Name), - L1BlockBuilderTip: new(big.Int).SetUint64(c.Uint64(flags.L1BlockBuilderTip.Name)), + FallbackToCalldata: c.Bool(flags.FallbackToCalldata.Name), + RevertProtectionEnabled: c.Bool(flags.RevertProtectionEnabled.Name), TxmgrConfigs: pkgFlags.InitTxmgrConfigsFromCli( c.String(flags.L1WSEndpoint.Name), l1ProposerPrivKey, c, ), + PrivateTxmgrConfigs: pkgFlags.InitTxmgrConfigsFromCli( + c.String(flags.L1PrivateEndpoint.Name), + l1ProposerPrivKey, + c, + ), }, nil } diff --git a/packages/taiko-client/proposer/config_test.go b/packages/taiko-client/proposer/config_test.go index 47707e55d56..e1af554fed3 100644 --- a/packages/taiko-client/proposer/config_test.go +++ b/packages/taiko-client/proposer/config_test.go @@ -2,9 +2,7 @@ package proposer import ( "context" - "fmt" "os" - "strings" "time" "github.com/ethereum/go-ethereum/common" @@ -13,17 +11,14 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" "github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" ) var ( - l1Endpoint = os.Getenv("L1_NODE_WS_ENDPOINT") - l2Endpoint = os.Getenv("L2_EXECUTION_ENGINE_HTTP_ENDPOINT") - taikoL1 = os.Getenv("TAIKO_L1_ADDRESS") - taikoL2 = os.Getenv("TAIKO_L2_ADDRESS") - taikoToken = os.Getenv("TAIKO_TOKEN_ADDRESS") - proverEndpoints = "http://localhost:9876,http://localhost:1234" - tierFee = 100.0 + l1Endpoint = os.Getenv("L1_WS") + l2Endpoint = os.Getenv("L2_HTTP") + taikoL1 = os.Getenv("TAIKO_L1") + taikoL2 = os.Getenv("TAIKO_L2") + taikoToken = os.Getenv("TAIKO_TOKEN") proposeInterval = "10s" rpcTimeout = "5s" ) @@ -48,17 +43,6 @@ func (s *ProposerTestSuite) TestNewConfigFromCliContext() { s.Equal(1, len(c.LocalAddresses)) s.Equal(goldenTouchAddress, c.LocalAddresses[0]) s.Equal(5*time.Second, c.Timeout) - tierFeeGWei, err := utils.GWeiToWei(tierFee) - s.Nil(err) - s.Equal(tierFeeGWei.Uint64(), c.OptimisticTierFee.Uint64()) - s.Equal(tierFeeGWei.Uint64(), c.SgxTierFee.Uint64()) - s.Equal(uint64(15), c.TierFeePriceBump.Uint64()) - s.Equal(uint64(5), c.MaxTierFeePriceBumps) - s.Equal(true, c.IncludeParentMetaHash) - - for i, e := range strings.Split(proverEndpoints, ",") { - s.Equal(c.ProverEndpoints[i].String(), e) - } s.Nil(new(Proposer).InitFromCli(context.Background(), cliCtx)) return nil @@ -77,12 +61,6 @@ func (s *ProposerTestSuite) TestNewConfigFromCliContext() { "--" + flags.TxPoolLocals.Name, goldenTouchAddress.Hex(), "--" + flags.RPCTimeout.Name, rpcTimeout, "--" + flags.TxGasLimit.Name, "100000", - "--" + flags.ProverEndpoints.Name, proverEndpoints, - "--" + flags.OptimisticTierFee.Name, fmt.Sprint(tierFee), - "--" + flags.SgxTierFee.Name, fmt.Sprint(tierFee), - "--" + flags.TierFeePriceBump.Name, "15", - "--" + flags.MaxTierFeePriceBumps.Name, "5", - "--" + flags.ProposeBlockIncludeParentMetaHash.Name, "true", })) } @@ -136,14 +114,7 @@ func (s *ProposerTestSuite) SetupApp() *cli.App { &cli.DurationFlag{Name: flags.MinProposingInternal.Name}, &cli.DurationFlag{Name: flags.ProposeInterval.Name}, &cli.StringFlag{Name: flags.TxPoolLocals.Name}, - &cli.StringFlag{Name: flags.ProverEndpoints.Name}, - &cli.Uint64Flag{Name: flags.OptimisticTierFee.Name}, - &cli.Uint64Flag{Name: flags.SgxTierFee.Name}, &cli.DurationFlag{Name: flags.RPCTimeout.Name}, - &cli.Uint64Flag{Name: flags.TierFeePriceBump.Name}, - &cli.Uint64Flag{Name: flags.MaxTierFeePriceBumps.Name}, - &cli.BoolFlag{Name: flags.ProposeBlockIncludeParentMetaHash.Name}, - &cli.StringFlag{Name: flags.AssignmentHookAddress.Name}, } app.Flags = append(app.Flags, flags.TxmgrFlags...) app.Action = func(ctx *cli.Context) error { diff --git a/packages/taiko-client/proposer/proposer.go b/packages/taiko-client/proposer/proposer.go index cc045c1b46b..7c147e52250 100644 --- a/packages/taiko-client/proposer/proposer.go +++ b/packages/taiko-client/proposer/proposer.go @@ -1,10 +1,11 @@ package proposer import ( - "bytes" "context" "encoding/json" + "errors" "fmt" + "math/big" "net/http" "sync" "time" @@ -20,22 +21,16 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" "github.com/urfave/cli/v2" - "golang.org/x/sync/errgroup" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - selector "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer/prover_selector" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" builder "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer/transaction_builder" ) -var ( - proverAssignmentTimeout = 30 * time.Minute - requestProverServerTimeout = 12 * time.Second -) - // Proposer keep proposing new transactions from L2 execution engine's tx pool at a fixed interval. type Proposer struct { // configurations @@ -49,38 +44,39 @@ type Proposer struct { // proposingTimer *time.Timer - tiers []*rpc.TierProviderTierWithID - tierFees []encoding.TierFee - - // Prover selector - proverSelector selector.ProverSelector - // Transaction builder txBuilder builder.ProposeBlockTransactionBuilder // Protocol configurations protocolConfigs *bindings.TaikoDataConfig + chainConfig *config.ChainConfig + lastProposedAt time.Time + totalEpochs uint64 - txmgr *txmgr.SimpleTxManager + txmgrSelector *utils.TxMgrSelector ctx context.Context wg sync.WaitGroup } -// InitFromCli New initializes the given proposer instance based on the command line flags. +// InitFromCli initializes the given proposer instance based on the command line flags. func (p *Proposer) InitFromCli(ctx context.Context, c *cli.Context) error { cfg, err := NewConfigFromCliContext(c) if err != nil { return err } - return p.InitFromConfig(ctx, cfg) + return p.InitFromConfig(ctx, cfg, nil, nil) } // InitFromConfig initializes the proposer instance based on the given configurations. -func (p *Proposer) InitFromConfig(ctx context.Context, cfg *Config) (err error) { +func (p *Proposer) InitFromConfig( + ctx context.Context, cfg *Config, + txMgr *txmgr.SimpleTxManager, + privateTxMgr *txmgr.SimpleTxManager, +) (err error) { p.proposerAddress = crypto.PubkeyToAddress(cfg.L1ProposerPrivKey.PublicKey) p.ctx = ctx p.Config = cfg @@ -92,71 +88,50 @@ func (p *Proposer) InitFromConfig(ctx context.Context, cfg *Config) (err error) } // Protocol configs - protocolConfigs, err := p.rpc.TaikoL1.GetConfig(&bind.CallOpts{Context: ctx}) + protocolConfigs, err := rpc.GetProtocolConfigs(p.rpc.TaikoL1, &bind.CallOpts{Context: p.ctx}) if err != nil { return fmt.Errorf("failed to get protocol configs: %w", err) } p.protocolConfigs = &protocolConfigs - log.Info("Protocol configs", "configs", p.protocolConfigs) - if p.tiers, err = p.rpc.GetTiers(ctx); err != nil { - return err - } - if err := p.initTierFees(); err != nil { - return err + if txMgr == nil { + if txMgr, err = txmgr.NewSimpleTxManager( + "proposer", + log.Root(), + &metrics.TxMgrMetrics, + *cfg.TxmgrConfigs, + ); err != nil { + return err + } } - if p.txmgr, err = txmgr.NewSimpleTxManager( - "proposer", - log.Root(), - &metrics.TxMgrMetrics, - *cfg.TxmgrConfigs, - ); err != nil { - return err + if privateTxMgr == nil && cfg.PrivateTxmgrConfigs != nil && len(cfg.PrivateTxmgrConfigs.L1RPCURL) > 0 { + if privateTxMgr, err = txmgr.NewSimpleTxManager( + "privateMempoolProposer", + log.Root(), + &metrics.TxMgrMetrics, + *cfg.PrivateTxmgrConfigs, + ); err != nil { + return err + } } - if p.proverSelector, err = selector.NewETHFeeEOASelector( - &protocolConfigs, + p.txmgrSelector = utils.NewTxMgrSelector(txMgr, privateTxMgr, nil) + p.chainConfig = config.NewChainConfig(p.protocolConfigs) + p.txBuilder = builder.NewBuilderWithFallback( p.rpc, - p.proposerAddress, + p.L1ProposerPrivKey, + cfg.L2SuggestedFeeRecipient, cfg.TaikoL1Address, - cfg.AssignmentHookAddress, - p.tierFees, - cfg.TierFeePriceBump, - cfg.ProverEndpoints, - cfg.MaxTierFeePriceBumps, - proverAssignmentTimeout, - requestProverServerTimeout, - ); err != nil { - return err - } - - if cfg.BlobAllowed { - p.txBuilder = builder.NewBlobTransactionBuilder( - p.rpc, - p.L1ProposerPrivKey, - p.proverSelector, - p.Config.L1BlockBuilderTip, - cfg.TaikoL1Address, - cfg.L2SuggestedFeeRecipient, - cfg.AssignmentHookAddress, - cfg.ProposeBlockTxGasLimit, - cfg.ExtraData, - ) - } else { - p.txBuilder = builder.NewCalldataTransactionBuilder( - p.rpc, - p.L1ProposerPrivKey, - p.proverSelector, - p.Config.L1BlockBuilderTip, - cfg.L2SuggestedFeeRecipient, - cfg.TaikoL1Address, - cfg.AssignmentHookAddress, - cfg.ProposeBlockTxGasLimit, - cfg.ExtraData, - ) - } + cfg.ProverSetAddress, + cfg.ProposeBlockTxGasLimit, + p.chainConfig, + p.txmgrSelector, + cfg.RevertProtectionEnabled, + cfg.BlobAllowed, + cfg.FallbackToCalldata, + ) return nil } @@ -178,6 +153,7 @@ type RPCReplyL2TxLists struct { TxLists []types.Transactions TxListBytes [][]byte ParentMetaHash common.Hash + ParentBlockID uint64 } type CustomResponse struct { @@ -193,6 +169,7 @@ type RPC struct { func (p *RPC) GetL2TxLists(_ *http.Request, _ *Args, reply *RPCReplyL2TxLists) error { txLists, compressedTxLists, err := p.proposer.ProposeOpForTakingL2Blocks(context.Background()) if err != nil { + log.Error("Failed taking L2 blocks", "error", err) return err } log.Info("Received L2 txLists ", "txListsLength", len(txLists)) @@ -200,12 +177,18 @@ func (p *RPC) GetL2TxLists(_ *http.Request, _ *Args, reply *RPCReplyL2TxLists) e log.Info("Single L2 txList", "txList", txLists[0]) } - parentMetaHash, err := builder.GetParentMetaHash(p.proposer.ctx, p.proposer.rpc) + parent, err := p.proposer.getParentOfLatestProposedBlock(p.proposer.ctx, p.proposer.rpc) if err != nil { + log.Error("Failed fetching parent of latest proposed block", "error", err) return err } - *reply = RPCReplyL2TxLists{TxLists: txLists, TxListBytes: compressedTxLists, ParentMetaHash: parentMetaHash} + *reply = RPCReplyL2TxLists{ + TxLists: txLists, + TxListBytes: compressedTxLists, + ParentMetaHash: parent.MetaHash, + ParentBlockID: parent.BlockId, + } return nil } @@ -277,6 +260,7 @@ func (c *CustomCodec) WriteResponse(w http.ResponseWriter, reply interface{}, me // // proposing interval timer has been reached // case <-p.proposingTimer.C: // metrics.ProposerProposeEpochCounter.Add(1) +// p.totalEpochs++ // // Attempt a proposing operation // if err := p.ProposeOp(p.ctx); err != nil { @@ -294,6 +278,16 @@ func (p *Proposer) Close(_ context.Context) { // fetchPoolContent fetches the transaction pool content from L2 execution engine. func (p *Proposer) fetchPoolContent(filterPoolContent bool) ([]types.Transactions, error) { + var ( + minTip = p.MinTip + startAt = time.Now() + ) + // If `--epoch.allowZeroInterval` flag is set, allow proposing zero tip transactions once when + // the total epochs number is divisible by the flag value. + if p.AllowZeroInterval > 0 && p.totalEpochs%p.AllowZeroInterval == 0 { + minTip = 0 + } + // Fetch the pool content. preBuiltTxList, err := p.rpc.GetPoolContent( p.ctx, @@ -302,11 +296,15 @@ func (p *Proposer) fetchPoolContent(filterPoolContent bool) ([]types.Transaction rpc.BlockMaxTxListBytes, p.LocalAddresses, p.MaxProposedTxListsPerEpoch, + minTip, + p.chainConfig, ) if err != nil { return nil, fmt.Errorf("failed to fetch transaction pool content: %w", err) } + metrics.ProposerPoolContentFetchTime.Set(time.Since(startAt).Seconds()) + txLists := []types.Transactions{} for i, txs := range preBuiltTxList { // Filter the pool content if the filterPoolContent flag is set. @@ -384,6 +382,7 @@ func (p *Proposer) ProposeOp(ctx context.Context) error { "lastProposedAt", p.lastProposedAt, ) + // Fetch pending L2 transactions from mempool. txLists, err := p.fetchPoolContent(filterPoolContent) if err != nil { return err @@ -394,37 +393,17 @@ func (p *Proposer) ProposeOp(ctx context.Context) error { return nil } - g, gCtx := errgroup.WithContext(ctx) - // Propose all L2 transactions lists. - for _, txs := range txLists[:utils.Min(p.MaxProposedTxListsPerEpoch, uint64(len(txLists)))] { - nonce, err := p.rpc.L1.PendingNonceAt(ctx, p.proposerAddress) - if err != nil { - log.Error("Failed to get proposer nonce", "error", err) - break - } - - log.Info("Proposer current pending nonce", "nonce", nonce) - - g.Go(func() error { - txListBytes, err := rlp.EncodeToBytes(txs) - if err != nil { - return fmt.Errorf("failed to encode transactions: %w", err) - } - if err := p.ProposeTxList(gCtx, txListBytes, uint(txs.Len())); err != nil { - return err - } - p.lastProposedAt = time.Now() - return nil - }) + // Propose the transactions lists. + return p.ProposeTxLists(ctx, txLists) +} - if err := p.rpc.WaitL1NewPendingTransaction(ctx, p.proposerAddress, nonce); err != nil { - log.Error("Failed to wait for new pending transaction", "error", err) - } - } - if err := g.Wait(); err != nil { +// ProposeTxList proposes the given transactions lists to TaikoL1 smart contract. +func (p *Proposer) ProposeTxLists(ctx context.Context, txLists []types.Transactions) error { + // If the current L2 chain is after ontake fork, batch propose all L2 transactions lists. + if err := p.ProposeTxListOntake(ctx, txLists); err != nil { return err } - + p.lastProposedAt = time.Now() return nil } @@ -446,7 +425,7 @@ func (p *Proposer) ProposeOpForTakingL2Blocks(ctx context.Context) ([]types.Tran txLists, err := p.fetchPoolContent(filterPoolContent) if err != nil { - return nil, nil, err + return nil, nil, fmt.Errorf("failed to fetch pool content: %w", err) } // If the pool content is empty, return. @@ -471,7 +450,7 @@ func (p *Proposer) ProposeOpForTakingL2Blocks(ctx context.Context) ([]types.Tran } compressedTxListBytes, err := utils.Compress(txListBytes) if err != nil { - return nil, nil, err + return nil, nil, fmt.Errorf("failed to compress tx list: %w", err) } compressedTxLists = append(compressedTxLists, compressedTxListBytes) p.lastProposedAt = time.Now() //TODO check if it's correct @@ -480,42 +459,68 @@ func (p *Proposer) ProposeOpForTakingL2Blocks(ctx context.Context) ([]types.Tran return txLists, compressedTxLists, nil } -// ProposeTxList proposes the given transactions list to TaikoL1 smart contract. -func (p *Proposer) ProposeTxList( +// ProposeTxListOntake proposes the given transactions lists to TaikoL1 smart contract. +func (p *Proposer) ProposeTxListOntake( ctx context.Context, - txListBytes []byte, - txNum uint, + txLists []types.Transactions, ) error { - compressedTxListBytes, err := utils.Compress(txListBytes) - if err != nil { - return err + var ( + proverAddress = p.proposerAddress + txListsBytesArray [][]byte + txNums []int + totalTxs int + ) + for _, txs := range txLists { + txListBytes, err := rlp.EncodeToBytes(txs) + if err != nil { + return fmt.Errorf("failed to encode transactions: %w", err) + } + + compressedTxListBytes, err := utils.Compress(txListBytes) + if err != nil { + return err + } + + txListsBytesArray = append(txListsBytesArray, compressedTxListBytes) + txNums = append(txNums, len(txs)) + totalTxs += len(txs) } - txCandidate, err := p.txBuilder.Build( + if p.Config.ClientConfig.ProverSetAddress != rpc.ZeroAddress { + proverAddress = p.Config.ClientConfig.ProverSetAddress + } + + ok, err := rpc.CheckProverBalance( ctx, - p.tierFees, - p.IncludeParentMetaHash, - compressedTxListBytes, + p.rpc, + proverAddress, + p.TaikoL1Address, + new(big.Int).Mul(p.protocolConfigs.LivenessBond, new(big.Int).SetUint64(uint64(len(txLists)))), ) + if err != nil { - log.Warn("Failed to build TaikoL1.proposeBlock transaction", "error", encoding.TryParsingCustomError(err)) + log.Warn("Failed to check prover balance", "error", err) return err } - receipt, err := p.txmgr.Send(ctx, *txCandidate) + if !ok { + return errors.New("insufficient prover balance") + } + + txCandidate, err := p.txBuilder.BuildOntake(ctx, txListsBytesArray) if err != nil { - log.Warn("Failed to send TaikoL1.proposeBlock transaction", "error", encoding.TryParsingCustomError(err)) + log.Warn("Failed to build TaikoL1.proposeBlocksV2 transaction", "error", encoding.TryParsingCustomError(err)) return err } - if receipt.Status != types.ReceiptStatusSuccessful { - return fmt.Errorf("failed to propose block: %s", receipt.TxHash.Hex()) + if err := p.sendTx(ctx, txCandidate); err != nil { + return err } - log.Info("📝 Propose transactions succeeded", "txs", txNum) + log.Info("📝 Batch propose transactions succeeded", "txs", txNums) - metrics.ProposerProposedTxListsCounter.Add(1) - metrics.ProposerProposedTxsCounter.Add(float64(txNum)) + metrics.ProposerProposedTxListsCounter.Add(float64(len(txLists))) + metrics.ProposerProposedTxsCounter.Add(float64(totalTxs)) return nil } @@ -538,38 +543,48 @@ func (p *Proposer) ProposeTxList( // p.proposingTimer = time.NewTimer(duration) // } +// sendTx is the internal function to send a transaction with a selected tx manager. +func (p *Proposer) sendTx(ctx context.Context, txCandidate *txmgr.TxCandidate) error { + txMgr, isPrivate := p.txmgrSelector.Select() + receipt, err := txMgr.Send(ctx, *txCandidate) + if err != nil { + log.Warn( + "Failed to send TaikoL1.proposeBlock / TaikoL1.proposeBlocksV2 transaction by tx manager", + "isPrivateMempool", isPrivate, + "error", encoding.TryParsingCustomError(err), + ) + if isPrivate { + p.txmgrSelector.RecordPrivateTxMgrFailed() + } + return err + } + + if receipt.Status != types.ReceiptStatusSuccessful { + return fmt.Errorf("failed to propose block: %s", receipt.TxHash.Hex()) + } + return nil +} + // Name returns the application name. func (p *Proposer) Name() string { return "proposer" } -// initTierFees initializes the proving fees for every proof tier configured in the protocol for the proposer. -func (p *Proposer) initTierFees() error { - for _, tier := range p.tiers { - log.Info( - "Protocol tier", - "id", tier.ID, - "name", string(bytes.TrimRight(tier.VerifierName[:], "\x00")), - "validityBond", utils.WeiToEther(tier.ValidityBond), - "contestBond", utils.WeiToEther(tier.ContestBond), - "provingWindow", tier.ProvingWindow, - "cooldownWindow", tier.CooldownWindow, - ) +// TODO: check if this is needed +// getParentOfLatestProposedBlock returns the parent block of the latest proposed block in protocol +func (p *Proposer) getParentOfLatestProposedBlock( + ctx context.Context, + rpc *rpc.Client, +) (*bindings.TaikoDataBlockV2, error) { + state, err := rpc.TaikoL1.State(&bind.CallOpts{Context: ctx}) + if err != nil { + return nil, err + } - switch tier.ID { - case encoding.TierOptimisticID: - p.tierFees = append(p.tierFees, encoding.TierFee{Tier: tier.ID, Fee: p.OptimisticTierFee}) - case encoding.TierSgxID: - p.tierFees = append(p.tierFees, encoding.TierFee{Tier: tier.ID, Fee: p.SgxTierFee}) - case encoding.TierGuardianMinorityID: - p.tierFees = append(p.tierFees, encoding.TierFee{Tier: tier.ID, Fee: common.Big0}) - case encoding.TierGuardianMajorityID: - // Guardian prover should not charge any fee. - p.tierFees = append(p.tierFees, encoding.TierFee{Tier: tier.ID, Fee: common.Big0}) - default: - return fmt.Errorf("unknown tier: %d", tier.ID) - } + parent, err := rpc.GetL2BlockInfoV2(ctx, new(big.Int).SetUint64(state.SlotB.NumBlocks-1)) + if err != nil { + return nil, err } - return nil + return &parent, nil } diff --git a/packages/taiko-client/proposer/proposer_test.go b/packages/taiko-client/proposer/proposer_test.go index 23849d33cb7..f4dcc358f2f 100644 --- a/packages/taiko-client/proposer/proposer_test.go +++ b/packages/taiko-client/proposer/proposer_test.go @@ -2,30 +2,31 @@ package proposer import ( "context" + "crypto/ecdsa" + "fmt" + "maps" + "math/big" "os" "testing" "time" "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/miner" - "github.com/ethereum/go-ethereum/rlp" "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer/beaconsync" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer/blob" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - builder "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer/transaction_builder" ) type ProposerTestSuite struct { @@ -65,32 +66,23 @@ func (s *ProposerTestSuite) SetupTest() { s.Nil(p.InitFromConfig(ctx, &Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_HTTP_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_HTTP"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: string(jwtSecret), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), MinProposingInternal: 0, ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: s.ProverEndpoints, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - TierFeePriceBump: common.Big2, - MaxTierFeePriceBumps: 3, - ExtraData: "test", - L1BlockBuilderTip: common.Big0, - BlobAllowed: true, ProposeBlockTxGasLimit: 10_000_000, + FallbackToCalldata: true, TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), @@ -104,67 +96,153 @@ func (s *ProposerTestSuite) SetupTest() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - })) + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + }, nil, nil)) s.p = p s.cancel = cancel } -func (s *ProposerTestSuite) TestProposeTxLists() { - s.T().Skip("Skipping, preconfer changes") - p := s.p - ctx := p.ctx - cfg := s.p.Config - - txBuilder := builder.NewBlobTransactionBuilder( - p.rpc, - p.L1ProposerPrivKey, - p.proverSelector, - p.Config.L1BlockBuilderTip, - cfg.TaikoL1Address, - cfg.L2SuggestedFeeRecipient, - cfg.AssignmentHookAddress, - cfg.ProposeBlockTxGasLimit, - cfg.ExtraData, - ) - - emptyTxListBytes, err := rlp.EncodeToBytes(types.Transactions{}) - s.Nil(err) - txListsBytes := [][]byte{emptyTxListBytes} - txCandidates := make([]txmgr.TxCandidate, len(txListsBytes)) - for i, txListBytes := range txListsBytes { - compressedTxListBytes, err := utils.Compress(txListBytes) - if err != nil { - log.Warn("Failed to compress transactions list", "index", i, "error", err) - break - } +func (s *ProposerTestSuite) TestTxPoolContentWithMinTip() { + if os.Getenv("L2_NODE") == "l2_reth" { + s.T().Skip() + } - candidate, err := txBuilder.Build( - p.ctx, - p.tierFees, - p.IncludeParentMetaHash, - compressedTxListBytes, + // Empty mempool at first. + for { + poolContent, err := s.RPCClient.GetPoolContent( + context.Background(), + s.p.proposerAddress, + s.p.protocolConfigs.BlockMaxGasLimit, + rpc.BlockMaxTxListBytes, + s.p.LocalAddresses, + 10, + 0, + s.p.chainConfig, ) - if err != nil { - log.Warn("Failed to build TaikoL1.proposeBlock transaction", "error", err) - break + s.Nil(err) + + if len(poolContent) > 0 { + s.Nil(s.p.ProposeOp(context.Background())) + s.Nil(s.s.ProcessL1Blocks(context.Background())) + continue } + break + } - // trigger the error - candidate.GasLimit = 10_000_000 + privetKeyHexList := []string{ + "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", // 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 + "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", // 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC + "0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6", // 0x90F79bf6EB2c4f870365E785982E1f101E93b906 + "0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a", // 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 + "0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba", // 0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc + } - txCandidates[i] = *candidate + var privateKeys []*ecdsa.PrivateKey + for _, privateKeyHex := range privetKeyHexList { + priv, err := crypto.ToECDSA(common.FromHex(privateKeyHex)) + s.Nil(err) + privateKeys = append(privateKeys, priv) } - for _, txCandidate := range txCandidates { - receipt, err := p.txmgr.Send(ctx, txCandidate) + originalNonceMap := make(map[common.Address]uint64) + for _, priv := range privateKeys { + transactOpts, err := bind.NewKeyedTransactorWithChainID(priv, s.RPCClient.L2.ChainID) s.Nil(err) - s.Nil(encoding.TryParsingCustomErrorFromReceipt(ctx, p.rpc.L1, p.proposerAddress, receipt)) + nonce, err := s.RPCClient.L2.PendingNonceAt(context.Background(), transactOpts.From) + s.Nil(err) + originalNonceMap[transactOpts.From] = nonce + // Send 1500 transactions to mempool + for i := 0; i < 300; i++ { + _, err = testutils.AssembleTestTx(s.RPCClient.L2, priv, nonce+uint64(i), &transactOpts.From, common.Big1, nil) + s.Nil(err) + } } + + for _, testCase := range []struct { + blockMaxGasLimit uint32 + blockMaxTxListBytes uint64 + maxTransactionsLists uint64 + txLengthList []int + }{ + { + s.p.protocolConfigs.BlockMaxGasLimit, + rpc.BlockMaxTxListBytes, + s.p.MaxProposedTxListsPerEpoch, + []int{1500}, + }, + { + s.p.protocolConfigs.BlockMaxGasLimit, + rpc.BlockMaxTxListBytes, + s.p.MaxProposedTxListsPerEpoch * 5, + []int{1500}, + }, + { + s.p.protocolConfigs.BlockMaxGasLimit / 50, + rpc.BlockMaxTxListBytes, + 200, + []int{129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 81}, + }, + } { + poolContent, err := s.RPCClient.GetPoolContent( + context.Background(), + s.p.proposerAddress, + testCase.blockMaxGasLimit, + testCase.blockMaxTxListBytes, + s.p.LocalAddresses, + testCase.maxTransactionsLists, + 0, + s.p.chainConfig, + ) + s.Nil(err) + + nonceMap := maps.Clone(originalNonceMap) + // Check the order of nonce. + for _, txList := range poolContent { + for _, tx := range txList.TxList { + sender, err := types.Sender(types.LatestSignerForChainID(s.RPCClient.L2.ChainID), tx) + s.Nil(err) + s.Equalf(nonceMap[sender], tx.Nonce(), + fmt.Sprintf("incorrect nonce of %s, expect: %d, actual: %d", + sender.String(), + nonceMap[sender], + tx.Nonce(), + )) + nonceMap[sender]++ + } + } + + s.GreaterOrEqual(int(testCase.maxTransactionsLists), len(poolContent)) + for i, txsLen := range testCase.txLengthList { + s.Equal(txsLen, poolContent[i].TxList.Len()) + s.GreaterOrEqual(uint64(testCase.blockMaxGasLimit), poolContent[i].EstimatedGasUsed) + s.GreaterOrEqual(testCase.blockMaxTxListBytes, poolContent[i].BytesLength) + } + } + + s.Nil(s.p.ProposeOp(context.Background())) + s.Nil(s.s.ProcessL1Blocks(context.Background())) } func (s *ProposerTestSuite) TestProposeOpNoEmptyBlock() { - s.T().Skip("Skipping, preconfer changes") + // TODO: Temporarily skip this test case when using l2_reth node. + if os.Getenv("L2_NODE") == "l2_reth" { + s.T().Skip() + } defer s.Nil(s.s.ProcessL1Blocks(context.Background())) p := s.p @@ -187,6 +265,8 @@ func (s *ProposerTestSuite) TestProposeOpNoEmptyBlock() { rpc.BlockMaxTxListBytes, p.LocalAddresses, p.MaxProposedTxListsPerEpoch, + 0, + p.chainConfig, ) time.Sleep(time.Second) } @@ -220,16 +300,13 @@ func (s *ProposerTestSuite) TestProposeOpNoEmptyBlock() { } func (s *ProposerTestSuite) TestName() { - s.T().Skip("Skipping, preconfer changes") s.Equal("proposer", s.p.Name()) } func (s *ProposerTestSuite) TestProposeOp() { - s.T().Skip("Skipping, preconfer changes") // Propose txs in L2 execution engine's mempool - sink := make(chan *bindings.TaikoL1ClientBlockProposed) - - sub, err := s.p.rpc.TaikoL1.WatchBlockProposed(nil, sink, nil, nil) + sink := make(chan *bindings.TaikoL1ClientBlockProposedV2) + sub, err := s.p.rpc.TaikoL1.WatchBlockProposedV2(nil, sink, nil) s.Nil(err) defer func() { sub.Unsubscribe() @@ -242,35 +319,60 @@ func (s *ProposerTestSuite) TestProposeOp() { s.Nil(s.p.ProposeOp(context.Background())) - event := <-sink - - s.Equal(event.Meta.Coinbase, s.p.L2SuggestedFeeRecipient) + var ( + event = <-sink + meta = metadata.NewTaikoDataBlockMetadataOntake(event) + ) + s.Equal(meta.GetCoinbase(), s.p.L2SuggestedFeeRecipient) - _, isPending, err := s.p.rpc.L1.TransactionByHash(context.Background(), event.Raw.TxHash) + _, isPending, err := s.p.rpc.L1.TransactionByHash(context.Background(), meta.GetTxHash()) s.Nil(err) s.False(isPending) - receipt, err := s.p.rpc.L1.TransactionReceipt(context.Background(), event.Raw.TxHash) + receipt, err := s.p.rpc.L1.TransactionReceipt(context.Background(), meta.GetTxHash()) s.Nil(err) s.Equal(types.ReceiptStatusSuccessful, receipt.Status) } func (s *ProposerTestSuite) TestProposeEmptyBlockOp() { - s.T().Skip("Skipping, preconfer changes") s.p.MinProposingInternal = 1 * time.Second s.p.lastProposedAt = time.Now().Add(-10 * time.Second) s.Nil(s.p.ProposeOp(context.Background())) } -func (s *ProposerTestSuite) TestAssignProverSuccessFirstRound() { - s.T().Skip("Skipping, preconfer changes") - s.SetL1Automine(false) - defer s.SetL1Automine(true) +func (s *ProposerTestSuite) TestProposeTxListOntake() { + for i := 0; i < int(s.p.protocolConfigs.OntakeForkHeight); i++ { + s.ProposeAndInsertValidBlock(s.p, s.s) + } - _, _, fee, err := s.p.proverSelector.AssignProver(context.Background(), s.p.tierFees, testutils.RandomHash()) + l2Head, err := s.p.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + s.GreaterOrEqual(l2Head.Number.Uint64(), s.p.protocolConfigs.OntakeForkHeight) + sink := make(chan *bindings.TaikoL1ClientBlockProposedV2) + sub, err := s.p.rpc.TaikoL1.WatchBlockProposedV2(nil, sink, nil) s.Nil(err) - s.Equal(fee.Uint64(), s.p.OptimisticTierFee.Uint64()) + defer func() { + sub.Unsubscribe() + close(sink) + }() + s.Nil(s.p.ProposeTxListOntake(context.Background(), []types.Transactions{{}, {}})) + s.Nil(s.s.ProcessL1Blocks(context.Background())) + + var l1Height *big.Int + for i := 0; i < 2; i++ { + event := <-sink + if l1Height == nil { + l1Height = new(big.Int).SetUint64(event.Raw.BlockNumber) + continue + } + s.Equal(l1Height.Uint64(), event.Raw.BlockNumber) + } + + newL2head, err := s.p.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + s.Equal(l2Head.Number.Uint64()+2, newL2head.Number.Uint64()) } func (s *ProposerTestSuite) TestUpdateProposingTicker() { diff --git a/packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector.go b/packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector.go deleted file mode 100644 index 64791202645..00000000000 --- a/packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector.go +++ /dev/null @@ -1,269 +0,0 @@ -package selector - -import ( - "context" - "errors" - "fmt" - "math/big" - "math/rand" - "net/url" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/go-resty/resty/v2" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/server" -) - -var ( - httpScheme = "http" - httpsScheme = "https" - errEmptyProverEndpoints = errors.New("empty prover endpoints") - errUnableToFindProver = errors.New("unable to find prover") -) - -// ETHFeeEOASelector is a prover selector implementation which use ETHs as prover fee and -// all provers selected must be EOA accounts. -type ETHFeeEOASelector struct { - protocolConfigs *bindings.TaikoDataConfig - rpc *rpc.Client - proposerAddress common.Address - taikoL1Address common.Address - assignmentHookAddress common.Address - tiersFee []encoding.TierFee - tierFeePriceBump *big.Int - proverEndpoints []*url.URL - maxTierFeePriceBumpIterations uint64 - proposalExpiry time.Duration - requestTimeout time.Duration -} - -// NewETHFeeEOASelector creates a new ETHFeeEOASelector instance. -func NewETHFeeEOASelector( - protocolConfigs *bindings.TaikoDataConfig, - rpc *rpc.Client, - proposerAddress common.Address, - taikoL1Address common.Address, - assignmentHookAddress common.Address, - tiersFee []encoding.TierFee, - tierFeePriceBump *big.Int, - proverEndpoints []*url.URL, - maxTierFeePriceBumpIterations uint64, - proposalExpiry time.Duration, - requestTimeout time.Duration, -) (*ETHFeeEOASelector, error) { - if len(proverEndpoints) == 0 { - return nil, errEmptyProverEndpoints - } - - for _, endpoint := range proverEndpoints { - if endpoint.Scheme != httpScheme && endpoint.Scheme != httpsScheme { - return nil, fmt.Errorf("invalid prover endpoint %s", endpoint) - } - } - - return ÐFeeEOASelector{ - protocolConfigs, - rpc, - proposerAddress, - taikoL1Address, - assignmentHookAddress, - tiersFee, - tierFeePriceBump, - proverEndpoints, - maxTierFeePriceBumpIterations, - proposalExpiry, - requestTimeout, - }, nil -} - -// ProverEndpoints returns all registered prover endpoints. -func (s *ETHFeeEOASelector) ProverEndpoints() []*url.URL { return s.proverEndpoints } - -// AssignProver tries to pick a prover through the registered prover endpoints. -func (s *ETHFeeEOASelector) AssignProver( - ctx context.Context, - tierFees []encoding.TierFee, - txListHash common.Hash, -) (*encoding.ProverAssignment, common.Address, *big.Int, error) { - var ( - expiry = uint64(time.Now().Add(s.proposalExpiry).Unix()) - fees = make([]encoding.TierFee, len(tierFees)) - big100 = new(big.Int).SetUint64(uint64(100)) - maxProverFee = common.Big0 - ) - - // Deep copy the tierFees slice. - for i, fee := range tierFees { - fees[i] = encoding.TierFee{Tier: fee.Tier, Fee: new(big.Int).Set(fee.Fee)} - } - - // Iterate over each configured endpoint, and see if someone wants to accept this block. - // If it is denied, we continue on to the next endpoint. - // If we do not find a prover, we can increase the fee up to a point, or give up. - for i := 0; i < int(s.maxTierFeePriceBumpIterations); i++ { - // Bump tier fee on each failed loop. - cumulativeBumpPercent := new(big.Int).Mul(s.tierFeePriceBump, new(big.Int).SetUint64(uint64(i))) - for idx := range fees { - if i > 0 { - fee := new(big.Int).Mul(fees[idx].Fee, cumulativeBumpPercent) - fees[idx].Fee = fees[idx].Fee.Add(fees[idx].Fee, fee.Div(fee, big100)) - } - if fees[idx].Fee.Cmp(maxProverFee) > 0 { - maxProverFee = fees[idx].Fee - } - } - - // Try to assign a prover from all given endpoints. - for _, endpoint := range s.shuffleProverEndpoints() { - encodedAssignment, proverAddress, err := assignProver( - ctx, - s.protocolConfigs.ChainId, - endpoint, - expiry, - s.proposerAddress, - fees, - s.taikoL1Address, - s.assignmentHookAddress, - txListHash, - s.requestTimeout, - ) - if err != nil { - log.Warn("Failed to assign prover", "endpoint", endpoint, "error", err) - continue - } - - ok, err := rpc.CheckProverBalance( - ctx, - s.rpc, - proverAddress, - s.assignmentHookAddress, - s.protocolConfigs.LivenessBond, - ) - if err != nil { - log.Warn("Failed to check prover balance", "endpoint", endpoint, "error", err) - continue - } - if !ok { - continue - } - - return encodedAssignment, proverAddress, maxProverFee, nil - } - } - - return nil, common.Address{}, nil, errUnableToFindProver -} - -// shuffleProverEndpoints shuffles the current selector's prover endpoints. -func (s *ETHFeeEOASelector) shuffleProverEndpoints() []*url.URL { - // Clone the slice to avoid modifying the original proverEndpoints - shuffledEndpoints := make([]*url.URL, len(s.proverEndpoints)) - copy(shuffledEndpoints, s.proverEndpoints) - - rand.Shuffle(len(shuffledEndpoints), func(i, j int) { - shuffledEndpoints[i], shuffledEndpoints[j] = shuffledEndpoints[j], shuffledEndpoints[i] - }) - return shuffledEndpoints -} - -// assignProver tries to assign a proof generation task to the given prover by HTTP API. -func assignProver( - ctx context.Context, - chainID uint64, - endpoint *url.URL, - expiry uint64, - proposerAddress common.Address, - tierFees []encoding.TierFee, - taikoL1Address common.Address, - assignmentHookAddress common.Address, - txListHash common.Hash, - timeout time.Duration, -) (*encoding.ProverAssignment, common.Address, error) { - log.Info( - "Attempting to assign prover", - "endpoint", endpoint, - "expiry", expiry, - "txListHash", txListHash, - "tierFees", tierFees, - ) - - // Send the HTTP request - var ( - client = resty.New() - reqBody = &server.CreateAssignmentRequestBody{ - Proposer: proposerAddress, - FeeToken: rpc.ZeroAddress, - TierFees: tierFees, - Expiry: expiry, - BlobHash: txListHash, - } - result = server.ProposeBlockResponse{} - ) - requestURL, err := url.JoinPath(endpoint.String(), "/assignment") - if err != nil { - return nil, common.Address{}, err - } - - ctxTimeout, cancel := context.WithTimeout(ctx, timeout) - defer cancel() - - resp, err := client.R(). - SetContext(ctxTimeout). - SetHeader("Content-Type", "application/json"). - SetHeader("Accept", "application/json"). - SetBody(reqBody). - SetResult(&result). - Post(requestURL) - if err != nil { - return nil, common.Address{}, err - } - if !resp.IsSuccess() { - return nil, common.Address{}, fmt.Errorf("unsuccessful response %d", resp.StatusCode()) - } - - // Ensure prover in response is the same as the one recovered - // from the signature - _, err = encoding.EncodeProverAssignmentPayload( - chainID, - taikoL1Address, - assignmentHookAddress, - proposerAddress, - result.Prover, - txListHash, - common.Address{}, - expiry, - result.MaxBlockID, - result.MaxProposedIn, - tierFees, - ) - if err != nil { - return nil, common.Address{}, err - } - - log.Info( - "Prover assigned", - "address", result.Prover, - "endpoint", endpoint, - "tierFees", tierFees, - "maxBlockID", result.MaxBlockID, - "expiry", expiry, - ) - - // Convert signature to one solidity can recover by adding 27 to 65th byte - result.SignedPayload[64] = uint8(uint(result.SignedPayload[64])) + 27 - - return &encoding.ProverAssignment{ - FeeToken: common.Address{}, - TierFees: tierFees, - Expiry: reqBody.Expiry, - MaxBlockId: result.MaxBlockID, - MaxProposedIn: result.MaxProposedIn, - MetaHash: [32]byte{}, - Signature: result.SignedPayload, - }, result.Prover, nil -} diff --git a/packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector_test.go b/packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector_test.go deleted file mode 100644 index c8a776a2275..00000000000 --- a/packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector_test.go +++ /dev/null @@ -1,71 +0,0 @@ -package selector - -import ( - "context" - "net/url" - "os" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/suite" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" -) - -type ProverSelectorTestSuite struct { - testutils.ClientTestSuite - s *ETHFeeEOASelector - proverAddress common.Address -} - -func (s *ProverSelectorTestSuite) SetupTest() { - s.ClientTestSuite.SetupTest() - - l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) - s.Nil(err) - s.proverAddress = crypto.PubkeyToAddress(l1ProverPrivKey.PublicKey) - - l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) - s.Nil(err) - - protocolConfigs, err := s.RPCClient.TaikoL1.GetConfig(nil) - s.Nil(err) - - s.s, err = NewETHFeeEOASelector( - &protocolConfigs, - s.RPCClient, - crypto.PubkeyToAddress(l1ProposerPrivKey.PublicKey), - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - []encoding.TierFee{}, - common.Big2, - []*url.URL{s.ProverEndpoints[0]}, - 32, - 1*time.Minute, - 1*time.Minute, - ) - s.Nil(err) -} - -func (s *ProverSelectorTestSuite) TestProverEndpoints() { - s.T().Skip("Skipping, preconfer changes") - s.Equal(1, len(s.s.ProverEndpoints())) -} - -func (s *ProverSelectorTestSuite) TestProverAssignProver() { - s.T().Skip("Skipping, preconfer changes") - sig, _, fee, err := s.s.AssignProver(context.Background(), []encoding.TierFee{ - {Tier: encoding.TierOptimisticID, Fee: common.Big256}, - {Tier: encoding.TierSgxID, Fee: common.Big256}, - }, testutils.RandomHash()) - s.NotEmpty(sig) - s.Equal(fee.Cmp(common.Big32), 1) - s.Nil(err) -} - -func TestProverSelectorTestSuite(t *testing.T) { - suite.Run(t, new(ProverSelectorTestSuite)) -} diff --git a/packages/taiko-client/proposer/prover_selector/interface.go b/packages/taiko-client/proposer/prover_selector/interface.go deleted file mode 100644 index a0b55801fa7..00000000000 --- a/packages/taiko-client/proposer/prover_selector/interface.go +++ /dev/null @@ -1,20 +0,0 @@ -package selector - -import ( - "context" - "math/big" - "net/url" - - "github.com/ethereum/go-ethereum/common" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" -) - -type ProverSelector interface { - AssignProver( - ctx context.Context, - tierFees []encoding.TierFee, - txListHash common.Hash, - ) (assignment *encoding.ProverAssignment, assignedProver common.Address, fee *big.Int, err error) - ProverEndpoints() []*url.URL -} diff --git a/packages/taiko-client/proposer/transaction_builder/blob.go b/packages/taiko-client/proposer/transaction_builder/blob.go index 18fa977d362..ba40b1285fc 100644 --- a/packages/taiko-client/proposer/transaction_builder/blob.go +++ b/packages/taiko-client/proposer/transaction_builder/blob.go @@ -3,18 +3,17 @@ package builder import ( "context" "crypto/ecdsa" - "crypto/sha256" + "fmt" "math/big" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - selector "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer/prover_selector" ) // BlobTransactionBuilder is responsible for building a TaikoL1.proposeBlock transaction with txList @@ -22,121 +21,107 @@ import ( type BlobTransactionBuilder struct { rpc *rpc.Client proposerPrivateKey *ecdsa.PrivateKey - proverSelector selector.ProverSelector - l1BlockBuilderTip *big.Int taikoL1Address common.Address + proverSetAddress common.Address l2SuggestedFeeRecipient common.Address - assignmentHookAddress common.Address gasLimit uint64 - extraData string + chainConfig *config.ChainConfig + revertProtectionEnabled bool } // NewBlobTransactionBuilder creates a new BlobTransactionBuilder instance based on giving configurations. func NewBlobTransactionBuilder( rpc *rpc.Client, proposerPrivateKey *ecdsa.PrivateKey, - proverSelector selector.ProverSelector, - l1BlockBuilderTip *big.Int, taikoL1Address common.Address, + proverSetAddress common.Address, l2SuggestedFeeRecipient common.Address, - assignmentHookAddress common.Address, gasLimit uint64, - extraData string, + chainConfig *config.ChainConfig, + revertProtectionEnabled bool, ) *BlobTransactionBuilder { return &BlobTransactionBuilder{ rpc, proposerPrivateKey, - proverSelector, - l1BlockBuilderTip, taikoL1Address, + proverSetAddress, l2SuggestedFeeRecipient, - assignmentHookAddress, gasLimit, - extraData, + chainConfig, + revertProtectionEnabled, } } -// Build implements the ProposeBlockTransactionBuilder interface. -func (b *BlobTransactionBuilder) Build( +// BuildOntake implements the ProposeBlockTransactionBuilder interface. +func (b *BlobTransactionBuilder) BuildOntake( ctx context.Context, - tierFees []encoding.TierFee, - includeParentMetaHash bool, - txListBytes []byte, + txListBytesArray [][]byte, ) (*txmgr.TxCandidate, error) { - var blob = ð.Blob{} - if err := blob.FromData(txListBytes); err != nil { + // Check if the current L2 chain is after ontake fork. + state, err := rpc.GetProtocolStateVariables(b.rpc.TaikoL1, &bind.CallOpts{Context: ctx}) + if err != nil { return nil, err } - // Make a sidecar then calculate the blob hash. - sideCar, _, err := txmgr.MakeSidecar([]*eth.Blob{blob}) - if err != nil { - return nil, err + if !b.chainConfig.IsOntake(new(big.Int).SetUint64(state.B.NumBlocks)) { + return nil, fmt.Errorf("ontake transaction builder is not supported before ontake fork") } - // Try to assign a prover. - assignment, assignedProver, maxFee, err := b.proverSelector.AssignProver( - ctx, - tierFees, - sideCar.BlobHashes()[0], + // ABI encode the TaikoL1.proposeBlocksV2 / ProverSet.proposeBlocksV2 parameters. + var ( + to = &b.taikoL1Address + data []byte + blobs []*eth.Blob + encodedParamsArray [][]byte ) - if err != nil { - return nil, err + if b.proverSetAddress != rpc.ZeroAddress { + to = &b.proverSetAddress } - // If the current proposer wants to include the parent meta hash, then fetch it from the protocol. - var parentMetaHash = [32]byte{} - if includeParentMetaHash { - if parentMetaHash, err = GetParentMetaHash(ctx, b.rpc); err != nil { + for i := range txListBytesArray { + var blob = ð.Blob{} + if err := blob.FromData(txListBytesArray[i]); err != nil { return nil, err } - } - - // Initially just use the AssignmentHook default. - hookInputData, err := encoding.EncodeAssignmentHookInput(&encoding.AssignmentHookInput{ - Assignment: assignment, - Tip: b.l1BlockBuilderTip, - }) - if err != nil { - return nil, err - } - commitment, err := blob.ComputeKZGCommitment() - if err != nil { - return nil, err - } - blobHash := kzg4844.CalcBlobHashV1(sha256.New(), &commitment) + blobs = append(blobs, blob) - signature, err := crypto.Sign(blobHash[:], b.proposerPrivateKey) - if err != nil { - return nil, err - } - signature[64] = uint8(uint(signature[64])) + 27 + encodedParams, err := encoding.EncodeBlockParamsOntake(&encoding.BlockParamsV2{ + Coinbase: b.l2SuggestedFeeRecipient, + ParentMetaHash: [32]byte{}, + AnchorBlockId: 0, + Timestamp: 0, + BlobTxListOffset: 0, + BlobTxListLength: uint32(len(txListBytesArray[i])), + BlobIndex: uint8(i), + }) + if err != nil { + return nil, err + } - // ABI encode the TaikoL1.proposeBlock parameters. - encodedParams, err := encoding.EncodeBlockParams(&encoding.BlockParams{ - AssignedProver: assignedProver, - ExtraData: rpc.StringToBytes32(b.extraData), - Coinbase: b.l2SuggestedFeeRecipient, - ParentMetaHash: parentMetaHash, - HookCalls: []encoding.HookCall{{Hook: b.assignmentHookAddress, Data: hookInputData}}, - Signature: signature, - }) - if err != nil { - return nil, err + encodedParamsArray = append(encodedParamsArray, encodedParams) } - - // Send the transaction to the L1 node. - data, err := encoding.TaikoL1ABI.Pack("proposeBlock", encodedParams, []byte{}) - if err != nil { - return nil, err + txListArray := make([][]byte, len(encodedParamsArray)) + if b.proverSetAddress != rpc.ZeroAddress { + if b.revertProtectionEnabled { + data, err = encoding.ProverSetABI.Pack("proposeBlocksV2Conditionally", encodedParamsArray, txListArray) + } else { + data, err = encoding.ProverSetABI.Pack("proposeBlocksV2", encodedParamsArray, txListArray) + } + if err != nil { + return nil, err + } + } else { + data, err = encoding.TaikoL1ABI.Pack("proposeBlocksV2", encodedParamsArray, txListArray) + if err != nil { + return nil, err + } } return &txmgr.TxCandidate{ TxData: data, - Blobs: []*eth.Blob{blob}, - To: &b.taikoL1Address, + Blobs: blobs, + To: to, GasLimit: b.gasLimit, - Value: maxFee, }, nil } diff --git a/packages/taiko-client/proposer/transaction_builder/calldata.go b/packages/taiko-client/proposer/transaction_builder/calldata.go index 120d227e101..e7355eeca6b 100644 --- a/packages/taiko-client/proposer/transaction_builder/calldata.go +++ b/packages/taiko-client/proposer/transaction_builder/calldata.go @@ -3,15 +3,16 @@ package builder import ( "context" "crypto/ecdsa" + "fmt" "math/big" "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - selector "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer/prover_selector" ) // CalldataTransactionBuilder is responsible for building a TaikoL1.proposeBlock transaction with txList @@ -19,104 +20,93 @@ import ( type CalldataTransactionBuilder struct { rpc *rpc.Client proposerPrivateKey *ecdsa.PrivateKey - proverSelector selector.ProverSelector - l1BlockBuilderTip *big.Int l2SuggestedFeeRecipient common.Address taikoL1Address common.Address - assignmentHookAddress common.Address + proverSetAddress common.Address gasLimit uint64 - extraData string + chainConfig *config.ChainConfig + revertProtectionEnabled bool } // NewCalldataTransactionBuilder creates a new CalldataTransactionBuilder instance based on giving configurations. func NewCalldataTransactionBuilder( rpc *rpc.Client, proposerPrivateKey *ecdsa.PrivateKey, - proverSelector selector.ProverSelector, - l1BlockBuilderTip *big.Int, l2SuggestedFeeRecipient common.Address, taikoL1Address common.Address, - assignmentHookAddress common.Address, + proverSetAddress common.Address, gasLimit uint64, - extraData string, + chainConfig *config.ChainConfig, + revertProtectionEnabled bool, ) *CalldataTransactionBuilder { return &CalldataTransactionBuilder{ rpc, proposerPrivateKey, - proverSelector, - l1BlockBuilderTip, l2SuggestedFeeRecipient, taikoL1Address, - assignmentHookAddress, + proverSetAddress, gasLimit, - extraData, + chainConfig, + revertProtectionEnabled, } } -// Build implements the ProposeBlockTransactionBuilder interface. -func (b *CalldataTransactionBuilder) Build( +// BuildOntake implements the ProposeBlockTransactionBuilder interface. +func (b *CalldataTransactionBuilder) BuildOntake( ctx context.Context, - tierFees []encoding.TierFee, - includeParentMetaHash bool, - txListBytes []byte, + txListBytesArray [][]byte, ) (*txmgr.TxCandidate, error) { - // Try to assign a prover. - assignment, assignedProver, maxFee, err := b.proverSelector.AssignProver( - ctx, - tierFees, - crypto.Keccak256Hash(txListBytes), - ) + // Check if the current L2 chain is after ontake fork. + state, err := rpc.GetProtocolStateVariables(b.rpc.TaikoL1, &bind.CallOpts{Context: ctx}) if err != nil { return nil, err } - // If the current proposer wants to include the parent meta hash, then fetch it from the protocol. - var parentMetaHash = [32]byte{} - if includeParentMetaHash { - if parentMetaHash, err = GetParentMetaHash(ctx, b.rpc); err != nil { - return nil, err - } + if !b.chainConfig.IsOntake(new(big.Int).SetUint64(state.B.NumBlocks)) { + return nil, fmt.Errorf("ontake transaction builder is not supported before ontake fork") } - // Initially just use the AssignmentHook default. - hookInputData, err := encoding.EncodeAssignmentHookInput(&encoding.AssignmentHookInput{ - Assignment: assignment, - Tip: b.l1BlockBuilderTip, - }) - if err != nil { - return nil, err - } - - signature, err := crypto.Sign(crypto.Keccak256(txListBytes), b.proposerPrivateKey) - if err != nil { - return nil, err - } - signature[64] = uint8(uint(signature[64])) + 27 + // ABI encode the TaikoL1.proposeBlocksV2 / ProverSet.proposeBlocksV2 parameters. + var ( + to = &b.taikoL1Address + data []byte + encodedParamsArray [][]byte + ) - // ABI encode the TaikoL1.proposeBlock parameters. - encodedParams, err := encoding.EncodeBlockParams(&encoding.BlockParams{ - AssignedProver: assignedProver, - Coinbase: b.l2SuggestedFeeRecipient, - ExtraData: rpc.StringToBytes32(b.extraData), - ParentMetaHash: parentMetaHash, - HookCalls: []encoding.HookCall{{Hook: b.assignmentHookAddress, Data: hookInputData}}, - Signature: signature, - }) - if err != nil { - return nil, err + for range txListBytesArray { + encodedParams, err := encoding.EncodeBlockParamsOntake(&encoding.BlockParamsV2{ + Coinbase: b.l2SuggestedFeeRecipient, + ParentMetaHash: [32]byte{}, + AnchorBlockId: 0, + Timestamp: 0, + }) + if err != nil { + return nil, err + } + encodedParamsArray = append(encodedParamsArray, encodedParams) } - // Send the transaction to the L1 node. - data, err := encoding.TaikoL1ABI.Pack("proposeBlock", encodedParams, txListBytes) - if err != nil { - return nil, err + if b.proverSetAddress != rpc.ZeroAddress { + to = &b.proverSetAddress + if b.revertProtectionEnabled { + data, err = encoding.ProverSetABI.Pack("proposeBlocksV2Conditionally", encodedParamsArray, txListBytesArray) + } else { + data, err = encoding.ProverSetABI.Pack("proposeBlocksV2", encodedParamsArray, txListBytesArray) + } + if err != nil { + return nil, err + } + } else { + data, err = encoding.TaikoL1ABI.Pack("proposeBlocksV2", encodedParamsArray, txListBytesArray) + if err != nil { + return nil, err + } } return &txmgr.TxCandidate{ TxData: data, Blobs: nil, - To: &b.taikoL1Address, + To: to, GasLimit: b.gasLimit, - Value: maxFee, }, nil } diff --git a/packages/taiko-client/proposer/transaction_builder/calldata_test.go b/packages/taiko-client/proposer/transaction_builder/calldata_test.go index f5f4a27a161..a768b7be558 100644 --- a/packages/taiko-client/proposer/transaction_builder/calldata_test.go +++ b/packages/taiko-client/proposer/transaction_builder/calldata_test.go @@ -2,19 +2,62 @@ package builder import ( "context" + "os" + "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/suite" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) +type TransactionBuilderTestSuite struct { + testutils.ClientTestSuite + calldataTxBuilder *CalldataTransactionBuilder + blobTxBuiler *BlobTransactionBuilder +} + +func (s *TransactionBuilderTestSuite) SetupTest() { + s.ClientTestSuite.SetupTest() + + l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) + s.Nil(err) + + protocolConfigs, err := rpc.GetProtocolConfigs(s.RPCClient.TaikoL1, nil) + s.Nil(err) + + chainConfig := config.NewChainConfig(&protocolConfigs) + + s.calldataTxBuilder = NewCalldataTransactionBuilder( + s.RPCClient, + l1ProposerPrivKey, + common.HexToAddress(os.Getenv("TAIKO_L2")), + common.HexToAddress(os.Getenv("TAIKO_L1")), + common.Address{}, + 0, + chainConfig, + false, + ) + s.blobTxBuiler = NewBlobTransactionBuilder( + s.RPCClient, + l1ProposerPrivKey, + common.HexToAddress(os.Getenv("TAIKO_L1")), + common.Address{}, + common.HexToAddress(os.Getenv("TAIKO_L2")), + 10_000_000, + chainConfig, + false, + ) +} + func (s *TransactionBuilderTestSuite) TestBuildCalldata() { - s.T().Skip("Skipping, preconfer changes") - tx, err := s.calldataTxBuilder.Build(context.Background(), []encoding.TierFee{ - {Tier: encoding.TierOptimisticID, Fee: common.Big256}, - {Tier: encoding.TierSgxID, Fee: common.Big256}, - {Tier: encoding.TierSgxAndZkVMID, Fee: common.Big257}, - }, false, []byte{1}) + _, err := s.calldataTxBuilder.BuildOntake(context.Background(), [][]byte{{1}, {2}}) s.Nil(err) - s.Nil(tx.Blobs) +} + +func TestTransactionBuilderTestSuite(t *testing.T) { + suite.Run(t, new(TransactionBuilderTestSuite)) } diff --git a/packages/taiko-client/proposer/transaction_builder/common.go b/packages/taiko-client/proposer/transaction_builder/common.go deleted file mode 100644 index f3e198bd58c..00000000000 --- a/packages/taiko-client/proposer/transaction_builder/common.go +++ /dev/null @@ -1,26 +0,0 @@ -package builder - -import ( - "context" - "math/big" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" -) - -// GetParentMetaHash returns the meta hash of the parent block of the latest proposed block in protocol. -func GetParentMetaHash(ctx context.Context, rpc *rpc.Client) (common.Hash, error) { - state, err := rpc.TaikoL1.State(&bind.CallOpts{Context: ctx}) - if err != nil { - return common.Hash{}, err - } - - parent, err := rpc.GetL2BlockInfo(ctx, new(big.Int).SetUint64(state.SlotB.NumBlocks-1)) - if err != nil { - return common.Hash{}, err - } - - return parent.MetaHash, nil -} diff --git a/packages/taiko-client/proposer/transaction_builder/common_test.go b/packages/taiko-client/proposer/transaction_builder/common_test.go deleted file mode 100644 index 7155bd3ef8c..00000000000 --- a/packages/taiko-client/proposer/transaction_builder/common_test.go +++ /dev/null @@ -1,80 +0,0 @@ -package builder - -import ( - "context" - "net/url" - "os" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/suite" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - selector "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer/prover_selector" -) - -type TransactionBuilderTestSuite struct { - testutils.ClientTestSuite - calldataTxBuilder *CalldataTransactionBuilder - blobTxBuiler *BlobTransactionBuilder -} - -func (s *TransactionBuilderTestSuite) SetupTest() { - s.ClientTestSuite.SetupTest() - - protocolConfigs, err := s.RPCClient.TaikoL1.GetConfig(nil) - s.Nil(err) - - l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) - s.Nil(err) - - proverSelector, err := selector.NewETHFeeEOASelector( - &protocolConfigs, - s.RPCClient, - crypto.PubkeyToAddress(l1ProposerPrivKey.PublicKey), - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - []encoding.TierFee{}, - common.Big2, - []*url.URL{s.ProverEndpoints[0]}, - 32, - 1*time.Minute, - 1*time.Minute, - ) - s.Nil(err) - s.calldataTxBuilder = NewCalldataTransactionBuilder( - s.RPCClient, - l1ProposerPrivKey, - proverSelector, - common.Big0, - common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - 0, - "test", - ) - s.blobTxBuiler = NewBlobTransactionBuilder( - s.RPCClient, - l1ProposerPrivKey, - proverSelector, - common.Big0, - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - 10_000_000, - "test", - ) -} - -func (s *TransactionBuilderTestSuite) TestGetParentMetaHash() { - metahash, err := GetParentMetaHash(context.Background(), s.RPCClient) - s.Nil(err) - s.NotEmpty(metahash) -} - -func TestTransactionBuilderTestSuite(t *testing.T) { - suite.Run(t, new(TransactionBuilderTestSuite)) -} diff --git a/packages/taiko-client/proposer/transaction_builder/fallback.go b/packages/taiko-client/proposer/transaction_builder/fallback.go new file mode 100644 index 00000000000..07842401733 --- /dev/null +++ b/packages/taiko-client/proposer/transaction_builder/fallback.go @@ -0,0 +1,206 @@ +package builder + +import ( + "context" + "crypto/ecdsa" + "fmt" + "math/big" + + "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "golang.org/x/sync/errgroup" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" +) + +// TxBuilderWithFallback builds type-2 or type-3 transactions based on the +// the realtime onchain cost, if the fallback feature is enabled. +type TxBuilderWithFallback struct { + rpc *rpc.Client + blobTransactionBuilder *BlobTransactionBuilder + calldataTransactionBuilder *CalldataTransactionBuilder + txmgrSelector *utils.TxMgrSelector + fallback bool +} + +// NewBuilderWithFallback creates a new TxBuilderWithFallback instance. +func NewBuilderWithFallback( + rpc *rpc.Client, + proposerPrivateKey *ecdsa.PrivateKey, + l2SuggestedFeeRecipient common.Address, + taikoL1Address common.Address, + proverSetAddress common.Address, + gasLimit uint64, + chainConfig *config.ChainConfig, + txmgrSelector *utils.TxMgrSelector, + revertProtectionEnabled bool, + blobAllowed bool, + fallback bool, +) *TxBuilderWithFallback { + builder := &TxBuilderWithFallback{ + rpc: rpc, + fallback: fallback, + txmgrSelector: txmgrSelector, + } + + if blobAllowed { + builder.blobTransactionBuilder = NewBlobTransactionBuilder( + rpc, + proposerPrivateKey, + taikoL1Address, + proverSetAddress, + l2SuggestedFeeRecipient, + gasLimit, + chainConfig, + revertProtectionEnabled, + ) + } + + builder.calldataTransactionBuilder = NewCalldataTransactionBuilder( + rpc, + proposerPrivateKey, + l2SuggestedFeeRecipient, + taikoL1Address, + proverSetAddress, + gasLimit, + chainConfig, + revertProtectionEnabled, + ) + + return builder +} + +// BuildOntake builds a type-2 or type-3 transaction based on the +// the realtime onchain cost, if the fallback feature is enabled. +func (b *TxBuilderWithFallback) BuildOntake( + ctx context.Context, + txListBytesArray [][]byte, +) (*txmgr.TxCandidate, error) { + // If calldata is the only option, just use it. + if b.blobTransactionBuilder == nil { + return b.calldataTransactionBuilder.BuildOntake(ctx, txListBytesArray) + } + // If blob is enabled, and fallback is not enabled, just build a blob transaction. + if !b.fallback || len(txListBytesArray) > 1 { + return b.blobTransactionBuilder.BuildOntake(ctx, txListBytesArray) + } + + // Otherwise, compare the cost, and choose the cheaper option. + var ( + g = new(errgroup.Group) + txWithCalldata *txmgr.TxCandidate + txWithBlob *txmgr.TxCandidate + costCalldata *big.Int + costBlob *big.Int + err error + ) + + g.Go(func() error { + if txWithCalldata, err = b.calldataTransactionBuilder.BuildOntake(ctx, txListBytesArray); err != nil { + return fmt.Errorf("failed to build type-2 transaction: %w", err) + } + if costCalldata, err = b.estimateCandidateCost(ctx, txWithCalldata); err != nil { + return fmt.Errorf("failed to estimate type-2 transaction cost: %w", err) + } + return nil + }) + g.Go(func() error { + if txWithBlob, err = b.blobTransactionBuilder.BuildOntake(ctx, txListBytesArray); err != nil { + return fmt.Errorf("failed to build type-3 transaction: %w", err) + } + if costBlob, err = b.estimateCandidateCost(ctx, txWithBlob); err != nil { + return fmt.Errorf("failed to estimate type-3 transaction cost: %w", err) + } + return nil + }) + + if err = g.Wait(); err != nil { + log.Error("Failed to estimate transactions cost, will build a type-3 transaction", "error", err) + metrics.ProposerCostEstimationError.Inc() + // If there is an error, just build a blob transaction. + return b.blobTransactionBuilder.BuildOntake(ctx, txListBytesArray) + } + + var ( + costCalldataFloat64 float64 + costBlobFloat64 float64 + ) + costCalldataFloat64, _ = utils.WeiToEther(costCalldata).Float64() + costBlobFloat64, _ = utils.WeiToEther(costBlob).Float64() + + metrics.ProposerEstimatedCostCalldata.Set(costCalldataFloat64) + metrics.ProposerEstimatedCostBlob.Set(costBlobFloat64) + + if costCalldata.Cmp(costBlob) < 0 { + log.Info("Building a type-2 transaction", "costCalldata", costCalldataFloat64, "costBlob", costBlobFloat64) + metrics.ProposerProposeByCalldata.Inc() + return txWithCalldata, nil + } + + log.Info("Building a type-3 transaction", "costCalldata", costCalldataFloat64, "costBlob", costBlobFloat64) + metrics.ProposerProposeByBlob.Inc() + return txWithBlob, nil +} + +// estimateCandidateCost estimates the realtime onchain cost of the given transaction. +func (b *TxBuilderWithFallback) estimateCandidateCost( + ctx context.Context, + candidate *txmgr.TxCandidate, +) (*big.Int, error) { + txMgr, _ := b.txmgrSelector.Select() + gasTipCap, baseFee, blobBaseFee, err := txMgr.SuggestGasPriceCaps(ctx) + if err != nil { + return nil, err + } + log.Debug("Suggested gas price", "gasTipCap", gasTipCap, "baseFee", baseFee, "blobBaseFee", blobBaseFee) + + gasFeeCap := new(big.Int).Add(baseFee, gasTipCap) + msg := ethereum.CallMsg{ + From: txMgr.From(), + To: candidate.To, + Gas: candidate.GasLimit, + Value: candidate.Value, + Data: candidate.TxData, + } + if len(candidate.Blobs) != 0 { + var blobHashes []common.Hash + if _, blobHashes, err = txmgr.MakeSidecar(candidate.Blobs); err != nil { + return nil, fmt.Errorf("failed to make sidecar: %w", err) + } + msg.BlobHashes = blobHashes + } + + gasUsed, err := b.rpc.L1.EstimateGas(ctx, msg) + if err != nil { + return nil, fmt.Errorf("failed to estimate gas used: %w", err) + } + + feeWithoutBlob := new(big.Int).Mul(gasFeeCap, new(big.Int).SetUint64(gasUsed)) + + // If its a type-2 transaction, we won't calculate blob fee. + if len(candidate.Blobs) == 0 { + return feeWithoutBlob, nil + } + + // Otherwise, we add blob fee to the cost. + return new(big.Int).Add( + feeWithoutBlob, + new(big.Int).Mul( + new(big.Int).SetUint64( + uint64(len(candidate.Blobs)*params.BlobTxBlobGasPerBlob), + ), + blobBaseFee, + ), + ), nil +} + +// TxBuilderWithFallback returns whether the blob transactions is enabled. +func (b *TxBuilderWithFallback) BlobAllow() bool { + return b.blobTransactionBuilder != nil +} diff --git a/packages/taiko-client/proposer/transaction_builder/fallback_test.go b/packages/taiko-client/proposer/transaction_builder/fallback_test.go new file mode 100644 index 00000000000..f45bc715527 --- /dev/null +++ b/packages/taiko-client/proposer/transaction_builder/fallback_test.go @@ -0,0 +1,139 @@ +package builder + +import ( + "bytes" + "context" + "math/big" + "os" + "time" + + "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" +) + +func (s *TransactionBuilderTestSuite) TestBuildCalldataOnly() { + builder := s.newTestBuilderWithFallback(false, false, nil) + candidate, err := builder.BuildOntake(context.Background(), [][]byte{{1}, {2}}) + s.Nil(err) + s.Zero(len(candidate.Blobs)) +} + +func (s *TransactionBuilderTestSuite) TestBuildCalldataWithBlobAllowed() { + builder := s.newTestBuilderWithFallback(true, false, nil) + candidate, err := builder.BuildOntake(context.Background(), [][]byte{{1}, {2}}) + s.Nil(err) + s.NotZero(len(candidate.Blobs)) +} + +func (s *TransactionBuilderTestSuite) TestBlobAllowed() { + builder := s.newTestBuilderWithFallback(false, false, nil) + s.False(builder.BlobAllow()) + builder = s.newTestBuilderWithFallback(true, false, nil) + s.True(builder.BlobAllow()) +} + +func (s *TransactionBuilderTestSuite) TestFallback() { + // By default, blob fee should be cheaper. + builder := s.newTestBuilderWithFallback(true, true, nil) + candidate, err := builder.BuildOntake(context.Background(), [][]byte{ + bytes.Repeat([]byte{1}, int(rpc.BlockMaxTxListBytes)), + }) + s.Nil(err) + s.NotZero(len(candidate.Blobs)) + + // Make blob base fee 1024 Gwei + builder = s.newTestBuilderWithFallback(true, true, func( + ctx context.Context, + backend txmgr.ETHBackend, + ) (*big.Int, *big.Int, *big.Int, error) { + return common.Big1, + common.Big1, + new(big.Int).SetUint64(1024 * params.GWei), + nil + }) + + candidate, err = builder.BuildOntake(context.Background(), [][]byte{ + bytes.Repeat([]byte{1}, int(rpc.BlockMaxTxListBytes)), + }) + s.Nil(err) + s.Zero(len(candidate.Blobs)) + + // Make block base fee 1024 Gwei too + builder = s.newTestBuilderWithFallback(true, true, func( + ctx context.Context, + backend txmgr.ETHBackend, + ) (*big.Int, *big.Int, *big.Int, error) { + return new(big.Int).SetUint64(1024 * params.GWei), + new(big.Int).SetUint64(1024 * params.GWei), + new(big.Int).SetUint64(1024 * params.GWei), + nil + }) + + candidate, err = builder.BuildOntake(context.Background(), [][]byte{ + bytes.Repeat([]byte{1}, int(rpc.BlockMaxTxListBytes)), + }) + s.Nil(err) + s.NotZero(len(candidate.Blobs)) +} + +func (s *TransactionBuilderTestSuite) newTestBuilderWithFallback( + blobAllowed, + fallback bool, + gasPriceEstimatorFn txmgr.GasPriceEstimatorFn, +) *TxBuilderWithFallback { + l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) + s.Nil(err) + + protocolConfigs, err := rpc.GetProtocolConfigs(s.RPCClient.TaikoL1, nil) + s.Nil(err) + + chainConfig := config.NewChainConfig(&protocolConfigs) + + cfg, err := txmgr.NewConfig(txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, log.Root()) + s.Nil(err) + + if gasPriceEstimatorFn != nil { + cfg.GasPriceEstimatorFn = gasPriceEstimatorFn + } + + txMgr, err := txmgr.NewSimpleTxManagerFromConfig("tx_builder_test", log.Root(), &metrics.TxMgrMetrics, cfg) + s.Nil(err) + + txmgrSelector := utils.NewTxMgrSelector(txMgr, nil, nil) + + return NewBuilderWithFallback( + s.RPCClient, + l1ProposerPrivKey, + common.HexToAddress(os.Getenv("TAIKO_L2")), + common.HexToAddress(os.Getenv("TAIKO_L1")), + common.Address{}, + 10_000_000, + chainConfig, + txmgrSelector, + true, + blobAllowed, + fallback, + ) +} diff --git a/packages/taiko-client/proposer/transaction_builder/interface.go b/packages/taiko-client/proposer/transaction_builder/interface.go index c1cac45aa6f..8a103b05343 100644 --- a/packages/taiko-client/proposer/transaction_builder/interface.go +++ b/packages/taiko-client/proposer/transaction_builder/interface.go @@ -4,16 +4,9 @@ import ( "context" "github.com/ethereum-optimism/optimism/op-service/txmgr" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" ) // ProposeBlockTransactionBuilder is an interface for building a TaikoL1.proposeBlock transaction. type ProposeBlockTransactionBuilder interface { - Build( - ctx context.Context, - tierFees []encoding.TierFee, - includeParentMetaHash bool, - txListBytes []byte, - ) (*txmgr.TxCandidate, error) + BuildOntake(ctx context.Context, txListBytesArray [][]byte) (*txmgr.TxCandidate, error) } diff --git a/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator.go b/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator.go index d30ee294464..3d657a5665f 100644 --- a/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator.go +++ b/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator.go @@ -49,10 +49,10 @@ func (v *AnchorTxValidator) ValidateAnchorTx(tx *types.Transaction) error { if err != nil { return fmt.Errorf("failed to get TaikoL2.anchor transaction method: %w", err) } - if method.Name != "anchor" { + if method.Name != "anchor" && method.Name != "anchorV2" { return fmt.Errorf( "invalid TaikoL2.anchor transaction selector, expect: %s, actual: %s", - "anchor", + "anchor / anchorV2", method.Name, ) } diff --git a/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator_test.go b/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator_test.go index a98224ade1c..6154697ef0a 100644 --- a/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator_test.go +++ b/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator_test.go @@ -21,7 +21,7 @@ type AnchorTxValidatorTestSuite struct { func (s *AnchorTxValidatorTestSuite) SetupTest() { s.ClientTestSuite.SetupTest() - validator, err := New(common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), s.RPCClient.L2.ChainID, s.RPCClient) + validator, err := New(common.HexToAddress(os.Getenv("TAIKO_L2")), s.RPCClient.L2.ChainID, s.RPCClient) s.Nil(err) s.v = validator } diff --git a/packages/taiko-client/prover/config.go b/packages/taiko-client/prover/config.go index 3e8a4662fd0..0a63ea6e7e2 100644 --- a/packages/taiko-client/prover/config.go +++ b/packages/taiko-client/prover/config.go @@ -14,21 +14,19 @@ import ( "github.com/urfave/cli/v2" "github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" pkgFlags "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/flags" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) // Config contains the configurations to initialize a Taiko prover. type Config struct { L1WsEndpoint string - L1HttpEndpoint string L2WsEndpoint string L2HttpEndpoint string TaikoL1Address common.Address TaikoL2Address common.Address TaikoTokenAddress common.Address - AssignmentHookAddress common.Address ProverSetAddress common.Address L1ProverPrivKey *ecdsa.PrivateKey StartingBlockID *big.Int @@ -45,23 +43,22 @@ type Config struct { RPCTimeout time.Duration ProveBlockGasLimit uint64 HTTPServerPort uint64 - Capacity uint64 - MinOptimisticTierFee *big.Int - MinSgxTierFee *big.Int - MinSgxAndZkVMTierFee *big.Int MinEthBalance *big.Int - MinTaikoTokenBalance *big.Int MaxExpiry time.Duration - MaxProposedIn uint64 - MaxBlockSlippage uint64 Allowance *big.Int GuardianProverHealthCheckServerEndpoint *url.URL RaikoHostEndpoint string + RaikoZKVMHostEndpoint string RaikoJWT string + RaikoRequestTimeout time.Duration L1NodeVersion string L2NodeVersion string BlockConfirmations uint64 TxmgrConfigs *txmgr.CLIConfig + PrivateTxmgrConfigs *txmgr.CLIConfig + SGXProofBufferSize uint64 + ZKVMProofBufferSize uint64 + ForceBatchProvingInterval time.Duration } // NewConfigFromCliContext creates a new config instance from command line flags. @@ -116,31 +113,6 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { } } - minOptimisticTierFee, err := utils.GWeiToWei(c.Float64(flags.MinOptimisticTierFee.Name)) - if err != nil { - return nil, err - } - - minSgxTierFee, err := utils.GWeiToWei(c.Float64(flags.MinSgxTierFee.Name)) - if err != nil { - return nil, err - } - - minSgxAndZkVMTierFee, err := utils.GWeiToWei(c.Float64(flags.MinSgxAndZkVMTierFee.Name)) - if err != nil { - return nil, err - } - - minEthBalance, err := utils.EtherToWei(c.Float64(flags.MinEthBalance.Name)) - if err != nil { - return nil, err - } - - minTaikoTokenBalance, err := utils.EtherToWei(c.Float64(flags.MinTaikoTokenBalance.Name)) - if err != nil { - return nil, err - } - if !c.IsSet(flags.GuardianProverMajority.Name) && !c.IsSet(flags.RaikoHostEndpoint.Name) { return nil, errors.New("empty raiko host endpoint") } @@ -154,17 +126,17 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { return &Config{ L1WsEndpoint: c.String(flags.L1WSEndpoint.Name), - L1HttpEndpoint: c.String(flags.L1HTTPEndpoint.Name), L2WsEndpoint: c.String(flags.L2WSEndpoint.Name), L2HttpEndpoint: c.String(flags.L2HTTPEndpoint.Name), TaikoL1Address: common.HexToAddress(c.String(flags.TaikoL1Address.Name)), TaikoL2Address: common.HexToAddress(c.String(flags.TaikoL2Address.Name)), TaikoTokenAddress: common.HexToAddress(c.String(flags.TaikoTokenAddress.Name)), - AssignmentHookAddress: common.HexToAddress(c.String(flags.AssignmentHookAddress.Name)), ProverSetAddress: common.HexToAddress(c.String(flags.ProverSetAddress.Name)), L1ProverPrivKey: l1ProverPrivKey, RaikoHostEndpoint: c.String(flags.RaikoHostEndpoint.Name), + RaikoZKVMHostEndpoint: c.String(flags.RaikoZKVMHostEndpoint.Name), RaikoJWT: common.Bytes2Hex(jwtSecret), + RaikoRequestTimeout: c.Duration(flags.RaikoRequestTimeout.Name), StartingBlockID: startingBlockID, Dummy: c.Bool(flags.Dummy.Name), GuardianProverMinorityAddress: common.HexToAddress(c.String(flags.GuardianProverMinority.Name)), @@ -179,24 +151,24 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { EnableLivenessBondProof: c.Bool(flags.EnableLivenessBondProof.Name), RPCTimeout: c.Duration(flags.RPCTimeout.Name), ProveBlockGasLimit: c.Uint64(flags.TxGasLimit.Name), - Capacity: c.Uint64(flags.ProverCapacity.Name), HTTPServerPort: c.Uint64(flags.ProverHTTPServerPort.Name), - MinOptimisticTierFee: minOptimisticTierFee, - MinSgxTierFee: minSgxTierFee, - MinSgxAndZkVMTierFee: minSgxAndZkVMTierFee, - MinEthBalance: minEthBalance, - MinTaikoTokenBalance: minTaikoTokenBalance, MaxExpiry: c.Duration(flags.MaxExpiry.Name), - MaxBlockSlippage: c.Uint64(flags.MaxAcceptableBlockSlippage.Name), - MaxProposedIn: c.Uint64(flags.MaxProposedIn.Name), Allowance: allowance, L1NodeVersion: c.String(flags.L1NodeVersion.Name), L2NodeVersion: c.String(flags.L2NodeVersion.Name), BlockConfirmations: c.Uint64(flags.BlockConfirmations.Name), TxmgrConfigs: pkgFlags.InitTxmgrConfigsFromCli( - c.String(flags.L1HTTPEndpoint.Name), + c.String(flags.L1WSEndpoint.Name), + l1ProverPrivKey, + c, + ), + PrivateTxmgrConfigs: pkgFlags.InitTxmgrConfigsFromCli( + c.String(flags.L1PrivateEndpoint.Name), l1ProverPrivKey, c, ), + SGXProofBufferSize: c.Uint64(flags.SGXBatchSize.Name), + ZKVMProofBufferSize: c.Uint64(flags.ZKVMBatchSize.Name), + ForceBatchProvingInterval: c.Duration(flags.ForceBatchProvingInterval.Name), }, nil } diff --git a/packages/taiko-client/prover/config_test.go b/packages/taiko-client/prover/config_test.go index fb3ae6c5e15..ee1e87e649f 100644 --- a/packages/taiko-client/prover/config_test.go +++ b/packages/taiko-client/prover/config_test.go @@ -10,21 +10,19 @@ import ( "github.com/urfave/cli/v2" "github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) var ( - l1WsEndpoint = os.Getenv("L1_NODE_WS_ENDPOINT") - l1HttpEndpoint = os.Getenv("L1_NODE_HTTP_ENDPOINT") - l2WsEndpoint = os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT") - l2HttpEndpoint = os.Getenv("L2_EXECUTION_ENGINE_HTTP_ENDPOINT") + l1WsEndpoint = os.Getenv("L1_WS") + l2WsEndpoint = os.Getenv("L2_WS") + l2HttpEndpoint = os.Getenv("L2_HTTP") l1NodeVersion = "1.0.0" l2NodeVersion = "0.1.0" - taikoL1 = os.Getenv("TAIKO_L1_ADDRESS") - taikoL2 = os.Getenv("TAIKO_L2_ADDRESS") + taikoL1 = os.Getenv("TAIKO_L1") + taikoL2 = os.Getenv("TAIKO_L2") allowance = 10.0 rpcTimeout = 5 * time.Second - minTierFee = 1024.0 ) func (s *ProverTestSuite) TestNewConfigFromCliContextGuardianProver() { @@ -33,7 +31,6 @@ func (s *ProverTestSuite) TestNewConfigFromCliContextGuardianProver() { c, err := NewConfigFromCliContext(ctx) s.Nil(err) s.Equal(l1WsEndpoint, c.L1WsEndpoint) - s.Equal(l1HttpEndpoint, c.L1HttpEndpoint) s.Equal(l2WsEndpoint, c.L2WsEndpoint) s.Equal(l2HttpEndpoint, c.L2HttpEndpoint) s.Equal(taikoL1, c.TaikoL1Address.String()) @@ -47,17 +44,10 @@ func (s *ProverTestSuite) TestNewConfigFromCliContextGuardianProver() { s.True(c.ProveUnassignedBlocks) s.True(c.ContesterMode) s.Equal(rpcTimeout, c.RPCTimeout) - s.Equal(uint64(8), c.Capacity) - tierFeeGWei, err := utils.GWeiToWei(minTierFee) - s.Nil(err) - s.Equal(tierFeeGWei.Uint64(), c.MinOptimisticTierFee.Uint64()) - s.Equal(tierFeeGWei.Uint64(), c.MinSgxTierFee.Uint64()) s.Equal(c.L1NodeVersion, l1NodeVersion) s.Equal(c.L2NodeVersion, l2NodeVersion) s.Nil(new(Prover).InitFromCli(context.Background(), ctx)) s.True(c.ProveUnassignedBlocks) - s.Equal(uint64(100), c.MaxProposedIn) - s.Equal(os.Getenv("ASSIGNMENT_HOOK_ADDRESS"), c.AssignmentHookAddress.String()) allowanceWithDecimal, err := utils.EtherToWei(allowance) s.Nil(err) s.Equal(allowanceWithDecimal.Uint64(), c.Allowance.Uint64()) @@ -68,7 +58,6 @@ func (s *ProverTestSuite) TestNewConfigFromCliContextGuardianProver() { s.Nil(app.Run([]string{ "TestNewConfigFromCliContextGuardianProver", "--" + flags.L1WSEndpoint.Name, l1WsEndpoint, - "--" + flags.L1HTTPEndpoint.Name, l1HttpEndpoint, "--" + flags.L2WSEndpoint.Name, l2WsEndpoint, "--" + flags.L2HTTPEndpoint.Name, l2HttpEndpoint, "--" + flags.TaikoL1Address.Name, taikoL1, @@ -78,15 +67,10 @@ func (s *ProverTestSuite) TestNewConfigFromCliContextGuardianProver() { "--" + flags.RPCTimeout.Name, "5s", "--" + flags.TxGasLimit.Name, "100000", "--" + flags.Dummy.Name, - "--" + flags.MinOptimisticTierFee.Name, fmt.Sprint(minTierFee), - "--" + flags.MinSgxTierFee.Name, fmt.Sprint(minTierFee), - "--" + flags.ProverCapacity.Name, "8", - "--" + flags.GuardianProverMajority.Name, os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS"), - "--" + flags.GuardianProverMinority.Name, os.Getenv("GUARDIAN_PROVER_MINORITY_ADDRESS"), - "--" + flags.AssignmentHookAddress.Name, os.Getenv("ASSIGNMENT_HOOK_ADDRESS"), + "--" + flags.GuardianProverMajority.Name, os.Getenv("GUARDIAN_PROVER_CONTRACT"), + "--" + flags.GuardianProverMinority.Name, os.Getenv("GUARDIAN_PROVER_MINORITY"), "--" + flags.Graffiti.Name, "", "--" + flags.ProveUnassignedBlocks.Name, - "--" + flags.MaxProposedIn.Name, "100", "--" + flags.Allowance.Name, fmt.Sprint(allowance), "--" + flags.L1NodeVersion.Name, l1NodeVersion, "--" + flags.L2NodeVersion.Name, l2NodeVersion, @@ -108,7 +92,6 @@ func (s *ProverTestSuite) SetupApp() *cli.App { app := cli.NewApp() app.Flags = []cli.Flag{ &cli.StringFlag{Name: flags.L1WSEndpoint.Name}, - &cli.StringFlag{Name: flags.L1HTTPEndpoint.Name}, &cli.StringFlag{Name: flags.L2WSEndpoint.Name}, &cli.StringFlag{Name: flags.L2HTTPEndpoint.Name}, &cli.StringFlag{Name: flags.TaikoL1Address.Name}, @@ -121,11 +104,6 @@ func (s *ProverTestSuite) SetupApp() *cli.App { &cli.StringFlag{Name: flags.Graffiti.Name}, &cli.BoolFlag{Name: flags.ProveUnassignedBlocks.Name}, &cli.DurationFlag{Name: flags.RPCTimeout.Name}, - &cli.Uint64Flag{Name: flags.ProverCapacity.Name}, - &cli.Uint64Flag{Name: flags.MinOptimisticTierFee.Name}, - &cli.Uint64Flag{Name: flags.MinSgxTierFee.Name}, - &cli.Uint64Flag{Name: flags.MaxProposedIn.Name}, - &cli.StringFlag{Name: flags.AssignmentHookAddress.Name}, &cli.StringFlag{Name: flags.Allowance.Name}, &cli.StringFlag{Name: flags.ContesterMode.Name}, &cli.StringFlag{Name: flags.L1NodeVersion.Name}, diff --git a/packages/taiko-client/prover/event_handler/assignment_expired.go b/packages/taiko-client/prover/event_handler/assignment_expired.go index 1c41615a617..495dea3092c 100644 --- a/packages/taiko-client/prover/event_handler/assignment_expired.go +++ b/packages/taiko-client/prover/event_handler/assignment_expired.go @@ -2,12 +2,11 @@ package handler import ( "context" - "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" ) @@ -48,23 +47,23 @@ func NewAssignmentExpiredEventHandler( // Handle implements the AssignmentExpiredHandler interface. func (h *AssignmentExpiredEventHandler) Handle( ctx context.Context, - e *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, ) error { log.Info( "Proof assignment window is expired", - "blockID", e.BlockId, - "assignedProver", e.AssignedProver, - "minTier", e.Meta.MinTier, + "blockID", meta.GetBlockID(), + "assignedProver", meta.GetAssignedProver(), + "minTier", meta.GetMinTier(), ) // Check if we still need to generate a new proof for that block. - proofStatus, err := rpc.GetBlockProofStatus(ctx, h.rpc, e.BlockId, h.proverAddress, h.proverSetAddress) + proofStatus, err := rpc.GetBlockProofStatus(ctx, h.rpc, meta.GetBlockID(), h.proverAddress, h.proverSetAddress) if err != nil { return err } if !proofStatus.IsSubmitted { go func() { - h.proofSubmissionCh <- &proofProducer.ProofRequestBody{Tier: e.Meta.MinTier, Event: e} + h.proofSubmissionCh <- &proofProducer.ProofRequestBody{Tier: meta.GetMinTier(), Meta: meta} }() return nil } @@ -78,16 +77,16 @@ func (h *AssignmentExpiredEventHandler) Handle( go func() { if proofStatus.CurrentTransitionState.Contester == rpc.ZeroAddress && !h.isGuardian { h.proofContestCh <- &proofProducer.ContestRequestBody{ - BlockID: e.BlockId, - ProposedIn: new(big.Int).SetUint64(e.Raw.BlockNumber), + BlockID: meta.GetBlockID(), + ProposedIn: meta.GetRawBlockHeight(), ParentHash: proofStatus.ParentHeader.Hash(), - Meta: &e.Meta, + Meta: meta, Tier: proofStatus.CurrentTransitionState.Tier, } } else { h.proofSubmissionCh <- &proofProducer.ProofRequestBody{ - Tier: proofStatus.CurrentTransitionState.Tier + 1, - Event: e, + Tier: proofStatus.CurrentTransitionState.Tier + 1, + Meta: meta, } } }() diff --git a/packages/taiko-client/prover/event_handler/block_proposed.go b/packages/taiko-client/prover/event_handler/block_proposed.go index 8c3e8ac3cc7..f5c04d4a83a 100644 --- a/packages/taiko-client/prover/event_handler/block_proposed.go +++ b/packages/taiko-client/prover/event_handler/block_proposed.go @@ -11,12 +11,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" eventIterator "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/chain_iterator/event_iterator" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" guardianProverHeartbeater "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/guardian_prover_heartbeater" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" state "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/shared_state" @@ -32,10 +32,9 @@ type BlockProposedEventHandler struct { sharedState *state.SharedState proverAddress common.Address proverSetAddress common.Address - genesisHeightL1 uint64 rpc *rpc.Client proofGenerationCh chan<- *proofProducer.ProofWithHeader - assignmentExpiredCh chan<- *bindings.TaikoL1ClientBlockProposed + assignmentExpiredCh chan<- metadata.TaikoBlockMetaData proofSubmissionCh chan<- *proofProducer.ProofRequestBody proofContestCh chan<- *proofProducer.ContestRequestBody backOffRetryInterval time.Duration @@ -51,10 +50,9 @@ type NewBlockProposedEventHandlerOps struct { SharedState *state.SharedState ProverAddress common.Address ProverSetAddress common.Address - GenesisHeightL1 uint64 RPC *rpc.Client ProofGenerationCh chan *proofProducer.ProofWithHeader - AssignmentExpiredCh chan *bindings.TaikoL1ClientBlockProposed + AssignmentExpiredCh chan metadata.TaikoBlockMetaData ProofSubmissionCh chan *proofProducer.ProofRequestBody ProofContestCh chan *proofProducer.ContestRequestBody BackOffRetryInterval time.Duration @@ -69,7 +67,6 @@ func NewBlockProposedEventHandler(opts *NewBlockProposedEventHandlerOps) *BlockP opts.SharedState, opts.ProverAddress, opts.ProverSetAddress, - opts.GenesisHeightL1, opts.RPC, opts.ProofGenerationCh, opts.AssignmentExpiredCh, @@ -86,9 +83,10 @@ func NewBlockProposedEventHandler(opts *NewBlockProposedEventHandlerOps) *BlockP // Handle implements the BlockProposedHandler interface. func (h *BlockProposedEventHandler) Handle( ctx context.Context, - e *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, end eventIterator.EndBlockProposedEventIterFunc, ) error { + log.Info("Handle for BlockProposedEventHandler") // If there are newly generated proofs, we need to submit them as soon as possible, // to avoid proof submission timeout. if len(h.proofGenerationCh) > 0 { @@ -98,12 +96,12 @@ func (h *BlockProposedEventHandler) Handle( } // Wait for the corresponding L2 block being mined in node. - if _, err := h.rpc.WaitL2Header(ctx, e.BlockId); err != nil { - return fmt.Errorf("failed to wait L2 header (eventID %d): %w", e.BlockId, err) + if _, err := h.rpc.WaitL2Header(ctx, meta.GetBlockID()); err != nil { + return fmt.Errorf("failed to wait L2 header (eventID %d): %w", meta.GetBlockID(), err) } // Check if the L1 chain has reorged at first. - if err := h.checkL1Reorg(ctx, e); err != nil { + if err := h.checkL1Reorg(ctx, meta); err != nil { if err.Error() == errL1Reorged.Error() { end() return nil @@ -113,42 +111,41 @@ func (h *BlockProposedEventHandler) Handle( } // If the current block is handled, just skip it. - if e.BlockId.Uint64() <= h.sharedState.GetLastHandledBlockID() { + if meta.GetBlockID().Uint64() <= h.sharedState.GetLastHandledBlockID() { return nil } log.Info( "New BlockProposed event", - "l1Height", e.Raw.BlockNumber, - "l1Hash", e.Raw.BlockHash, - "blockID", e.BlockId, - "removed", e.Raw.Removed, - "assignedProver", e.AssignedProver, - "blobHash", common.Bytes2Hex(e.Meta.BlobHash[:]), - "livenessBond", utils.WeiToEther(e.LivenessBond), - "minTier", e.Meta.MinTier, - "blobUsed", e.Meta.BlobUsed, + "l1Height", meta.GetRawBlockHeight(), + "l1Hash", meta.GetRawBlockHash(), + "blockID", meta.GetBlockID(), + "assignedProver", meta.GetAssignedProver(), + "blobHash", meta.GetBlobHash(), + "livenessBond", utils.WeiToEther(meta.GetLivenessBond()), + "minTier", meta.GetMinTier(), + "blobUsed", meta.GetBlobUsed(), ) - metrics.ProverReceivedProposedBlockGauge.Set(float64(e.BlockId.Uint64())) + metrics.ProverReceivedProposedBlockGauge.Set(float64(meta.GetBlockID().Uint64())) // Move l1Current cursor. - newL1Current, err := h.rpc.L1.HeaderByHash(ctx, e.Raw.BlockHash) + newL1Current, err := h.rpc.L1.HeaderByHash(ctx, meta.GetRawBlockHash()) if err != nil { return err } h.sharedState.SetL1Current(newL1Current) - h.sharedState.SetLastHandledBlockID(e.BlockId.Uint64()) + h.sharedState.SetLastHandledBlockID(meta.GetBlockID().Uint64()) // Try generating a proof for the proposed block with the given backoff policy. go func() { if err := backoff.Retry( func() error { - if err := h.checkExpirationAndSubmitProof(ctx, e); err != nil { + if err := h.checkExpirationAndSubmitProof(ctx, meta); err != nil { log.Error( "Failed to check proof status and submit proof", "error", err, - "blockID", e.BlockId, - "minTier", e.Meta.MinTier, + "blockID", meta.GetBlockID(), + "minTier", meta.GetMinTier(), "maxRetrys", h.backOffMaxRetrys, ) return err @@ -170,15 +167,15 @@ func (h *BlockProposedEventHandler) Handle( // checkL1Reorg checks whether the L1 chain has been reorged. func (h *BlockProposedEventHandler) checkL1Reorg( ctx context.Context, - e *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, ) error { // Check whether the L2 EE's anchored L1 info, to see if the L1 chain has been reorged. reorgCheckResult, err := h.rpc.CheckL1Reorg( ctx, - new(big.Int).Sub(e.BlockId, common.Big1), + new(big.Int).Sub(meta.GetBlockID(), common.Big1), ) if err != nil { - return fmt.Errorf("failed to check whether L1 chain was reorged from L2EE (eventID %d): %w", e.BlockId, err) + return fmt.Errorf("failed to check whether L1 chain was reorged from L2EE (eventID %d): %w", meta.GetBlockID(), err) } if reorgCheckResult.IsReorged { @@ -198,23 +195,23 @@ func (h *BlockProposedEventHandler) checkL1Reorg( return errL1Reorged } - lastL1OriginHeader, err := h.rpc.L1.HeaderByNumber(ctx, new(big.Int).SetUint64(e.Meta.L1Height)) + lastL1OriginHeader, err := h.rpc.L1.HeaderByNumber(ctx, meta.GetRawBlockHeight()) if err != nil { - return fmt.Errorf("failed to get L1 header, height %d: %w", e.Meta.L1Height, err) + return fmt.Errorf("failed to get L1 header, height %d: %w", meta.GetRawBlockHeight(), err) } - if lastL1OriginHeader.Hash() != e.Meta.L1Hash { + if lastL1OriginHeader.Hash() != meta.GetRawBlockHash() { log.Warn( "L1 block hash mismatch due to L1 reorg", - "height", e.Meta.L1Height, + "height", meta.GetRawBlockHeight(), "lastL1OriginHeader", lastL1OriginHeader.Hash(), - "l1HashInEvent", e.Meta.L1Hash, + "l1HashInEvent", meta.GetRawBlockHash(), ) return fmt.Errorf( "L1 block hash mismatch due to L1 reorg: %s != %s", lastL1OriginHeader.Hash(), - e.Meta.L1Hash, + meta.GetRawBlockHash(), ) } @@ -225,15 +222,15 @@ func (h *BlockProposedEventHandler) checkL1Reorg( // and submits a new proof if necessary. func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( ctx context.Context, - e *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, ) error { // Check whether the block has been verified. - isVerified, err := isBlockVerified(ctx, h.rpc, e.BlockId) + isVerified, err := isBlockVerified(ctx, h.rpc, meta.GetBlockID()) if err != nil { return fmt.Errorf("failed to check if the current L2 block is verified: %w", err) } if isVerified { - log.Info("📋 Block has been verified", "blockID", e.BlockId) + log.Info("📋 Block has been verified", "blockID", meta.GetBlockID()) return nil } @@ -241,7 +238,7 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( proofStatus, err := rpc.GetBlockProofStatus( ctx, h.rpc, - e.BlockId, + meta.GetBlockID(), h.proverAddress, h.proverSetAddress, ) @@ -255,7 +252,7 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( if !proofStatus.Invalid { log.Info( "A valid proof has been submitted, skip proving", - "blockID", e.BlockId, + "blockID", meta.GetBlockID(), "parent", proofStatus.ParentHeader.Hash(), ) return nil @@ -265,7 +262,7 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( if !h.contesterMode { log.Info( "An invalid proof has been submitted, but current prover is not in contest mode, skip proving", - "blockID", e.BlockId, + "blockID", meta.GetBlockID(), "parent", proofStatus.ParentHeader.Hash(), ) return nil @@ -273,23 +270,23 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( if h.isGuardian { // In guardian prover, we submit a proof directly. - h.proofSubmissionCh <- &proofProducer.ProofRequestBody{Tier: encoding.TierGuardianMinorityID, Event: e} + h.proofSubmissionCh <- &proofProducer.ProofRequestBody{Tier: encoding.TierGuardianMinorityID, Meta: meta} } else { // If the current proof has not been contested, we should contest it at first. if proofStatus.CurrentTransitionState.Contester == rpc.ZeroAddress { h.proofContestCh <- &proofProducer.ContestRequestBody{ - BlockID: e.BlockId, - ProposedIn: new(big.Int).SetUint64(e.Raw.BlockNumber), + BlockID: meta.GetBlockID(), + ProposedIn: meta.GetRawBlockHeight(), ParentHash: proofStatus.ParentHeader.Hash(), - Meta: &e.Meta, - Tier: e.Meta.MinTier, + Meta: meta, + Tier: meta.GetMinTier(), } } else { // The invalid proof submitted to protocol is contested by another prover, // we need to submit a proof with a higher tier. h.proofSubmissionCh <- &proofProducer.ProofRequestBody{ - Tier: proofStatus.CurrentTransitionState.Tier + 1, - Event: e, + Tier: proofStatus.CurrentTransitionState.Tier + 1, + Meta: meta, } } } @@ -297,32 +294,32 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( return nil } - windowExpired, _, timeToExpire, err := IsProvingWindowExpired(&e.Meta, h.sharedState.GetTiers()) + windowExpired, _, timeToExpire, err := IsProvingWindowExpired(meta, h.sharedState.GetTiers()) if err != nil { return fmt.Errorf("failed to check if the proving window is expired: %w", err) } // If the proving window is not expired, we need to check if the current prover is the assigned prover, // if no and the current prover wants to prove unassigned blocks, then we should wait for its expiration. - if !windowExpired && e.AssignedProver != h.proverAddress && e.AssignedProver != h.proverSetAddress { + if !windowExpired && meta.GetAssignedProver() != h.proverAddress && meta.GetAssignedProver() != h.proverSetAddress { log.Info( "Proposed block is not provable by current prover at the moment", - "blockID", e.BlockId, - "prover", e.AssignedProver, + "blockID", meta.GetBlockID(), + "prover", meta.GetAssignedProver(), "timeToExpire", timeToExpire, ) if h.proveUnassignedBlocks { log.Info( "Add proposed block to wait for proof window expiration", - "blockID", e.BlockId, - "assignProver", e.AssignedProver, + "blockID", meta.GetBlockID(), + "assignProver", meta.GetAssignedProver(), "timeToExpire", timeToExpire, ) time.AfterFunc( // Add another 72 seconds, to ensure one more L1 block will be mined before the proof submission timeToExpire+proofExpirationDelay, - func() { h.assignmentExpiredCh <- e }, + func() { h.assignmentExpiredCh <- meta }, ) } @@ -331,7 +328,7 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( // The current prover is the assigned prover, or the proving window is expired, // try to submit a proof for this proposed block. - tier := e.Meta.MinTier + tier := meta.GetMinTier() if h.isGuardian { tier = encoding.TierGuardianMinorityID @@ -339,15 +336,15 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( log.Info( "Proposed block is provable", - "blockID", e.BlockId, - "assignProver", e.AssignedProver, - "minTier", e.Meta.MinTier, + "blockID", meta.GetBlockID(), + "assignProver", meta.GetAssignedProver(), + "minTier", meta.GetMinTier(), "tier", tier, ) metrics.ProverProofsAssigned.Add(1) - h.proofSubmissionCh <- &proofProducer.ProofRequestBody{Tier: tier, Event: e} + h.proofSubmissionCh <- &proofProducer.ProofRequestBody{Tier: tier, Meta: meta} return nil } @@ -382,16 +379,19 @@ func NewBlockProposedEventGuardianHandler( // Handle implements the BlockProposedHandler interface. func (h *BlockProposedGuaridanEventHandler) Handle( ctx context.Context, - event *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, end eventIterator.EndBlockProposedEventIterFunc, ) error { // If we are operating as a guardian prover, // we should sign all seen proposed blocks as soon as possible. go func() { - if err := h.GuardianProverHeartbeater.SignAndSendBlock(ctx, event.BlockId); err != nil { - log.Error("Guardian prover unable to sign block", "blockID", event.BlockId, "error", err) + if h.GuardianProverHeartbeater == nil { + return + } + if err := h.GuardianProverHeartbeater.SignAndSendBlock(ctx, meta.GetBlockID()); err != nil { + log.Error("Guardian prover unable to sign block", "blockID", meta.GetBlockID(), "error", err) } }() - return h.BlockProposedEventHandler.Handle(ctx, event, end) + return h.BlockProposedEventHandler.Handle(ctx, meta, end) } diff --git a/packages/taiko-client/prover/event_handler/block_proposed_test.go b/packages/taiko-client/prover/event_handler/block_proposed_test.go index e3a0563d270..352b9daf458 100644 --- a/packages/taiko-client/prover/event_handler/block_proposed_test.go +++ b/packages/taiko-client/prover/event_handler/block_proposed_test.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" state "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/shared_state" ) @@ -16,10 +16,9 @@ func (s *EventHandlerTestSuite) TestBlockProposedHandle() { opts := &NewBlockProposedEventHandlerOps{ SharedState: &state.SharedState{}, ProverAddress: common.Address{}, - GenesisHeightL1: 0, RPC: s.RPCClient, ProofGenerationCh: make(chan *proofProducer.ProofWithHeader), - AssignmentExpiredCh: make(chan *bindings.TaikoL1ClientBlockProposed), + AssignmentExpiredCh: make(chan metadata.TaikoBlockMetaData), ProofSubmissionCh: make(chan *proofProducer.ProofRequestBody), ProofContestCh: make(chan *proofProducer.ContestRequestBody), BackOffRetryInterval: 1 * time.Minute, @@ -28,7 +27,5 @@ func (s *EventHandlerTestSuite) TestBlockProposedHandle() { ProveUnassignedBlocks: true, } handler := NewBlockProposedEventHandler(opts) - e := s.ProposeAndInsertValidBlock(s.proposer, s.blobSyncer) - err := handler.Handle(context.Background(), e, func() {}) - s.Nil(err) + s.Nil(handler.Handle(context.Background(), s.ProposeAndInsertValidBlock(s.proposer, s.blobSyncer), func() {})) } diff --git a/packages/taiko-client/prover/event_handler/block_verified.go b/packages/taiko-client/prover/event_handler/block_verified.go index 41be0253928..cb72d4dda60 100644 --- a/packages/taiko-client/prover/event_handler/block_verified.go +++ b/packages/taiko-client/prover/event_handler/block_verified.go @@ -19,18 +19,13 @@ func NewBlockVerifiedEventHandler(guardianProverAddress common.Address) *BlockVe } // Handle handles the BlockVerified event. -func (h *BlockVerifiedEventHandler) Handle(e *bindings.TaikoL1ClientBlockVerified) { +func (h *BlockVerifiedEventHandler) Handle(e *bindings.TaikoL1ClientBlockVerifiedV2) { metrics.ProverLatestVerifiedIDGauge.Set(float64(e.BlockId.Uint64())) - if e.Prover == h.guardianProverAddress { - metrics.ProverProvenByGuardianGauge.Set(1) - } - log.Info( "New verified block", "blockID", e.BlockId, "hash", common.BytesToHash(e.BlockHash[:]), - "stateRoot", common.BytesToHash(e.StateRoot[:]), "prover", e.Prover, ) } diff --git a/packages/taiko-client/prover/event_handler/block_verified_test.go b/packages/taiko-client/prover/event_handler/block_verified_test.go index 90e9831d530..ebe226c0429 100644 --- a/packages/taiko-client/prover/event_handler/block_verified_test.go +++ b/packages/taiko-client/prover/event_handler/block_verified_test.go @@ -11,7 +11,7 @@ func (s *EventHandlerTestSuite) TestBlockVerifiedHandle() { handler := &BlockVerifiedEventHandler{} id := testutils.RandomHash().Big().Uint64() s.NotPanics(func() { - handler.Handle(&bindings.TaikoL1ClientBlockVerified{ + handler.Handle(&bindings.TaikoL1ClientBlockVerifiedV2{ BlockId: testutils.RandomHash().Big(), Raw: types.Log{ BlockHash: testutils.RandomHash(), diff --git a/packages/taiko-client/prover/event_handler/interface.go b/packages/taiko-client/prover/event_handler/interface.go index 6181859a18d..290c4c2f9f6 100644 --- a/packages/taiko-client/prover/event_handler/interface.go +++ b/packages/taiko-client/prover/event_handler/interface.go @@ -4,33 +4,34 @@ import ( "context" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" eventIterator "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/chain_iterator/event_iterator" ) // BlockProposedHandler is the interface for handling `TaikoL1.BlockProposed` events. type BlockProposedHandler interface { Handle(ctx context.Context, - event *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, end eventIterator.EndBlockProposedEventIterFunc, ) error } -// TransitionContestedHandler is the interface for handling `TaikoL1.TransitionContested` events. +// TransitionContestedHandler is the interface for handling `TaikoL1.TransitionContestedV2` events. type TransitionContestedHandler interface { - Handle(ctx context.Context, event *bindings.TaikoL1ClientTransitionContested) error + Handle(ctx context.Context, event *bindings.TaikoL1ClientTransitionContestedV2) error } -// TransitionProvedHandler is the interface for handling `TaikoL1.TransitionProved` events. +// TransitionProvedHandler is the interface for handling `TaikoL1.TransitionProvedV2` events. type TransitionProvedHandler interface { - Handle(ctx context.Context, event *bindings.TaikoL1ClientTransitionProved) error + Handle(ctx context.Context, event *bindings.TaikoL1ClientTransitionProvedV2) error } -// BlockVerifiedHandler is the interface for handling `TaikoL1.BlockVerified` events. +// BlockVerifiedHandler is the interface for handling `TaikoL1.BlockVerifiedV2` events. type BlockVerifiedHandler interface { - Handle(e *bindings.TaikoL1ClientBlockVerified) + Handle(e *bindings.TaikoL1ClientBlockVerifiedV2) } // AssignmentExpiredHandler is the interface for handling the proof assignment expiration. type AssignmentExpiredHandler interface { - Handle(ctx context.Context, event *bindings.TaikoL1ClientBlockProposed) error + Handle(ctx context.Context, meta metadata.TaikoBlockMetaData) error } diff --git a/packages/taiko-client/prover/event_handler/transition_contested.go b/packages/taiko-client/prover/event_handler/transition_contested.go index a34d3506932..a3da2639bba 100644 --- a/packages/taiko-client/prover/event_handler/transition_contested.go +++ b/packages/taiko-client/prover/event_handler/transition_contested.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" ) @@ -33,7 +33,7 @@ func NewTransitionContestedEventHandler( // Handle implements the TransitionContestedHandler interface. func (h *TransitionContestedEventHandler) Handle( ctx context.Context, - e *bindings.TaikoL1ClientTransitionContested, + e *bindings.TaikoL1ClientTransitionContestedV2, ) error { log.Info( "🗡 Transition contested", @@ -85,16 +85,11 @@ func (h *TransitionContestedEventHandler) Handle( } // If the proof is invalid, we contest it. - blockInfo, err := h.rpc.GetL2BlockInfo(ctx, e.BlockId) - if err != nil { - return err - } - - blockProposedEvent, err := GetBlockProposedEventFromBlockID( + meta, err := getMetadataFromBlockID( ctx, h.rpc, e.BlockId, - new(big.Int).SetUint64(blockInfo.ProposedIn), + new(big.Int).SetUint64(e.ProposedIn), ) if err != nil { return err @@ -102,8 +97,8 @@ func (h *TransitionContestedEventHandler) Handle( go func() { h.proofSubmissionCh <- &proofProducer.ProofRequestBody{ - Tier: e.Tier + 1, // We need to send a higher tier proof to resolve the current contest. - Event: blockProposedEvent, + Tier: e.Tier + 1, // We need to send a higher tier proof to resolve the current contest. + Meta: meta, } }() diff --git a/packages/taiko-client/prover/event_handler/transition_proved.go b/packages/taiko-client/prover/event_handler/transition_proved.go index 21416b5c513..b1896f15be9 100644 --- a/packages/taiko-client/prover/event_handler/transition_proved.go +++ b/packages/taiko-client/prover/event_handler/transition_proved.go @@ -44,10 +44,14 @@ func NewTransitionProvedEventHandler( // Handle implements the TransitionProvedHandler interface. func (h *TransitionProvedEventHandler) Handle( ctx context.Context, - e *bindings.TaikoL1ClientTransitionProved, + e *bindings.TaikoL1ClientTransitionProvedV2, ) error { metrics.ProverReceivedProvenBlockGauge.Set(float64(e.BlockId.Uint64())) + if e.Tier >= encoding.TierGuardianMinorityID { + metrics.ProverProvenByGuardianGauge.Add(1) + } + // If this prover is in contest mode, we check the validity of this proof and if it's invalid, // contest it with a higher tier proof. if !h.contesterMode { @@ -69,14 +73,8 @@ func (h *TransitionProvedEventHandler) Handle( if isValid { return nil } - // If the proof is invalid, we contest it. - blockInfo, err := h.rpc.GetL2BlockInfo(ctx, e.BlockId) - if err != nil { - return err - } - - meta, err := getMetadataFromBlockID(ctx, h.rpc, e.BlockId, new(big.Int).SetUint64(blockInfo.ProposedIn)) + meta, err := getMetadataFromBlockID(ctx, h.rpc, e.BlockId, new(big.Int).SetUint64(e.ProposedIn)) if err != nil { return err } @@ -84,33 +82,33 @@ func (h *TransitionProvedEventHandler) Handle( log.Info( "Attempting to contest a proven transition", "blockID", e.BlockId, - "l1Height", blockInfo.ProposedIn, + "l1Height", e.ProposedIn, "tier", e.Tier, "parentHash", common.Bytes2Hex(e.Tran.ParentHash[:]), "blockHash", common.Bytes2Hex(e.Tran.BlockHash[:]), "stateRoot", common.Bytes2Hex(e.Tran.StateRoot[:]), ) if h.isGuardian { - blockProposedEvent, err := GetBlockProposedEventFromBlockID( + meta, err := getMetadataFromBlockID( ctx, h.rpc, e.BlockId, - new(big.Int).SetUint64(blockInfo.ProposedIn), + new(big.Int).SetUint64(e.ProposedIn), ) if err != nil { return err } go func() { h.proofSubmissionCh <- &proofProducer.ProofRequestBody{ - Tier: encoding.TierGuardianMinorityID, - Event: blockProposedEvent, + Tier: encoding.TierGuardianMinorityID, + Meta: meta, } }() } else { go func() { h.proofContestCh <- &proofProducer.ContestRequestBody{ BlockID: e.BlockId, - ProposedIn: new(big.Int).SetUint64(blockInfo.ProposedIn), + ProposedIn: new(big.Int).SetUint64(e.ProposedIn), ParentHash: e.Tran.ParentHash, Meta: meta, Tier: e.Tier, diff --git a/packages/taiko-client/prover/event_handler/transition_proved_test.go b/packages/taiko-client/prover/event_handler/transition_proved_test.go index 61b287a5d43..fa721f90c46 100644 --- a/packages/taiko-client/prover/event_handler/transition_proved_test.go +++ b/packages/taiko-client/prover/event_handler/transition_proved_test.go @@ -41,12 +41,11 @@ func (s *EventHandlerTestSuite) SetupTest() { d := new(driver.Driver) s.Nil(d.InitFromConfig(context.Background(), &driver.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), JwtSecret: string(jwtSecret), }, })) @@ -77,28 +76,20 @@ func (s *EventHandlerTestSuite) SetupTest() { s.Nil(prop.InitFromConfig(context.Background(), &proposer.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: string(jwtSecret), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: s.ProverEndpoints, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - MaxTierFeePriceBumps: 3, - TierFeePriceBump: common.Big2, - L1BlockBuilderTip: common.Big0, TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 1, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), @@ -112,7 +103,22 @@ func (s *EventHandlerTestSuite) SetupTest() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - })) + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 1, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + }, nil, nil)) s.proposer = prop } @@ -126,10 +132,11 @@ func (s *EventHandlerTestSuite) TestTransitionProvedHandle() { true, false, ) - e := s.ProposeAndInsertValidBlock(s.proposer, s.blobSyncer) - err := handler.Handle(context.Background(), &bindings.TaikoL1ClientTransitionProved{ - BlockId: e.BlockId, - Tier: e.Meta.MinTier, + m := s.ProposeAndInsertValidBlock(s.proposer, s.blobSyncer) + err := handler.Handle(context.Background(), &bindings.TaikoL1ClientTransitionProvedV2{ + BlockId: m.GetBlockID(), + Tier: m.GetMinTier(), + ProposedIn: m.GetRawBlockHeight().Uint64(), }) s.Nil(err) } diff --git a/packages/taiko-client/prover/event_handler/util.go b/packages/taiko-client/prover/event_handler/util.go index 0a350d577af..92539d7e1c1 100644 --- a/packages/taiko-client/prover/event_handler/util.go +++ b/packages/taiko-client/prover/event_handler/util.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" eventIterator "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/chain_iterator/event_iterator" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) @@ -68,24 +68,24 @@ func getProvingWindow( return 0, errTierNotFound } -// GetBlockProposedEventFromBlockID fetches the BlockProposed event by the given block id. -func GetBlockProposedEventFromBlockID( +// getMetadataFromBlockID fetches the block meta from the onchain event by the given block id. +func getMetadataFromBlockID( ctx context.Context, rpc *rpc.Client, id *big.Int, proposedIn *big.Int, -) (e *bindings.TaikoL1ClientBlockProposed, err error) { +) (m metadata.TaikoBlockMetaData, err error) { callback := func( _ context.Context, - event *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, _ eventIterator.EndBlockProposedEventIterFunc, ) error { // Only filter for exact blockID we want. - if event.BlockId.Cmp(id) != 0 { + if meta.GetBlockID().Cmp(id) != 0 { return nil } - e = event + m = meta return nil } @@ -106,43 +106,28 @@ func GetBlockProposedEventFromBlockID( return nil, err } - if e == nil { + if m == nil { return nil, fmt.Errorf("failed to find BlockProposed event for block %d", id) } - return e, nil -} - -// getMetadataFromBlockID fetches the block meta from the onchain event by the given block id. -func getMetadataFromBlockID( - ctx context.Context, - rpc *rpc.Client, - id *big.Int, - proposedIn *big.Int, -) (*bindings.TaikoDataBlockMetadata, error) { - e, err := GetBlockProposedEventFromBlockID(ctx, rpc, id, proposedIn) - if err != nil { - return nil, err - } - return &e.Meta, nil + return m, nil } // IsProvingWindowExpired returns true as the first return parameter if the assigned prover // proving window of the given proposed block is expired, and the second return parameter is the time // remaining til proving window is expired. func IsProvingWindowExpired( - metadata *bindings.TaikoDataBlockMetadata, + metadata metadata.TaikoBlockMetaData, tiers []*rpc.TierProviderTierWithID, ) (bool, time.Time, time.Duration, error) { - provingWindow, err := getProvingWindow(metadata.MinTier, tiers) + provingWindow, err := getProvingWindow(metadata.GetMinTier(), tiers) if err != nil { return false, time.Time{}, 0, fmt.Errorf("failed to get proving window: %w", err) } var ( now = uint64(time.Now().Unix()) - expiredAt = metadata.Timestamp + uint64(provingWindow.Seconds()) + expiredAt = metadata.GetTimestamp() + uint64(provingWindow.Seconds()) ) - return now > expiredAt, time.Unix(int64(expiredAt), 0), time.Duration(expiredAt-now) * time.Second, nil } diff --git a/packages/taiko-client/prover/init.go b/packages/taiko-client/prover/init.go index 2e5fdb80647..61faf0f66fc 100644 --- a/packages/taiko-client/prover/init.go +++ b/packages/taiko-client/prover/init.go @@ -13,8 +13,8 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" handler "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/event_handler" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" proofSubmitter "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_submitter" @@ -93,30 +93,51 @@ func (p *Prover) setApprovalAmount(ctx context.Context, contract common.Address) // initProofSubmitters initializes the proof submitters from the given tiers in protocol. func (p *Prover) initProofSubmitters( - txmgr *txmgr.SimpleTxManager, txBuilder *transaction.ProveBlockTxBuilder, tiers []*rpc.TierProviderTierWithID, ) error { for _, tier := range p.sharedState.GetTiers() { var ( - producer proofProducer.ProofProducer - submitter proofSubmitter.Submitter - err error + bufferSize = p.cfg.SGXProofBufferSize + producer proofProducer.ProofProducer + submitter proofSubmitter.Submitter + err error ) switch tier.ID { case encoding.TierOptimisticID: producer = &proofProducer.OptimisticProofProducer{} case encoding.TierSgxID: producer = &proofProducer.SGXProofProducer{ - RaikoHostEndpoint: p.cfg.RaikoHostEndpoint, - JWT: p.cfg.RaikoJWT, - ProofType: proofProducer.ProofTypeSgx, - Dummy: p.cfg.Dummy, + RaikoHostEndpoint: p.cfg.RaikoHostEndpoint, + JWT: p.cfg.RaikoJWT, + ProofType: proofProducer.ProofTypeSgx, + Dummy: p.cfg.Dummy, + RaikoRequestTimeout: p.cfg.RaikoRequestTimeout, } + case encoding.TierZkVMRisc0ID: + producer = &proofProducer.ZKvmProofProducer{ + ZKProofType: proofProducer.ZKProofTypeR0, + RaikoHostEndpoint: p.cfg.RaikoZKVMHostEndpoint, + JWT: p.cfg.RaikoJWT, + Dummy: p.cfg.Dummy, + RaikoRequestTimeout: p.cfg.RaikoRequestTimeout, + } + bufferSize = p.cfg.ZKVMProofBufferSize + case encoding.TierZkVMSp1ID: + producer = &proofProducer.ZKvmProofProducer{ + ZKProofType: proofProducer.ZKProofTypeSP1, + RaikoHostEndpoint: p.cfg.RaikoZKVMHostEndpoint, + JWT: p.cfg.RaikoJWT, + Dummy: p.cfg.Dummy, + RaikoRequestTimeout: p.cfg.RaikoRequestTimeout, + } + bufferSize = p.cfg.ZKVMProofBufferSize case encoding.TierGuardianMinorityID: producer = proofProducer.NewGuardianProofProducer(encoding.TierGuardianMinorityID, p.cfg.EnableLivenessBondProof) + bufferSize = 0 case encoding.TierGuardianMajorityID: producer = proofProducer.NewGuardianProofProducer(encoding.TierGuardianMajorityID, p.cfg.EnableLivenessBondProof) + bufferSize = 0 default: return fmt.Errorf("unsupported tier: %d", tier.ID) } @@ -125,15 +146,20 @@ func (p *Prover) initProofSubmitters( p.rpc, producer, p.proofGenerationCh, + p.batchProofGenerationCh, + p.aggregationNotify, p.cfg.ProverSetAddress, p.cfg.TaikoL2Address, p.cfg.Graffiti, p.cfg.ProveBlockGasLimit, - txmgr, + p.txmgr, + p.privateTxmgr, txBuilder, tiers, p.IsGuardianProver(), p.cfg.GuardianProofSubmissionDelay, + bufferSize, + p.cfg.ForceBatchProvingInterval, ); err != nil { return err } @@ -154,7 +180,6 @@ func (p *Prover) initL1Current(startingBlockID *big.Int) error { if err != nil { return err } - p.genesisHeightL1 = stateVars.A.GenesisHeight if startingBlockID == nil { if stateVars.B.LastVerifiedBlockId == 0 { @@ -206,7 +231,6 @@ func (p *Prover) initEventHandlers() error { SharedState: p.sharedState, ProverAddress: p.ProverAddress(), ProverSetAddress: p.cfg.ProverSetAddress, - GenesisHeightL1: p.genesisHeightL1, RPC: p.rpc, ProofGenerationCh: p.proofGenerationCh, AssignmentExpiredCh: p.assignmentExpiredCh, diff --git a/packages/taiko-client/prover/init_test.go b/packages/taiko-client/prover/init_test.go index 25c4e320b3f..17a1557baac 100644 --- a/packages/taiko-client/prover/init_test.go +++ b/packages/taiko-client/prover/init_test.go @@ -13,7 +13,7 @@ import ( func (s *ProverTestSuite) TestSetApprovalAmount() { data, err := encoding.TaikoTokenABI.Pack( "approve", - s.p.cfg.AssignmentHookAddress, + s.p.cfg.TaikoL1Address, common.Big0, ) s.Nil(err) @@ -24,7 +24,7 @@ func (s *ProverTestSuite) TestSetApprovalAmount() { }) s.Nil(err) - allowance, err := s.p.rpc.TaikoToken.Allowance(nil, s.p.ProverAddress(), s.p.cfg.AssignmentHookAddress) + allowance, err := s.p.rpc.TaikoToken.Allowance(nil, s.p.ProverAddress(), s.p.cfg.TaikoL1Address) s.Nil(err) s.Equal(0, allowance.Cmp(common.Big0)) @@ -35,9 +35,9 @@ func (s *ProverTestSuite) TestSetApprovalAmount() { s.p.cfg.Allowance = amt - s.Nil(s.p.setApprovalAmount(context.Background(), s.p.cfg.AssignmentHookAddress)) + s.Nil(s.p.setApprovalAmount(context.Background(), s.p.cfg.TaikoL1Address)) - allowance, err = s.p.rpc.TaikoToken.Allowance(nil, s.p.ProverAddress(), s.p.cfg.AssignmentHookAddress) + allowance, err = s.p.rpc.TaikoToken.Allowance(nil, s.p.ProverAddress(), s.p.cfg.TaikoL1Address) s.Nil(err) s.Equal(0, amt.Cmp(allowance)) diff --git a/packages/taiko-client/prover/proof_producer/dummy_producer.go b/packages/taiko-client/prover/proof_producer/dummy_producer.go index 0481aa47e5b..5828979b52e 100644 --- a/packages/taiko-client/prover/proof_producer/dummy_producer.go +++ b/packages/taiko-client/prover/proof_producer/dummy_producer.go @@ -3,10 +3,11 @@ package producer import ( "bytes" "math/big" + "time" "github.com/ethereum/go-ethereum/core/types" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) // DummyProofProducer always returns a dummy proof. @@ -16,9 +17,10 @@ type DummyProofProducer struct{} func (o *DummyProofProducer) RequestProof( opts *ProofRequestOptions, blockID *big.Int, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, header *types.Header, tier uint16, + _ time.Time, ) (*ProofWithHeader, error) { return &ProofWithHeader{ BlockID: blockID, @@ -29,3 +31,15 @@ func (o *DummyProofProducer) RequestProof( Tier: tier, }, nil } + +// RequestBatchProofs returns a dummy proof aggregation to the result channel. +func (o *DummyProofProducer) RequestBatchProofs( + proofs []*ProofWithHeader, + tier uint16, +) (*BatchProofs, error) { + return &BatchProofs{ + Proofs: proofs, + BatchProof: bytes.Repeat([]byte{0xbb}, 100), + Tier: tier, + }, nil +} diff --git a/packages/taiko-client/prover/proof_producer/dummy_producer_test.go b/packages/taiko-client/prover/proof_producer/dummy_producer_test.go index 2b270071acf..4977e2c6c75 100644 --- a/packages/taiko-client/prover/proof_producer/dummy_producer_test.go +++ b/packages/taiko-client/prover/proof_producer/dummy_producer_test.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/require" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) func TestDummyProducerRequestProof(t *testing.T) { @@ -37,9 +37,10 @@ func TestDummyProducerRequestProof(t *testing.T) { res, err := producer.RequestProof( &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, tier, + time.Now(), ) require.Nil(t, err) diff --git a/packages/taiko-client/prover/proof_producer/guardian_producer.go b/packages/taiko-client/prover/proof_producer/guardian_producer.go index ea4dd8fa733..a459eb12f28 100644 --- a/packages/taiko-client/prover/proof_producer/guardian_producer.go +++ b/packages/taiko-client/prover/proof_producer/guardian_producer.go @@ -3,12 +3,13 @@ package producer import ( "context" "math/big" + "time" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) // GuardianProofProducer always returns an optimistic (dummy) proof. @@ -34,14 +35,14 @@ func (g *GuardianProofProducer) RequestProof( _ context.Context, opts *ProofRequestOptions, blockID *big.Int, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, header *types.Header, + requestAt time.Time, ) (*ProofWithHeader, error) { log.Info( "Request guardian proof", "blockID", blockID, - "coinbase", meta.Coinbase, - "height", header.Number, + "coinbase", meta.GetCoinbase(), "hash", header.Hash(), ) @@ -56,7 +57,24 @@ func (g *GuardianProofProducer) RequestProof( }, nil } - return g.DummyProofProducer.RequestProof(opts, blockID, meta, header, g.Tier()) + return g.DummyProofProducer.RequestProof(opts, blockID, meta, header, g.Tier(), requestAt) +} + +// RequestCancel implements the ProofProducer interface to cancel the proof generating progress. +func (g *GuardianProofProducer) RequestCancel( + _ context.Context, + _ *ProofRequestOptions, +) error { + return nil +} + +// Aggregate implements the ProofProducer interface to aggregate a batch of proofs. +func (g *GuardianProofProducer) Aggregate( + _ context.Context, + _ []*ProofWithHeader, + _ time.Time, +) (*BatchProofs, error) { + return nil, nil } // Tier implements the ProofProducer interface. diff --git a/packages/taiko-client/prover/proof_producer/guardian_producer_test.go b/packages/taiko-client/prover/proof_producer/guardian_producer_test.go index ce5b6819b48..1697e763ad7 100644 --- a/packages/taiko-client/prover/proof_producer/guardian_producer_test.go +++ b/packages/taiko-client/prover/proof_producer/guardian_producer_test.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/require" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) func TestGuardianProducerRequestProof(t *testing.T) { @@ -40,8 +40,9 @@ func TestGuardianProducerRequestProof(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) @@ -63,10 +64,11 @@ func TestGuardianProducerRequestProofReturnLivenessBond(t *testing.T) { Number: common.Big256, GasLimit: 1024, GasUsed: 1024, - Time: uint64(time.Now().Unix()), - Extra: randHash().Bytes(), - MixDigest: randHash(), - Nonce: types.BlockNonce{}, + + Time: uint64(time.Now().Unix()), + Extra: randHash().Bytes(), + MixDigest: randHash(), + Nonce: types.BlockNonce{}, } var ( @@ -77,8 +79,9 @@ func TestGuardianProducerRequestProofReturnLivenessBond(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) @@ -115,8 +118,9 @@ func TestMinorityRequestProof(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) @@ -152,8 +156,9 @@ func TestRequestMinorityProofReturnLivenessBond(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) diff --git a/packages/taiko-client/prover/proof_producer/optimistic_producer.go b/packages/taiko-client/prover/proof_producer/optimistic_producer.go index f9c5971419c..10d0eb2f2da 100644 --- a/packages/taiko-client/prover/proof_producer/optimistic_producer.go +++ b/packages/taiko-client/prover/proof_producer/optimistic_producer.go @@ -3,12 +3,13 @@ package producer import ( "context" "math/big" + "time" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) // OptimisticProofProducer always returns an optimistic (dummy) proof. @@ -19,18 +20,50 @@ func (o *OptimisticProofProducer) RequestProof( _ context.Context, opts *ProofRequestOptions, blockID *big.Int, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, header *types.Header, + requestAt time.Time, ) (*ProofWithHeader, error) { log.Info( "Request optimistic proof", "blockID", blockID, - "coinbase", meta.Coinbase, - "height", header.Number, + "coinbase", meta.GetCoinbase(), "hash", header.Hash(), ) - return o.DummyProofProducer.RequestProof(opts, blockID, meta, header, o.Tier()) + return o.DummyProofProducer.RequestProof(opts, blockID, meta, header, o.Tier(), requestAt) +} + +// Aggregate implements the ProofProducer interface to aggregate a batch of proofs. +func (o *OptimisticProofProducer) Aggregate( + _ context.Context, + items []*ProofWithHeader, + _ time.Time, +) (*BatchProofs, error) { + log.Info( + "Aggregate batch optimistic proof", + ) + if len(items) == 0 { + return nil, ErrInvalidLength + } + blockIDs := make([]*big.Int, len(items)) + for i, item := range items { + blockIDs[i] = item.Meta.GetBlockID() + } + batchProof, err := o.DummyProofProducer.RequestBatchProofs(items, o.Tier()) + if err != nil { + return nil, err + } + batchProof.BlockIDs = blockIDs + return batchProof, nil +} + +// RequestCancel implements the ProofProducer interface to cancel the proof generating progress. +func (o *OptimisticProofProducer) RequestCancel( + _ context.Context, + _ *ProofRequestOptions, +) error { + return nil } // Tier implements the ProofProducer interface. diff --git a/packages/taiko-client/prover/proof_producer/optimistic_producer_test.go b/packages/taiko-client/prover/proof_producer/optimistic_producer_test.go index 416dac4e46d..372de77a2b4 100644 --- a/packages/taiko-client/prover/proof_producer/optimistic_producer_test.go +++ b/packages/taiko-client/prover/proof_producer/optimistic_producer_test.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/stretchr/testify/require" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) func TestOptimisticRequestProof(t *testing.T) { @@ -41,8 +41,9 @@ func TestOptimisticRequestProof(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) @@ -78,8 +79,9 @@ func TestProofCancel(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) } diff --git a/packages/taiko-client/prover/proof_producer/proof_producer.go b/packages/taiko-client/prover/proof_producer/proof_producer.go index 0f1462e9cb0..292a90d2d60 100644 --- a/packages/taiko-client/prover/proof_producer/proof_producer.go +++ b/packages/taiko-client/prover/proof_producer/proof_producer.go @@ -9,18 +9,19 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) var ( - proofPollingInterval = 10 * time.Second - errProofGenerating = errors.New("proof is generating") + errProofGenerating = errors.New("proof is generating") + errEmptyProof = errors.New("proof is empty") + ErrInvalidLength = errors.New("invalid items length") ) // ProofRequestBody represents a request body to generate a proof. type ProofRequestBody struct { - Tier uint16 - Event *bindings.TaikoL1ClientBlockProposed + Tier uint16 + Meta metadata.TaikoBlockMetaData } // ContestRequestBody represents a request body to generate a proof for contesting. @@ -28,7 +29,7 @@ type ContestRequestBody struct { BlockID *big.Int ProposedIn *big.Int ParentHash common.Hash - Meta *bindings.TaikoDataBlockMetadata + Meta metadata.TaikoBlockMetaData Tier uint16 } @@ -46,24 +47,42 @@ type ProofRequestOptions struct { Graffiti string GasUsed uint64 ParentGasUsed uint64 + Compressed bool } type ProofWithHeader struct { BlockID *big.Int - Meta *bindings.TaikoDataBlockMetadata + Meta metadata.TaikoBlockMetaData Header *types.Header Proof []byte Opts *ProofRequestOptions Tier uint16 } +type BatchProofs struct { + Proofs []*ProofWithHeader + BatchProof []byte + Tier uint16 + BlockIDs []*big.Int +} + type ProofProducer interface { RequestProof( ctx context.Context, opts *ProofRequestOptions, blockID *big.Int, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, header *types.Header, + requestAt time.Time, ) (*ProofWithHeader, error) + Aggregate( + ctx context.Context, + items []*ProofWithHeader, + requestAt time.Time, + ) (*BatchProofs, error) + RequestCancel( + ctx context.Context, + opts *ProofRequestOptions, + ) error Tier() uint16 } diff --git a/packages/taiko-client/prover/proof_producer/sgx_producer.go b/packages/taiko-client/prover/proof_producer/sgx_producer.go index 96cf6572d7d..10d58cfb1c8 100644 --- a/packages/taiko-client/prover/proof_producer/sgx_producer.go +++ b/packages/taiko-client/prover/proof_producer/sgx_producer.go @@ -11,14 +11,14 @@ import ( "net/http" "time" - "github.com/cenkalti/backoff/v4" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) const ( @@ -28,21 +28,34 @@ const ( // SGXProofProducer generates a SGX proof for the given block. type SGXProofProducer struct { - RaikoHostEndpoint string // a proverd RPC endpoint - ProofType string // Proof type - JWT string // JWT provided by Raiko - Dummy bool + RaikoHostEndpoint string // a proverd RPC endpoint + ProofType string // Proof type + JWT string // JWT provided by Raiko + Dummy bool + RaikoRequestTimeout time.Duration DummyProofProducer } // RaikoRequestProofBody represents the JSON body for requesting the proof. type RaikoRequestProofBody struct { - Block *big.Int `json:"block_number"` - Prover string `json:"prover"` - Graffiti string `json:"graffiti"` - Type string `json:"proof_type"` - SGX *SGXRequestProofBodyParam `json:"sgx"` - RISC0 RISC0RequestProofBodyParam `json:"risc0"` + Block *big.Int `json:"block_number"` + Prover string `json:"prover"` + Graffiti string `json:"graffiti"` + Type string `json:"proof_type"` + SGX *SGXRequestProofBodyParam `json:"sgx"` + RISC0 *RISC0RequestProofBodyParam `json:"risc0"` + SP1 *SP1RequestProofBodyParam `json:"sp1"` +} + +// RaikoRequestProofBodyV3 represents the JSON body for requesting the proof. +type RaikoRequestProofBodyV3 struct { + Blocks [][2]*big.Int `json:"block_numbers"` + Prover string `json:"prover"` + Graffiti string `json:"graffiti"` + Type string `json:"proof_type"` + SGX *SGXRequestProofBodyParam `json:"sgx"` + RISC0 *RISC0RequestProofBodyParam `json:"risc0"` + SP1 *SP1RequestProofBodyParam `json:"sp1"` } // SGXRequestProofBodyParam represents the JSON body of RaikoRequestProofBody's `sgx` field. @@ -60,6 +73,13 @@ type RISC0RequestProofBodyParam struct { ExecutionPo2 *big.Int `json:"execution_po2"` } +// SP1RequestProofBodyParam represents the JSON body of RaikoRequestProofBody's `sp1` field. +type SP1RequestProofBodyParam struct { + Recursion string `json:"recursion"` + Prover string `json:"prover"` + Verify bool `json:"verify"` +} + // RaikoRequestProofBodyResponse represents the JSON body of the response of the proof requests. type RaikoRequestProofBodyResponse struct { Data *RaikoProofData `json:"data"` @@ -67,7 +87,8 @@ type RaikoRequestProofBodyResponse struct { } type RaikoProofData struct { - Proof string `json:"proof"` //nolint:revive,stylecheck + Proof string `json:"proof"` //nolint:revive,stylecheck + Status string `json:"status"` } // RequestProof implements the ProofProducer interface. @@ -75,22 +96,23 @@ func (s *SGXProofProducer) RequestProof( ctx context.Context, opts *ProofRequestOptions, blockID *big.Int, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, header *types.Header, + requestAt time.Time, ) (*ProofWithHeader, error) { log.Info( - "Request proof from raiko-host service", + "Request sgx proof from raiko-host service", "blockID", blockID, - "coinbase", meta.Coinbase, - "height", header.Number, + "coinbase", meta.GetCoinbase(), "hash", header.Hash(), + "time", time.Since(requestAt), ) if s.Dummy { - return s.DummyProofProducer.RequestProof(opts, blockID, meta, header, s.Tier()) + return s.DummyProofProducer.RequestProof(opts, blockID, meta, header, s.Tier(), requestAt) } - proof, err := s.callProverDaemon(ctx, opts) + proof, err := s.callProverDaemon(ctx, opts, requestAt) if err != nil { return nil, err } @@ -107,58 +129,282 @@ func (s *SGXProofProducer) RequestProof( }, nil } -// callProverDaemon keeps polling the proverd service to get the requested proof. -func (s *SGXProofProducer) callProverDaemon(ctx context.Context, opts *ProofRequestOptions) ([]byte, error) { +// Aggregate implements the ProofProducer interface to aggregate a batch of proofs. +func (s *SGXProofProducer) Aggregate( + ctx context.Context, + items []*ProofWithHeader, + requestAt time.Time, +) (*BatchProofs, error) { + log.Info( + "Aggregate sgx batch proofs from raiko-host service", + "batchSize", len(items), + "firstID", items[0].BlockID, + "lastID", items[len(items)-1].BlockID, + "time", time.Since(requestAt), + ) + if len(items) == 0 { + return nil, ErrInvalidLength + } + + blockIDs := make([]*big.Int, len(items)) + for i, item := range items { + blockIDs[i] = item.Meta.GetBlockID() + } + batchProof, err := s.requestBatchProof( + ctx, + blockIDs, + items[0].Opts.ProverAddress, + items[0].Opts.Graffiti, + requestAt, + ) + if err != nil { + return nil, err + } + + metrics.ProverSgxProofAggregationGeneratedCounter.Add(1) + + return &BatchProofs{ + Proofs: items, + BatchProof: batchProof, + Tier: s.Tier(), + BlockIDs: blockIDs, + }, nil +} + +// RequestCancel implements the ProofProducer interface to cancel the proof generating progress. +func (s *SGXProofProducer) RequestCancel( + ctx context.Context, + opts *ProofRequestOptions, +) error { + reqBody := RaikoRequestProofBody{ + Type: s.ProofType, + Block: opts.BlockID, + Prover: opts.ProverAddress.Hex()[2:], + Graffiti: opts.Graffiti, + SGX: &SGXRequestProofBodyParam{ + Setup: false, + Bootstrap: false, + Prove: true, + }, + } + + client := &http.Client{} + + jsonValue, err := json.Marshal(reqBody) + if err != nil { + return err + } + + req, err := http.NewRequestWithContext( + ctx, + "POST", + s.RaikoHostEndpoint+"/v2/proof/cancel", + bytes.NewBuffer(jsonValue), + ) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + if len(s.JWT) > 0 { + req.Header.Set("Authorization", "Bearer "+base64.StdEncoding.EncodeToString([]byte(s.JWT))) + } + + res, err := client.Do(req) + if err != nil { + return err + } + + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return fmt.Errorf("failed to cancel requesting proof, statusCode: %d", res.StatusCode) + } + + return nil +} + +// requestBatchProof poll the proof aggregation service to get the aggregated proof. +func (s *SGXProofProducer) requestBatchProof( + ctx context.Context, + blockIDs []*big.Int, + proverAddress common.Address, + graffiti string, + requestAt time.Time, +) ([]byte, error) { var ( proof []byte - start = time.Now() ) - if err := backoff.Retry(func() error { - if ctx.Err() != nil { - return nil - } - output, err := s.requestProof(opts) - if err != nil { - log.Error("Failed to request proof", "height", opts.BlockID, "error", err, "endpoint", s.RaikoHostEndpoint) - return err - } - if output == nil { - log.Info( - "Proof generating", - "height", opts.BlockID, - "time", time.Since(start), - "producer", "SGXProofProducer", - ) - return errProofGenerating - } + ctx, cancel := rpc.CtxWithTimeoutOrDefault(ctx, s.RaikoRequestTimeout) + defer cancel() - log.Debug("Proof generation output", "output", output) + blocks := make([][2]*big.Int, len(blockIDs)) + for i := range blockIDs { + blocks[i][0] = blockIDs[i] + } + reqBody := RaikoRequestProofBodyV3{ + Type: s.ProofType, + Blocks: blocks, + Prover: proverAddress.Hex()[2:], + Graffiti: graffiti, + SGX: &SGXRequestProofBodyParam{ + Setup: false, + Bootstrap: false, + Prove: true, + }, + } - // Raiko returns "" as proof when proof type is native, - // so we just convert "" to bytes - if s.ProofType == ProofTypeCPU { - proof = common.Hex2Bytes(output.Data.Proof) - } else { - proof = common.Hex2Bytes(output.Data.Proof[2:]) - } + client := &http.Client{} + jsonValue, err := json.Marshal(reqBody) + if err != nil { + return nil, err + } + + log.Debug( + "Send batch proof generation request", + "blockIDs", blockIDs, + "proofType", "sgx", + "input", string(jsonValue), + ) + + req, err := http.NewRequestWithContext( + ctx, + "POST", + s.RaikoHostEndpoint+"/v3/proof", + bytes.NewBuffer(jsonValue), + ) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + if len(s.JWT) > 0 { + req.Header.Set("Authorization", "Bearer "+base64.StdEncoding.EncodeToString([]byte(s.JWT))) + } + + res, err := client.Do(req) + if err != nil { + return nil, err + } + + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return nil, fmt.Errorf("failed to request batch proof, ids: %v, statusCode: %d", blockIDs, res.StatusCode) + } + + resBytes, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + + log.Debug( + "Batch proof generation output", + "blockIDs", blockIDs, + "proofType", "sgx", + "output", string(resBytes), + ) + + var output RaikoRequestProofBodyResponseV2 + if err := json.Unmarshal(resBytes, &output); err != nil { + return nil, err + } + + if len(output.ErrorMessage) > 0 || len(output.Error) > 0 { + return nil, fmt.Errorf("failed to get sgx batch proof, err: %s, msg: %s", + output.Error, + output.ErrorMessage, + ) + } + + if output.Data == nil { + return nil, fmt.Errorf("unexpected structure error, response: %s", string(resBytes)) + } + if output.Data.Status == ErrProofInProgress.Error() { + return nil, ErrProofInProgress + } + if output.Data.Status == StatusRegistered { + return nil, ErrRetry + } + + if output.Data.Proof == nil || + len(output.Data.Proof.Proof) == 0 { + return nil, errEmptyProof + } + proof = common.Hex2Bytes(output.Data.Proof.Proof[2:]) + + log.Info( + "Batch proof generated", + "blockIDs", blockIDs, + "time", time.Since(requestAt), + "producer", "SGXProofProducer", + ) + metrics.ProverSGXAggregationGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + + return proof, nil +} + +// callProverDaemon keeps polling the proverd service to get the requested proof. +func (s *SGXProofProducer) callProverDaemon( + ctx context.Context, + opts *ProofRequestOptions, + requestAt time.Time, +) ([]byte, error) { + var ( + proof []byte + ) + + ctx, cancel := rpc.CtxWithTimeoutOrDefault(ctx, s.RaikoRequestTimeout) + defer cancel() + + output, err := s.requestProof(ctx, opts) + if err != nil { + log.Error("Failed to request proof", "blockID", opts.BlockID, "error", err, "endpoint", s.RaikoHostEndpoint) + return nil, err + } + + if output == nil { log.Info( - "Proof generated", - "height", opts.BlockID, - "time", time.Since(start), + "Proof generating", + "blockID", opts.BlockID, + "time", time.Since(requestAt), "producer", "SGXProofProducer", ) - return nil - }, backoff.WithContext(backoff.NewConstantBackOff(proofPollingInterval), ctx)); err != nil { - return nil, err + return nil, errProofGenerating + } + + if output.Data.Status == ErrProofInProgress.Error() { + return nil, ErrProofInProgress + } + if output.Data.Status == StatusRegistered { + return nil, ErrRetry + } + + // Raiko returns "" as proof when proof type is native, + // so we just convert "" to bytes + if s.ProofType == ProofTypeCPU { + proof = common.Hex2Bytes(output.Data.Proof.Proof) + } else { + if len(output.Data.Proof.Proof) == 0 { + return nil, errEmptyProof + } + proof = common.Hex2Bytes(output.Data.Proof.Proof[2:]) } + log.Info( + "Proof generated", + "blockID", opts.BlockID, + "time", time.Since(requestAt), + "producer", "SGXProofProducer", + ) + metrics.ProverSgxProofGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + return proof, nil } // requestProof sends a RPC request to proverd to try to get the requested proof. -func (s *SGXProofProducer) requestProof(opts *ProofRequestOptions) (*RaikoRequestProofBodyResponse, error) { +func (s *SGXProofProducer) requestProof( + ctx context.Context, + opts *ProofRequestOptions, +) (*RaikoRequestProofBodyResponseV2, error) { reqBody := RaikoRequestProofBody{ Type: s.ProofType, Block: opts.BlockID, @@ -178,7 +424,7 @@ func (s *SGXProofProducer) requestProof(opts *ProofRequestOptions) (*RaikoReques return nil, err } - req, err := http.NewRequest("POST", s.RaikoHostEndpoint+"/v1/proof", bytes.NewBuffer(jsonValue)) + req, err := http.NewRequestWithContext(ctx, "POST", s.RaikoHostEndpoint+"/v2/proof", bytes.NewBuffer(jsonValue)) if err != nil { return nil, err } @@ -202,13 +448,20 @@ func (s *SGXProofProducer) requestProof(opts *ProofRequestOptions) (*RaikoReques return nil, err } - var output RaikoRequestProofBodyResponse + log.Debug( + "Proof generation output", + "blockID", opts.BlockID, + "proofType", "sgx", + "output", string(resBytes), + ) + + var output RaikoRequestProofBodyResponseV2 if err := json.Unmarshal(resBytes, &output); err != nil { return nil, err } - if len(output.ErrorMessage) > 0 { - return nil, fmt.Errorf("failed to get proof, msg: %s", output.ErrorMessage) + if len(output.ErrorMessage) > 0 || len(output.Error) > 0 { + return nil, fmt.Errorf("failed to get sgx proof,err: %s, msg: %s", output.Error, output.ErrorMessage) } return &output, nil diff --git a/packages/taiko-client/prover/proof_producer/sgx_producer_test.go b/packages/taiko-client/prover/proof_producer/sgx_producer_test.go index de2f743c03e..19114cb4eec 100644 --- a/packages/taiko-client/prover/proof_producer/sgx_producer_test.go +++ b/packages/taiko-client/prover/proof_producer/sgx_producer_test.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/require" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) func TestSGXProducerRequestProof(t *testing.T) { @@ -39,8 +39,9 @@ func TestSGXProducerRequestProof(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) diff --git a/packages/taiko-client/prover/proof_producer/zkvm_producer.go b/packages/taiko-client/prover/proof_producer/zkvm_producer.go new file mode 100644 index 00000000000..76f06d8e2d7 --- /dev/null +++ b/packages/taiko-client/prover/proof_producer/zkvm_producer.go @@ -0,0 +1,539 @@ +package producer + +import ( + "bytes" + "context" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io" + "math/big" + "net/http" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" +) + +const ( + ZKProofTypeR0 = "risc0" + ZKProofTypeSP1 = "sp1" + RecursionPlonk = "plonk" + RecursionCompressed = "compressed" +) + +var ( + ErrProofInProgress = errors.New("work_in_progress") + ErrRetry = errors.New("retry") + StatusRegistered = "registered" +) + +// RaikoRequestProofBodyResponseV2 represents the JSON body of the response of the proof requests. +type RaikoRequestProofBodyResponseV2 struct { + Data *RaikoProofDataV2 `json:"data"` + ErrorMessage string `json:"message"` + Error string `json:"error"` +} + +type RaikoProofDataV2 struct { + Proof *ProofDataV2 `json:"proof"` //nolint:revive,stylecheck + Status string `json:"status"` +} + +type ProofDataV2 struct { + KzgProof string `json:"kzg_proof"` + Proof string `json:"proof"` + Quote string `json:"quote"` +} + +// ZKvmProofProducer generates a ZK proof for the given block. +type ZKvmProofProducer struct { + ZKProofType string // ZK Proof type + RaikoHostEndpoint string + RaikoRequestTimeout time.Duration + JWT string // JWT provided by Raiko + Dummy bool + DummyProofProducer +} + +// RequestProof implements the ProofProducer interface. +func (s *ZKvmProofProducer) RequestProof( + ctx context.Context, + opts *ProofRequestOptions, + blockID *big.Int, + meta metadata.TaikoBlockMetaData, + header *types.Header, + requestAt time.Time, +) (*ProofWithHeader, error) { + log.Info( + "Request zk proof from raiko-host service", + "blockID", blockID, + "coinbase", meta.GetCoinbase(), + "hash", header.Hash(), + "zkType", s.ZKProofType, + "time", time.Since(requestAt), + ) + + if s.Dummy { + return s.DummyProofProducer.RequestProof(opts, blockID, meta, header, s.Tier(), requestAt) + } + + proof, err := s.callProverDaemon(ctx, opts, requestAt) + if err != nil { + return nil, err + } + + if s.ZKProofType == ZKProofTypeR0 { + metrics.ProverR0ProofGeneratedCounter.Add(1) + } else if s.ZKProofType == ZKProofTypeSP1 { + metrics.ProverSp1ProofGeneratedCounter.Add(1) + } + + return &ProofWithHeader{ + BlockID: blockID, + Header: header, + Meta: meta, + Proof: proof, + Opts: opts, + Tier: s.Tier(), + }, nil +} + +// RequestCancel implements the ProofProducer interface to cancel the proof generating progress. +func (s *ZKvmProofProducer) RequestCancel( + ctx context.Context, + opts *ProofRequestOptions, +) error { + return s.requestCancel(ctx, opts) +} + +// Aggregate implements the ProofProducer interface to aggregate a batch of proofs. +func (s *ZKvmProofProducer) Aggregate( + ctx context.Context, + items []*ProofWithHeader, + requestAt time.Time, +) (*BatchProofs, error) { + log.Info( + "Aggregate zkvm batch proofs from raiko-host service", + "zkType", s.ZKProofType, + "batchSize", len(items), + "firstID", items[0].BlockID, + "lastID", items[len(items)-1].BlockID, + "time", time.Since(requestAt), + ) + if len(items) == 0 { + return nil, ErrInvalidLength + } + + blockIDs := make([]*big.Int, len(items)) + for i, item := range items { + blockIDs[i] = item.Meta.GetBlockID() + } + batchProof, err := s.requestBatchProof( + ctx, + blockIDs, + items[0].Opts.ProverAddress, + items[0].Opts.Graffiti, + requestAt, + ) + if err != nil { + return nil, err + } + + switch s.ZKProofType { + case ZKProofTypeSP1: + metrics.ProverSp1ProofAggregationGeneratedCounter.Add(1) + default: + metrics.ProverR0ProofAggregationGeneratedCounter.Add(1) + } + + return &BatchProofs{ + Proofs: items, + BatchProof: batchProof, + Tier: s.Tier(), + BlockIDs: blockIDs, + }, nil +} + +// callProverDaemon keeps polling the proverd service to get the requested proof. +func (s *ZKvmProofProducer) callProverDaemon( + ctx context.Context, + opts *ProofRequestOptions, + requestAt time.Time, +) ([]byte, error) { + var ( + proof []byte + ) + + zkCtx, zkCancel := rpc.CtxWithTimeoutOrDefault(ctx, s.RaikoRequestTimeout) + defer zkCancel() + + output, err := s.requestProof(zkCtx, opts) + if err != nil { + log.Error("Failed to request proof", "blockID", opts.BlockID, "error", err, "endpoint", s.RaikoHostEndpoint) + return nil, err + } + + if output.Data.Status == ErrProofInProgress.Error() { + return nil, ErrProofInProgress + } + if output.Data.Status == StatusRegistered { + return nil, ErrRetry + } + + if !opts.Compressed { + if len(output.Data.Proof.Proof) == 0 { + return nil, errEmptyProof + } + proof = common.Hex2Bytes(output.Data.Proof.Proof[2:]) + } + log.Info( + "Proof generated", + "blockID", opts.BlockID, + "time", time.Since(requestAt), + "producer", "ZKvmProofProducer", + ) + if s.ZKProofType == ZKProofTypeR0 { + metrics.ProverR0ProofGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + } else if s.ZKProofType == ZKProofTypeSP1 { + metrics.ProverSP1ProofGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + } + + return proof, nil +} + +// requestProof sends a RPC request to proverd to try to get the requested proof. +func (s *ZKvmProofProducer) requestProof( + ctx context.Context, + opts *ProofRequestOptions, +) (*RaikoRequestProofBodyResponseV2, error) { + var ( + reqBody RaikoRequestProofBody + recursion string + ) + if opts.Compressed { + recursion = RecursionCompressed + } else { + recursion = RecursionPlonk + } + switch s.ZKProofType { + case ZKProofTypeSP1: + reqBody = RaikoRequestProofBody{ + Type: s.ZKProofType, + Block: opts.BlockID, + Prover: opts.ProverAddress.Hex()[2:], + Graffiti: opts.Graffiti, + SP1: &SP1RequestProofBodyParam{ + Recursion: recursion, + Prover: "network", + Verify: true, + }, + } + default: + reqBody = RaikoRequestProofBody{ + Type: s.ZKProofType, + Block: opts.BlockID, + Prover: opts.ProverAddress.Hex()[2:], + Graffiti: opts.Graffiti, + RISC0: &RISC0RequestProofBodyParam{ + Bonsai: true, + Snark: true, + Profile: false, + ExecutionPo2: big.NewInt(20), + }, + } + } + + client := &http.Client{} + + jsonValue, err := json.Marshal(reqBody) + if err != nil { + return nil, err + } + + req, err := http.NewRequestWithContext(ctx, "POST", s.RaikoHostEndpoint+"/v2/proof", bytes.NewBuffer(jsonValue)) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + if len(s.JWT) > 0 { + req.Header.Set("Authorization", "Bearer "+base64.StdEncoding.EncodeToString([]byte(s.JWT))) + } + + log.Debug( + "Send proof generation request", + "blockID", opts.BlockID, + "zkProofType", s.ZKProofType, + "input", string(jsonValue), + ) + + res, err := client.Do(req) + if err != nil { + return nil, err + } + + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return nil, fmt.Errorf("failed to request proof, id: %d, statusCode: %d", opts.BlockID, res.StatusCode) + } + + resBytes, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + + log.Debug( + "Proof generation output", + "blockID", opts.BlockID, + "zkType", s.ZKProofType, + "output", string(resBytes), + ) + var output RaikoRequestProofBodyResponseV2 + if err := json.Unmarshal(resBytes, &output); err != nil { + return nil, err + } + + if len(output.ErrorMessage) > 0 || len(output.Error) > 0 { + return nil, fmt.Errorf("failed to get zk proof, err: %s, msg: %s, zkType: %s", + output.Error, + output.ErrorMessage, + s.ZKProofType, + ) + } + + return &output, nil +} + +func (s *ZKvmProofProducer) requestCancel( + ctx context.Context, + opts *ProofRequestOptions, +) error { + var ( + reqBody RaikoRequestProofBody + recursion string + ) + if opts.Compressed { + recursion = RecursionCompressed + } else { + recursion = RecursionPlonk + } + switch s.ZKProofType { + case ZKProofTypeSP1: + reqBody = RaikoRequestProofBody{ + Type: s.ZKProofType, + Block: opts.BlockID, + Prover: opts.ProverAddress.Hex()[2:], + Graffiti: opts.Graffiti, + SP1: &SP1RequestProofBodyParam{ + Recursion: recursion, + Prover: "network", + Verify: true, + }, + } + default: + reqBody = RaikoRequestProofBody{ + Type: s.ZKProofType, + Block: opts.BlockID, + Prover: opts.ProverAddress.Hex()[2:], + Graffiti: opts.Graffiti, + RISC0: &RISC0RequestProofBodyParam{ + Bonsai: true, + Snark: true, + Profile: false, + ExecutionPo2: big.NewInt(20), + }, + } + } + + client := &http.Client{} + + jsonValue, err := json.Marshal(reqBody) + if err != nil { + return err + } + + req, err := http.NewRequestWithContext( + ctx, + "POST", + s.RaikoHostEndpoint+"/v2/proof/cancel", + bytes.NewBuffer(jsonValue), + ) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + if len(s.JWT) > 0 { + req.Header.Set("Authorization", "Bearer "+base64.StdEncoding.EncodeToString([]byte(s.JWT))) + } + + res, err := client.Do(req) + if err != nil { + return err + } + + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return fmt.Errorf("failed to cancel requesting proof, statusCode: %d", res.StatusCode) + } + + return nil +} + +// requestBatchProof poll the proof aggregation service to get the aggregated proof. +func (s *ZKvmProofProducer) requestBatchProof( + ctx context.Context, + blockIDs []*big.Int, + proverAddress common.Address, + graffiti string, + requestAt time.Time, +) ([]byte, error) { + var ( + proof []byte + ) + + ctx, cancel := rpc.CtxWithTimeoutOrDefault(ctx, s.RaikoRequestTimeout) + defer cancel() + + blocks := make([][2]*big.Int, len(blockIDs)) + for i := range blockIDs { + blocks[i][0] = blockIDs[i] + } + var reqBody RaikoRequestProofBodyV3 + switch s.ZKProofType { + case ZKProofTypeSP1: + reqBody = RaikoRequestProofBodyV3{ + Type: s.ZKProofType, + Blocks: blocks, + Prover: proverAddress.Hex()[2:], + Graffiti: graffiti, + SP1: &SP1RequestProofBodyParam{ + Recursion: RecursionCompressed, + Prover: "network", + Verify: true, + }, + } + default: + reqBody = RaikoRequestProofBodyV3{ + Type: s.ZKProofType, + Blocks: blocks, + Prover: proverAddress.Hex()[2:], + Graffiti: graffiti, + RISC0: &RISC0RequestProofBodyParam{ + Bonsai: true, + Snark: true, + Profile: false, + ExecutionPo2: big.NewInt(20), + }, + } + } + + client := &http.Client{} + + jsonValue, err := json.Marshal(reqBody) + if err != nil { + return nil, err + } + + log.Debug( + "Send batch proof generation request", + "blockIDs", blockIDs, + "zkProofType", s.ZKProofType, + "input", string(jsonValue), + ) + + req, err := http.NewRequestWithContext( + ctx, + "POST", + s.RaikoHostEndpoint+"/v3/proof", + bytes.NewBuffer(jsonValue), + ) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + if len(s.JWT) > 0 { + req.Header.Set("Authorization", "Bearer "+base64.StdEncoding.EncodeToString([]byte(s.JWT))) + } + + res, err := client.Do(req) + if err != nil { + return nil, err + } + + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return nil, fmt.Errorf("failed to request batch proof, ids: %v, statusCode: %d", blockIDs, res.StatusCode) + } + + resBytes, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + + log.Debug( + "Batch proof generation output", + "blockIDs", blockIDs, + "zkProofType", s.ZKProofType, + "output", string(resBytes), + ) + + var output RaikoRequestProofBodyResponseV2 + if err := json.Unmarshal(resBytes, &output); err != nil { + return nil, err + } + + if len(output.ErrorMessage) > 0 || len(output.Error) > 0 { + return nil, fmt.Errorf("failed to get zk batch proof, err: %s, msg: %s, zkType: %s", + output.Error, + output.ErrorMessage, + s.ZKProofType, + ) + } + if output.Data == nil { + return nil, fmt.Errorf("unexpected structure error, response: %s", string(resBytes)) + } + + if output.Data.Status == ErrProofInProgress.Error() { + return nil, ErrProofInProgress + } + if output.Data.Status == StatusRegistered { + return nil, ErrRetry + } + + if output.Data.Proof == nil || len(output.Data.Proof.Proof) == 0 { + return nil, errEmptyProof + } + proof = common.Hex2Bytes(output.Data.Proof.Proof[2:]) + + log.Info( + "Batch proof generated", + "blockIDs", blockIDs, + "time", time.Since(requestAt), + "producer", "ZKvmProofProducer", + ) + + if s.ZKProofType == ZKProofTypeR0 { + metrics.ProverR0AggregationGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + } else if s.ZKProofType == ZKProofTypeSP1 { + metrics.ProverSP1AggregationGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + } + + return proof, nil +} + +// Tier implements the ProofProducer interface. +func (s *ZKvmProofProducer) Tier() uint16 { + switch s.ZKProofType { + case ZKProofTypeSP1: + return encoding.TierZkVMSp1ID + default: + return encoding.TierZkVMRisc0ID + } +} diff --git a/packages/taiko-client/prover/proof_submitter/interface.go b/packages/taiko-client/prover/proof_submitter/interface.go index 439c23be698..b60ec9c3919 100644 --- a/packages/taiko-client/prover/proof_submitter/interface.go +++ b/packages/taiko-client/prover/proof_submitter/interface.go @@ -6,16 +6,20 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" ) // Submitter is the interface for submitting proofs of the L2 blocks. type Submitter interface { - RequestProof(ctx context.Context, event *bindings.TaikoL1ClientBlockProposed) error + RequestProof(ctx context.Context, meta metadata.TaikoBlockMetaData) error SubmitProof(ctx context.Context, proofWithHeader *proofProducer.ProofWithHeader) error + BatchSubmitProofs(ctx context.Context, proofsWithHeaders *proofProducer.BatchProofs) error + AggregateProofs(ctx context.Context) error Producer() proofProducer.ProofProducer Tier() uint16 + BufferSize() uint64 + AggregationEnabled() bool } // Contester is the interface for contesting proofs of the L2 blocks. @@ -25,7 +29,7 @@ type Contester interface { blockID *big.Int, proposedIn *big.Int, parentHash common.Hash, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, tier uint16, ) error } diff --git a/packages/taiko-client/prover/proof_submitter/proof_buffer.go b/packages/taiko-client/prover/proof_submitter/proof_buffer.go new file mode 100644 index 00000000000..8f2d6d0cb72 --- /dev/null +++ b/packages/taiko-client/prover/proof_submitter/proof_buffer.go @@ -0,0 +1,122 @@ +package submitter + +import ( + "errors" + "sync" + "time" + + producer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" +) + +var ( + errBufferOverflow = errors.New("proof buffer overflow") + errNotEnoughProof = errors.New("not enough proof") +) + +// ProofBuffer caches all single proof with a fixed size. +type ProofBuffer struct { + MaxLength uint64 + buffer []*producer.ProofWithHeader + lastUpdatedAt time.Time + isAggregating bool + mutex sync.RWMutex +} + +// NewProofBuffer creates a new ProofBuffer instance. +func NewProofBuffer(maxLength uint64) *ProofBuffer { + return &ProofBuffer{ + buffer: make([]*producer.ProofWithHeader, 0, maxLength), + lastUpdatedAt: time.Now(), + MaxLength: maxLength, + } +} + +// Write adds new item to the buffer. +func (pb *ProofBuffer) Write(item *producer.ProofWithHeader) (int, error) { + pb.mutex.Lock() + defer pb.mutex.Unlock() + + if len(pb.buffer)+1 > int(pb.MaxLength) { + return len(pb.buffer), errBufferOverflow + } + + pb.buffer = append(pb.buffer, item) + pb.lastUpdatedAt = time.Now() + return len(pb.buffer), nil +} + +// Read returns the content with given length in the buffer. +func (pb *ProofBuffer) Read(length int) ([]*producer.ProofWithHeader, error) { + pb.mutex.RLock() + defer pb.mutex.RUnlock() + if length > len(pb.buffer) { + return nil, errNotEnoughProof + } + + data := make([]*producer.ProofWithHeader, length) + copy(data, pb.buffer[:length]) + return data, nil +} + +// ReadAll returns all the content in the buffer. +func (pb *ProofBuffer) ReadAll() ([]*producer.ProofWithHeader, error) { + return pb.Read(pb.Len()) +} + +// Len returns current length of the buffer. +func (pb *ProofBuffer) Len() int { + pb.mutex.RLock() + defer pb.mutex.RUnlock() + return len(pb.buffer) +} + +// LastUpdatedAt returns the last updated time of the buffer. +func (pb *ProofBuffer) LastUpdatedAt() time.Time { + return pb.lastUpdatedAt +} + +// LastUpdatedAt returns the last updated time of the buffer. +func (pb *ProofBuffer) UpdateLastUpdatedAt() { + pb.lastUpdatedAt = time.Now() +} + +// ClearItems clears items that has given block ids in the buffer. +func (pb *ProofBuffer) ClearItems(blockIDs ...uint64) int { + pb.mutex.Lock() + defer pb.mutex.Unlock() + + clearMap := make(map[uint64]bool) + for _, blockID := range blockIDs { + clearMap[blockID] = true + } + + newBuffer := make([]*producer.ProofWithHeader, 0, len(pb.buffer)) + clearedCount := 0 + + for _, b := range pb.buffer { + if !clearMap[b.Meta.GetBlockID().Uint64()] { + newBuffer = append(newBuffer, b) + } else { + clearedCount++ + } + } + + pb.buffer = newBuffer + pb.isAggregating = false + return clearedCount +} + +// MarkAggregating marks the proofs in this buffer are aggregating. +func (pb *ProofBuffer) MarkAggregating() { + pb.isAggregating = true +} + +// IsAggregating returns if the proofs in this buffer are aggregating. +func (pb *ProofBuffer) IsAggregating() bool { + return pb.isAggregating +} + +// Enabled returns if the buffer is enabled. +func (pb *ProofBuffer) Enabled() bool { + return pb.MaxLength > 1 +} diff --git a/packages/taiko-client/prover/proof_submitter/proof_contester.go b/packages/taiko-client/prover/proof_submitter/proof_contester.go index d9357b8b118..a68b57b1056 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_contester.go +++ b/packages/taiko-client/prover/proof_submitter/proof_contester.go @@ -12,6 +12,7 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_submitter/transaction" @@ -32,6 +33,7 @@ func NewProofContester( rpcClient *rpc.Client, gasLimit uint64, txmgr *txmgr.SimpleTxManager, + privateTxmgr *txmgr.SimpleTxManager, proverSetAddress common.Address, graffiti string, builder *transaction.ProveBlockTxBuilder, @@ -39,7 +41,7 @@ func NewProofContester( return &ProofContester{ rpc: rpcClient, txBuilder: builder, - sender: transaction.NewSender(rpcClient, txmgr, proverSetAddress, gasLimit), + sender: transaction.NewSender(rpcClient, txmgr, privateTxmgr, proverSetAddress, gasLimit), graffiti: rpc.StringToBytes32(graffiti), } } @@ -50,7 +52,7 @@ func (c *ProofContester) SubmitContest( blockID *big.Int, proposedIn *big.Int, parentHash common.Hash, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, tier uint16, ) error { // Ensure the transition has not been contested yet. @@ -92,7 +94,6 @@ func (c *ProofContester) SubmitContest( if err != nil { return err } - return c.sender.Send( ctx, &proofProducer.ProofWithHeader{ diff --git a/packages/taiko-client/prover/proof_submitter/proof_contester_test.go b/packages/taiko-client/prover/proof_submitter/proof_contester_test.go index 79ba21f3f6c..6c836a2b5f3 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_contester_test.go +++ b/packages/taiko-client/prover/proof_submitter/proof_contester_test.go @@ -5,8 +5,8 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" ) @@ -17,7 +17,7 @@ func (s *ProofSubmitterTestSuite) TestSubmitContestNoTransition() { common.Big256, common.Big1, testutils.RandomHash(), - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, encoding.TierOptimisticID, ), ) diff --git a/packages/taiko-client/prover/proof_submitter/proof_submitter.go b/packages/taiko-client/prover/proof_submitter/proof_submitter.go index 25dd644ab41..698d1d7b026 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_submitter.go +++ b/packages/taiko-client/prover/proof_submitter/proof_submitter.go @@ -8,12 +8,15 @@ import ( "math/big" "time" + "github.com/cenkalti/backoff/v4" "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" validator "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/anchor_tx_validator" @@ -25,25 +28,33 @@ import ( var ( _ Submitter = (*ProofSubmitter)(nil) submissionDelayRandomBumpRange float64 = 20 + proofPollingInterval = 10 * time.Second + ProofTimeout = 3 * time.Hour + ErrInvalidProof = errors.New("invalid proof found") ) // ProofSubmitter is responsible requesting proofs for the given L2 // blocks, and submitting the generated proofs to the TaikoL1 smart contract. type ProofSubmitter struct { - rpc *rpc.Client - proofProducer proofProducer.ProofProducer - resultCh chan *proofProducer.ProofWithHeader - anchorValidator *validator.AnchorTxValidator - txBuilder *transaction.ProveBlockTxBuilder - sender *transaction.Sender - proverAddress common.Address - proverSetAddress common.Address - taikoL2Address common.Address - graffiti [32]byte - tiers []*rpc.TierProviderTierWithID + rpc *rpc.Client + proofProducer proofProducer.ProofProducer + resultCh chan *proofProducer.ProofWithHeader + batchResultCh chan *proofProducer.BatchProofs + aggregationNotify chan uint16 + anchorValidator *validator.AnchorTxValidator + txBuilder *transaction.ProveBlockTxBuilder + sender *transaction.Sender + proverAddress common.Address + proverSetAddress common.Address + taikoL2Address common.Address + graffiti [32]byte + tiers []*rpc.TierProviderTierWithID // Guardian prover related. isGuardian bool submissionDelay time.Duration + // Batch proof related + proofBuffer *ProofBuffer + forceBatchProvingInterval time.Duration } // NewProofSubmitter creates a new ProofSubmitter instance. @@ -51,15 +62,20 @@ func NewProofSubmitter( rpcClient *rpc.Client, proofProducer proofProducer.ProofProducer, resultCh chan *proofProducer.ProofWithHeader, + batchResultCh chan *proofProducer.BatchProofs, + aggregationNotify chan uint16, proverSetAddress common.Address, taikoL2Address common.Address, graffiti string, gasLimit uint64, txmgr *txmgr.SimpleTxManager, + privateTxmgr *txmgr.SimpleTxManager, builder *transaction.ProveBlockTxBuilder, tiers []*rpc.TierProviderTierWithID, isGuardian bool, submissionDelay time.Duration, + proofBufferSize uint64, + forceBatchProvingInterval time.Duration, ) (*ProofSubmitter, error) { anchorValidator, err := validator.New(taikoL2Address, rpcClient.L2.ChainID, rpcClient) if err != nil { @@ -67,27 +83,35 @@ func NewProofSubmitter( } return &ProofSubmitter{ - rpc: rpcClient, - proofProducer: proofProducer, - resultCh: resultCh, - anchorValidator: anchorValidator, - txBuilder: builder, - sender: transaction.NewSender(rpcClient, txmgr, proverSetAddress, gasLimit), - proverAddress: txmgr.From(), - proverSetAddress: proverSetAddress, - taikoL2Address: taikoL2Address, - graffiti: rpc.StringToBytes32(graffiti), - tiers: tiers, - isGuardian: isGuardian, - submissionDelay: submissionDelay, + rpc: rpcClient, + proofProducer: proofProducer, + resultCh: resultCh, + batchResultCh: batchResultCh, + aggregationNotify: aggregationNotify, + anchorValidator: anchorValidator, + txBuilder: builder, + sender: transaction.NewSender(rpcClient, txmgr, privateTxmgr, proverSetAddress, gasLimit), + proverAddress: txmgr.From(), + proverSetAddress: proverSetAddress, + taikoL2Address: taikoL2Address, + graffiti: rpc.StringToBytes32(graffiti), + tiers: tiers, + isGuardian: isGuardian, + submissionDelay: submissionDelay, + proofBuffer: NewProofBuffer(proofBufferSize), + forceBatchProvingInterval: forceBatchProvingInterval, }, nil } // RequestProof implements the Submitter interface. -func (s *ProofSubmitter) RequestProof(ctx context.Context, event *bindings.TaikoL1ClientBlockProposed) error { - header, err := s.rpc.WaitL2Header(ctx, event.BlockId) +func (s *ProofSubmitter) RequestProof(ctx context.Context, meta metadata.TaikoBlockMetaData) error { + var ( + blockInfo bindings.TaikoDataBlockV2 + ) + + header, err := s.rpc.WaitL2Header(ctx, meta.GetBlockID()) if err != nil { - return fmt.Errorf("failed to fetch l2 Header, blockID: %d, error: %w", event.BlockId, err) + return fmt.Errorf("failed to fetch l2 Header, blockID: %d, error: %w", meta.GetBlockID(), err) } if header.TxHash == types.EmptyTxsHash { @@ -99,8 +123,7 @@ func (s *ProofSubmitter) RequestProof(ctx context.Context, event *bindings.Taiko return fmt.Errorf("failed to get the L2 parent block by hash (%s): %w", header.ParentHash, err) } - blockInfo, err := s.rpc.GetL2BlockInfo(ctx, event.BlockId) - if err != nil { + if blockInfo, err = s.rpc.GetL2BlockInfoV2(ctx, meta.GetBlockID()); err != nil { return err } @@ -108,37 +131,112 @@ func (s *ProofSubmitter) RequestProof(ctx context.Context, event *bindings.Taiko opts := &proofProducer.ProofRequestOptions{ BlockID: header.Number, ProverAddress: s.proverAddress, - ProposeBlockTxHash: event.Raw.TxHash, + ProposeBlockTxHash: meta.GetTxHash(), TaikoL2: s.taikoL2Address, MetaHash: blockInfo.MetaHash, BlockHash: header.Hash(), ParentHash: header.ParentHash, StateRoot: header.Root, - EventL1Hash: event.Raw.BlockHash, + EventL1Hash: meta.GetRawBlockHash(), Graffiti: common.Bytes2Hex(s.graffiti[:]), GasUsed: header.GasUsed, ParentGasUsed: parent.GasUsed(), + Compressed: s.proofBuffer.Enabled(), } // If the prover set address is provided, we use that address as the prover on chain. if s.proverSetAddress != rpc.ZeroAddress { opts.ProverAddress = s.proverSetAddress } + startTime := time.Now() // Send the generated proof. - result, err := s.proofProducer.RequestProof( - ctx, - opts, - event.BlockId, - &event.Meta, - header, - ) - if err != nil { - return fmt.Errorf("failed to request proof (id: %d): %w", event.BlockId, err) + if err := backoff.Retry( + func() error { + if ctx.Err() != nil { + log.Error("Failed to request proof, context is canceled", "blockID", opts.BlockID, "error", ctx.Err()) + return nil + } + // Check if the proof buffer is full. + if s.proofBuffer.Enabled() && uint64(s.proofBuffer.Len()) >= s.proofBuffer.MaxLength { + log.Warn( + "Proof buffer is full now", + "blockID", meta.GetBlockID(), + "tier", meta.GetMinTier(), + "size", s.proofBuffer.Len(), + ) + return errBufferOverflow + } + // Check if there is a need to generate proof + proofStatus, err := rpc.GetBlockProofStatus( + ctx, + s.rpc, + opts.BlockID, + opts.ProverAddress, + s.proverSetAddress, + ) + if err != nil { + return err + } + if proofStatus.IsSubmitted && !proofStatus.Invalid { + return nil + } + + result, err := s.proofProducer.RequestProof( + ctx, + opts, + meta.GetBlockID(), + meta, + header, + startTime, + ) + if err != nil { + // If request proof has timed out in retry, let's cancel the proof generating and skip + if errors.Is(err, proofProducer.ErrProofInProgress) && time.Since(startTime) >= ProofTimeout { + log.Error("Request proof has timed out, start to cancel", "blockID", opts.BlockID) + if cancelErr := s.proofProducer.RequestCancel(ctx, opts); cancelErr != nil { + log.Error("Failed to request cancellation of proof", "err", cancelErr) + } + return nil + } + return fmt.Errorf("failed to request proof (id: %d): %w", meta.GetBlockID(), err) + } + if s.proofBuffer.Enabled() { + bufferSize, err := s.proofBuffer.Write(result) + if err != nil { + return fmt.Errorf( + "failed to add proof into buffer (id: %d) (current buffer size: %d): %w", + meta.GetBlockID(), + bufferSize, + err, + ) + } + log.Info( + "Proof generated", + "blockID", meta.GetBlockID(), + "bufferSize", bufferSize, + "maxBufferSize", s.proofBuffer.MaxLength, + "bufferIsAggregating", s.proofBuffer.IsAggregating(), + "bufferLastUpdatedAt", s.proofBuffer.lastUpdatedAt, + ) + // Check if we need to aggregate proofs. + if !s.proofBuffer.IsAggregating() && + (uint64(bufferSize) >= s.proofBuffer.MaxLength || + time.Since(s.proofBuffer.lastUpdatedAt) > s.forceBatchProvingInterval) { + s.aggregationNotify <- s.Tier() + s.proofBuffer.MarkAggregating() + } + } else { + s.resultCh <- result + } + metrics.ProverQueuedProofCounter.Add(1) + return nil + }, + backoff.WithContext(backoff.NewConstantBackOff(proofPollingInterval), ctx), + ); err != nil { + log.Error("Request proof error", "error", err) + return err } - s.resultCh <- result - - metrics.ProverQueuedProofCounter.Add(1) return nil } @@ -151,7 +249,7 @@ func (s *ProofSubmitter) SubmitProof( log.Info( "Submit block proof", "blockID", proofWithHeader.BlockID, - "coinbase", proofWithHeader.Meta.Coinbase, + "coinbase", proofWithHeader.Meta.GetCoinbase(), "parentHash", proofWithHeader.Header.ParentHash, "hash", proofWithHeader.Opts.BlockHash, "stateRoot", proofWithHeader.Opts.StateRoot, @@ -178,9 +276,10 @@ func (s *ProofSubmitter) SubmitProof( if err != nil { return err } - delayTimer := time.After(submissionDelay) - <-delayTimer - // Check again. + // Wait for the submission delay. + <-time.After(submissionDelay) + + // Check the proof submission status again. proofStatus, err := rpc.GetBlockProofStatus( ctx, s.rpc, @@ -247,6 +346,165 @@ func (s *ProofSubmitter) SubmitProof( return nil } +// BatchSubmitProofs implements the Submitter interface to submit proof aggregation. +func (s *ProofSubmitter) BatchSubmitProofs(ctx context.Context, batchProof *proofProducer.BatchProofs) error { + log.Info( + "Batch submit block proofs", + "proof", common.Bytes2Hex(batchProof.BatchProof), + "size", len(batchProof.Proofs), + "firstID", batchProof.BlockIDs[0], + "lastID", batchProof.BlockIDs[len(batchProof.BlockIDs)-1], + "tier", batchProof.Tier, + ) + var ( + invalidBlockIDs []uint64 + latestProvenBlockID = common.Big0 + uint64BlockIDs []uint64 + ) + if len(batchProof.Proofs) == 0 { + return proofProducer.ErrInvalidLength + } + // Check if the proof has already been submitted. + proofStatus, err := rpc.BatchGetBlocksProofStatus( + ctx, + s.rpc, + batchProof.BlockIDs, + batchProof.Proofs[0].Opts.ProverAddress, + s.proverSetAddress, + ) + if err != nil { + return err + } + stateVars, err := s.rpc.GetProtocolStateVariables(&bind.CallOpts{Context: ctx}) + if err != nil { + log.Warn( + "Failed to fetch state variables", + "error", err, + ) + return err + } + for i, proof := range batchProof.Proofs { + uint64BlockIDs = append(uint64BlockIDs, proof.BlockID.Uint64()) + // Check if this proof is still needed to be submitted. + ok, err := s.sender.ValidateProof(ctx, proof, new(big.Int).SetUint64(stateVars.B.LastVerifiedBlockId)) + if err != nil { + return err + } + if !ok { + log.Error("A valid proof for block is already submitted", "blockId", proof.BlockID) + invalidBlockIDs = append(invalidBlockIDs, proof.BlockID.Uint64()) + continue + } + + if proofStatus[i].IsSubmitted && !proofStatus[i].Invalid { + log.Error("A valid proof for block is already submitted", "blockId", proof.BlockID) + invalidBlockIDs = append(invalidBlockIDs, proof.BlockID.Uint64()) + continue + } + + // Get the corresponding L2 block. + block, err := s.rpc.L2.BlockByHash(ctx, proof.Header.Hash()) + if err != nil { + log.Error( + "Failed to get L2 block with given hash", + "hash", proof.Header.Hash(), + "error", err, + ) + invalidBlockIDs = append(invalidBlockIDs, proof.BlockID.Uint64()) + continue + } + + if block.Transactions().Len() == 0 { + log.Error("Invalid block without anchor transaction, blockID", "blockId", proof.BlockID) + invalidBlockIDs = append(invalidBlockIDs, proof.BlockID.Uint64()) + continue + } + + // Validate TaikoL2.anchor transaction inside the L2 block. + anchorTx := block.Transactions()[0] + if err = s.anchorValidator.ValidateAnchorTx(anchorTx); err != nil { + log.Error("Invalid anchor transaction", "error", err) + invalidBlockIDs = append(invalidBlockIDs, proof.BlockID.Uint64()) + } + if proof.BlockID.Cmp(latestProvenBlockID) > 0 { + latestProvenBlockID = proof.BlockID + } + } + + if len(invalidBlockIDs) > 0 { + log.Warn("Invalid proofs in batch", "blockIds", invalidBlockIDs) + s.proofBuffer.ClearItems(invalidBlockIDs...) + return ErrInvalidProof + } + + // Build the TaikoL1.proveBlocks transaction and send it to the L1 node. + if err := s.sender.SendBatchProof( + ctx, + s.txBuilder.BuildProveBlocks(batchProof, s.graffiti), + batchProof, + ); err != nil { + if err.Error() == transaction.ErrUnretryableSubmission.Error() { + return nil + } + metrics.ProverAggregationSubmissionErrorCounter.Add(1) + return err + } + + metrics.ProverSentProofCounter.Add(float64(len(batchProof.BlockIDs))) + metrics.ProverLatestProvenBlockIDGauge.Set(float64(latestProvenBlockID.Uint64())) + s.proofBuffer.ClearItems(uint64BlockIDs...) + // Each time we submit a batch proof, we should update the LastUpdatedAt() of the buffer. + s.proofBuffer.UpdateLastUpdatedAt() + + return nil +} + +// AggregateProofs read all data from buffer and aggregate them. +func (s *ProofSubmitter) AggregateProofs(ctx context.Context) error { + startTime := time.Now() + if err := backoff.Retry( + func() error { + buffer, err := s.proofBuffer.ReadAll() + if err != nil { + return fmt.Errorf("failed to read proof from buffer: %w", err) + } + if len(buffer) == 0 { + log.Debug("Buffer is empty now, skip aggregating") + return nil + } + + result, err := s.proofProducer.Aggregate( + ctx, + buffer, + startTime, + ) + if err != nil { + if errors.Is(err, proofProducer.ErrProofInProgress) || + errors.Is(err, proofProducer.ErrRetry) { + log.Info( + "Aggregating proofs", + "status", err, + "batchSize", len(buffer), + "firstID", buffer[0].BlockID, + "lastID", buffer[len(buffer)-1].BlockID, + "tier", s.Tier(), + ) + } else { + log.Error("Failed to request proof aggregation", "err", err) + } + return err + } + s.batchResultCh <- result + return nil + }, + backoff.WithContext(backoff.NewConstantBackOff(proofPollingInterval), ctx), + ); err != nil { + log.Error("Aggregate proof error", "error", err) + return err + } + return nil +} + // getRandomBumpedSubmissionDelay returns a random bumped submission delay. func (s *ProofSubmitter) getRandomBumpedSubmissionDelay(expiredAt time.Time) (time.Duration, error) { if s.submissionDelay == 0 { @@ -279,3 +537,13 @@ func (s *ProofSubmitter) Producer() proofProducer.ProofProducer { func (s *ProofSubmitter) Tier() uint16 { return s.proofProducer.Tier() } + +// BufferSize returns the size of the proof buffer. +func (s *ProofSubmitter) BufferSize() uint64 { + return s.proofBuffer.MaxLength +} + +// AggregationEnabled returns whether the proof submitter's aggregation feature is enabled. +func (s *ProofSubmitter) AggregationEnabled() bool { + return s.proofBuffer.Enabled() +} diff --git a/packages/taiko-client/prover/proof_submitter/proof_submitter_test.go b/packages/taiko-client/prover/proof_submitter/proof_submitter_test.go index c101e0fe5b2..bbf390dc088 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_submitter_test.go +++ b/packages/taiko-client/prover/proof_submitter/proof_submitter_test.go @@ -17,10 +17,12 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer/beaconsync" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer/blob" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer" producer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" @@ -29,24 +31,28 @@ import ( type ProofSubmitterTestSuite struct { testutils.ClientTestSuite - submitter *ProofSubmitter - contester *ProofContester - blobSyncer *blob.Syncer - proposer *proposer.Proposer - proofCh chan *producer.ProofWithHeader + submitter *ProofSubmitter + contester *ProofContester + blobSyncer *blob.Syncer + proposer *proposer.Proposer + proofCh chan *producer.ProofWithHeader + batchProofGenerationCh chan *producer.BatchProofs + aggregationNotify chan uint16 } func (s *ProofSubmitterTestSuite) SetupTest() { s.ClientTestSuite.SetupTest() s.proofCh = make(chan *producer.ProofWithHeader, 1024) + s.batchProofGenerationCh = make(chan *producer.BatchProofs, 1024) + s.aggregationNotify = make(chan uint16, 1) builder := transaction.NewProveBlockTxBuilder( s.RPCClient, - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS")), - common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY_ADDRESS")), + common.HexToAddress(os.Getenv("TAIKO_L1")), + common.Address{}, + common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")), + common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY")), ) l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) @@ -57,7 +63,7 @@ func (s *ProofSubmitterTestSuite) SetupTest() { log.Root(), new(metrics.NoopTxMetrics), txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProverPrivKey)), @@ -81,21 +87,27 @@ func (s *ProofSubmitterTestSuite) SetupTest() { s.RPCClient, &producer.OptimisticProofProducer{}, s.proofCh, + s.batchProofGenerationCh, + s.aggregationNotify, rpc.ZeroAddress, - common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), + common.HexToAddress(os.Getenv("TAIKO_L2")), "test", 0, txMgr, + nil, builder, tiers, false, 0*time.Second, + 0, + 30*time.Minute, ) s.Nil(err) s.contester = NewProofContester( s.RPCClient, 0, txMgr, + nil, rpc.ZeroAddress, "test", builder, @@ -123,43 +135,25 @@ func (s *ProofSubmitterTestSuite) SetupTest() { prop := new(proposer.Proposer) l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) s.Nil(err) + jwtSecret, err := jwt.ParseSecretFromFile(os.Getenv("JWT_SECRET")) + s.Nil(err) + s.NotEmpty(jwtSecret) s.Nil(prop.InitFromConfig(context.Background(), &proposer.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), + JwtSecret: string(jwtSecret), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: s.ProverEndpoints, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - MaxTierFeePriceBumps: 3, - TierFeePriceBump: common.Big2, - L1BlockBuilderTip: common.Big0, - TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), - NumConfirmations: 0, - SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, - PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), - FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, - FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, - MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, - MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, - ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, - ReceiptQueryInterval: 1 * time.Second, - NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, - TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, - TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, - }, - })) + }, txMgr, txMgr)) s.proposer = prop } @@ -172,7 +166,7 @@ func (s *ProofSubmitterTestSuite) TestGetRandomBumpedSubmissionDelay() { log.Root(), new(metrics.NoopTxMetrics), txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProverPrivKey)), @@ -193,15 +187,20 @@ func (s *ProofSubmitterTestSuite) TestGetRandomBumpedSubmissionDelay() { s.RPCClient, &producer.OptimisticProofProducer{}, s.proofCh, - common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), + s.batchProofGenerationCh, + s.aggregationNotify, + common.Address{}, + common.HexToAddress(os.Getenv("TAIKO_L2")), "test", 0, txMgr, + nil, s.submitter.txBuilder, s.submitter.tiers, false, time.Duration(0), + 0, + 30*time.Minute, ) s.Nil(err) @@ -213,15 +212,20 @@ func (s *ProofSubmitterTestSuite) TestGetRandomBumpedSubmissionDelay() { s.RPCClient, &producer.OptimisticProofProducer{}, s.proofCh, - common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), + s.batchProofGenerationCh, + s.aggregationNotify, + common.Address{}, + common.HexToAddress(os.Getenv("TAIKO_L2")), "test", 0, txMgr, + nil, s.submitter.txBuilder, s.submitter.tiers, false, 1*time.Hour, + 0, + 30*time.Minute, ) s.Nil(err) delay, err = submitter2.getRandomBumpedSubmissionDelay(time.Now()) @@ -240,7 +244,10 @@ func (s *ProofSubmitterTestSuite) TestProofSubmitterRequestProofDeadlineExceeded s.ErrorContains( s.submitter.RequestProof( - ctx, &bindings.TaikoL1ClientBlockProposed{BlockId: common.Big256}), "context deadline exceeded", + ctx, + &metadata.TaikoDataBlockMetadataOntake{TaikoDataBlockMetadataV2: bindings.TaikoDataBlockMetadataV2{Id: 256}}, + ), + "context deadline exceeded", ) } @@ -249,7 +256,7 @@ func (s *ProofSubmitterTestSuite) TestProofSubmitterSubmitProofMetadataNotFound( s.submitter.SubmitProof( context.Background(), &producer.ProofWithHeader{ BlockID: common.Big256, - Meta: &bindings.TaikoDataBlockMetadata{}, + Meta: &metadata.TaikoDataBlockMetadataOntake{}, Header: &types.Header{}, Opts: &producer.ProofRequestOptions{}, Proof: bytes.Repeat([]byte{0xff}, 100), @@ -259,22 +266,16 @@ func (s *ProofSubmitterTestSuite) TestProofSubmitterSubmitProofMetadataNotFound( } func (s *ProofSubmitterTestSuite) TestSubmitProofs() { - s.T().Skip("Skipping, preconfer changes") - events := s.ProposeAndInsertEmptyBlocks(s.proposer, s.blobSyncer) - - for _, e := range events { - s.Nil(s.submitter.RequestProof(context.Background(), e)) + for _, m := range s.ProposeAndInsertEmptyBlocks(s.proposer, s.blobSyncer) { + s.Nil(s.submitter.RequestProof(context.Background(), m)) proofWithHeader := <-s.proofCh s.Nil(s.submitter.SubmitProof(context.Background(), proofWithHeader)) } } func (s *ProofSubmitterTestSuite) TestGuardianSubmitProofs() { - s.T().Skip("Skipping, preconfer changes") - events := s.ProposeAndInsertEmptyBlocks(s.proposer, s.blobSyncer) - - for _, e := range events { - s.Nil(s.submitter.RequestProof(context.Background(), e)) + for _, m := range s.ProposeAndInsertEmptyBlocks(s.proposer, s.blobSyncer) { + s.Nil(s.submitter.RequestProof(context.Background(), m)) proofWithHeader := <-s.proofCh proofWithHeader.Tier = encoding.TierGuardianMajorityID s.Nil(s.submitter.SubmitProof(context.Background(), proofWithHeader)) @@ -287,7 +288,10 @@ func (s *ProofSubmitterTestSuite) TestProofSubmitterRequestProofCancelled() { s.ErrorContains( s.submitter.RequestProof( - ctx, &bindings.TaikoL1ClientBlockProposed{BlockId: common.Big256}), "context canceled", + ctx, + &metadata.TaikoDataBlockMetadataOntake{TaikoDataBlockMetadataV2: bindings.TaikoDataBlockMetadataV2{Id: 256}}, + ), + "context canceled", ) } diff --git a/packages/taiko-client/prover/proof_submitter/transaction/builder.go b/packages/taiko-client/prover/proof_submitter/transaction/builder.go index 86b2104e90c..795edd55588 100644 --- a/packages/taiko-client/prover/proof_submitter/transaction/builder.go +++ b/packages/taiko-client/prover/proof_submitter/transaction/builder.go @@ -12,7 +12,9 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" ) var ( @@ -52,7 +54,7 @@ func NewProveBlockTxBuilder( // Build creates a new TaikoL1.ProveBlock transaction with the given nonce. func (a *ProveBlockTxBuilder) Build( blockID *big.Int, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, transition *bindings.TaikoDataTransition, tierProof *bindings.TaikoDataTierProof, tier uint16, @@ -79,12 +81,22 @@ func (a *ProveBlockTxBuilder) Build( } if a.proverSetAddress != ZeroAddress { - if data, err = encoding.ProverSetABI.Pack("proveBlock", blockID.Uint64(), input); err != nil { + if data, err = encoding.ProverSetABI.Pack( + "proveBlocks", + []uint64{blockID.Uint64()}, + [][]byte{input}, + []byte{}, + ); err != nil { return nil, err } to = a.proverSetAddress } else { - if data, err = encoding.TaikoL1ABI.Pack("proveBlock", blockID.Uint64(), input); err != nil { + if data, err = encoding.TaikoL1ABI.Pack( + "proveBlocks", + []uint64{blockID.Uint64()}, + [][]byte{input}, + []byte{}, + ); err != nil { return nil, err } to = a.taikoL1Address @@ -97,9 +109,88 @@ func (a *ProveBlockTxBuilder) Build( } else { return nil, fmt.Errorf("tier %d need set guardianProverMinorityAddress", tier) } - if data, err = encoding.GuardianProverABI.Pack("approve", *meta, *transition, *tierProof); err != nil { + + if data, err = encoding.GuardianProverABI.Pack( + "approveV2", + meta.(*metadata.TaikoDataBlockMetadataOntake).InnerMetadata(), + *transition, + *tierProof, + ); err != nil { + return nil, err + } + } + + return &txmgr.TxCandidate{ + TxData: data, + To: &to, + Blobs: nil, + GasLimit: txOpts.GasLimit, + Value: txOpts.Value, + }, nil + } +} + +// BuildProveBlocks creates a new TaikoL1.ProveBlocks transaction. +func (a *ProveBlockTxBuilder) BuildProveBlocks( + batchProof *proofProducer.BatchProofs, + graffiti [32]byte, +) TxBuilder { + return func(txOpts *bind.TransactOpts) (*txmgr.TxCandidate, error) { + var ( + data []byte + to common.Address + err error + metas = make([]metadata.TaikoBlockMetaData, len(batchProof.Proofs)) + transitions = make([]bindings.TaikoDataTransition, len(batchProof.Proofs)) + blockIDs = make([]uint64, len(batchProof.Proofs)) + ) + for i, proof := range batchProof.Proofs { + metas[i] = proof.Meta + transitions[i] = bindings.TaikoDataTransition{ + ParentHash: proof.Header.ParentHash, + BlockHash: proof.Opts.BlockHash, + StateRoot: proof.Opts.StateRoot, + Graffiti: graffiti, + } + blockIDs[i] = proof.BlockID.Uint64() + } + log.Info( + "Build batch proof submission transaction", + "blockIDs", blockIDs, + "gasLimit", txOpts.GasLimit, + ) + input, err := encoding.EncodeProveBlocksInput(metas, transitions) + if err != nil { + return nil, err + } + tierProof, err := encoding.EncodeProveBlocksBatchProof(&bindings.TaikoDataTierProof{ + Tier: batchProof.Tier, + Data: batchProof.BatchProof, + }) + if err != nil { + return nil, err + } + + if a.proverSetAddress != ZeroAddress { + if data, err = encoding.ProverSetABI.Pack( + "proveBlocks", + blockIDs, + input, + tierProof, + ); err != nil { + return nil, err + } + to = a.proverSetAddress + } else { + if data, err = encoding.TaikoL1ABI.Pack( + "proveBlocks", + blockIDs, + input, + tierProof, + ); err != nil { return nil, err } + to = a.taikoL1Address } return &txmgr.TxCandidate{ diff --git a/packages/taiko-client/prover/proof_submitter/transaction/builder_test.go b/packages/taiko-client/prover/proof_submitter/transaction/builder_test.go index 221a05caee8..bc508cde5eb 100644 --- a/packages/taiko-client/prover/proof_submitter/transaction/builder_test.go +++ b/packages/taiko-client/prover/proof_submitter/transaction/builder_test.go @@ -5,12 +5,20 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) func (s *TransactionTestSuite) TestBuildTxs() { _, err := s.builder.Build( common.Big256, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{TaikoDataBlockMetadataV2: bindings.TaikoDataBlockMetadataV2{ + AnchorBlockHash: [32]byte{}, + Difficulty: [32]byte{}, + BlobHash: [32]byte{}, + ExtraData: [32]byte{}, + ParentMetaHash: [32]byte{}, + LivenessBond: common.Big0, + }}, &bindings.TaikoDataTransition{}, &bindings.TaikoDataTierProof{}, 1, diff --git a/packages/taiko-client/prover/proof_submitter/transaction/sender.go b/packages/taiko-client/prover/proof_submitter/transaction/sender.go index bede6772297..3363390e181 100644 --- a/packages/taiko-client/prover/proof_submitter/transaction/sender.go +++ b/packages/taiko-client/prover/proof_submitter/transaction/sender.go @@ -15,13 +15,14 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" producer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" ) // Sender is responsible for sending proof submission transactions with a backoff policy. type Sender struct { rpc *rpc.Client - txmgr *txmgr.SimpleTxManager + txmgrSelector *utils.TxMgrSelector proverSetAddress common.Address gasLimit uint64 } @@ -30,12 +31,13 @@ type Sender struct { func NewSender( cli *rpc.Client, txmgr *txmgr.SimpleTxManager, + privateTxmgr *txmgr.SimpleTxManager, proverSetAddress common.Address, gasLimit uint64, ) *Sender { return &Sender{ rpc: cli, - txmgr: txmgr, + txmgrSelector: utils.NewTxMgrSelector(txmgr, privateTxmgr, nil), proverSetAddress: proverSetAddress, gasLimit: gasLimit, } @@ -63,7 +65,7 @@ func (s *Sender) Send( } // Check if this proof is still needed to be submitted. - ok, err := s.validateProof(ctx, proofWithHeader) + ok, err := s.ValidateProof(ctx, proofWithHeader, nil) if err != nil || !ok { return err } @@ -75,8 +77,12 @@ func (s *Sender) Send( } // Send the transaction. - receipt, err := s.txmgr.Send(ctx, *txCandidate) + txMgr, isPrivate := s.txmgrSelector.Select() + receipt, err := txMgr.Send(ctx, *txCandidate) if err != nil { + if isPrivate { + s.txmgrSelector.RecordPrivateTxMgrFailed() + } return encoding.TryParsingCustomError(err) } @@ -86,7 +92,8 @@ func (s *Sender) Send( "blockID", proofWithHeader.BlockID, "tier", proofWithHeader.Tier, "txHash", receipt.TxHash, - "error", encoding.TryParsingCustomErrorFromReceipt(ctx, s.rpc.L1, s.txmgr.From(), receipt), + "isPrivateMempool", isPrivate, + "error", encoding.TryParsingCustomErrorFromReceipt(ctx, s.rpc.L1, txMgr.From(), receipt), ) metrics.ProverSubmissionRevertedCounter.Add(1) return ErrUnretryableSubmission @@ -108,16 +115,63 @@ func (s *Sender) Send( return nil } -// validateProof checks if the proof's corresponding L1 block is still in the canonical chain and if the +func (s *Sender) SendBatchProof( + ctx context.Context, + buildTx TxBuilder, + batchProof *producer.BatchProofs, +) error { + // Assemble the TaikoL1.proveBlocks transaction. + txCandidate, err := buildTx(&bind.TransactOpts{GasLimit: s.gasLimit}) + if err != nil { + return err + } + // Send the transaction. + txMgr, isPrivate := s.txmgrSelector.Select() + receipt, err := txMgr.Send(ctx, *txCandidate) + if err != nil { + if isPrivate { + s.txmgrSelector.RecordPrivateTxMgrFailed() + } + return encoding.TryParsingCustomError(err) + } + + if receipt.Status != types.ReceiptStatusSuccessful { + log.Error( + "Failed to submit batch proofs", + "txHash", receipt.TxHash, + "isPrivateMempool", isPrivate, + "error", encoding.TryParsingCustomErrorFromReceipt(ctx, s.rpc.L1, txMgr.From(), receipt), + ) + metrics.ProverSubmissionRevertedCounter.Add(1) + return ErrUnretryableSubmission + } + + log.Info( + "🚚 Your batch proofs were accepted", + "txHash", receipt.TxHash, + "tier", batchProof.Tier, + "blockIDs", batchProof.BlockIDs, + ) + + metrics.ProverSubmissionAcceptedCounter.Add(float64(len(batchProof.BlockIDs))) + + return nil +} + +// ValidateProof checks if the proof's corresponding L1 block is still in the canonical chain and if the // latest verified head is not ahead of this block proof. -func (s *Sender) validateProof(ctx context.Context, proofWithHeader *producer.ProofWithHeader) (bool, error) { +func (s *Sender) ValidateProof( + ctx context.Context, + proofWithHeader *producer.ProofWithHeader, + latestVerifiedID *big.Int, +) (bool, error) { // 1. Check if the corresponding L1 block is still in the canonical chain. - l1Header, err := s.rpc.L1.HeaderByNumber(ctx, new(big.Int).SetUint64(proofWithHeader.Meta.L1Height+1)) + l1Header, err := s.rpc.L1.HeaderByNumber(ctx, proofWithHeader.Meta.GetRawBlockHeight()) if err != nil { log.Warn( "Failed to fetch L1 block", "blockID", proofWithHeader.BlockID, - "l1Height", proofWithHeader.Meta.L1Height+1, + "l1Height", proofWithHeader.Meta.GetRawBlockHeight(), "error", err, ) return false, err @@ -126,25 +180,29 @@ func (s *Sender) validateProof(ctx context.Context, proofWithHeader *producer.Pr log.Warn( "Reorg detected, skip the current proof submission", "blockID", proofWithHeader.BlockID, - "l1Height", proofWithHeader.Meta.L1Height+1, + "l1Height", proofWithHeader.Meta.GetRawBlockHeight(), "l1HashOld", proofWithHeader.Opts.EventL1Hash, "l1HashNew", l1Header.Hash(), ) return false, nil } + var verifiedID = latestVerifiedID // 2. Check if latest verified head is ahead of this block proof. - stateVars, err := s.rpc.GetProtocolStateVariables(&bind.CallOpts{Context: ctx}) - if err != nil { - log.Warn( - "Failed to fetch state variables", - "blockID", proofWithHeader.BlockID, - "error", err, - ) - return false, err + if verifiedID == nil { + stateVars, err := s.rpc.GetProtocolStateVariables(&bind.CallOpts{Context: ctx}) + if err != nil { + log.Warn( + "Failed to fetch state variables", + "blockID", proofWithHeader.BlockID, + "error", err, + ) + return false, err + } + verifiedID = new(big.Int).SetUint64(stateVars.B.LastVerifiedBlockId) } - latestVerifiedID := stateVars.B.LastVerifiedBlockId - if new(big.Int).SetUint64(latestVerifiedID).Cmp(proofWithHeader.BlockID) >= 0 { + + if verifiedID.Cmp(proofWithHeader.BlockID) >= 0 { log.Info( "Block is already verified, skip current proof submission", "blockID", proofWithHeader.BlockID.Uint64(), diff --git a/packages/taiko-client/prover/proof_submitter/transaction/sender_test.go b/packages/taiko-client/prover/proof_submitter/transaction/sender_test.go index 6e42dba6827..35471a6e347 100644 --- a/packages/taiko-client/prover/proof_submitter/transaction/sender_test.go +++ b/packages/taiko-client/prover/proof_submitter/transaction/sender_test.go @@ -1,25 +1,19 @@ package transaction import ( - "context" "errors" - "math/big" "os" "testing" "time" "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" "github.com/stretchr/testify/suite" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - producer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" ) var ( @@ -38,10 +32,10 @@ func (s *TransactionTestSuite) SetupTest() { s.builder = NewProveBlockTxBuilder( s.RPCClient, - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), + common.HexToAddress(os.Getenv("TAIKO_L1")), ZeroAddress, - common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS")), - common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY_ADDRESS")), + common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")), + common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY")), ) l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) @@ -52,7 +46,7 @@ func (s *TransactionTestSuite) SetupTest() { log.Root(), new(metrics.NoopTxMetrics), txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProverPrivKey)), @@ -69,7 +63,7 @@ func (s *TransactionTestSuite) SetupTest() { ) s.Nil(err) - s.sender = NewSender(s.RPCClient, txmgr, ZeroAddress, 0) + s.sender = NewSender(s.RPCClient, txmgr, txmgr, ZeroAddress, 0) } func (s *TransactionTestSuite) TestIsSubmitProofTxErrorRetryable() { @@ -79,24 +73,6 @@ func (s *TransactionTestSuite) TestIsSubmitProofTxErrorRetryable() { s.False(isSubmitProofTxErrorRetryable(errors.New("L1_"+testAddr.String()), common.Big0)) } -func (s *TransactionTestSuite) TestSendTxWithBackoff() { - l1Head, err := s.RPCClient.L1.HeaderByNumber(context.Background(), nil) - s.Nil(err) - l1HeadChild, err := s.RPCClient.L1.HeaderByNumber(context.Background(), new(big.Int).Sub(l1Head.Number, common.Big1)) - s.Nil(err) - meta := &bindings.TaikoDataBlockMetadata{L1Height: l1HeadChild.Number.Uint64(), L1Hash: l1HeadChild.Hash()} - s.NotNil(s.sender.Send( - context.Background(), - &producer.ProofWithHeader{ - Meta: meta, - BlockID: common.Big1, - Header: &types.Header{}, - Opts: &producer.ProofRequestOptions{EventL1Hash: l1Head.Hash()}, - }, - func(*bind.TransactOpts) (*txmgr.TxCandidate, error) { return nil, errors.New("L1_TEST") }, - )) -} - func TestTxSenderTestSuite(t *testing.T) { suite.Run(t, new(TransactionTestSuite)) } diff --git a/packages/taiko-client/prover/prover.go b/packages/taiko-client/prover/prover.go index e69f28271fc..541373a3d81 100644 --- a/packages/taiko-client/prover/prover.go +++ b/packages/taiko-client/prover/prover.go @@ -2,10 +2,8 @@ package prover import ( "context" - "errors" "fmt" "math/big" - "net/http" "strings" "sync" "time" @@ -17,9 +15,11 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/log" "github.com/urfave/cli/v2" + "golang.org/x/sync/errgroup" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/version" eventIterator "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/chain_iterator/event_iterator" @@ -29,7 +29,6 @@ import ( proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" proofSubmitter "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_submitter" "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_submitter/transaction" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/server" state "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/shared_state" ) @@ -43,15 +42,13 @@ type Prover struct { rpc *rpc.Client // Guardian prover related - server *server.ProverServer guardianProverHeartbeater guardianProverHeartbeater.BlockSenderHeartbeater // Contract configurations - protocolConfig *bindings.TaikoDataConfig + protocolConfigs *bindings.TaikoDataConfig // States - sharedState *state.SharedState - genesisHeightL1 uint64 + sharedState *state.SharedState // Event handlers blockProposedHandler handler.BlockProposedHandler @@ -64,16 +61,19 @@ type Prover struct { proofSubmitters []proofSubmitter.Submitter proofContester proofSubmitter.Contester - assignmentExpiredCh chan *bindings.TaikoL1ClientBlockProposed + assignmentExpiredCh chan metadata.TaikoBlockMetaData proveNotify chan struct{} + aggregationNotify chan uint16 // Proof related channels - proofSubmissionCh chan *proofProducer.ProofRequestBody - proofContestCh chan *proofProducer.ContestRequestBody - proofGenerationCh chan *proofProducer.ProofWithHeader + proofSubmissionCh chan *proofProducer.ProofRequestBody + proofContestCh chan *proofProducer.ContestRequestBody + proofGenerationCh chan *proofProducer.ProofWithHeader + batchProofGenerationCh chan *proofProducer.BatchProofs // Transactions manager - txmgr *txmgr.SimpleTxManager + txmgr *txmgr.SimpleTxManager + privateTxmgr *txmgr.SimpleTxManager ctx context.Context wg sync.WaitGroup @@ -86,11 +86,16 @@ func (p *Prover) InitFromCli(ctx context.Context, c *cli.Context) error { return err } - return InitFromConfig(ctx, p, cfg) + return InitFromConfig(ctx, p, cfg, nil, nil) } // InitFromConfig initializes the prover instance based on the given configurations. -func InitFromConfig(ctx context.Context, p *Prover, cfg *Config) (err error) { +func InitFromConfig( + ctx context.Context, + p *Prover, cfg *Config, + txMgr *txmgr.SimpleTxManager, + privateTxMgr *txmgr.SimpleTxManager, +) (err error) { p.cfg = cfg p.ctx = ctx // Initialize state which will be shared by event handlers. @@ -119,20 +124,21 @@ func InitFromConfig(ctx context.Context, p *Prover, cfg *Config) (err error) { } // Configs - protocolConfigs, err := p.rpc.TaikoL1.GetConfig(&bind.CallOpts{Context: ctx}) + protocolConfigs, err := rpc.GetProtocolConfigs(p.rpc.TaikoL1, &bind.CallOpts{Context: p.ctx}) if err != nil { return fmt.Errorf("failed to get protocol configs: %w", err) } - p.protocolConfig = &protocolConfigs + p.protocolConfigs = &protocolConfigs + log.Info("Protocol configs", "configs", p.protocolConfigs) - log.Info("Protocol configs", "configs", p.protocolConfig) - - chBufferSize := p.protocolConfig.BlockMaxProposals + chBufferSize := p.protocolConfigs.BlockMaxProposals p.proofGenerationCh = make(chan *proofProducer.ProofWithHeader, chBufferSize) - p.assignmentExpiredCh = make(chan *bindings.TaikoL1ClientBlockProposed, chBufferSize) - p.proofSubmissionCh = make(chan *proofProducer.ProofRequestBody, p.cfg.Capacity) - p.proofContestCh = make(chan *proofProducer.ContestRequestBody, p.cfg.Capacity) + p.batchProofGenerationCh = make(chan *proofProducer.BatchProofs, chBufferSize) + p.assignmentExpiredCh = make(chan metadata.TaikoBlockMetaData, chBufferSize) + p.proofSubmissionCh = make(chan *proofProducer.ProofRequestBody, chBufferSize) + p.proofContestCh = make(chan *proofProducer.ContestRequestBody, chBufferSize) p.proveNotify = make(chan struct{}, 1) + p.aggregationNotify = make(chan uint16, 1) if err := p.initL1Current(cfg.StartingBlockID); err != nil { return fmt.Errorf("initialize L1 current cursor error: %w", err) @@ -153,17 +159,38 @@ func InitFromConfig(ctx context.Context, p *Prover, cfg *Config) (err error) { p.cfg.GuardianProverMinorityAddress, ) - if p.txmgr, err = txmgr.NewSimpleTxManager( - "prover", - log.Root(), - &metrics.TxMgrMetrics, - *cfg.TxmgrConfigs, - ); err != nil { - return err + if txMgr != nil { + p.txmgr = txMgr + } else { + if p.txmgr, err = txmgr.NewSimpleTxManager( + "prover", + log.Root(), + &metrics.TxMgrMetrics, + *cfg.TxmgrConfigs, + ); err != nil { + return err + } + } + + if privateTxMgr != nil { + p.privateTxmgr = privateTxMgr + } else { + if cfg.PrivateTxmgrConfigs != nil && len(cfg.PrivateTxmgrConfigs.L1RPCURL) > 0 { + if p.privateTxmgr, err = txmgr.NewSimpleTxManager( + "privateMempoolProver", + log.Root(), + &metrics.TxMgrMetrics, + *cfg.PrivateTxmgrConfigs, + ); err != nil { + return err + } + } else { + p.privateTxmgr = nil + } } // Proof submitters - if err := p.initProofSubmitters(p.txmgr, txBuilder, tiers); err != nil { + if err := p.initProofSubmitters(txBuilder, tiers); err != nil { return err } @@ -172,31 +199,12 @@ func InitFromConfig(ctx context.Context, p *Prover, cfg *Config) (err error) { p.rpc, p.cfg.ProveBlockGasLimit, p.txmgr, + p.privateTxmgr, p.cfg.ProverSetAddress, p.cfg.Graffiti, txBuilder, ) - // Prover server - if p.server, err = server.New(&server.NewProverServerOpts{ - ProverPrivateKey: p.cfg.L1ProverPrivKey, - ProverSetAddress: p.cfg.ProverSetAddress, - MinOptimisticTierFee: p.cfg.MinOptimisticTierFee, - MinSgxTierFee: p.cfg.MinSgxTierFee, - MinSgxAndZkVMTierFee: p.cfg.MinSgxAndZkVMTierFee, - MinEthBalance: p.cfg.MinEthBalance, - MinTaikoTokenBalance: p.cfg.MinTaikoTokenBalance, - MaxExpiry: p.cfg.MaxExpiry, - MaxBlockSlippage: p.cfg.MaxBlockSlippage, - TaikoL1Address: p.cfg.TaikoL1Address, - AssignmentHookAddress: p.cfg.AssignmentHookAddress, - RPC: p.rpc, - ProtocolConfigs: &protocolConfigs, - LivenessBond: protocolConfigs.LivenessBond, - }); err != nil { - return err - } - // Guardian prover heartbeat sender if p.IsGuardianProver() && p.cfg.GuardianProverHealthCheckServerEndpoint != nil { // Check guardian prover contract address is correct. @@ -229,19 +237,12 @@ func InitFromConfig(ctx context.Context, p *Prover, cfg *Config) (err error) { // Start starts the main loop of the L2 block prover. func (p *Prover) Start() error { // 1. Set approval amount for the contracts. - for _, contract := range []common.Address{p.cfg.TaikoL1Address, p.cfg.AssignmentHookAddress} { + for _, contract := range []common.Address{p.cfg.TaikoL1Address} { if err := p.setApprovalAmount(p.ctx, contract); err != nil { log.Crit("Failed to set approval amount", "contract", contract, "error", err) } } - // 2. Start the prover server. - go func() { - if err := p.server.Start(fmt.Sprintf(":%v", p.cfg.HTTPServerPort)); !errors.Is(err, http.ErrServerClosed) { - log.Crit("Failed to start http server", "error", err) - } - }() - // 3. Start the guardian prover heartbeat sender if the current prover is a guardian prover. if p.IsGuardianProver() && p.cfg.GuardianProverHealthCheckServerEndpoint != nil { // Send the startup message to the guardian prover health check server. @@ -278,6 +279,7 @@ func (p *Prover) eventLoop() { default: } } + // Call reqProving() right away to catch up with the latest state. reqProving() @@ -288,21 +290,21 @@ func (p *Prover) eventLoop() { defer forceProvingTicker.Stop() // Channels - chBufferSize := p.protocolConfig.BlockMaxProposals - blockProposedCh := make(chan *bindings.TaikoL1ClientBlockProposed, chBufferSize) - blockVerifiedCh := make(chan *bindings.TaikoL1ClientBlockVerified, chBufferSize) - transitionProvedCh := make(chan *bindings.TaikoL1ClientTransitionProved, chBufferSize) - transitionContestedCh := make(chan *bindings.TaikoL1ClientTransitionContested, chBufferSize) + chBufferSize := p.protocolConfigs.BlockMaxProposals + blockProposedV2Ch := make(chan *bindings.TaikoL1ClientBlockProposedV2, chBufferSize) + blockVerifiedV2Ch := make(chan *bindings.TaikoL1ClientBlockVerifiedV2, chBufferSize) + transitionProvedV2Ch := make(chan *bindings.TaikoL1ClientTransitionProvedV2, chBufferSize) + transitionContestedV2Ch := make(chan *bindings.TaikoL1ClientTransitionContestedV2, chBufferSize) // Subscriptions - blockProposedSub := rpc.SubscribeBlockProposed(p.rpc.TaikoL1, blockProposedCh) - blockVerifiedSub := rpc.SubscribeBlockVerified(p.rpc.TaikoL1, blockVerifiedCh) - transitionProvedSub := rpc.SubscribeTransitionProved(p.rpc.TaikoL1, transitionProvedCh) - transitionContestedSub := rpc.SubscribeTransitionContested(p.rpc.TaikoL1, transitionContestedCh) + blockProposedV2Sub := rpc.SubscribeBlockProposedV2(p.rpc.TaikoL1, blockProposedV2Ch) + blockVerifiedV2Sub := rpc.SubscribeBlockVerifiedV2(p.rpc.TaikoL1, blockVerifiedV2Ch) + transitionProvedV2Sub := rpc.SubscribeTransitionProvedV2(p.rpc.TaikoL1, transitionProvedV2Ch) + transitionContestedV2Sub := rpc.SubscribeTransitionContestedV2(p.rpc.TaikoL1, transitionContestedV2Ch) defer func() { - blockProposedSub.Unsubscribe() - blockVerifiedSub.Unsubscribe() - transitionProvedSub.Unsubscribe() - transitionContestedSub.Unsubscribe() + blockProposedV2Sub.Unsubscribe() + blockVerifiedV2Sub.Unsubscribe() + transitionProvedV2Sub.Unsubscribe() + transitionContestedV2Sub.Unsubscribe() }() for { @@ -313,21 +315,29 @@ func (p *Prover) eventLoop() { p.withRetry(func() error { return p.contestProofOp(req) }) case proofWithHeader := <-p.proofGenerationCh: p.withRetry(func() error { return p.submitProofOp(proofWithHeader) }) + case batchProof := <-p.batchProofGenerationCh: + p.withRetry(func() error { return p.submitProofAggregationOp(batchProof) }) case req := <-p.proofSubmissionCh: - p.withRetry(func() error { return p.requestProofOp(req.Event, req.Tier) }) + p.withRetry(func() error { return p.requestProofOp(req.Meta, req.Tier) }) case <-p.proveNotify: if err := p.proveOp(); err != nil { log.Error("Prove new blocks error", "error", err) } - case e := <-blockVerifiedCh: + case tier := <-p.aggregationNotify: + p.withRetry(func() error { return p.aggregateOp(tier) }) + case e := <-blockVerifiedV2Ch: p.blockVerifiedHandler.Handle(e) - case e := <-transitionProvedCh: - p.withRetry(func() error { return p.transitionProvedHandler.Handle(p.ctx, e) }) - case e := <-transitionContestedCh: - p.withRetry(func() error { return p.transitionContestedHandler.Handle(p.ctx, e) }) - case e := <-p.assignmentExpiredCh: - p.withRetry(func() error { return p.assignmentExpiredHandler.Handle(p.ctx, e) }) - case <-blockProposedCh: + case e := <-transitionProvedV2Ch: + p.withRetry(func() error { + return p.transitionProvedHandler.Handle(p.ctx, e) + }) + case e := <-transitionContestedV2Ch: + p.withRetry(func() error { + return p.transitionContestedHandler.Handle(p.ctx, e) + }) + case m := <-p.assignmentExpiredCh: + p.withRetry(func() error { return p.assignmentExpiredHandler.Handle(p.ctx, m) }) + case <-blockProposedV2Ch: reqProving() case <-forceProvingTicker.C: reqProving() @@ -336,10 +346,7 @@ func (p *Prover) eventLoop() { } // Close closes the prover instance. -func (p *Prover) Close(ctx context.Context) { - if err := p.server.Shutdown(ctx); err != nil { - log.Error("Failed to shut down prover server", "error", err) - } +func (p *Prover) Close(_ context.Context) { p.wg.Wait() } @@ -360,6 +367,35 @@ func (p *Prover) proveOp() error { return iter.Iter() } +// aggregateOp aggregates all proofs in buffer. +func (p *Prover) aggregateOp(tier uint16) error { + g, gCtx := errgroup.WithContext(p.ctx) + for _, submitter := range p.proofSubmitters { + g.Go(func() error { + if submitter.AggregationEnabled() && submitter.Tier() == tier { + if err := submitter.AggregateProofs(gCtx); err != nil { + log.Error( + "Failed to aggregate proofs", + "error", err, + "tier", submitter.Tier(), + ) + return err + } + } else { + log.Debug( + "Skip the current aggregation operation", + "requestTier", tier, + "submitterTier", submitter.Tier(), + "bufferSize", submitter.BufferSize(), + ) + } + return nil + }) + } + + return g.Wait() +} + // contestProofOp performs a proof contest operation. func (p *Prover) contestProofOp(req *proofProducer.ContestRequestBody) error { if err := p.proofContester.SubmitContest( @@ -374,7 +410,7 @@ func (p *Prover) contestProofOp(req *proofProducer.ContestRequestBody) error { log.Error( "Proof contest submission reverted", "blockID", req.BlockID, - "minTier", req.Meta.MinTier, + "minTier", req.Meta.GetMinTier(), "error", err, ) return nil @@ -382,7 +418,7 @@ func (p *Prover) contestProofOp(req *proofProducer.ContestRequestBody) error { log.Error( "Request new proof contest error", "blockID", req.BlockID, - "minTier", req.Meta.MinTier, + "minTier", req.Meta.GetMinTier(), "error", err, ) return err @@ -392,7 +428,7 @@ func (p *Prover) contestProofOp(req *proofProducer.ContestRequestBody) error { } // requestProofOp requests a new proof generation operation. -func (p *Prover) requestProofOp(e *bindings.TaikoL1ClientBlockProposed, minTier uint16) error { +func (p *Prover) requestProofOp(meta metadata.TaikoBlockMetaData, minTier uint16) error { if p.IsGuardianProver() { if minTier > encoding.TierGuardianMinorityID { minTier = encoding.TierGuardianMajorityID @@ -401,15 +437,15 @@ func (p *Prover) requestProofOp(e *bindings.TaikoL1ClientBlockProposed, minTier } } if submitter := p.selectSubmitter(minTier); submitter != nil { - if err := submitter.RequestProof(p.ctx, e); err != nil { - log.Error("Request new proof error", "blockID", e.BlockId, "minTier", e.Meta.MinTier, "error", err) + if err := submitter.RequestProof(p.ctx, meta); err != nil { + log.Error("Request new proof error", "blockID", meta.GetBlockID(), "minTier", meta.GetMinTier(), "error", err) return err } return nil } - log.Error("Failed to find proof submitter", "blockID", e.BlockId, "minTier", minTier) + log.Error("Failed to find proof submitter", "blockID", meta.GetBlockID(), "minTier", minTier) return nil } @@ -425,7 +461,7 @@ func (p *Prover) submitProofOp(proofWithHeader *proofProducer.ProofWithHeader) e log.Error( "Proof submission reverted", "blockID", proofWithHeader.BlockID, - "minTier", proofWithHeader.Meta.MinTier, + "minTier", proofWithHeader.Meta.GetMinTier(), "error", err, ) return nil @@ -433,7 +469,37 @@ func (p *Prover) submitProofOp(proofWithHeader *proofProducer.ProofWithHeader) e log.Error( "Submit proof error", "blockID", proofWithHeader.BlockID, - "minTier", proofWithHeader.Meta.MinTier, + "minTier", proofWithHeader.Meta.GetMinTier(), + "error", err, + ) + return err + } + + return nil +} + +// submitProofsOp performs a batch proof submission operation. +func (p *Prover) submitProofAggregationOp(batchProof *proofProducer.BatchProofs) error { + submitter := p.getSubmitterByTier(batchProof.Tier) + if submitter == nil { + return nil + } + + if err := submitter.BatchSubmitProofs(p.ctx, batchProof); err != nil { + if strings.Contains(err.Error(), vm.ErrExecutionReverted.Error()) || + strings.Contains(err.Error(), proofSubmitter.ErrInvalidProof.Error()) { + log.Error( + "Proof submission reverted", + "blockIDs", batchProof.BlockIDs, + "tier", batchProof.Tier, + "error", err, + ) + return nil + } + log.Error( + "Submit proof error", + "blockIDs", batchProof.BlockIDs, + "tier", batchProof.Tier, "error", err, ) return err @@ -454,7 +520,6 @@ func (p *Prover) selectSubmitter(minTier uint16) proofSubmitter.Submitter { if !p.IsGuardianProver() && s.Tier() >= encoding.TierGuardianMinorityID { continue } - log.Debug("Proof submitter selected", "tier", s.Tier(), "minTier", minTier) return s } diff --git a/packages/taiko-client/prover/prover_test.go b/packages/taiko-client/prover/prover_test.go index 1d77f8bb0c8..821a62c6313 100644 --- a/packages/taiko-client/prover/prover_test.go +++ b/packages/taiko-client/prover/prover_test.go @@ -4,9 +4,7 @@ import ( "context" "crypto/ecdsa" "math/big" - "net/url" "os" - "strconv" "testing" "time" @@ -15,17 +13,21 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer" guardianProverHeartbeater "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/guardian_prover_heartbeater" producer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" + proofSubmitter "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_submitter" "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_submitter/transaction" ) @@ -35,6 +37,7 @@ type ProverTestSuite struct { cancel context.CancelFunc d *driver.Driver proposer *proposer.Proposer + txmgr *txmgr.SimpleTxManager } func (s *ProverTestSuite) SetupTest() { @@ -44,8 +47,30 @@ func (s *ProverTestSuite) SetupTest() { l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) s.Nil(err) + s.txmgr, err = txmgr.NewSimpleTxManager( + "prover_test", + log.Root(), + &metrics.TxMgrMetrics, + txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProverPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + ) + s.Nil(err) + ctx, cancel := context.WithCancel(context.Background()) - proverServerURL := s.initProver(ctx, l1ProverPrivKey) + s.initProver(ctx, l1ProverPrivKey) s.cancel = cancel // Init driver @@ -56,12 +81,11 @@ func (s *ProverTestSuite) SetupTest() { d := new(driver.Driver) s.Nil(d.InitFromConfig(context.Background(), &driver.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), JwtSecret: string(jwtSecret), }, })) @@ -75,42 +99,19 @@ func (s *ProverTestSuite) SetupTest() { s.Nil(prop.InitFromConfig(context.Background(), &proposer.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: string(jwtSecret), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: []*url.URL{proverServerURL}, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - MaxTierFeePriceBumps: 3, - TierFeePriceBump: common.Big2, - L1BlockBuilderTip: common.Big0, - TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), - NumConfirmations: 0, - SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, - PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), - FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, - FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, - MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, - MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, - ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, - ReceiptQueryInterval: 1 * time.Second, - NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, - TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, - TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, - }, - })) + }, s.txmgr, s.txmgr)) s.proposer = prop } @@ -128,36 +129,19 @@ func (s *ProverTestSuite) TestInitError() { p := new(Prover) s.NotNil(InitFromConfig(ctx, p, &Config{ - L1WsEndpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L1HttpEndpoint: os.Getenv("L1_NODE_HTTP_ENDPOINT"), - L2WsEndpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2HttpEndpoint: os.Getenv("L2_EXECUTION_ENGINE_HTTP_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_CONTRACT_ADDRESS")), + L1WsEndpoint: os.Getenv("L1_WS"), + L2WsEndpoint: os.Getenv("L2_WS"), + L2HttpEndpoint: os.Getenv("L2_HTTP"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), L1ProverPrivKey: l1ProverPrivKey, Dummy: true, ProveUnassignedBlocks: true, RPCTimeout: 10 * time.Minute, BackOffRetryInterval: 3 * time.Second, BackOffMaxRetries: 12, - TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), - NumConfirmations: 0, - SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, - PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProverPrivKey)), - FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, - FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, - MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, - MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, - ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, - ReceiptQueryInterval: 1 * time.Second, - NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, - TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, - TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, - }, - })) + }, s.txmgr, s.txmgr)) } func (s *ProverTestSuite) TestOnBlockProposed() { @@ -167,28 +151,28 @@ func (s *ProverTestSuite) TestOnBlockProposed() { s.Nil(err) s.p.cfg.L1ProverPrivKey = l1ProverPrivKey // Valid block - e := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) - s.Nil(s.p.blockProposedHandler.Handle(context.Background(), e, func() {})) + m := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) + s.Nil(s.p.blockProposedHandler.Handle(context.Background(), m, func() {})) req := <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) + s.Nil(s.p.selectSubmitter(m.GetMinTier()).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) // Empty blocks - for _, e = range s.ProposeAndInsertEmptyBlocks( + for _, m := range s.ProposeAndInsertEmptyBlocks( s.proposer, s.d.ChainSyncer().BlobSyncer(), ) { - s.Nil(s.p.blockProposedHandler.Handle(context.Background(), e, func() {})) + s.Nil(s.p.blockProposedHandler.Handle(context.Background(), m, func() {})) req := <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) + s.Nil(s.p.selectSubmitter(m.GetMinTier()).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) } } func (s *ProverTestSuite) TestOnBlockVerifiedEmptyBlockHash() { s.T().Skip("Skipping, preconfer changes") s.NotPanics(func() { - s.p.blockVerifiedHandler.Handle(&bindings.TaikoL1ClientBlockVerified{ + s.p.blockVerifiedHandler.Handle(&bindings.TaikoL1ClientBlockVerifiedV2{ BlockId: common.Big1, BlockHash: common.Hash{}, }) @@ -201,7 +185,7 @@ func (s *ProverTestSuite) TestSubmitProofOp() { s.p.withRetry(func() error { return s.p.submitProofOp(&producer.ProofWithHeader{ BlockID: common.Big1, - Meta: &bindings.TaikoDataBlockMetadata{}, + Meta: &metadata.TaikoDataBlockMetadataOntake{}, Header: &types.Header{}, Proof: []byte{}, Tier: encoding.TierOptimisticID, @@ -213,7 +197,7 @@ func (s *ProverTestSuite) TestSubmitProofOp() { s.p.withRetry(func() error { return s.p.submitProofOp(&producer.ProofWithHeader{ BlockID: common.Big1, - Meta: &bindings.TaikoDataBlockMetadata{}, + Meta: &metadata.TaikoDataBlockMetadataOntake{}, Header: &types.Header{}, Proof: []byte{}, Tier: encoding.TierOptimisticID, @@ -226,7 +210,7 @@ func (s *ProverTestSuite) TestSubmitProofOp() { func (s *ProverTestSuite) TestOnBlockVerified() { id := testutils.RandomHash().Big().Uint64() s.NotPanics(func() { - s.p.blockVerifiedHandler.Handle(&bindings.TaikoL1ClientBlockVerified{ + s.p.blockVerifiedHandler.Handle(&bindings.TaikoL1ClientBlockVerifiedV2{ BlockId: testutils.RandomHash().Big(), Raw: types.Log{ BlockHash: testutils.RandomHash(), @@ -237,35 +221,32 @@ func (s *ProverTestSuite) TestOnBlockVerified() { } func (s *ProverTestSuite) TestContestWrongBlocks() { - s.T().Skip("This test is flaky and needs to be fixed") s.p.cfg.ContesterMode = false s.Nil(s.p.initEventHandlers()) - e := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) - s.Nil(s.p.transitionProvedHandler.Handle(context.Background(), &bindings.TaikoL1ClientTransitionProved{ - BlockId: e.BlockId, - Tier: e.Meta.MinTier, + m := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) + s.Nil(s.p.transitionProvedHandler.Handle(context.Background(), &bindings.TaikoL1ClientTransitionProvedV2{ + BlockId: m.GetBlockID(), + Tier: m.GetMinTier(), })) s.p.cfg.ContesterMode = true s.Nil(s.p.initEventHandlers()) // Submit a wrong proof at first. - sink := make(chan *bindings.TaikoL1ClientTransitionProved) - header, err := s.p.rpc.L2.HeaderByNumber(context.Background(), e.BlockId) + header, err := s.p.rpc.L2.HeaderByNumber(context.Background(), m.GetBlockID()) s.Nil(err) - - sub, err := s.p.rpc.TaikoL1.WatchTransitionProved(nil, sink, nil) + sink := make(chan *bindings.TaikoL1ClientTransitionProvedV2) + sub, err := s.p.rpc.TaikoL1.WatchTransitionProvedV2(nil, sink, nil) s.Nil(err) defer func() { sub.Unsubscribe() close(sink) }() - s.Nil(s.p.proveOp()) req := <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) proofWithHeader := <-s.p.proofGenerationCh proofWithHeader.Opts.BlockHash = testutils.RandomHash() - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), proofWithHeader)) + s.Nil(s.p.selectSubmitter(m.GetMinTier()).SubmitProof(context.Background(), proofWithHeader)) event := <-sink s.Equal(header.Number.Uint64(), event.BlockId.Uint64()) @@ -274,9 +255,10 @@ func (s *ProverTestSuite) TestContestWrongBlocks() { s.Equal(header.ParentHash, common.BytesToHash(event.Tran.ParentHash[:])) // Contest the transition. - contestedSink := make(chan *bindings.TaikoL1ClientTransitionContested) - contestedSub, err := s.p.rpc.TaikoL1.WatchTransitionContested(nil, contestedSink, nil) + contestedSink := make(chan *bindings.TaikoL1ClientTransitionContestedV2) + contestedSub, err := s.p.rpc.TaikoL1.WatchTransitionContestedV2(nil, contestedSink, nil) s.Nil(err) + defer func() { contestedSub.Unsubscribe() close(contestedSink) @@ -284,10 +266,7 @@ func (s *ProverTestSuite) TestContestWrongBlocks() { contesterKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_CONTRACT_OWNER_PRIVATE_KEY"))) s.Nil(err) - s.NotNil(s.initProver( - context.Background(), - contesterKey, - )) + s.initProver(context.Background(), contesterKey) s.p.cfg.ContesterMode = true s.Nil(s.p.initEventHandlers()) @@ -303,8 +282,9 @@ func (s *ProverTestSuite) TestContestWrongBlocks() { s.Nil(s.p.transitionContestedHandler.Handle(context.Background(), contestedEvent)) - s.p.cfg.GuardianProverMajorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS")) + s.p.cfg.GuardianProverMajorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")) s.True(s.p.IsGuardianProver()) + s.p.cfg.GuardianProverMinorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY")) txBuilder := transaction.NewProveBlockTxBuilder( s.p.rpc, @@ -317,13 +297,13 @@ func (s *ProverTestSuite) TestContestWrongBlocks() { // Protocol proof tiers tiers, err := s.RPCClient.GetTiers(context.Background()) s.Nil(err) - s.Nil(s.p.initProofSubmitters(s.p.txmgr, txBuilder, tiers)) + s.Nil(s.p.initProofSubmitters(txBuilder, tiers)) - s.p.rpc.GuardianProverMajority, err = bindings.NewGuardianProver(s.p.cfg.GuardianProverMajorityAddress, s.p.rpc.L1) + s.p.rpc.GuardianProverMinority, err = bindings.NewGuardianProver(s.p.cfg.GuardianProverMinorityAddress, s.p.rpc.L1) s.Nil(err) approvedSink := make(chan *bindings.GuardianProverGuardianApproval) - approvedSub, err := s.p.rpc.GuardianProverMajority.WatchGuardianApproval( + approvedSub, err := s.p.rpc.GuardianProverMinority.WatchGuardianApproval( nil, approvedSink, []common.Address{}, [](*big.Int){}, []([32]byte){}, ) s.Nil(err) @@ -332,43 +312,15 @@ func (s *ProverTestSuite) TestContestWrongBlocks() { close(approvedSink) }() req = <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) - s.Nil(s.p.selectSubmitter(encoding.TierGuardianMajorityID).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) + s.Nil(s.p.selectSubmitter(encoding.TierGuardianMinorityID).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) approvedEvent := <-approvedSink s.Equal(header.Number.Uint64(), approvedEvent.BlockId.Uint64()) } -func (s *ProverTestSuite) TestProveExpiredUnassignedBlock() { - s.T().Skip("Skipping, preconfer changes") - e := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) - sink := make(chan *bindings.TaikoL1ClientTransitionProved) - - header, err := s.p.rpc.L2.HeaderByNumber(context.Background(), e.BlockId) - s.Nil(err) - - sub, err := s.p.rpc.TaikoL1.WatchTransitionProved(nil, sink, nil) - s.Nil(err) - defer func() { - sub.Unsubscribe() - close(sink) - }() - - e.AssignedProver = common.BytesToAddress(testutils.RandomHash().Bytes()) - s.p.cfg.GuardianProverMajorityAddress = common.Address{} - s.Nil(s.p.assignmentExpiredHandler.Handle(context.Background(), e)) - req := <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) - - event := <-sink - s.Equal(header.Number.Uint64(), event.BlockId.Uint64()) - s.Equal(header.Hash(), common.BytesToHash(event.Tran.BlockHash[:])) - s.Equal(header.ParentHash, common.BytesToHash(event.Tran.ParentHash[:])) -} - func (s *ProverTestSuite) TestSelectSubmitter() { - s.p.cfg.GuardianProverMajorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS")) + s.p.cfg.GuardianProverMajorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")) s.True(s.p.IsGuardianProver()) submitter := s.p.selectSubmitter(encoding.TierGuardianMinorityID + 1) s.NotNil(submitter) @@ -381,7 +333,7 @@ func (s *ProverTestSuite) TestSelectSubmitterNotFound() { } func (s *ProverTestSuite) TestGetSubmitterByTier() { - s.p.cfg.GuardianProverMajorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS")) + s.p.cfg.GuardianProverMajorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")) s.True(s.p.IsGuardianProver()) submitter := s.p.getSubmitterByTier(encoding.TierGuardianMajorityID) @@ -391,14 +343,13 @@ func (s *ProverTestSuite) TestGetSubmitterByTier() { } func (s *ProverTestSuite) TestProveOp() { - s.T().Skip("Skipping, preconfer changes") - e := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) - sink := make(chan *bindings.TaikoL1ClientTransitionProved) + m := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) - header, err := s.p.rpc.L2.HeaderByNumber(context.Background(), e.BlockId) + header, err := s.p.rpc.L2.HeaderByNumber(context.Background(), m.GetBlockID()) s.Nil(err) - sub, err := s.p.rpc.TaikoL1.WatchTransitionProved(nil, sink, nil) + sink := make(chan *bindings.TaikoL1ClientTransitionProvedV2) + sub, err := s.p.rpc.TaikoL1.WatchTransitionProvedV2(nil, sink, nil) s.Nil(err) defer func() { sub.Unsubscribe() @@ -407,13 +358,13 @@ func (s *ProverTestSuite) TestProveOp() { s.Nil(s.p.proveOp()) req := <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) + s.Nil(s.p.selectSubmitter(m.GetMinTier()).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) event := <-sink - s.Equal(header.Number.Uint64(), event.BlockId.Uint64()) - s.Equal(header.Hash(), common.BytesToHash(event.Tran.BlockHash[:])) - s.Equal(header.ParentHash, common.BytesToHash(event.Tran.ParentHash[:])) + tran := event.Tran + s.Equal(header.Hash(), common.BytesToHash(tran.BlockHash[:])) + s.Equal(header.ParentHash, common.BytesToHash(tran.ParentHash[:])) } func (s *ProverTestSuite) TestGetBlockProofStatus() { @@ -421,10 +372,16 @@ func (s *ProverTestSuite) TestGetBlockProofStatus() { parent, err := s.p.rpc.L2.HeaderByNumber(context.Background(), nil) s.Nil(err) - e := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) + m := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) // No proof submitted - status, err := rpc.GetBlockProofStatus(context.Background(), s.p.rpc, e.BlockId, s.p.ProverAddress(), rpc.ZeroAddress) + status, err := rpc.GetBlockProofStatus( + context.Background(), + s.p.rpc, + m.GetBlockID(), + s.p.ProverAddress(), + rpc.ZeroAddress, + ) s.Nil(err) s.False(status.IsSubmitted) @@ -440,44 +397,171 @@ func (s *ProverTestSuite) TestGetBlockProofStatus() { s.Nil(s.p.proveOp()) req := <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) + s.Nil(s.p.selectSubmitter(m.GetMinTier()).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) - status, err = rpc.GetBlockProofStatus(context.Background(), s.p.rpc, e.BlockId, s.p.ProverAddress(), rpc.ZeroAddress) + status, err = rpc.GetBlockProofStatus( + context.Background(), + s.p.rpc, + m.GetBlockID(), + s.p.ProverAddress(), + rpc.ZeroAddress, + ) s.Nil(err) s.True(status.IsSubmitted) s.False(status.Invalid) s.Equal(parent.Hash(), status.ParentHeader.Hash()) - s.Equal(common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), status.CurrentTransitionState.Prover) // Invalid proof submitted parent, err = s.p.rpc.L2.HeaderByNumber(context.Background(), nil) s.Nil(err) - e = s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) + m = s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) - status, err = rpc.GetBlockProofStatus(context.Background(), s.p.rpc, e.BlockId, s.p.ProverAddress(), rpc.ZeroAddress) + status, err = rpc.GetBlockProofStatus( + context.Background(), + s.p.rpc, + m.GetBlockID(), + s.p.ProverAddress(), + rpc.ZeroAddress, + ) s.Nil(err) s.False(status.IsSubmitted) s.Nil(s.p.proveOp()) req = <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) proofWithHeader := <-s.p.proofGenerationCh proofWithHeader.Opts.BlockHash = testutils.RandomHash() - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), proofWithHeader)) + s.Nil(s.p.selectSubmitter(m.GetMinTier()).SubmitProof(context.Background(), proofWithHeader)) - status, err = rpc.GetBlockProofStatus(context.Background(), s.p.rpc, e.BlockId, s.p.ProverAddress(), rpc.ZeroAddress) + status, err = rpc.GetBlockProofStatus( + context.Background(), + s.p.rpc, + m.GetBlockID(), + s.p.ProverAddress(), + rpc.ZeroAddress, + ) s.Nil(err) s.True(status.IsSubmitted) s.True(status.Invalid) s.Equal(parent.Hash(), status.ParentHeader.Hash()) - s.Equal(common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), status.CurrentTransitionState.Prover) s.Equal(proofWithHeader.Opts.BlockHash, common.BytesToHash(status.CurrentTransitionState.BlockHash[:])) } +func (s *ProverTestSuite) TestAggregateProofsAlreadyProved() { + batchSize := 2 + // Init batch prover + l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) + s.Nil(err) + decimal, err := s.RPCClient.TaikoToken.Decimals(nil) + s.Nil(err) + batchProver := new(Prover) + s.Nil(InitFromConfig(context.Background(), batchProver, &Config{ + L1WsEndpoint: os.Getenv("L1_WS"), + L2WsEndpoint: os.Getenv("L2_WS"), + L2HttpEndpoint: os.Getenv("L2_HTTP"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), + L1ProverPrivKey: l1ProverPrivKey, + Dummy: true, + ProveUnassignedBlocks: true, + Allowance: new(big.Int).Exp(big.NewInt(1_000_000_100), new(big.Int).SetUint64(uint64(decimal)), nil), + RPCTimeout: 3 * time.Second, + BackOffRetryInterval: 3 * time.Second, + BackOffMaxRetries: 12, + L1NodeVersion: "1.0.0", + L2NodeVersion: "0.1.0", + SGXProofBufferSize: uint64(batchSize), + }, s.txmgr, s.txmgr)) + + for i := 0; i < batchSize; i++ { + _ = s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) + } + + sink := make(chan *bindings.TaikoL1ClientTransitionProvedV2, batchSize) + sub, err := s.p.rpc.TaikoL1.WatchTransitionProvedV2(nil, sink, nil) + s.Nil(err) + defer func() { + sub.Unsubscribe() + close(sink) + }() + + s.Nil(s.p.proveOp()) + s.Nil(batchProver.proveOp()) + for i := 0; i < batchSize; i++ { + req1 := <-s.p.proofSubmissionCh + s.Nil(s.p.requestProofOp(req1.Meta, req1.Tier)) + req2 := <-batchProver.proofSubmissionCh + s.Nil(batchProver.requestProofOp(req2.Meta, req2.Tier)) + s.Nil(s.p.selectSubmitter(req1.Tier).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) + } + tier := <-batchProver.aggregationNotify + s.Nil(batchProver.aggregateOp(tier)) + s.ErrorIs( + batchProver.selectSubmitter(tier).BatchSubmitProofs(context.Background(), <-batchProver.batchProofGenerationCh), + proofSubmitter.ErrInvalidProof, + ) + for i := 0; i < batchSize; i++ { + <-sink + } +} + +func (s *ProverTestSuite) TestAggregateProofs() { + batchSize := 2 + // Init batch prover + l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) + s.Nil(err) + decimal, err := s.RPCClient.TaikoToken.Decimals(nil) + s.Nil(err) + batchProver := new(Prover) + s.Nil(InitFromConfig(context.Background(), batchProver, &Config{ + L1WsEndpoint: os.Getenv("L1_WS"), + L2WsEndpoint: os.Getenv("L2_WS"), + L2HttpEndpoint: os.Getenv("L2_HTTP"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), + L1ProverPrivKey: l1ProverPrivKey, + Dummy: true, + ProveUnassignedBlocks: true, + Allowance: new(big.Int).Exp(big.NewInt(1_000_000_100), new(big.Int).SetUint64(uint64(decimal)), nil), + RPCTimeout: 3 * time.Second, + BackOffRetryInterval: 3 * time.Second, + BackOffMaxRetries: 12, + L1NodeVersion: "1.0.0", + L2NodeVersion: "0.1.0", + SGXProofBufferSize: uint64(batchSize), + }, s.txmgr, s.txmgr)) + + for i := 0; i < batchSize; i++ { + _ = s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) + } + + sink := make(chan *bindings.TaikoL1ClientTransitionProvedV2, batchSize) + sub, err := s.p.rpc.TaikoL1.WatchTransitionProvedV2(nil, sink, nil) + s.Nil(err) + defer func() { + sub.Unsubscribe() + close(sink) + }() + + s.Nil(batchProver.proveOp()) + for i := 0; i < batchSize; i++ { + req := <-batchProver.proofSubmissionCh + s.Nil(batchProver.requestProofOp(req.Meta, req.Tier)) + } + tier := <-batchProver.aggregationNotify + s.Nil(batchProver.aggregateOp(tier)) + s.Nil(batchProver.selectSubmitter(tier).BatchSubmitProofs(context.Background(), <-batchProver.batchProofGenerationCh)) + for i := 0; i < batchSize; i++ { + <-sink + } +} + func (s *ProverTestSuite) TestSetApprovalAlreadySetHigher() { originalAllowance, err := s.p.rpc.TaikoToken.Allowance(&bind.CallOpts{}, s.p.ProverAddress(), s.p.cfg.TaikoL1Address) s.Nil(err) @@ -505,58 +589,28 @@ func TestProverTestSuite(t *testing.T) { func (s *ProverTestSuite) initProver( ctx context.Context, key *ecdsa.PrivateKey, -) *url.URL { - proverServerURL := testutils.LocalRandomProverEndpoint() - port, err := strconv.Atoi(proverServerURL.Port()) - s.Nil(err) - +) { decimal, err := s.RPCClient.TaikoToken.Decimals(nil) s.Nil(err) p := new(Prover) s.Nil(InitFromConfig(ctx, p, &Config{ - L1WsEndpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L1HttpEndpoint: os.Getenv("L1_NODE_HTTP_ENDPOINT"), - L2WsEndpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2HttpEndpoint: os.Getenv("L2_EXECUTION_ENGINE_HTTP_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + L1WsEndpoint: os.Getenv("L1_WS"), + L2WsEndpoint: os.Getenv("L2_WS"), + L2HttpEndpoint: os.Getenv("L2_HTTP"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), L1ProverPrivKey: key, Dummy: true, ProveUnassignedBlocks: true, - Capacity: 1024, - MinOptimisticTierFee: common.Big1, - MinSgxTierFee: common.Big1, - HTTPServerPort: uint64(port), Allowance: new(big.Int).Exp(big.NewInt(1_000_000_100), new(big.Int).SetUint64(uint64(decimal)), nil), RPCTimeout: 3 * time.Second, BackOffRetryInterval: 3 * time.Second, BackOffMaxRetries: 12, L1NodeVersion: "1.0.0", L2NodeVersion: "0.1.0", - TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), - NumConfirmations: 0, - SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, - PrivateKey: common.Bytes2Hex(crypto.FromECDSA(key)), - FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, - FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, - MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, - MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, - ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, - ReceiptQueryInterval: 1 * time.Second, - NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, - TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, - TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, - }, - })) - p.server = s.NewTestProverServer( - key, - proverServerURL, - ) + }, s.txmgr, s.txmgr)) p.guardianProverHeartbeater = guardianProverHeartbeater.New( key, @@ -565,6 +619,4 @@ func (s *ProverTestSuite) initProver( p.ProverAddress(), ) s.p = p - - return proverServerURL } diff --git a/packages/taiko-client/prover/server/api.go b/packages/taiko-client/prover/server/api.go deleted file mode 100644 index 5e305ad4bba..00000000000 --- a/packages/taiko-client/prover/server/api.go +++ /dev/null @@ -1,301 +0,0 @@ -package server - -import ( - "context" - "math/big" - "net/http" - "time" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/labstack/echo/v4" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" -) - -const ( - rpcTimeout = 1 * time.Minute -) - -// @title Taiko Prover Server API -// @version 1.0 -// @termsOfService http://swagger.io/terms/ - -// @contact.name API Support -// @contact.url https://community.taiko.xyz/ -// @contact.email info@taiko.xyz - -// @license.name MIT -// @license.url https://github.com/taikoxyz/taiko-mono/packages/taiko-client/blob/main/LICENSE.md - -// CreateAssignmentRequestBody represents a request body when handling assignment creation request. -type CreateAssignmentRequestBody struct { - Proposer common.Address `json:"proposer"` - FeeToken common.Address `json:"feeToken"` - TierFees []encoding.TierFee `json:"tierFees"` - Expiry uint64 `json:"expiry"` - BlobHash common.Hash `json:"blobHash"` -} - -// Status represents the current prover server status. -type Status struct { - MinOptimisticTierFee uint64 `json:"minOptimisticTierFee"` - MinSgxTierFee uint64 `json:"minSgxTierFee"` - MinSgxAndZkVMTierFee uint64 `json:"minSgxAndZkVMTierFee"` - MaxExpiry uint64 `json:"maxExpiry"` - Prover string `json:"prover"` -} - -// GetStatus handles a query to the current prover server status. -// -// @Summary Get current prover server status -// @ID get-status -// @Accept json -// @Produce json -// @Success 200 {object} Status -// @Router /status [get] -func (s *ProverServer) GetStatus(c echo.Context) error { - return c.JSON(http.StatusOK, &Status{ - MinOptimisticTierFee: s.minOptimisticTierFee.Uint64(), - MinSgxTierFee: s.minSgxTierFee.Uint64(), - MinSgxAndZkVMTierFee: s.minSgxAndZkVMTierFee.Uint64(), - MaxExpiry: uint64(s.maxExpiry.Seconds()), - Prover: s.proverAddress.Hex(), - }) -} - -// ProposeBlockResponse represents the JSON response which will be returned by -// the ProposeBlock request handler. -type ProposeBlockResponse struct { - SignedPayload []byte `json:"signedPayload"` - Prover common.Address `json:"prover"` - MaxBlockID uint64 `json:"maxBlockID"` - MaxProposedIn uint64 `json:"maxProposedIn"` -} - -// CreateAssignment handles a block proof assignment request, decides if this prover wants to -// handle this block, and if so, returns a signed payload the proposer -// can submit onchain. -// -// @Summary Try to accept a block proof assignment -// @Param body body server.CreateAssignmentRequestBody true "assignment request body" -// @Accept json -// @Produce json -// @Success 200 {object} ProposeBlockResponse -// @Failure 422 {string} string "empty blob hash" -// @Failure 422 {string} string "only receive ETH" -// @Failure 422 {string} string "insufficient prover balance" -// @Failure 422 {string} string "proof fee too low" -// @Failure 422 {string} string "expiry too long" -// @Failure 422 {string} string "prover does not have capacity" -// @Router /assignment [post] -func (s *ProverServer) CreateAssignment(c echo.Context) error { - req := new(CreateAssignmentRequestBody) - if err := c.Bind(req); err != nil { - return c.JSON(http.StatusUnprocessableEntity, err) - } - - log.Info( - "Proof assignment request body", - "feeToken", req.FeeToken, - "expiry", req.Expiry, - "tierFees", req.TierFees, - "blobHash", req.BlobHash, - "currentUsedCapacity", len(s.proofSubmissionCh), - ) - - // If the prover set address is set, use it as the prover address. - prover := s.proverAddress - if s.proverSetAddress != rpc.ZeroAddress { - prover = s.proverSetAddress - } - - // 1. Check if the request body is valid. - if req.BlobHash == (common.Hash{}) { - log.Warn("Empty blob hash", "prover", s.proverAddress) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "empty blob hash") - } - if req.FeeToken != (common.Address{}) { - log.Warn("Only receive ETH", "prover", s.proverAddress) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "only receive ETH") - } - - // 2. Check if the prover has the required minimum on-chain ETH and Taiko token balance. - ok, err := s.checkMinEthAndToken(c.Request().Context(), prover) - if err != nil { - log.Error("Failed to check prover's ETH and Taiko token balance", "error", err) - return echo.NewHTTPError(http.StatusInternalServerError, err) - } - - if !ok { - log.Error("Insufficient prover balance", "prover", s.proverAddress) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "insufficient prover balance") - } - - // 3. Check if the prover's token balance is enough to cover the bonds. - if ok, err = rpc.CheckProverBalance( - c.Request().Context(), - s.rpc, - prover, - s.assignmentHookAddress, - s.livenessBond, - ); err != nil { - log.Error("Failed to check prover's token balance", "error", err) - return echo.NewHTTPError(http.StatusInternalServerError, err) - } - if !ok { - log.Warn( - "Insufficient prover token balance, please get more tokens or wait for verification of the blocks you proved", - "prover", s.proverAddress, - ) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "insufficient prover balance") - } - - // 4. Check if the proof fee meets prover's minimum requirement for each tier. - for _, tier := range req.TierFees { - if tier.Tier == encoding.TierGuardianMajorityID { - continue - } - - if tier.Tier == encoding.TierGuardianMinorityID { - continue - } - - var minTierFee *big.Int - switch tier.Tier { - case encoding.TierOptimisticID: - minTierFee = s.minOptimisticTierFee - case encoding.TierSgxID: - minTierFee = s.minSgxTierFee - case encoding.TierSgxAndZkVMID: - minTierFee = s.minSgxAndZkVMTierFee - default: - log.Warn("Unknown tier", "tier", tier.Tier, "fee", tier.Fee, "proposerIP", c.RealIP()) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "unknown tier") - } - - if tier.Fee.Cmp(minTierFee) < 0 { - log.Warn( - "Proof fee too low", - "tier", tier.Tier, - "fee", tier.Fee, - "minTierFee", minTierFee, - "proposerIP", c.RealIP(), - ) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "proof fee too low") - } - } - - // 5. Check if the expiry is too long. - if req.Expiry > uint64(time.Now().Add(s.maxExpiry).Unix()) { - log.Warn( - "Expiry too long", - "requestExpiry", req.Expiry, - "srvMaxExpiry", s.maxExpiry, - "proposerIP", c.RealIP(), - ) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "expiry too long") - } - - // 6. Check if the prover has any capacity now. - if s.proofSubmissionCh != nil && len(s.proofSubmissionCh) == cap(s.proofSubmissionCh) { - log.Warn("Prover does not have capacity", "capacity", cap(s.proofSubmissionCh)) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "prover does not have capacity") - } - - // 7. Encode and sign the prover assignment payload. - l1Head, err := s.rpc.L1.BlockNumber(c.Request().Context()) - if err != nil { - log.Error("Failed to get L1 block head", "error", err) - return echo.NewHTTPError(http.StatusUnprocessableEntity, err) - } - - encoded, err := encoding.EncodeProverAssignmentPayload( - s.protocolConfigs.ChainId, - s.taikoL1Address, - s.assignmentHookAddress, - req.Proposer, - prover, - req.BlobHash, - req.FeeToken, - req.Expiry, - l1Head+s.maxSlippage, - s.maxProposedIn, - req.TierFees, - ) - if err != nil { - log.Error("Failed to encode proverAssignment payload data", "error", err) - return echo.NewHTTPError(http.StatusUnprocessableEntity, err) - } - - signed, err := crypto.Sign(crypto.Keccak256Hash(encoded).Bytes(), s.proverPrivateKey) - if err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, err) - } - - // 8. Return the signed payload. - return c.JSON(http.StatusOK, &ProposeBlockResponse{ - SignedPayload: signed, - Prover: prover, - MaxBlockID: l1Head + s.maxSlippage, - MaxProposedIn: s.maxProposedIn, - }) -} - -// checkMinEthAndToken checks if the prover has the required minimum on-chain Taiko token balance. -func (s *ProverServer) checkMinEthAndToken(ctx context.Context, proverAddress common.Address) (bool, error) { - ctx, cancel := context.WithTimeout(ctx, rpcTimeout) - defer cancel() - - // 1. Check prover's ETH balance, if it's using proverSet. - if proverAddress == s.proverAddress { - ethBalance, err := s.rpc.L1.BalanceAt(ctx, proverAddress, nil) - if err != nil { - return false, err - } - - log.Info( - "Prover's ETH balance", - "balance", utils.WeiToEther(ethBalance), - "address", proverAddress, - ) - - if ethBalance.Cmp(s.minEthBalance) <= 0 { - log.Warn( - "Prover does not have required minimum on-chain ETH balance", - "providedProver", proverAddress, - "ethBalance", utils.WeiToEther(ethBalance), - "minEthBalance", utils.WeiToEther(s.minEthBalance), - ) - return false, nil - } - } - - // 2. Check prover's Taiko token balance. - balance, err := s.rpc.TaikoToken.BalanceOf(&bind.CallOpts{Context: ctx}, proverAddress) - if err != nil { - return false, err - } - - log.Info( - "Prover's Taiko token balance", - "balance", utils.WeiToEther(balance), - "address", proverAddress, - ) - - if balance.Cmp(s.minTaikoTokenBalance) <= 0 { - log.Warn( - "Prover does not have required on-chain Taiko token balance", - "providedProver", proverAddress, - "taikoTokenBalance", utils.WeiToEther(balance), - "minTaikoTokenBalance", utils.WeiToEther(s.minTaikoTokenBalance), - ) - return false, nil - } - - return true, nil -} diff --git a/packages/taiko-client/prover/server/api_test.go b/packages/taiko-client/prover/server/api_test.go deleted file mode 100644 index 7f72c1a2f00..00000000000 --- a/packages/taiko-client/prover/server/api_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package server - -import ( - "encoding/json" - "io" - "net/http" - "strings" - "time" - - "github.com/ethereum/go-ethereum/common" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" -) - -func (s *ProverServerTestSuite) TestGetStatusSuccess() { - res := s.sendReq("/status") - s.Equal(http.StatusOK, res.StatusCode) - - status := new(Status) - - defer res.Body.Close() - b, err := io.ReadAll(res.Body) - s.Nil(err) - s.Nil(json.Unmarshal(b, &status)) - - s.Equal(s.s.minOptimisticTierFee.Uint64(), status.MinOptimisticTierFee) - s.Equal(s.s.minSgxTierFee.Uint64(), status.MinSgxTierFee) - s.Equal(uint64(s.s.maxExpiry.Seconds()), status.MaxExpiry) - s.NotEmpty(status.Prover) -} - -func (s *ProverServerTestSuite) TestProposeBlockSuccess() { - data, err := json.Marshal(CreateAssignmentRequestBody{ - FeeToken: (common.Address{}), - TierFees: []encoding.TierFee{ - {Tier: encoding.TierOptimisticID, Fee: common.Big256}, - {Tier: encoding.TierSgxID, Fee: common.Big256}, - }, - Expiry: uint64(time.Now().Add(time.Minute).Unix()), - BlobHash: common.BigToHash(common.Big1), - }) - s.Nil(err) - res, err := http.Post(s.testServer.URL+"/assignment", "application/json", strings.NewReader(string(data))) - s.Nil(err) - s.Equal(http.StatusOK, res.StatusCode) - defer res.Body.Close() - b, err := io.ReadAll(res.Body) - s.Nil(err) - s.Contains(string(b), "signedPayload") -} diff --git a/packages/taiko-client/prover/server/server.go b/packages/taiko-client/prover/server/server.go deleted file mode 100644 index a996a81d0d1..00000000000 --- a/packages/taiko-client/prover/server/server.go +++ /dev/null @@ -1,148 +0,0 @@ -package server - -import ( - "context" - "crypto/ecdsa" - "math/big" - "net/http" - "os" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/labstack/echo/v4" - "github.com/labstack/echo/v4/middleware" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" -) - -// @title Taiko Prover Server API -// @version 1.0 -// @termsOfService http://swagger.io/terms/ - -// @contact.name API Support -// @contact.url https://community.taiko.xyz/ -// @contact.email info@taiko.xyz - -// @license.name MIT -// @license.url https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md -// ProverServer represents a prover server instance. -type ProverServer struct { - echo *echo.Echo - proverPrivateKey *ecdsa.PrivateKey - proverAddress common.Address - proverSetAddress common.Address - minOptimisticTierFee *big.Int - minSgxTierFee *big.Int - minSgxAndZkVMTierFee *big.Int - minEthBalance *big.Int - minTaikoTokenBalance *big.Int - maxExpiry time.Duration - maxSlippage uint64 - maxProposedIn uint64 - taikoL1Address common.Address - assignmentHookAddress common.Address - proofSubmissionCh chan<- proofProducer.ProofRequestBody - rpc *rpc.Client - protocolConfigs *bindings.TaikoDataConfig - livenessBond *big.Int -} - -// NewProverServerOpts contains all configurations for creating a prover server instance. -type NewProverServerOpts struct { - ProverPrivateKey *ecdsa.PrivateKey - ProverSetAddress common.Address - MinOptimisticTierFee *big.Int - MinSgxTierFee *big.Int - MinSgxAndZkVMTierFee *big.Int - MinEthBalance *big.Int - MinTaikoTokenBalance *big.Int - MaxExpiry time.Duration - MaxBlockSlippage uint64 - MaxProposedIn uint64 - TaikoL1Address common.Address - AssignmentHookAddress common.Address - ProofSubmissionCh chan<- proofProducer.ProofRequestBody - RPC *rpc.Client - ProtocolConfigs *bindings.TaikoDataConfig - LivenessBond *big.Int -} - -// New creates a new prover server instance. -func New(opts *NewProverServerOpts) (*ProverServer, error) { - srv := &ProverServer{ - proverPrivateKey: opts.ProverPrivateKey, - proverAddress: crypto.PubkeyToAddress(opts.ProverPrivateKey.PublicKey), - proverSetAddress: opts.ProverSetAddress, - echo: echo.New(), - minOptimisticTierFee: opts.MinOptimisticTierFee, - minSgxTierFee: opts.MinSgxTierFee, - minSgxAndZkVMTierFee: opts.MinSgxAndZkVMTierFee, - minEthBalance: opts.MinEthBalance, - minTaikoTokenBalance: opts.MinTaikoTokenBalance, - maxExpiry: opts.MaxExpiry, - maxProposedIn: opts.MaxProposedIn, - maxSlippage: opts.MaxBlockSlippage, - taikoL1Address: opts.TaikoL1Address, - assignmentHookAddress: opts.AssignmentHookAddress, - proofSubmissionCh: opts.ProofSubmissionCh, - rpc: opts.RPC, - protocolConfigs: opts.ProtocolConfigs, - livenessBond: opts.LivenessBond, - } - - srv.echo.HideBanner = true - srv.configureMiddleware() - srv.configureRoutes() - - return srv, nil -} - -// Start starts the HTTP server. -func (s *ProverServer) Start(address string) error { - return s.echo.Start(address) -} - -// Shutdown shuts down the HTTP server. -func (s *ProverServer) Shutdown(ctx context.Context) error { - return s.echo.Shutdown(ctx) -} - -// Health endpoints for probes. -func (s *ProverServer) Health(c echo.Context) error { - return c.NoContent(http.StatusOK) -} - -// LogSkipper implements the `middleware.Skipper` interface. -func LogSkipper(c echo.Context) bool { - switch c.Request().URL.Path { - case "/healthz": - return true - default: - return true - } -} - -// configureMiddleware configures the server middlewares. -func (s *ProverServer) configureMiddleware() { - s.echo.Use(middleware.RequestID()) - - s.echo.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{ - Skipper: LogSkipper, - Format: `{"time":"${time_rfc3339_nano}","level":"INFO","message":{"id":"${id}","remote_ip":"${remote_ip}",` + - `"host":"${host}","method":"${method}","uri":"${uri}","user_agent":"${user_agent}",` + - `"response_status":${status},"error":"${error}","latency":${latency},"latency_human":"${latency_human}",` + - `"bytes_in":${bytes_in},"bytes_out":${bytes_out}}}` + "\n", - Output: os.Stdout, - })) -} - -// configureRoutes contains all routes which will be used by prover server. -func (s *ProverServer) configureRoutes() { - s.echo.GET("/", s.Health) - s.echo.GET("/healthz", s.Health) - s.echo.GET("/status", s.GetStatus) - s.echo.POST("/assignment", s.CreateAssignment) -} diff --git a/packages/taiko-client/prover/server/server_test.go b/packages/taiko-client/prover/server/server_test.go deleted file mode 100644 index 37907b2f7d8..00000000000 --- a/packages/taiko-client/prover/server/server_test.go +++ /dev/null @@ -1,128 +0,0 @@ -package server - -import ( - "context" - "fmt" - "net/http" - "net/http/httptest" - "net/url" - "os" - "testing" - "time" - - "github.com/cenkalti/backoff/v4" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/go-resty/resty/v2" - "github.com/phayes/freeport" - "github.com/stretchr/testify/suite" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" -) - -type ProverServerTestSuite struct { - suite.Suite - s *ProverServer - testServer *httptest.Server -} - -func (s *ProverServerTestSuite) SetupTest() { - l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) - s.Nil(err) - - rpcClient, err := rpc.NewClient(context.Background(), &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), - JwtSecret: os.Getenv("JWT_SECRET"), - Timeout: 5 * time.Second, - }) - s.Nil(err) - - configs, err := rpcClient.TaikoL1.GetConfig(nil) - s.Nil(err) - - p, err := New(&NewProverServerOpts{ - ProverPrivateKey: l1ProverPrivKey, - MinOptimisticTierFee: common.Big1, - MinSgxTierFee: common.Big1, - MinSgxAndZkVMTierFee: common.Big1, - MinEthBalance: common.Big1, - MinTaikoTokenBalance: common.Big1, - MaxExpiry: time.Hour, - ProofSubmissionCh: make(chan<- proofProducer.ProofRequestBody, 1024), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - RPC: rpcClient, - ProtocolConfigs: &configs, - LivenessBond: common.Big0, - }) - s.Nil(err) - - p.echo.HideBanner = true - p.configureMiddleware() - p.configureRoutes() - s.s = p - s.testServer = httptest.NewServer(p.echo) -} - -func (s *ProverServerTestSuite) TestHealth() { - resp := s.sendReq("/healthz") - defer resp.Body.Close() - s.Equal(http.StatusOK, resp.StatusCode) -} - -func (s *ProverServerTestSuite) TestRoot() { - resp := s.sendReq("/") - defer resp.Body.Close() - s.Equal(http.StatusOK, resp.StatusCode) -} - -func (s *ProverServerTestSuite) TestStartShutdown() { - port, err := freeport.GetFreePort() - s.Nil(err) - - url, err := url.Parse(fmt.Sprintf("http://localhost:%v", port)) - s.Nil(err) - - go func() { - if err := s.s.Start(fmt.Sprintf(":%v", port)); err != nil { - log.Error("Failed to start prover server", "error", err) - } - }() - - // Wait till the server fully started. - s.Nil(backoff.Retry(func() error { - res, err := resty.New().R().Get(url.String() + "/healthz") - if err != nil { - return err - } - if !res.IsSuccess() { - return fmt.Errorf("invalid response status code: %d", res.StatusCode()) - } - - return nil - }, backoff.NewExponentialBackOff())) - - s.Nil(s.s.Shutdown(context.Background())) -} - -func (s *ProverServerTestSuite) TearDownTest() { - s.testServer.Close() -} - -func TestProverServerTestSuite(t *testing.T) { - suite.Run(t, new(ProverServerTestSuite)) -} - -func (s *ProverServerTestSuite) sendReq(path string) *http.Response { - res, err := http.Get(s.testServer.URL + path) - s.Nil(err) - return res -} diff --git a/packages/taiko-client/scripts/gen_bindings.sh b/packages/taiko-client/scripts/gen_bindings.sh index b577b6294db..6848dde2e5c 100755 --- a/packages/taiko-client/scripts/gen_bindings.sh +++ b/packages/taiko-client/scripts/gen_bindings.sh @@ -26,55 +26,51 @@ echo "" echo "Start generating go contract bindings..." echo "" -cat ../protocol/out/TaikoL1.sol/TaikoL1.json | +cat ../protocol/out/layer1/TaikoL1.sol/TaikoL1.json | jq .abi | ${ABIGEN_BIN} --abi - --type TaikoL1Client --pkg bindings --out $DIR/../bindings/gen_taiko_l1.go -cat ../protocol/out/LibProving.sol/LibProving.json | +cat ../protocol/out/layer1/LibProving.sol/LibProving.json | jq .abi | ${ABIGEN_BIN} --abi - --type LibProving --pkg bindings --out $DIR/../bindings/gen_lib_proving.go -cat ../protocol/out/LibProposing.sol/LibProposing.json | +cat ../protocol/out/layer1/LibProposing.sol/LibProposing.json | jq .abi | ${ABIGEN_BIN} --abi - --type LibProposing --pkg bindings --out $DIR/../bindings/gen_lib_proposing.go -cat ../protocol/out/LibUtils.sol/LibUtils.json | +cat ../protocol/out/layer1/LibUtils.sol/LibUtils.json | jq .abi | ${ABIGEN_BIN} --abi - --type LibUtils --pkg bindings --out $DIR/../bindings/gen_lib_utils.go -cat ../protocol/out/LibVerifying.sol/LibVerifying.json | +cat ../protocol/out/layer1/LibVerifying.sol/LibVerifying.json | jq .abi | ${ABIGEN_BIN} --abi - --type LibVerifying --pkg bindings --out $DIR/../bindings/gen_lib_verifying.go -cat ../protocol/out/TaikoL2.sol/TaikoL2.json | +cat ../protocol/out/layer2/TaikoL2.sol/TaikoL2.json | jq .abi | ${ABIGEN_BIN} --abi - --type TaikoL2Client --pkg bindings --out $DIR/../bindings/gen_taiko_l2.go -cat ../protocol/out/TaikoToken.sol/TaikoToken.json | +cat ../protocol/out/layer1/TaikoToken.sol/TaikoToken.json | jq .abi | ${ABIGEN_BIN} --abi - --type TaikoToken --pkg bindings --out $DIR/../bindings/gen_taiko_token.go -cat ../protocol/out/AddressManager.sol/AddressManager.json | +cat ../protocol/out/layer1/AddressManager.sol/AddressManager.json | jq .abi | ${ABIGEN_BIN} --abi - --type AddressManager --pkg bindings --out $DIR/../bindings/gen_address_manager.go -cat ../protocol/out/GuardianProver.sol/GuardianProver.json | +cat ../protocol/out/layer1/GuardianProver.sol/GuardianProver.json | jq .abi | ${ABIGEN_BIN} --abi - --type GuardianProver --pkg bindings --out $DIR/../bindings/gen_guardian_prover.go -cat ../protocol/out/AssignmentHook.sol/AssignmentHook.json | - jq .abi | - ${ABIGEN_BIN} --abi - --type AssignmentHook --pkg bindings --out $DIR/../bindings/gen_assignment_hook.go - -cat ../protocol/out/ProverSet.sol/ProverSet.json | +cat ../protocol/out/layer1/ProverSet.sol/ProverSet.json | jq .abi | ${ABIGEN_BIN} --abi - --type ProverSet --pkg bindings --out $DIR/../bindings/gen_prover_set.go -cat ../protocol/out/DevnetTierProvider.sol/DevnetTierProvider.json | +cat ../protocol/out/layer1/MainnetTierRouter.sol/MainnetTierRouter.json | jq .abi | ${ABIGEN_BIN} --abi - --type TierProvider --pkg bindings --out $DIR/../bindings/gen_tier_provider.go -cat ../protocol/out/SgxVerifier.sol/SgxVerifier.json | +cat ../protocol/out/layer1/SgxVerifier.sol/SgxVerifier.json | jq .abi | ${ABIGEN_BIN} --abi - --type SgxVerifier --pkg bindings --out $DIR/../bindings/gen_sgx_verifier.go diff --git a/packages/taiko-client/scripts/gen_swagger_json.sh b/packages/taiko-client/scripts/gen_swagger_json.sh index 59dce311dbd..6d3a297c984 100755 --- a/packages/taiko-client/scripts/gen_swagger_json.sh +++ b/packages/taiko-client/scripts/gen_swagger_json.sh @@ -1,3 +1,3 @@ #/bin/sh -swag init -g api.go -d prover/server --pd +swag init -g server.go -d driver/soft_blocks --pd diff --git a/packages/taikoon-ui/.env.example b/packages/taikoon-ui/.env.example index eb45e513c7d..71ef193d99a 100644 --- a/packages/taikoon-ui/.env.example +++ b/packages/taikoon-ui/.env.example @@ -1,3 +1 @@ -PUBLIC_WALLETCONNECT_PROJECT_ID=fake -PUBLIC_IPFS_GATEWAY=https://taikoons.4everland.link/ipfs/ -PUBLIC_LAUNCH_DATE=2024-05-26T00:00:00 +export PUBLIC_WALLETCONNECT_PROJECT_ID="" diff --git a/packages/taikoon-ui/CHANGELOG.md b/packages/taikoon-ui/CHANGELOG.md index 5df91bb5749..39697bdcb00 100644 --- a/packages/taikoon-ui/CHANGELOG.md +++ b/packages/taikoon-ui/CHANGELOG.md @@ -1,5 +1,61 @@ # Changelog +## [1.3.0](https://github.com/taikoxyz/taiko-mono/compare/taikoon-ui-v1.2.0...taikoon-ui-v1.3.0) (2024-09-13) + + +### Features + +* **taikoons:** updated whitelist ([#18082](https://github.com/taikoxyz/taiko-mono/issues/18082)) ([e340c10](https://github.com/taikoxyz/taiko-mono/commit/e340c102f0537d1b1531806f4164d18976bae503)) + + +### Build + +* **deps-dev:** bump @sveltejs/kit from 2.5.7 to 2.5.21 ([#17901](https://github.com/taikoxyz/taiko-mono/issues/17901)) ([7a32ac4](https://github.com/taikoxyz/taiko-mono/commit/7a32ac40a654521c82cb3ff5b6f5af87d0a915a4)) +* **deps:** bump @web3modal/common from 4.1.11 to 5.0.11 ([#17876](https://github.com/taikoxyz/taiko-mono/issues/17876)) ([6ac4eb0](https://github.com/taikoxyz/taiko-mono/commit/6ac4eb0141be1bc3332da6ff63e8bebd9c00e326)) + +## [1.2.0](https://github.com/taikoxyz/taiko-mono/compare/taikoon-ui-v1.1.1...taikoon-ui-v1.2.0) (2024-07-04) + + +### Features + +* **nfts:** taikoon-ui performance upgrades ([#17720](https://github.com/taikoxyz/taiko-mono/issues/17720)) ([936bb95](https://github.com/taikoxyz/taiko-mono/commit/936bb95057815e5473d36304058a34be8c81ff76)) +* **nfts:** taikoon-ui updated whitelist ([#17719](https://github.com/taikoxyz/taiko-mono/issues/17719)) ([4e5bdbb](https://github.com/taikoxyz/taiko-mono/commit/4e5bdbbe497c56a52a150dcc15213e8effb7a0d8)) +* **nfts:** taikoon-ui updated whitelist 28-06-2024 ([#17701](https://github.com/taikoxyz/taiko-mono/issues/17701)) ([3687b1e](https://github.com/taikoxyz/taiko-mono/commit/3687b1eb81f6032713e3ca18824778e9193c1314)) + + +### Bug Fixes + +* **nfts:** taikoon-ui bug fixing ([#17644](https://github.com/taikoxyz/taiko-mono/issues/17644)) ([2c90a7f](https://github.com/taikoxyz/taiko-mono/commit/2c90a7fee984c8c1e3389076a3ed933de4e67215)) +* **nfts:** taikoon-ui error reporting improved ([#17683](https://github.com/taikoxyz/taiko-mono/issues/17683)) ([116d3f4](https://github.com/taikoxyz/taiko-mono/commit/116d3f4886dea01333b829677ec9b6d4492479c6)) + +## [1.1.1](https://github.com/taikoxyz/taiko-mono/compare/taikoon-ui-v1.1.0...taikoon-ui-v1.1.1) (2024-06-17) + + +### Bug Fixes + +* **nfts:** taikoon-ui whitelist update ([#17491](https://github.com/taikoxyz/taiko-mono/issues/17491)) ([403c18f](https://github.com/taikoxyz/taiko-mono/commit/403c18f7f77a94ef8675eacea7b512ea5a2ddfce)) + +## [1.1.0](https://github.com/taikoxyz/taiko-mono/compare/taikoon-ui-v1.0.0...taikoon-ui-v1.1.0) (2024-06-14) + + +### Features + +* **nfts:** adapt taikoon-ui to the new package structure ([#17271](https://github.com/taikoxyz/taiko-mono/issues/17271)) ([6b7f44a](https://github.com/taikoxyz/taiko-mono/commit/6b7f44a2e2e6dc9ee63a565c95ba5023e66940c6)) +* **nfts:** taikoon ui fixes, v3 ([#17218](https://github.com/taikoxyz/taiko-mono/issues/17218)) ([e0f064a](https://github.com/taikoxyz/taiko-mono/commit/e0f064aa7e288c17d23906127e6a77da5f81feda)) +* **nfts:** taikoon-ui adaptation for TaikoonTokenV2 ([#17593](https://github.com/taikoxyz/taiko-mono/issues/17593)) ([af33b3b](https://github.com/taikoxyz/taiko-mono/commit/af33b3bce7a0e940a1857f56d6e012331f147cce)) +* **nfts:** taikoon-ui pre-mint legal disclaimer ([#17482](https://github.com/taikoxyz/taiko-mono/issues/17482)) ([9fae4d0](https://github.com/taikoxyz/taiko-mono/commit/9fae4d04d8282424b8f74933381f0ef7c9a30255)) +* **nfts:** taikoon-ui updated list of blocked countries ([#17403](https://github.com/taikoxyz/taiko-mono/issues/17403)) ([78153ce](https://github.com/taikoxyz/taiko-mono/commit/78153ced57ddfb331e9ed3186bbf8edc675e8251)) +* **nfts:** ui-lib integration into taikoon-ui ([#17220](https://github.com/taikoxyz/taiko-mono/issues/17220)) ([849a3c4](https://github.com/taikoxyz/taiko-mono/commit/849a3c446936285c621176e332d1136c1f4ddb6b)) +* **taikoon:** geoblocking ([#17201](https://github.com/taikoxyz/taiko-mono/issues/17201)) ([6658f6a](https://github.com/taikoxyz/taiko-mono/commit/6658f6ae553c3c02560a9fa622f1dd3f938c119d)) +* **taikoon:** ipfs integration with 4everland ([#17119](https://github.com/taikoxyz/taiko-mono/issues/17119)) ([46670cf](https://github.com/taikoxyz/taiko-mono/commit/46670cfb8f087c87c42799d7ded3a0dc1258a963)) + + +### Bug Fixes + +* **nfts:** taikoon ui taiko-mainnet deployment ([#17405](https://github.com/taikoxyz/taiko-mono/issues/17405)) ([db40dbd](https://github.com/taikoxyz/taiko-mono/commit/db40dbdf5207dbcaad630d010728a621a644898d)) +* **nfts:** taikoon-ui design r4 ([#17423](https://github.com/taikoxyz/taiko-mono/issues/17423)) ([4cf0739](https://github.com/taikoxyz/taiko-mono/commit/4cf073997fd9d68bdf525a279a89fcbb2008ca0a)) +* **nfts:** taikoon-ui mobile visual fixes ([#17490](https://github.com/taikoxyz/taiko-mono/issues/17490)) ([fbfcc7f](https://github.com/taikoxyz/taiko-mono/commit/fbfcc7f3810d0122f46673944c39e5f4d759d4e0)) + ## 1.0.0 (2024-05-15) diff --git a/packages/taikoon-ui/package.json b/packages/taikoon-ui/package.json index 7d47b7ef9e8..cad577cca04 100644 --- a/packages/taikoon-ui/package.json +++ b/packages/taikoon-ui/package.json @@ -1,6 +1,6 @@ { "name": "taikoon-ui", - "version": "1.0.0", + "version": "1.3.0", "private": true, "scripts": { "dev": "vite dev", @@ -15,13 +15,14 @@ "test:integration": "playwright test", "test:unit": "vitest", "start": "npm run generate:abi && vite dev --open --host 0.0.0.0", + "start:prod": "vite dev --open --host 0.0.0.0 --mode production", "generate:abi": "cd ../nfts && pnpm compile && cd - && wagmi generate" }, "devDependencies": { "@chromatic-com/storybook": "^1.3.1", "@playwright/test": "^1.28.1", "@sveltejs/adapter-auto": "^3.0.0", - "@sveltejs/kit": "^2.0.0", + "@sveltejs/kit": "^2.5.21", "@sveltejs/vite-plugin-svelte": "^3.1.0", "@types/eslint": "^8.56.0", "@types/jest": "^29.5.12", @@ -58,7 +59,7 @@ "@wagmi/cli": "^2.1.4", "@wagmi/connectors": "^4.1.18", "@wagmi/core": "^2.8.0", - "@web3modal/common": "^4.1.1", + "@web3modal/common": "^5.0.11", "@web3modal/ui": "^4.1.1", "@web3modal/wagmi": "^4.1.1", "@zerodevx/svelte-toast": "^0.9.5", @@ -69,7 +70,7 @@ "minidenticons": "^4.2.1", "postcss": "^8.4.38", "tailwindcss": "^3.4.3", - "viem": "^2.9.29", + "viem": "^2.15.1", "@taiko/ui-lib": "workspace:*" } } diff --git a/packages/taikoon-ui/src/components/Collection/Collection.svelte b/packages/taikoon-ui/src/components/Collection/Collection.svelte index 8692ed6721a..932d922ef39 100644 --- a/packages/taikoon-ui/src/components/Collection/Collection.svelte +++ b/packages/taikoon-ui/src/components/Collection/Collection.svelte @@ -2,6 +2,7 @@ import { ResponsiveController } from '@taiko/ui-lib'; import { getContext, onMount } from 'svelte'; + import { Button } from '$components/core/Button'; import { classNames } from '$lib/util/classNames'; import type { ITaikoonDetail } from '$stores/taikoonDetail'; @@ -10,6 +11,7 @@ import { default as TaikoonDetail } from './TaikoonDetail.svelte'; export let tokenIds: number[] = []; + let windowSize: 'sm' | 'md' | 'lg' = 'md'; export let disableClick = false; @@ -21,10 +23,21 @@ $: selectedTaikoonId = -1; + $: visibleTokenIds = [] as number[]; onMount(() => { onRouteChange(); }); + $: tokenBatch = 50; + $: tokenIds, + visibleTokenIds.length === 0 && + (visibleTokenIds = tokenIds.length > tokenBatch ? tokenIds.slice(0, tokenBatch) : tokenIds); + + function loadMore() { + const nextBatch = tokenIds.slice(visibleTokenIds.length, visibleTokenIds.length + tokenBatch); + visibleTokenIds = [...visibleTokenIds, ...nextBatch]; + } + async function onRouteChange() { const hash = location.hash; const taikoonId = parseInt(hash.replace('#', '')); @@ -48,8 +61,9 @@
{title}
+
+ +
diff --git a/packages/taikoon-ui/src/components/Header/Header.svelte b/packages/taikoon-ui/src/components/Header/Header.svelte index 6e47bac663a..902f9970906 100644 --- a/packages/taikoon-ui/src/components/Header/Header.svelte +++ b/packages/taikoon-ui/src/components/Header/Header.svelte @@ -56,8 +56,8 @@ return; } - const canMint = await Token.canMint(); - const totalMintCount = await User.totalWhitelistMintCount(); + const canMint = await Token.canMint(address); + const totalMintCount = await User.totalWhitelistMintCount(address); displayYourTaikoonsButton = !canMint && totalMintCount > 0; isChecking = false; diff --git a/packages/taikoon-ui/src/components/Mint/Mint.svelte b/packages/taikoon-ui/src/components/Mint/Mint.svelte index 5d942c5c61c..cb2add99496 100644 --- a/packages/taikoon-ui/src/components/Mint/Mint.svelte +++ b/packages/taikoon-ui/src/components/Mint/Mint.svelte @@ -7,15 +7,16 @@ import { Divider } from '$components/core/Divider'; import InfoRow from '$components/core/InfoRow/InfoRow.svelte'; import { errorToast } from '$components/core/Toast'; + import { web3modal } from '$lib/connect'; + import Token from '$lib/token'; import User from '$lib/user'; import { classNames } from '$lib/util/classNames'; + import { account } from '$stores/account'; import type { IMint } from '$stores/mint'; import { Button } from '$ui/Button'; import { ProgressBar } from '$ui/ProgressBar'; import { Spinner } from '$ui/Spinner'; - import Token from '../../lib/token'; - import { account } from '../../stores/account'; import type { IAddress } from '../../types'; import { NftRenderer } from '../NftRenderer'; import { @@ -55,23 +56,20 @@ async function calculateGasCost() { isCalculating = true; - - gasCost = await Token.estimateMintGasCost(); + gasCost = await Token.estimateMintGasCost($mintState.address); isCalculating = false; } function reset() { canMint = false; - totalMintCount = 0; - gasCost = 0; - mintState.set({ ...$mintState, totalMintCount, address: zeroAddress }); - isReady = true; + mintState.set({ ...$mintState, address: zeroAddress, totalMintCount: -1 }); } async function load() { if (isReady && (!$account || ($account && !$account.isConnected))) { return reset(); } + isReady = false; if (totalSupply < 0 && mintMax < 0) { totalSupply = await Token.totalSupply(); @@ -80,6 +78,7 @@ } if (!$account || !$account.address || $account.address === zeroAddress) { + isReady = true; return reset(); } const address = $account.address as IAddress; @@ -87,21 +86,24 @@ const balance = await Token.balanceOf(address); hasAlreadyMinted = balance > 0; + if (totalMintCount < 0) { + totalMintCount = await User.totalWhitelistMintCount(address); + } + + await calculateGasCost(); + + mintState.set({ ...$mintState, totalMintCount }); + if (!hasAlreadyMinted) { - canMint = await Token.canMint(); + canMint = await Token.canMint(address); } - if (!canMint) { - mintState.set({ ...$mintState, address: address.toLowerCase() as IAddress }); + if (!canMint) { + mintState.set({ ...$mintState, totalMintCount, address: address.toLowerCase() as IAddress }); isReady = true; return; } - if (totalMintCount < 0) { - totalMintCount = await User.totalWhitelistMintCount(); - await calculateGasCost(); - } - mintState.set({ ...$mintState, totalMintCount, address: address.toLowerCase() as IAddress }); isReady = true; @@ -131,20 +133,25 @@ }); mintState.set({ ...$mintState, tokenIds }); } catch (e: any) { - console.warn(e); - //showMintConfirmationModal = false + console.error(e); mintState.set({ ...$mintState, isModalOpen: false }); + if ( + e.shortMessage && + e.shortMessage === + 'The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account.' + ) { + e.shortMessage = 'You do not have enough ETH to cover the minting cost, please bridge some ETH to Taiko.'; + } + console.error('mint error', e.name); errorToast({ title: 'Mint Error', - message: e.message, + message: e.shortMessage || e.message, }); } mintState.set({ ...$mintState, isMinting: false }); await load(); } - import { web3modal } from '$lib/connect'; - let web3modalOpen = false; function connectWallet() { @@ -201,7 +208,7 @@ - {:else if !canMint || $mintState.totalMintCount === 0} + {:else if !canMint && $mintState.totalMintCount === 0}
@@ -223,13 +230,7 @@
- {/if} {:else} diff --git a/packages/taikoon-ui/src/components/NftRenderer/NftRenderer.svelte b/packages/taikoon-ui/src/components/NftRenderer/NftRenderer.svelte index 74a8ae7bf08..cef078fb9aa 100644 --- a/packages/taikoon-ui/src/components/NftRenderer/NftRenderer.svelte +++ b/packages/taikoon-ui/src/components/NftRenderer/NftRenderer.svelte @@ -6,7 +6,6 @@ import { DynamicImage } from '$components/DynamicImage'; import IPFS from '$lib/ipfs'; import { classNames } from '$lib/util/classNames'; - //import { nftCache } from '$stores/nftCache'; import { Theme, theme } from '$stores/theme'; import { Spinner } from '$ui/Spinner'; @@ -18,18 +17,6 @@ async function getTokenUri(id: number) { if (tokenId <= 0 || Number.isNaN(id)) return ''; - /* - const cached = $nftCache[id]; - let metadata; - if (!cached) { - metadata = await IPFS.getMetadata(id); - nftCache.set({ - ...$nftCache, - [id]: JSON.stringify(metadata), - }); - } else { - metadata = JSON.parse(cached); - }*/ const metadata = await IPFS.getMetadata(id); if (!metadata || !metadata.image) return ''; tokenURI = metadata.image; diff --git a/packages/taikoon-ui/src/components/SwitchChainModal/SwitchChainModal.svelte b/packages/taikoon-ui/src/components/SwitchChainModal/SwitchChainModal.svelte index 22fef90bd7c..294c5fbda33 100644 --- a/packages/taikoon-ui/src/components/SwitchChainModal/SwitchChainModal.svelte +++ b/packages/taikoon-ui/src/components/SwitchChainModal/SwitchChainModal.svelte @@ -2,8 +2,10 @@ import { switchChain } from '@wagmi/core'; import { t } from 'svelte-i18n'; import { type Chain, SwitchChainError, UserRejectedRequestError } from 'viem'; + import { taiko, taikoHekla } from 'viem/chains'; - import { config, taiko } from '$wagmi-config'; + import { isDevelopmentEnv } from '$lib/util/isDevelopmentEnv'; + import { config } from '$wagmi-config'; import { chains, getChainImage } from '../../lib/chain'; import { switchChainModal } from '../../stores/modal'; @@ -25,7 +27,7 @@ let switchingNetwork = false; - $: selectedChains = [taiko]; + $: selectedChains = [isDevelopmentEnv ? taikoHekla : taiko]; function closeModal() { $switchChainModal = false; diff --git a/packages/taikoon-ui/src/components/core/Section/Section.svelte b/packages/taikoon-ui/src/components/core/Section/Section.svelte index 08f7de001b8..53e7959957d 100644 --- a/packages/taikoon-ui/src/components/core/Section/Section.svelte +++ b/packages/taikoon-ui/src/components/core/Section/Section.svelte @@ -17,8 +17,8 @@ 'w-full', 'overflow-hidden', height === 'full' ? 'h-screen' : null, - height === 'min' ? 'h-[50vh] pt-32' : null, - height === 'fit' ? 'h-auto pt-32' : null, + height === 'min' ? 'h-[50vh] pt-16 md:pt-32' : null, + height === 'fit' ? 'h-auto pt-16 md:pt-32' : null, 'relative', 'flex flex-col', 'items-center', diff --git a/packages/taikoon-ui/src/components/modals/MintConfirmation.modal/MintConfirmation.modal.svelte b/packages/taikoon-ui/src/components/modals/MintConfirmation.modal/MintConfirmation.modal.svelte index 76d78c84c64..f93b23e54b3 100644 --- a/packages/taikoon-ui/src/components/modals/MintConfirmation.modal/MintConfirmation.modal.svelte +++ b/packages/taikoon-ui/src/components/modals/MintConfirmation.modal/MintConfirmation.modal.svelte @@ -47,7 +47,7 @@
Waiting for confirmation
- {$t('buttons.etherscan')} diff --git a/packages/taikoon-ui/src/components/sections/Countdown.section.svelte b/packages/taikoon-ui/src/components/sections/Countdown.section.svelte deleted file mode 100644 index 317bcae8e89..00000000000 --- a/packages/taikoon-ui/src/components/sections/Countdown.section.svelte +++ /dev/null @@ -1,99 +0,0 @@ - - -
- {#if windowSize === 'sm'} -
- -
- {/if} - -
- {#each counters as { label, value }, i} - {#if i == 2 && windowSize !== 'sm'} -
- -
- {/if} -
-
- -
-
- {label} -
-
- {/each} -
- - -
- - diff --git a/packages/taikoon-ui/src/components/sections/Information.section.svelte b/packages/taikoon-ui/src/components/sections/Information.section.svelte index 083b21c3c19..9d56ae499f4 100644 --- a/packages/taikoon-ui/src/components/sections/Information.section.svelte +++ b/packages/taikoon-ui/src/components/sections/Information.section.svelte @@ -1,4 +1,5 @@
-
+

{$t('content.sections.information.title')}

@@ -43,10 +45,18 @@
{#each eyes as _} -
+
{/each}
+ diff --git a/packages/taikoon-ui/src/components/sections/index.ts b/packages/taikoon-ui/src/components/sections/index.ts index 3ba0f039c7c..89c1a68886e 100644 --- a/packages/taikoon-ui/src/components/sections/index.ts +++ b/packages/taikoon-ui/src/components/sections/index.ts @@ -1,5 +1,4 @@ export { default as CollapsibleSection } from './Collapsible.section.svelte'; -export { default as CountdownSection } from './Countdown.section.svelte'; export { default as FaqSection } from './Faq.section.svelte'; export { default as FooterSection } from './Footer.section.svelte'; export { default as HeadingSection } from './Heading.section.svelte'; diff --git a/packages/taikoon-ui/src/generated/abi/index.ts b/packages/taikoon-ui/src/generated/abi/index.ts index 0ba9c8e2e43..9f635bd6338 100644 --- a/packages/taikoon-ui/src/generated/abi/index.ts +++ b/packages/taikoon-ui/src/generated/abi/index.ts @@ -3,8 +3,8 @@ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** - * - [__View Contract on Holesky Etherscan__](https://holesky.etherscan.io/address/0xe0c018615A074967db263abD4a98B4862dB4101f) - * - + * - [__View Contract on Taiko Mainnet Taikoscan__](https://taikoscan.network/address/0x4A045C5016B200F7E08a4caBB2cdA6E85bF53295) + * - [__View Contract on Taiko Hekla L2 Taikoscan__](https://hekla.taikoscan.network/address/0xf3FBa6f1E6C1998195239e7DD794c1EcEA8Da66B) */ export const taikoonTokenAbi = [ { @@ -38,6 +38,13 @@ export const taikoonTokenAbi = [ outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], stateMutability: 'view', }, + { + type: 'function', + inputs: [], + name: 'baseURI', + outputs: [{ name: '', internalType: 'string', type: 'string' }], + stateMutability: 'view', + }, { type: 'function', inputs: [], @@ -292,6 +299,13 @@ export const taikoonTokenAbi = [ outputs: [], stateMutability: 'nonpayable', }, + { + type: 'function', + inputs: [{ name: '_rootURI', internalType: 'string', type: 'string' }], + name: 'updateBaseURI', + outputs: [], + stateMutability: 'nonpayable', + }, { type: 'function', inputs: [ @@ -588,18 +602,17 @@ export const taikoonTokenAbi = [ ] as const; /** - * - [__View Contract on Holesky Etherscan__](https://holesky.etherscan.io/address/0xe0c018615A074967db263abD4a98B4862dB4101f) - * - + * - [__View Contract on Taiko Mainnet Taikoscan__](https://taikoscan.network/address/0x4A045C5016B200F7E08a4caBB2cdA6E85bF53295) + * - [__View Contract on Taiko Hekla L2 Taikoscan__](https://hekla.taikoscan.network/address/0xf3FBa6f1E6C1998195239e7DD794c1EcEA8Da66B) */ export const taikoonTokenAddress = { - 17000: '0xe0c018615A074967db263abD4a98B4862dB4101f', - 31337: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9', 167000: '0x4A045C5016B200F7E08a4caBB2cdA6E85bF53295', + 167009: '0xf3FBa6f1E6C1998195239e7DD794c1EcEA8Da66B', } as const; /** - * - [__View Contract on Holesky Etherscan__](https://holesky.etherscan.io/address/0xe0c018615A074967db263abD4a98B4862dB4101f) - * - + * - [__View Contract on Taiko Mainnet Taikoscan__](https://taikoscan.network/address/0x4A045C5016B200F7E08a4caBB2cdA6E85bF53295) + * - [__View Contract on Taiko Hekla L2 Taikoscan__](https://hekla.taikoscan.network/address/0xf3FBa6f1E6C1998195239e7DD794c1EcEA8Da66B) */ export const taikoonTokenConfig = { address: taikoonTokenAddress, diff --git a/packages/taikoon-ui/src/generated/whitelist/hekla.json b/packages/taikoon-ui/src/generated/whitelist/hekla.json new file mode 100644 index 00000000000..69323d0f5ad --- /dev/null +++ b/packages/taikoon-ui/src/generated/whitelist/hekla.json @@ -0,0 +1,67 @@ +{ + "format": "standard-v1", + "tree": [ + "0x3ef68af24a0113b354ddcfcdf3479a7948847d9a97fb87b07ff560843f7118bc", + "0xb0bd9bfeaf58288fb1723a92daa4791abf328c732ab91da7e8d67987edbbbdf4", + "0x5b66179d07fbdf65657248cae6476c9964eb19fa61c15df17d9db924a074c884", + "0xb29fa98d9e85a98b085fb8831143a5ffe70e96245fb523a9d195963b76d8cc0b", + "0x5406cb9aa8f450c6702c6bcddcdb19077baaab45fd536a21c8e91cfd628343f7", + "0xaaa5072acbca877abbad0ad35c2e9742a5c826aedeb2517550beeb319ae8c911", + "0x761afa50edb0e77c4a68e268ace2d310f31dec658ed16bdb83b1b7232a2768bd", + "0x7eeeb1cb3bb43fa2c2e0b50fb043859ffff066610f9dbf89b4704e773f24a3c4", + "0x127b97cebbdc3cc5e8ed1c8c14d9b61f4de9a2301d5d10988322f71155308873", + "0xee3d903875927a1fd767e1fc8b850a5840596a21a00df4c2bec30a8f5d58d16d", + "0xafc473ef5147f5d39d32d4e4b466f4beea4e859f397980156d0470bb80900373", + "0xaf53707ab893501840153fc5f05a3a24c7d185d8bcfcc44ece20f8bd2f012339", + "0x921a6e0470293d600eead14aeb046dad51a5620ee1eb5e72b95112dbbe9b245a", + "0x7358742a31cea3f1d62dc77c7d63389fbd8a194073ad04ea25e4aa0071c7b4f3", + "0x630da9f66464f1194efd874ce95e65e7bf86b556cc479cf33820325eca6415fd", + "0x4c3456dc29191b3b77a77c904ea70867a20007fe2d73f7547e42b0dc5200c1f4", + "0x456e44977c40b6df1bcb531feb67a5857454ad14ef1a4c2dd80834d19b339d0a", + "0x2f70a518d7de1c625ba6bde8144aaf8d288b49240bae6a473fb85b800b52f6bd", + "0x1ca70bee94ece504eb73f7f0fa3af861b6243f580d3915daa19047facde9871d" + ], + "values": [ + { + "value": ["0x8f63e3cD0D14cAef993E59B4e01e3D404cF3c1B7", "10"], + "treeIndex": 13 + }, + { + "value": ["0x2E2989015f5818A256EB967940454EfE8a0B4b5d", "10"], + "treeIndex": 9 + }, + { + "value": ["0x927a146e18294efb36edCacC99D9aCEA6aB16b95", "10"], + "treeIndex": 16 + }, + { + "value": ["0x4757D97449acA795510b9f3152C6a9019A3545c3", "10"], + "treeIndex": 10 + }, + { + "value": ["0x424bFb32f78731252a6BCeDc828E38e2701DAAEf", "10"], + "treeIndex": 11 + }, + { + "value": ["0xC66fAdfFeb6DA3b9A7FA3C71130F881e3a9B13fb", "10"], + "treeIndex": 12 + }, + { + "value": ["0xFE5124f99f544a84C3C6D0A26339a04937cD2Ff4", "10"], + "treeIndex": 14 + }, + { + "value": ["0xeA1688488BE7D2E1fC259ceef2b9b514A701f1D2", "12"], + "treeIndex": 15 + }, + { + "value": ["0x4100a9B680B1Be1F10Cb8b5a57fE59eA77A8184e", "12"], + "treeIndex": 17 + }, + { + "value": ["0xCe433Dd6f23333799C11199104AA6986333b7B0b", "12"], + "treeIndex": 18 + } + ], + "leafEncoding": ["address", "uint256"] +} diff --git a/packages/taikoon-ui/src/generated/whitelist/mainnet.json b/packages/taikoon-ui/src/generated/whitelist/mainnet.json index 1a3519b3ac2..57ca7a4e2ca 100644 --- a/packages/taikoon-ui/src/generated/whitelist/mainnet.json +++ b/packages/taikoon-ui/src/generated/whitelist/mainnet.json @@ -1,316 +1,345 @@ { "format": "standard-v1", "tree": [ - "0xa7e510d5aed347e65609cf6f0e0738cdd752ffdf5980749057c634489fd09fc3", - "0xb973a488dd6a234ca421a2d0421677fd4b29e096455a60d7d105462748b4bad1", - "0x507dc9b325379dac07da6ead2076412a2bfcb86b9e768f0dfefa081b4408cba4", - "0x244e5e77e667b19d794163a7f24e23ca5042c6c9da87f841f5d6a51db2c55f4d", - "0x0d3296905943d3e337ef9ad0f2e027c49a85d38303de0d7bbeed1e9a9bd5623b", - "0x30b785c47fa6bd1b322ed2a05be570adf006057237d16e096f07efcbde05984d", - "0x40046112e151e45604135c479abd6fe27dd497ab2549b5f6b3ccc93b8a8f5f5d", - "0xbcd128611de8370ad79694442c42876eabe1d549b507ba037a42bcd91b82b789", - "0xd913f848f4c13e86aec7454ab5485a1aa212eac17a2e9c30fb6229ea21791a51", - "0x168d30ee4a4ef08732a136a5f151f671c188f1d3ce5ebc163e5391793fe809d9", - "0xd1efa6211308f85e7902bc88266938f677aca884afd35869c42b21aca6307f2b", - "0xb5da7f4c1e8b8f5ed3109772c2d652c73e3477fe6f2de3710a5de76d8b7618b4", - "0x24610a162ba43fc54dae8128b5dd1f37cdde1d4c02137273a095bfb9a681417d", - "0xfdbd58cbdc30946d5a7116b0208446bf3ec05c0876e7e57ffa95fd8457741111", - "0x08aa85777b263172c920a4c9631e99494a2de028a777163d00147b539944870b", - "0x0659b57ac5089e9a95e29d2544da2c261d560d61390e95e72164f6c2c8672bb0", - "0x541f4905b19b102b3955bb2fa096961c541788303c0adc90462ec5f1f1f51d8e", - "0x857e28500453424beddceccd7df1922284b1a30248d304401879504a385e56c0", - "0x47d21705f2f3a789452f6489e012bd5415da961a648a7741bf8ecbb46e993e74", - "0x535ec34158d8f8e6bd5f9a18f755166101d32964087e595d90914709b2c1196d", - "0xbbefe7f22213649df47dd829907b691c4d020aaa9a62824e5a9072fea402ff8c", - "0x2b7c88e79b3726ccd4f8ee538d756a0a8079d2dbfa68a940647cfc5257adff92", - "0x053a8a819d2bbc6e59e2d8ea0172ee49a318c0d1f96829fa7d0e41a9e03b9a56", - "0xc84402ec0bc364e38fb46c01c171341fd344a304716724b9a4163ad33483c05d", - "0xc646454f6a3bd02a7c230dc0dcb2161cbd860918f856886d64d2f60f3711a2ac", - "0x870e75d3b3bb5d6dda73f4ca2edeeb5b4736e3773671fee01db10d6d0834934f", - "0xc39e970a9edb3e655498b7084d105080f91745d9abb1e4b871e9c7d105c84c1e", - "0x1109b0710ec1c8c978d2ebc48a144e10c7b67e0773ec1490b707b585e071f58f", - "0x9287005fbaf60ca90177aba33b3c913969053e92a1e9fde53cdc4fb7f8493fb1", - "0x5ceb7896d89e82ae4eca0e0c4f9ea13f3ce50667c3e47d2f3f8735ee6d5a36bd", - "0xc07e708cf89c19eff5ab7516b40dbe8120c3831a6470b01f4deedc33e3e4af6f", - "0xf6c23adb20a800f69d67abd581baa5c965e43cbe75e4cc8870a82b867f9919f8", - "0x688e9da64a29a85b3d067ccf15d9b611f27e72cf3e6034aba43d06d4e67bee54", - "0x49827eb8ecbe29f462bc7d6c2cb8fd5e2c872d4cbd4bc8d9555963e63df55dbf", - "0x429458a181fdbb35e9ca0a5ba4d70ccd6494db0effb64c3aa35519727290abb6", - "0xb1614c740958f460c4361bffb21caa9f70e995936bb6f9763f1bf6592889657d", - "0xd81a19f138db1cf4ccff4d17e3edb351f654dba39f69c78f402a46af61d457a6", - "0xbf62185776acedf8b3361f32f0581668bb12df277c215847caef0c4e9f88af68", - "0xced0528489c9b4dbe42325cbf4d54839b15d075155c367394e11836dd168e81a", - "0x776ebfced442225bbfafcd45421c695f11d20e4c06e8b4351a1983305a145d5e", - "0xd2c2ab920d8b805032ac828a196207b7add731715dd4974c42794709e8d4f3cb", - "0x842efaefb50276471ecf65323d4af1278e228ab2c5443ea0e3d54a7d2493b4a5", - "0x4f461017fa1a9bdd687dc90df4e5dec1f25a2d714d666377a25e9bba67af0679", - "0x84e32632ad3f166107b14d7408bd7e004158a04cbdb339c97447ef20162fe765", - "0xab3f5be4d0475106d58ea93f3fe271e376d4a826e7afccf8e1e959d1256e8cfc", - "0x6b753b8835f5d80f6a9e379ef82506fbe815ceff48a0cec6518d33098d4fab78", - "0x014c2af007e4c67d8fee31917fb17aa02a4413a03b5d6a1d1c990d2c92ad74e2", - "0x5940fa5e15836311b8d7219ee07c93d7e7fe70e1fd10cd2746ce3c66c4d282de", - "0x9e6bf46ba02b49c9a35e054fe9a4f3386609ce3875bc2ae88e6b0fefafe83d90", - "0x24092a61f885db6a9b193518cbf24bf11d1b5991be2800c4cca56118844f48c0", - "0x4128ab2ea01362f515aa4e2d4e2166cbb0e36e893274303c7244bebade314e95", - "0x4f4132d4e443ba8610dc1a4ec2da072a1eafcbf6368a08bf132da529e67d9d5e", - "0x7d73063c396f1cce550f1694dd53ad61077921afb93012c1d5498a4fcdeb456b", - "0xd520dab426283c735fafa2a7ecef9877c54eab00676b56525d6baed4ba8386cc", - "0xc9428b87ed4231eec6655642e7e861665e152f960a0f097efb72e17335d39dac", - "0xb00e2c8a2926ce3169ddfabde7f94e3d9610ba5a097a8f699451dbede3b5d133", - "0xe4e61a738eec3e7216d17520f9c339b5a135892ac3d8474b6caf128f2d4be0eb", - "0x1ea74a3140c5cf980db74bf96b143180af9ae5ecd16070a309168c753085736e", - "0x1dadb1d2b8ecbec8145d714ad4ef5bcc37f7030c6e02385adadb6278986b0af2", - "0xd5afe03ed0dd67ff477df45fb187cce6bee3fdf41490ddc0e7f08c9ac98909b9", - "0xcfef2ddf055fdb9348540d41fca517b794748cc6359c3b2d802ab33f67a71b79", - "0xcc4dbcadad9ff88787326a39aedb7b6940a49ee6c889640a8906bf383148210f", - "0x290713188e2c1c6112c6735cd4b7fd4e2ec3d1837d54fab932ab84d591603564", - "0xaf8edf8d7815870ae141678ed8ddb3fa755fb7d3c1f73d8e9600696adffdc3db", - "0x15d96a33ffab2a5db7c25e7a4d9874d5dfe44f76c3c2f99b6d70979cb62a961b", - "0xbf04d3ee770a99e180002df57a20c4f6d8e92d83f181744b2f7fcb12e927806a", - "0xd30c9140a9481fd4f3c11b199c525beff194878e2feee741aa4b420587de13e0", - "0xf3e8672fa981fc84009a9cfb48e9a37c7a0f8b4bbc8ef2fc4f6e58cece07312f", - "0x461f43ed96ce9febf570e33a02bb8c5e2d7016f9fb47d3aec7435f5035a44d66", - "0x870746d3604041539da3b96f7f87f7465399bdb2d944cb8e15fef3a6625789f9", - "0xbde7fa32f67cd9de1c1871ef49f06d611460ebd3d04850c2f566e713c2efc032", - "0x5b5543a1c24bde2895287cd0a75b2d39f418411d71144de62ceb08a0ac422244", - "0x9f322aed8312cbbce9d74e084c830d10f645d29f2a2659757c80c26313c1baa6", - "0x79b98dfa7894daeeb4480ad078225bd065d769ac8e19b023a5a13bf6b65cbbca", - "0xe8dd23757bdefb74b2c179e886dd4f71b628e64444ac3ca2aa33ab23e971375e", - "0x85158f6c6b0aabe312b0cb0895b7e730ce04e851389e7e7686ffa1d998c8e1d2", - "0xd2997137cf607ac6029921a84a8ccc3f154eb97dd14933743c512be31eaf696b", - "0xca491c73023ae15fa815a3eead360b0e1bb3d790f22469f6504d77e1926cde7b", - "0xecc7d2a27288f50f77b30e6c366044a746dc2775f5f4e9b5ea875df4481bf20a", - "0x343f65086c1a352ad78ed024115dc7d4ba987eed47e09e8e27c8e5209a95e783", - "0xc97d1d15f953f7538c7ab99b7e2c4862e1bbc4206611f5e9d8ac0b587c13ec84", - "0x66018c7a68843b111451cdee76e40081c778896e6b0bb7afca6a78cb7026b7fb", - "0xab99e71c11e7bea7a2de3f83c7f2ab7e2f8752c3af64ec5aff9ac42c8dccb60c", - "0x1cd01df7c39b0bc6c13f9177ea05f429ef6259e7b51596a4e3096f442db37f1e", - "0x7cdfd20649819ecdac9c99ea2cb8257f5d1455febf5c795a261c059dc507f563", - "0x13620076c4535fe703ebfd081831ed61c4253ecb7f8dc073ee012f27e9c7c155", - "0x6ccf282ffda723a993c68d30368e70e08885d3f7d19cd0a223a7ecdb89a711ce", - "0x64d45cc3462251b5de969c3bc42490974dc3bb14ee29d349c5f9e6b464d99d42", - "0xd8d216f66e1f94250181cf7ebb04de2a9b63eb94ca1e5f28fe73d6520270c0f9", - "0x3122418fd738e690a7a2ff555f1e16e8ec6ddd66e83dfc88161bb039ede8d05f", - "0xa13d7ffa6cba5928d31e79c89fd60feb301ebbedac8dd0a79e403a88b4ee8451", - "0x6a3f79ac8489162cc393cc94988d34fe18b53519dd5fc0005bab67ce5223806c", - "0x7c31d17fbf7d929b4d451c055a070ae9648e5e8f3a9408f18a203eb8678658cf", - "0xe86e0ace64845b97d068046f4d115aa329c18e67a984a4efca7de3c5a9cbf9c4", - "0x7cb59ef97655231231a6b3da135ffe1db8c46f231d122269c22d56bd94bfe123", - "0x4c5ffe7d3353ecf40fc13824c606b78ef784daa734df99efcc9bf7588a607de5", - "0x7250f7af1cd5f2da6a1a68c52a56c3f6c6648f3578e272ecb483944a41289753", - "0xfa8b799c3e767be1fbc4698dcde46407cd86b0701a85b3f2ca3ece20a012ba79", - "0x3272aa1d98a3daad1d0138c1649d3b66daadf3b87981d980b45a4dd0764d0358", - "0xb8f09a2e8b68f66d5eb95f32c8ba0b565310342f1ffe4ea337af7c81c2075c45", - "0xc94d98798d809e2a1754bf0b7d062b39172c995c2f79c125dd29d5638dbc619f", - "0x0d5f5b77c52fcae32c74dd2f9a30e9bb2d3fc3f764e9fe2eeb94e9ce2a2d6bfa", - "0xec1789f46a7324f7b9bf08c59a628547725660a63e8e8e6d0a46f53d50732ace", - "0x0b62bdb1265f00a8e515167c8eef12d4910ed0c5a6db74c184403aea2632d48f", - "0xd44582e441e81f3a04ebd0d0e548761afe0d76afe1809c9a5109b245f05d0647", - "0xcddd400e93ad41e375c684ec0e30efc9869395175b1a9098516c7577a4533d2e", + "0xa6b035de5681d17a9ce065d4757d7be96dbd6ae7becb4a7c5403ae47030678af", + "0x4d20b9f93b3bdbd13a048a18f8ec07bfff6680c2c1902580634862f2f0e4e0ec", + "0x46aec261df803c89b8eb44e0f6352cac4a68395e80b77872c3ae3ffd8aa01413", + "0x495fbfaf336c2ee7b5a570d1bb20fe49841a8936fc037e41d8a2d088f0320088", + "0x1219a96768c675a3d925f8d187236f200aecfb10e33beea76ae6c746d57376fc", + "0x91b03b4b135e58aca58a5fbbb9080688a1af85e24662562756d4343e89e3d58b", + "0x8bbf8de235f2ca26d6658266a98a38bb0e6f4bea56972b511e366f3990379884", + "0x5005f522a9221e57d343546b4fd4b933e08ddea22c37c4a84546dc93393a62f5", + "0x89fbf20985590897fdbedb1664e64e1d76c96493d466d526cb291cb853a9b36b", + "0xf1cc32db22e673706a841139912b00de022174ee6a26a20d92a0f8a329871d7b", + "0x5945fc6f88897ff9f40561ea7e9b1a8324d38d51e1cfdcc953e5893b78807f91", + "0x6440f9b692ffb5301db8c3c32df6d7dafe5afd46ef9501de84f239ff12dfdaea", + "0x9a22ec25ef09b01d48330a740e727e2a2185ad4b6ee5fd3afddf7bd53d8e609a", + "0x8732f20ac65dd4717cb09272ff294049cbc7fed8d0f0023f4d720b8de40fb097", + "0x7f2fa30b337bb1c525d024ce55f2a935d39f854b020c0b4fca06eaa0f0eb8d99", + "0x1f74c18426f1df51841ca048318a13c3dc11903c7157a082df220f381d36222e", + "0x5ee929bf24541624dbbbf21dc3b3e52a4930f672542c197db35c42cb3103d9f3", + "0xfd7a14972384f51048bc42d5e4a08188b2e0c93e314fa022c2fb4aa3af5f5599", + "0x2669532085d80848b06ca734863e7f34f3bf194ccd1c8f34e14ea6a06afcd860", + "0xe0ae008d7db3a986266766f10548d5bd7d2157e21b2869b0a353bbf2b7be4fa9", + "0x8cad2069a7737bfe9b1fb81dc3dfb6feee60ef1b21f4eae322e05b357f7ada0a", + "0xa3bf64b2eef8c6317cebbe904030047591fe3f4a95a825ce9394d778816ffa0e", + "0x9dc9f0594ccf1ad886bcd0cf81d2caff402369751678c59bf8f7de24178fff8b", + "0xbb2aa11a9d2bc9e2d1e369b24a56221606d29ef5babffc7917d313458a1b97e5", + "0x1eb3bf33ff2c30e5d895e4e3e13c400c05e167398a4db4eccef90bdf15e29c22", + "0x2a059b54315b8a3116816610b3707ffd182abd40f5095ee68931a2f4768be170", + "0x34ac0eb35b506eed449e654ff6954522aeefe29c0f22631963c2cb83197031c0", + "0x0ff9cbbccab9f1dbf04151116c2d14f5c96e52d87c1e50f095dd3f1d840ff19f", + "0xd67d2d4ddfa2de16fb911cce076a4bcce0760cd94b7514a83e9c61ef86db85b1", + "0x371285b0261c3ff4cb1f3e629f9a9a94796b436d1c8afb425f1f71f5fb1bf235", + "0x22335780cd39c11a9c845918852f50a09fa3048979b3fe1d748652674b05b3e1", + "0x085ddf8df0066269e28f3b8ea53a8e3580fe7e11e55e6588a7e2009736bab664", + "0x50275a15d39b5bc3ee911f02bccb67caa5daa50d3da810c63922dfba6865fb46", + "0x5686765b9af2a612416b90f9e5d53a68b56321fbdd732ffcb8a25f7e2e6a17d2", + "0x7e53bdb76023259d7b1a2d1c17f870396611c954ab25c2db8049a445742f0830", + "0xa6260cbc5bb3a0d3cba7e6d1cddbd9cbddb2684e8b405af9a2e309f8789d5341", + "0x40434cc010536852ef39b1bd2a03692ed15bea4dc7485c83aa71a970c9b035fd", + "0x7ac24e3010f76a39fad7eab1d1d912c8e25e9f6a8ca6130e30d67e2fec5a4989", + "0xc9cebdda7f43a44d7f98b3e0c533fdb0a16e827b9b825e351f15c49c67f76bb0", + "0xdb87873eaa09abfeae4be73f9ff56beaa3f629b66c1b816ae29f5368a7273db7", + "0xf548c7b2198b7fae1ba400048a9510d71293b82edc37ed9080cc49a6ab94e459", + "0x661912017fc23499a45413a53f75566fc8a2e01e1409ae425766367288cb34ac", + "0x07b91a9d1056ea8ef3d197393bd4e14b14d806b756eb0ab63a964fd5a37d0f25", + "0xd4e53084ede2487c8981fcbd1a70779842932b805052eea81658f540a4b615c9", + "0xbbacc98f886573b4e78a30e19245df2e11e358d6d60c7db35ea18e03c74b8064", + "0x0b4b78ee67746fc79d62433e12ddb2789b8c6c8fe74b2b725b37170107e1d06d", + "0x23aa786920d46b98b411385586e9535beeddf1a9e555137f1e8940080184f788", + "0x08ed20fb9906529fbd884cc48706df937b0d85d186e6f1e8a2487148c85ab3a7", + "0x66d1ae2d98cc9d0e8bc21877769a79a0a8e210fe57d7312ffce1d8ec17fba998", + "0xb723de2aae1142cbf47709489e1141e6473c8ce7ccccc27f9aa679bcd62abf82", + "0xe83ac82aa680938b48ba5c03600d0281662d92fbb09e87a747549b194c00a30d", + "0xaebd682f1c6a5ee251f0e15030f12e10fa8c363c7fee6157f7b2a98212345f1b", + "0xf3cc841c639456a532a6141d38ea0225a6e53d783d74b6487c9115fe856aec6f", + "0x81f74fe5a7a78038b24a9f3edde4d525646b694bc167ad3cf5d66ad12cd720e2", + "0x381aa9890d6b99971a4ad92b9e329b659d64144c115c835d02481627a6abab4b", + "0x48583b8f4ca38cb1b60ee43ae44185c0896d07c749533a148980e4f57d6aeff8", + "0x884303185d244316cb5ddbac8abe7afff2976430bc1edec41bc3431ed9af35a6", + "0x136385db39c52329c77b198d2880a69e21925d382eec85e7c610d4b4cc2ea367", + "0xf0665c699d8cb45ad5a1735bfda75122e603f554080c52c3274d9564d57dd6e1", + "0xe937633003a99bec71353ba47f0ec31c3dcb69ae9826f730e11567f81e3b9816", + "0x244de10a5c5c2a1a3b0b84795e6a700c76e40f832ded5f3476cac1e3b79b303c", + "0xb8d786f7afd2edc2d3883f83026832783d1324fcae13cfca724056d04a5e4921", + "0x78bb514605cdef4dd3c90a99542051dee56a6f5b333b1e31572dab68abf09ed4", + "0xe6d626f81924c547d697ea0e7229b6acb0baf094023674c9779be02660a02d47", + "0x06dc75a27abb8770a4d4f0eb4dfbd37633faf06d9a87f0a97622fda31b199654", + "0x9d39bff0924b19689ef9dfc18c58acd1fa70795a9d134b206cfef0a7edec7961", + "0x996f83c2753b5e4d70f84e82c5cefe6b80b5456d89f48bd0ad6178ed27624364", + "0x8e9002d7989f127ff6e1566674e52e040e76e8bb26f4bfe0a190950431cbb095", + "0x0545fb8fc14c4a86973ab9f1e686248d6c5481f07994f1b6dc0818ff8ae4a8e0", + "0x88ef0c31a9d687bcb9b9fcfef4b7346d42efe8d5bb1246c9035cdc46ba20e62e", + "0xba7b6a4222e42681a7a6649229a425dc79f994724216ef7991b099d5727fbb11", + "0x6404b80d5c1659694c4987083940f8f349be9e0d96f7e34e4b577ba1d67a40c8", + "0xc40f8b507256af07afa9723fab15c3c3a2511dba128c356b218154b302fec9d3", + "0x71127f381f647c98d74e366c366c540aa5e384cb4dac7069b1a7c6dfbeef3d41", + "0x4d3f8926e27ed4276f4f597db2bd1bf24d99a7391674aaf3cd0978bea629a008", + "0xb99378fbc1e92d1e8c233f3db1d102ddcb344912dec81e9b9c9c6ac1174e2040", + "0x308aecebc810754aca4127d2e654a85e3ef0178f9922ccee533e6ddc6fa17966", + "0x294017a4e2a1ee97a47f75b9e25df1d22bc2df29eb96e12d01b23edf24b45d53", + "0x94558c74d35789cc2bdd3b2e7ce003be0da1a81aabb485ee9b2dce43512d6a92", + "0xcfbc746bee5b81188bef011d8835c28489cda965f6e3501ce239b8bfc0ce44b6", + "0x4c7a9d3ba01c912fe559040cb6711e19e46e1e73ed4cd0799f16eab9392cc7e5", + "0xa65558349507bf05fd3e9852e549f62ede41d745a60e62abc3a56271586f2707", + "0xdc0b35bfcd4f92539ca5209b2bc50e66eca777e6e7d413dd77bcfc390cd5a316", + "0x2893bc6247ae750a995c32d2e7b268e919d51397d8542c1789109704daf9bcd1", + "0x73cebcac3e16ef10d7bea8293ab13942fa9a1d09c67458fea109b40235a884a2", + "0xbc4f2d9876d0013c058fe0deee9800e75e3bd9a5ac1e6652fc5cf3bbfdc9b070", + "0x6ea34d8cfe84110a2d46dd58395957142ecbe713edfe518eec53e1e7f8902941", + "0xc4bd665423a3c9dc5f7e3164af22905897a21d5a117ed817faad5b5693c02b4e", + "0xd85d8c3e0bea39016d2c09c035b933b9c2dc5c56d0eb1d6b9a981fad85387085", + "0xa97e783dc101f19cb23fac07320c865665f40c13efafd9d47a1c4e1699606075", + "0x5a292b488af5f4c6d8c5a5b9adf2d18ed3528ff0c63652ea95bd5327e028d0b0", + "0xaedade9f7c8fede0afe0be19f341a04469a127c75e128093928980631a907de9", + "0xc8abdd4fd3e7407f56776e461b3cf24b41bff4341ea4b0a3ca84b148caff146d", + "0xe4685e7b34456ae851ed62d75a82bb76a5ea752b67f01acd180665e282a21195", + "0xb1e420b9fc93d779fde10d68e3e9ae448854be7df0362e87f6f26440ffae2aa5", + "0xce414ad5e4c2140c82f9087e2a1192d40afca9d4f6d9d77818e488677e50d98d", + "0x75339f4f254071dd9d4a945ed04a45ab33b91888bda9d6d38ec1a40459aaf910", + "0x0e6dcb22a5b859bf61a59c6557f9a9bb36724a6003106e4343f85a5108e3583d", + "0x8f30abbdaa9e041b71c1d1a048ca36cd67fc417d8d37e52003033f0e9097f193", + "0x6a84b1ad4384ebc079f8262c2e505fd5276048366473d7937435ca372bf7e75b", + "0x0bfe6d80eabeeb4118f485315173eba177dc750b8b1e16908c43c9fbaf0d1cc8", + "0xfaba5c7c0fee21a789d700f4cff54e35f23786150b4ac61bd80ca832c77f763a", + "0xdfd9eb218548b1d2fdaa5c637b59a8ee26d2061e721814d6e931ae9fb028dd83", + "0x5ff65ef02f8dc8069443df6ae4e26fa4e09656979eec8b0fad0c3a68ce1df447", + "0x2429e66b12783bfb2384f388fc8bb594d764384165464c4b60a7819bf4ff0d63", + "0x742769956aef30c4d5aa5b2cc0f4bd8f939d0b03cf951680a8f888390ac113a3", + "0x51c557f9320aecf0aaa1a75c7f3ec78c7a0e8c762668261216fabd48cecdc305", + "0x0115f4fa348e051b8488838eb5d418e4214cb065d5fed461897f2ea805c55a40", + "0x9e237af93d36ed6b7a8d7a5800cd5e14765decdc78f1c03440367d722ef77f7a", + "0x86a0bd73dee6c2801b31a3614a7da29d932c766aba9579e2f65e55d597675a38", + "0xc8e7b4052a5d88fee5df91eff2fcfe0f28823021e4c7b953d4264e12da6bf84e", + "0x0844a6503f9904623cc2620a168b451ff3071eaef7c6137d01c193776e354406", + "0xc5dd54966aa80f32ad94d5ffd7bb9ac7ef78435e5e6ed4bf3307af3b9690fb69", + "0xeeea2ec17a89f4a4f5df4f3663597cf60018c80c8f02ace25ec973fecb3142cf", + "0x4a011688ccd4b4b631631823bf78387f3044935cf09a0538451540f8099e8033", + "0x17d75889dd087977db39da13b918ee9e0fa89432a6730b6d87b20af7212b3e47", "0x5b17cebe1f9ff1901d27497b472ee1d8d1f2974f6e354d9b6d2cf60b542e9850", - "0x3a66c6fdd455923629b353adafc2e60c9843f133eac30e850c5925116403d055", - "0x5210f98b0713224ec2109266e2b2ca753cd3dd09bebdfb5d00ad898215afa467", - "0x398fb5f3def420c1fbb10ad87c6d5ed9539741b0cb5c73ac1ccfa587a5c85c61", - "0x8ba5243c10a5c1d0fb74952a424268240a89314b6e5f7399b73182f2240abcc4", - "0xeb90eaa7b6a67b9d6687542b3a5ee212961591d91a4e51485a08a2671becf005", - "0x27376e03f6b77a61b932b86c0ea3d599e4eb267b54c0ad4ce914bdce8a71dcad", - "0x1b39da28e5c89493227fef81213362ba9490869c2e9225c12cf69d95ca191fa7", - "0x8d5614cfa5da2835d970b6f717892af404a46d515da2cbe3f541774417c3da1c", - "0x4fa73689d30ab336b299e33649f0696fb80db057ce6b3dc404b1d7a2b1cfd50e", - "0x250053130fac3f1f1befd6e6915f7459611e053f2b8d5b84efd851baae867fed", - "0x9aea2843c5e1245cf311c328c0f6c21a5b17de8714b374286c9c111b24eac637", - "0x250a36976acb495e97ef0bd138d877fb4f682a15aaae56b6403941110cfe0c5e", - "0xb12d538604836d2533e30b15b6953b9e0aefba1b6fdf1adee4eb3eb60bf735b1", - "0xfe8b68a59e58e0b93c5b3460166cc83709c07b7742dbcb6fa753aa63e2b469dc", - "0x80d21de5b6b279167826da1ae6f39989282ba10a3fb33c826f847212e0f17229", - "0xcbb4e2690c41c45676b3a2cba575676fadf8731ba8d5baed2a0c207b2453de97", - "0xe7bb064f81b50add134bad4bfcc0e298160b2e454ec76b27d8788046a94bee68", - "0xa706465104144f6463c14389521950ee3fecae23affd6bd34ff4a6e459db243a", - "0xbdfe2d00b5c81627b79b37ac3cb932fa93f871ed9e75ff1564dd77cdaf12ffa3", - "0x3f7a04f93f6c2be8f126096c7198bb55e0bd0ff68f7702ba7a5e2ce3a7d6b5a4", - "0xecd28dd2f17d57ed234e0c31cd19ce8ac0ba365cf2ee1d8af0be228f675b4583", - "0x43be034a80ddf6b0d414b11c56a1e6e7b5557e2d0a9b027e76eaf0f83db4cce4", - "0x69d1942f795685a35f5e1ccf72f584f275d04551c1ad080008c3069b89eb55a9", - "0xba2783197881b35d405ff1782f337e02c74deb7f81d23c1672ad734b8eb9b260", - "0xc650b200df211c7cd28caaab9df66a55ed43edc7eb23f402d750c03518cdef1a", - "0x754c1ec6a4c37bced418af4dd526c68070297a749425681c2d688465deb2133a", - "0xb9ba5954a9719111ad2558469633d746cfc8e4772b1fdc44af03e1af33aaa0e8", - "0xc51dc03927294c76981b9ee81b5fdab0cc93c3236ff4885ad963cee66db5789e", - "0x15766c2c9f80236ae31b064ca80fc279fcf55de6bf479aae10a7e504c2eceec6", - "0xbd8359fe76c1d32e790df4c2a1d17ff8da5b853fb6a2fd6201bb07cf98fdcb5d", - "0xb2c6098618c2d81eb106c5ff78be482494c791af5657bb2229c5c16acd82346c", - "0x52e66f27017b5d5c28792ba5f62faec8f4b7e67bc22da90cbe52f142d5ec00af", - "0x49e1f4dad206c9c1b1fe2f91c9b275b974abbd229d2779aa466caad9db76fd9e", - "0x213505b8ed7f61edeb20eee352a1bc694ac78ff1f33a4ed0af174a5d72dc812f", - "0xd49d70ae3fdcdfd7068cc5a0f269bb37c7f475c938e08c6f2747b62a432a5078", - "0xc67b28cc8b42f9dc01e679422ddd3b8700d06c526d07a581a8efba474057064b", - "0x5134a6ff2210e906174a9c5b4c2c872db6a09e699c0899399641b7d1bc495b66", - "0x66a7b49ea70d29de0725d431a077dbaa75bbaaf8f4aeedfac5e9677820de938a", - "0x26ada66ac856632ac0529ae3fc8115a351350a90cde864115c1a2f9e3b09823c", - "0xe37f11244d5c5c3e8b46a058a5bd91da4c4dc20ba1bbdfce381a956eb8db8a1f", - "0x1a5dc8afd4532c3e1441075ecfd887bf83354d321bfe583cd48e7be79c4ff592", - "0xb875e83e9a270124a2d2199085aee6abd718dedd99427f19baf4f487b561a982", - "0xd47ed52d077dde864519d9cf8c058d799061a9dbe9a691ba585746b72ecf2e6c", - "0x040e7e16ccbb23a3a5a5d20563cd2d8ea4a483a40dc7b8df5765a86ba7138151", - "0x2f461cec32564c979efb0159e5c088ae4b8de4aae676c621f32b26ebf5c2d595", - "0x96e9a5b8b2a87973e4bf8061c106d8f5014d50e0a27aca2212825424b755dbee", - "0x2a19070a9069af3adfb32332de600bbaa57f2d502cfecdbf6f60f7f0b860901e", - "0x35f51899f0f3598f5404c717d54c8a87a73bf6c35e6bd853c3aea7d43ec25e5f", - "0x1d7543572dbe1182893edd295d4fb0b68b2dab4633ff57d1e0e4dd7b82c02d99", - "0x671a058da676eb022fdae5073c1426c968000716c4bbd6aef49c5c0a6b53c874", - "0x9c2452d62612b3fef97ac9963995fa3fd90d81a2db0289e90c79129d4dd894ab", - "0x2efa7c7e33116cee6fd57c9a8ee0248f23442e9c8399c3c1fe863d42db42286a", - "0x33abd8343db227759b7b5419e30b2250103ccc94a09e933d0e444f501aabb76f", - "0x7fc9ab128b3669a39a4182334734649d17cb25a6f1ba710216d5d9e57ee61e33", - "0xcad51ad3cb303fb50a8b241bdad048c1cd77ef798c5533390ab3b2080cb213cd", - "0xd2ce540eafdc2d2f3c39cb1e70bdbff8244fe4ba8fdac7642185ace6eaac503b", - "0xdecbfcb883f42e13246bb833abfc15da577dbc5339de8a51c839f52d223668a6", - "0x4090eb0f97581eaaee16fe46aa23972006cfb6eebda9ae8d277639591052e3dc", - "0xeb7593c93e2ed5a116558c62bd4495dc50aff43e285e04f3ea1b33fb1331fa17", - "0x09101aca7268ae0b23ea94d54946eee9dfa97ca3e48d94585d4aec3ab240a1c4", - "0x80eb63054ea8f92439af44ac62cc945b9f1305398cfba776db188d128ac2dd6f", - "0xfc3bbb9fb0863fd29b098dd0376c3d08bf86df147c5e34c4b23a6e98f70e40a6", - "0xe2a02d63280e95bc8170fca15f25b6d9b9c5727e54d2e8351d61872a869444db", - "0x19b5c57507eb74f93dab64566a8221e0bf5ee12d935dce0a91f9923a3adbe49a", + "0xdf6b35b8917fb4a329019f595fc8a8ed043094f69fce53cf25713b62eee12aa0", + "0xe4dba47ca5e497aeb8a3162092ba55b8693a89ec95446b5ac547ea7bbe1d3dd7", + "0xc676a66efd658406785df1b5132e048d915fbb482d2eba628b8c8effc3f94caa", + "0xf931b1cbf7812339072e2a947e85cb02ff97297a2b1e5b07754e082caa4ef509", + "0x33a6d5d2c6f50d12fd3da5882cc7ae52a3763fa41c863dedf387c06b2053eb13", + "0xb86c187a83c72f94e0bb008907fa6de29f9e1b192db988f77be6084515c94a67", + "0x8797912315d18270feb851e213fae6ffb9c37f382bfbf636396f2cc894f4129f", + "0xfc19517767b1669261883f8be9634ac15c68f6ae266040b715661d7cb01ac7e8", + "0x05446487b2f5080500bd6a80e36e4d3e7b613a438393b7c937cff3e825459d70", + "0x6ecd931a9843438251ff307b8b1f4302260de59157ca07e6d85972d05ea95fe4", + "0xb91d5efb0e751cb3ebbd24112cbda376f4eb7ad5e464c03186a93bba4b7d602a", + "0x6cb2fb51669631659dc8a1db6e52a77df3f8c66664f94ddac0bbb0ce43928621", + "0x75ca2a774877db1412883e3da943d1e2183a68a33d5964966fbc90bb0ec9e824", + "0xedba00768634109c66444c8db57d888d9e6ce42558293f6a23735ebfeffdcd75", + "0xdc60d8a80d749802df843c50e302e68a9e514aad9d43c6b0ce2454bcf6cfe8b8", + "0xc15f1d012a3792dacfc0b420ab1a6e3487a2df6e21c930d0a14ae905db9669f5", + "0xb7435a4968d24e6930851b7fcdae33096a3ba0e230889d86ab8f90ac2a7d5297", + "0x7914e5d872ed69611ac3a10209ffc5fefcb38c8ccf564b6512bc989ae95792b2", + "0x4a716b386f3da2aed0babe8292720e18bb92e55ce7679095743d1b740d697953", + "0x37ccc4dd2333348bc3e976ec4f570bbc511d76903d7bc9437c477dff4e63bb42", + "0xde3a6f4a387cf78dc63f2bf7f4eea18868b85abefb17e6d505b48cb09194a009", + "0x55b64b69b00c46385488c16d7817c5e81006b9a51889e5cdb2c32b7c9a4feff1", + "0x1e9e701ef313384832feb969252839b1ff4aaae277ef338561779c84f9c37b95", + "0x12e0a5796e735f4842856b65123986c2030565f539b39ea747f922c5fc03ccd3", + "0x61c89368bc7ac74ffd1ec44ee995b3db68191f57eefa6952d9233e5e9c6b60bb", + "0x3059ea102456b82919b637d3b538b5023435532036135d908727dcb900df186e", + "0x4c3a183c65e5ae082eb70d02245c7503cd107a9ed88368a49ce285c39c408531", + "0xc5474990ba1ea187b25527285be035a319dc209c770f85edd74831b8e0a334ef", + "0xbd2d03f5b8c3db183db0406da52d1da718722ab693c308274eeca73a187f411c", + "0x18b084dd6a1dea14f723e66b3ff0a4f7443b1e2f75102a18731856bdf8083a20", + "0xb382e9f817eff322c266b7a9f049d89ffffd6679891d0dc112cced1fa9f99b88", + "0xfdd73b0b331149f19fd10ae36f6b36f9c606d9c7a1e2f691723d3666224a18e0", + "0x4863141f0719e2e680dc3ef0ff4b653754b3c03dd7100352df6a258b8dd5706d", + "0xe723ffbe55d9bdc2fbdcfdcad4607b8de877a164df77e7e05a83f0e4d83eb85b", + "0xdc810ff9074fdd3775a88d85c2e8927dea227875c58c7fb5566f38f6488392a8", + "0x774fb725fcd97b11814a16bea69138ea116b73083fda7645bc65c51f4a819266", + "0x83880cc19b589492426547c6d58dd68a115b571cbe5acf5ff10fb8597c441aa4", + "0x9f7e00ddea20834dff9f34ae46d8bbda756bfd986fb589b0c2bc86ed459636d9", + "0x254f85226184761f26112118c2ef55579c733f630f2957698347d51f166255d8", + "0xeaf894baa7be3f2380eb45263b88f21e2e2e3b83c46b19f00ceab99d60ccc09f", + "0xdaa9f376cae86d5b033542cec806ae1d99f6ecb9782ce28db67d6c1a40409b87", + "0x15d002f40378d87b40bfbca9490077cc7499a1388aab2862502a0bddb91dbd58", + "0xd289a431a680f31f12f3b312753e3d058b2496a985b6d04ba6e734cb8bd91b36", + "0x2c310b010ea8e9e49445de60807302a1eab9422e05cfe444e1f8c1452445eb65", + "0x29126fa71b142c307aa0da1073a778ce671367b3f38efb1bc288f1944db098b9", + "0x70f68698699b897cb03f6591a82b496ceba50ddf322cfe106b4aafa6b46be137", + "0xb144cef201499639497a37909cdccada285a2d153d88c079b43e9d11df554d84", + "0x8a505a1647e870e0e83847cb2acc48c87bc6bc8168c6016ae0b51e2094bd3892", + "0x6caeb16232f5c1b116da04279e734a2fadd158c92a75b2f1a9a1a480cd5bb7f2", + "0x75a39e091c302a01658f7a3be2a25c5b6113367c515ef84302561fe944e83edf", + "0xff494293c659126587d496644275a55d65a89d661e9afe9cc02fb077447f3f6d", + "0x1d15d1c8cf05f50b6859fd4174616255bc69ce65bf1d0725246a5299f42b3779", + "0xfa1688bef4f00e35c727b246c303ee74908d39c27c96242e3dc43bb7bb0cba33", + "0x14cb9fa28869142a71854fe51babbdbb01819cd781dc04adc77ddd6850dccc18", + "0x9695982bfb6913fc1e57c7910df4e7b22a6e9933018f0fe73a177c63609adfee", + "0x40c4cd35210cc0a2ddbc450754d182421205a3edb2d957efb39ff5bb8eef8517", + "0x55348cb193e0b8dd1ead19ad6b993417de12d804aff532619340922542c1ce49", + "0x45d7aa4f6e056b58b025fd28b39eb1a6df6d19ca895f1d705a7ad60f5416d4d5", + "0x398cc2c9add8233e655f6d7afd30e40969a351b434f71b99908306d33c912281", + "0xda81ba81fe002d230d119b5afccf7d0237e7adc7337e813d6ec0a28843ca0625", + "0xb66c544e92b32d0628618f4018fa9de6632bd85587e89cbca98ee46615ec91b6", + "0xdcab26d03dadbba947389eafafb96c0706ec64a77459d842a32f9bbdaceb94e8", + "0xa28d2080acb86f11cab46295cf94ba8191ceac9028d5dae65090d64fb93c476f", + "0x8890f41f8a9f8af2294ee88fb451147c773a6da10bcfeb01fd3218884ca08935", + "0xd7a03d6919d4a25c229c5ea9184e944a609272baa0aa23edc9cfc61c3908ef7c", + "0x2da5bb5616b8d389e43c4a941db7e84174c096ec972ff000799cd324613a9f76", + "0x0849fdf089f5764f2ed3aa53d317927983adc489ce44b845b94f3fd0302f132c", + "0x9904885344ddd7bbe9827ce33e1a560881e13615d3e5e5901471934f7b04074a", + "0x0fb2fc7aa97751f64713da758273d02c94c9171f0170a1cb2ddc3786de2b37db", + "0x400975d18aa62d76029db3c4817d96448465adee36f530731218f1180c9a7cdb", "0x548f86b242cced4474aebef09438f0658c0443af56ca9924ece31ed9aebca3e0", - "0xdfb2f58023921853043d730f44c6f1317b219596adfa4537d5b2488e81e3199a", - "0x478a592c018e346f4d37cca840bb2e4e4e46ff7cb261706e7eed9c0c6c32cf58", - "0x10ed470540cd92dea01f67abefcf7f142f87cbe31095f28a8c0ff501e1c55b67", - "0xa1fcda329b4d793eba1a2067a36c7446b0238f0e18311f0655f0ce2dbea0b09c", - "0x6bd21a8dad8e584dc0d1e7ea34ec14cba5ee146ba5ea2b5845b2b3f72af10543", + "0x4c7e668c1646961d7236100423aa83591b513b6bb218e00ece79723bdff29b77", + "0xe5f52493bc940d929eb027247fba74f5ae68fb4af2e6feeb61d9533ae245c147", + "0x9d9e92185d65eced764d9a332ada4f17357a69b79576784e91474ed26d3dc831", + "0x9c037be359c8f11e138f87d6631cd31f6c6724047a9f92394e73c2b7c892ebe1", + "0x0993a940d28293ba4d701ec7bd8a9c024aa35f997e8d5681c9bc9c34a280413a", + "0xb7dcf710ba60a6f29eecf0b7df3cefe292aab5f6f186143671f7e9e15c8dd0b8", "0xa5873e0db289e9ac59bd09778828b8a93913b4613aafaf8bf6b5b2e9cdbc91a5", - "0x4e5cde8f9c70a26d67cc30b37a41d550d8635e26910b5796bf93eea2478e6bab", - "0x279ae6f2f6196c7f7bda689cd05ba7c931576098212cddbe504cd307f09a0da7", - "0x780d02169205d515e0e034db0d984945ecdb343639d42a508ccffea6ac937473", - "0x2c3fecb86591dd3c57a90588193a2f55a6acd7ee03082970d690feb35065f1c0", - "0x07cb1820baeb0e8ec2190b668d58f68eb4a934290b0bf6ca7ede0c5e2285db56", - "0x9be1b7fffca3dab8adacdcf2e2f4b70e3058f3511c20c787f695b38786c94a0f", - "0x833d0eb58238f3c1671cd0b502b6255feacd5f375651bf3c45a821d8d8df9819", - "0x74d9f671cd3ec5ddb3499efeb2e37b2865b7269b9e3d3354128c14b62e0c1cee", - "0x0dc9f2e17a035acac903ab0e3ed2aa15b8eb1b0837e831b6769f17a352f200e8", - "0x3f91d47f08ce757096c819e6dfc1fe242c66f8d5565241be9f74197f1b25f4d2", - "0x029e7019a8f520a6dcc178ba8902f48c3aaf30b4e3572d586daf8daed51d8c64", - "0x68e32476d20c901652a73fd72a0deb14b92d4db716b6115e1cc60a2c39f821fb", - "0x4db2f08742b1b86b80beb8a104fb348251bd7125e7835e84dc38a6c80615e439", - "0xb055fef10359523b088d94cbbac42fc61e58a40b22b8ab53b0eb1ca5ceb8f5d7", - "0x7f10f2c781b40a10c8888c075cce1e250cf070dad6ada5f34b3c63c8e66761e8", - "0x59b003cb8094a3810628b8fd8f6cd91c202ad57363a573d0ff5337a0f1c37700", - "0x87736c7f8f15b825db204a3959e1b90f13b66d20c6974068959c96bfe105e39e", + "0x2699d2744ac82416a85df765c4441686a8dc899fc90664fd6cb4d42ea1bfa70f", + "0x7666f82ad8d0b794b0450f9b95090c581772f4bebf5d7794c33a9eaba823106a", + "0x435c6bc2c64a2008e7bd3ecb98b69942a472b8b742ee5ddd8a4172b363319e69", + "0x136c3618a26829ab3cd24f4a18b344f8fae282353928f9d2b042bef6ac4ce967", + "0x8d2fb27b98af54eeee7e48dfcbf5000e92387921824c386855ec9bbfdc409b16", + "0x5e7b2d58a07ca9c12f0ee57404d5a6fc857256c470c020bf2ebfd83d2f635a10", + "0xa0643884fd145e1c7fc7ff49aa0670d1aa123fd949fecea5c2b73cd8c7f6fb65", + "0x40ab63894fdecb8e6bc71ee9ff62e0608b72e0d49a1d9a5c1473441821089a82", + "0x1f122cf8a4851bb6dd5ecd6b53d61548d42fe672220b3f9ac52448df18398f3d", + "0x2e1b58d008c8d80f12b54d8fbcaa8fe20088bed67d78465b41969f20f1bf2341", + "0xb2bff184e404be5a022b98dd04fb0f34f56197edb5c64900264ba9245afd3a07", + "0xf6333df7002f589e571f939fe3c6a1270867971cae04a1e8366a57cec78254e1", + "0xee34d54c40ef603cb8a4cc8f8c585f1050540ae60f9dc55a8db1931f44d50d3c", + "0x08ee5b97e66a5cdb5cf828fc1fb8f94ac6be2cd36b94d191385554b1da8284ed", + "0x3bf106806567f2f6e7b179559df51a71b5e3a525a71450a89ee01082b6323d3f", + "0x24a571db61b90f252acb4d3685c60c7245b5bbe70044d1814bddbeb3fb38ce1e", + "0xe2b7c64f2a89df1e61a7a5bcabe945555c906eec1427a5b31a1b6b22dbf423f4", + "0xc3bd4c375e31ed9cf73da7795b53cf37d78e604b0e25a2c1f1e92a344b691e8d", + "0xbeae1bdfb3f051da74449a74055f5053f101b5560b526a0d5b89932429d1b2f0", "0x8c01823b41a9f7bdbeeb2bf755beb9f8e7e55e855759c3866b23024ad11a810b", "0x4412fa13f83c6efcb68cbecec06abeb88ac3ab73ed3ba24e66de2bf8b16bf773", "0x2baa43e104a25d79b3d8fd128c7c9659fe8f0f7fc1f77a818e7c7c735a60addf", "0x1fd27edb9145ba15a69d77be6901b42135bb337ef4c99688ab6808b98cf1032a", "0xb0ac66a2bf55bac6a2ffa2fc51bfd5aeeae847d33eb598e317ca9b01ab2edb16", - "0x7076f3389f1ca1275d9be3c00913e0486cd93b4d8184fd09bac377cdaf70af0e", - "0x40999b94eceef7c42f8e63ef63bf69053d847a1ef1b45ea89589e7e6358de1a2", - "0xf260441296e1838e2ad4b8533e10b6a7d8d0ef3b70cede59bacdd601686207f7", - "0x11a62406b19d7942c0b3361387521ac0323af0fdd1daf06e0c3c608584154c67", - "0x5479024368d5fa0b9b3dd3556dfa9cea5396aa1032a240c892a004b959b5fe40", - "0x9e2edd07c2c5b5193c7e3de5cfc9db1d4a6f694f1fba5141a8f0343fbdcff963", - "0x061a6767161dc6d02a43280df0f2aee3c53dc504d73159d85e21ecdd94c88e3f", - "0x27c964f114ec53d9c1871c185a6b8b5bedd678c46249d52781a0557fef115324", - "0x4cf7217874d9fc4f42f4b36c475a63bdd9f6771cc6b24e26db135f51808d59bf", - "0x1422c91a4fee25d755ae3ab1cbb34099269e91a4cc92860aa5f93c99c9012f3d", - "0x22c7415ddbf31f17b3485234f8dc817d8161d6b0ae327a38c07da28106d114e4", - "0x4762f32ccc5afe5f2cc09eff8bdc0fef48e3d11680303be9d27576683a889126", + "0xc42027e865465c19d6458404c5db51c0e3f4a2346b2d7ebf823139b44a5b11e6", + "0x3a8853af8ece1daa2d6f724eb06610483375b0408811c9384df7dc0239c8dd40", + "0xe9419f2c466fffa8bdbfe24dc6cbe971c45735bdc448d704349ac333f1eadb0d", + "0x56c7459285df61ce68cfb3c76e63297006204c37e4fa247125663bfec82e1aa8", + "0x8684a6dbe6d74e3f32604517613fcf5cbdb53cda6cd2552bc3b8876ab2b6f9f2", + "0x8289ecd3d4ad58a845b3a6118a5a9ded71c89ec0352e226ff26490ee9d1980ea", + "0x91def919b21e0fe3b4f1d979097ab096b9e118c530a69d8837209ecafe04f655", + "0x5134751053068f736461591ccdf285fe4bb7dfc2c72c06464390b75de07bca91", + "0x5be1eab9070f0f04518e93e84ccc665224c35537c4ce1829669493c0357d4438", + "0xb10b30d6a272d5348bfe0dcccb209c2f62ce9c47e972fdc850878b5dd33b4700", + "0x22448ba3257f7b62ade1a50c93318684b7d0e8af0d8e16a10b0c1274df6db80f", + "0x89e3ba2174156a21ba794d8fef5e1bf3f24c1d2f5008eb99e8f5b1bb9cb0916b", + "0x51cd1b1e6b61787ce569c776bedcae8e393c6a28da2820edaaaebeeb4e424109", "0x25b8425978039bcd976507924ff7d609948b268529527ce274feff6b43757a17", "0xc585e0998941ca2260431dbae640fde6795cb519c8a49b3939d1f4f81d23fa6d", "0xd8dd72480139f21404d7456212ffb61f5e3ddc5902ff4a3152f80727cea6834b", "0x1a959742df084fea7436599236452a5a0a25fb4acc2c1f95416b83c6fcb10a94", - "0xbf8aa876018d3ee0bed0c11ef0149defdb13ac74a17568f269be7fbe568efe36", - "0x18578988dd4f7980ff84bc23813158dd80d71371936a4ec51a77742f88eea155", - "0x943f25563f2466ead01319d840d7ecc72f136605eb1cc49e8890fec847c25693", - "0xbf43b0a795f945b5d87556bb2f5bd8cf8872d7ac39df4ea75cfbc6be49a0daaa", - "0x83c007294cf4a10ddbff635930f41f8d28204667fdf7a6ef00a2e98ffa9ab39d", - "0xa72460baae2004b5caa54dd290596b4ec11d4f92dd3360bca3a659019499a8b0", - "0x99eadbcce3f0d487daad2b19d645283002bfe1e661b1e80d38690fd68b406b87", - "0x104d59ab76e9ae54e8a98d2e537c852c00e4fcd16591d074753088dbd0f8fbf5", - "0x2cb3bc4edb5b8ba4acd1fb86b05f1fc85c7268e1db06117f7539e9ce76f89134", - "0xc0848eec7ed651c769405d26d4309ebb2035375b0811341e3f8756baed2bfe15", - "0xcb84e7661a88caf8684358e409c1610d44d42da60040c51467a377afb7a04ef6", - "0x25af246752f40f673a46a71929143b2edc97a744f25f149b3064f8416869a144", - "0xfc7deed1d687c039a5ed13d47bb413bf848d8b157c7de0b6c6ffba9f8a57a680", - "0x2109130e681f0c671d44c461131b2322f1c0c9e8915a210c290570a8eef228d0", + "0x6929c5dc161d31dcd79bd4fdf3e147e913a98baefbf7b45195f10e3b8f92b873", + "0xa70b0262f3e45eb55f735ef1219e3cb0e02d47c1cbd4dfdbe61507a96b2b45fc", + "0x38e4706e43b28ed99629ab0f458257d015120a503c56537f5b1c26113ae2ea34", + "0x94d3b6eb7ae2c6d611c289ea78f914b8a4085c0860e73442fc5fec1e9c692a31", + "0x4dddccdb1235711fd18a51bfe8bbec86b6e1f0011c267ca1308bc7de76328e02", + "0xa2e8cdb8d05d04d04b2e4fd92631d97d36da10602b9081098de8c64b9f0e6997", + "0x633754501370b61b6a89b253a96c19bba1717e539bea3f6f628519c93ea64ca8", + "0x7be08951dc0714ec09e929602d1f5ba3daf509ccc7918722b201a85e5d6a3094", + "0xb258da6cdf55b8df38e2c285fd8531dd9bed21a7cd0ea19f45895d389b52ed09", + "0xf6c01265b3388b9324b2306c88993178af7968315491b615c49eb840ed3a87f3", + "0x4e17785f9709a70775692bb7358980c183eb63f9ee14304e37484fc3d208fd02", + "0xaf208ae1db4a0f7313302f132349c24be4516c5bf2fa120afed37d499f145b16", + "0x488a93a71b0b16365e122f4a137fe53712c301ea62b80ab818061d0b57613c69", + "0x024099c94492c8ec89f7c6928e8b2eb52dc9dabdf50215c59be78d95c96a8dfa", + "0x0fc13aab78aae553541dd0e9a10160ac4403077e35f24cd1d4426650f230cfb3", "0xab5f3c46e0e9827c8a7c79608ae5829e433b21ecbd2c6484233eb476c2c7ab09", - "0x498a24c26689639d0e5de0e02a090ecdd7a0129d4fba0acf88c9ad4478f51170", - "0xc0eafd8a0db80a9618fe136f8ad7bc9529b5507e80bf2a1b71a30c9308590784", - "0x84b1eec00baba1906dbac3759445d4d9d27195d65b9b248b376c30daf1645982", - "0xfa427b218dc8c8324540a61afc61eaad1fd3e91eabe13c912450cd099b42a575", - "0x8c73655251254a1529316c657fa2da188484816204b33fc7e80fcfedb173ab15", - "0xfa48e7f2737e227371767975131e497b2d07432dded9dcd6118f1102d44dea2b", - "0xc42187e8c7619ee9e85d9e084e00db3777a5024d4fe802d0b679267dbfd29948", - "0x24276c9d0ed54caf7f77bb4fd3e1478d26baa23f5ca657a7802c9f24cebd0408", - "0x4acd1fdccbdc4867f39ef0cdfb3eed2ed60a06e2718ee8380b19598516431c28", - "0x105d0340a3782268bdfc7925e32ae03dbaa997c51e66ff6d77bfb749b8e3f2ce", - "0x6aa2f3de7f641a0c12027cf6aacf886e08620981a29d340391bf8c2e39466454", - "0xef50ef7fe6f4351b6e5d757db4509cdcb4a4ee60633d2b262c8f8f544df18020", - "0xcf5aff8432d8a4cc87209a2003aa27b0ec5b55e5fddfdc084dd0cec61c177bb6", - "0xb954e141a0992f19b78b9440446f3ede62c38ed1892c28bf2a597b7d4d4507bd", + "0x65ce4423b3163c550b4a37f7e3523632d579f94a315719ca4505f6dca28385d9", + "0x317f013c3a7e9948520a1160bbca1a786af2912ebf8b2a52861c7d0df7fed08a", + "0xe9f5f7a0e49c8a1fbdab284c31c8009de796e6e0195763e1e147ca9201892dd9", + "0x07b4e6d2c5007a71fa99c67f25e98cd7e7422c76f5041a46f145aa832e861fea", + "0x3d0213e819bb0dc7d408a846625073bc4d957f757aa651716d7bdce17425c6a5", + "0x23ce42822b8a4d0be074fef3e3dbd4764080c901d3d2c19e201386f3fb65a7ae", + "0x639b75e1a6b0e63ef81d2ec540a3bfcebfa56698bf053daa9bc18da30ff1348c", + "0x41eb1cbf743bfdeb0997657cb77a806e0cebe425609b5a2f544f760a6d723be2", + "0x025e581f8a9dfc7a96def50f281885a55198646b2464f054d356a0efcc0feb80", + "0x429faa4bfdaa83c0d45f67894958758635c2e1a78ec3b63376da7e3237bfbb41", + "0xaf1c2ef24fa153637fdc2d67b1ffaa599b9a09fcf00086d20cc7c2d054d0aa91", + "0x8d28de3166d0f226fcd89899c622d7f43fa20b6ea4eeb81976c5a08ddf09e5c4", + "0xd6befb28c9dfd0c738797b15e237bfea883bf513b07c575259dd5a4f2c930692", + "0x1ef2170c922c4b149c888a1df7f3050e3f46b8ac1f0224f802771a0e8d38cfd4", + "0xd052117f2b8ac75d0446ab5d0e76b50a510f7482e65d0a6427a3d6873fbfe7e6", + "0x53408808bbe0893decb31a82c9716f56e93034d2a11d055fe71f5286e971e1bd", "0x1a1122d7112ad6c06ed06d7cf20a71fc3654f66cc0606e6725bcbaa0ae190f7a", - "0xcbf56267474c7b5e9dd04e148246bede54dcd9d2a26a307dc570e90d148e45cc", - "0x19b1e94f46d4493c35d0b65458091e5bec57a72da949cec30d9b2657765cc655", - "0x296c32fc49a6c7ffb948e27cc5454045f14aae3d89bb2effd868934f341fde9e", - "0x65639c5e880d338bfe50d102a8b169d2562a18fe7dc8df6fa91bdd4f6010d371", - "0x63c38ba78afb97b98d7931286606ec8d5f5065aa32a026e82733b28a9c0e7ed4", - "0x383b9a43737ac338353c9eec3d5f7e98afe14b6dbe5d36784d9f8602c6a6262a", - "0x3482a1fe9a6d41dd9eae7484ff756149be56fd91a0d772ea4a796e812bd65b10", - "0x2fee05502ac990a9dabce7982d8ca1e52e0fc3bb46316d3d7d5146ce5564267b", - "0x9f2867549450044a02a75a886466c9454f5b664c926621d9576e2555a1ae0e89", - "0xdff577d8ae14ce3abe1706353c37405a88532b29370ee3f8ad87e14a2f0873d2", + "0x1a55ff08504dce5ddd7a238eae153ce48971a6bd38d7a3dca060138996ccf1d6", + "0x2ce13ad2378c450200eca23f756c06071f3e612b2b9c73e1c6c501ff4c02b1f5", + "0x35f144ede85fc609a19a5748ab1a3a5fb2988bf6f78f8210c16febf929dba561", + "0x1df10cd4195b0904b792aeec7d5723d1d150386bd04b2f5f0df5deadf3c85ff6", + "0x5c7a6f272a83f6bab673609a539f31d7c67c67fafea6d3034e07ece1362a829d", + "0x7d668480e1d312a5362a3c5e8f885c1b2de095aa46891bff34592ab157ac230f", + "0x6162f3d46eaef20b59d1a491f74f9eb14b724a840d8d023ebc16df8fb775e7f3", + "0x5963e212267c43898316f3e1112f4834e7a271ea685f2388edbe888e97e38b7f", + "0x2731e65738446fde914975f713c57a8a8f4a125281d575c3a583a5dd36e0214f", + "0x3cf5ee7469fbf7063c7fa552dea1d0251841644e689dfe63e548e2dd0bfe2eb4", + "0xb28f87b5129aeb448bcab637389a294c87d8070fa18681eaab06278ea4178fe3", "0xcf22ca62643b004a97845a72d50d8f686151aba153f68a596a1bb90e9c42c45d", "0x64ebae35e39f00c73e11e3956ab4e7df723aeabbc3fe46b671ad5b54ed6a2cb2", - "0x717b01257f12a815d08b2241aef449c0f53dfaa831bfe52d97a0d1dbc051f1c4", - "0x1ad22b6f2432d6b2ac1473bbbb6e1aad1a924fa236090f68e2b070c6b168414a", - "0x4cc0a7bad191a71e7c3fb29ed53b52f3c1f665902781bf19403367edd8c3fe19", - "0xeabd7261d43b3abc08a4178a8e94919a69393d9a52c40eacaa95afef020f01f6", - "0xa1e92e86d33073ce01a07869237f29fe93fdff9826fee27d8fb6e7ddceb571e0", - "0x347be547c2d98c83362a8ea9d22ee327db4e85c808c277df8b4d63e5042e1dba", - "0xbcd1e2e05ca555533396ea9a4a3a9c30fc60518c7d1d5512a84fc9c22c5a3161", - "0x5c2eb0dc9801bc4724a45567308c65000cc752432300522e86809b257fe74615", - "0x4a2355181c6b808b154e2b92a15d704b58ccc9928bc554e53c93a3ec6b4e4c3c", - "0x710600ebdc8924bfe16725995a146552420916d96f24887c4413caae8ba6764d", - "0xdc047341bc7c3a5056b6443fff7eebd9eab52aa7a4f51b4ce8592f7a732f3b2e", - "0x355122b62e933ca43ffce9dfd1bff2fc5eb1a9218c8f9d82b598d1324146434c", - "0x488ee9ec2fc6c07f65b155a943fa08ee03f1c4a7dc7ff40451bdbc63df1ba8ff", - "0x2f6cf657733ffa474638975ca53d8589f696fdf719c261d991ab1c54417b4dab", - "0xd579e040a00927f24cf74a1c40d7f260af635e032bb2c2b97b59496ee112490b", - "0xb56eed5617482628beb1cfff96e6ce2e47527de7871f19af9cc8c474eac1198f", - "0xa4d211c3bcf1d3c29d62c374d9b50056ae6b95d0cbad490711bb792e1d15dd9d", - "0xd29223d30f7b106008ec250dc17304326b56b6ff2b3597f14187af55880e1531", - "0x18fae4157dd53882b4a9dcfa8e436b63cedde04a203bd2517e68cf869d6a81fa", - "0x7abb918390d894d5830bd65ccfe68661e52ab1a6218f856148d660c5e656ae90", - "0x83d8758d68b3b789151f143220d937344cf942c27e28c3db1976d1e24370da66", - "0x237cc063914133a7e47643f02c68da02b963ab66a782017a5f405803629fbef7", - "0xa5e7dc4a8fd30aa8b5c418055124a8c59a98f0959e4441aef7cc116d76318c31", - "0xb0d2131aeb093e758633ad5df607bb68bbd4944246491e7914aa6eec3f50848d", - "0xf4be91d1ea45d2cff0ca1827661fc79742e41631803cd54c9929c60fdaab7472", - "0x02309380d54482ef6fb745a801f53361cfe7f2c858f7025df7f14b949b223369", - "0x29fea7d0799994ba852ae43b58840ae0ff388c275c8197fa85e80537826334ce", - "0x70b14ade39a58b973136ba6b7300ea7024f5e58f9f84a9443a7cfbebcfc66a8c", - "0xb85cf1be91e3117933da3f67c83136d342cc03e20a7c0d5bc6c93e20c873fac8", - "0x4f23859b9dcd47be65b058f51a217b08ece7030b2cbe4abce9d5be96af616962", - "0x8859fb7c10977012c8c37a3908d0e9872bf5144067504efcb964b50f63d0deb9", + "0x42e2aa81b708f8dafbce1c10cebd49f8fe1a5c00ed9157beacca685f067ba692", + "0x443d868a7f7996ff6a05c986a637fc4ec1b64fdedc2c61447eef73546ec015f5", + "0xdeb3882ccc243aed58e3544b3f6ac9ddbb32bb26881f84b0e70ce0ab6ce80c16", + "0x6af064aa512f4834dd0e6e8b19bbb9046eaed604ae79f0ab8d872f2e3809ba6f", + "0xbf6e3dcf16b37125eff5e29429e48a890615ca887c6fc3ff05299b7432b6e470", + "0x735cde6d3129f769abd894615b22062f78e86087e3a0d2c2e80cc2d77d3b9e1b", + "0x6877f34a9fbfda060fcfb08ad55c23ceafd9c223ba860a0634ac1b8f2e89782b", + "0xd9189dc462222c2f14c11f63de4ab424d61bb83a83146d62df952e87a3e5da36", + "0x720eac89876cc9a772da7974d5e439b67f67ddc9baa3a9452cd4b74015a3e2ba", + "0x89824ae17ccab48a435b8c36320b18be8557a9dc44fa6fb2c3febb3087b481e5", + "0xe7d412126456b86597bc9aa0745dd13e8f057a79e8a547c1d478abd16bd28a07", + "0xc23a9160da1875e9c7d628f94d414a4db4aa2f5c4100e226484de948ffcf4b76", + "0x45b1b602c91d00a3abc8e567db3b17f75ad500da30b2c51c03767900495e361d", + "0x9caca224c29960f1d44b46ddcfbcc076e690f436f3f19980a0565af929402792", + "0xcdbc9adaddf96f8480c73360b4f06be947a420cb842cad3600b3645879d42c26", + "0x5f2cdc3d2a8bcfe0631c4f981cb69079342dacc4d564870f5574dfb1febb7c9a", + "0xdd004991aa02fd318fbdd65c14c5c333955b66e0e5f529896bff742d7a5adc34", + "0x4731042530e21dd524a9b599bc7d8824b7da45130f7f7702c9266fd6f5f5fb6e", + "0x966fbcc1576acc365efbb2ebba6dccb57cd211bd42bb10fecbac7577e38393c2", + "0x26dd365d2cb06f1430e28437aa350c21ce97e431f730e03bbc1ea734dd5b6139", + "0xd3ca1121c409364a6ac8295e790950ba94a91a9f161029e3c95f852ed3de405f", + "0x05cd39c1ddfec076c18da28f240551b1e78d930d4cb2eed4e749d37a8ca1e361", + "0x88b7084cf72b284e93c63729d3874ec3a805ea586b44e04d1ef31036d4d327ac", + "0xb54478d783008c30c6acc897d1e9e491ecf26c89fe88c1ec33a3b89534229876", + "0xb8dd2933944c78a8fc14a76ea4b140380ec751cabf3915e5a448145745b501dd", + "0x41ac0a58ff0aebca682eed3ec85b477a3ea81694e1492d90e5fc4ed663ab4c54", + "0x4a06d54cdc1be23a75c5240467745b8fa305c633ce75ed1cc54d6d02970f456c", + "0x259f8ae459874dc723fa5e3e34a918c98a88c0a3fe929d82055fd91b1bb05d2e", + "0x051be91ea29b718a7add99265046ef67873dbaef9a3155e1554c338717d515d4", + "0xedea3275ff9986281eb6d60cc5102ac7b839c20ad883db87d39e31a0a29dc114", + "0x11ddef1858c9ec82278078136e684305bcb7536faf9cfb57221b80ae25b429c1", + "0xa64006de9bb27c090e0ff1b5ea8796ec172baa7f27d73fbfda57584d00b254d3", + "0xa0189ea7fedbb90640f118b8967ce54accd3a7a9fbe09522c7a273d5b34fcc08", + "0xf4265ed608aa4c1c25a3ceacf4370ca9406280dfbf7db8a7f7516d3a1779fbdc", "0x01669f3a9ccb892e5723a4ad5a91d3c1fd28abb8144e660f1c56bd456ab71463", "0xa973b694b857005fb9671fd35ce6b5b9dc76b81f42d3bae64d80d04fd20d76df", "0x43eb3c5d577726e616b2e32c82fc2280873432f14590a5f64dd804ffb8b0ba89", - "0x42e831ddc9c5fe3b84a613c3dcc3441672c9fb7d71353f79aa9b67b52b08e641", - "0x9be737ef89b499aae3d096b4476b59b06f1c7d020e1c820d9c588ed918b4156b", - "0x688d8c0c773bd26cf511939e8c276b08413bdb808862171c60c6ecfafc703ea1", - "0x53edba14a851a94cbcba9eb19f464cc245a21d836f0fe2676d5f78a56251d574", - "0x5a11d24981aac061b2c5773334baede3f0bd841092abf79653581fa4e891bb91", - "0x2b68b7a11afc8fce2eb19e3d3fed332e0ae76f89495cee6d709449e8264b880f", - "0xd434f99da969426b273cf08be103b4449c19573e0301ca4593a1fe6d3ed05580", - "0x6544154ab7b8fb8e131d48fbb3e238ea63627cbd45c02594a00e539cf22ebe3f", - "0x506597d62c0049266e996f024664229bfbffe00fb7c1d243787b8024bc819423", - "0x7f3e71a6f8f8bbbed3ca04f9df449d8de225ac96790851a0f4d50d8dedcfc58e", - "0xeb6a12ffeff5d6a827237f67b3bc21e5d690acef72d2ec251144297466379934", - "0xed80e1c32284d5ee775a084cd605a8ff9f5776eae14a72cc49edb1a2227d7712", - "0xc59a779f7f6a8d6b3309a68b31d7bbb24b92f2f83a41590eb216dd314bef3389", - "0xab98f03f9f3c3809b29e51d6d18c3eff59ab4c982ad104227e81288e7c42b893", - "0x17efb05475125a17704a30180a4d1d977d9154546905251ce4ec9011fd7af203", - "0xdaa067bb9abfd830f1af36824b7fa824617ea60e71994948e8d56e8e570d8dd8", - "0x27b0206651ebae7c64716db3ed5f2328fa2e3ef8121d09adcd35b5e640030c72", - "0xb88fea5bde6f031231c9539aa865f852a66e0749119f5218efa1e14a00f7fd33", + "0x74b185addfe02130f2deaae75f43ae86e99704482c8a5b37b391271710692407", + "0x4a843bb52f67d924c656d669362b6746c0ea612a5fd354fe22541b28f2fbbe52", + "0x75c8cd349d00f09b0e6256ccde9e2695a5c5f6024b48a6215b9cd7b3cede2ee5", + "0x43a6d15e6839c6344cd10011354b25b480a3263262de2a358dc7e93c8ce0a0f7", + "0x0f74441a9c3ce76a08ed1ba535f8d84d57a7e8fc899bb5da529a23fa70a28dc8", + "0x2df1b7e2facc06bb29e451c799439ff4299f36982923ccc02aa2f9e07a77dd39", + "0x5ad0d3c266f944b8eee43ad41ffc0d60f16f287c7fbe151ff9e1ebda0b679ee6", + "0x825822586285b4fd8f0ab5d8c4a61da4e91aa922017ea02fc5630ab10ed06042", + "0x8a03470224323a36447c0e28ab363e972928cbd70a9ee49708f913f2381d077d", + "0x43f53515812eaf21872072725410d1da0fb4d6a115625f87c742fbcb993c44d7", + "0x2af1f3aa474800409875b50901a003987a7a8281028b6b5d6e28044ff6fde529", + "0xa3685feb85e5323f1e77c300246f0c34f8c0eb65f5422ffab434df4484a4324b", + "0x6f9924a114f18b63f8460b5691b0e9b987a239e58699496a68766493eb9f9d1e", + "0xb56e27045264eab13a2361ccd8e2517d495ae8291bf00a0bb3fed8508881a153", + "0x8edbe71b1dd1b1728904ec4a721fec0e2d729a3a2f29775141110586efd679d8", + "0xa1cf3bf7cb6af61e6f3faa2826c4962901b00dc6cf548323ec4c6710d3f59132", + "0x95c272c1a208abfc724bdae6a5775629f57598912b522446dadcb5dafbb69696", + "0x4883d4a7c6282329772b78fbec671893caf2faf6bc0fe455d2911b5360ec27b7", + "0xc1ee5e4cce9f2a0975d346c98c354439818eef689ecab30d235ff6bbe4cce844", + "0xf6fa578114e682895cb1c0382aff2d3edf004effb53cb25ddcfdf8be62222b3b", "0x4918b3e71c42a9209b8ebee1a99b4e36ac02ff60ba6921b2908aedc9a7585c36", "0x7a5a799a59c3993bde318668639598408cab463cf14aed9884f9e11a4d5aaa19", "0x00c5d806dd3daeeb5ed171516e967f1ec965352aa5b34ec41c87fcaadb7b11b7", @@ -320,18 +349,20 @@ "0xc4e1da3c2ad442bd0fdcecc641a5ae1efa2aa7201bd65e0bc1e4b00b0e799238", "0x105f340886d8ce3555dfc3a9d863421cda925522b21baebd5dc27870d83d8b23", "0xf5d919622d4c48ec64ef2e883264bb2aa856c2bb4e752d256042d3930e017c88", - "0x62dbc3849b57cdc4c686f533710b5dd634ebffc3a769df574583ccf1194fab0d", - "0x5ca9e2bb38fd8c0a92e94cc4c3fa3d2f9e179809d4e7ca4f15e1d05fbedc8b94", - "0x066ead76633a18d45b2d50d72e2fbba485fa834e5fc002991beb5fdd2993ceae", - "0xaf09b72e96fe111c787398c56ef3fb6df1e706f090431fc6305267e9952d0a5c", - "0x0b01ab14d14ea779797ae4f7e22c0f96982b3c56aac9ce773474c80f7de5be1b", - "0x49a206c18b480efbb48202b866557132cdac7e60ca16f528f236d87c563f8115", - "0x3fd421b41c3aed1952b537c4f1e0c0cacc26cf1ec655d7580503fbdf5ec1caa2", + "0x74d6e9e473d5b1cd37c6ab834425af7656f4c8e1b6568880c2e9f0260a401dce", + "0x5597681758fa83f8693d1b559101836e0bdc927193585f890b9a384e8ff9fbd6", + "0xaaa6f541d94a945f1ec7e393575ab408cd642f84dde8b0aa7f8430c19cd4bcfb", + "0x3260ed182f22d860e2b625533c808851589f2e41e55076f55b5cfc1f4341b537", + "0x459fe6b554f1ef48f468e61e8ff8b9d25427aa7f77ab2b6b14f630aebdb611e1", + "0xa84089150b7cf977942f5c82db37787316fa6f4940ac9eb06f4643b29ad17fea", + "0x25cd2c9ed7ba5e33babcf1afc091b79e06adf05de370d089646cb801129b9457", + "0x04d61067ba7fba6ed30cb4fe9a40bcbb8e2782b187d8d6a0e37766a6c01fcdb0", "0x5fc3f13afefc4b831b54c523ab256e780a4ba9fac52fb7dbba4f862ba44b9c1e", - "0x794f6893d5cbc5b958642b6f00e4da5b8f724b2ef78f1836bbe0bc58a21f3cd4", - "0x59f083418d0796b9eb9e47321eb13c78782cd1613ef847204f6e04a8044963b4", - "0x2b8a50800566718ec8efc339461a56c60c78846d7d1e3f308d43b0d45e98b788", - "0x3cf3908761e06ac258ccb2948e22cacf5b7f8472dbcbd3e60a084cc6422a3824", + "0xfc2679b65b13464cb3816807021e38ffa4e0bacf572747f8c046bc96a4739be0", + "0xc9e9598936eed048b87882f886c008e52cbc98bf54c8c39928fa779b96e1744b", + "0x9c067fd47dee866de589129dc58d7e8c098f9e9833e325926f7d655694f35bd5", + "0x18c678f0c0c1b29f5ff5a83d2468667f1a8aea2dcaa128360958ef5d67f0de3a", + "0xfadb813be9a88e50c4ea921c6a0ba6c031f024fb99b7d6a93b8cf1ea5f995856", "0x15b67bb4a517850355aecc0e79b5582f3bf3790fbb81bfbcd632dcafbaed487f", "0xe3ad603dd8539011480396f7551ae590d25cbcca85fd0475fc7949307af009a5", "0xe61be68bf57656076b8b638237cbd31bf3a0692e225b81694bcfe2183e0e2f3d", @@ -340,58 +371,65 @@ "0x1c16cd293f5688f7d77a767195f36a75a1a62b886a00e581d57b6370cbec0989", "0xc9b5271fa2bb8192b1e2f8f304477f9fba0010f3e6eacf9cfff8b7a5a77f37d7", "0x8b887ec9f6fab09f1f5d3a9e001a807654fb49be354cf3b0f705a80c048b5b97", - "0xb950aacb653444efac6e6fd49baa29677d73668df5cf100327cd1ce44d99bffc", - "0x4626d8d330a13e6d65834cbe5f455493c931be575c03415f43603a7770197912", - "0x326bf0770bc6fecee44eaade56504a93a22be4df2948c2cc30f6b9714a7c2f47", + "0xe4b637a114758ea5484dfae511a5f0d88a184c83e275366cfe82cf1b35c42ae5", + "0x38b9a537c5cf522f99ada24f759b200b6045cb9997f05ea2f09c54a554cdaa4e", + "0x27b4c2fc7d585a0fbcddcbc77dfa0444cb1e915b303f91fba43b9b3a95281902", + "0x1a4de326e3538a53a958a8055ca6adf756e6e9f93976627d112b8343bd445c52", "0x9b369fea35bd85dffb10a24f9bb0074f411899e3d505a1549938c4c1bf80111a", "0x4888ecb1b51dc5d4faf8ad987501b298985eb5814d0b8055d00bf34d940884eb", "0xc063a2893a30fbc55bfd4395db9d8854a4c900f726af26cb5d1905f7d9dd6a65", "0xae493057cb0f7a43a6477aa1e7d1e62406d6028f8d35ce4d0fcd4e309376e911", - "0x12be9f0e279823017cf800394ecaf7898259db86d0249f3ad771ab9c53884089", - "0xa5cf92a1f2de9419004b7fab8ee8391cec274e8c5bab6254946186047e9a2257", - "0x4a1394f5c2dddd0aafe519d731b40d52f1305c1c6bb675551d6553f6c28fc88a", - "0xb3ca7fd27d67c740262811f91cb1369987f0c7a5363341bf652b0b608ad93def", - "0x1eee63190a3b8165c3951de2ac1122feb89dc4e553a5b0be7d627a0bc17092c4", - "0x8daa5bf9eda723441048b241012f832d3b0084813a59279210c15cdbbefb6df8", - "0x7ffd0992b0b87f9ee8a75ba1f7f815ca6101da8173e83e474d1610aaf99a1017", - "0x9fe671120528faf71ce7ff08af6cd04792480af0fa5dfefa7e9e3e90edef3c74", - "0x761215d1594d0f956e37ef651852c0d3704ec7059b98587bb49aa441c69a3272", + "0x116288e2a06404aa3dd63eca83992b6d74b47bf0b45a795ebce730e76b78ce4d", + "0x3c22d9c7ee98226ba96ace7f7c019a1703ef292033ac253381a8a18c2fdc347f", + "0xecfb1e3a21cf817dc12ba477128dc494a61762b50e67b9aac2e69964fcf08251", + "0x586eff30542d02ec75cae827877e97d665fef3fc367eac461ec58475b32e0ac5", + "0x0a3944ead5ce6674361157bc5a434342b4790a6f648e9729073afd02729d683b", + "0x3fd7eee2a25ffedac4442b6e60cc95d654f42351cfd646b821c00d0c64fa0e54", + "0xca89d185428c8056e82feff16a21ce5effc6cfcd23ebc4e112d9a5bf92fe8d02", + "0x020513017d2e98ffe7d52c07074fe4f4a6e77ee285623eed269203295a9f3616", + "0x8596ca7f91be1ab40c026b00a54a9d2e41e7ec479c197af6abdee3c4bef94a1b", + "0x7455f7f237ec777303ed925caf869cc73c044da6d59836ebc65050cdce20a862", + "0xf2761788609c45098d080e6852b9ddf8a966f8a5776da9cd021538e11f84c081", "0x4cd1bdb39facd85e2260d74f182adc4859ac26ff7d1254108111f60ad3c0f4f8", "0x428b1167eb9dd51624d22256637ad2dbbfe2549077069bdab23dde71c21c244e", "0x004752875df306fb127c07bc528646be044e7aff6a42b9f8508dd6d379528246", - "0x6afe1a860fc38122a4a4a2a5c29f39e899d674b071ff9341360a5fb04ef80bc0", - "0xe9e7606a4c96278a0e30f56288c9d361e4bbc31fe130278d77fc6b9e08d3a3d6", - "0xae7099c4fee11a5908c4cf736df52d6f1530c8e68b2203b02294fd40c4ec9df0", - "0x35f0a2c11d5afa5c3196884ae6e7a9dc4191b8216abd4bb2b6bfcf032df3f579", - "0xd94baf7c32c26ac39c0d83801ebe53ab0294900ca0cc038e8f65db8e960b698c", - "0xd01d6c2b85a9fb3a4841ea3344deabc175c88ae558f125c6f9ed6ac27f36f457", + "0x6400285ad904ca915b47b7259e9d0d96c7dccd5b4e57c4884f03c22aeff271f0", + "0x5766c8b8f8edf43b0a1d732396124cc629eb2faeb8246bf37f56956d0d4ece9a", + "0x7462364f2782dbdacdb63ed9ad7997218c3617296a92232cbc22dddcc2dfad3a", + "0xa92894f0d3b92a92a600950da4308cf22d02c4bdeafde724221a4df6367f071f", + "0x530b781fb432211530f407c93a0da55d97f7816103dd236d35a5416852c0dd92", + "0x709ce3219758a439bae296a980ee12fd3241ec07fb5f5f7d4c69c96f379fda1f", + "0x247299713beb0522b1d4b3810830f4a39c9d86dd11cae19a23996771107f8ecb", "0x81520ebe99b2944cc3f4e7235fdac6afddd9537ca5ce8299ae65191241d404e4", - "0xff180d388cc7b72eb4c30a33546a7281b129afc1cd42ac1f1aa924b72fee4108", - "0xbff2580e9cbc2d8a74a4e484c94a9a4749519f1fa90dda9c8dbbca3db1148139", - "0x3da349213483c0ef14ef7eec97d4f651c2614a02529a4d5c3613ca5e26e699b1", - "0x40c5575c86da1790c5922c7c38c605c8e7e649031a4d514513231994228b54cd", - "0xfa441811115bd08021c4481baa365eb0f3afb7f3cea17fa5e62a8e84024be782", - "0x1fd833b72bfd4a954cc8dd805411db47117c5bda9e8008672b1f403ad775a12f", - "0x84cb1c4d255692ff9a55e6bcbd174e6c4f2ee50a1bd2a2c8cb2642004753cf6a", - "0x1b9146f37ae6a9d0a5231662252b4323c419c6abc59f7bfc3de07968f873423f", - "0xea7d17767a8836bff9be0561d15d0f89f12ae783656f067f081f102ed1a5e280", - "0x5b33cffb9a4d2c3410d99b94ef8279b6b99f5b46a2712d3670132af43fe4bc1c", - "0x23c387119716f1d70be19ef0e3f5a41e7badd874df8815fe6cf8ca2013503f32", - "0xee87159333cdee6915b2cc3eeff6001456e8e99fe55c8be21e91da120a83c6ad", - "0x645da769e74d2e378c51490e3f0e9486beac8bfd6756c08a487d1718f73bf5d3", - "0x0cdb239c8d6f557000c7733586a01a4cbde0315e5eaaff8d7fbb0c4ec1826875", - "0x8bf90a7fd9e29d439be0890a9a0e8ffe950ad63e4416c28aee05ef4aa9d7dd17", - "0x611a5fccd8305c75893da423ec77bce9adfaa6c8b89dceac22b50640672189c5", - "0x681241f34e9469a54a4327cb63bd3da0df111a5ca6d6ebdcf84fea4e1e454422", - "0x42e25ca107a29d4f631da50f0af0e783557539755cd352e7bb622abce33a5773", + "0x6042dfa21ffff40bd0974974b56367be8430f6b6123ea583e36b4124c5f29d08", + "0xdcfd4655c6221d55fad4cef35b1331b40b176fda7fb6c11db7d5cc04187b4882", + "0xbb260bb4aeb3af6deb85051d1748cebb7530217cc8260ccdef741ff2d598dc22", + "0x3be72c045f8ceb904d36dcc39bee464ba632402add4183ad31af06e919be2881", + "0xa59c464c149d78f5999fa5ca418ce226310b77e2a6b65eed2ceba9cb163f176e", + "0x211c6bfa31fa5634f909063f9f69cae230eac9d2ee73a8a6d2c720f237352e0f", + "0x6f4351f85a0ecc56a09411631cabc2fbb23ad70cea80472c807cd23cf62b4fa5", + "0x595919648aca1b0c0ef865851d50cbe0f4f237c3e0122ed6bd423b82b41003d4", + "0x4d8d8faeeb2bb1b649b2797c5c77f80b5c849fae29a173ca8184037b5fc6263d", + "0x1d9484438476411b84dbe20316aea9b58f2785242f6aad39bfadc106b6e80b92", + "0x6fdc8e6a1d473473d96b41db69d5e0f54c8bf336e85c4f4a6e4c8a24f94e89ae", + "0xa775d07b533321d278af6658f3498a66a6d243195e91bdc51567722496275b8c", + "0xf6952f3a1ee19c7bf1033bb9b3f042e831f9b4619f01e23253f4a0b029013f17", + "0xb1b1dff80ec1ebef8234c0dff341d9c698c7654571f2c25161667e4edacf8926", + "0x8320f1f61918ba5d9902c06efb94d6f6cbfe8920438826b6b67b2658bb68e877", + "0x3f3bbff8c2214a0d3698dfed1c9dd8a99123401750ee9544de3d771d6f96bbba", + "0xcd65458c19e6cae7b81dafae385b148914eb6ed976bbede8802562034b670c3a", + "0x3d0b8a8fee8ed214f36fc077878672ecc1ae54695bbbfa152a650c15bc397390", + "0x6ee818200d32c0070dc6b369f6394b25a0bf27a5965f195a3fe1f2cf65438bd3", + "0x9415bd868c4cd0390c37d2e65c3ca154a374381702f128665d90f3dab2fe962f", "0x68f5a344f33a3aaf6231060312dce5af095880ebc8514eb80ed87999b69fc385", "0x95ef1dd00f74577ef674316005e24d2400dd5780020c8fcca5f3f119977b4afe", "0xa3b5480878ad9eded8cba26dea3f80d0b961b9cfb8b44bca5a68eab1afd3f318", - "0x9781101b3e945a12b0a714ee260ae8b9bf73378d8a2fc06f2248acb66ccaa508", - "0x9ce15498a9b6c54166c88a3f818f17ea75a44002b5f18818d817308372dae275", - "0x489ecf5bfafe6504e600c7ee3898cd3c7f912c8c076b0ebcde6e96eec5b0afaa", - "0xaef3b57893256328ce3f0a835ae3bfe6ced29ec28c55d237f2e847fa4e34cc45", - "0xc9d611a422fded5a2c84f2ba996633149c59bd9f0e861794e58de0cc92ee3f09", + "0xff7b0e331bec7020af8aa904b9ab8c06cc48b7589135db941481420f0a280a42", + "0x1a24b4b3bfab2ba4cd843e1ac7608e49a81727c963400ea9fe3c4545a8521b83", + "0x7f07f91e32a8944b1da25cec3f6770a6c59006beb03d812a7abee86a9754c7cf", + "0x009a4881fc115cf0e4ba01a9e78cd863dcb54f621b2add7db668699629c95f4f", + "0x98699ed254446c76bedc8bb46a34a4542ced2e6ab8e2873aaefe723a9884f2dc", + "0x9e3bff6c2d66c93345136effaa8f2fd70ceb37d321c8bf3e75df06e09b95db3b", "0x1689b716920f09241e075f61af0f9563bf6ed0ab53ee7b7f04715375d5abe3fe", "0xfec5f5732f53ffd71664cd52067a1a27a452f42582f077d1d1b60964c7ecd63f", "0xf7eb9544c668994e209e152cae68d41cdb820ceb71fdfe663e6a4dacc7a0e7bf", @@ -402,29 +440,31 @@ "0x4a3b3b514a8b9ecce13517a33098ad0ea50b86be59afbce2d852d5e687b6e660", "0x9aae3602efedbaed3563dfd9822138f49b482e52c620450db9eb05bce487753b", "0x92b2598c57f7e21e2d88c24b7a53fd4f2f808a11b9f49f6e196664013ce0a4f4", - "0x1f7d6f682168afecbac8a4788070e42ce75b5109412d3bbf23fd4e7204d941a0", - "0xfbf929255beab2379dbbd2e803a332b4599f825c0afc8a521afb9f8fc516be0c", - "0x326187efbd05c4486faa0f9cbd8f5470a21d6ecc8dc0180c6639d97759720705", - "0x402a292cdb969a042ac5f08237ddbde99baa78d01b99f4e19d28c6ee443413e0", - "0x6106c2d89f966357387b6e4e9c411b1cdd04076d58eadc08b9acae90979acfeb", - "0x8a4e5e52f9387c0bbf4882191bf89c55fe12e1c0d4e53ba90fbca3982bb5c541", - "0x759e84a3ce14d6c948063a6326e8cb9ce862b80e2fee6e0fd173ce8af1e7e834", - "0x2875d4027bbb39e7b396a7b32cbc113c12b11269fb60c62dfac3a63dd05055f8", - "0x6834628af1ba47bd1559649f4c5c880e62b5b930708a7cfade9fdd4c901d7bb7", - "0x1e9bafbe1af5696265a9422093134b5518dac9e0a742cdcf30c8dfa80fdb708c", - "0x026110a5ec79422d662fcc93923803d2db1b62b26bdc106ead63d07a8ee21830", - "0x2a84c0aa91688988eddf5d3fa3d2f4e320ca9f8d38de096fa7e221416b169b8c", - "0xb6d9082930579b93ee9d063479a57fe7f0f9f06d28925b83b02103de7ad4e6b4", - "0x9567504b8fba477559d5cb9bd97e9e7a4180ab915349b2c58900ef9ee2cd8c98", + "0xfd028c76e9402356958141e99215251f84783ebda9b02026aa151f6e0c9a9bfb", + "0x032a4b576d27c63c75029d008259e0ae303e2483bc5089fa849969345e5acd37", + "0x275d7b842c0891f6b9d699707a8572fd433b2f2f216147650b80416b2f81689c", + "0xba648aa2aaea74758ae39d07c6211b116ab1f6bf3950a301d755f8683f1d2583", + "0x4de576cabea90df466294c60d04d6010d54323ae6f158f9a9bbd815446ff26a1", + "0xb9592ff44325d6b1f79e56111273ea33968ecc88c134b5fe89f99f36f458ce3a", + "0x14a9963e13b5ef4f2e2ef934cc9bb1f45eefb0a08bf422533583e614c560bf22", + "0xdf6f48fa144d89c7d4f22302a60b8b05fc12dc9552538e445addf27cec92f684", + "0xc0e851884860fb3cff32ecb2d978a7c410e83f51f3041e1354c9d2e5ee3e25fb", + "0x20262585f1696078100d070ab9a463816c20244365e735c964697ff05fea5d4b", + "0x4e7874bcf3a58d33b8bd444fab5a45260f1d4544cbc7611a548a77814c086810", + "0x3fb859ffc73e2c9d8af056e435f58ec04f7cd243b50804ba35ca0845efe3e887", + "0xe6e8a8b139b01c725725819cf92cf5e75d5d224db84895b7e7bf4ce479a86745", + "0xfbe9aaa6fe517b155cb2812769f3a0df7ed479ac142134ef9acd01701d4e15f9", + "0x58bb43dd312edcf8d630137a72b5219c04394d0032e1d00546b64fd59a42b6bc", "0xc1889bbfa8ff4d1c8c2e9bc1f0da2e92d3bd3e1f566fd51b63f39d45a7672a07", "0x836a90de1df417696627a0a525a71be6e15799fe58c0105c8bb1b88d914170e0", - "0x6280dbb8b88c69f10afb21f15ae7a6b47c65768e2d6592dbea315e17ccc463fa", - "0x36b37453aee4b4e4563f76e1982d38e67507225e78e463cc8a273466aa44b90c", - "0xe5f75cec24a80324b70d3a329000f7e803957f0ac554d79b446c1c2affcde0c5", - "0x3ff808fb13176710ebf6260ccd367f73a54b3a8a5b34abef931da30961398902", - "0xcea8df885edc0be705b856f4efa98e1b19f73ff7947b1226c3a2c2967ac64502", - "0x3692ffc2513933fab20d1eda90091b52f539c44876b34f6372797ed3e0213b93", - "0x6c0957d35a587d9912e43455eccd6c72a65e73ae1260183a801a8e8067642dc9", + "0xdfe492f017e71e3c5a6f45040e11744f85209f6c7fdc8ef63f29a5141d8d0cb2", + "0x4e6e62bb0c20d9041325cac14a412657cd501e5ca866156e5fa6721aee661109", + "0xbd0158d63fc20fd32652dbd430b170c6f5676bc8ecd9fb62e0c04bb605b0f5ec", + "0xbb9895aea70a934f732ab3aaa58256f78cff7fa7eb58f6529de4f55af2026ace", + "0x90af79ea726cb9415fce82763fbefcf80f7a5d86baf6685d2f68db0a941ab0fa", + "0xd953d8c1ad85c0d1a475d0dfe67b94901b03e71a7ec6f38055940c59ea41d88e", + "0x256ba01bd7e935f92053ab776201f1058feb53d2ee80a038fcaff1c4ef3dfab6", + "0xfd6ea22008e558fb8b11bcb3b1a23bc013541600d0f165bfa5f5755a067d4f0c", "0x7c40257d81b592f5c96f2074d346b5351b8459be4a35e4e66d2fc32ebeda5e3a", "0xc39c01667e00c979fb99e8730477eee4865edce058236efc6cbb1d0031d6142d", "0x300dd664079086ce538ebad71d697a686f5adec2adf41960ee92865d3686ac31", @@ -434,9 +474,10 @@ "0x82624bbfcebb620fc798b726f40ace38a40e5220b003272488cc4f1c1481b3f9", "0xa8b409e48d7eb1c412b7807b350c74f42e380f4c3a545ff0894d20ee9cc859f5", "0x5fca68af96cba1ebe748a2958e10ac935212c8ab711dc6c7c12bf0172278b08c", - "0x3af3f02715800ab9d2c82f5e07ceb2d03a994834027e49c60b0f15efb5293ba6", - "0x2075211373c4f514015d1d89bac6691ef41092448d6d8a00354661e2f2de47b2", - "0xb056ff02fc2f41738b769e14a77f8f005cdab6a7c1b91d9d75d2aaf6e017f015", + "0x3519235ef7895f472b1e3bd958b4eaf1467a7b8816bf20ba0800d9424bd3e413", + "0x0fa939f5f171b4bd043580cdd74f072a06d4038293aeb1d89866e4040d551188", + "0x8c9b3754ee18ebf5e3239a5eab49a9f83b03163ea2e8ee36e5b3d5cc24ed93ce", + "0x2f0d9bd84e845e36ae6b1cb8e12f54cd37cd1b6c796c3289730759e68fc12be0", "0x95fc4bbd2d7307a02e7888c4e35d57041a5984de5ef1b4b41e39c2e054d9ea16", "0x5ceee2dcda98a07bfc266a24aae9fb511022bf59230256f234a566233078031f", "0xbc3f0809c469433018c571b4c630e9142b3d6af106e1e3b0eb011489d2e47ea4", @@ -447,58 +488,64 @@ "0x8db969a1df60fb941f1575f05cc9f162408581c7afe7d5912c0f2e0b0ce713d9", "0x12c60b9d237cc8e050af9a38df3509b85b6ae787ab97e7d613af799e0b7ad8ba", "0x2677651b282f01c02a10a019b48e593e1bf9ccdb693d38ed1d79187d928585ca", - "0xa0711e77bdce8bd47b419798fe5fa8fe4ba887a4256fa17de30000762d4cbe99", - "0x48dd801e352eb4fc5e1c98dbeee9e3a20b03931ebca460723b6e02da0f290ee3", - "0x3dd78149c5b85022c6d4578af88c22ebc39d249b7c2b66123d1cd0e0001a1154", - "0x38804da17223906f2b1250e4cf2fbe210980be8563b313e02ec2fcd36e7e1eed", - "0xb634839f4781d6bf24bf215272ef9cdb4df69db53d32c8768aafba6ea5b259a5", - "0xd937d3be58a5ee05273f640633d5e05b3b696958e4fe1e8c325609dccfa6c249", - "0x3ccb7a02da80d0ae4431b3c4933a5db82d9d2b9fbcc89fce7f7cae338ea9b048", - "0x1c0792e3d5d8301b81d2012959ee96e6784563df4eb327856e9be1bd96064c19", - "0xfa5beec5b308c8eb7c70d06384b0ebaa094156863aaf99861c14352f8a73598d", - "0x93fbc42778ffd41e868fb840e78b3e75f749e104fa1f7c06e7b6cde8751e2994", - "0xa06ac3847f85ea6d0c67b0664123ffcff490033269ab1fc30682abfea0e5b94b", - "0x25090f63425b4c96bfcf84691370cfd7b22cbea1af30563a7ff0844fc4167723", - "0x0c18e5e5ce5d6a421bb13130538296dffc55580b4a5ee595a4893d8355b42a14", - "0xc4ccf1c2418c71cf57e946cb88cae603418fa9bb7d9356512ec8cd8255c3c376", - "0xdd147115d036340150436e5854dfb85e5b262fa1f91dd23782145d725c7c5244", + "0x29607907a175127b0f5081fab2d190f99d3101c53aabd36ee7c104e6c30f88cd", + "0x17db8ce2c3c299b5fd43881306a0f72d74fd66a917331852b8169180c2761098", + "0x19dfacd005a3aca6c69186b35933314663face614510f748eeae9692c4539e5d", + "0xdad044548226d931b0d941f9ba6c96ed91d476e51aeccf2cdf5064e701b74fa0", + "0x11cdb3bacb648e1555fea093e4b7e2a2b57214e5fcd1405fab79eab774b71d3b", + "0xddf1d7754c1e10fdbd6c084aa1bc221bdc2c2691e6d90d691d3af294f823e840", + "0x375663ee26a0de2b404ce552a7a2ba4b693b8e9f8dc5a2009afc6a8cf08397d0", + "0x9a6239688ea9224276a3752de1d34492a4de2a55517f309a2c0fa0ea55774828", + "0x9b4e81380a75233e36df8066cf044610b64853a245a6fc019e482ca97d0e9db8", + "0x97c7787c613ed92de118f3014985ebcded3a07995bb68cd4f4b553a815738716", + "0x02262900f998debf819bb465d9c79d4fb124dafcbda85901a109d46625a568c3", + "0x36175cad721be2df0b9315d20e60aadd6cbc2ecfe206863900f2ade5174ab780", + "0xf338cb8e5d68df17f9b0cf524fac6b2267d9375f19895d4d199d236fa32e340a", + "0x5652d0cf34cd2309fb7ec369d11678cf1e59c53495658b31f7c4daf32e53243d", + "0x06431970f1f3a90e66701570ff0d48f473121d60ea50c3e81fb1761941e7f5ca", + "0x9a33019bef8c2a463fbdd931c4faf7c6287fb1dffd68ecf6937b598c5a67a4a2", "0xd7bb10d0ea6a67dcb9a7ec32ab2e75e100fcbeed2b7416baa39978ef4738c021", "0xe8af41037867e7bcc44e5447f5d1a065b0897b38286a13e24fb218217b9ffeba", "0x9f5ec325bd97bf1009b72689b909865c2c462f60811460ca165f2ea24bc2d447", - "0x8b6df396844c2bf9d81e8c5d2b4d763d564d4668cfdb15a4f295ba067afe6505", + "0x96ce7f7a2b0fe13d2fd908aa1714129ae69ba470e2746c5dc4f25624d525d632", + "0xc47a9bba2c10a9f6d25b7a9aeed97af19c17da32ab8704e8efc6c528e903ee55", "0x200df5f1a4ac8c28c0d7b610c4a7fb436a5528064284deca1e0ac812c7d7a9ff", "0x599b3c29cf54f08323e0c538cd1424456bff5feee6c76a84e83ef5394de89a31", "0x8ad23d7f318402f40032075f6b5cc9008c9a08e0732e7754e60c66396018fd9e", "0x7a0a2b1747905d6b983649f6264d5fdff3a38c8b19af0caf18e7915675c7dbd1", "0x83cda1c530c0ab80a312fcb4e06b6a393162a8701cfda962e1f89fd61d8d13f7", "0xacd32a8e6d08ee6112249deb95e8d1e96eb9e8c5b93eada678a9dc411aa9639a", - "0x1931d89f3ce3b7190b990d1de5554f9d3f27ff1abc5038c9f08e2776381a6df8", + "0xdcf58334c56a501fe005f3b5102a092c042bc9f40e6d6e808224c35e00e8a895", + "0xa11371712b4b92c48cc2abda0a18637fe42c23589d69f361cc14ccb0ab16d919", "0x2a9f1a7820f22c1e9d5d31f79eb83880503e2ee101cafdfb92eba06ed4fd239f", "0x08cf988e3c47ded4d27037ebc3b2b0e083fb7216bf3540c730e8e7b11e5fb006", - "0x03117540ed7c354266739226d3bf3462d304c35c65348d96890344a0aaae227d", - "0x2b8fdc2458efbd3756f70389d05c7a6b52563dc25c418c34ee64567e4578d6b7", - "0x421c0e02378e609ef197a631e753768326f34dc6978748468cff10183e14cee6", - "0x330c4a46f218e9c9ba7b090975d3b0cff6af1fefd4dac03370c82c937dbad876", - "0xdcaf92153874ca41d2b2bc64f93f5e6285c4d600b2f9895f6100eee4d868165b", - "0xbbfaba78f501cfef8602cbc5086dcd056e34080817acbe1e0fb0667035de4783", - "0x41409dcf77b35619060216051a701013ac7a884337367b662988be8607da3dc0", - "0xa3bad310130904fd19965d81333851c13f820819b24f21ce0c5869410991bb2f", - "0xe75c81adc498ddc65b465e636c8fd85b2f082304429cc91b195107ea34db76be", - "0x0a00ba6c6b066b45ae2c81fb1a272a08002dfec1dabc418e9f63c4964b549954", - "0x59fe7fa025f0d425fecf4a20a7276c687e793525faea211060da6550319f75d5", - "0xf57b9c966e227ba950fcace96c645c7842adf267c412336676e6fc26411d71c3", - "0xb3f506f4d57ae4214e0f86618eeb123cf2d25fd97868b34fd3c66e16e44e8884", + "0x357b894f4c1771b043f7e0b96315e0aa289e6c4b77d3f1b297715866a2b1879a", + "0xa0b6d84acdfa9a87fbf3ea012b2c6fdf07bebb0f55bfce8026d381e899988406", + "0x75005979f62b9b04a595e3f65f5cfaa771cebce82e9c2665eac4ec36198d0084", + "0x3ca3e179ef4d6ce4b2def3ad4a87e5820d1227f782783f0663887420a63cb53c", + "0xf21f45ccaefc97e83ab9613c2a2547eb6dd3cb5b680d3a4966603a50306ecbbd", + "0xd7c2086e59a6f355a30c134cbb1b1eb046451f4b3f32e2e5658d853e03fca6a2", + "0x4f4feaa9c72cd085baeb229922b264b2cb440f3ff7171d489b3b03ea5f9e5786", + "0xeeda73a7cf307e9a98fc6c18eda1d845ba41a514e1d9b4771caa8235a4557ac9", + "0x397be959b1b0a643468572d621419a274d7b62d02c27e6e7de141aa9ab7919dd", + "0xdee751bd171b79a2f62f40732ea26a2fa37ad518e9759541832a9b18a0200acd", + "0x3f7b7c4220afd0d2cd760f7242d43c04dfca9115c53b530f2c9d5bffebd9ea6d", + "0x9be335b589037e925100e73798f9c58b75ba91f64d365e89680a4529059de148", + "0x15800f7ba5904c611b5b84dfffee7709aa85754c4decb8bccfdfcf4c69f800fb", + "0xbb69932f11d9f224fbbccf959ef48b76bb0c77886a77d2d2ee759ede01c7562d", "0xd4c599c88c29538f6ff52b78122f60567c91a70d51108cba74def2e2c7199dd7", - "0x0e10f203b9fe96ec09bc21a70eebd3aecf6f84f10e4724823626d61e17f960b6", - "0x2721891c949e138a49ad41c71f7dcc20d0699117da1cef28cfe8586b5408d107", - "0x07b6ae105e4279bccfdd7e0b686fdddefa355587d2b3afad99872ef27d4f8241", + "0xd73890a643c4184e2cacfb3538ec1208b23969435e02f890f98d9eca2acabb6a", + "0xbbd58bbbfafa1105e316f2864e3345e16011ec6ead66ff77a10e6239847fdcea", + "0xe99a997a8bd1029dfcacc31cd68539ecf7c61004abcef39ae2cbc141b6012405", + "0xa7022ff1b1c647a67644fc8e19da6fc6cd5d1c089cdabeda5e77cce819760cc9", "0x5615f45d7ed2f4facf5f811af5eb96bd981421089e2158ccc243d7bf0763c816", "0x260c762228c55fa7b840afa44cb948add374a5dfe2b528874a85575c1c591d7e", "0xf86666b6e5cc2cd63de57049fa8917cd3a1ba928acbc28e735a99f5c99cc67ce", - "0x30508524380ad18be193c5bed0515848bb852feeb4a72c60b94e9e2fd1bf123b", - "0xa52afe4ecf9418694bc7b08facbbe8495797e11ffeeffb00d17f26656bc7c921", - "0x0542985e8edd9f4d4b1934bb493cfc04183975077b549613ac24868caa206018", - "0xd9e903511a463bbe8b0e0bbe86489198f6dc435fdca96c9e6039bf145f1952fc", + "0x9e78cc696e6b1f2c009532af62cd942744960b9180ed379fd7988fbc17fdb444", + "0x220bb82bcfc80d8c6d0c2ab361342406a5ccc0f82f8dd9446e64fa277ea0bb11", + "0x5c075319da4382231f5e6923f5239d988002d0eb54ead24c91eca5aed6dc81a9", + "0xc80b4384a20097023540fdc43affec73c2bbe68b549c8e315dc60873e094f8e9", + "0x7e2904497da0f1d8dea7e0152137b20b27b8f442ec40d0f233b9902d33cff5a6", "0xaf47283d9a127fea1616a3a76e56102c9697daf0d74e2ce51ed784a6f41f6c2f", "0xf60da8281d5154c5123621bcaa348110406aacb6c804be4af86b60b333d77df3", "0xd57d86438039182617924ee1dde54f4eda6e4867c7696dc2f929738bbd840e4c", @@ -513,65 +560,71 @@ "0x17b3e993df54dda55d52dd23a0d2873693a049e90e450ff17dbc13c37d216586", "0xcb2d3c94ca920089e3d41c77f6c213c837b64ac6f5a46ce4b2bba687eeaf4381", "0x38f1f85cf4f99c489ea2fe3efc343a6411b4a4dc1671a20da73c6101953df8bc", - "0x0b9ed7a32278b02d773f890b6e5c37c588a9973d89c15212b64502a0fe763e56", + "0x199af47d3e2aa878553aa7a73c1f2231a57d906380f69622547cd6d81eabc762", + "0x1bb823ed8061a4c84feefa0803d9d4a2b468e97df0a6a7330cf7095b140067bd", "0xd4d5b432cafcce51da4ca83915040ddaeeb8edb1cf54f38fce530f0fea2cc94f", "0xbe86f59f903912e5c246e0c2b6eaa23c617494f2482a5b4f5ca498c18104f2cd", "0x5ffa6ffbe0be957c8560280e9294d56c694ee5b3904749f21febf55d02136974", "0xd873bdb1d1e66c58d52fd1e937cb77f5f492a733933f85f3a8bcc236d8000659", "0x7dbf35ae38236bdd10e415fda555eea6d9ceab3c77fa3ce48ebc06600a9bb6fc", - "0x79d923bdfc69a236058c890758d73fab9957cc649d2b4627278feca2965db671", + "0x29003513fa73a43887244793aabc711e191fc71e684c9591ae888387f39870d5", + "0x2c79c2cde3a704c0dd8ae703c2d1de985bb2f24517a033783e8f677d98ab37be", "0x8da5864ed0f50c5abf85cef78008b7be42858eb748e81dd1c7d4aa2085fd897e", "0xa6014ffa39c01c74454066ab6c902aeb5bdfabad005d76579c9163f709de246a", - "0x2f5b59237b4f8b323b11d0307c1923871aaac0ae93767044630c07376cee0338", - "0xa6d450f6fa8399bb4e0ca41754078924fbfb159b7e69aa8af528d4f3557e7d44", - "0xd6375b97a76a847878f2f1e9a098fb98a5c16f87f4d1b90591583370c72ada70", - "0x8acceb790dfc4c94bd5992ea51cb65283344fc7514c1c4ecf084c66904b2e0fc", - "0x117832eb9f145f4a99a4d975261805fb22c682e09a0b08416f20fcb361824677", - "0x1732f4312bdf005f4acd5c752399191746bcedf79cc9e229d95aaa382f6984cf", - "0x92b6cc3598d08127f2897c907fa9c1cc9ba5aef8efdacb2d39869b81c9120b21", - "0x2622608dd3aba2d6cc97b1a2b54b0211842df27024cf2354b0835ab3c33a9b22", + "0x894bf09562f5b4e1689f1ad32298af841e2b844f22a9f0968ff2d61e8333e1f9", + "0xd5ca61aba4c9898d6ec25f6346939a37842311e77646ead8c7b8fb3a45682553", + "0x153ef25dda81bcea816678dc37910612a239890bbcebdf30e4bf25b8c472e0dc", + "0x430bf3273eb982e2d21c375f83b68e3fbab156de27b4f38a72e119e0ab4e3433", + "0x9d56b391a255eb7e28c9defcfbc6667fcff893ee8f70bf208eef75ef1d82da54", + "0x492da100c91b6d5fd629ac733f24e7a1f0f44aa3549d34b6b029bfbc0bc8be83", + "0x45a96d12e00080247a768f1b597afab196b014c63e78cae3e9d519a0b294a306", + "0x195b8be2de8d7b71ad2bfa8246ac998f76203f6ae8ee54a175affeb301bb7280", + "0x7cb0a3b65b2a711d4930d85c8cdf528955ce56b960e4cd226c6ecf9763469ffa", + "0x47a10b3b554cb7f15c6cb9a7c45ffd304cb94fa833792ba9d91f8a51824e049d", "0x2fa01020500e219967833eeb3cfc04224f5fd65345e79a01e5742f541e5c7753", "0x085958e176a43ef6342829652ac064e76104a095122064baa3cb30e0f169f18c", "0x810b359848ba55a77f74e738396723e61e99498a1e0bf69f6494311ccb24e5ae", "0xa5de94f0600fd96bb97d3f2e27d01f3ae89b1f1f89cd00926a3518db7f4c2074", - "0xb6111077f85ff7b6765d33569874371f8208e002b269fee2f8a3e271bd7303f6", - "0xe9b809f07d806a5e59553ea0d76f6e55a22ec97c6011de85b903e38425526980", - "0x2728081f35e823038b341dba99fbc4abd684d5548aed5fff0f8db032a55a3236", - "0xe3116ce111501101bd6d9f03b879a7373e140d74f9e245884f7693cdb4d67d64", - "0xf542f6e7c9c1b6b49cabd2b1c192a96f680d88c434d8fd73caf3a8eaf68a6170", - "0x261b37b9bc73bea3963951a670e2e181040db3c00ad1b36dd5d8d391f23aaefd", + "0xdd9c405257b2e5bb96ad93797b44f79e1dc59badda798169284d69740119d6ca", + "0xe3b469731eacd23572c66b5e65b70ab005a3500b3a141cc931189096644bf805", + "0x482a485b9cafd061282e7b48b820ba2e1a2d8b8a58a3ad709338c4c030793dfc", + "0x23cf2a056e6e5a558ded825b405e31bcf94c8315d5b2e9e5ab5bddc24d44e241", + "0xe6baa0fea03bbc9bbe65be4014d8f1248af8173a7e3a15d9ebbac1eb20fddf13", + "0x94396dc82c2b48aa96867320d12d95d72138273ea654b8ebe256416856e40598", + "0x1ff2b3213e17a1c719afebfdebd0d1e3da3e232603f2f156ed9a96f179c38c0a", "0x7d4f288580c1f335df3938388d16dab5b8133c63cd3ab3f6b4c502b29ba14925", - "0xeb6ad2ebf141706b0b53a5ec2e19b0c452f5e5a8264b3aae69e52a98fc6e1d6a", - "0x90cb9b38dbabbce611e6a6a79f527a67cb61580d2524d515652a2d82bbbd562e", - "0xc2c951fe480b89f0038fa2e3332e82638d5052c944ed8cfe07167095409c86f5", - "0xac08e1edca44a1141e670684598177d1de2d40128c2c8a147fe051f6464e7572", - "0x722ebe919b768793809b9146a7247826733f4ca66ae67c31495e200e300d63b7", - "0x17b1687cc00e59bd88ba5a5085ec8468fe9e74c9fc86f6854916d667c8bb51b2", - "0x3bf60f113b4657c4d4e1a20f0b070efc915ea10f9d11a3c4a8866a0e60b90d59", - "0x90c878da0058e1202013bae7ca75577cbab1c501e6ad48c8d1d689c98985a5b7", - "0xeed736c9ded23b4aee4a7865bbbf6c2eadcef2af01b00c2097dcd39da7f32f4f", - "0x4e8433d0e00ecc76755db81499d357872a9da7418b5abaa89e292bab3088092b", - "0x1886e06c48d6375710eaced24a65c77f08ff2a82be6df1009e5a3a5bfa66c6e9", - "0x5dfbc2dbfdc3a179ae328208f4abc354955b0e72ae3ebeb1d65bcce62874e61c", - "0x129ae2b18a66629f5217798976ec5c32a5f34c3ff5822080f791f626aa970eb8", - "0xb044482860afd18548158611c8b8ecb8f66b7cc4b6c23a7c7a78610a03ccae03", - "0xb951074e1b3ad92620b92d502db67c5e0aeb4dc6c3f0097a43de3646afd7ca28", - "0xe3e315b3ce8c819fb4838a5a2cd7893bcc31bb44bb74d65c73e7291e3b682b44", - "0x3c979f03880f300303eae60d1ee71abdf8b1c4529614bab756bb7199c333fe56", - "0x18aba3971d53419d292d767c63515bbd1bf2536b10fab4649eea091b984b9815", - "0xb674de89365b0ddb619c3798003962ef4936c0406986fa3b506f20b15f8220e7", - "0x26b4153789b12b65d57cfee0186867406630d3e1ce6ea63bcdfc7dad68436d6b", - "0x61b7cdcdf1cf599028e3a78afd8d2c737900f1de9ee4dfcfde44774e11ed505b", + "0x9fbb0b2feddee9e6956f4bc9fe95dcf796f0cb53b52f4751f9845a76df290ca9", + "0x0a4c6a7aaf229355337828bb76a24bca7087d9431e618efd158cd267b647cd18", + "0xb4e13462e384180141b06782a05ab42d907c27260dfe4b24cef9a99d38f6578d", + "0xec796bfa4960a2e4cb7cfefa24662e79e76098a069eef17d71f7785959afb2f8", + "0x8c839c758ee78f41a2439d2fd99c55c1e40346ddccbac0fba00a334f3cf62a23", + "0xdb15b921d3af195cbbce05cbd9f5a09ca373252b911a4a8ff1b2211e624563de", + "0x79e46b9f00dba7af01d11ec4e44c749dd2d40377cc9b849f228a5f54182c5a61", + "0x60042bb2055bce73a9ed0c34591c83524ad89df02bf16f09f50707191e547160", + "0xe8b121c788a32393d1465b7eb5775de7cf53e076affbdbf010813974cca661a2", + "0xa69177ba3b5c9efd4e7c784aec490c6e095e254c54fe1e61425bdcef8c050b1c", + "0x1b520360a842c2442e9da7489dd2e31104baf9912b662c2e9cae5a72a1326939", + "0x25578191a2846c6161a4c4b09dac3c52d0c7428790328f4a007f6a8de4cd9adb", + "0xb0e320627548bc038676db9bec7aa1e46e15985c8244e211613a5e0fe9403b35", + "0xee59c76bdb80296594c355dca0a1fbdd80bc7eea134735cff411809db39b84ed", + "0x296585af396302a0de774eb6fdf6388d13e573c205b81135c47571de6337eff5", + "0x34547fdc267df4a8ce3d28e639a8d9bc5e02cc90eef57f53083e7a1ed1340392", + "0xffe209ee31f7906d47855738c9afafd2ec999c71f0e3bd6c946a13dc326422b8", + "0x31124494262bda2f604a24cf90686caad9b2c0b14cdf09e011d0b0ecb7910dc7", + "0x0b61d9dd0c2ba369dd913cbadbbe44d6fbf609b791275eb41d015de3336acf5f", + "0x821e4fd88263e209af03f3608bf9014c882502b99ad31cdd9dbfc1e5a587e0b3", + "0x7e3df0850d184c833cdcf14aa684e082bafdf874e3f1847bf446130244abad8d", + "0xdabbd985412ee38802ed10ac3ff2d9bbe668bf0e9dc2fc9b81fb28907489b34e", "0x60ed516a6ba96b4275f2dfbf1bdf6ab2f6b0b36c6ee99d4058bd44761e7146e3", - "0x7a7bb1199ea05f387bf8015aec4d3313e3b3fe800afdef336f6956a853cb63be", - "0x4cdf555c4d0f1c0a4f018552c9a5ccde9c3fbfbea71843639cf72e317162db37", - "0x95687fe5001080555fab489473a37db6b4ffe3f0b65f359a7840506e08bab4b6", - "0x2787d148aaa1d5fb6f9c14bca45e65d3f7a2ec0a967cd2305081b356508fff37", - "0x8585d40371d21cf21e8080e3f88d473bad8f3b9489b01ac72bc497d10b49aacd", - "0xb84410520fdca766b502928911efb0cb6aeae3017f90c43a34dea13a13f7f8c5", - "0x701d0d37ff6a3b722d20ce4830db0857eac37e9ab61c7d141d4f3f60c0a5c855", - "0x857ef53d0e5af71ffbec183e693466776a9f4b17e8b1142df727f246cb3ba97a", - "0xe6e2163c2bb8cf29f86be3f622c1279d6ccb60d3992ae72bb7b594d93e851fb7", + "0x4f4e60a037496953d6d64cba095720811a84bb98bca059a89f6760a43d22a41c", + "0xd9de0e61693491e4a185ead03b7ba65bb42618f637f762c079e1c6f25cbba1a9", + "0xe5dd6543fec7a91dae1ff4db6b293197df3a2917c037d319a86ce9896671ac4e", + "0xc2c31d3a012ab0906057be7a934562e692c0de17b8c53ea181f5c1c873a3c633", + "0x5a5e059c2db42ae792a2c35f0841ea1404e935713dd42e1332b22e2d9e5ee7ac", + "0x4f91c9347834091ee088e59d133b4bffeda1502d21b702cdddcf12d2771fea27", + "0x7865ebf7390b3a4261a0928728dee7e31e424c10fbe7268e3ba47e36c95cceb2", + "0x835b350ce13d1b93e60d7a536b0b863103028ae23f92e0ed930cf08c4ac8db24", + "0xe738f84c52acbe62b2d84e3a87ea1c397034bbd5b6fd54d8806b22a490d6bdcc", "0xf4765dd67e809663b9e92c257181eaa821f3352e3362807709d9c92bc13cd59e", "0x9a778f557803741024c6617bc8f9a36a0c05624185f77315861493a200c84e03", "0x9041ba9b4a97e3956d80f85972155202f805784298543749b22286a3a76ed8b3", @@ -579,6 +632,7 @@ "0x9c34e99e66c60b766e4caf06bff24f69c8c62386186e6a20f587704a242453f5", "0x87296150e2d912e2773523787f23db053592a41f74e720711999a5725b65c3e6", "0x9d74952bbc17f44d7ea89f5b74b013979d4ba82e24cb15868261ef48d7eaa016", + "0x8f797a044eb602dc251a28ca4e2a8cb1f5dc35ef6ebac808d59ba7cb12e39cc5", "0xc138ea2535601ac3c77678136e47c6314520a5b5878b68fb5823eca918ecedaa", "0x6863b2218568bdd9cc2091fb2d037b168166db215c2d20ecfda39734eb6f220c", "0x3f29cfafa9b782692a3fe401a0c1fa3299493916569c933e53dc89f3b7c5a381", @@ -587,28 +641,31 @@ "0x9e61852af4fa45760db9695c4e3de84e380b7d7340354194c00378bcf01cec46", "0xe439a9c05bd60f39697fe5fa1705bd191251054b6cbd9954ec81256969e558ed", "0xb4934e335aec9c56c74b5204fcbbf42515657872869d31889809579f8c324f55", - "0xc371345b77dd272ca96a59931e4e6b3ff496eb40fa01611dcd5f5767d808c57b", - "0x480188b6eb622f11ccef7df69ada0b400e384295a85afb1d1225dbda65e4b515", - "0x63623a7ab8f2c658317e7a8ec2f51a67ec6be4b0e1b4d1fba7b5b9b4da023aaa", + "0xc1dcff1d84c0e9dc9d6369325271378090eaaa082cecbdb94bd9d60be9b4e96c", + "0xf5f8c79b08f98ce6acf7718bce2b7f00ea5a5041da77c38cc8b7af2c891d3c9e", + "0xab11ae66e9ba5d6ecd11789628155d6d429516bb30071e277e083cf0edbf3477", + "0x2f008ef353ebab96a86645c2b6620bf023e5b377b71225cfb12d5f764e77a49d", "0xcb704e97692ac525c4ea9a170c59390edb82519b69b92aeb17e704ccff3f1fdb", "0x1027b2f8450fffcfcf7feffe7c593b59b77aee64cb926fc099c1d848793916fd", - "0x2e42a7577af57cd39b1baf9c8df6dcb6cd3c2a18eaeeb91f124da009d536851b", - "0xfe2ab22f912357a65adde680e1472933f01f7bd81b80f7c714d6d2094cba54cd", - "0x1c231b2072c59ff553a6b81e17543839e4179a7e6db45af299e9b86dc1b7ffcd", - "0x70265bdf8d36862ac21e92ef9a4906b7c01213afbbec42ccabbd94f586c9fccf", - "0xfd4d8b1c372b92c05c20433d12a067de4750072685943497a0f48da83330b203", - "0x64519328e2ed9dfdc694cbc3021ff4ccd3bf90e5ece9aa508f171a9e3e212f0e", - "0xcc0ad7b063e7a44346d7786c3193fb1720e9b8dc4905fb8589fefd7e89677ce3", - "0x0fe760bc22d8c1cc83b7e7331ec2e1c03ea4e09b3163f9d3344d0ec933aa4aa2", - "0xd0b06e66444f94b87628b1c2d1584a45197eb141b3ecef6735db511e49866f6e", - "0xff8807e03d5bac0959e51e5d64fdb1652d2588c610c50080bd32f153c55e16cc", - "0x242f6fa7f8f9d3057f9b6191ed62c5e51ebc92bef5ba9a63a3e28e063d5f0e0c", - "0x7d3257b42eb026a58d8e162a384db20c4da6492f10889c273919e7f5f81d0ff3", - "0x06f95ed8eb77c0d50590d05f9125563715688a32c626d21705b41382d8997b39", - "0xf95fe2d9446e4bb0accdd7e188b3b872d76bbf59fa53aa1b2355bc92c675687b", - "0x08c3538d9b6fcc5a9400b65a847ab87d9b65b71764be849c7d06f3a9751b9ca3", + "0x027a8b94ef416bb5b287a943462781bf57a0e43ef0d334c36c8f4fbf7779e356", + "0xfbb0e6107dceea02dac3a84cda1eba19e877efcc79f190a80e611908acdc29ec", + "0x276d1d481f85c35e58d347be3f8d1989f8ddb4287e7f3b2f64b20d1cb5b8b46a", + "0x2afdb94461ef5a586c62ad1b883c1c6b6217eb5a2047707cc45c5de00f2e4db3", + "0x33d0c585267fe45c3dd4163febab634edd3491b84184587ee8fddef998e1dbf2", + "0x74435ff3b32f46c67f04d11593d00bfd7a50c657db93dea4116a25a05c42ca57", + "0xc432d80ddd5b5904af8d58c4c5bc9af6b3f09640cd34688db3211a1aad79bd1f", + "0x81b0281b041d2f6d983140c89272386cf9be453d1c89f52a370b6c5a62de16da", + "0x00790b30e6f510d67408484160987f2856185d3c3e4e5c0329757ebb6bba0536", + "0xa2dd78f5deba216178f4a2b17320c1cc40898eef320c8caa32e8190b191bdede", + "0x3311086d0f806729175e0aa4240972f9cd970b4bbc82275afce06003a19f09fd", + "0xd11199b60f1e472fab2a8edd3662e1c1594b97d0bf7c1bf5cec3e2a6993ad9a3", + "0xa4ecbed738efdece0df9923307d542758e9822854d5310be41f4c9f99c49b614", + "0x4ec54eeb08158aac8e4da670f5806b05f54ec6f3cd9db0838295fc2d2e7eced7", + "0x5dbdf2d75a95804be58f11c5b0e122b8f88e8bab7828a98bde12f836f0ed1de7", + "0x6f8be99f33372e32dcbdc71ca30be5abfc82fe9ee64aecd63c6f5c5e5ef83e95", "0x4cd4c4b5e677d2875cb0ab712a50058db4907ec3f8f5d9d9d87bfd5b5dbeee98", "0xfdac44d92388bd86df658ce09a315742ad354b3f74ffc4a532be1df584447994", + "0xfd057a22b0110639c2fd3a28a506d76f7c5b6df02a0d2c75f25254aefb59762f", "0xfcdb4d483f016f3e28611cf732f8cf1d0e4d7e48fc3920c1ee1f78f3a88773cc", "0xfc99a99b282b8b44413533c045b38de8bb208cbd8f0ebd6d4c13c71138f1ea66", "0xfb744e03a2f4f89747e270f3ff0fac9f48da72e1d80c878ab7af2a47a43ce64d", @@ -622,6 +679,7 @@ "0xf7dc096c655e10072456bbd495188ce2ae67ae7754be85132279623bd0b759f9", "0xf75c4501fdfe4019be55646da151cd019fa474d29d72cfc26836e1283dfba918", "0xf73dc81ecd1e4eb792bd5fd3199c7cfaa64cbe2a83554195ebda99e65e3067e1", + "0xf6d78f96bef5e0550ec544b20e93b775a464b3b8be3070bce4af4941a82e31a6", "0xf58ba443a1ad5080656e0cd1b302843e72a6366e399a5e637143e7d69ecda19a", "0xf520ebb78f7279904c22ce9a99c99969ca23bd3fd16092c48fdeea2d58abaef1", "0xf4a1d837a03db307afcaaba8968fc4695d32611004115cb1effd76e08a7f5f50", @@ -641,6 +699,7 @@ "0xefae64f750c34405057e4a332026d1d714080aa8f22960b23fd0e27d53a981c9", "0xef1956449fd4dc2a2d1146d961456ef97506a136d6c633114b9d6bafb5737258", "0xef13557b672b81b9859141cfcc503c2c699087c39e7be07e9ca16d51993c84b5", + "0xef0527b818a5bac3a9b4ba9349bb0d0e6a613e25a1101a62fc14c6f9d44be77f", "0xeee91cbd1f902474839e93e64092d134766013658d2e48fad4032548d7c4a59e", "0xed95a2ba45dbf9ca0b006efa5c0201a6124cab85ba5233210219c812b5ba25e6", "0xec366a77764ae13e2c4261d9d253b838a5ff506799b9a31653de7cc53e800499", @@ -653,10 +712,12 @@ "0xe8f17156b926390edc89dc451b011f6fad50173420e0cabdcb4faf34b17bdd20", "0xe8915abd8b500390aa7d2eb29a6878e26a675a5ddcb634da7ac331ecf7c5ae8c", "0xe75866b57558e18faddd73a6fbeb32b29b03523889182dd95554e740006fe4f6", + "0xe7489ae1567f246f6888ed15c93bf950199d2ef44709b231adc943dcdbcd9c0e", "0xe740462c910fd8293d971a5e5ad5a5d0fc096ee9e0811ad61dc8e388f7733b61", "0xe71cf551edb2002cf553c422170f334f332c1f09cfdfe29d00c8dece6530928c", "0xe65756d687d74583b844ae882b3ec01fda27845ef4f977a9198e3bb8658ef62d", "0xe5ef3fdfc3a73a343dbe5bea6e8b37d5138abc88bb34d8d573ddba8624c20b2d", + "0xe5b658c31aa5880cb1427ababa781ec8290a0d8b46bbcde630f4ec5b27b63fe8", "0xe5961053fd6c151816ee128b75a19bc36835c20bad09adb07481b8fefab673aa", "0xe585dae669a96960ba14842affd24f7f2091748247849fbfe27b3449cead372f", "0xe52d60a0dd9163c810b9eec7a6002c9707b66be93443870f5f81a9656660b508", @@ -664,6 +725,7 @@ "0xe4b175787880220045dacfbd48a337605c4ac8bc303e55cd561aa91a22848aef", "0xe4aa87f1a6e6397ec8e9b0ebb08349ead5a625e6e14b4b83ffafbfdec7cc9711", "0xe492f5e4975c8419e1e6afc814d0576f941c704fa15c6af1f0fba366eb0df36b", + "0xe491d8313904e4c1437b2f8384a164fe848da950f2157006afa7eb91c70dacdd", "0xe45c128d391161d80ce762e995a4add4cbf18273fa4095553736c7fdaa668a62", "0xe3d9ac6dec53915d773dc44f434405192a45d0bd65ddd7e288eca3e35f87f0a6", "0xe384830db85f4ffcf60d0ef346f61da09e4d39a2df3c1d33513b2a3006fa7b37", @@ -681,10 +743,12 @@ "0xdf37481111069faa8fecfad2386c2a0fb21ea20be3d09ac13f6abee37991ef0f", "0xdef296fedb34f6d2e1b0135a0ae8f611f554a8745406323cfc95ccf0430ac4c1", "0xdeb74938ddce950735daa50023bc93c4516ed51fdbecc59c7c5963f0c91a9cdd", + "0xde85a1ef0e600b6aa4ee4af6062e49ee805dd15ec7ba510a3af774e7f460a6ca", "0xde458522ac8d07a878e7aab8e562ffc654ec76635457ad2637796fec7019c6b3", "0xde302e58899b8068d509a92c47f6b782240e3703d7c60b98a0d720fac8a84721", "0xddfe683f3b034d67c650e8e27942f484c65d868d1c839fb57ad6d402d5c620ea", "0xdcc4ced704377a3d3f97e872bf655a2b675cd0741f3c44d618adb545a418cfc6", + "0xdcab0e893dc96690e65b3ed38e7e2ba6d527bd56f826a25ca16e607ece3b54e2", "0xdca99123a9710c1c7e0eccd3c51e58ab0aef5a627ac223a1f0cff2b5bbf8fad1", "0xdc487c68ce156e6de3cb674cccdf0b418e4f1a28b42264a2ec5d3fcefe45d09a", "0xdc11709cf0424ff1e41e8bf6d9978cc60fede50e8f9b2910a01076ff7d0d2a9e", @@ -695,10 +759,13 @@ "0xdaf6771d3cc3c18d150214a69e19a9dfffcabfbdedd417435edaf4839a3b707d", "0xda93a2867abba7c0479629637adc7ba3e7e8a9b38a69173d6d4593d22a325c17", "0xda8204e447cd3d523eabf553d8660de2d9fb7601f5212c3d2db6520798b574b4", + "0xda0f534cca5da252380c34d7dde62bdb377097dd300f3e8fb7b7a9ff84d8bdc5", "0xd9ff7767b45843509ce8b5993ae670baca3ea1cc11ca1794767cf977f6c4beb9", "0xd8d557f44f2192f512dccba2a3830af98c1290ae8563f6226685092e3af03a81", + "0xd867b815066f4f92ec91bd9e42d297e198c696ed02062dd781da3465b91c9b7f", "0xd83247bf0f068a692198d42ab5453f0ac54d8b5e8eda718bbb42602898d3fa28", "0xd82e204aa031dae8ed9f3d290681f1e144fb31736319ae6ab2ab3743103142ce", + "0xd827250fd70e40d47c6f4c2101302d708131dbd0a3eb55d59a5e7cd145a67b22", "0xd7be708815f37d69ee680da9b313eb77cf7d137de041b5e44d181e4520f866b8", "0xd6f208a2191a08f6f35dd92c56079bd7007e9fcba6e26b3d7f1eecf523e98cb4", "0xd68a91b5e1424f8713e33e84b8c0219769dd4c247348f9659f345d2a61492930", @@ -712,12 +779,14 @@ "0xd4cceda7641f4debc22550312a257451a74c28e748ee77a4b9e390524f22817b", "0xd41c8325910fd8162c05cfdea91051f737d834177a11961225450ea9e53190a0", "0xd39506bddb54eb6b1352605d33d2a1076420d32e14a3a8737d55a134a6bc4c64", + "0xd2bbac5f9412f99d5e64678a896724edbc01d7722b1c95842506957294364088", "0xd25501b0234cfa281cdf3bf4e43f76dc58cc5d880eb7c16d388b393f6e66b1c7", "0xd23a429b8a5f736178a8b917f67a53a59ea4b7436d15792888db8d7435e22d74", "0xd1ae9cda64a7830f9b8137ab9baa0c7a9fd5e3f2f7b4294cc49ba4638088aec3", "0xd112dd86ec45f4183e73b776bc1cbda81c6d0ad52dde395e8ea26973003a5c2d", "0xd06e77dfb05f5b0915fbb5e73b7ce10cf4c504467e512601a397c349c637cc36", "0xd02e4cfe8ab10f7e7c956807f541b3563008e0ea9bbb3fa5cfc73582f3001d4a", + "0xcfd8745e7d476eb3ae782d4f541e1c6b0f38fe2d1246b6e60943d28f68ade509", "0xcfbff9e0d322e6cf9e99f37647403973c8b07e010a1bfdb5014fb15738226771", "0xcf3512f101f51bcd17634a320f949ef1b60028960525ab16f38daffc88502f3b", "0xcf2279bb28c09f92c3f21d5f57fcd4a18142aae1cff1dba8f58a22be091a0405", @@ -729,10 +798,12 @@ "0xcda8a42acfa0b5ad0aa296ceff2282ce27a538cc7fa62059b8f7834362db8bf0", "0xcd488f925aa428a69af217141aff47c753f90323c05c363196c802aa0b757947", "0xccfe1541502243898676dd6b76d4d590e841e1fadbdedcea73d23d6e005d3974", + "0xcce986041ed45a0232327edd5dea3f352d7de54cd2f60f4bc68984d0af07bc4f", "0xcca24d95819c3e88ee80aacf6e40361a828eb8b855927f4d81b02706b4d46e66", "0xcc90d4950db7120c0b40481d6c6c504d6e1ba0b677da5d73def4f3fc7aa0f5b3", "0xcc606395472addbf5e288f66b2b8c5a9b41519db7e74d9ea46b9d2551907b844", "0xcc55f0acd6af048ff782c86a2f5400a2bb9f8d1feb411a6a4ea3255d6dfab440", + "0xcc3d8fedf4953626dfcf3a4b2ebb9c5a92861fcbc0b6192e185a764f9dcd85ba", "0xca865987c2b4e490189e09830baaa8f31bd733e5e1cf4acb1fd1f0f80285ff19", "0xca3e4e9f7f43153d66a8da3e5e524f5648abf2a9fd31f0e1aecb87c0d4711fee", "0xca2c322ff8c6a1b5f6eca8ff01b51075e2797ca0fb87b5972a2ac72db6df0951", @@ -756,6 +827,8 @@ "0xc50327a7e9ac001da15bfd0902018ff384ff7909d102901bd9b655b2c0e67200", "0xc4a1cf419cd66c42102ec4f43b77918436d139389f149dd5c1723e0f0d148199", "0xc49758b8b12288383f7d23e6bcbf113c13112585108bd1b8d93a317757e1b50b", + "0xc430c75372084e8dfbd0908caa8b11010e8a4f81a9690aaf6dfb434fe2f70b8f", + "0xc375e3de036115109222b60fac4f8d9857fea330ce95be794c81d8ffa8065037", "0xc2ce440a029247d4ac713f3553b110afabc837dcd8569fbbd03e1316b0429d7d", "0xc27882ccc946ea879447ae7d6531d9522bf566cd114e6beba89ddef0fc59c92d", "0xc242a23cab714a6f060d99b625883f62d13b05f3faec0dc4752bc560b351cf98", @@ -768,12 +841,14 @@ "0xc0248634b28039548064f50791837acfd79b4034c2db114cecd782ddb9e774b7", "0xbff070374531579011d512403895f0513e8d8dc9d795a83e9b54504b546738b2", "0xbf89ed60de855cb74cfab0bcaeeb994ef201d94c2d7e146f14895e4448c1cafd", + "0xbf066b48ca7d738c32a9585e53dfc0f3b2966469aab9a007f74fc2cf50d7ad82", "0xbed6885214a0f98fe5ac2791139b29fbe34ecafa8055de4a2cbb86f9fc196a2a", "0xbe5dde6ac6b6df39a18c8e30f847fca2eca2a761520b785092fb28d512153697", "0xbdee5154401192f5c769691c10c2e6d579c86792973520268633fc6a92b5b09c", "0xbcaa96dabd0da2832f06e8b37091cb9dcbb54644594748a013a5ef54e8ad6336", "0xbc90fa7fb1f8b5c0a83ebd63d30f4bdfb13226624ecd612134db666cb5d7a354", "0xbc6e104c4cd70eae2b1d19add2bcd7115a6b956aa4bb3d069baa876f0ef2a901", + "0xbb3c2420e1d8f2e53dba16d272fdef460b6c111737f2963cf1c610cd777f1f1a", "0xbabe4b5c307c4f7137e7a67835cc92745d3220fbff7840121be4367554165d26", "0xbab7fe01bb7dcda8c4bf7feaf40d6db8da8f2e15fb270cf9925d09ed7bd88b84", "0xbaa16a78f9e2990c951359ccd040eee7ac458dd7a14e464a1f0708e82b8f8bc2", @@ -784,6 +859,7 @@ "0xb7955c2a243da8776e749cd470e768b2ae5bbbf70ca042af4bb912f3e9b8fdea", "0xb6f303159ff02dabb59948be936e8f684e0d2d6bfcce673e10206a302184571d", "0xb6854b548474bdea51899871928ab71447dc9a7de7828f9f485520ca8f9ed376", + "0xb4d43896a51cfcbbea64d683f354a24aac87c8464076641cd82531bc39a14cf0", "0xb3dfe5bbeeabb3507e6ce7f6feeaf9fec3e8a28e50dd80f0e8ba2f35040cb8b1", "0xb36cb3a4910eb9fab788e6ef0329a2f9c281c98539362c738a4b3b3b0eed6cbe", "0xb2f2d4d9008ef8b4ac5631209ad026af12a91b38d834a01b849988c16ead3653", @@ -804,6 +880,7 @@ "0xacc43503e41c664dc85d3cb6f76b21774bad55c54a796db02fd735d15c468d86", "0xabf793e9c686fd18bd110e21bb23be57068da87199b5f143af303948c1e35a27", "0xab18f54d3cf8cb7c6d2a6632b75c9022d69325f98deec7db6db86c6f8e33b011", + "0xaac58b25cf346bc6ff1afba7ce8e42774bba40be9bd834c4cb20361bec3186b3", "0xaa5af83f98f3607987df4b532d89d314bf2558bec44591fe6428d9f397329324", "0xaa2ba20ee85e0483503b7d98a1a8c61c826acb4701162914d01388c78a0eb7b4", "0xaa17c41f838f1432965a325a281b3584dbb886775e80b89e44a2743e27d7172b", @@ -832,11 +909,13 @@ "0xa18d0123e07446f4c6c840fdd6091e967cdd3ca12e0ffd622c509f3e8467cd5d", "0xa15e066acf91a9f2cf0b49ab8c60871232a07304c853cffefa08483330b93e18", "0xa0ee5a9f33701ae3a0f981f90df570a4e869f8824f42ecf2c85f5915f06063e7", + "0xa0d3d7e41713e196bd8fb41e395aa97785e8b753cc723ed95c89400b13a10152", "0xa04f37682bee3e6fce686a8eb97b8cef1192f6f436e3f7b23b5d8b3aac49d327", "0xa00a20fcd3b7ea4353656f270418c81cdb9b84713ded33cff7697f29c0405bb0", "0x9f5096522ad1c0c7933edef4bde28d672c3ef54b6caa9623e1f3212422277dfb", "0x9f4b0169e022df8a9ba570e72c2331608ee7fa5af6a4e04066bd30f763b09d16", "0x9ee096f6d9f308c0ee4a98e8ebe6b44705caecc579f35d03324cbf21a6bd23b0", + "0x9ee096f6d9f308c0ee4a98e8ebe6b44705caecc579f35d03324cbf21a6bd23b0", "0x9e6a7595f8e413f8244c51aa91e93cbef9512f615d37c6e63eed50953edd0537", "0x9e5fb3d240e8d084eda86e0bdff595054fdd3f36a7e07866c8d9d5e2bbe56fa4", "0x9e033a2ded71185a62dd58ba7356fdc58adc37b2d7899eeedcfb35b30dc0debb", @@ -849,6 +928,7 @@ "0x998d09a1c0d5c72b78c2b3d912ec913693c40d443e38c76471e980e85bada794", "0x9981b6f6d6bc102d3f7fa1614ee1eb6de9d1f7d8f35317200c850d83d30f4808", "0x990a89e371dd269d4cac7c17d094979d77330c2b4ab92f77279f9959b708f360", + "0x98b8975b2af2c21c011d25a1de07fe317d216deaf25f74615971561af6b2353f", "0x98911a0fdaf38054c3db6eb948dc87f7c897d7dafb6bc9580b8aad79a4722ec7", "0x981448bbf4818fa9f8022f08a7b909abfe81def1fd13a17c485e338abaeecf4f", "0x97191a7db9fe45bdd29a5e234de937b06fd5150719d6ac2a0314279c9905df17", @@ -869,11 +949,13 @@ "0x91046ca0523d9320f73a458ce15082d194acc09ce16c4705b058ed71c0be1551", "0x90e9de02e10a9a4a40f4b06511f31f132f65e7e2c0d9f28cf771ddb2511a2265", "0x90de6f584b268fa1d6b3acb7894c5aebbf489b748b64d72baf215223077c952a", + "0x9099bc63d8bed56dd1d833aab0cbea8267b0d0b121d5f9fdd73969774918a0c4", "0x907c003e4f80434179c12608b24b0067529630dfd6675dd6c63c0c3f9e8f56cf", "0x9057e26bda5f3664bf252228f12dcad1010845e524b55a5e8017e482cf57b43b", "0x9039ef3bb20e67e5e62528e0c2ad9187d14d633b47ea3d5de8cd0f88dbd4ab67", "0x9004073317290a68f4b78e026561d32de8f32f01fe7e659e3d4462b6d3d11102", "0x8fcd02dd3114a05e1f4a7f88042d264a5863244b2fa8811549dcb540191fca79", + "0x8f3fe0ad9d9e4c67b73067657042220102ed316c40ccc1e0f8c6dae46d36cd17", "0x8ee6a7f360c765e27c4f27c57392717d8105be1c1956b5a2dffdb106f7ab0033", "0x8edfd1178fd58091ac71ea09061f99019e094055ad4d6a993e2ce89f3c8d4999", "0x8eda6f509e576f8a4235892f3c367bb96c9813c524dc6ada821198a655e82fc3", @@ -895,6 +977,7 @@ "0x89f362685422d44a37b2f4d7be6a485c0fc8139e0b2c33964cb10818897af108", "0x896f1865f8d9f59cb1126ac162764b2916ae6addaec1483960a6297ece594131", "0x88fc8a59e1755810f50e1ba7c8c9c2b9d212e26b496fe076537b24e045b44fbc", + "0x88df987e5dc1c188b7307b9139939eff3ad0cb5aa79f0ade75e4e7b5836760a5", "0x87ef83aa7e62d45a88ed7022f66ff90a599b33b9c1cde5d04837342fc26b3a1c", "0x8783fb0be0ed12d8a84ebbcf9991e0ea3953fc924ef060ef727d26bda364df97", "0x874c9bfc92ecc187bc6872be42fd87f242cf8e93dfc512f04a871c6cba052a5d", @@ -923,6 +1006,7 @@ "0x7bd2b72af24c67765b00ca4a6d842a4a5d1efee598a4fe10cc9780799ab26145", "0x7bb462b25aa90e54f4e7996e0d64b8ae9a6927f124b267d06bb11364189872a5", "0x7b94f8efbf31a93e7d45f5af325ccde6ce418391791bd9dbf3abc70440f4af78", + "0x7a3f4a9fa1ffabb64710f7d8b3f6aab6dde57c73695c40448a479d3df6766e88", "0x7a0a8f536edc44c34367d91ecea5d787315871a0eeb9470265970f334e2c334f", "0x79d565d5d241b1edc10df51923e2a7401170ba0de0772368d1330c01dde9d5ac", "0x7867b781c9e6fb402ceed0a81e69c1d60993b840dea9cacf57ff9b7d8a6e0e76", @@ -931,7 +1015,9 @@ "0x782de690bdc23a23ded9ccc48292f5060a5dfdd39e16d8501c7b9e8e21f12de3", "0x77c96af20df45cecb241a1ac65e60bdec235bd4225a952c936d362f0dc22da36", "0x779d95a2168b4fc42a2fa8847416eeafd5d4cf8059e707c28f1261335ace440c", + "0x7753137c18b520d01b87216c9b02e64309b0bdde0394c6348657afacdd6cd13a", "0x76c45c1201790fde7c1f7ae826a40bf319385cd9651b3da7f8a0357e5866d881", + "0x768a8fb5fe41fb970c20446a7fa9530d6c84da8711e59c27013ae341c6c4e4e1", "0x7649d4906d0228120798a47cda0a9beba06d43aeb6d1bb8c45f5be835f8b6d00", "0x75c24b798f12ef7e30e9a98f2781c92fe4b0692dfcfe4a68844381eaab3c6b68", "0x7572ed42285bfdd75addf23f023e897e8e95dc72613603c02abf48ce091c5ae8", @@ -944,12 +1030,15 @@ "0x724b27c4cbd5e0a2bd66840ae8927ec5512b74986e4d33f4b7c7d2002289fb48", "0x722ad7dc2e610fb0bfd364dd056a5024b444c3fe8af83c03bc3d04a36e02089e", "0x71daf8575ad49dc67702ddf0e78cd31cba934e989ba1aa4e743e785b25a81725", + "0x70f97a1182559f553192e6bfed2e73e3b15aae7d8f04a967856c4122d7e16018", "0x70e16ebd2a54cea61de7f41c296183bab0b82b6560a396e628ee22863c892304", + "0x70a182eb3a55a5ba77c28b53269d11f216810753f7749cccfc6b34df3dafb12d", "0x7058b0f33dc62331d3db646bdc29635931e0d33452172b7ea43082e96151cb9b", "0x704c26063525f4fa946a5eaaae747eaaddd418182771aeae247a8bb55fc41f84", "0x702dc012f2aa123f9f9ce1407421dc57c6d23f50e211118b199fbbcf2d3616a3", "0x701d39eb53efd4f2eb70060bb15705016fbe493c6c6c580cecf4135f3b2a5ffa", "0x7001c72c4bd395954c9f7362f302d584826a102b9d018b3342092a30477c76e6", + "0x6fe3e97c971e72c83e0d7f94a47ca134892757b050898c6c69de2780bccb01ea", "0x6f1cc08c4919326868649ca1b82e92ebc3220809fd3c0d9f8abd70f66b5d4929", "0x6e199e1c877da0b4d7f10bf4285bbac6db4252127cc9848fab2864717e3fd22f", "0x6ce68822c996fdfb8ff3c063c2cf59e54a1c0fc3a9e441c9b61a19ae514d7737", @@ -976,13 +1065,16 @@ "0x65ca6a611e79e072c91533d0e3f0fcd1acd361477db6963959b3bc1b43e7e2b5", "0x65c90b3854184cd6caad673569ca03ab6b5206d0073993b737f1bd7fa3b194d2", "0x659ec47803404ff40610e5b513079ab5eb507434a1ed5bd5745b6f85b24265d2", + "0x653b69edc7d8d39847cb93de498478892edf5cbab0117e21657d08c6adce29ec", "0x64a7180432b0f5dc8634fae53ee9e55c4c9471df02efe14b9063dbbaef2670ad", "0x64452851f8c18933b010d4531332a619847a05dcdd0f06cf9621771d7ddf243a", + "0x6436b58b3e374f80c29c2a5427ec9b329e844da569ef7a4317b46d6726be20a7", "0x64191e209f9091a5c23032df110b5e4fbb0c909fe3a17d9cf34ef4f0cb1ad360", "0x6367e6ba8024776ee081a70386a7785195b25c47a8c68f6f9f628d3835dc8a5a", "0x63386d82f8428bdbfe586417249d30918a72705d1eb45046dad7af5ab5300548", "0x6297798d6ff8aa392fb23dcb2cdb99f9175362c2d1191bea1be004f626552ef4", "0x62907f1a3f26e25dd1ed0275a1c82c64535b7e33eee8595c04e050d1db4712c3", + "0x620d3a2fb0d0863758f8bafd728c0baa827a92caac31f52b2b21698bd41b0037", "0x61f22a547b46e6d8bc7f5a936ce0933ab85ee4b7ac58d210cc9f020e0cbbf4bf", "0x61a1ee737d8ddfb196b144d91deac512b512419fbd39785f807f096a1709a889", "0x60b3469f58a1d06bebebb05fae97f014fbf06555c03569c4a9ac9c50c8aef7b8", @@ -990,6 +1082,7 @@ "0x60a2a196bf87afa973d9d2175266d37199b504f1af6bf3668d92714a1968db16", "0x6070dee088335ea94da705ca8ffcd0998f6ff83db5b1ec2141be56c9e577a0c7", "0x5ffb91398f908954aa5a20fa6281a41d53e962ed35c93943c6310968bb67f6a9", + "0x5ed4c2f6455d6ffae6f4461c4344cf58404b42c0d0c27d33277e6ee1d9fade39", "0x5e9052c4abc2dcdd2548de6e21b30e7d5db763e35f476796371e8dcd40fbb00f", "0x5e5f0dffa7d7e9bdd48ebc9641bfebcd7573ac5ff14faba46e455e9921ca1db7", "0x5e0ce80dda77b99f48420f228a334fcc2d1d653bd367c0d2b76126f51fcb51f8", @@ -998,6 +1091,7 @@ "0x5c9b4fd266a9cea32c32a79aab01fd3b778f6b0b19e3c37b2a2d86f1e40a6a96", "0x5c4f717f4661fdcb45408c30732731f1229f28b8e5852e59c8a96a5aa3283f97", "0x5c324eec3d9dedd5bbc528b4d4112e55cfb98437bd0f1615cbd9b6238211afac", + "0x5bdc4f941aae448aa4e555e74107bbfef30f6b714e36657584792fa9bcd6960e", "0x5b8e0f4d6297603b7840db86830bc7a5d6d52529a8736e95125f60ac6a038bd0", "0x5b84e04ebdf28b45aa017e7f27fd2fa7c4cffde3dfcfa0b518f671c48f48b439", "0x5b1dc7d05ab86c2931d34df3bed8eddde0d26f9aac6455edbd1beaee08f71092", @@ -1027,6 +1121,8 @@ "0x5081771ed23034ee299997ce1bd0e5a69557828448b6191ed6dbe580e7118b1c", "0x504d60e9f67ddf756a5e7f7f20bb9521b46131150aeebc78ba8b3effaead08e5", "0x504a610aaf199b6749990602e77ed50f2153bc4688613377e2f1bd015ce2b5ad", + "0x4fc03982e20abd384cd494dff781152c22eeefb15c56bd5fd37399ab3c87d4c3", + "0x4f03879bcdaece9515067c8c569e85e1badbe04b3f1b935f641792d14aa2e1cf", "0x4e81b90a2213a248cf0ba364cc09012a26f44862f1d1febce1f013f5a230d43a", "0x4e7c95423f147d884e3be846d6779df3189a7c9ea2821c7ad0af97085917db39", "0x4e28e5799c8912a85546586b865363acbcb88587da470569c078c526163e2203", @@ -1039,16 +1135,21 @@ "0x4c352104be4b157d6df585083dec1cc0e4a2dc660ab5de6f11665ec736625656", "0x4bfd450ecd69ace096b7fd1e704cc0c9665cf0c73db699b2a15a2f6d636ca748", "0x4bb4d5906d886930d705fb7bc261c480c86505f888c713331b8969e59fde5bc4", + "0x4ba2d8b2e3fc5038e602bda8b417f5829d5ae5269666d4935cab6456390559da", + "0x4b0f2e5afc5e96a64fed657e9b83bb020865264c616b04d3c9298eafa2006a6a", "0x4a8cdee2df016ba2fbdd6686830d2a23506d0678aec3904e10a6c1b31f995755", "0x4a12baff0066a434dc7506dfaec76cc9b45c4e3ff9c973d51a7132ca8a6f588b", "0x4a09e6ba2987b4f2b252311a0bad0f73050179b2e7f535fdaeaa6c2f60a2a7f9", "0x49e9750fd4c9b4f16408ee0e36f553e6ae07e180209fdf7d72af93f105400804", "0x48f691b4a849125052a743b17ae5ab3de98640867d497e8cbdcf9f53f298773b", + "0x489c2a9cb387fae2b3aeb30fca981c5b55283a0a1acb5fa6d72262375688b15b", "0x481953359b9d7bcf72d4ebcca7e559a258f9047b804675b21ee4609d3acdb821", "0x47f42ec0b01efa8e1cff8bfcc7ab41b1b35ea5ab7702d31217771812511de43c", "0x47ba0ef61c967c94f38160c32cd0717785a75e4e77496800e37450da2b140c1b", + "0x478bce1399bc6763bc20805b2b0eb50a3b581748984442603bd693f0391a8fde", "0x477a018d9316bbb3107a6295a260114636e1401591f9da5460b7ac71acd2dcdb", "0x476adc4cbc94dd9326ae3d3155ccfcbe39a47635a03312eb2c773631c1cabd65", + "0x460b9bc4afd011efdaebd7e879bdd9b3b67a1c8c88947263e75ffdb896368b60", "0x45cc3661bda47961bb14a7a2daf81f3ff1020a050cff302b78db7b3626c055e6", "0x459496371ec299edb7b511722dde5c23cf5f8d14ebd8d3382bfc2c6a2eecae01", "0x4504b9e0c2dad195d7eed1abb135d4c0ee27d21a11ee663a00c20abc89f478b9", @@ -1059,6 +1160,7 @@ "0x435419014bdaf9d57031fda1d067e60e1e188fbc20f25081ae5112f64e89637f", "0x42225e4f2fb6956e678dd821bf5712771d14817d4df291788da9cd80313de288", "0x419e0159dae7e2c4c09e1452ae1df812c19e64656fac04745b5bf02612aabd93", + "0x40c0f455cd33e60b5bf8f7afe0d278a054de4db63558e318e7cda8dee1575968", "0x404282a4b3c82b2c61655494e22c9d64f714d2bd1d85b48152e830b67a966b02", "0x402027d798d7d308f38ddb7750b0136c213978521b7233758815ee88bf5274f5", "0x401fe70e7a7ad6f6af8b41a6332f747fcdef35d5681464d7593631d6d1cce38e", @@ -1068,6 +1170,7 @@ "0x3efe05f6fd529a51b930cbce1c0e50ad74491f830c5e40bb980b4e1bed0d4893", "0x3e53e9bcbd804c31b234f80471e202144ce813555fd591828e8a339ffa18bd35", "0x3e4c127e067d5b4ba310fe222145c84f870237b0d50e08c2a8ab611ff1e539eb", + "0x3e4397309d25ebed330fd2fcee3c9d60aa09af284abc8683101d0540d8afa90a", "0x3df78c65a0dbaebe1ee9510c145d729d240478134225c837013d996941633159", "0x3dc3f80dd4ddc9a95fb56ec4bcc4b72c13e9c0c64878b69ab0890b7f7947e200", "0x3dad4e2198e63353eca046dfcfdc4968339196777fc23058ddd085071c8c9d8a", @@ -1080,9 +1183,11 @@ "0x3a881ffdb3da446d220952f3a36c1ee902f736a79e6ef43d3a7947721719f04b", "0x3963285656fab596f646b649be3d3502da07c98f1e97547e9fd3a42bacc91533", "0x37bbf3a4adaa935d0dcfc8c177d37a47cf0c9dce034b5bb0a0da5f50e597c803", + "0x37ae64eb1c2c800558c957606b5ea8799db9e9761a0644c14da0708536e2d3c7", "0x3775b238fcdec0e39427d1e4759fbf8b6384f884b00ab78fb2834cf2065aa927", "0x372ed8fd2167b5413bd5ea5d6e208cb23bb82470d907368e62924574f3590710", "0x369f1395546595ccad046b54465a0fea4bbc22bbe13a9622a42f80aa14caf37d", + "0x36531902a9d0a3b812563f7473db89ff777110a42a13215120b94defb23ea7f0", "0x35e1c3ecd865b6cca8a09f1279f772f313af8f10b71a4d90e2dd324a91b85e72", "0x35d76ce3b67475ed49931650195866d6ca1530066c3d3118be39cfc10fa38816", "0x35d1ce12816ede11988a3307113ee3e430dd46add0af4c008562fb42efd09ba1", @@ -1120,14 +1225,14 @@ "0x2770ce3330d55eee35d288bc2da9c23e97133ebed145f42131cf74bf428d4712", "0x274385590b6ff154fc25054a445cac1d5339dc02c8e8a9e0f23ffc7767fabce1", "0x26c1848499c2ac6c5dd627feb99fdf1d1fc3aa987a1d54f2f5324fc897a6bbff", - "0x2502a18a1466a0e28f398c3535032a3a46d53f94ef7e3ccef4d38795cc77ad3f", + "0x255b2f8eaa49f5ea4bbe842a02033089b2c17d3f90702d5f83334c8744204abd", "0x24452b5b4ed14579cabf2a13243c319e979bab5f140f7d02ededb1cf953466d9", "0x23d7b8ad7616c3aea9b06eb4a7884fb3ef426ce1df9f13c4476bbeefa05fd64e", + "0x232966be6225ca65c39d6723806948650d36ded544127d43e78f893501c9dc61", "0x23200642e349ce3f50e75d590338372e7553f8f5d295d5124eeac4ae6cf6c2cf", "0x2300f3d3cb42080c2bcbbf95005f7a5a38130e451daa37f95014aced1bcd0a6c", "0x2272e8fed32f9afc028b8a6def1d2ea8371dd00599c7f1df5da1a29c381460da", "0x2244deff2e22ca1a6325d18ff5b9e517c0fd0c4bdbb55f859710733cda85593a", - "0x223e07e43cfbf024c66a5f5d7c94cfcbc868ab056e4595873b729722968da6c2", "0x222339ab58e3faf20a795878f7a686e7ecd9b637b7d8150df19f1f904d06ef03", "0x21fb9e46698ac3cf1f2e6f8c583fa34b1277aef6b473a2aac99d3fe6e202910d", "0x21f59d889ad27ee62f29862573831f7edcb708d447858a3f70cd94944169df4f", @@ -1144,6 +1249,7 @@ "0x1f9c34d422588d5c6b867ae831093f312a2c8d5e837c383169fd1f5dac310b18", "0x1f2f18de89846adfd6118700bd03b479a1d225c5866ba9a492fa75ae7218aebf", "0x1efa73145b87a0b42b5afae0cf3eaf716d2b89d8b89695281386287440c46fd7", + "0x1eb1f70fabcbae75a662aeface34688cac40777f5a10430c3cd8ff0d256cdff6", "0x1eac45cf92999a29d9947e3b75ae8c9ba1069e11515ae300fca6b742ce5c1df0", "0x1e66f98560e7a43e1ebb1a3df215df1df31b9fdef12b416bd059eec8d9690042", "0x1e1d98ef9e40bb792e65311df273291a38eec6e8b83ec477300a43631fc4e4b1", @@ -1158,6 +1264,8 @@ "0x196943dc5cdfaf45338eaaf14327c1939eb673e1fad7248635132e013b75b252", "0x19552825f75f6a6a38fdfcb63b56f006cb35602f25c2247f245d9e88c8eacb97", "0x191e6ac14751a0abede9ae489b8e9a3763940b5fed14942526305be9f4b0265a", + "0x18ce7a8514282de9588772b134e650e84a9fa978ecf54659999f2d4e13440b57", + "0x18252d1ca7085cf06881aaa1ccb6efe3b786306b96e63572232e329e58b20f08", "0x18133cf06fd1dde3920d0e954d0c7fffbdcfbd01f4a46b1737650da9b6bbce94", "0x17f71e5c505a0090b88a2fa0d748bc3eb1d7074db7c6fb2008bbc88aad6d1180", "0x178dbb20f60ee6fe3148e8e89d1d02055903a77bdb99f677194b7a3fe1a46bc3", @@ -1174,17 +1282,20 @@ "0x15615876aa697f07eee82b3bcf810c003854afeca98eacc94955b5d0b0d70048", "0x144537f4919fff758e1f3ea0eacc0de42521d7a24db15e0ff42a4d48090de5de", "0x14270eecbc8e3f88d54dca730150e86888722f05939341b4e7e3bd241adae3c0", + "0x1422f2c95bdfb07fc803f7f2307ce76cbcf5dd740867a75268c22efe5605711a", "0x13e12782b8d17665d0905fd5e9cd819811ae88471006a6f95a449d6ea0edd48c", "0x136afeecc83ca2242646c851292874ba850638f56894855cf243ce8e880c96f0", "0x13468b2d30abd40653fcf4be00fcc78f00318e8e6d3e32d8d1b79e7cefeb4c1c", "0x129640a0922b479e6f5f604797fb53c5c094913a7cd2d6bae945bedc3b1ee9ca", "0x126438123275587069017010be0c57a719b1fba7439d940aa947c2cae5d535ff", + "0x119bc28188846badb31529a65bee2d722d9d9860dfcb3711c2260102c93c1875", "0x116ea0242c48b17b071ceda2caccd0ac46a8e637a42e21e65fab5fcd9837b939", "0x1148fb056cdfb772f971ec418ec09a11db35f71661637eed54ceafdc8b546de6", "0x10c6e39462f1b346d3a531048731d3a1b67773f41f05406a1fa741911f6d69e5", "0x109c8e968486d2304b4ff1bdc03d18f41b539ee3fe7d8bd3250316e4f88b337d", "0x0fc7c5fac39803137b4e3438dbf750a1a4fc1a098b83c2fbd9a59b3dc037a890", "0x0f4b7d163f94c80aafaaec5278ea5adf0e38df31ad2b19db4463e68afb4ae44f", + "0x0f155e814dcbdf4ad8a5919c7e3f3679be8b65e04c766a48367eb51627719d01", "0x0eac88d26629fccac8f9392f20de0c6bb128bb47945809e12e2a91791f9a3a8f", "0x0e8a4242089899dd959dfa280f6fc8edde00102e098aae1601ebe835d4aa69da", "0x0e3f5760a175b5479eebe18e8d19b0f50df82ac3f41cf5b7e2901b41baf3292d", @@ -1213,6 +1324,7 @@ "0x0385f85b3887a3ec65c69ed4912f075b1ed9cbdf0ac11f31fd95faa786aa2bad", "0x01c8da31816f3c41d14ef13f72a156851bb13c28635442fd03c2747c8adb9ce5", "0x0149a964edd2933dc4a2464fdaebe864938a1ff607695a9483c324b5c51a9c6f", + "0x00fc8683516efeb9676e3c27d0aa292b674aa2e912ec3b23f6800aee0d696c13", "0x008d4a1755c9e050b2a109e181c00817a82021dfade19b44caaaf846caca9f88", "0x0083c1dbdfce70b215beb476cf0a8afe7186c7e1c34d5d1ad7c9069376a100b2", "0x00144382e6661615594266216ddc01e3dbe11ce27aef0608a4a2676542401393" @@ -1220,2435 +1332,2659 @@ "values": [ { "value": ["0x616b958904940c789e104Cb39bd2BFF82427CCCB", "1"], - "treeIndex": 766 + "treeIndex": 839 }, { "value": ["0xb1584a8B7A32FE4573FaF3Bc8013Dbb3D9ae16A5", "1"], - "treeIndex": 1009 + "treeIndex": 1103 }, { "value": ["0xE52Ee356E4320DBC467D72A5e7931C1F24Be2912", "1"], - "treeIndex": 969 + "treeIndex": 1058 }, { "value": ["0x2ec31068d6451510841578981081124a0f75cC64", "1"], - "treeIndex": 641 + "treeIndex": 700 }, { "value": ["0xB5CC80D2423bf3a47163DdBaBe7A49e0473173Fb", "1"], - "treeIndex": 901 + "treeIndex": 984 }, { "value": ["0xCf2b7c6Bc98bfE0D6138A25a3b6162B51F75e05d", "1"], - "treeIndex": 980 + "treeIndex": 1071 }, { "value": ["0xebfd96B294c7eb1eF31B856958B1A9287D34Fc4C", "1"], - "treeIndex": 694 + "treeIndex": 759 }, { "value": ["0xb91b3dec63690356bdfc2d664cdae19b3d96e5a1", "1"], - "treeIndex": 734 + "treeIndex": 805 }, { "value": ["0x3C474891be0bA5FA5215D33eAc59B8547cd00DFe", "1"], - "treeIndex": 947 + "treeIndex": 1035 }, { "value": ["0xC8D46eb7881975F9aE15216FeEBa2ff58E55803c", "1"], - "treeIndex": 1078 + "treeIndex": 1181 }, { "value": ["0x50B73d52a00dD10fEef49a074657285515020320", "1"], - "treeIndex": 890 + "treeIndex": 972 }, { "value": ["0xF23e0D6E328a13De1910D78B6a0D4D1aeFaDDda4", "1"], - "treeIndex": 797 + "treeIndex": 873 }, { "value": ["0x02847216Cf4C32bffBE3653377D57CcA70B00aE7", "1"], - "treeIndex": 872 + "treeIndex": 953 }, { "value": ["0x2179A901c2Fa2f3ebA7C9D7aEE63807384c7B36c", "1"], - "treeIndex": 723 + "treeIndex": 792 }, { "value": ["0x73A5e302aB43D6F9a444c30b23286f0751A261F7", "1"], - "treeIndex": 983 + "treeIndex": 1075 }, { "value": ["0xa9B1a760b56df3C18A93D596F7851D0d7144C866", "1"], - "treeIndex": 1002 + "treeIndex": 1096 }, { "value": ["0x1aeeaa375b4112f537FaFDEA5AA3BAB0e1257557", "1"], - "treeIndex": 626 + "treeIndex": 684 }, { "value": ["0x64b561B2E08a316574E698C8Bc18a3F8645461E6", "1"], - "treeIndex": 720 + "treeIndex": 789 }, { "value": ["0x08dBD4347AC04A8DC6BC24fa6511A03aBDA3E05e", "1"], - "treeIndex": 655 + "treeIndex": 715 }, { "value": ["0x7549ab7a4453aad643046d60347b1143c3c1cc4f", "1"], - "treeIndex": 935 + "treeIndex": 1021 }, { "value": ["0xC69aE428f6049e78D445F053D2c1df879C59b34C", "1"], - "treeIndex": 1181 + "treeIndex": 1291 }, { "value": ["0xe8C6cEe0408D8fcb1E09dC13149b6D516c32ff70", "1"], - "treeIndex": 869 + "treeIndex": 950 }, { "value": ["0x40cf8142bCb573c3882d5723D8AB3cc6D11ED68D", "1"], - "treeIndex": 794 + "treeIndex": 870 }, { "value": ["0x6Ee7ccecF5664eF9c3645eB103450319bf291945", "1"], - "treeIndex": 1178 + "treeIndex": 1288 }, { "value": ["0x589A9b567c48d3B2FC208727D41BC78c0746cfcB", "1"], - "treeIndex": 716 + "treeIndex": 784 }, { "value": ["0x73A1d547A12a03fB5aE816bf4a8E6D90d4C02D2A", "1"], - "treeIndex": 939 + "treeIndex": 1025 }, { "value": ["0xbC0C8761f2b093Ba910cEA4E0C9Ac3700d3BdE73", "1"], - "treeIndex": 1204 + "treeIndex": 1315 }, { "value": ["0x1a8c8ac53eaaced7e667d6eea68eaedb6069dc59", "1"], - "treeIndex": 847 + "treeIndex": 926 }, { "value": ["0xC279F761e8eEcC16954c0c1457523f13aED12edD", "1"], - "treeIndex": 842 + "treeIndex": 921 }, { "value": ["0x674A7E635956AE62bFFb8b0ddDbC7fff86FBeFe6", "1"], - "treeIndex": 798 + "treeIndex": 874 }, { "value": ["0xe0854ff3e73df0f4b421004d7313fdaf8fd5ec17", "1"], - "treeIndex": 850 + "treeIndex": 930 }, { "value": ["0x1f8aeAb0219843C65b4A0A7cC42E69E3e3b97d73", "1"], - "treeIndex": 773 + "treeIndex": 848 }, { "value": ["0xeCD40Ff016c263a06Ebf6958854FEcaDb2622818", "1"], - "treeIndex": 898 + "treeIndex": 981 }, { "value": ["0xc85628409af9001f3e70a73516b7a5cd163d8185", "1"], - "treeIndex": 922 + "treeIndex": 1006 }, { "value": ["0x8E2ef60Ccf0b6478Baf08f52618A63D09404f267", "1"], - "treeIndex": 1172 + "treeIndex": 1280 }, { "value": ["0xA8327cF803d9851E4eAfDC2669000fd2630a35B1", "1"], - "treeIndex": 704 + "treeIndex": 771 }, { "value": ["0x34c3dc8affba68d772a42d794eae085060f35e04", "1"], - "treeIndex": 781 + "treeIndex": 856 }, { "value": ["0xbcafff4b4e5446fb58708cf298185f3bffc03d2c", "1"], - "treeIndex": 1203 + "treeIndex": 1314 }, { "value": ["0xe0aab54593d19336d77f460f055211892d5f8876", "1"], - "treeIndex": 625 + "treeIndex": 683 }, { "value": ["0x94dBd1af9b88f924a51164C80195C38c1d6029be", "1"], - "treeIndex": 707 + "treeIndex": 774 }, { "value": ["0x490e2fbb7879457868673234a8ffdb1d86fbce4f", "1"], - "treeIndex": 795 + "treeIndex": 871 }, { "value": ["0x598eb27e7564fa83dd03c326e38be38c1a47fc82", "1"], - "treeIndex": 958 + "treeIndex": 1047 }, { "value": ["0x9c2Dd66C10Ddf7a2e543f1936d123CD8Ffc377b7", "1"], - "treeIndex": 999 + "treeIndex": 1093 }, { "value": ["0xAA19Dd3FC67ccBbba25ef76d1f8E72989E06f921", "1"], - "treeIndex": 609 + "treeIndex": 666 }, { "value": ["0xeEB8505490728278cC16a9087De853b97b6D67d7", "1"], - "treeIndex": 1031 + "treeIndex": 1127 }, { "value": ["0x2C417b8E154A99f962b3B386313Ab23f99Fa6171", "1"], - "treeIndex": 891 + "treeIndex": 973 }, { "value": ["0xc52e7e835d36745d3b0e8cf5610e3b503507701b", "1"], - "treeIndex": 938 + "treeIndex": 1024 }, { "value": ["0xE8153E9e32ee62764d4512B89BdA0F712A291D8F", "1"], - "treeIndex": 811 + "treeIndex": 888 }, { "value": ["0x99C8140c30cBFDfAf3454d2E8B21375D9f83e239", "1"], - "treeIndex": 870 + "treeIndex": 951 }, { "value": ["0xE7691BA06eB4a302652d3290e4A89A504b3860fC", "1"], - "treeIndex": 1087 + "treeIndex": 1192 }, { "value": ["0xa342C0cFD847E696399B0c391Fe3375D8Fb732F9", "1"], - "treeIndex": 632 + "treeIndex": 690 }, { "value": ["0xB67a420656e338f1854926649ff74BBA6254700E", "1"], - "treeIndex": 1055 + "treeIndex": 1156 }, { "value": ["0x5f791Fd1f4ec3617a5C80f76FE39409A27AeA8C5", "1"], - "treeIndex": 885 + "treeIndex": 967 }, { "value": ["0x607573032fA3C6113Ad2B864b830b76c09440A77", "1"], - "treeIndex": 957 + "treeIndex": 1046 }, { "value": ["0x0B6d7ED622124A9B9e5ab041A86648630804fe19", "1"], - "treeIndex": 1060 + "treeIndex": 1162 }, { "value": ["0x9452Db8bc3cBc87b8cb27706AECf95eeAc3E75d9", "1"], - "treeIndex": 1081 + "treeIndex": 1185 }, { "value": ["0x2198a010055D46214c66cc6CaeC4f9Be1FDc0B92", "1"], - "treeIndex": 1041 + "treeIndex": 1139 }, { "value": ["0x020828395e3ca320Ff83BcE697166CC8235082DE", "1"], - "treeIndex": 1162 + "treeIndex": 1270 }, { "value": ["0xef109b4398e3ee1e612f0a2fcfafe63c00d3133a", "1"], - "treeIndex": 777 + "treeIndex": 852 }, { "value": ["0x924D809a508326a204e158E8568ff0F57b115401", "1"], - "treeIndex": 1064 + "treeIndex": 1166 }, { "value": ["0xF21bdF3B8A0B0e6FbFDbf087A6c2D712c37847cC", "1"], - "treeIndex": 730 + "treeIndex": 800 }, { "value": ["0x761b3E92A753B162a7C552615700CF76b806e24c", "1"], - "treeIndex": 860 + "treeIndex": 940 }, { "value": ["0x432c53218a11bed08d238cf84ff547ce4fe933ab", "1"], - "treeIndex": 1084 + "treeIndex": 1189 }, { "value": ["0x62c7db69210cb72fe1f8966c87131e9c0abf7ce7", "1"], - "treeIndex": 818 + "treeIndex": 895 }, { "value": ["0x1025524d214860efD49F6CBcE255242Fa42F87Fe", "1"], - "treeIndex": 828 + "treeIndex": 905 }, { "value": ["0x2696f3039f82aF63C0474ac36d4Ab8b7934c9cC3", "1"], - "treeIndex": 1086 + "treeIndex": 1191 }, { "value": ["0xC9071e64D1C484046908cC149173b32A0EeB9506", "1"], - "treeIndex": 634 + "treeIndex": 692 }, { "value": ["0x1cb1ED0E32825f025b9432c94E6ecA50aF596Aa5", "1"], - "treeIndex": 1180 + "treeIndex": 1290 }, { "value": ["0xaCB51D5383371D31B47Ee111f13553e8580B5842", "1"], - "treeIndex": 682 + "treeIndex": 745 }, { "value": ["0x66fe01302438617343cd5c1022547a5c9f57062b", "1"], - "treeIndex": 700 + "treeIndex": 767 }, { "value": ["0x723c5a83b6b2b5ac1a1ddcc75fd2c484d53e0053", "1"], - "treeIndex": 921 + "treeIndex": 1004 }, { "value": ["0x0D2a7ad3f3114D225521ec9B722014E6C3dAd1e7", "1"], - "treeIndex": 1049 + "treeIndex": 1150 }, { "value": ["0x904AA398a9E759054c2EF3ae3f51cdbDDf692f34", "1"], - "treeIndex": 1056 + "treeIndex": 1157 }, { "value": ["0x5d8a42c1c8d1b78734f5f3877d9fb1c27f31d1be", "1"], - "treeIndex": 884 + "treeIndex": 966 }, { "value": ["0x977A2fd06F589531F8F0e199aBaa3f715e8A221F", "1"], - "treeIndex": 649 + "treeIndex": 708 }, { "value": ["0x0cD07E6B92ae3FE61fA57941d3F461057450c160", "1"], - "treeIndex": 724 + "treeIndex": 793 }, { "value": ["0x349b90a8be1fd92745dc30c7b61b8623280f05a9", "1"], - "treeIndex": 746 + "treeIndex": 817 }, { "value": ["0xaE29EeC679D4c7838FAF3Bf1c30fa8edEB6d1457", "1"], - "treeIndex": 831 + "treeIndex": 909 }, { "value": ["0x97a9552af7eC74ab719C932E40d7194340C83900", "1"], - "treeIndex": 765 + "treeIndex": 838 }, { "value": ["0xB73aB29Ae0623aF31ae027820FFEb5eE5fD56a59", "1"], - "treeIndex": 1191 + "treeIndex": 1302 }, { "value": ["0x8f364fBE6cE4431a5169F78014FfDBD08957421f", "1"], - "treeIndex": 1062 + "treeIndex": 1164 }, { "value": ["0x1B3f0Fd412309baF6F107320Ec1523226ae212bd", "1"], - "treeIndex": 960 + "treeIndex": 1049 }, { "value": ["0x4888E5Fb2968Ee0F3505C99743Aa554D0c1f9f60", "1"], - "treeIndex": 942 + "treeIndex": 1028 }, { "value": ["0x61aab1962798ee45aabf6ae864949b83f9e97d72", "1"], - "treeIndex": 1034 + "treeIndex": 1130 }, { "value": ["0x75A6a228F9AB9c01beFABE7F5D87d8d42338b9A8", "1"], - "treeIndex": 1160 + "treeIndex": 1268 }, { "value": ["0x4dfA53e81d6FEd78015d03f30eF6433DAE601555", "1"], - "treeIndex": 909 + "treeIndex": 992 }, { "value": ["0x40a522034b38d5f46069981433e9b673114eb57f", "1"], - "treeIndex": 670 + "treeIndex": 732 }, { "value": ["0x0a40f6C90a04afF08C5dE786C91d53bC518c254C", "1"], - "treeIndex": 692 + "treeIndex": 756 }, { "value": ["0x00C5eb104e91Be86153dd72dD1C9A45b7dB28B71", "1"], - "treeIndex": 1201 + "treeIndex": 1312 }, { "value": ["0xF9c2FBe8A51eDEcb2CcA8B6778a8e3Ccc0593571", "1"], - "treeIndex": 640 + "treeIndex": 699 }, { "value": ["0x63072959a9d9Ef7F572bDE7207f386D8b5Cab26c", "1"], - "treeIndex": 1131 + "treeIndex": 1236 }, { "value": ["0x99e27746e33c9886f6A3A19336E0aB753F962db9", "1"], - "treeIndex": 706 + "treeIndex": 773 }, { "value": ["0xf48CB9dCD55F0eaD3516a60868F6bFb6f1Ce86d3", "1"], - "treeIndex": 1168 + "treeIndex": 1276 }, { "value": ["0x281c1be0eb4d97b34bb1ace5959b53792ffb07e7", "1"], - "treeIndex": 1140 + "treeIndex": 1245 }, { "value": ["0x6ae9ca4bc999e280c0bc3ef30149d222603953bd", "1"], - "treeIndex": 845 + "treeIndex": 924 }, { "value": ["0xb75FD020a1b82bc96fB62adf739653e7e754F7D0", "1"], - "treeIndex": 732 + "treeIndex": 803 }, { "value": ["0xf136A4ccD982036E3fB6e8B63D0E82DC7BB20588", "1"], - "treeIndex": 783 + "treeIndex": 859 }, { "value": ["0xfa2eAAAC27d4f54AAb1680FAe162543c3dcB031c", "1"], - "treeIndex": 1154 + "treeIndex": 1260 }, { "value": ["0x1b984908c807BC22E1732F2F705e23DdA41a7593", "1"], - "treeIndex": 804 + "treeIndex": 881 }, { "value": ["0xcd0a8bb5ddd927140e2a2e3add0b0eba546519e5", "1"], - "treeIndex": 653 + "treeIndex": 713 }, { "value": ["0x10743eea87e91a8a9da3f2d815d92e86ba577a6c", "1"], - "treeIndex": 1113 + "treeIndex": 1218 }, { "value": ["0x8bD036Ec5Fce5341fdFd3A8c1F108a6820B55D92", "1"], - "treeIndex": 1196 + "treeIndex": 1307 }, { "value": ["0x744b4FfeD79071fdcDC03fdFBF61B639BAef4426", "1"], - "treeIndex": 830 + "treeIndex": 907 }, { "value": ["0xd70559c1A3EA4b435B8b592345Fc4676bAd69543", "1"], - "treeIndex": 849 + "treeIndex": 929 }, { "value": ["0xec17faa8f8bf4f43a62f7ba2b89f162973f07d66", "1"], - "treeIndex": 717 + "treeIndex": 786 }, { "value": ["0x240795B0A85A4508D4dEDfF3D12A42368d157BA0", "1"], - "treeIndex": 796 + "treeIndex": 872 }, { "value": ["0x39ED71268D7596D58Ba4969ed1cB8ff43Bfe373C", "1"], - "treeIndex": 630 + "treeIndex": 688 }, { "value": ["0x6dDcBC9544954dd52B28e83Bb3Ec1c02d5787146", "1"], - "treeIndex": 819 + "treeIndex": 896 }, { "value": ["0x160aE01BbE3EA103Ab3d63FCFA6D04A4267bc7eb", "1"], - "treeIndex": 945 + "treeIndex": 1033 }, { "value": ["0x27fd40568660de78e7e5eda2ff7c55ff689b9c3e", "1"], - "treeIndex": 887 + "treeIndex": 969 }, { "value": ["0xe60f18fe1c9f5f72c4c823bf672c1c65e48c5996", "1"], - "treeIndex": 964 + "treeIndex": 1053 }, { "value": ["0x7ca6661ae5e93afb6c5b8434dc279bb1553c095a", "1"], - "treeIndex": 1095 + "treeIndex": 1200 }, { "value": ["0x2E437973EEf4a38Bae8De1eCe6FC74B12a65eC7c", "1"], - "treeIndex": 1189 + "treeIndex": 1300 }, { "value": ["0xd87Ba7167329ED47F53b81DC186044D44C2B2e1D", "1"], - "treeIndex": 1150 + "treeIndex": 1256 }, { "value": ["0xF73A1Ef7Fb53Dda5cC475629972F14480a3B2E1d", "1"], - "treeIndex": 950 + "treeIndex": 1039 }, { "value": ["0xDACfcDcbB44692D8223003a42f2832bad1B00359", "1"], - "treeIndex": 1120 + "treeIndex": 1225 }, { "value": ["0x7f2d7d2d81e89d372dee78f5e0e4e526c8635715", "1"], - "treeIndex": 854 + "treeIndex": 934 }, { "value": ["0xd778651EAf49AFb2dD334CC157eeD34d357b8733", "1"], - "treeIndex": 1010 + "treeIndex": 1104 }, { "value": ["0x770e53470BBE7a03d19471a58Ad98D5Ba0388B01", "1"], - "treeIndex": 662 + "treeIndex": 723 }, { "value": ["0xa9d3c061dcbfacfe8a52b8093c89267614f0d0bf", "1"], - "treeIndex": 1136 + "treeIndex": 1241 }, { "value": ["0xC9770cd0D9431F3250177Da2757f02864A87ff88", "1"], - "treeIndex": 978 + "treeIndex": 1069 }, { "value": ["0x5a5c3318281c29eef99179f2b613c00b0fa393f5", "1"], - "treeIndex": 792 + "treeIndex": 868 }, { "value": ["0xc025D7026fDDe8ACBe8f2DA4F7F338bbA95BC0FD", "1"], - "treeIndex": 775 + "treeIndex": 850 }, { "value": ["0x57e29fd91a1fab03942ac1389d9b0ca16fb8026C", "1"], - "treeIndex": 708 + "treeIndex": 775 }, { "value": ["0x3DE5Ee31a5116f24dd3CCB9745c187471FBB8cf6", "1"], - "treeIndex": 726 + "treeIndex": 795 }, { "value": ["0x47d761f841a450c275618c87eb5b75db69661d8d", "1"], - "treeIndex": 838 + "treeIndex": 917 }, { "value": ["0xED334EC7B60C15ddbB3B1200864768eB449A1a6E", "1"], - "treeIndex": 616 + "treeIndex": 673 }, { "value": ["0xebfC0724D2D891326492e87500A931895D4758bd", "1"], - "treeIndex": 977 + "treeIndex": 1068 }, { "value": ["0x20d673a33fb82C4ceaf1F91e76C1720DDA7ca931", "1"], - "treeIndex": 931 + "treeIndex": 1017 }, { "value": ["0x3fc0f10029b113a187c5817d35de0f3de2a39ebc", "1"], - "treeIndex": 665 + "treeIndex": 727 }, { "value": ["0xFED66c4c0C79d0ACE410c44c619a1cDbFf931e65", "1"], - "treeIndex": 799 + "treeIndex": 875 }, { "value": ["0x18b420Da3D0e4e9c5da1D207561823715C232079", "1"], - "treeIndex": 695 + "treeIndex": 760 }, { "value": ["0x99F11237a5CAeb22C44dB6063f18c9BBF370291E", "1"], - "treeIndex": 937 + "treeIndex": 1023 }, { "value": ["0x3219f17138320805Cb6C17555BbEbB54F8ADb4BE", "1"], - "treeIndex": 1159 + "treeIndex": 1267 }, { "value": ["0x463d90025d31da9d1fd0eb51669edeb2a68b0b1e", "1"], - "treeIndex": 994 + "treeIndex": 1087 }, { "value": ["0x27deE0791881deE7c4e2A5F49Fdc6ed4cF7DDF7d", "1"], - "treeIndex": 910 + "treeIndex": 993 }, { "value": ["0x94d09d1c74763807149746e9bd265721e6527946", "1"], - "treeIndex": 936 + "treeIndex": 1022 }, { "value": ["0xA3875cF5d001458C1E2F516c98f2994981ED69Fa", "1"], - "treeIndex": 853 + "treeIndex": 933 }, { "value": ["0xb147eacaf85d77f68e30be6090e67851d084e3c7", "1"], - "treeIndex": 1004 + "treeIndex": 1098 }, { "value": ["0x2FAf55a544c5F73666438BC185aeCC9D685E6E3C", "1"], - "treeIndex": 993 + "treeIndex": 1086 }, { "value": ["0x00A9E0A913b40975b3b30F7e196a9d159E1a1e49", "1"], - "treeIndex": 735 + "treeIndex": 806 }, { "value": ["0x486a2acA683807CDeB4AA73d4Cf94eADC7A9ac13", "1"], - "treeIndex": 1107 + "treeIndex": 1212 }, { "value": ["0xF53F564D7c1ac2875D9bA48aD643C249EcaB3877", "1"], - "treeIndex": 1097 + "treeIndex": 1202 }, { "value": ["0x8dF1379C5661071928576E8136f055DA9610619f", "1"], - "treeIndex": 778 + "treeIndex": 853 }, { "value": ["0x266a78d3c6ee02ac304fef8171d46d145d939b48", "1"], - "treeIndex": 823 + "treeIndex": 900 }, { "value": ["0x23f79785487112f9323673d1e6127340a4b3ea20", "1"], - "treeIndex": 1102 + "treeIndex": 1207 }, { "value": ["0xa52d736277e174973626f92a65e12ca193aaf4fb", "1"], - "treeIndex": 979 + "treeIndex": 1070 }, { "value": ["0xe080aaffbfeca6108c1cb6e5f74dfe399843fb09", "1"], - "treeIndex": 976 + "treeIndex": 1066 }, { "value": ["0xe614436af4dce18bb711a46a1eb88c9bd6752f90", "1"], - "treeIndex": 683 + "treeIndex": 746 }, { "value": ["0x74A4Db35E431a6f8371C0Fbabe1dD029cB762Bc8", "1"], - "treeIndex": 1138 + "treeIndex": 1243 }, { "value": ["0x665d7f0b9521141b2d4F7929dd83C14123eF5050", "1"], - "treeIndex": 1089 + "treeIndex": 1194 }, { "value": ["0x53cD242585F72EDD4C92ED3dC4A944AAdACCE413", "1"], - "treeIndex": 651 + "treeIndex": 710 }, { "value": ["0x6aD23fA82Bc63b680F06823E36605Dfe9D828FA6", "1"], - "treeIndex": 972 + "treeIndex": 1061 }, { "value": ["0xB413f9647FcDd43bF272aDa2512262D217502396", "1"], - "treeIndex": 1025 + "treeIndex": 1119 }, { "value": ["0xe538fa7f300ac3d54f272d26aea43412fd15d013", "1"], - "treeIndex": 744 + "treeIndex": 815 }, { "value": ["0x84df46fbcba64a85941730f714cb5d6f55872b78", "1"], - "treeIndex": 1061 + "treeIndex": 1163 }, { "value": ["0xD62B71294BC545606c09dA4D070785E9e135269B", "1"], - "treeIndex": 840 + "treeIndex": 919 }, { "value": ["0x1E1667F16F725d7fCBFFa707e7E576fc64249902", "1"], - "treeIndex": 1027 + "treeIndex": 1123 }, { "value": ["0xDa6d0eB80629053cb3dc655925f6d73adA09D3c5", "1"], - "treeIndex": 664 + "treeIndex": 726 }, { "value": ["0x1a8eb494c2ceb2241c1572e663ff23211dedf8fc", "1"], - "treeIndex": 627 + "treeIndex": 685 }, { "value": ["0x149569a5e5eff2e7a39ef384bc62fb932cc053fd", "1"], - "treeIndex": 895 + "treeIndex": 978 }, { "value": ["0xb4eE750690b58204Bfe53bc2A6E0f77EC36DEC79", "1"], - "treeIndex": 657 + "treeIndex": 718 }, { "value": ["0x82c6d9ca5c2dca7bd454bc9b45d88212de5037cd", "1"], - "treeIndex": 1143 + "treeIndex": 1249 }, { "value": ["0x130cb2e9645c583e806b5dd2deb061b7f1dc38a3", "1"], - "treeIndex": 615 + "treeIndex": 672 }, { "value": ["0x74d6afbe4126ad32b57924cc030adae9596dab91", "1"], - "treeIndex": 691 + "treeIndex": 755 }, { "value": ["0x53E5c026413AED0a1a82F0cEBDe54De3288cFDE9", "1"], - "treeIndex": 1026 + "treeIndex": 1122 }, { "value": ["0x61af296ef49ac27c25521dd793156837cdfaa472", "1"], - "treeIndex": 693 + "treeIndex": 757 }, { "value": ["0x912123352931671e709Ba3DC036c17251Aca7d26", "1"], - "treeIndex": 846 + "treeIndex": 925 }, { "value": ["0xd2C41cC04EB699bE26546FcbB74815bd68283A6d", "1"], - "treeIndex": 1202 + "treeIndex": 1313 }, { "value": ["0x3bc2bCde4F0c6875Ae591cf6e8365688E90134a0", "1"], - "treeIndex": 736 + "treeIndex": 807 }, { "value": ["0x031c3f0a76308dd054acd484b790c2383ee6d1cc", "1"], - "treeIndex": 968 + "treeIndex": 1057 }, { "value": ["0x3a3e6bb88266bd06d935811ba1ae3520eafd0f6a", "1"], - "treeIndex": 628 + "treeIndex": 686 }, { "value": ["0x3913ecc1c8e2a97a34f51efbccaab5848081cdcd", "1"], - "treeIndex": 756 + "treeIndex": 829 }, { "value": ["0xDa186dB644Da3446BCF81F9c8e28108249B767BA", "1"], - "treeIndex": 1129 + "treeIndex": 1234 }, { "value": ["0x9B58A215A2F99Cb89B707764cC38Ae95AE6eC01c", "1"], - "treeIndex": 709 + "treeIndex": 776 }, { "value": ["0x63a27217100a2c1c9df370Dbf65E97fE2795344B", "1"], - "treeIndex": 899 + "treeIndex": 982 }, { "value": ["0x407ebda1e27fe0b68636266ef2edbdb45e2ee484", "1"], - "treeIndex": 857 + "treeIndex": 937 }, { "value": ["0xC77c6bf8AB14BB3C391b39AC505e2151cD4b489C", "1"], - "treeIndex": 698 + "treeIndex": 765 }, { "value": ["0xc901a6ee755047F254Cfb2cb0779dEd5395E348d", "1"], - "treeIndex": 769 + "treeIndex": 843 }, { "value": ["0xa4779581661e27A59Fe6444ed4473e72c5dB8f0F", "1"], - "treeIndex": 924 + "treeIndex": 1008 }, { "value": ["0xC0f8C3EC1b30933A7b7e7dF4Dfa49324b9598eA9", "1"], - "treeIndex": 779 + "treeIndex": 854 }, { "value": ["0x2F01FF5975700cecF113D9bAFCa3f2409BFf4d24", "1"], - "treeIndex": 703 + "treeIndex": 770 }, { "value": ["0x995995c6FE5559ec36292F2e730618dF19f8c5A9", "1"], - "treeIndex": 886 + "treeIndex": 968 }, { "value": ["0xBCa32127AccBeb924490780B82080c54ee15AaC0", "1"], - "treeIndex": 961 + "treeIndex": 1050 }, { "value": ["0xf605eEE0Ec810eA5084f9E6B6E3994F1293F2540", "1"], - "treeIndex": 741 + "treeIndex": 812 }, { "value": ["0x014682decc5226cdaa86b9108906fbf56f533d37", "1"], - "treeIndex": 920 + "treeIndex": 1003 }, { "value": ["0x1BfEf10693Dd39A78afD9C90aD9b16A779C4E538", "1"], - "treeIndex": 646 + "treeIndex": 705 }, { "value": ["0xcfb9a538a87c107f579fbbdca184c4e7831fd506", "1"], - "treeIndex": 755 + "treeIndex": 828 }, { "value": ["0xe81b6cBB6ED71C731e16E132b92F117C96F072D2", "1"], - "treeIndex": 1065 + "treeIndex": 1167 }, { "value": ["0x52901c7a466D769Db350a3714d9A8CE1CbBf27Cb", "1"], - "treeIndex": 815 + "treeIndex": 892 }, { "value": ["0x198c34Ab14bBc8312E5A35f6A3f95B5687370B7a", "1"], - "treeIndex": 929 + "treeIndex": 1013 }, { "value": ["0x281e3d092ece1667141dc6f4f45ce0f72fc81b3c", "1"], - "treeIndex": 1057 + "treeIndex": 1158 }, { "value": ["0x7138483eb4EF5952D53A258F18fd88a6abAd775d", "1"], - "treeIndex": 1176 + "treeIndex": 1285 }, { "value": ["0x1a67dce1adF3f4c6a13c7d75447b5D04840E0Fa5", "1"], - "treeIndex": 903 + "treeIndex": 986 }, { "value": ["0x24Bea75f0423eDfc9dc780804b9c9A2FB787c85c", "1"], - "treeIndex": 996 + "treeIndex": 1089 }, { "value": ["0x8821612d27a1C6A958a9D6b131BFa8Dd1CA4fc34", "1"], - "treeIndex": 1014 + "treeIndex": 1108 }, { "value": ["0x1fc9efDE651191f61711127ae1f427656105304A", "1"], - "treeIndex": 1005 + "treeIndex": 1099 }, { "value": ["0xc196829c7Ce846b82b40eAa8b5bb31e8D6Dde224", "1"], - "treeIndex": 1046 + "treeIndex": 1146 }, { "value": ["0xb37f40e20E8Db2818ecee0ecDbD48Ef6c88794F0", "1"], - "treeIndex": 906 + "treeIndex": 989 }, { "value": ["0x339a4bF2969ff548AfBdeFd8Fb21aADE69bc97e0", "1"], - "treeIndex": 1074 + "treeIndex": 1177 }, { "value": ["0x69AbA62e098D8215d1e662b57eEC4CC6059DEA73", "1"], - "treeIndex": 1007 + "treeIndex": 1101 }, { "value": ["0x111bB5a704305Da4D3E980d6211badb1Fc064012", "1"], - "treeIndex": 986 + "treeIndex": 1078 }, { "value": ["0xBAcB35A7f1E19b3E4A40d6b333900839a9447594", "1"], - "treeIndex": 973 + "treeIndex": 1062 }, { "value": ["0x66d67e220c61df5836da18d55f4f595ac7514792", "1"], - "treeIndex": 697 + "treeIndex": 763 }, { "value": ["0x08C08EDC97fCA5d1BAdeDE6e2776A6Bba58f427f", "1"], - "treeIndex": 893 + "treeIndex": 975 }, { "value": ["0xF82b8318fbE5048ecc4a6F3FA601ce0079671933", "1"], - "treeIndex": 1194 + "treeIndex": 1305 }, { "value": ["0xb911960B52FaEf62e9b10dE3B8efFb8e3C5E5D53", "1"], - "treeIndex": 1156 + "treeIndex": 1262 }, { "value": ["0x341e1B44c08AD9309Ea3F582940A15961357Dc80", "1"], - "treeIndex": 1003 + "treeIndex": 1097 }, { "value": ["0x5730dad2a5f35683ce208ba923631d3a99ac9720", "1"], - "treeIndex": 772 + "treeIndex": 846 }, { "value": ["0x0baB49313f18F2869Bf89b89C7Dd536efeBFd85B", "1"], - "treeIndex": 802 + "treeIndex": 878 }, { "value": ["0x9128c2390659a1b8248f1cb7880ea4b80b197bdb", "1"], - "treeIndex": 800 + "treeIndex": 876 }, { "value": ["0xd848670974109D0122fd2eC492C3783F2ABc157D", "1"], - "treeIndex": 1123 + "treeIndex": 1229 }, { "value": ["0x517A4551c6B2E906DEdC2AD9Da11B9888FDAe4ba", "1"], - "treeIndex": 1079 + "treeIndex": 1183 }, { "value": ["0x65D8EbAA463bA8774C3a39ed4E87218A7532EB04", "1"], - "treeIndex": 719 + "treeIndex": 788 }, { "value": ["0x7494Acaf0a5957281Bbf6D6ae4F97e3FAfce8F92", "1"], - "treeIndex": 1047 + "treeIndex": 1147 }, { "value": ["0x882A4163961D707EfDD75B54dACA7Bf93288C001", "1"], - "treeIndex": 1195 + "treeIndex": 1306 }, { "value": ["0xBe701BE8123D9AAd7206c04D6408985DA1271223", "1"], - "treeIndex": 1187 + "treeIndex": 1298 }, { "value": ["0x20f86bCC7158d26daBFbCB4D2aD31623CDcB053c", "1"], - "treeIndex": 1103 + "treeIndex": 1208 }, { "value": ["0x264DaB3DFC4e6d425AD1DE5085eB807DdBa51Adb", "1"], - "treeIndex": 1155 + "treeIndex": 1261 }, { "value": ["0xa6D4FA2682B60b8f2eE12937ec70ac26e722D3f3", "1"], - "treeIndex": 949 + "treeIndex": 1038 }, { "value": ["0x0fFE1E2FE7BE75Ce9312AD20538eE2D92720d00D", "1"], - "treeIndex": 911 + "treeIndex": 994 }, { "value": ["0x5d20384C0BfE0BF2081aC51733871f7bF9123E34", "1"], - "treeIndex": 1059 + "treeIndex": 1161 }, { "value": ["0x485f09Ef9fB22a1CAF961Fc5405BD5B2e28ef6A3", "1"], - "treeIndex": 696 + "treeIndex": 762 }, { "value": ["0x7D0777892bb92E40DbDA17742ce0ddd5c1f657c0", "1"], - "treeIndex": 762 + "treeIndex": 835 }, { "value": ["0xC29aeBfebF30cBA49EDaf6CC16611b1fEfB95Cb3", "1"], - "treeIndex": 1022 + "treeIndex": 1116 }, { "value": ["0xEcb9EaC7D2B1ff58D2629467CabEcc8A81EE2531", "1"], - "treeIndex": 1018 + "treeIndex": 1112 }, { "value": ["0x14bE0fcB885A9aA367832406EA6759Db5223502F", "1"], - "treeIndex": 680 + "treeIndex": 743 }, { "value": ["0xc7eD41223d0468D814eFC8424F85D706f9d19d2D", "1"], - "treeIndex": 990 + "treeIndex": 1083 }, { "value": ["0xD685Da88Eab2FD3055ac03CD1984D8307Bb997cF", "1"], - "treeIndex": 1199 + "treeIndex": 1310 }, { "value": ["0xFde0Cea93881bC1cE9F0e4f44b79C60b76095316", "1"], - "treeIndex": 808 + "treeIndex": 885 }, { "value": ["0xf6144e1FAFfcccF7060EbA3856394eB2FcA84adc", "1"], - "treeIndex": 1118 + "treeIndex": 1223 }, { "value": ["0x870928863E80eB02e3060dffe05533dEa0a5d8F9", "1"], - "treeIndex": 883 + "treeIndex": 965 }, { "value": ["0xc7170C41CeaEdE926801ae60160777954b5c6836", "1"], - "treeIndex": 824 + "treeIndex": 901 }, { "value": ["0x8921F59Bab0052dEaeE29CCD4D9Ab808ebe499aE", "1"], - "treeIndex": 623 + "treeIndex": 681 }, { "value": ["0x7F2a4c5cce3a5ca00aEa9E81b8e156Ae08Fe3118", "1"], - "treeIndex": 930 + "treeIndex": 1015 }, { "value": ["0xAc43F908718C7bf08eca3490245dcae0aE3d34e8", "1"], - "treeIndex": 1197 + "treeIndex": 1308 }, { "value": ["0x11F83D90aF5b5E3a0740731D7926Ad27803fe220", "1"], - "treeIndex": 768 + "treeIndex": 842 }, { "value": ["0x0C6D7f0beF79fED15a949501b2e6CbE6E9B515A8", "1"], - "treeIndex": 710 + "treeIndex": 777 }, { "value": ["0x587080976e19355a4a57fe306cfe7688573ba8ec", "1"], - "treeIndex": 786 + "treeIndex": 862 }, { "value": ["0x7626a3cbc934fcf8fc957788c6482e3683868254", "1"], - "treeIndex": 1128 + "treeIndex": 1233 }, { "value": ["0xC47AC2f3D5F0bC244e48B7626B1c235f4FDBfE06", "1"], - "treeIndex": 1070 + "treeIndex": 1173 }, { "value": ["0xf9BA8D882B49d7c4bF67FDFC2D8564713E85945b", "1"], - "treeIndex": 1032 + "treeIndex": 1128 }, { "value": ["0xE3976729E8a80E9BEBf3c90ac708A203F4cAD84d", "1"], - "treeIndex": 915 + "treeIndex": 998 }, { "value": ["0x4e9f38742351f19b41603963231f015c2501a5a3", "1"], - "treeIndex": 959 + "treeIndex": 1048 }, { "value": ["0x02A8c10f6C39A63Cae8c0e984BAaC0427914481A", "1"], - "treeIndex": 1045 + "treeIndex": 1144 }, { "value": ["0xB53D86CAE1dE6c8CDaDD4A59559317C4c98657E0", "1"], - "treeIndex": 1043 + "treeIndex": 1142 }, { "value": ["0x2A184B7aECaBD4d92a26CF4d989558559661c306", "1"], - "treeIndex": 821 + "treeIndex": 898 }, { "value": ["0x73254cC8f2fe472ef81B53A92dEd4293F63D5AB4", "1"], - "treeIndex": 659 + "treeIndex": 720 }, { "value": ["0x447024B90D9cdcd3A33C05b4512490a823e85ebf", "1"], - "treeIndex": 1015 + "treeIndex": 1109 }, { "value": ["0x5AE1980Fffd8444be97e5Aa4b46b49D11be2b7B6", "1"], - "treeIndex": 948 + "treeIndex": 1036 }, { "value": ["0xD3366317a4Fe27bA0100B48659e05969811bD2dB", "1"], - "treeIndex": 806 + "treeIndex": 883 }, { "value": ["0x7F33aea3786D88AEE80701AF7e1B7d6F074d3C60", "1"], - "treeIndex": 1106 + "treeIndex": 1211 }, { "value": ["0x7989cf8798581BA46d4D0572405A0Adb1a2d0999", "1"], - "treeIndex": 685 + "treeIndex": 749 }, { "value": ["0x9ea4b029404D4B957984b568Bbc07b4a3b98F2b3", "1"], - "treeIndex": 1093 + "treeIndex": 1198 }, { "value": ["0xCEe7540737e33763DC9F929714C48d60c08348b7", "1"], - "treeIndex": 832 + "treeIndex": 910 }, { "value": ["0xe308023816491913f15e3502C8073098687a2417", "1"], - "treeIndex": 837 + "treeIndex": 916 }, { "value": ["0x25bB6CA37385DF923Dc1998D9E944ddD9e259C98", "1"], - "treeIndex": 654 + "treeIndex": 714 }, { "value": ["0x9d4928eB2580077017484B673ceb2c5E9fCB4549", "1"], - "treeIndex": 888 + "treeIndex": 970 }, { "value": ["0x892bb2CDA62B23a728102139aA27Dd9f09D99197", "1"], - "treeIndex": 954 + "treeIndex": 1043 }, { "value": ["0x7425fdd976742c1D64F897Fb10c9bA5711E4839d", "1"], - "treeIndex": 742 + "treeIndex": 813 }, { "value": ["0x3d25156E75208710117D37Cd448Fb5bff3614E62", "1"], - "treeIndex": 897 + "treeIndex": 980 }, { "value": ["0x991f45376EC0c30679f31deedfAB965be61eE0aF", "1"], - "treeIndex": 1137 + "treeIndex": 1242 }, { "value": ["0x248ae56b53B86d4F1C0F3ecEebb0818E886b9e4d", "1"], - "treeIndex": 1122 + "treeIndex": 1228 }, { "value": ["0x5CA4E238464C839142DE88434544af58a63c3FE2", "1"], - "treeIndex": 1063 + "treeIndex": 1165 }, { "value": ["0x87b5602E9f7e932Fa1F3c2982e9eC1681d6675cA", "1"], - "treeIndex": 1085 + "treeIndex": 1190 }, { "value": ["0x1464bBf08282A9FE94EE0136178FAA04F283ACB8", "1"], - "treeIndex": 676 + "treeIndex": 738 }, { "value": ["0xBdc5434D53E17b596cb7FaDB1f4edA76f2a0ba0C", "1"], - "treeIndex": 631 + "treeIndex": 689 }, { "value": ["0xfaF013dC4e217241Fc0719eCE977EAD89A8AFDC2", "1"], - "treeIndex": 861 + "treeIndex": 941 }, { "value": ["0xD77D0aA1f1Ab7042eacB6b1e3d48f7607fDdc446", "1"], - "treeIndex": 803 + "treeIndex": 880 }, { "value": ["0x1742C82B2C7c060E5cACd2389F31936C8ab4faED", "1"], - "treeIndex": 1212 + "treeIndex": 1324 }, { "value": ["0x5B317bE1872A5FA11b1ebBC07065516E4FAaef03", "1"], - "treeIndex": 1147 + "treeIndex": 1253 }, { "value": ["0x4Bc3DcB08e12eF4E9c38A9c01aCe15F641b05886", "1"], - "treeIndex": 635 + "treeIndex": 693 }, { "value": ["0xe41e23bBc314B153908cE6b09824d3e3eFE9A2e3", "1"], - "treeIndex": 951 + "treeIndex": 1040 }, { "value": ["0xA5A8cc6642d3075262196467C9CB676e9f3683C6", "1"], - "treeIndex": 618 + "treeIndex": 675 }, { "value": ["0xe2f6D1ceE169B8B90494e551DDaAf8A3d0C4Ccb6", "1"], - "treeIndex": 1104 + "treeIndex": 1209 }, { "value": ["0xCBC3A31a951F4c91D3B5792c2Adc57641cFf633c", "1"], - "treeIndex": 764 + "treeIndex": 837 }, { "value": ["0x072F145971fa65217ABF340A201b795Bf99Fa665", "1"], - "treeIndex": 782 + "treeIndex": 857 }, { "value": ["0x6F0BF88779e02959Fc80d1e73A80DC832EEC4688", "1"], - "treeIndex": 877 + "treeIndex": 959 }, { "value": ["0x48985340229bfCFab86b0C5De1F5Eed91cc551A1", "1"], - "treeIndex": 1030 + "treeIndex": 1126 }, { "value": ["0xc64550ef5f1781e8c497a548e53b44589603E78D", "1"], - "treeIndex": 1028 + "treeIndex": 1124 }, { "value": ["0xd9fd327df84bb551e3f359f23c405e7f79cc4c34", "1"], - "treeIndex": 740 + "treeIndex": 811 }, { "value": ["0x8e1ec2d3b0c006d234190a212704b6e85d623efa", "1"], - "treeIndex": 722 + "treeIndex": 791 }, { "value": ["0x0183349f7d059D53d69033652EBe921d8B05D7E1", "1"], - "treeIndex": 684 + "treeIndex": 748 }, { "value": ["0x7D73bc3fB04F20d58DE526105684BD9D7D1A0BDf", "1"], - "treeIndex": 1166 + "treeIndex": 1274 }, { "value": ["0xCf1ed754F6853b0840b8575c174dbdCd51909D0a", "1"], - "treeIndex": 753 + "treeIndex": 824 }, { "value": ["0x4a0834a733638fef294ea2bb241d3888cf715cfc", "1"], - "treeIndex": 1214 + "treeIndex": 1326 }, { "value": ["0xEA2d1fF3e5F524B080cc609226b019F091113554", "1"], - "treeIndex": 790 + "treeIndex": 866 }, { "value": ["0x86Baf5f5Ee5696BCc71aBb93751d6e3D46Ea47f4", "1"], - "treeIndex": 812 + "treeIndex": 889 }, { "value": ["0x1E56aAaD2661540bEB5dcc92b4BeDaD8975D80C0", "1"], - "treeIndex": 687 + "treeIndex": 751 }, { "value": ["0xf5de2dde6a9694ba171d3760b448e89e7050dfa9", "1"], - "treeIndex": 1100 + "treeIndex": 1205 }, { "value": ["0x86727defBEd7bCFb2F93bAb3d8aD23624e2B0F22", "1"], - "treeIndex": 1024 + "treeIndex": 1118 }, { "value": ["0xD990618a8bB5a80AB37247f8615e393FA23648f4", "1"], - "treeIndex": 1053 + "treeIndex": 1154 }, { "value": ["0x3c777f983158e6ad5ef7a937508c08f8a712c251", "1"], - "treeIndex": 1054 + "treeIndex": 1155 }, { "value": ["0xb07c3607eA7e0bc8f591331D19Cf08804c7b82Df", "1"], - "treeIndex": 1198 + "treeIndex": 1309 }, { "value": ["0x19b58151c2a9edb6164ddf69fa96f9b106f47df4", "1"], - "treeIndex": 656 + "treeIndex": 717 }, { "value": ["0x1672Bc8d5E342048A4B3cd2a5038069414Fa95b3", "1"], - "treeIndex": 904 + "treeIndex": 987 }, { "value": ["0xB6acA8CAa4147ad88FCD05f5F15A2083e192C4ab", "1"], - "treeIndex": 1094 + "treeIndex": 1199 }, { "value": ["0x3ba9ba5b405ccfb85c7c16e929a4f81aec65f318", "1"], - "treeIndex": 1127 + "treeIndex": 1232 }, { "value": ["0xaF28D9A215884b5E0F7c68709877FC205E335BD9", "1"], - "treeIndex": 905 + "treeIndex": 988 }, { "value": ["0x3f71EaccdFdFbEa79c3f357dfb0Db53aaAE3f712", "1"], - "treeIndex": 705 + "treeIndex": 772 }, { "value": ["0x00700406274a017375C465D27F24CCBD51eA3A53", "1"], - "treeIndex": 1115 + "treeIndex": 1220 }, { "value": ["0xfDE0F525D7d029E646F011b87FD0a105f80fD347", "1"], - "treeIndex": 622 + "treeIndex": 680 }, { "value": ["0xA6B6f3f5A880F09aC536af2DFF08D93534ff7930", "1"], - "treeIndex": 686 + "treeIndex": 750 }, { "value": ["0x801D678688C0B5A3eCAa4b06bE2b56ff57E309A6", "1"], - "treeIndex": 1105 + "treeIndex": 1210 }, { "value": ["0x85132deace772ec40b2326da69cce771853cc2f8", "1"], - "treeIndex": 660 + "treeIndex": 721 }, { "value": ["0xd7D26c106285ACA2419F4f9CCFdafa3C765C1c2d", "1"], - "treeIndex": 1158 + "treeIndex": 1266 }, { "value": ["0xe90286618AB09067354139f478eFc0FC874da50e", "1"], - "treeIndex": 810 + "treeIndex": 887 }, { "value": ["0x9D5dC516331Dee44d16a0EDcE1A8206937163D2B", "1"], - "treeIndex": 776 + "treeIndex": 851 }, { "value": ["0x478eDd1F3bd4559B407B8528e1D2166e9627A891", "1"], - "treeIndex": 1066 + "treeIndex": 1168 }, { "value": ["0x74fa7F91Ea3B290Ca00B049F0D048a816B3443cC", "1"], - "treeIndex": 1019 + "treeIndex": 1113 }, { "value": ["0x9505e4f134548dc577edab5aab870ebb8fd2ab26", "1"], - "treeIndex": 667 + "treeIndex": 729 }, { "value": ["0x3FE46d8b26d8084ABCc723FA12b91C13aef21190", "1"], - "treeIndex": 1171 + "treeIndex": 1279 }, { "value": ["0xd4c210871fd8912bdc080b47ef644849f6163d11", "1"], - "treeIndex": 1006 + "treeIndex": 1100 }, { "value": ["0x05407A60F9D4556c1c52422A77d6c6Bd8A9c6AcB", "1"], - "treeIndex": 867 + "treeIndex": 947 }, { "value": ["0x0a4896a6abb9e603fda98ac35e3bc34297a2f964", "1"], - "treeIndex": 788 + "treeIndex": 864 }, { "value": ["0xb59A1f04AfF6fCA59729Ed8f4f534591382c43eb", "1"], - "treeIndex": 1058 + "treeIndex": 1160 }, { "value": ["0xbAa3295A3351DE503c13E6d6cF00396eBE1DD5d9", "1"], - "treeIndex": 962 + "treeIndex": 1051 }, { "value": ["0xb180a132d8c64c88501f2946ae93b311052e067e", "1"], - "treeIndex": 1082 + "treeIndex": 1187 }, { "value": ["0x43ef7d83943448f3c2dd9cc325b0a949f19a3e4b", "1"], - "treeIndex": 629 + "treeIndex": 687 }, { "value": ["0x1E922DB639CA197014cbd9a815F3D706Bf962eAb", "1"], - "treeIndex": 1048 + "treeIndex": 1149 }, { "value": ["0x7412b20a5B15948954a3de1CaEdD5806AAf9aDA7", "1"], - "treeIndex": 1130 + "treeIndex": 1235 }, { "value": ["0x4d844c3B736916808E1Eff456e4949E376963a28", "1"], - "treeIndex": 913 + "treeIndex": 996 }, { "value": ["0x133dCbdE39418Cff99d10dC3a1515878aBfe4A44", "1"], - "treeIndex": 689 + "treeIndex": 753 }, { "value": ["0x593a10fc2bc453fee3adbbe989e8be43967afde4", "1"], - "treeIndex": 956 + "treeIndex": 1045 }, { "value": ["0x799179D0Ed9b2715BdF377Ca67Dc11706a23f03a", "1"], - "treeIndex": 1206 + "treeIndex": 1317 }, { "value": ["0xAE3f01c727a685bB7c03722fDA4a3ef306B1C0b4", "1"], - "treeIndex": 1148 + "treeIndex": 1254 }, { "value": ["0x6Eee3b6b9DB311D9F1435Ae28A507a940398b75C", "1"], - "treeIndex": 1101 + "treeIndex": 1206 }, { "value": ["0x24D811AC39b0fD7037e1D501e5f0605CE37B2bb1", "1"], - "treeIndex": 865 + "treeIndex": 945 }, { "value": ["0xaCDEcf79986Db9d509e4F3FF6D55EBa2f4acBcb0", "1"], - "treeIndex": 984 + "treeIndex": 1076 }, { "value": ["0xfB6E3BadA09A320676cE37056A6FD1390a19Fc9c", "1"], - "treeIndex": 946 + "treeIndex": 1034 }, { "value": ["0xb1e745e9a67be8ceee1864558e7608021a5ba4e0", "1"], - "treeIndex": 835 + "treeIndex": 914 }, { "value": ["0x3e5e34DEAFC39FF2D08a523C3fCC47065dc784CB", "1"], - "treeIndex": 1111 + "treeIndex": 1216 }, { "value": ["0xd861bC853dDFFCF938cA385caeae4131b16B103a", "1"], - "treeIndex": 859 + "treeIndex": 939 }, { "value": ["0x508D0ed6273F83C1D442C89C8935C4c11Ad4f6d9", "1"], - "treeIndex": 611 + "treeIndex": 668 }, { "value": ["0x577781dDaeC287623273c38f459840b279cF323e", "1"], - "treeIndex": 785 + "treeIndex": 861 }, { "value": ["0x0eF696B2Da7e7c6A3113681ce57344B66BBCF559", "1"], - "treeIndex": 1125 + "treeIndex": 1231 }, { "value": ["0xec2b42a2b501e9b8f639d2b4e17f0e5166035155", "1"], - "treeIndex": 661 + "treeIndex": 722 }, { "value": ["0x408983424Bf7B5bE6e12bb731a26F16C8Bd63eBa", "1"], - "treeIndex": 892 + "treeIndex": 974 }, { "value": ["0x583C21200cb1306280CfD38e56786083D956Cb3D", "1"], - "treeIndex": 780 + "treeIndex": 855 }, { "value": ["0x97675d5d3ffd22401b78ba4c0a34faadd2039250", "1"], - "treeIndex": 834 + "treeIndex": 912 }, { "value": ["0x91c3e2E1A43638aD626C4971F343c457E643c9c3", "1"], - "treeIndex": 975 + "treeIndex": 1065 }, { "value": ["0xFFdA83BFD8b8c1EdB0A8A89B255cfe87D01a1d92", "1"], - "treeIndex": 1142 + "treeIndex": 1247 }, { "value": ["0x8b92183A022D4dF72B2834e33c4FB7bd0462CD3E", "1"], - "treeIndex": 748 + "treeIndex": 819 }, { "value": ["0xfa2336eCA18b9BC384144Ad7f29E2137EE0564D1", "1"], - "treeIndex": 679 + "treeIndex": 741 }, { "value": ["0xCB53a818042Db647cb01672751B0E4efCa29cF55", "1"], - "treeIndex": 1177 + "treeIndex": 1286 }, { "value": ["0x054becf10c79afa4e60f75b187837be9fb83867d", "1"], - "treeIndex": 727 + "treeIndex": 796 }, { "value": ["0xf8926A177273202755F9Fa930c96285e612375AC", "1"], - "treeIndex": 912 + "treeIndex": 995 }, { "value": ["0xAbD8Cee5a93265fc7D1F9e45f0169294d01B8802", "1"], - "treeIndex": 851 + "treeIndex": 931 }, { "value": ["0x481b1E34fc679b94E78571dE1369D8EBE4bacDBF", "1"], - "treeIndex": 841 + "treeIndex": 920 }, { "value": ["0x71adD64adBB965Bafd01437295968502eB61145e", "1"], - "treeIndex": 1029 + "treeIndex": 1125 }, { "value": ["0x3D1e10eeC9256f832a46F3f8AdaC60c7a80828B6", "1"], - "treeIndex": 875 + "treeIndex": 957 }, { "value": ["0xad9518b0360f417cd60c172ffa5d7b9a1d6d1ebc", "1"], - "treeIndex": 643 + "treeIndex": 702 }, { "value": ["0x64be8D7B2B598cd2Bb09275bC943C3f663e23fb7", "1"], - "treeIndex": 944 + "treeIndex": 1032 }, { "value": ["0x8FC58267E4b4a4f93e3BE17934db63337676b01d", "1"], - "treeIndex": 729 + "treeIndex": 799 }, { "value": ["0xEc8EDfAe340278B79a9a7Ba58C8f97b36f3739Ef", "1"], - "treeIndex": 715 + "treeIndex": 783 }, { "value": ["0xb6650c5675fdef1498d3965973cd9fe598baf843", "1"], - "treeIndex": 991 + "treeIndex": 1084 }, { "value": ["0x399b6775b25F98fCb0295a42DE85107514E36697", "1"], - "treeIndex": 822 + "treeIndex": 899 }, { "value": ["0x955d73eD63db714829CAFe740123D035854f8ff0", "1"], - "treeIndex": 759 + "treeIndex": 832 }, { "value": ["0xbb3Fa251c16f9d7BB03aD3896547A93391C6F1CF", "1"], - "treeIndex": 862 + "treeIndex": 942 }, { "value": ["0x98b7F918738bE89D2B91cec0d6Ed695888aaB458", "1"], - "treeIndex": 1211 + "treeIndex": 1322 }, { "value": ["0x8be4491ced884d5c6b1667bd4e20b975e079a469", "1"], - "treeIndex": 1135 + "treeIndex": 1240 }, { "value": ["0xd8C860D789Ec1c6aE9631B680E6555F25Bc28331", "1"], - "treeIndex": 974 + "treeIndex": 1063 }, { "value": ["0xD24aB99f90532BC217a12bCD644B96517de3B842", "1"], - "treeIndex": 1188 + "treeIndex": 1299 }, { "value": ["0x07B4cfa4e6d65F7A689390951a4fEA8A6583de92", "1"], - "treeIndex": 839 + "treeIndex": 918 }, { "value": ["0xA6Be47CAfFD637a13FB723C936e6AF495F0c9945", "1"], - "treeIndex": 997 + "treeIndex": 1091 }, { "value": ["0x88a45767F348BC66D9e83ebf8A8ACec7d7e3d24e", "1"], - "treeIndex": 642 + "treeIndex": 701 }, { "value": ["0x43cb33e6f2bada9d359e31d42b7da5ee848100a9", "1"], - "treeIndex": 718 + "treeIndex": 787 }, { "value": ["0xd37f5756D70d826d47DfF516B1021Cc52BeA66B5", "1"], - "treeIndex": 967 + "treeIndex": 1056 }, { "value": ["0xcf991e3f8414a8949967d51550683852d47f88f2", "1"], - "treeIndex": 1068 + "treeIndex": 1171 }, { "value": ["0xB32c7a9D7c57d196628074549767F73280Fa0f23", "1"], - "treeIndex": 987 + "treeIndex": 1079 }, { "value": ["0xd957fcdb8fd06866aa4e2e38c128be655d5eddc0", "1"], - "treeIndex": 1091 + "treeIndex": 1196 }, { "value": ["0x0aa5c17737fa41ec5078032e353497754c520fe0", "1"], - "treeIndex": 917 + "treeIndex": 1000 }, { "value": ["0xc60188ebfcbfc4f0771ad9c2ebc02ed5c58f1aed", "1"], - "treeIndex": 737 + "treeIndex": 808 }, { "value": ["0xa47dcc127bd2487b01477d8e381dced5de5e5033", "1"], - "treeIndex": 1039 + "treeIndex": 1137 }, { "value": ["0x48707199060302639ad0d4bbe9225954326bd007", "1"], - "treeIndex": 752 + "treeIndex": 823 }, { "value": ["0x01b86AEEbCD1Ff94aC1195cFc8FD9e39dB24db45", "1"], - "treeIndex": 1164 + "treeIndex": 1272 }, { "value": ["0xefB1b61DAc569aC6E8A7B860967978976DB4561d", "1"], - "treeIndex": 1044 + "treeIndex": 1143 }, { "value": ["0x63b3b70e0162e19D5239cb1864E2E4eE6C60b61d", "1"], - "treeIndex": 757 + "treeIndex": 830 }, { "value": ["0x8cd11d507defb717a596e381be860ed1331eb516", "1"], - "treeIndex": 1092 + "treeIndex": 1197 }, { "value": ["0x407e138a1c800c469e207b811a2964a3f5cf8853", "1"], - "treeIndex": 955 + "treeIndex": 1044 }, { "value": ["0x658472DA56EB30F30EA001C6896DD5BF3CF23b19", "1"], - "treeIndex": 1067 + "treeIndex": 1170 }, { "value": ["0xa6c885ba8b5b5e69cBC38E8fa5cbceE569777A79", "1"], - "treeIndex": 879 + "treeIndex": 961 }, { "value": ["0xad80ae3a70189ef34bcd8cff931974477d16fb6e", "1"], - "treeIndex": 1209 + "treeIndex": 1320 }, { "value": ["0x68D1BaC05bf08E8c6db979f4b6024cBcB188DE93", "1"], - "treeIndex": 963 + "treeIndex": 1052 }, { "value": ["0x82b4037eB07B81136B0acf8Dd72866C58a60A893", "1"], - "treeIndex": 1141 + "treeIndex": 1246 }, { "value": ["0x334b7950B87166F67d72Ff93e6a9F577B3963938", "1"], - "treeIndex": 1077 + "treeIndex": 1180 }, { "value": ["0x862d3e1185754f98d64912c129f380209e4b14d6", "1"], - "treeIndex": 1012 + "treeIndex": 1106 }, { "value": ["0x42F4dc5707AC046e0E1c606e56d262D7D9A56A57", "1"], - "treeIndex": 1017 + "treeIndex": 1111 }, { "value": ["0x1951164a1cc60BbBe5996922997255A56761CA14", "1"], - "treeIndex": 900 + "treeIndex": 983 }, { "value": ["0x74799311F1BDd1dB053440D91aed281726b76797", "1"], - "treeIndex": 880 + "treeIndex": 962 }, { "value": ["0x68599057d850c6f99b05fe3b2fb6f4900e9596eb", "1"], - "treeIndex": 1011 + "treeIndex": 1105 }, { "value": ["0x60b4dFD79162664307c5CF697e649513D6428cd2", "1"], - "treeIndex": 1008 + "treeIndex": 1102 }, { "value": ["0x26a79FEacb76f2dCC8305C24Cd007a47b48Fb875", "1"], - "treeIndex": 965 + "treeIndex": 1054 }, { "value": ["0x327cD3aeEa33ccf35689687a20c5dB935aa96C89", "1"], - "treeIndex": 833 + "treeIndex": 911 }, { "value": ["0xa7A7a115a827FDEAbb6c0729409d068bD82401FF", "1"], - "treeIndex": 807 + "treeIndex": 884 }, { "value": ["0xc07d659f3e1c727df7bea64e0ddc0c03f7a9c0fb", "1"], - "treeIndex": 855 + "treeIndex": 935 }, { "value": ["0xb6c2b662e4e9388349e7015f2b9b7a2f878d706c", "1"], - "treeIndex": 1153 + "treeIndex": 1259 }, { "value": ["0x43b0506f6b000327153b055c7e630f67be4096b7", "1"], - "treeIndex": 825 + "treeIndex": 902 }, { "value": ["0x00f884b294766d858db5c7cf70a806820a8d15f0", "1"], - "treeIndex": 607 + "treeIndex": 663 }, { "value": ["0x72A363e15676ec9B2Ba00c2f62dBDb8f1B1bd1B2", "1"], - "treeIndex": 1144 + "treeIndex": 1250 }, { "value": ["0x111222965183438ac14042548e20aE48E443f2f9", "1"], - "treeIndex": 1182 + "treeIndex": 1292 }, { "value": ["0xE65F1CCC3Ba766a1436625A408E2358B7d3eC482", "1"], - "treeIndex": 671 + "treeIndex": 733 }, { "value": ["0xbe137fb6a4872fC2c830A56280de3134872bcdE1", "1"], - "treeIndex": 940 + "treeIndex": 1026 }, { "value": ["0xcc72ffa1f471360dc6964fe6b9e2907d7ca55c28", "1"], - "treeIndex": 1134 + "treeIndex": 1239 }, { "value": ["0xb412262d43118a498e7a884b5ac0fa4bfaf8daaa", "1"], - "treeIndex": 721 + "treeIndex": 790 }, { "value": ["0x5cA3A5c09c556a508940b9bFb08c7DaF4d8bcec1", "1"], - "treeIndex": 871 + "treeIndex": 952 }, { "value": ["0x443ff33b53fda8c55d9d9019bb52509dcc24209b", "1"], - "treeIndex": 658 + "treeIndex": 719 }, { "value": ["0x009B64175634D39B1FE81f97270f516544F04307", "1"], - "treeIndex": 1073 + "treeIndex": 1176 }, { "value": ["0x70619d577548faa0E11c1feDa79Bd4347503715D", "1"], - "treeIndex": 1108 + "treeIndex": 1213 }, { "value": ["0x1a84333ad6371f1dac13dcf5477dccce771c7655", "1"], - "treeIndex": 1036 + "treeIndex": 1132 }, { "value": ["0xD3Bd3A596CeEE552D4e81fa9B6Eb2eAF090d03B7", "1"], - "treeIndex": 608 + "treeIndex": 665 }, { "value": ["0x8a10C1906f1Da22FA37B69A8058dB04dBf403089", "1"], - "treeIndex": 889 + "treeIndex": 971 }, { "value": ["0x72c07C4980bFa0995942d375d9092F1f6876ba00", "1"], - "treeIndex": 1072 + "treeIndex": 1175 }, { "value": ["0x10b490cf79f478ff90a994c7a4105af8d73cbc56", "1"], - "treeIndex": 731 + "treeIndex": 801 }, { "value": ["0x55cbfdfe4f98b759944aee681ce63febc03bd4fa", "1"], - "treeIndex": 1042 + "treeIndex": 1140 }, { "value": ["0x9d5fc106ef22538b3cb7f0428cfa04b9a3083151", "1"], - "treeIndex": 745 + "treeIndex": 816 }, { - "value": ["0x53d75D56a7741F94A40A11C68649Ac1401D3563E", "1"], - "treeIndex": 1119 + "value": ["0x3ede3dD0b09Ea347aa120B9813B0730Dd11e8dFB", "1"], + "treeIndex": 785 }, { "value": ["0x627AE166a9491a2D6327db8058065ff7aaF25a1E", "1"], - "treeIndex": 636 + "treeIndex": 694 }, { "value": ["0x2fa14daad079c26cd5293d6bb3de90ef2c637b2a", "1"], - "treeIndex": 882 + "treeIndex": 964 }, { "value": ["0xfbd035252548d095e2184507a8c4ef8fde37ebcf", "1"], - "treeIndex": 843 + "treeIndex": 922 }, { "value": ["0x946c8b755e0f448a09172a7e985e96935954a221", "1"], - "treeIndex": 1001 + "treeIndex": 1095 }, { "value": ["0x959F5C4Fa5b60Fe1Aa99C1C060657d8abBF9C3Bc", "1"], - "treeIndex": 761 + "treeIndex": 834 }, { "value": ["0x3B27515853608532599DE505F4E79b0EbB5e4B56", "1"], - "treeIndex": 725 + "treeIndex": 794 }, { "value": ["0x14d18d87424b73c1a1d91a2759eab88f44fbe32f", "1"], - "treeIndex": 750 + "treeIndex": 821 }, { "value": ["0x9538d52c3682f807f3cd27e1573bcefa8a0d0884", "1"], - "treeIndex": 820 + "treeIndex": 897 }, { "value": ["0x28d81c0660d627083e430497f299edff5cfabe76", "1"], - "treeIndex": 1152 + "treeIndex": 1258 }, { "value": ["0x24897A16C70da3E438083545eFb795aF49AB1f53", "1"], - "treeIndex": 712 + "treeIndex": 780 }, { "value": ["0xad062b56501042d97d2c26def7aff6b5ff966ee9", "1"], - "treeIndex": 650 + "treeIndex": 709 }, { "value": ["0x1e712E83acc07470FBEd55934de94b5DAAEc97f7", "1"], - "treeIndex": 1071 + "treeIndex": 1174 }, { "value": ["0x2a7ddcf6c76331ff70f0c2b4a7a57ca50bd5cb73", "1"], - "treeIndex": 1116 + "treeIndex": 1221 }, { "value": ["0x77Da9d6B211d6AE719D0fE348743065e5532da0c", "1"], - "treeIndex": 1149 + "treeIndex": 1255 }, { "value": ["0xcbb3fbf562a93006eddc83ae86fb6152968abacc", "1"], - "treeIndex": 928 + "treeIndex": 1012 + }, + { + "value": ["0x3Eb73235225F0a4C8e7612ED3C0eb93f947CFE80", "1"], + "treeIndex": 960 }, { "value": ["0xf34bf8635ce2a93f3cd4021e17ffbbb1a5eedd3e", "1"], - "treeIndex": 1170 + "treeIndex": 1278 }, { "value": ["0xd921b08b862a346463024b4cfa201923593033f0", "1"], - "treeIndex": 1139 + "treeIndex": 1244 }, { "value": ["0x51601cdd21bdfe246da02a2645de145c085b7722", "1"], - "treeIndex": 1040 + "treeIndex": 1138 }, { "value": ["0x1a196188342bd1523fe23d41defc459c09190559", "1"], - "treeIndex": 926 + "treeIndex": 1010 }, { "value": ["0x6c02c390ed91d717e1d1da61e85559f3b6251997", "1"], - "treeIndex": 666 + "treeIndex": 728 }, { "value": ["0x8655290Cb24CbD4dD90d0d8EB77404cf2c300d2f", "1"], - "treeIndex": 1088 + "treeIndex": 1193 }, { "value": ["0xF29942f2C6AD54b53Ad536d9A3201aa9D25355bD", "1"], - "treeIndex": 751 + "treeIndex": 822 }, { "value": ["0x46c940ac083b5637b9a27efa6ec81fa7485300c7", "1"], - "treeIndex": 1110 + "treeIndex": 1215 }, { "value": ["0xfbe30bb0dac58e8a10493f0c04f521c96925c29e", "1"], - "treeIndex": 1050 + "treeIndex": 1151 }, { "value": ["0x4591c0d02cb8b7c70a697e5e9d3df2fdb4316961", "1"], - "treeIndex": 1121 + "treeIndex": 1226 }, { "value": ["0xD513aA3cB6B3Ba62b0E7FF1BB86c7b1A409e9C51", "1"], - "treeIndex": 1175 + "treeIndex": 1284 }, { "value": ["0xaeadc04e3c357de9e49d238d7d5628ee30612da7", "1"], - "treeIndex": 1173 + "treeIndex": 1282 }, { "value": ["0x869276ef1fca605ac1b816796dd41ec4a52ec8c8", "1"], - "treeIndex": 934 + "treeIndex": 1020 }, { "value": ["0xa6ee6741836b87571a907de94ef5bcfa8a2b2fbe", "1"], - "treeIndex": 617 + "treeIndex": 674 }, { "value": ["0xf155f68aaefb6607a893fbb870d95fb161adc7a6", "1"], - "treeIndex": 896 + "treeIndex": 979 }, { "value": ["0xCF3Eb886D2EeF460Cb64525EBed7DaE0840044A6", "1"], - "treeIndex": 1192 + "treeIndex": 1303 }, { "value": ["0x59389cb3f680fe74b801b8452c1d1db9f6d68cd2", "1"], - "treeIndex": 677 + "treeIndex": 739 }, { "value": ["0x7559f5d17dd93df1b8bfaae7b5091380392bbbea", "1"], - "treeIndex": 637 + "treeIndex": 695 }, { "value": ["0x70a1c7d12a0f59ca8bc233d50cdc1b16053c4f14", "1"], - "treeIndex": 836 + "treeIndex": 915 }, { "value": ["0xf9aa47a4647398a45a41ced6cac4c8fc8c0f3d9b", "1"], - "treeIndex": 1124 + "treeIndex": 1230 }, { "value": ["0x2c3e1f5e6d4f9072216991b2a684df1ee93033ce", "1"], - "treeIndex": 982 + "treeIndex": 1074 }, { "value": ["0xF08c6cbC8bcd68D5A6Ec8498f911d45a9C8035F9", "1"], - "treeIndex": 713 + "treeIndex": 781 }, { "value": ["0x8A1572d4edD4D28dBe9B0dFA22641Dd26Bb60B96", "1"], - "treeIndex": 970 + "treeIndex": 1059 }, { "value": ["0x425400d9642aeac4e8b88e0447552ffdc6fad752", "1"], - "treeIndex": 826 + "treeIndex": 903 }, { "value": ["0x6c50686cb8024C23F76d723b533110580DC629eE", "1"], - "treeIndex": 767 + "treeIndex": 841 }, { "value": ["0xBD73cF5baf12F120Ee3f6C4ad82df9a12649e578", "1"], - "treeIndex": 1037 + "treeIndex": 1133 }, { "value": ["0x93BBF2b1Ffe750FAD9a83384e6C4fBcA01401B03", "1"], - "treeIndex": 1109 + "treeIndex": 1214 }, { "value": ["0xE712D64e2d9C5280d6cB319B20654859cC06Bb9B", "1"], - "treeIndex": 809 + "treeIndex": 886 }, { "value": ["0x0f8D1999000Fb5093008344B2D73407c9fB71337", "1"], - "treeIndex": 1099 + "treeIndex": 1204 }, { "value": ["0xB80970A96c6B49e1678Aa147Eb83c1aA0a3818b8", "1"], - "treeIndex": 690 + "treeIndex": 754 }, { "value": ["0x8f4EA9ad88DB773e4a086884EBBf0Cf813915D38", "1"], - "treeIndex": 1080 + "treeIndex": 1184 }, { "value": ["0x7b63B3037D37751bb25c067552f44b25Ff453702", "1"], - "treeIndex": 1190 + "treeIndex": 1301 }, { "value": ["0xa9c178D179C2EeD40e60C425d76e354973B3DbBd", "1"], - "treeIndex": 728 + "treeIndex": 798 }, { "value": ["0xb16f17769b03AC0997c100A344E6d81d3Bc1f0C0", "1"], - "treeIndex": 612 + "treeIndex": 669 }, { "value": ["0xE37FdAfE569461fe4998598838b06597D9ADeC21", "1"], - "treeIndex": 813 + "treeIndex": 890 }, { "value": ["0xc8d81C03F98a4656Fe7f3bF32B9A9ee0BD6c8903", "1"], - "treeIndex": 881 + "treeIndex": 963 }, { "value": ["0xE5F87e969D10e2d3Bc497671BAc5729fE9Ab1521", "1"], - "treeIndex": 739 + "treeIndex": 810 }, { "value": ["0x9B61a616d18562D7B667Ed83c8Ad5d9e1B00080E", "1"], - "treeIndex": 621 + "treeIndex": 679 }, { "value": ["0x17ED40E78492538e1A0101CF9d60105b7629C414", "1"], - "treeIndex": 1161 + "treeIndex": 1269 }, { "value": ["0xf9305317843951711c6579C2997C5d8Dc542e6B5", "1"], - "treeIndex": 639 + "treeIndex": 697 }, { "value": ["0xe0b11855eb530c36a323f92e93c299ad93922d0f", "1"], - "treeIndex": 941 + "treeIndex": 1027 }, { "value": ["0x48cc3c16d414f6eb616e78fe0354f1baeb254de9", "1"], - "treeIndex": 985 + "treeIndex": 1077 }, { "value": ["0x6b23333bc26215e88a87489e1021e9f62f5399d1", "1"], - "treeIndex": 610 + "treeIndex": 667 }, { "value": ["0xd777edffaf1eb956159419f087b6666b09be2bac", "1"], - "treeIndex": 868 + "treeIndex": 949 }, { "value": ["0x5bc0cc50aa58a851a7f5ecfb32f0d9cd495cfbf6", "1"], - "treeIndex": 758 + "treeIndex": 831 }, { "value": ["0x7b75bc70b928472856047fdef0d08d5b5816aefd", "1"], - "treeIndex": 669 + "treeIndex": 731 }, { "value": ["0x2c3474bfe64cd9748be69d24c30cc91639265e68", "1"], - "treeIndex": 864 + "treeIndex": 944 }, { "value": ["0xfEBded7dF0b739564Dcb218B4e673f0918528B8d", "1"], - "treeIndex": 791 + "treeIndex": 867 }, { "value": ["0xF08576f40D74A3D0A6f7709a1e3f603DEAc39f05", "1"], - "treeIndex": 943 + "treeIndex": 1030 }, { "value": ["0x97cb91642902ef48709bEcA1236813495FceEB71", "1"], - "treeIndex": 829 + "treeIndex": 906 }, { "value": ["0x26f128ca082cc1C28670000E6274f275723C8f1e", "1"], - "treeIndex": 1167 + "treeIndex": 1275 }, { "value": ["0x381B0A70687c60bffeEa61d2FE1B9B340C506F71", "1"], - "treeIndex": 1052 + "treeIndex": 1153 }, { "value": ["0x6905435fa2e1cB31972bb0F0bFF16F5744A91876", "1"], - "treeIndex": 613 + "treeIndex": 670 }, { "value": ["0xF906D4C20f46AA7b54c79A730332371EF420cc0e", "1"], - "treeIndex": 733 + "treeIndex": 804 }, { "value": ["0x88193fc66f2cab15e03add807d11adc08b5352df", "1"], - "treeIndex": 1023 + "treeIndex": 1117 }, { "value": ["0x41AfDc422831dCCC8505762c75E69da983B83F92", "1"], - "treeIndex": 647 + "treeIndex": 706 }, { "value": ["0xf2177e53db73cdaa0bd15d891d3d3378a4098376", "1"], - "treeIndex": 749 + "treeIndex": 820 }, { "value": ["0x79de94f7db2800b4d8a56fd8a5becef416bbd02b", "1"], - "treeIndex": 852 + "treeIndex": 932 }, { "value": ["0x5743e93ab23a457150724ca18d9a0e35b17cc8fc", "1"], - "treeIndex": 932 + "treeIndex": 1018 }, { "value": ["0x137331ed7e7C9fffFb24f738C6D0Fb52BEdD97F9", "1"], - "treeIndex": 1098 + "treeIndex": 1203 }, { "value": ["0x6F69F79cEA418024b9E0acfD18bD8DE26f9BBE39", "1"], - "treeIndex": 681 + "treeIndex": 744 }, { "value": ["0x102f468314e062958c2ff7555a62356f505c1d1e", "1"], - "treeIndex": 923 + "treeIndex": 1007 }, { "value": ["0xc6cfeDaAA225Bb433E00d762FE898707a3c077aD", "1"], - "treeIndex": 925 + "treeIndex": 1009 }, { "value": ["0x52dbD5AeA5D61A4f7Fb760CFDc431Fbe3dC531A7", "1"], - "treeIndex": 663 + "treeIndex": 725 }, { "value": ["0x41955ab7d12f9f6c03de972b91d9b895d9c2eaf8", "1"], - "treeIndex": 1112 + "treeIndex": 1217 }, { "value": ["0x28e15b0eb947333fbc71a83f4a20c2a95acccf6a", "1"], - "treeIndex": 814 + "treeIndex": 891 }, { "value": ["0x6beEF2B2fE00FDDCa12A8CDA2D4B00435b0ba3b6", "1"], - "treeIndex": 793 + "treeIndex": 869 }, { "value": ["0x8C26CC23c671be30c6f701417FBC153B6998fF68", "1"], - "treeIndex": 989 + "treeIndex": 1082 }, { "value": ["0x38016c4Dadd92c0C74B5EcE7A9B4AB859777B81A", "1"], - "treeIndex": 633 + "treeIndex": 691 }, { "value": ["0xfDc2B224cc1fd65d6cdCcDd896510A7d89aF81c3", "1"], - "treeIndex": 711 + "treeIndex": 779 }, { "value": ["0x34b5f399cc5a1dd491666c9866941fb8e8d09746", "1"], - "treeIndex": 919 + "treeIndex": 1002 }, { "value": ["0xdb27D37572eA22A7c2b82D15101d6CABdb0b6F74", "1"], - "treeIndex": 673 + "treeIndex": 735 }, { "value": ["0x33CC5926289066C0bc7080e3eF133Cf761D527bD", "1"], - "treeIndex": 672 + "treeIndex": 734 }, { "value": ["0x0990cC53F3503281737a57E3FD4fa09aaa63f8e2", "1"], - "treeIndex": 619 + "treeIndex": 676 }, { "value": ["0x18AEB8064beCa45C264342EF13355DF535F8Fa37", "1"], - "treeIndex": 789 + "treeIndex": 865 }, { "value": ["0x3aBfC7FFA744edc456D361Be957f972D1BaC4991", "1"], - "treeIndex": 1033 + "treeIndex": 1129 }, { "value": ["0x2c79aC9f76c3310B59D4C5E3FD214a73AEC68553", "1"], - "treeIndex": 645 + "treeIndex": 704 }, { "value": ["0xaD5116D1f9F3D2816935b0Df95a58750745eB308", "1"], - "treeIndex": 1185 + "treeIndex": 1296 }, { "value": ["0x026C9072199156739837Ef6e2cCEF2A23D554DAF", "1"], - "treeIndex": 771 + "treeIndex": 845 }, { "value": ["0x3635B3d38B971ED37b17E6E1Ac685Af87bc8d930", "1"], - "treeIndex": 770 + "treeIndex": 844 }, { "value": ["0x563153823D702516F92fc24edD9358D6973f60F9", "1"], - "treeIndex": 805 + "treeIndex": 882 }, { "value": ["0xC5440A5e857102620Bd2E7B1C28895f4D99934c0", "1"], - "treeIndex": 933 + "treeIndex": 1019 }, { "value": ["0x45a5c8a2ea84f48537a74e2e8f96790c90a0046c", "1"], - "treeIndex": 1146 + "treeIndex": 1252 }, { "value": ["0xbB05E34C2315DfFb3a2e5EA345C489d3e190eb32", "1"], - "treeIndex": 902 + "treeIndex": 985 }, { "value": ["0x875FB048e3b6A5d2dcA69c5e29D730f4040d50aa", "1"], - "treeIndex": 1184 + "treeIndex": 1295 }, { "value": ["0x5e11534344b8c1fda947b37dc57b8734232a6b1c", "1"], - "treeIndex": 1117 + "treeIndex": 1222 }, { "value": ["0x8dC24f29bB67BAd92A90dFB7aB58c702B4Bd73f1", "1"], - "treeIndex": 1021 + "treeIndex": 1115 }, { "value": ["0x7535B9c39d66Fa6cC0b67c74E1F6dFBfe917a4a2", "1"], - "treeIndex": 866 + "treeIndex": 946 }, { "value": ["0x0edeF718166D6B239f965229C8Dd306ea52626E4", "1"], - "treeIndex": 876 + "treeIndex": 958 }, { "value": ["0x68647DDA6e001B620d36A6472e975f6405262C7f", "1"], - "treeIndex": 1165 + "treeIndex": 1273 }, { "value": ["0xC3F8E3b3808d2e33b06abFB8731b88948E1f2b8b", "1"], - "treeIndex": 1210 + "treeIndex": 1321 }, { "value": ["0x27e15abc9644c11bdad575748f7839e6783acdd5", "1"], - "treeIndex": 952 + "treeIndex": 1041 }, { "value": ["0x260dB26a5D85E9e6983257e8Af71A60e95873d6b", "1"], - "treeIndex": 1157 + "treeIndex": 1265 }, { "value": ["0xBF222CA2Ef5126afFe94EA72903764D52cD12642", "1"], - "treeIndex": 738 + "treeIndex": 809 }, { "value": ["0x033485Ae1cce7a1Fbc9024469062Fa5a9E7c0799", "1"], - "treeIndex": 1035 + "treeIndex": 1131 }, { "value": ["0x4170AeF5c413915bafdc1980dC2f62c501559132", "1"], - "treeIndex": 966 + "treeIndex": 1055 }, { "value": ["0x3265A39fa1bDD28b9029568208e3cb4639Adbf3e", "1"], - "treeIndex": 801 + "treeIndex": 877 }, { "value": ["0x112F5c6B85D5dF1594DE75E5Cc655dD011e61d78", "1"], - "treeIndex": 714 + "treeIndex": 782 }, { "value": ["0x7a3e92078919273318e3396c92E477E7373fef79", "1"], - "treeIndex": 1000 + "treeIndex": 1094 }, { "value": ["0x2cf8bd93c36dc34d35208fe7a598a13e7783c69a", "1"], - "treeIndex": 668 + "treeIndex": 730 }, { "value": ["0x520c7792f2343c7A5c9F230bD39C565918Fcf215", "1"], - "treeIndex": 1132 + "treeIndex": 1237 }, { "value": ["0x899B2d61a5943Dd2452cbc9Ff5d158c63a2275dd", "1"], - "treeIndex": 743 + "treeIndex": 814 }, { "value": ["0x51D0A5CBe5666ad3EEe303f0d16FcDe9C5Cd3009", "1"], - "treeIndex": 1205 + "treeIndex": 1316 }, { "value": ["0x44aa0725a9D7F7b2F86DB37F667E5a3E11388CBc", "1"], - "treeIndex": 995 + "treeIndex": 1088 }, { "value": ["0xCC546bAA3cA03C25294a901608049d5E045FBFA2", "1"], - "treeIndex": 1174 + "treeIndex": 1283 }, { "value": ["0xcE727050002F2a1398E819328fa501D952a05aAC", "1"], - "treeIndex": 817 + "treeIndex": 894 }, { "value": ["0x7d7337FcDefe5771e3280f25c3Ba670700E8560c", "1"], - "treeIndex": 1038 + "treeIndex": 1136 }, { "value": ["0xFaDd3C023e295FDBA31fc2b57770029318960beD", "1"], - "treeIndex": 699 + "treeIndex": 766 }, { "value": ["0xbA55BDbF959DF826dA6c35487eB15FaD2164662d", "1"], - "treeIndex": 844 + "treeIndex": 923 }, { "value": ["0x01fd2245a54411819011550b1c8799814aa2cc0b", "1"], - "treeIndex": 652 + "treeIndex": 712 }, { "value": ["0xE6e7A811aC96c93cd6b555C2aD4430121321f41B", "1"], - "treeIndex": 1200 + "treeIndex": 1311 }, { "value": ["0xe8142000ef4dad30b1b84705b32fdd8d906366d9", "1"], - "treeIndex": 971 + "treeIndex": 1060 }, { "value": ["0x94365edc741d589320602ce66677B5ddB64d3687", "1"], - "treeIndex": 874 + "treeIndex": 956 }, { "value": ["0x3df6c1D54ad103233B3c74a12042f67239d69f70", "1"], - "treeIndex": 675 + "treeIndex": 737 }, { "value": ["0xa195AF9e11997c4852929f89225894dD5F4E1418", "1"], - "treeIndex": 988 + "treeIndex": 1080 }, { "value": ["0x09E102414813d84519c21e03C32001b123cD58C9", "1"], - "treeIndex": 816 + "treeIndex": 893 }, { "value": ["0x380b5F11406AAd00D3398f838089D9d43FcDAbf8", "1"], - "treeIndex": 953 + "treeIndex": 1042 }, { "value": ["0x2E92072fd9e6189E07FE977CC35Cb72DDfa1111E", "1"], - "treeIndex": 614 + "treeIndex": 671 }, { "value": ["0xEF6BF72663897B1993f680519c1EC7962893D00F", "1"], - "treeIndex": 624 + "treeIndex": 682 }, { "value": ["0xbC8f491D5c7cbd999b1E742D645acDB77a017ef3", "1"], - "treeIndex": 1207 + "treeIndex": 1318 }, { "value": ["0x13c0c1F31368C39297F3fAd4FB6bbb9C96bbC988", "1"], - "treeIndex": 1051 + "treeIndex": 1152 }, { "value": ["0xbd40A797140f36e608b41390E669F11E79DE4b6D", "1"], - "treeIndex": 1179 + "treeIndex": 1289 }, { "value": ["0xc6adE353C837ebA0CB2a85419B7aB50e59eb2A95", "1"], - "treeIndex": 1133 + "treeIndex": 1238 }, { "value": ["0xaA26fC5AeAfd9E17b8e5A3fFc6E5041b12137105", "1"], - "treeIndex": 856 + "treeIndex": 936 }, { "value": ["0xA9Cdc432A3d1a1A5F43b353950389790be640b4A", "1"], - "treeIndex": 1016 + "treeIndex": 1110 }, { "value": ["0xaa3cD95439557cAfD4498aAC4a9489E39Be98AA5", "1"], - "treeIndex": 863 + "treeIndex": 943 }, { "value": ["0xcb7329E0b62F79634c0e8EAD7cE46108564f2F0B", "1"], - "treeIndex": 1145 + "treeIndex": 1251 }, { "value": ["0x0f49efe399584b13f9d0f77198319ed030ac3f20", "1"], - "treeIndex": 858 + "treeIndex": 938 }, { "value": ["0xBea1771efeD9D4a80D6cE19Aedb70e56Dd739B49", "1"], - "treeIndex": 1083 + "treeIndex": 1188 }, { "value": ["0xD7efAE6e8e0556eBb5E77A499a34FCe6a4D8c722", "1"], - "treeIndex": 1213 + "treeIndex": 1325 }, { "value": ["0x34BEB2e3660624A94504A8C9e5c8aA29fBD14E31", "1"], - "treeIndex": 908 + "treeIndex": 991 }, { "value": ["0x78d3C01365B196aC94Ec0754Ef0ee051572bBbdD", "1"], - "treeIndex": 688 + "treeIndex": 752 }, { "value": ["0x049808d5EAA90a2665b9703d2246DDed34F1EB73", "1"], - "treeIndex": 894 + "treeIndex": 977 }, { "value": ["0xCD7f6b72049C3b54416f9F26392cB271e74ca3FD", "1"], - "treeIndex": 1183 + "treeIndex": 1293 }, { "value": ["0x7565DEdDCB83a14B185eb9520914bB918cDfE983", "1"], - "treeIndex": 1069 + "treeIndex": 1172 }, { "value": ["0xb3eb1838512d6172911505edafee3a6535d69e34", "1"], - "treeIndex": 747 + "treeIndex": 818 }, { "value": ["0x94507bc0C3fa6483F84453D8DD85AA1617e0d88F", "1"], - "treeIndex": 992 + "treeIndex": 1085 }, { "value": ["0x89b0fB6eb9d83e6E50915ABa19B92fc80a58f065", "1"], - "treeIndex": 848 + "treeIndex": 928 }, { "value": ["0x3676828AdDB128eCD9F51D49Ca5b5F755607662e", "1"], - "treeIndex": 918 + "treeIndex": 1001 }, { "value": ["0x00bCD13eF3cD3D835Db9Ab66f8F440101295A82d", "1"], - "treeIndex": 674 + "treeIndex": 736 }, { "value": ["0x85893cc28f86c3138e1e3f888b16466e8accafc6", "1"], - "treeIndex": 1075 + "treeIndex": 1178 }, { "value": ["0xca93c1c564bf5a4e8dcca65ce80fbdf66990927d", "1"], - "treeIndex": 763 + "treeIndex": 836 }, { "value": ["0x904B8C6696Df18dBb88Dc810075c16805e03E909", "1"], - "treeIndex": 1208 + "treeIndex": 1319 }, { "value": ["0x7e1A81D62f762a4232300f3f68A23Cff376B06Bd", "1"], - "treeIndex": 1090 + "treeIndex": 1195 }, { "value": ["0x8cf36632D7305619EB6b07c532Ad4DD0971F6282", "1"], - "treeIndex": 760 + "treeIndex": 833 }, { "value": ["0xF637978800670ba2a978501D86f73442e108f946", "1"], - "treeIndex": 1013 + "treeIndex": 1107 }, { "value": ["0x893E7C3d5fb639d0964A16037f7E1b5Ab595dBe8", "1"], - "treeIndex": 620 + "treeIndex": 677 }, { "value": ["0xbf47F68f0Cf07Ab56180D25D083ce73Db66AbCC9", "1"], - "treeIndex": 644 + "treeIndex": 703 }, { "value": ["0x9898C676b550110dB42240Ed11Cae6A8Cf8Ccb48", "1"], - "treeIndex": 907 + "treeIndex": 990 }, { "value": ["0x373250CCe67642B3fDa31B172150C8Cf10376B88", "1"], - "treeIndex": 701 + "treeIndex": 768 }, { "value": ["0x896b2797442e7066f2e46959a0B32398999fCC0d", "1"], - "treeIndex": 916 + "treeIndex": 999 }, { "value": ["0x64897dBB52C2BFa0Ae107101b4983f365fb9a390", "1"], - "treeIndex": 702 + "treeIndex": 769 }, { "value": ["0xee7028E9C5240d77876efBAC5acD0E7cE2012b19", "1"], - "treeIndex": 998 + "treeIndex": 1092 }, { "value": ["0x97Ba60ccd56b319096cf3f0Cb3429114a0A184E5", "1"], - "treeIndex": 1151 + "treeIndex": 1257 }, { "value": ["0x9BD48e08E3444B30113812acd52458b35C33803A", "1"], - "treeIndex": 648 + "treeIndex": 707 }, { "value": ["0x9BA7053384784B3D2949803b83F2520572CB5452", "1"], - "treeIndex": 1163 + "treeIndex": 1271 }, { "value": ["0x11BDd3E134A0c3dC242b7b9d399896b3587a8daC", "1"], - "treeIndex": 927 + "treeIndex": 1011 }, { "value": ["0xc6571c2FB66825F13b7751b1c334810D397618Eb", "1"], - "treeIndex": 1076 + "treeIndex": 1179 }, { "value": ["0x3961a7966F6E8eA422CaF1362530d3F5c2D778CA", "1"], - "treeIndex": 1169 + "treeIndex": 1277 }, { "value": ["0xa2DE0B80D24C3Bc37A9F6C44683fA51d67852c38", "1"], - "treeIndex": 1096 + "treeIndex": 1201 }, { "value": ["0xa7F343a7C53f3A852a7Ae51F5E62b4D9b0594336", "1"], - "treeIndex": 784 + "treeIndex": 860 }, { "value": ["0x0c4E0544F0eCfdF4387B45E44d2F45d26aE65D02", "1"], - "treeIndex": 1186 + "treeIndex": 1297 }, { "value": ["0x217A94e97287659bD9288862BA28C2f02cc5A4d1", "1"], - "treeIndex": 1114 + "treeIndex": 1219 }, { "value": ["0xFE67648A6b97751D7931E73b74a5b65917BDB06a", "1"], - "treeIndex": 1193 + "treeIndex": 1304 }, { "value": ["0x84924bfFabFC9601D22bAEe4cF4911b40AD41664", "1"], - "treeIndex": 678 + "treeIndex": 740 }, { "value": ["0x5e81c5F7fAB13D3708ABb8679cbdBF863E09409c", "1"], - "treeIndex": 827 + "treeIndex": 904 }, { "value": ["0x90edD7024Dd948892Cdd063FEF6EcC167bEa2304", "1"], - "treeIndex": 981 + "treeIndex": 1072 }, { "value": ["0x4B2F6D3A23bADb60c8405d50289eF3daB9109936", "1"], - "treeIndex": 1020 + "treeIndex": 1114 }, { "value": ["0x1314ba5224256A2092869e91098f101BF1182934", "1"], - "treeIndex": 787 + "treeIndex": 863 }, { "value": ["0xe1dbD2c71ded411DB6Ce029785E9bA9c1Ae0c801", "1"], - "treeIndex": 638 + "treeIndex": 696 }, { "value": ["0x82584A2e294fC67C390f059227490DA7390dF331", "1"], - "treeIndex": 754 + "treeIndex": 825 }, { "value": ["0x24d697503CEDA3e33c6Cd9cDCf769702f32b5974", "1"], - "treeIndex": 774 + "treeIndex": 849 }, { "value": ["0xb9E500CF14b355f50217f1a89040DF1765C5E70e", "1"], - "treeIndex": 914 + "treeIndex": 997 }, { "value": ["0x79fb4ebdd543d0927b809b1e8f552f1bf74dec65", "1"], - "treeIndex": 873 + "treeIndex": 955 }, { - "value": ["0x3Eb73235225F0a4C8e7612ED3C0eb93f947CFE80", "1"], - "treeIndex": 878 + "value": ["0xd6d965bd7f73fb1de3060c09483a14601d5317d8", "1"], + "treeIndex": 1016 }, { - "value": ["0x9dD295D8557c61AD14408A92645C961f47300455", "1"], - "treeIndex": 1126 + "value": ["0x8eea53fc41b248af0cb8dc72ec17eb2caf9f32c0", "1"], + "treeIndex": 1067 + }, + { + "value": ["0xe5f7c6e25ff2f6496de5c08f02e6d4fb5fce23c9", "1"], + "treeIndex": 1120 + }, + { + "value": ["0xc19603c6b2b3f64afeffd30c4580428317c1a692", "1"], + "treeIndex": 1031 + }, + { + "value": ["0x81abbcccf44b3102c0cd8159c1ab8b295849df23", "1"], + "treeIndex": 1287 + }, + { + "value": ["0x6026dcf4a4146bad240066c670b62c831e94dc1a", "1"], + "treeIndex": 761 + }, + { + "value": ["0xc74796ea4d76333e38638bb2cb8ddfe0bffaa749", "1"], + "treeIndex": 927 + }, + { + "value": ["0x38de4b9714640d7d86160f4bfd45d9e796c0fe49", "1"], + "treeIndex": 797 + }, + { + "value": ["0x55792e1f0a41d3af8b6d41dfdcf24651aa80fa1e", "1"], + "treeIndex": 778 + }, + { + "value": ["0xc66fadffeb6da3b9a7fa3c71130f881e3a9b13fb", "1"], + "treeIndex": 1263 + }, + { + "value": ["0x812b6cd80f38bdb8078043609c55f8b55fa7eab4", "1"], + "treeIndex": 826 + }, + { + "value": ["0x7152cd3891d5b80ca162bbb807e2d4310c084207", "1"], + "treeIndex": 716 + }, + { + "value": ["0x00b824a7aebd7ab7cfd5fafa470c690f0dba7cb6", "1"], + "treeIndex": 678 + }, + { + "value": ["0x9b437ee080d4d8c579ff947d86319e59b2f7b1ee", "1"], + "treeIndex": 724 + }, + { + "value": ["0xcd922764c55c4156c9e03e815aedc35dc263700f", "1"], + "treeIndex": 1141 + }, + { + "value": ["0xc56993491eb1fa12c17863f922a8393de8ab4413", "1"], + "treeIndex": 747 + }, + { + "value": ["0x9a1c6e462961422168b4d958cff3344ea7430507", "1"], + "treeIndex": 1227 + }, + { + "value": ["0xda65d415cc9d5ddc2a08bdffc996750755fc3cf0", "1"], + "treeIndex": 1145 + }, + { + "value": ["0x9753a6122349933f933c0fe6200e67bbb1199c09", "1"], + "treeIndex": 879 + }, + { + "value": ["0x14b35ea598a18e171a8f1e724c356f83fb4a0f18", "1"], + "treeIndex": 827 + }, + { + "value": ["0xe4557a032c75bf2ea06a8212e36f18f60e7ee7ac", "1"], + "treeIndex": 1281 + }, + { + "value": ["0x6dff0c088cfb81ecaae1aef739219f1ec1bd0bc6", "1"], + "treeIndex": 742 + }, + { + "value": ["0x1714859bc91dee08c2355251cd3a13784152aadf", "1"], + "treeIndex": 1135 + }, + { + "value": ["0x503a47280852033dcdbdd113663ff9e6e7a0a338", "1"], + "treeIndex": 1182 + }, + { + "value": ["0xbefaadd4a558637646a7f0697022e1f767c7b491", "1"], + "treeIndex": 764 + }, + { + "value": ["0x773674eba65277e47faa2bf4fd2e3fa6c2f01228", "1"], + "treeIndex": 1148 + }, + { + "value": ["0xb1e745e9a67be8ceee1864558e7608021a5ba4e0", "1"], + "treeIndex": 913 + }, + { + "value": ["0xfac906b02e9e1f54c5b9f891db5e8fe428889448", "1"], + "treeIndex": 1323 + }, + { + "value": ["0x0ef7871ea3ef1952621c389598386368896ccd8b", "1"], + "treeIndex": 664 + }, + { + "value": ["0xaea29c04e32ebce118ea8cee975a3317190cccdd", "1"], + "treeIndex": 1186 + }, + { + "value": ["0x71e18c339795799fe56aaf3d5c9bd4dc93be2842", "1"], + "treeIndex": 1294 + }, + { + "value": ["0x4e7a933b61999dcc712e056cf94595591958eda6", "1"], + "treeIndex": 711 + }, + { + "value": ["0xa56bf93a4bc592d446f3712c0db17b4e33e14b71", "1"], + "treeIndex": 847 + }, + { + "value": ["0x8337478ae2e798230624dcb3bec342fddc6248a0", "1"], + "treeIndex": 1248 + }, + { + "value": ["0xa63dddb69e6e470bf3d236b434ef80a213b998a7", "1"], + "treeIndex": 1169 + }, + { + "value": ["0x081a919a2e2e43eedfc6a618b76be5a2381adc00", "1"], + "treeIndex": 1134 + }, + { + "value": ["0xd202a56c5e7ba279431e43d945c5cc6f68d083b7", "1"], + "treeIndex": 1064 + }, + { + "value": ["0x9782f2b0878d97ed2d79b38cbbc494c6bd3999a8", "1"], + "treeIndex": 1121 + }, + { + "value": ["0x38c596da5aa8fe9f91eaf30c431dffccc09394a6", "1"], + "treeIndex": 948 + }, + { + "value": ["0x56706f118e42ae069f20c5636141b844d1324ae1", "1"], + "treeIndex": 1073 + }, + { + "value": ["0x2019aa6811c84c7cc4df4fe0f3f3914631aae315", "1"], + "treeIndex": 1037 + }, + { + "value": ["0x69aa0361dbb0527d4f1e5312403bd41788fe61fe", "1"], + "treeIndex": 908 + }, + { + "value": ["0x90b285c1bbddb36fbfc363773d6689975cccdbfc", "1"], + "treeIndex": 954 + }, + { + "value": ["0xdee983c30a123f1798437ead4587dd87cb96dcda", "5"], + "treeIndex": 1264 + }, + { + "value": ["0x418edf05d862ec3d591cb16f7e2efa88de8f2b00", "1"], + "treeIndex": 1005 + }, + { + "value": ["0x02e725b7e99091bd4ccbf15228384e160ecdf78f", "1"], + "treeIndex": 802 + }, + { + "value": ["0xa0fe02a5078922fe067b1c4d69b4d7c722ed78d9", "1"], + "treeIndex": 976 + }, + { + "value": ["0x388a519241457b90e1349e342dca1fb093b50378", "1"], + "treeIndex": 758 + }, + { + "value": ["0xa693670efa475ad547c29d67d9d9bd6d8d1b3c34", "1"], + "treeIndex": 1090 + }, + { + "value": ["0x0efadbe8328a1a07bb3ddec22f69f88adb61b8b4", "1"], + "treeIndex": 1159 + }, + { + "value": ["0x7bb998a98f60811dea7df9048134e14dc3a38f97", "1"], + "treeIndex": 840 + }, + { + "value": ["0x507B96026abF97845b68b605ED82BAc8FaFb23ff", "1"], + "treeIndex": 1029 + }, + { + "value": ["0x082087d48cA764Bb1A5848b56869C1edd4407aC9", "1"], + "treeIndex": 1224 + }, + { + "value": ["0x3C75b7d9C82924E668368f512309FBfA4f1d7480", "1"], + "treeIndex": 1081 + }, + { + "value": ["0x0e440bd9798ad22cb8fd6f1a433f2f16e8786770", "1"], + "treeIndex": 858 + }, + { + "value": ["0x89172e6ecd0f83E0B31dA700f022E39ddD891D0c", "1"], + "treeIndex": 698 + }, + { + "value": ["0xa400ff8a4ba8bf0b2e46c692aaf48650e186487b", "1"], + "treeIndex": 1014 } ], "leafEncoding": ["address", "uint256"] diff --git a/packages/taikoon-ui/src/i18n/en.json b/packages/taikoon-ui/src/i18n/en.json index abff20f7e2c..d9b2c54195a 100644 --- a/packages/taikoon-ui/src/i18n/en.json +++ b/packages/taikoon-ui/src/i18n/en.json @@ -18,7 +18,7 @@ "mintNow": "Mint Now", "learnMore": "FAQs", "mint": "Mint", - "etherscan": "View on Chain Explorer", + "etherscan": "View on Taiko explorer", "share": "Share", "yourTaikoons": "Your Taikoons", "cancel": "Cancel", @@ -85,7 +85,6 @@ "title": "How many NFTs does the Taikoons collection consist of?", "text": "Taiko's Genesis NFT collection consists of 888 Taikoons." }, - { "title": "How many NFTs will be minted now, and how many NFTs are reserved for future activities?", "text": "608 NFTs will be minted now, and the remaining 280 will be reserved for future activities." diff --git a/packages/taikoon-ui/src/lib/chain/chains.ts b/packages/taikoon-ui/src/lib/chain/chains.ts index d1f95ea7da2..b3a5d1008fb 100644 --- a/packages/taikoon-ui/src/lib/chain/chains.ts +++ b/packages/taikoon-ui/src/lib/chain/chains.ts @@ -1,122 +1,28 @@ import type { Chain } from 'viem'; +import { taiko, taikoHekla } from 'viem/chains'; -import { type ChainConfig, type ChainConfigMap, LayerType } from '.'; +import { isDevelopmentEnv } from '$lib/util/isDevelopmentEnv'; -//import { chainConfig } from '$chainConfig'; - -const chainConfigs: ChainConfigMap = { - '31337': { - name: 'Hardhat', - rpcUrls: { - default: { - http: ['http://localhost:8545'], - //webSocket: ['wss://mainnet.infura.io/ws/v3/'], - }, - }, - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - icon: '/chains/ethereum.svg', - type: 'L1' as LayerType, // Add the missing 'type' property with the value of 'LayerType' - }, - '167001': { - name: 'Devnet', - rpcUrls: { - default: { - http: ['https://rpc.internal.taiko.xyz'], - }, - }, - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - icon: '/chains/ethereum.svg', - type: 'L1' as LayerType, // Add the missing 'type' property with the value of 'LayerType' - }, - '17000': { - name: 'Holesky', - rpcUrls: { - default: { - http: ['https://1rpc.io/holesky'], - }, - }, - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - icon: '/chains/ethereum.svg', - type: 'L1' as LayerType, // Add the missing 'type' property with the value of 'LayerType' - }, - '167000': { - name: 'Taiko', - rpcUrls: { - default: { - http: ['https://rpc.mainnet.taiko.xyz'], - }, - }, - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - icon: '/chains/taiko.svg', - type: 'L1' as LayerType, // Add the missing 'type' property with the value of 'LayerType' - }, -}; - -function mapChainConfigToChain(chainId: string, chainConfig: ChainConfig): Chain { - return { - id: Number(chainId), - name: chainConfig.name, - rpcUrls: chainConfig.rpcUrls, - nativeCurrency: chainConfig.nativeCurrency, - blockExplorers: chainConfig.blockExplorers, +export const getChainImages = (): Record => { + const map = { + 167000: '/chains/taiko.svg', + 167009: '/chains/taiko.svg', }; -} + return map; +}; -export const chainIdToChain = (chainId: number): Chain => { - const chain = chains.find((chain) => chain.id === chainId); +export const getChainImage = (chainId: number) => { + const chain = getChainImages()[chainId]; if (!chain) { throw new Error(`Chain with id ${chainId} not found`); } return chain; }; -export const chains: Chain[] = Object.entries(chainConfigs).map(([chainId, chainConfig]) => - mapChainConfigToChain(chainId, chainConfig as ChainConfig), -); - -export function getConfiguredChainIds(): number[] { - return chains.map((chain) => Number(chain.id)); -} - -export function isSupportedChain(chainId: number) { +export const isSupportedChain = (chainId: number) => { return chains.some((chain) => chain.id === chainId); -} - -export function getChainImages(): Record { - return Object.fromEntries( - Object.entries(chainConfigs).map(([chainId]) => [Number(chainId), chainConfigs[Number(chainId)].icon]), - ); -} - -export function getChainImage(chainId: number) { - const images = getChainImages(); - if (!images[chainId]) { - throw new Error(`Chain with id ${chainId} not found`); - } +}; - return images[chainId]; -} +export const chains: [Chain, ...Chain[]] = isDevelopmentEnv ? [taikoHekla] : [taiko]; -export function getChainName(chainId: number) { - const chain = chains.find((chain) => chain.id === chainId); - if (!chain) { - throw new Error(`Chain with id ${chainId} not found`); - } - return chain.name; -} +export const chainId = isDevelopmentEnv ? taikoHekla.id : taiko.id; diff --git a/packages/taikoon-ui/src/lib/ens/getAddress.ts b/packages/taikoon-ui/src/lib/ens/getAddress.ts index bbe8ada40b8..077b35d2b2a 100644 --- a/packages/taikoon-ui/src/lib/ens/getAddress.ts +++ b/packages/taikoon-ui/src/lib/ens/getAddress.ts @@ -2,11 +2,13 @@ import { getEnsAddress } from '@wagmi/core'; import { type GetEnsAddressReturnType } from '@wagmi/core'; import { normalize } from 'viem/ens'; +import { chainId } from '$lib/chain'; + import type { IAddress } from '../../types'; import getConfig from '../wagmi/getConfig'; export default async function getAddress(ensName: string): Promise { - const { config, chainId } = getConfig(); + const config = getConfig(); const address = (await getEnsAddress(config, { name: normalize(ensName), chainId, diff --git a/packages/taikoon-ui/src/lib/ens/getName.ts b/packages/taikoon-ui/src/lib/ens/getName.ts index 9c6f0a6717f..077ff953e12 100644 --- a/packages/taikoon-ui/src/lib/ens/getName.ts +++ b/packages/taikoon-ui/src/lib/ens/getName.ts @@ -1,11 +1,13 @@ import { getEnsName } from '@wagmi/core'; import { type GetEnsNameReturnType } from '@wagmi/core'; +import { chainId } from '$lib/chain'; + import type { IAddress } from '../../types'; import getConfig from '../wagmi/getConfig'; export default async function getName(address: IAddress): Promise { - const { config, chainId } = getConfig(); + const config = getConfig(); const ensName = (await getEnsName(config, { address, chainId, diff --git a/packages/taikoon-ui/src/lib/ipfs/config.ts b/packages/taikoon-ui/src/lib/ipfs/config.ts deleted file mode 100644 index ce6b37a9aab..00000000000 --- a/packages/taikoon-ui/src/lib/ipfs/config.ts +++ /dev/null @@ -1 +0,0 @@ -export { PUBLIC_IPFS_GATEWAY } from '$env/static/public'; diff --git a/packages/taikoon-ui/src/lib/ipfs/get.ts b/packages/taikoon-ui/src/lib/ipfs/get.ts deleted file mode 100644 index f43218d7068..00000000000 --- a/packages/taikoon-ui/src/lib/ipfs/get.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { PUBLIC_IPFS_GATEWAY } from './config'; - -export default async function get(hash: string, json?: boolean): Promise { - const response = await fetch(`${PUBLIC_IPFS_GATEWAY}${hash}`); - return json ? response.json() : response.text(); -} diff --git a/packages/taikoon-ui/src/lib/ipfs/getMetadata.ts b/packages/taikoon-ui/src/lib/ipfs/getMetadata.ts index a402e91fc8d..35df21346ed 100644 --- a/packages/taikoon-ui/src/lib/ipfs/getMetadata.ts +++ b/packages/taikoon-ui/src/lib/ipfs/getMetadata.ts @@ -1,7 +1,10 @@ -import { IpfsError } from '../error'; +import { get } from 'svelte/store'; + +import { nftCache } from '$stores/nftCache'; + import Token from '../token'; -import { PUBLIC_IPFS_GATEWAY } from './config'; -import get from './get'; +import httpGet from './httpGet'; +//import get from './get'; export interface ITokenMetadata { name: string; @@ -10,16 +13,20 @@ export interface ITokenMetadata { } export default async function getMetadata(tokenId: number): Promise { const tokenURI = await Token.tokenURI(tokenId); - const hash = tokenURI.split('ipfs://').pop(); - if (!hash) throw new IpfsError('Invalid token URI:' + tokenURI); - const metadata = (await get(hash, true)) as ITokenMetadata; - - const imageHash = metadata.image.split('ipfs://').pop(); + // const metadata = (await get(tokenURI, true)) as ITokenMetadata; - if (!imageHash) throw new IpfsError('Invalid image URI:' + metadata.image); + const cachedIds = get(nftCache); + const cached = cachedIds[tokenId]; + let metadata; + if (!cached) { + metadata = (await httpGet(tokenURI, true)) as ITokenMetadata; + nftCache.set({ + ...cachedIds, + [tokenId]: JSON.stringify(metadata), + }); + } else { + metadata = JSON.parse(cached); + } - return { - ...metadata, - image: `${PUBLIC_IPFS_GATEWAY}${imageHash}`, - }; + return metadata; } diff --git a/packages/taikoon-ui/src/lib/ipfs/httpGet.ts b/packages/taikoon-ui/src/lib/ipfs/httpGet.ts new file mode 100644 index 00000000000..090659e2b31 --- /dev/null +++ b/packages/taikoon-ui/src/lib/ipfs/httpGet.ts @@ -0,0 +1,4 @@ +export default async function httpGet(url: string, json?: boolean): Promise { + const response = await fetch(url); + return json ? response.json() : response.text(); +} diff --git a/packages/taikoon-ui/src/lib/ipfs/index.ts b/packages/taikoon-ui/src/lib/ipfs/index.ts index aaf516e2bb2..7d30d458f33 100644 --- a/packages/taikoon-ui/src/lib/ipfs/index.ts +++ b/packages/taikoon-ui/src/lib/ipfs/index.ts @@ -1,8 +1,8 @@ -import get from './get'; import getMetadata from './getMetadata'; +import httpGet from './httpGet'; const IPFS = { - get, + get: httpGet, getMetadata, }; diff --git a/packages/taikoon-ui/src/lib/token/balanceOf.ts b/packages/taikoon-ui/src/lib/token/balanceOf.ts index 58daec95bb5..9c104f36801 100644 --- a/packages/taikoon-ui/src/lib/token/balanceOf.ts +++ b/packages/taikoon-ui/src/lib/token/balanceOf.ts @@ -1,16 +1,12 @@ import { readContract } from '@wagmi/core'; +import { chainId } from '$lib/chain'; import { config } from '$wagmi-config'; import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi/'; -import { web3modal } from '../../lib/connect'; -import type { IAddress, IChainId } from '../../types'; +import type { IAddress } from '../../types'; export async function balanceOf(address: IAddress): Promise { - const { selectedNetworkId } = web3modal.getState(); - if (!selectedNetworkId) return 0; - - const chainId = selectedNetworkId as IChainId; const result = await readContract(config, { abi: taikoonTokenAbi, address: taikoonTokenAddress[chainId], diff --git a/packages/taikoon-ui/src/lib/token/canMint.ts b/packages/taikoon-ui/src/lib/token/canMint.ts index b6102b5672f..7def2c9e6ef 100644 --- a/packages/taikoon-ui/src/lib/token/canMint.ts +++ b/packages/taikoon-ui/src/lib/token/canMint.ts @@ -1,27 +1,26 @@ -import { getAccount, readContract } from '@wagmi/core'; +import { readContract } from '@wagmi/core'; +import type { Address } from 'viem'; + +import { chainId } from '$lib/chain'; import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi'; -import type { IAddress } from '../../types'; import { totalWhitelistMintCount } from '../user/totalWhitelistMintCount'; import getConfig from '../wagmi/getConfig'; -export async function canMint(): Promise { +export async function canMint(address: Address): Promise { try { - const { config, chainId } = getConfig(); - - const account = getAccount(config); - if (!account.address) return false; - const accountAddress = account.address as IAddress; - - const freeMintCount = await totalWhitelistMintCount(); + const config = getConfig(); + const freeMintCount = await totalWhitelistMintCount(address); + if (freeMintCount === 0) return false; const result = await readContract(config, { abi: taikoonTokenAbi, address: taikoonTokenAddress[chainId], functionName: 'canMint', - args: [accountAddress, BigInt(freeMintCount)], + args: [address, BigInt(freeMintCount)], chainId, }); + return result as boolean; } catch (e) { console.warn(e); diff --git a/packages/taikoon-ui/src/lib/token/estimateMintGasCost.ts b/packages/taikoon-ui/src/lib/token/estimateMintGasCost.ts index e6234bd4aec..91afdb7cb66 100644 --- a/packages/taikoon-ui/src/lib/token/estimateMintGasCost.ts +++ b/packages/taikoon-ui/src/lib/token/estimateMintGasCost.ts @@ -1,24 +1,18 @@ -import { formatGwei } from 'viem'; +import { type Address, formatGwei } from 'viem'; +import { chainId } from '$lib/chain'; import getProof from '$lib/whitelist/getProof'; import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi'; -import type { IChainId } from '../../types'; -import { web3modal } from '../connect'; import { totalWhitelistMintCount } from '../user/totalWhitelistMintCount'; import estimateContractGas from '../wagmi/estimateContractGas'; import { canMint } from './canMint'; -export async function estimateMintGasCost(): Promise { - const { selectedNetworkId } = web3modal.getState(); - if (!selectedNetworkId) return 0; - const chainId = selectedNetworkId as IChainId; - - const freeMintLeft = await totalWhitelistMintCount(); - - if (await canMint()) { - const proof = getProof(); +export async function estimateMintGasCost(address: Address): Promise { + const freeMintLeft = await totalWhitelistMintCount(address); + if (await canMint(address)) { + const proof = getProof(address); const gasEstimate = await estimateContractGas({ abi: taikoonTokenAbi, address: taikoonTokenAddress[chainId], diff --git a/packages/taikoon-ui/src/lib/token/index.ts b/packages/taikoon-ui/src/lib/token/index.ts index d9160a908d2..15aa05bde56 100644 --- a/packages/taikoon-ui/src/lib/token/index.ts +++ b/packages/taikoon-ui/src/lib/token/index.ts @@ -1,8 +1,7 @@ -import { zeroAddress } from 'viem'; +import { chainId } from '$lib/chain'; import { taikoonTokenAddress } from '../../generated/abi'; -import { web3modal } from '../../lib/connect'; -import type { IAddress, IChainId } from '../../types'; +import type { IAddress } from '../../types'; import { balanceOf } from './balanceOf'; import { canMint } from './canMint'; import { estimateMintGasCost } from './estimateMintGasCost'; @@ -15,10 +14,6 @@ import { tokenURI } from './tokenURI'; import { totalSupply } from './totalSupply'; function address(): IAddress { - const { selectedNetworkId } = web3modal.getState(); - if (!selectedNetworkId) return zeroAddress; - - const chainId = selectedNetworkId as IChainId; return taikoonTokenAddress[chainId]; } diff --git a/packages/taikoon-ui/src/lib/token/maxSupply.ts b/packages/taikoon-ui/src/lib/token/maxSupply.ts index b74234c7caf..b3eb6731a10 100644 --- a/packages/taikoon-ui/src/lib/token/maxSupply.ts +++ b/packages/taikoon-ui/src/lib/token/maxSupply.ts @@ -1,10 +1,12 @@ import { readContract } from '@wagmi/core'; +import { chainId } from '$lib/chain'; + import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi'; import getConfig from '../wagmi/getConfig'; export async function maxSupply(): Promise { - const { config, chainId } = getConfig(); + const config = getConfig(); const result = await readContract(config, { abi: taikoonTokenAbi, diff --git a/packages/taikoon-ui/src/lib/token/mint.ts b/packages/taikoon-ui/src/lib/token/mint.ts index 1d80174421e..74ad635c76e 100644 --- a/packages/taikoon-ui/src/lib/token/mint.ts +++ b/packages/taikoon-ui/src/lib/token/mint.ts @@ -1,13 +1,13 @@ -import { waitForTransactionReceipt, writeContract } from '@wagmi/core'; +import { getAccount, waitForTransactionReceipt, writeContract } from '@wagmi/core'; import { decodeEventLog } from 'viem'; -import { FilterLogsError, MintError } from '$lib/error'; +import { chainId } from '$lib/chain'; +import { FilterLogsError } from '$lib/error'; +import calculateGasPrice from '$lib/util/calculateGasPrice'; import getProof from '$lib/whitelist/getProof'; import { config } from '$wagmi-config'; import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi'; -import { web3modal } from '../../lib/connect'; -import type { IChainId } from '../../types'; import { totalWhitelistMintCount } from '../user/totalWhitelistMintCount'; import { canMint } from './canMint'; @@ -18,31 +18,36 @@ export async function mint({ freeMintCount: number; onTransaction: (tx: string) => void; }): Promise { - const { selectedNetworkId } = web3modal.getState(); - if (!selectedNetworkId) return []; - let tx: any; - const chainId = selectedNetworkId as IChainId; - - const mintCount = await totalWhitelistMintCount(); + const account = getAccount(config); + if (!account.address) { + throw new Error('No account address'); + } + const mintCount = await totalWhitelistMintCount(account.address); if (freeMintCount > mintCount) { - throw new MintError('Not enough free mints left'); + throw new Error('Not enough free mints left'); } - if (await canMint()) { - const proof = getProof(); + let tx: any; + + if (await canMint(account.address)) { + const proof = getProof(account.address); + const gasPrice = await calculateGasPrice(); tx = await writeContract(config, { abi: taikoonTokenAbi, address: taikoonTokenAddress[chainId], functionName: 'mint', args: [proof, BigInt(mintCount)], - chainId: chainId as number, + chainId, + gasPrice, }); onTransaction(tx); + } else { + throw new Error(`Connected account cannot mint`); } - let nounId: number = 0; + let tokenId: number = 0; const receipt = await waitForTransactionReceipt(config, { hash: tx }); @@ -61,8 +66,8 @@ export async function mint({ to: string; tokenId: bigint; } = decoded.args as any; - nounId = parseInt(args.tokenId.toString()); - tokenIds.push(nounId); + tokenId = parseInt(args.tokenId.toString()); + tokenIds.push(tokenId); } } catch (e: any) { throw new FilterLogsError(e.message); diff --git a/packages/taikoon-ui/src/lib/token/name.ts b/packages/taikoon-ui/src/lib/token/name.ts index 554426efbc4..d560f46a011 100644 --- a/packages/taikoon-ui/src/lib/token/name.ts +++ b/packages/taikoon-ui/src/lib/token/name.ts @@ -1,17 +1,11 @@ import { readContract } from '@wagmi/core'; +import { chainId } from '$lib/chain'; import { config } from '$wagmi-config'; import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi/'; -import { web3modal } from '../../lib/connect'; -import type { IChainId } from '../../types'; export async function name(): Promise { - const { selectedNetworkId } = web3modal.getState(); - if (!selectedNetworkId) return ''; - - const chainId = selectedNetworkId as IChainId; - const result = await readContract(config, { abi: taikoonTokenAbi, address: taikoonTokenAddress[chainId], diff --git a/packages/taikoon-ui/src/lib/token/ownerOf.ts b/packages/taikoon-ui/src/lib/token/ownerOf.ts index cd6f74b49af..17aa4baa617 100644 --- a/packages/taikoon-ui/src/lib/token/ownerOf.ts +++ b/packages/taikoon-ui/src/lib/token/ownerOf.ts @@ -1,18 +1,12 @@ import { readContract } from '@wagmi/core'; -import { zeroAddress } from 'viem'; +import { chainId } from '$lib/chain'; import { config } from '$wagmi-config'; import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi/'; -import { web3modal } from '../../lib/connect'; -import type { IAddress, IChainId } from '../../types'; +import type { IAddress } from '../../types'; export async function ownerOf(tokenId: number): Promise { - const { selectedNetworkId } = web3modal.getState(); - if (!selectedNetworkId) return zeroAddress; - - const chainId = selectedNetworkId as IChainId; - const result = await readContract(config, { abi: taikoonTokenAbi, address: taikoonTokenAddress[chainId], diff --git a/packages/taikoon-ui/src/lib/token/tokenOfOwner.ts b/packages/taikoon-ui/src/lib/token/tokenOfOwner.ts index 13a2c36bb6d..0ef02872cba 100644 --- a/packages/taikoon-ui/src/lib/token/tokenOfOwner.ts +++ b/packages/taikoon-ui/src/lib/token/tokenOfOwner.ts @@ -1,5 +1,7 @@ import { readContracts } from '@wagmi/core'; +import { chainId } from '$lib/chain'; + import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi'; import getConfig from '../../lib/wagmi/getConfig'; import type { IAddress } from '../../types'; @@ -8,7 +10,7 @@ import { balanceOf } from './balanceOf'; export async function tokenOfOwner(address: IAddress): Promise { const balance = await balanceOf(address); - const { config, chainId } = getConfig(); + const config = getConfig(); const params = { contracts: [] } as any; diff --git a/packages/taikoon-ui/src/lib/token/tokenURI.ts b/packages/taikoon-ui/src/lib/token/tokenURI.ts index 92a9da0c101..65e87d9fa2c 100644 --- a/packages/taikoon-ui/src/lib/token/tokenURI.ts +++ b/packages/taikoon-ui/src/lib/token/tokenURI.ts @@ -1,10 +1,12 @@ import { readContract } from '@wagmi/core'; +import { chainId } from '$lib/chain'; + import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi/'; import getConfig from '../../lib/wagmi/getConfig'; export async function tokenURI(tokenId: number): Promise { - const { config, chainId } = getConfig(); + const config = getConfig(); const result = await readContract(config, { abi: taikoonTokenAbi, diff --git a/packages/taikoon-ui/src/lib/token/totalSupply.ts b/packages/taikoon-ui/src/lib/token/totalSupply.ts index 2969756b88c..6f73dcfebab 100644 --- a/packages/taikoon-ui/src/lib/token/totalSupply.ts +++ b/packages/taikoon-ui/src/lib/token/totalSupply.ts @@ -1,10 +1,12 @@ import { readContract } from '@wagmi/core'; +import { chainId } from '$lib/chain'; + import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi'; import getConfig from '../../lib/wagmi/getConfig'; export async function totalSupply(): Promise { - const { config, chainId } = getConfig(); + const config = getConfig(); const result = await readContract(config, { abi: taikoonTokenAbi, diff --git a/packages/taikoon-ui/src/lib/user/totalWhitelistMintCount.ts b/packages/taikoon-ui/src/lib/user/totalWhitelistMintCount.ts index 9cd90f30209..9533059e603 100644 --- a/packages/taikoon-ui/src/lib/user/totalWhitelistMintCount.ts +++ b/packages/taikoon-ui/src/lib/user/totalWhitelistMintCount.ts @@ -1,20 +1,16 @@ import { StandardMerkleTree } from '@openzeppelin/merkle-tree'; -import { getAccount } from '@wagmi/core'; +import { type Address, getAddress } from 'viem'; -import getConfig from '../wagmi/getConfig'; -import { whitelist } from '../whitelist'; +import { chainId } from '$lib/chain'; -export async function totalWhitelistMintCount(): Promise { - const { config, chainId } = getConfig(); +import { whitelist } from '../whitelist'; +export async function totalWhitelistMintCount(address: Address): Promise { try { - const account = getAccount(config); - if (!account.address) return -1; - const tree = StandardMerkleTree.load(whitelist[chainId]); // eslint-disable-next-line @typescript-eslint/no-unused-vars - for (const [_, [address, amount]] of tree.entries()) { - if (address.toString().toLowerCase() === account.address.toString().toLowerCase()) { + for (const [_, [leafAddress, amount]] of tree.entries()) { + if (getAddress(leafAddress) === getAddress(address)) { return parseInt(amount); } } diff --git a/packages/taikoon-ui/src/lib/util/calculateGasPrice.ts b/packages/taikoon-ui/src/lib/util/calculateGasPrice.ts new file mode 100644 index 00000000000..95069a36b18 --- /dev/null +++ b/packages/taikoon-ui/src/lib/util/calculateGasPrice.ts @@ -0,0 +1,13 @@ +import { getGasPrice } from '@wagmi/core'; +import { parseGwei } from 'viem'; + +import getConfig from '$lib/wagmi/getConfig'; + +export default async function calculateGasPrice(): Promise { + const config = getConfig(); + const currentGasPrice = parseInt((await getGasPrice(config)).toString()); + const minGasPrice = parseInt(parseGwei('0.01').toString()); + const out = Math.max(currentGasPrice, minGasPrice); + + return BigInt(out); +} diff --git a/packages/taikoon-ui/src/lib/util/isDevelopmentEnv.ts b/packages/taikoon-ui/src/lib/util/isDevelopmentEnv.ts new file mode 100644 index 00000000000..4ff6e60878c --- /dev/null +++ b/packages/taikoon-ui/src/lib/util/isDevelopmentEnv.ts @@ -0,0 +1,3 @@ +const { MODE } = import.meta.env; + +export const isDevelopmentEnv = MODE === 'development'; diff --git a/packages/taikoon-ui/src/lib/wagmi/estimateContractGas.ts b/packages/taikoon-ui/src/lib/wagmi/estimateContractGas.ts index 4b25be97c22..37149260522 100644 --- a/packages/taikoon-ui/src/lib/wagmi/estimateContractGas.ts +++ b/packages/taikoon-ui/src/lib/wagmi/estimateContractGas.ts @@ -5,7 +5,7 @@ import getConfig from './getConfig'; export default async function estimateContractGas(params: Parameters[1]) { try { - const { config } = getConfig(); + const config = getConfig(); const client = await getConnectorClient(config); return await viemEstimateContractGas(client, params); diff --git a/packages/taikoon-ui/src/lib/wagmi/getBalance.ts b/packages/taikoon-ui/src/lib/wagmi/getBalance.ts index 14c35490e63..0bd4a220877 100644 --- a/packages/taikoon-ui/src/lib/wagmi/getBalance.ts +++ b/packages/taikoon-ui/src/lib/wagmi/getBalance.ts @@ -1,11 +1,13 @@ import { getBalance as wagmiGetBalance } from '@wagmi/core'; import { type GetBalanceReturnType } from '@wagmi/core'; +import { chainId } from '$lib/chain'; + import type { IAddress } from '../../types'; import getConfig from './getConfig'; export default async function getBalance(address: IAddress): Promise { - const { config, chainId } = getConfig(); + const config = getConfig(); const balance = (await wagmiGetBalance(config, { address, chainId, diff --git a/packages/taikoon-ui/src/lib/wagmi/getConfig.ts b/packages/taikoon-ui/src/lib/wagmi/getConfig.ts index 88b5682d544..9f900e870c8 100644 --- a/packages/taikoon-ui/src/lib/wagmi/getConfig.ts +++ b/packages/taikoon-ui/src/lib/wagmi/getConfig.ts @@ -1,16 +1,21 @@ -import { config, publicConfig, taiko } from '$wagmi-config'; +import { defaultWagmiConfig } from '@web3modal/wagmi'; -import type { IChainId } from '../../types'; -import { web3modal } from '../connect'; +import { PUBLIC_WALLETCONNECT_PROJECT_ID } from '$env/static/public'; +import { chains } from '$lib/chain'; -export default function getConfig() { - const { selectedNetworkId } = web3modal.getState(); - const wagmiConfig = selectedNetworkId ? config : publicConfig; +const projectId = PUBLIC_WALLETCONNECT_PROJECT_ID; - const chainId = selectedNetworkId ? selectedNetworkId : taiko.id; +const metadata = { + name: 'Taiko Trailblazer', + description: 'Taiko Trailblazer', + url: 'https://trailblazers.taiko.xyz/', + icons: ['https://avatars.githubusercontent.com/u/99078433'], +}; - return { - config: wagmiConfig, - chainId: chainId as IChainId, - }; +export default function getConfig() { + return defaultWagmiConfig({ + projectId, + chains, + metadata, + }); } diff --git a/packages/taikoon-ui/src/lib/wagmi/getLogs.ts b/packages/taikoon-ui/src/lib/wagmi/getLogs.ts index 32ecc543903..f605c47201b 100644 --- a/packages/taikoon-ui/src/lib/wagmi/getLogs.ts +++ b/packages/taikoon-ui/src/lib/wagmi/getLogs.ts @@ -3,7 +3,7 @@ import { getLogs as viemGetLogs } from 'viem/actions'; import getConfig from './getConfig'; export default async function getLogs(params: Parameters[1]) { - const { config } = getConfig(); + const config = getConfig(); const client = await getConnectorClient(config); return await viemGetLogs(client, params); diff --git a/packages/taikoon-ui/src/lib/wagmi/publicClient.ts b/packages/taikoon-ui/src/lib/wagmi/publicClient.ts index fca3f71006e..4c9f626f7f4 100644 --- a/packages/taikoon-ui/src/lib/wagmi/publicClient.ts +++ b/packages/taikoon-ui/src/lib/wagmi/publicClient.ts @@ -1,10 +1,10 @@ import { createPublicClient, http } from 'viem'; -import { holesky } from 'viem/chains'; +import { taiko } from 'viem/chains'; export default async function publicClient() { const client = createPublicClient({ - chain: holesky, - transport: http('https://1rpc.io/holesky'), + chain: taiko, + transport: http('https://rpc.mainnet.taiko.xyz'), }); return client; } diff --git a/packages/taikoon-ui/src/lib/wagmi/watcher.ts b/packages/taikoon-ui/src/lib/wagmi/watcher.ts index 97222b5bc98..16da0160cee 100644 --- a/packages/taikoon-ui/src/lib/wagmi/watcher.ts +++ b/packages/taikoon-ui/src/lib/wagmi/watcher.ts @@ -1,8 +1,8 @@ import { watchAccount } from '@wagmi/core'; -import { config, taiko } from '$wagmi-config'; +import { config } from '$wagmi-config'; -import { isSupportedChain } from '../../lib/chain'; +import { chainId, isSupportedChain } from '../../lib/chain'; import { refreshUserBalance } from '../../lib/util/balance'; import { account } from '../../stores/account'; import { switchChainModal } from '../../stores/modal'; @@ -24,7 +24,7 @@ export async function startWatching() { const isLocalHost = false; // window.location.hostname === 'localhost'; const isVercel = false; // window.location.hostname === 'taikoons-dev.vercel.app'; const isSupportedChainId = - isLocalHost || isVercel ? isSupportedChain(Number(data.chainId)) : data.chainId === taiko.id; + isLocalHost || isVercel ? isSupportedChain(Number(data.chainId)) : data.chainId === chainId; const isConnected = data.address !== undefined; if (!isSupportedChainId && isConnected) { diff --git a/packages/taikoon-ui/src/lib/whitelist/getProof.ts b/packages/taikoon-ui/src/lib/whitelist/getProof.ts index c0e29f57afe..97b6127f410 100644 --- a/packages/taikoon-ui/src/lib/whitelist/getProof.ts +++ b/packages/taikoon-ui/src/lib/whitelist/getProof.ts @@ -1,25 +1,17 @@ import { StandardMerkleTree } from '@openzeppelin/merkle-tree'; -import { getAccount } from '@wagmi/core'; -import getConfig from '$lib/wagmi/getConfig'; +import { chainId } from '$lib/chain'; import type { IAddress } from '../../types'; import { whitelist } from './index'; -export default function getProof(address?: IAddress): IAddress[] { - const { config, chainId } = getConfig(); - +export default function getProof(address: IAddress): IAddress[] { try { - if (!address) { - const account = getAccount(config); - if (!account.address) return []; - address = account.address; - } - const tree = StandardMerkleTree.load(whitelist[chainId]); for (const [i, [leafAddress]] of tree.entries()) { if (leafAddress.toString().toLowerCase() === address.toString().toLowerCase()) { const proof = tree.getProof(i); + return proof as IAddress[]; } } diff --git a/packages/taikoon-ui/src/lib/whitelist/index.ts b/packages/taikoon-ui/src/lib/whitelist/index.ts index 0351079005a..a27a93865ed 100644 --- a/packages/taikoon-ui/src/lib/whitelist/index.ts +++ b/packages/taikoon-ui/src/lib/whitelist/index.ts @@ -1,13 +1,9 @@ -import { hardhat, holesky } from '@wagmi/core/chains'; +import { taiko, taikoHekla } from '@wagmi/core/chains'; -import { taiko } from '$wagmi-config'; - -import { default as HardhatWhitelist } from '../../generated/whitelist/hardhat.json'; -import { default as HoleskyWhitelist } from '../../generated/whitelist/holesky.json'; +import { default as HeklaWhitelist } from '../../generated/whitelist/hekla.json'; import { default as TaikoWhitelist } from '../../generated/whitelist/mainnet.json'; export const whitelist: Record = { - [hardhat.id]: HardhatWhitelist, - [holesky.id]: HoleskyWhitelist, + [taikoHekla.id]: HeklaWhitelist, [taiko.id]: TaikoWhitelist, }; diff --git a/packages/taikoon-ui/src/wagmi.config.ts b/packages/taikoon-ui/src/wagmi.config.ts index d00d2d35f2f..19be8178306 100644 --- a/packages/taikoon-ui/src/wagmi.config.ts +++ b/packages/taikoon-ui/src/wagmi.config.ts @@ -1,31 +1,22 @@ import { injected, walletConnect } from '@wagmi/connectors'; import { createConfig, http, reconnect } from '@wagmi/core'; +import { taiko, taikoHekla } from 'viem/chains'; -//import { hardhat, holesky } from '@wagmi/core/chains'; import { PUBLIC_WALLETCONNECT_PROJECT_ID } from '$env/static/public'; +import { isDevelopmentEnv } from '$lib/util/isDevelopmentEnv'; const projectId = PUBLIC_WALLETCONNECT_PROJECT_ID; -import { chainIdToChain } from '$lib/chain/chains'; - -export const devnet = chainIdToChain(167001); -export const taiko = chainIdToChain(167000); - const baseConfig = { - chains: [ - // hardhat, - taiko, - // holesky - ], + chains: [isDevelopmentEnv ? taikoHekla : taiko], projectId, metadata: {}, batch: { multicall: true, }, transports: { - // [hardhat.id]: http('http://localhost:8545'), + [taikoHekla.id]: http('https://rpc.hekla.taiko.xyz'), [taiko.id]: http('https://rpc.mainnet.taiko.xyz'), - // [holesky.id]: http('https://1rpc.io/holesky'), }, } as const; diff --git a/packages/taikoon-ui/wagmi.config.ts b/packages/taikoon-ui/wagmi.config.ts index 919d9d5ad21..3483b2d877a 100644 --- a/packages/taikoon-ui/wagmi.config.ts +++ b/packages/taikoon-ui/wagmi.config.ts @@ -3,8 +3,7 @@ import { defineConfig } from '@wagmi/cli' import type { Abi, Address } from 'abitype' import { existsSync, mkdirSync,readFileSync, writeFileSync } from 'fs' -import * as HoleskyDeployment from '../nfts/deployments/taikoon/holesky.json' -import * as LocalhostDeployment from '../nfts/deployments/taikoon/localhost.json' +import * as HeklaDeployment from '../nfts/deployments/taikoon/hekla.json' import * as MainnetDeployment from '../nfts/deployments/taikoon/mainnet.json' import TaikoonToken from '../nfts/out/TaikoonToken.sol/TaikoonToken.json' @@ -30,8 +29,7 @@ function generateWhitelistJson() { mkdirSync(whitelistDir, { recursive: true }); } - generateNetworkWhitelist("hardhat"); - generateNetworkWhitelist("holesky"); + generateNetworkWhitelist("hekla"); generateNetworkWhitelist("mainnet"); } @@ -44,8 +42,7 @@ export default defineConfig({ { name: 'TaikoonToken', address: { - 31337: LocalhostDeployment.TaikoonToken as Address, - 17000: HoleskyDeployment.TaikoonToken as Address, + 167009: HeklaDeployment.TaikoonToken as Address, 167000: MainnetDeployment.TaikoonToken as Address, }, abi: TaikoonToken.abi as Abi, diff --git a/packages/ui-lib/package.json b/packages/ui-lib/package.json index cf904d9fb64..b9b2247a2aa 100644 --- a/packages/ui-lib/package.json +++ b/packages/ui-lib/package.json @@ -50,7 +50,7 @@ "@storybook/sveltekit": "^8.0.10", "@storybook/test": "^8.0.10", "@sveltejs/adapter-auto": "^3.0.0", - "@sveltejs/kit": "^2.0.0", + "@sveltejs/kit": "^2.5.21", "@sveltejs/package": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0", "@types/eslint": "^8.56.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a2fa530d07..aa4a7afd155 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,75 +10,73 @@ importers: devDependencies: lefthook: specifier: ^1.6.10 - version: 1.6.10 + version: 1.6.18 prettier: specifier: ^3.2.5 - version: 3.2.5 + version: 3.3.2 packages/blobstorage: {} - packages/branding: {} - packages/bridge-ui: dependencies: '@moralisweb3/common-evm-utils': specifier: ^2.26.1 - version: 2.26.1(debug@4.3.4) + version: 2.26.2(debug@4.3.4) '@wagmi/connectors': specifier: ^4.3.1 - version: 4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 4.3.10(vnbhrjghrun7rfuxsawo7otej4) '@wagmi/core': specifier: ^2.8.1 - version: 2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) '@walletconnect/ethereum-provider': specifier: ^2.12.2 - version: 2.13.0(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + version: 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) '@walletconnect/modal': specifier: ^2.6.2 - version: 2.6.2(@types/react@18.3.2)(react@18.3.1) + version: 2.6.2(@types/react@18.3.5)(react@18.2.0) '@web3modal/wagmi': specifier: ^4.1.11 - version: 4.1.11(@types/react@18.3.2)(@wagmi/connectors@4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)) + version: 4.1.11(@types/react@18.3.5)(@wagmi/connectors@4.3.10(vnbhrjghrun7rfuxsawo7otej4))(@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8)) '@zerodevx/svelte-toast': specifier: ^0.9.5 - version: 0.9.5(svelte@4.2.16) + version: 0.9.5(svelte@4.2.17) axios: specifier: ^1.6.7 - version: 1.6.8(debug@4.3.4) + version: 1.6.7(debug@4.3.4) buffer: specifier: ^6.0.3 version: 6.0.3 debug: specifier: ^4.3.4 - version: 4.3.4 + version: 4.3.5 events: specifier: ^3.3.0 version: 3.3.0 moralis: specifier: ^2.26.1 - version: 2.26.1(debug@4.3.4) + version: 2.26.2(debug@4.3.4) object-hash: specifier: ^3.0.0 version: 3.0.0 svelte-i18n: specifier: ^4.0.0 - version: 4.0.0(svelte@4.2.16) + version: 4.0.0(svelte@4.2.17) viem: specifier: ^2.9.29 - version: 2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + version: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) devDependencies: '@playwright/test': specifier: ^1.43.1 - version: 1.44.0 + version: 1.43.1 '@sveltejs/adapter-auto': specifier: ^3.2.0 - version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))) + version: 3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))) '@sveltejs/kit': - specifier: ^2.5.7 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + specifier: ^2.5.21 + version: 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.0 - version: 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@types/debug': specifier: ^4.1.12 version: 4.1.12 @@ -87,124 +85,124 @@ importers: version: 3.0.6 '@typescript-eslint/eslint-plugin': specifier: ^7.8.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: ^7.8.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(eslint@8.56.0)(typescript@5.4.3) '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.6.0(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) + version: 1.4.0(vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2)) '@wagmi/cli': specifier: ^2.1.4 - version: 2.1.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3) + version: 2.1.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10) abitype: specifier: ^1.0.2 - version: 1.0.2(typescript@5.4.5)(zod@3.23.8) + version: 1.0.2(typescript@5.4.3)(zod@3.23.8) ajv: specifier: ^8.12.0 - version: 8.13.0 + version: 8.12.0 autoprefixer: specifier: ^10.4.18 - version: 10.4.19(postcss@8.4.38) + version: 10.4.18(postcss@8.4.38) daisyui: specifier: ^4.10.3 - version: 4.11.1(postcss@8.4.38) + version: 4.12.10(postcss@8.4.39) dotenv: specifier: ^16.4.5 version: 16.4.5 eslint: specifier: ^8.56.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-plugin-simple-import-sort: specifier: ^12.0.0 - version: 12.1.0(eslint@8.57.0) + version: 12.0.0(eslint@8.56.0) eslint-plugin-svelte: specifier: ^2.38.0 - version: 2.38.0(eslint@8.57.0)(svelte@4.2.16)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 2.38.0(eslint@8.56.0)(svelte@4.2.17)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) ethereum-address: specifier: ^0.0.4 version: 0.0.4 jsdom: specifier: ^24.0.0 - version: 24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + version: 24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) lokijs: specifier: ^1.5.12 version: 1.5.12 postcss: specifier: ^8.4.38 - version: 8.4.38 + version: 8.4.39 prettier: specifier: ^3.2.5 - version: 3.2.5 + version: 3.3.2 prettier-plugin-svelte: specifier: ^3.2.3 - version: 3.2.3(prettier@3.2.5)(svelte@4.2.16) + version: 3.2.3(prettier@3.2.5)(svelte@4.2.17) svelte: specifier: ^4.2.15 - version: 4.2.16 + version: 4.2.17 svelte-check: specifier: ^3.7.1 - version: 3.7.1(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16) + version: 3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.17) tailwindcss: specifier: ^3.4.3 - version: 3.4.3(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) ts-morph: specifier: ^19.0.0 version: 19.0.0 tslib: specifier: ^2.6.2 - version: 2.6.2 + version: 2.6.3 typescript: specifier: ^5.4.3 - version: 5.4.5 + version: 5.4.3 vite: specifier: ^5.2.10 - version: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + version: 5.2.11(@types/node@20.12.7)(terser@5.27.2) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 4.3.2(typescript@5.4.3)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) vitest: specifier: ^1.5.3 - version: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + version: 1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2) vitest-fetch-mock: specifier: ^0.2.2 - version: 0.2.2(encoding@0.1.13)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) + version: 0.2.2(encoding@0.1.13)(vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2)) vitest-mock-extended: specifier: 1.3.1 - version: 1.3.1(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) + version: 1.3.1(typescript@5.4.3)(vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2)) packages/docs-site: dependencies: '@astrojs/check': - specifier: ^0.6.0 - version: 0.6.0(prettier@3.2.5)(typescript@5.4.5) + specifier: ^0.8.0 + version: 0.8.3(prettier@3.2.5)(typescript@5.4.5) '@astrojs/starlight': - specifier: ^0.22.2 - version: 0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) + specifier: ^0.25.0 + version: 0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) astro: - specifier: ^4.8.3 - version: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) + specifier: ^4.11.5 + version: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) astro-og-canvas: specifier: ^0.5.0 - version: 0.5.0(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) + version: 0.5.0(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) canvaskit-wasm: specifier: ^0.39.1 version: 0.39.1 sharp: specifier: ^0.33.3 - version: 0.33.3 + version: 0.33.4 starlight-links-validator: specifier: ^0.8.0 - version: 0.8.0(@astrojs/starlight@0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)))(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) + version: 0.8.0(@astrojs/starlight@0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)))(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) starlight-openapi: specifier: ^0.6.3 - version: 0.6.3(@astrojs/markdown-remark@5.1.0)(@astrojs/starlight@0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)))(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5))(openapi-types@12.1.3) + version: 0.6.3(@astrojs/markdown-remark@5.2.0)(@astrojs/starlight@0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)))(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5))(openapi-types@12.1.3) typescript: specifier: ^5.4.5 - version: 5.4.5 + version: 5.5.3 packages/eventindexer: {} @@ -216,104 +214,113 @@ importers: dependencies: '@wagmi/core': specifier: ^2.8.0 - version: 2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@6.0.3)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) axios: specifier: ^1.6.7 - version: 1.6.8(debug@4.3.4) + version: 1.6.7(debug@4.3.4) debug: specifier: ^4.3.4 - version: 4.3.4 + version: 4.3.5 svelte-i18n: specifier: ^4.0.0 - version: 4.0.0(svelte@4.2.16) + version: 4.0.0(svelte@4.2.13) viem: specifier: ^2.9.29 - version: 2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + version: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8) devDependencies: '@playwright/test': specifier: ^1.43.1 - version: 1.44.0 + version: 1.43.1 '@sveltejs/adapter-auto': specifier: ^3.2.0 - version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0))) + version: 3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2))) '@sveltejs/kit': - specifier: ^2.5.5 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + specifier: ^2.5.21 + version: 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.0 - version: 3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + version: 3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) '@tailwindcss/nesting': specifier: 0.0.0-insiders.565cd3e - version: 0.0.0-insiders.565cd3e(postcss@8.4.38) + version: 0.0.0-insiders.565cd3e(postcss@8.4.39) '@typescript-eslint/eslint-plugin': specifier: ^7.4.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.4.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: ^7.7.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.7.0(eslint@8.56.0)(typescript@5.4.3) autoprefixer: specifier: ^10.4.18 - version: 10.4.19(postcss@8.4.38) + version: 10.4.18(postcss@8.4.38) daisyui: specifier: ^4.10.1 - version: 4.11.1(postcss@8.4.38) + version: 4.10.1(postcss@8.4.38) eslint: specifier: ^8.56.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-plugin-svelte: specifier: ^2.38.0 - version: 2.38.0(eslint@8.57.0)(svelte@4.2.16)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 2.38.0(eslint@8.56.0)(svelte@4.2.13)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) postcss: specifier: ^8.4.38 - version: 8.4.38 + version: 8.4.39 postcss-import: specifier: ^16.1.0 - version: 16.1.0(postcss@8.4.38) + version: 16.1.0(postcss@8.4.39) postcss-nesting: specifier: ^12.1.0 - version: 12.1.2(postcss@8.4.38) + version: 12.1.0(postcss@8.4.38) prettier: specifier: ^3.2.5 - version: 3.2.5 + version: 3.3.2 prettier-plugin-svelte: specifier: ^3.2.2 - version: 3.2.3(prettier@3.2.5)(svelte@4.2.16) + version: 3.2.2(prettier@3.2.5)(svelte@4.2.13) svelte: specifier: ^4.2.13 - version: 4.2.16 + version: 4.2.13 svelte-check: specifier: ^3.7.1 - version: 3.7.1(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16) + version: 3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.13) tailwindcss: specifier: ^3.4.3 - version: 3.4.3(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) tslib: specifier: ^2.6.2 - version: 2.6.2 + version: 2.6.3 typescript: specifier: ^5.4.3 - version: 5.4.5 + version: 5.4.3 vite: specifier: ^4.5.3 - version: 4.5.3(@types/node@20.12.11)(terser@5.31.0) + version: 4.5.3(@types/node@20.12.7)(terser@5.27.2) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + version: 4.3.2(typescript@5.4.3)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) vitest: specifier: ^1.5.0 - version: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + version: 1.5.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.27.2) + + packages/monitors: + devDependencies: + '@openzeppelin/defender-as-code': + specifier: ^3.0.1 + version: 3.0.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core@1.10.4(encoding@0.1.13))(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + serverless: + specifier: 4.4.3 + version: 4.4.3 packages/nfts: dependencies: '@aws-sdk/client-s3': specifier: ^3.574.0 - version: 3.575.0 + version: 3.577.0 '@aws-sdk/lib-storage': specifier: ^3.574.0 - version: 3.575.0(@aws-sdk/client-s3@3.575.0) + version: 3.578.0(@aws-sdk/client-s3@3.577.0) '@openzeppelin/contracts': specifier: 5.0.2 version: 5.0.2 @@ -328,7 +335,7 @@ importers: version: link:../supplementary-contracts convert-csv-to-json: specifier: ^2.46.0 - version: 2.46.0 + version: 2.48.0 dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -337,13 +344,13 @@ importers: version: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 forge-std: specifier: github:foundry-rs/forge-std - version: https://codeload.github.com/foundry-rs/forge-std/tar.gz/52715a217dc51d0de15877878ab8213f6cbbbab5 + version: https://codeload.github.com/foundry-rs/forge-std/tar.gz/8f24d6b04c92975e0795b5868aa0d783251cdeaa ipfs-http-client: specifier: ^60.0.1 - version: 60.0.1(encoding@0.1.13) + version: 60.0.1 merkletreejs: - specifier: ^0.3.11 - version: 0.3.11 + specifier: ^0.4.0 + version: 0.4.0 murky: specifier: github:dmfxyz/murky version: https://codeload.github.com/dmfxyz/murky/tar.gz/5feccd1253d7da820f7cccccdedf64471025455d @@ -352,7 +359,7 @@ importers: version: p256-verifier#v0.1.0@https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da sharp: specifier: ^0.33.3 - version: 0.33.3 + version: 0.33.4 solady: specifier: github:Vectorized/solady#v0.0.167 version: https://codeload.github.com/Vectorized/solady/tar.gz/de0f336d2033d04e0f77c923d639c7fbffd48b6d @@ -362,49 +369,49 @@ importers: devDependencies: '@types/node': specifier: ^20.11.30 - version: 20.12.11 + version: 20.12.7 '@typescript-eslint/eslint-plugin': specifier: ^7.4.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: ^7.7.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(eslint@8.56.0)(typescript@5.4.5) eslint: specifier: ^8.51.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-config-standard: specifier: ^17.1.0 - version: 17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0) + version: 17.1.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0))(eslint-plugin-n@16.6.2(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0) eslint-plugin-import: specifier: ^2.28.1 - version: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) + version: 2.29.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0) eslint-plugin-node: specifier: ^11.1.0 - version: 11.1.0(eslint@8.57.0) + version: 11.1.0(eslint@8.56.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5) eslint-plugin-promise: specifier: ^6.1.1 - version: 6.1.1(eslint@8.57.0) + version: 6.1.1(eslint@8.56.0) ethers: specifier: ^5.7.2 - version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) solc: specifier: 0.8.24 version: 0.8.24 solhint: specifier: ^4.5.4 - version: 4.5.4(typescript@5.4.5) + version: 4.5.4(typescript@5.5.3) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) + version: 10.9.2(@types/node@20.12.7)(typescript@5.4.5) typescript: specifier: ^5.2.2 - version: 5.4.5 + version: 5.5.3 packages/protocol: dependencies: @@ -417,64 +424,79 @@ importers: ds-test: specifier: github:dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0 version: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 + eigenlayer-contracts: + specifier: github:Layr-labs/eigenlayer-contracts#dev + version: https://codeload.github.com/Layr-labs/eigenlayer-contracts/tar.gz/30040aa273edeefe83333fa9183a0a26a84cebf0(hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10)) + eigenlayer-middleware: + specifier: github:layr-Labs/eigenlayer-middleware#mainnet + version: https://codeload.github.com/layr-Labs/eigenlayer-middleware/tar.gz/7d49b5181b09198ed275783453aa082bb3766990 forge-std: specifier: github:foundry-rs/forge-std#v1.7.5 version: https://codeload.github.com/foundry-rs/forge-std/tar.gz/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3 merkletreejs: - specifier: ^0.3.11 - version: 0.3.11 + specifier: ^0.4.0 + version: 0.4.0 + optimism: + specifier: github:ethereum-optimism/optimism#v1.8.0 + version: https://codeload.github.com/ethereum-optimism/optimism/tar.gz/ab3a54febb36398539fd3b849c222b7e70169dc8 p256-verifier: specifier: github:taikoxyz/p256-verifier#v0.1.0 version: p256-verifier#v0.1.0@https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da + risc0-ethereum: + specifier: github:risc0/risc0-ethereum#v1.1.2 + version: risc0-ethereum#v1.1.2@https://codeload.github.com/risc0/risc0-ethereum/tar.gz/b8a14213d92fff07dacda993804e7edb7946ca58 solady: - specifier: github:Vectorized/solady#v0.0.167 - version: https://codeload.github.com/Vectorized/solady/tar.gz/de0f336d2033d04e0f77c923d639c7fbffd48b6d + specifier: github:Vectorized/solady#v0.0.231 + version: https://codeload.github.com/Vectorized/solady/tar.gz/a12a2575c899a328c1bafdada632dabbff27cf6b + sp1-contracts: + specifier: github:succinctlabs/sp1-contracts#v3.0.0 + version: sp1-contracts#v3.0.0@https://codeload.github.com/succinctlabs/sp1-contracts/tar.gz/1c4acaeab86789995ae5c6baced66f81e4a57f4d devDependencies: '@types/node': specifier: ^20.11.30 - version: 20.12.11 + version: 20.12.7 '@typescript-eslint/eslint-plugin': specifier: ^7.4.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.4.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: ^7.7.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.7.0(eslint@8.55.0)(typescript@5.4.3) eslint: specifier: ^8.51.0 - version: 8.57.0 + version: 8.55.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.55.0) eslint-config-standard: specifier: ^17.1.0 - version: 17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0) + version: 17.1.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.0))(eslint-plugin-n@16.6.2(eslint@8.55.0))(eslint-plugin-promise@6.1.1(eslint@8.55.0))(eslint@8.55.0) eslint-plugin-import: specifier: ^2.28.1 - version: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) + version: 2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.0) eslint-plugin-node: specifier: ^11.1.0 - version: 11.1.0(eslint@8.57.0) + version: 11.1.0(eslint@8.55.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.55.0))(eslint@8.55.0)(prettier@3.2.5) eslint-plugin-promise: specifier: ^6.1.1 - version: 6.1.1(eslint@8.57.0) + version: 6.1.1(eslint@8.55.0) ethers: specifier: ^5.7.2 - version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) solc: specifier: 0.8.24 version: 0.8.24 solhint: - specifier: ^5.0.1 - version: 5.0.1(typescript@5.4.5) + specifier: ^5.0.3 + version: 5.0.3(typescript@5.4.3) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) + version: 10.9.2(@types/node@20.12.7)(typescript@5.4.3) typescript: specifier: ^5.2.2 - version: 5.4.5 + version: 5.4.3 packages/relayer: {} @@ -485,65 +507,65 @@ importers: version: 1.0.6 '@wagmi/cli': specifier: ^2.1.8 - version: 2.1.8(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3) + version: 2.1.15(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) '@wagmi/connectors': specifier: ^5.0.6 - version: 5.0.6(@types/react@18.3.2)(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 5.1.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) '@wagmi/core': specifier: ^2.10.4 - version: 2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) '@web3modal/common': - specifier: ^4.2.2 - version: 4.2.2 + specifier: ^5.0.11 + version: 5.1.8 '@web3modal/ui': specifier: ^4.2.2 - version: 4.2.2 + version: 4.2.3 '@web3modal/wagmi': specifier: ^4.2.2 - version: 4.2.2(@types/react@18.3.2)(@wagmi/connectors@5.0.6(@types/react@18.3.2)(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)) + version: 4.2.3(hoyagxhmve75vyxjsj4tjya6zm) '@zerodevx/svelte-toast': specifier: ^0.9.5 - version: 0.9.5(svelte@4.2.16) + version: 0.9.5(svelte@4.2.17) autoprefixer: specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.38) + version: 10.4.19(postcss@8.4.39) daisyui: specifier: ^4.10.1 - version: 4.11.1(postcss@8.4.38) + version: 4.12.10(postcss@8.4.39) dayjs: specifier: ^1.11.10 - version: 1.11.11 + version: 1.11.10 debug: specifier: ^4.3.4 - version: 4.3.4 + version: 4.3.5 minidenticons: specifier: ^4.2.1 version: 4.2.1 postcss: specifier: ^8.4.38 - version: 8.4.38 + version: 8.4.39 tailwindcss: specifier: ^3.4.3 - version: 3.4.3(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) viem: specifier: ^2.13.1 - version: 2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + version: 2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) devDependencies: '@chromatic-com/storybook': specifier: ^1.3.1 - version: 1.3.4(react@18.3.1) + version: 1.9.0(react@18.2.0) '@playwright/test': specifier: ^1.28.1 - version: 1.44.0 + version: 1.43.1 '@sveltejs/adapter-auto': specifier: ^3.0.0 - version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))) + version: 3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))) '@sveltejs/kit': - specifier: ^2.0.0 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + specifier: ^2.5.21 + version: 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@sveltejs/vite-plugin-svelte': specifier: ^3.0.0 - version: 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@taiko/ui-lib': specifier: workspace:* version: link:../ui-lib @@ -555,79 +577,79 @@ importers: version: 29.5.12 '@types/node': specifier: ^20.12.7 - version: 20.12.11 + version: 20.12.7 '@typescript-eslint/eslint-plugin': specifier: ^7.0.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: ^7.0.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(eslint@8.56.0)(typescript@5.4.5) convert-csv-to-json: specifier: ^2.44.0 - version: 2.46.0 + version: 2.48.0 dotenv: specifier: ^16.4.5 version: 16.4.5 eslint: specifier: ^8.56.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-plugin-simple-import-sort: specifier: ^12.0.0 - version: 12.1.0(eslint@8.57.0) + version: 12.0.0(eslint@8.56.0) eslint-plugin-storybook: specifier: ^0.8.0 - version: 0.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 0.8.0(eslint@8.56.0)(typescript@5.4.5) eslint-plugin-svelte: specifier: ^2.38.0 - version: 2.38.0(eslint@8.57.0)(svelte@4.2.16)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 2.38.0(eslint@8.56.0)(svelte@4.2.17)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) p-map: specifier: ^7.0.2 version: 7.0.2 prettier: specifier: ^3.1.1 - version: 3.2.5 + version: 3.3.2 prettier-plugin-svelte: specifier: ^3.1.2 - version: 3.2.3(prettier@3.2.5)(svelte@4.2.16) + version: 3.2.3(prettier@3.2.5)(svelte@4.2.17) raw-body: specifier: ^2.5.2 version: 2.5.2 svelte: specifier: ^4.2.7 - version: 4.2.16 + version: 4.2.17 svelte-check: specifier: ^3.7.1 - version: 3.7.1(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16) + version: 3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.17) svelte-copy: specifier: ^1.4.2 - version: 1.4.2(svelte@4.2.16) + version: 1.4.2(svelte@4.2.17) svelte-i18n: specifier: ^4.0.0 - version: 4.0.0(svelte@4.2.16) + version: 4.0.0(svelte@4.2.17) svelte-scrolling: specifier: ^1.4.0 - version: 1.4.0(svelte@4.2.16) + version: 1.4.0(svelte@4.2.17) tailwindcss-image-rendering: specifier: ^1.0.2 version: 1.0.2 tslib: specifier: ^2.4.1 - version: 2.6.2 + version: 2.6.3 typescript: specifier: ^5.0.0 - version: 5.4.5 + version: 5.5.3 vite: specifier: ^5.0.3 - version: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + version: 5.2.11(@types/node@20.12.7)(terser@5.27.2) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) vitest: specifier: ^1.2.0 - version: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + version: 1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2) which: specifier: ^4.0.0 version: 4.0.0 @@ -647,8 +669,8 @@ importers: specifier: github:foundry-rs/forge-std#v1.7.5 version: https://codeload.github.com/foundry-rs/forge-std/tar.gz/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3 merkletreejs: - specifier: ^0.3.11 - version: 0.3.11 + specifier: ^0.4.0 + version: 0.4.0 p256-verifier: specifier: github:taikoxyz/p256-verifier#v0.1.0 version: p256-verifier#v0.1.0@https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da @@ -658,49 +680,49 @@ importers: devDependencies: '@types/node': specifier: ^20.11.30 - version: 20.12.11 + version: 20.12.7 '@typescript-eslint/eslint-plugin': specifier: ^7.4.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.4.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: ^7.7.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.7.0(eslint@8.56.0)(typescript@5.4.3) eslint: specifier: ^8.51.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-config-standard: specifier: ^17.1.0 - version: 17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0) + version: 17.1.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0))(eslint-plugin-n@16.6.2(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0) eslint-plugin-import: specifier: ^2.28.1 - version: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) + version: 2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0) eslint-plugin-node: specifier: ^11.1.0 - version: 11.1.0(eslint@8.57.0) + version: 11.1.0(eslint@8.56.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5) eslint-plugin-promise: specifier: ^6.1.1 - version: 6.1.1(eslint@8.57.0) + version: 6.1.1(eslint@8.56.0) ethers: specifier: ^5.7.2 - version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) solc: specifier: 0.8.24 version: 0.8.24 solhint: specifier: ^4.5.4 - version: 4.5.4(typescript@5.4.5) + version: 4.5.4(typescript@5.4.3) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) + version: 10.9.2(@types/node@20.12.7)(typescript@5.4.3) typescript: specifier: ^5.2.2 - version: 5.4.5 + version: 5.4.3 packages/taiko-client: {} @@ -714,65 +736,65 @@ importers: version: link:../ui-lib '@wagmi/cli': specifier: ^2.1.4 - version: 2.1.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3) + version: 2.1.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10) '@wagmi/connectors': specifier: ^4.1.18 - version: 4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 4.1.18(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) '@wagmi/core': specifier: ^2.8.0 - version: 2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) '@web3modal/common': - specifier: ^4.1.1 - version: 4.1.11 + specifier: ^5.0.11 + version: 5.1.8 '@web3modal/ui': specifier: ^4.1.1 - version: 4.1.11 + version: 4.2.3 '@web3modal/wagmi': specifier: ^4.1.1 - version: 4.1.11(@types/react@18.3.2)(@wagmi/connectors@4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)) + version: 4.1.11(7bejpi3a2bqeihrssz3xbwxki4) '@zerodevx/svelte-toast': specifier: ^0.9.5 - version: 0.9.5(svelte@4.2.16) + version: 0.9.5(svelte@4.2.13) autoprefixer: specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.38) + version: 10.4.19(postcss@8.4.39) daisyui: specifier: ^4.10.1 - version: 4.11.1(postcss@8.4.38) + version: 4.10.1(postcss@8.4.38) dayjs: specifier: ^1.11.10 - version: 1.11.11 + version: 1.11.10 debug: specifier: ^4.3.4 - version: 4.3.4 + version: 4.3.5 minidenticons: specifier: ^4.2.1 version: 4.2.1 postcss: specifier: ^8.4.38 - version: 8.4.38 + version: 8.4.39 tailwindcss: specifier: ^3.4.3 - version: 3.4.3(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) viem: - specifier: ^2.9.29 - version: 2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + specifier: ^2.15.1 + version: 2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) devDependencies: '@chromatic-com/storybook': specifier: ^1.3.1 - version: 1.3.4(react@18.3.1) + version: 1.3.3(react@18.2.0) '@playwright/test': specifier: ^1.28.1 - version: 1.44.0 + version: 1.43.1 '@sveltejs/adapter-auto': specifier: ^3.0.0 - version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))) + version: 3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2))) '@sveltejs/kit': - specifier: ^2.0.0 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + specifier: ^2.5.21 + version: 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.0 - version: 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) '@types/eslint': specifier: ^8.56.0 version: 8.56.10 @@ -781,79 +803,79 @@ importers: version: 29.5.12 '@types/node': specifier: ^20.12.7 - version: 20.12.11 + version: 20.12.7 '@typescript-eslint/eslint-plugin': specifier: ^7.0.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.4.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: ^7.0.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.7.0(eslint@8.56.0)(typescript@5.4.3) convert-csv-to-json: specifier: ^2.44.0 - version: 2.46.0 + version: 2.48.0 dotenv: specifier: ^16.4.5 version: 16.4.5 eslint: specifier: ^8.56.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-plugin-simple-import-sort: specifier: ^12.0.0 - version: 12.1.0(eslint@8.57.0) + version: 12.0.0(eslint@8.56.0) eslint-plugin-storybook: specifier: ^0.8.0 - version: 0.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 0.8.0(eslint@8.56.0)(typescript@5.4.3) eslint-plugin-svelte: specifier: ^2.38.0 - version: 2.38.0(eslint@8.57.0)(svelte@4.2.16)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 2.38.0(eslint@8.56.0)(svelte@4.2.13)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) p-map: specifier: ^7.0.2 version: 7.0.2 prettier: specifier: ^3.1.1 - version: 3.2.5 + version: 3.3.2 prettier-plugin-svelte: specifier: ^3.1.2 - version: 3.2.3(prettier@3.2.5)(svelte@4.2.16) + version: 3.2.2(prettier@3.2.5)(svelte@4.2.13) raw-body: specifier: ^2.5.2 version: 2.5.2 svelte: specifier: ^4.2.7 - version: 4.2.16 + version: 4.2.13 svelte-check: specifier: ^3.7.1 - version: 3.7.1(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16) + version: 3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.13) svelte-copy: specifier: ^1.4.2 - version: 1.4.2(svelte@4.2.16) + version: 1.4.2(svelte@4.2.13) svelte-i18n: specifier: ^4.0.0 - version: 4.0.0(svelte@4.2.16) + version: 4.0.0(svelte@4.2.13) svelte-scrolling: specifier: ^1.4.0 - version: 1.4.0(svelte@4.2.16) + version: 1.4.0(svelte@4.2.13) tailwindcss-image-rendering: specifier: ^1.0.2 version: 1.0.2 tslib: specifier: ^2.4.1 - version: 2.6.2 + version: 2.6.3 typescript: specifier: ^5.0.0 - version: 5.4.5 + version: 5.4.3 vite: specifier: ^5.0.3 - version: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + version: 5.1.3(@types/node@20.12.7)(terser@5.27.2) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 4.3.2(typescript@5.4.3)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) vitest: specifier: ^1.2.0 - version: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + version: 1.5.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2) which: specifier: ^4.0.0 version: 4.0.0 @@ -862,125 +884,132 @@ importers: dependencies: daisyui: specifier: ^4.11.1 - version: 4.11.1(postcss@8.4.38) + version: 4.11.1(postcss@8.4.47) tailwindcss-image-rendering: specifier: ^1.0.2 version: 1.0.2 devDependencies: '@chromatic-com/storybook': specifier: ^1.3.4 - version: 1.3.4(react@18.3.1) + version: 1.9.0(react@18.2.0) '@playwright/test': specifier: ^1.28.1 - version: 1.44.0 + version: 1.43.1 '@storybook/addon-essentials': specifier: ^8.0.10 - version: 8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/addon-interactions': specifier: ^8.0.10 - version: 8.1.1(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) + version: 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/addon-links': specifier: ^8.0.10 - version: 8.1.1(react@18.3.1) + version: 8.3.0(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/addon-themes': specifier: ^8.1.1 - version: 8.1.1 + version: 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/blocks': specifier: ^8.0.10 - version: 8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 8.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/svelte': specifier: ^8.0.10 - version: 8.1.1(encoding@0.1.13)(prettier@3.2.5)(svelte@4.2.16) + version: 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17) '@storybook/sveltekit': specifier: ^8.0.10 - version: 8.1.1(@babel/core@7.24.5)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(encoding@0.1.13)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(prettier@3.2.5)(svelte@4.2.16)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 8.3.0(@babel/core@7.25.2)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@storybook/test': specifier: ^8.0.10 - version: 8.1.1(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) + version: 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@sveltejs/adapter-auto': specifier: ^3.0.0 - version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))) + version: 3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))) '@sveltejs/kit': - specifier: ^2.0.0 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + specifier: ^2.5.21 + version: 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@sveltejs/package': specifier: ^2.0.0 - version: 2.3.1(svelte@4.2.16)(typescript@5.4.5) + version: 2.3.5(svelte@4.2.17)(typescript@5.4.5) '@sveltejs/vite-plugin-svelte': specifier: ^3.0.0 - version: 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@types/eslint': specifier: ^8.56.0 version: 8.56.10 '@typescript-eslint/eslint-plugin': specifier: ^7.0.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: ^7.0.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(eslint@8.56.0)(typescript@5.4.5) autoprefixer: specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.38) + version: 10.4.19(postcss@8.4.47) eslint: specifier: ^8.56.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-plugin-storybook: specifier: ^0.8.0 - version: 0.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 0.8.0(eslint@8.56.0)(typescript@5.4.5) eslint-plugin-svelte: specifier: ^2.35.1 - version: 2.38.0(eslint@8.57.0)(svelte@4.2.16)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 2.38.0(eslint@8.56.0)(svelte@4.2.17)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) prettier: specifier: ^3.1.1 - version: 3.2.5 + version: 3.3.2 prettier-plugin-svelte: specifier: ^3.1.2 - version: 3.2.3(prettier@3.2.5)(svelte@4.2.16) + version: 3.2.3(prettier@3.2.5)(svelte@4.2.17) publint: specifier: ^0.1.9 version: 0.1.16 storybook: specifier: ^8.0.10 - version: 8.1.1(@babel/preset-env@7.24.5(@babel/core@7.24.5))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3) + version: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) svelte: specifier: ^4.2.7 - version: 4.2.16 + version: 4.2.17 svelte-check: specifier: ^3.6.0 - version: 3.7.1(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16) + version: 3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(svelte@4.2.17) tailwindcss: specifier: ^3.4.3 - version: 3.4.3(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) tslib: specifier: ^2.4.1 - version: 2.6.2 + version: 2.6.3 typescript: specifier: ^5.0.0 - version: 5.4.5 + version: 5.5.3 vite: specifier: ^5.0.11 - version: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + version: 5.2.11(@types/node@20.12.7)(terser@5.27.2) vitest: specifier: ^1.2.0 - version: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + version: 1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.27.2) packages: - '@adobe/css-tools@4.3.3': - resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@adobe/css-tools@4.4.0': + resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} '@adraffy/ens-normalize@1.10.0': resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + '@ampproject/remapping@2.2.1': + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} '@apidevtools/openapi-schemas@2.1.0': @@ -990,20 +1019,20 @@ packages: '@apidevtools/swagger-methods@3.0.2': resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} - '@astrojs/check@0.6.0': - resolution: {integrity: sha512-Q6fct7FvByTf0L5lvH2QwFelXtLViWhPNgMfOvrGq7spV5SPX9jQPoFxH+nRFh1oDhBBIWImRjkSpSyhX9fQHA==} + '@astrojs/check@0.8.3': + resolution: {integrity: sha512-ajcSe+ezX5jCc3dreQlWzbknzXgSGnDETNe3C1mawUOtGpO4t5z2YGaD0y+wzB84lmgPWaWZa0fKSPwLq/wUHw==} hasBin: true peerDependencies: typescript: ^5.0.0 - '@astrojs/compiler@2.8.0': - resolution: {integrity: sha512-yrpD1WRGqsJwANaDIdtHo+YVjvIOFAjC83lu5qENIgrafwZcJgSXDuwVMXOgok4tFzpeKLsFQ6c3FoUdloLWBQ==} + '@astrojs/compiler@2.10.3': + resolution: {integrity: sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==} - '@astrojs/internal-helpers@0.4.0': - resolution: {integrity: sha512-6B13lz5n6BrbTqCTwhXjJXuR1sqiX/H6rTxzlXx+lN1NnV4jgnq/KJldCQaUWJzPL5SiWahQyinxAbxQtwgPHA==} + '@astrojs/internal-helpers@0.4.1': + resolution: {integrity: sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==} - '@astrojs/language-server@2.9.0': - resolution: {integrity: sha512-Q3wtoDh3RRfjYNfE5c7GPncAmZ6RMo3AQQCHBExtH5G4UiXYSxg4mPmSBdq+97yIXZWlN63W5V77OxUReAwQYA==} + '@astrojs/language-server@2.14.2': + resolution: {integrity: sha512-daUJ/+/2pPF3eGG4tVdXKyw0tabUDrJKwLzU8VTuNhEHIn3VZAIES6VT3+mX0lmKcMiKM8/bjZdfY+fPfmnsMA==} hasBin: true peerDependencies: prettier: ^3.0.0 @@ -1014,34 +1043,33 @@ packages: prettier-plugin-astro: optional: true - '@astrojs/markdown-remark@5.1.0': - resolution: {integrity: sha512-S6Z3K2hOB7MfjeDoHsotnP/q2UsnEDB8NlNAaCjMDsGBZfTUbWxyLW3CaphEWw08f6KLZi2ibK9yC3BaMhh2NQ==} + '@astrojs/markdown-remark@5.2.0': + resolution: {integrity: sha512-vWGM24KZXz11jR3JO+oqYU3T2qpuOi4uGivJ9SQLCAI01+vEkHC60YJMRvHPc+hwd60F7euNs1PeOEixIIiNQw==} - '@astrojs/mdx@2.3.1': - resolution: {integrity: sha512-BOQFKD2Pi9cRntNQJlpF2fh4xV8doNpmVy9NKI95r4jsitrY4X5aTOhAowi+fkQgP/zW1A4HwCyQ6Pdam6z8zQ==} + '@astrojs/mdx@3.1.6': + resolution: {integrity: sha512-YCEIvNgoQG3oVhe9codH4TX6zjvkl7KGla19yZO5RCnvjv2d9zyrfWqJ98I6/m18PbEY3k8Wjvha0IIf5eZ2sQ==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} peerDependencies: - astro: ^4.0.0 + astro: ^4.8.0 '@astrojs/prism@3.1.0': resolution: {integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - '@astrojs/sitemap@3.1.4': - resolution: {integrity: sha512-po8CqDCK14O6phU1mB5C8SyVLyQEa+7pJM8oXxs1mVh8DgvxxaA5E7lak1vzOmBcyyyHBW32jakGqNYc66sBRw==} + '@astrojs/sitemap@3.1.6': + resolution: {integrity: sha512-1Qp2NvAzVImqA6y+LubKi1DVhve/hXXgFvB0szxiipzh7BvtuKe4oJJ9dXSqaubaTkt4nMa6dv6RCCAYeB6xaQ==} - '@astrojs/starlight@0.22.2': - resolution: {integrity: sha512-z9OR6ChDKIqaw8P9Xer0u7mG33icnszBhqi28BAb1zDt21yHgOjXcGbP73T+3bzG1aWdZD85/4WmktufzD1DPA==} + '@astrojs/starlight@0.25.5': + resolution: {integrity: sha512-JQsfoqRUX/HBpOW8LWPdiIxcfXZ5HOvi4Dz4Ez61U99hDyX3Ix2Q+pmsek1sH5R1MHWx/wlki2VPEqidtKXyiQ==} peerDependencies: - astro: ^4.2.7 + astro: ^4.8.6 '@astrojs/telemetry@3.1.0': resolution: {integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - '@aw-web-design/x-default-browser@1.4.126': - resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} - hasBin: true + '@astrojs/yaml2ts@0.2.1': + resolution: {integrity: sha512-CBaNwDQJz20E5WxzQh4thLVfhB3JEEGz72wRA+oJp6fQR37QLAqXZJU0mHC+yqMOQ6oj0GfRPJrz6hjf+zm6zA==} '@aws-crypto/crc32@3.0.0': resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} @@ -1058,152 +1086,158 @@ packages: '@aws-crypto/sha256-browser@3.0.0': resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} + '@aws-crypto/sha256-js@1.2.2': + resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} + '@aws-crypto/sha256-js@3.0.0': resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} '@aws-crypto/supports-web-crypto@3.0.0': resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} + '@aws-crypto/util@1.2.2': + resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==} + '@aws-crypto/util@3.0.0': resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} - '@aws-sdk/client-s3@3.575.0': - resolution: {integrity: sha512-4h0YIvLNcKNqwPbxWqwHCH3KWMpRdKhfQPq7kZcZXzFRi3yVAVaAsZcH8eXZsKPlitxkfWNgvfcTXOjStL1uHA==} + '@aws-sdk/client-s3@3.577.0': + resolution: {integrity: sha512-mQYXwn6E4Rwggn6teF6EIWJtK8jsKcxnPj2QVETkSmD8QaFLm4g/DgLPdamDE97UI8k1k0cmWqXcTOLIaZ7wQg==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-sso-oidc@3.575.0': - resolution: {integrity: sha512-YCstVaW5tAvXs+v4LR9gNAO+VRhIObjk1/knCdVQ5QQRTevtVQtdJWeNrDZYo4ATo0OHGyqGCj5Z09TWMv+e1Q==} + '@aws-sdk/client-sso-oidc@3.577.0': + resolution: {integrity: sha512-njmKSPDWueWWYVFpFcZ2P3fI6/pdQVDa0FgCyYZhOnJLgEHZIcBBg1AsnkVWacBuLopp9XVt2m+7hO6ugY1/1g==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-sso@3.575.0': - resolution: {integrity: sha512-elFWpAtktD3XBy47etG80GKXK9Lh3sNCMXLjcSs0NS0fdRIQJS2zKxC8qK22UQmdFKpXxthND5FKk7fNEqrR+g==} + '@aws-sdk/client-sso@3.577.0': + resolution: {integrity: sha512-BwujdXrydlk6UEyPmewm5GqG4nkQ6OVyRhS/SyZP/6UKSFv2/sf391Cmz0hN0itUTH1rR4XeLln8XCOtarkrzg==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-sts@3.575.0': - resolution: {integrity: sha512-8MrT4J2dRiskf0JFMGL5VNBqPvc6igNa218LGBJzHXmLsm1WfGCGnce84R7U2USr8oPOenu0XzSCLvMQyZbGWQ==} + '@aws-sdk/client-sts@3.577.0': + resolution: {integrity: sha512-509Kklimva1XVlhGbpTpeX3kOP6ORpm44twJxDHpa9TURbmoaxj7veWlnLCbDorxDTrbsDghvYZshvcLsojVpg==} engines: {node: '>=16.0.0'} - '@aws-sdk/core@3.575.0': - resolution: {integrity: sha512-117U+kQki2XoKcYQfepmlRcNxn6rELGlOFOBQ8Z2JTBXEYHblW2ke067a0CLmxFwp/zCWuc7IGjd3in3x4Q3rg==} + '@aws-sdk/core@3.576.0': + resolution: {integrity: sha512-KDvDlbeipSTIf+ffKtTg1m419TK7s9mZSWC8bvuZ9qx6/sjQFOXIKOVqyuli6DnfxGbvRcwoRuY99OcCH1N/0w==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-env@3.575.0': - resolution: {integrity: sha512-YTgpq3rvYBXzW6OTDB00cE79evQtss/lz2GlJXgqqVXD0m7i77hGA8zb44VevP/WxtDaiSW7SSjuu8VCBGsg4g==} + '@aws-sdk/credential-provider-env@3.577.0': + resolution: {integrity: sha512-Jxu255j0gToMGEiqufP8ZtKI8HW90lOLjwJ3LrdlD/NLsAY0tOQf1fWc53u28hWmmNGMxmCrL2p66IOgMDhDUw==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-http@3.575.0': - resolution: {integrity: sha512-xQfVmYI+9KqRvhWY8fyElnpcVUBBUgi/Hoji3oU6WLrUjrX98k93He7gKDQSyHf7ykMLUAJYWwsV4AjQ2j6njA==} + '@aws-sdk/credential-provider-http@3.577.0': + resolution: {integrity: sha512-n++yhCp67b9+ZRGEdY1jhamB5E/O+QsIDOPSuRmdaSGMCOd82oUEKPgIVEU1bkqxDsBxgiEWuvtfhK6sNiDS0A==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-ini@3.575.0': - resolution: {integrity: sha512-BdM6a/5VUuNge3c6yRuxvO+4srLoSfqHfkQGfUDfhTdTJpljlpfnc9h3z2Ni1+aueOHPZMNFWIktHDcX5wUGBg==} + '@aws-sdk/credential-provider-ini@3.577.0': + resolution: {integrity: sha512-q7lHPtv6BjRvChUE3m0tIaEZKxPTaZ1B3lKxGYsFl3VLAu5N8yGCUKwuA1izf4ucT+LyKscVGqK6VDZx1ev3nw==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-sts': 3.575.0 + '@aws-sdk/client-sts': ^3.577.0 - '@aws-sdk/credential-provider-node@3.575.0': - resolution: {integrity: sha512-rEdNpqW2jEc5kwbf/s9XQywMLQlIkMjuCK6mw9sF2OVRGHGVnh+6eh/1JFx8Kj+eU51ctifQ7KaHe8dGco8HYQ==} + '@aws-sdk/credential-provider-node@3.577.0': + resolution: {integrity: sha512-epZ1HOMsrXBNczc0HQpv0VMjqAEpc09DUA7Rg3gUJfn8umhML7A7bXnUyqPA+S54q397UYg1leQKdSn23OiwQQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-process@3.575.0': - resolution: {integrity: sha512-2/5NJV7MZysKglqJSQ/O8OELNcwLcH3xknabL9NagtzB7RNB2p1AUXR0UlTey9sSDLL4oCmNa/+unYuglW/Ahg==} + '@aws-sdk/credential-provider-process@3.577.0': + resolution: {integrity: sha512-Gin6BWtOiXxIgITrJ3Nwc+Y2P1uVT6huYR4EcbA/DJUPWyO0n9y5UFLewPvVbLkRn15JeEqErBLUrHclkiOKtw==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-sso@3.575.0': - resolution: {integrity: sha512-NtXA9OPIKsqavs2F7hhLT/t2ZDjwJsvQevj31ov1NpmTNYMc7OWFWDptOG7rppsWMsk5KKmfiL2qViQJnezXNA==} + '@aws-sdk/credential-provider-sso@3.577.0': + resolution: {integrity: sha512-iVm5SQvS7EgZTJsRaqUOmDQpBQPPPat42SCbWFvFQOLrl8qewq8OP94hFS5w2mP62zngeYzqhJnDel79HXbxew==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-web-identity@3.575.0': - resolution: {integrity: sha512-QcvVH7wpvpFRXGAGgCBfQeiF/ptD0NJ+Hrc8dDYfPGhFeZ0EoVQBYNphLi25xe7JZ+XbaqCKrURHZtr4fAEOJw==} + '@aws-sdk/credential-provider-web-identity@3.577.0': + resolution: {integrity: sha512-ZGHGNRaCtJJmszb9UTnC7izNCtRUttdPlLdMkh41KPS32vfdrBDHs1JrpbZijItRj1xKuOXsiYSXLAaHGcLh8Q==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-sts': 3.575.0 + '@aws-sdk/client-sts': ^3.577.0 - '@aws-sdk/lib-storage@3.575.0': - resolution: {integrity: sha512-Ejk449EDqrJ1rSKP3T8nIn7n6jVxRTmomY0tmgsbCE0d17b2PzK4J2hjbbIT7AAi4E3kiRYptyIVG8y5Ga1gnw==} + '@aws-sdk/lib-storage@3.578.0': + resolution: {integrity: sha512-SluLJrA/fG82UnE83Albh+gv48McmXkz17kmAMhhNswOxqHsklb5Vu5d/G0DUDAQdeC30sS/9Vhu2zAiJokunw==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-s3': ^3.575.0 + '@aws-sdk/client-s3': ^3.577.0 - '@aws-sdk/middleware-bucket-endpoint@3.575.0': - resolution: {integrity: sha512-ytsp7xcmbpkVk4TLoi91YyXQh/vwSIGdJ2Awo/pi6ac5Fqe6OntPijh5GHSVj5ZrxW4haPWb6HdBmKMo4liGEw==} + '@aws-sdk/middleware-bucket-endpoint@3.577.0': + resolution: {integrity: sha512-twlkNX2VofM6kHXzDEiJOiYCc9tVABe5cbyxMArRWscIsCWG9mamPhC77ezG4XsN9dFEwVdxEYD5Crpm/5EUiw==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-expect-continue@3.575.0': - resolution: {integrity: sha512-8Nq4UtEi63MJPoYBACW5YoMKQdbrkLNGIdTyrolNRNwVS+6nQqDMvBplakCzQ1nL1rHOEEsKKc8e2BlG9SkR5A==} + '@aws-sdk/middleware-expect-continue@3.577.0': + resolution: {integrity: sha512-6dPp8Tv4F0of4un5IAyG6q++GrRrNQQ4P2NAMB1W0VO4JoEu1C8GievbbDLi88TFIFmtKpnHB0ODCzwnoe8JsA==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.575.0': - resolution: {integrity: sha512-UbyqN39v6s+olyuVKwX778w6J2ZuYpxb1j+KdhFtZwpMSLd/UIQ0+A71U2vB6TrC52OEW0jIXEEBv6PcMBz9nw==} + '@aws-sdk/middleware-flexible-checksums@3.577.0': + resolution: {integrity: sha512-IHAUEipIfagjw92LV8SOSBiCF7ZnqfHcw14IkcZW2/mfrCy1Fh/k40MoS/t3Tro2tQ91rgQPwUoSgB/QCi2Org==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-host-header@3.575.0': - resolution: {integrity: sha512-V2WoLBiXNCc4rIWZt6FUcP4TN0Vk02A9PPCBWkTfyOooiqfq+WZmZjRRBpwl1+5UsvARslrKWF0VzheMRXPJLQ==} + '@aws-sdk/middleware-host-header@3.577.0': + resolution: {integrity: sha512-9ca5MJz455CODIVXs0/sWmJm7t3QO4EUa1zf8pE8grLpzf0J94bz/skDWm37Pli13T3WaAQBHCTiH2gUVfCsWg==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-location-constraint@3.575.0': - resolution: {integrity: sha512-MtQsLsEjSSSfm0OlQqg9PEzS1nxJDdApGoeCYLTbCzIp6hChdLZCCsDXwGg9S++24rjQsUglMhXh4WGXQ9FDnw==} + '@aws-sdk/middleware-location-constraint@3.577.0': + resolution: {integrity: sha512-DKPTD2D2s+t2QUo/IXYtVa/6Un8GZ+phSTBkyBNx2kfZz4Kwavhl/JJzSqTV3GfCXkVdFu7CrjoX7BZ6qWeTUA==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-logger@3.575.0': - resolution: {integrity: sha512-7DEKx9Z11Maaye7FfhYtC8rjbM/PcFcMO2N4QEAfypcgWCj+w4gseE2OGdfAH9OFDoFc6YvLp53v16vbPjzQSg==} + '@aws-sdk/middleware-logger@3.577.0': + resolution: {integrity: sha512-aPFGpGjTZcJYk+24bg7jT4XdIp42mFXSuPt49lw5KygefLyJM/sB0bKKqPYYivW0rcuZ9brQ58eZUNthrzYAvg==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-recursion-detection@3.575.0': - resolution: {integrity: sha512-ri89ldRFos6KZDGaknWPS2XPO9qr+gZ7+mPaoU8YkSM1W4uKqtnUSONyc+O3CFGJrqReuGHhRq0l2Sld0bjwOw==} + '@aws-sdk/middleware-recursion-detection@3.577.0': + resolution: {integrity: sha512-pn3ZVEd2iobKJlR3H+bDilHjgRnNrQ6HMmK9ZzZw89Ckn3Dcbv48xOv4RJvu0aU8SDLl/SNCxppKjeLDTPGBNA==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-sdk-s3@3.575.0': - resolution: {integrity: sha512-8cBG8/tap4F6+UigTpKu8D2bvsLgqRTmn1K86qo3LqRX0Wc5X8TVjdKA2PmG0onOOr7rqTLcP9Q02LCh3usU6Q==} + '@aws-sdk/middleware-sdk-s3@3.577.0': + resolution: {integrity: sha512-/t8Shvy6lGIRdTEKG6hA8xy+oon/CDF5H8Ksms/cd/uvIy/MYbNjOJ/Arwk8H5W6LB4DP/1O+tOzOpGx1MCufA==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-signing@3.575.0': - resolution: {integrity: sha512-frpGG7i3YngWwrYIeDq8/nbat3Gfl803qasaS112rmlPU0ezmYS1SPxpXjpIKxUUYofbzaFtRBAOHU1u7GnWew==} + '@aws-sdk/middleware-signing@3.577.0': + resolution: {integrity: sha512-QS/dh3+NqZbXtY0j/DZ867ogP413pG5cFGqBy9OeOhDMsolcwLrQbi0S0c621dc1QNq+er9ffaMhZ/aPkyXXIg==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-ssec@3.575.0': - resolution: {integrity: sha512-rEFt2w3DdlmPsHRvVXOW6rNDIPE7UaEZ5a4LAkn78XilQYuQdhm5wtw5Ao0pJpDSVYNCZDVZaAvdHKQ1dnfwCA==} + '@aws-sdk/middleware-ssec@3.577.0': + resolution: {integrity: sha512-i2BPJR+rp8xmRVIGc0h1kDRFcM2J9GnClqqpc+NLSjmYadlcg4mPklisz9HzwFVcRPJ5XcGf3U4BYs5G8+iTyg==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-user-agent@3.575.0': - resolution: {integrity: sha512-fWlr4RfrUNS2R3PgP+WsoMYORAgv/47Lp0J0fb3dXO1YvdczNWddRbFSUX2MQxM/y9XFfQPLpLgzluhoL3Cjeg==} + '@aws-sdk/middleware-user-agent@3.577.0': + resolution: {integrity: sha512-P55HAXgwmiHHpFx5JEPvOnAbfhN7v6sWv9PBQs+z2tC7QiBcPS0cdJR6PfV7J1n4VPK52/OnrK3l9VxdQ7Ms0g==} engines: {node: '>=16.0.0'} - '@aws-sdk/region-config-resolver@3.575.0': - resolution: {integrity: sha512-sBJKwTWKCWu9y8FzXIijYGwkKr3tDkPXM7BylToe6W+tGkp4OirV4iXrWA9zReNwTTepoxHufofqjGK9BtcI8g==} + '@aws-sdk/region-config-resolver@3.577.0': + resolution: {integrity: sha512-4ChCFACNwzqx/xjg3zgFcW8Ali6R9C95cFECKWT/7CUM1D0MGvkclSH2cLarmHCmJgU6onKkJroFtWp0kHhgyg==} engines: {node: '>=16.0.0'} - '@aws-sdk/signature-v4-multi-region@3.575.0': - resolution: {integrity: sha512-QMwuLuNwnEQ51RCZX8H/lXnOJgBcJJOCgClB9usW/XujNJVq8GnpZ5E7TsQLN88G6fifmcjQWonLKummuh/zVA==} + '@aws-sdk/signature-v4-multi-region@3.577.0': + resolution: {integrity: sha512-mMykGRFBYmlDcMhdbhNM0z1JFUaYYZ8r9WV7Dd0T2PWELv2brSAjDAOBHdJLHObDMYRnM6H0/Y974qTl3icEcQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/token-providers@3.575.0': - resolution: {integrity: sha512-EPNDPQoQkjKqn4D2t70qVzbfdtlaAy9KBdG58qD1yNWVxq8Rh/lXdwmB+aE2PSahtyfVikZdCRoZiFzxDh5IUA==} + '@aws-sdk/token-providers@3.577.0': + resolution: {integrity: sha512-0CkIZpcC3DNQJQ1hDjm2bdSy/Xjs7Ny5YvSsacasGOkNfk+FdkiQy6N67bZX3Zbc9KIx+Nz4bu3iDeNSNplnnQ==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-sso-oidc': 3.575.0 + '@aws-sdk/client-sso-oidc': ^3.577.0 - '@aws-sdk/types@3.575.0': - resolution: {integrity: sha512-XrnolQGs0wXxdgNudirR14OgNOarH7WUif38+2Pd4onZH+L7XoILem0EgA1tRpgFpw2pFHlZCNaAHDNSBEal7g==} + '@aws-sdk/types@3.577.0': + resolution: {integrity: sha512-FT2JZES3wBKN/alfmhlo+3ZOq/XJ0C7QOZcDNrpKjB0kqYoKjhVKZ/Hx6ArR0czkKfHzBBEs6y40ebIHx2nSmA==} engines: {node: '>=16.0.0'} '@aws-sdk/util-arn-parser@3.568.0': resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==} engines: {node: '>=16.0.0'} - '@aws-sdk/util-endpoints@3.575.0': - resolution: {integrity: sha512-wC5x+V6w3kRlR6X6XVINsAPDYG+Tzs3Wthlw+YLtjuPODUNZIQAqsABHahxnekFyAvse+1929Hwo+CaL+BHZGA==} + '@aws-sdk/util-endpoints@3.577.0': + resolution: {integrity: sha512-FjuUz1Kdy4Zly2q/c58tpdqHd6z7iOdU/caYzoc8jwgAHBDBbIJNQLCU9hXJnPV2M8pWxQDyIZsoVwtmvErPzw==} engines: {node: '>=16.0.0'} '@aws-sdk/util-locate-window@3.568.0': resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} engines: {node: '>=16.0.0'} - '@aws-sdk/util-user-agent-browser@3.575.0': - resolution: {integrity: sha512-iADonXyaXgwvC4T0qRuDWCdKInz82GX2cyezq/oqVlL8bPY7HD8jwZZruuJdq5tkaJi1EhbO4+f1ksZqOiZKvQ==} + '@aws-sdk/util-user-agent-browser@3.577.0': + resolution: {integrity: sha512-zEAzHgR6HWpZOH7xFgeJLc6/CzMcx4nxeQolZxVZoB5pPaJd3CjyRhZN0xXeZB0XIRCWmb4yJBgyiugXLNMkLA==} - '@aws-sdk/util-user-agent-node@3.575.0': - resolution: {integrity: sha512-kwzvBfA0LoILDOFS6BV8uOkksBHrYulP6kNXegB5eZnDSNia5DbBsXqxQ/HknNF5a429SWQw2aaQJEgQvZB1VA==} + '@aws-sdk/util-user-agent-node@3.577.0': + resolution: {integrity: sha512-XqvtFjbSMtycZTWVwDe8DRWovuoMbA54nhUoZwVU6rW9OSD6NZWGR512BUGHFaWzW0Wg8++Dj10FrKTG2XtqfA==} engines: {node: '>=16.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1211,165 +1245,198 @@ packages: aws-crt: optional: true - '@aws-sdk/util-utf8-browser@3.259.0': - resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - - '@aws-sdk/xml-builder@3.575.0': - resolution: {integrity: sha512-cWgAwmbFYNCFzPwxL705+lWps0F3ZvOckufd2KKoEZUmtpVw9/txUXNrPySUXSmRTSRhoatIMABNfStWR043bQ==} + '@aws-sdk/xml-builder@3.598.0': + resolution: {integrity: sha512-ZIa2RK7CHFTZ4gwK77WRtsZ6vF7xwRXxJ8KQIxK2duhoTVcn0xYxpFLdW9WZZZvdP9GIF3Loqvf8DRdeU5Jc7Q==} engines: {node: '>=16.0.0'} + '@babel/code-frame@7.23.5': + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + '@babel/code-frame@7.24.2': resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.4': - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - '@babel/core@7.24.5': - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + '@babel/compat-data@7.25.4': + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.5': - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.22.5': - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + '@babel/generator@7.25.6': + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.24.5': - resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.23.10': + resolution: {integrity: sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.22.15': - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + '@babel/helper-create-regexp-features-plugin@7.24.7': + resolution: {integrity: sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.2': - resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + '@babel/helper-define-polyfill-provider@0.5.0': + resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-member-expression-to-functions@7.23.0': + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.24.5': - resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.3': - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.24.5': - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.22.5': - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + '@babel/helper-optimise-call-expression@7.24.7': + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.5': - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.22.20': - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + '@babel/helper-remap-async-to-generator@7.24.7': + resolution: {integrity: sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.24.1': - resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + '@babel/helper-replace-supers@7.22.20': + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.24.5': - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.24.5': - resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.23.4': + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.5': - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + '@babel/helper-wrap-function@7.22.20': + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helpers@7.25.6': + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.24.5': - resolution: {integrity: sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==} + '@babel/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.5': - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.5': - resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} + '@babel/parser@7.23.9': + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@7.24.5': resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5': - resolution: {integrity: sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1': - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3': + resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1': - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3': + resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1': - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7': + resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1388,16 +1455,9 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-export-default-from@7.24.1': - resolution: {integrity: sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-logical-assignment-operators@7.20.7': - resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + '@babel/plugin-proposal-export-default-from@7.23.3': + resolution: {integrity: sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q==} engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead. peerDependencies: '@babel/core': ^7.0.0-0 @@ -1463,8 +1523,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-export-default-from@7.24.1': - resolution: {integrity: sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA==} + '@babel/plugin-syntax-export-default-from@7.23.3': + resolution: {integrity: sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1474,20 +1534,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-flow@7.24.1': - resolution: {integrity: sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==} + '@babel/plugin-syntax-flow@7.23.3': + resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.24.1': - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + '@babel/plugin-syntax-import-assertions@7.23.3': + resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.24.1': - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + '@babel/plugin-syntax-import-attributes@7.23.3': + resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1502,8 +1562,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.24.1': - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1550,8 +1610,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.24.1': - resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + '@babel/plugin-syntax-typescript@7.23.3': + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1562,344 +1622,344 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.24.1': - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + '@babel/plugin-transform-arrow-functions@7.23.3': + resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.24.3': - resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} + '@babel/plugin-transform-async-generator-functions@7.23.9': + resolution: {integrity: sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.24.1': - resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} + '@babel/plugin-transform-async-to-generator@7.23.3': + resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.24.1': - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + '@babel/plugin-transform-block-scoped-functions@7.23.3': + resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.24.5': - resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} + '@babel/plugin-transform-block-scoping@7.23.4': + resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.24.1': - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} + '@babel/plugin-transform-class-properties@7.23.3': + resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.24.4': - resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} + '@babel/plugin-transform-class-static-block@7.23.4': + resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.24.5': - resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} + '@babel/plugin-transform-classes@7.23.8': + resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.24.1': - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + '@babel/plugin-transform-computed-properties@7.23.3': + resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.24.5': - resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} + '@babel/plugin-transform-destructuring@7.23.3': + resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.24.1': - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + '@babel/plugin-transform-dotall-regex@7.23.3': + resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.24.1': - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + '@babel/plugin-transform-duplicate-keys@7.23.3': + resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dynamic-import@7.24.1': - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} + '@babel/plugin-transform-dynamic-import@7.23.4': + resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.24.1': - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + '@babel/plugin-transform-exponentiation-operator@7.23.3': + resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.24.1': - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} + '@babel/plugin-transform-export-namespace-from@7.23.4': + resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-flow-strip-types@7.24.1': - resolution: {integrity: sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==} + '@babel/plugin-transform-flow-strip-types@7.23.3': + resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.24.1': - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + '@babel/plugin-transform-for-of@7.23.6': + resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.24.1': - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + '@babel/plugin-transform-function-name@7.23.3': + resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.24.1': - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} + '@babel/plugin-transform-json-strings@7.23.4': + resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.24.1': - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + '@babel/plugin-transform-literals@7.23.3': + resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.24.1': - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} + '@babel/plugin-transform-logical-assignment-operators@7.23.4': + resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.24.1': - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + '@babel/plugin-transform-member-expression-literals@7.23.3': + resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.24.1': - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + '@babel/plugin-transform-modules-amd@7.23.3': + resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.24.1': - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + '@babel/plugin-transform-modules-commonjs@7.23.3': + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.24.1': - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + '@babel/plugin-transform-modules-systemjs@7.23.9': + resolution: {integrity: sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.24.1': - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + '@babel/plugin-transform-modules-umd@7.23.3': + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5': - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7': + resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.24.1': - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + '@babel/plugin-transform-new-target@7.23.3': + resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1': - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.23.4': + resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.24.1': - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} + '@babel/plugin-transform-numeric-separator@7.23.4': + resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.24.5': - resolution: {integrity: sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==} + '@babel/plugin-transform-object-rest-spread@7.23.4': + resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.24.1': - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + '@babel/plugin-transform-object-super@7.23.3': + resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.24.1': - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} + '@babel/plugin-transform-optional-catch-binding@7.23.4': + resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.24.5': - resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} + '@babel/plugin-transform-optional-chaining@7.23.4': + resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.24.5': - resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} + '@babel/plugin-transform-parameters@7.23.3': + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.24.1': - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} + '@babel/plugin-transform-private-methods@7.23.3': + resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.24.5': - resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} + '@babel/plugin-transform-private-property-in-object@7.23.4': + resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.24.1': - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + '@babel/plugin-transform-property-literals@7.23.3': + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.24.1': - resolution: {integrity: sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==} + '@babel/plugin-transform-react-display-name@7.23.3': + resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.24.5': - resolution: {integrity: sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==} + '@babel/plugin-transform-react-jsx-self@7.23.3': + resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.24.1': - resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} + '@babel/plugin-transform-react-jsx-source@7.23.3': + resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.23.4': - resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + '@babel/plugin-transform-react-jsx@7.25.2': + resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.24.1': - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + '@babel/plugin-transform-regenerator@7.23.3': + resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-reserved-words@7.24.1': - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + '@babel/plugin-transform-reserved-words@7.23.3': + resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-runtime@7.24.3': - resolution: {integrity: sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==} + '@babel/plugin-transform-runtime@7.23.9': + resolution: {integrity: sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.24.1': - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + '@babel/plugin-transform-shorthand-properties@7.23.3': + resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.24.1': - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + '@babel/plugin-transform-spread@7.23.3': + resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.24.1': - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + '@babel/plugin-transform-sticky-regex@7.23.3': + resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.24.1': - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + '@babel/plugin-transform-template-literals@7.23.3': + resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.24.5': - resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} + '@babel/plugin-transform-typeof-symbol@7.23.3': + resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.24.5': - resolution: {integrity: sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==} + '@babel/plugin-transform-typescript@7.23.6': + resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.24.1': - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + '@babel/plugin-transform-unicode-escapes@7.23.3': + resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.24.1': - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} + '@babel/plugin-transform-unicode-property-regex@7.23.3': + resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.24.1': - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + '@babel/plugin-transform-unicode-regex@7.23.3': + resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.24.1': - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} + '@babel/plugin-transform-unicode-sets-regex@7.23.3': + resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.24.5': - resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} + '@babel/preset-env@7.23.9': + resolution: {integrity: sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-flow@7.24.1': - resolution: {integrity: sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA==} + '@babel/preset-flow@7.23.3': + resolution: {integrity: sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1909,14 +1969,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-typescript@7.24.1': - resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} + '@babel/preset-typescript@7.23.3': + resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/register@7.23.7': - resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} + '@babel/register@7.24.6': + resolution: {integrity: sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1924,20 +1984,24 @@ packages: '@babel/regjsgen@0.8.0': resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - '@babel/runtime@7.24.5': - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + '@babel/runtime@7.23.9': + resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} - '@babel/template@7.24.0': - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/traverse@7.25.6': + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.5': - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + '@babel/types@7.23.9': + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.5': - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -1949,8 +2013,67 @@ packages: '@chainsafe/netmask@2.0.0': resolution: {integrity: sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==} - '@chromatic-com/storybook@1.3.4': - resolution: {integrity: sha512-ZfQDc5Zg5YSC9cWdBc9QpMF0vgvknwKTB9xBE0NhCJWjGxG9mz9yLzQTzzliYulPtWgcQ+8cE+apDljYK+fWdQ==} + '@changesets/apply-release-plan@7.0.5': + resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} + + '@changesets/assemble-release-plan@6.0.4': + resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} + + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + + '@changesets/cli@2.27.8': + resolution: {integrity: sha512-gZNyh+LdSsI82wBSHLQ3QN5J30P4uHKJ4fXgoGwQxfXwYFTJzDdvIJasZn8rYQtmKhyQuiBj4SSnLuKlxKWq4w==} + hasBin: true + + '@changesets/config@3.0.3': + resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.2': + resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + + '@changesets/get-release-plan@4.0.4': + resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.1': + resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.0': + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + + '@changesets/pre@2.0.1': + resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} + + '@changesets/read@0.6.1': + resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} + + '@changesets/should-skip-package@0.1.1': + resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.0.0': + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + + '@changesets/write@0.3.2': + resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + + '@chromatic-com/storybook@1.3.3': + resolution: {integrity: sha512-1y9r691T5vVGDZ0HY3YrCXUnvtrT2YrhDuvDZSvYSNUVpM/Imz6i1dnNMKb3eoI1qRsH55mI4zCt+Iq94NLedQ==} + engines: {node: '>=16.0.0', yarn: '>=1.22.18'} + + '@chromatic-com/storybook@1.9.0': + resolution: {integrity: sha512-vYQ+TcfktEE3GHnLZXHCzXF/sN9dw+KivH8a5cmPyd9YtQs7fZtHrEgsIjWpYycXiweKMo1Lm1RZsjxk8DH3rA==} engines: {node: '>=16.0.0', yarn: '>=1.22.18'} '@coinbase/wallet-sdk@3.9.1': @@ -1959,8 +2082,8 @@ packages: '@coinbase/wallet-sdk@3.9.3': resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} - '@coinbase/wallet-sdk@4.0.2': - resolution: {integrity: sha512-WMUeFbtS0rn8zavjAmNhFWq1r3TV7E5KuSij1Sar0/XuOC+nhj96uqSlIApAHdhuScoKZBq39VYsAQCHzOC6/w==} + '@coinbase/wallet-sdk@4.0.4': + resolution: {integrity: sha512-74c040CRnGhfRjr3ArnkAgud86erIqdkPHNt5HR1k9u97uTIZCJww9eGYT67Qf7gHPpGS/xW8Be1D4dvRm63FA==} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -1976,8 +2099,8 @@ packages: peerDependencies: postcss-selector-parser: ^6.0.13 - '@csstools/selector-specificity@3.0.3': - resolution: {integrity: sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==} + '@csstools/selector-specificity@3.0.2': + resolution: {integrity: sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.13 @@ -1986,27 +2109,84 @@ packages: resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} engines: {node: '>=14'} - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - '@emmetio/abbreviation@2.3.3': resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} '@emmetio/css-abbreviation@2.1.8': resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + '@emmetio/css-parser@0.4.0': + resolution: {integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + '@emmetio/scanner@1.0.4': resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + '@emnapi/runtime@1.1.1': resolution: {integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==} + '@emotion/babel-plugin@11.11.0': + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + + '@emotion/cache@11.11.0': + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + + '@emotion/hash@0.9.1': + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + '@emotion/is-prop-valid@1.2.1': + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/react@11.11.3': + resolution: {integrity: sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.1.3': + resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} + + '@emotion/sheet@1.2.2': + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + + '@emotion/styled@11.11.0': + resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + '@emotion/use-insertion-effect-with-fallbacks@1.0.1': resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} peerDependencies: react: '>=16.8.0' + '@emotion/utils@1.2.1': + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + + '@emotion/weak-memoize@0.3.1': + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + '@esbuild/aix-ppc64@0.19.12': resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} @@ -2019,8 +2199,14 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.21.2': - resolution: {integrity: sha512-/c7hocx0pm14bHQlqUVKmxwdT/e5/KkyoY1W8F9lk/8CkE037STDDz8PXUP/LE6faj2HqchvDs9GcShxFhI78Q==} + '@esbuild/aix-ppc64@0.21.3': + resolution: {integrity: sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -2043,8 +2229,14 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.21.2': - resolution: {integrity: sha512-SGZKngoTWVUriO5bDjI4WDGsNx2VKZoXcds+ita/kVYB+8IkSCKDRDaK+5yu0b5S0eq6B3S7fpiEvpsa2ammlQ==} + '@esbuild/android-arm64@0.21.3': + resolution: {integrity: sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -2067,8 +2259,14 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.21.2': - resolution: {integrity: sha512-G1ve3b4FeyJeyCjB4MX1CiWyTaIJwT9wAYE+8+IRA53YoN/reC/Bf2GDRXAzDTnh69Fpl+1uIKg76DiB3U6vwQ==} + '@esbuild/android-arm@0.21.3': + resolution: {integrity: sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -2091,8 +2289,14 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.21.2': - resolution: {integrity: sha512-1wzzNoj2QtNkAYwIcWJ66UTRA80+RTQ/kuPMtEuP0X6dp5Ar23Dn566q3aV61h4EYrrgGlOgl/HdcqN/2S/2vg==} + '@esbuild/android-x64@0.21.3': + resolution: {integrity: sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -2115,8 +2319,14 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.21.2': - resolution: {integrity: sha512-ZyMkPWc5eTROcLOA10lEqdDSTc6ds6nuh3DeHgKip/XJrYjZDfnkCVSty8svWdy+SC1f77ULtVeIqymTzaB6/Q==} + '@esbuild/darwin-arm64@0.21.3': + resolution: {integrity: sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -2139,8 +2349,14 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.21.2': - resolution: {integrity: sha512-K4ZdVq1zP9v51h/cKVna7im7G0zGTKKB6bP2yJiSmHjjOykbd8DdhrSi8V978sF69rkwrn8zCyL2t6I3ei6j9A==} + '@esbuild/darwin-x64@0.21.3': + resolution: {integrity: sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -2163,8 +2379,14 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.21.2': - resolution: {integrity: sha512-4kbOGdpA61CXqadD+Gb/Pw3YXamQGiz9mal/h93rFVSjr5cgMnmJd/gbfPRm+3BMifvnaOfS1gNWaIDxkE2A3A==} + '@esbuild/freebsd-arm64@0.21.3': + resolution: {integrity: sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -2187,8 +2409,14 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.2': - resolution: {integrity: sha512-ShS+R09nuHzDBfPeMUliKZX27Wrmr8UFp93aFf/S8p+++x5BZ+D344CLKXxmY6qzgTL3mILSImPCNJOzD6+RRg==} + '@esbuild/freebsd-x64@0.21.3': + resolution: {integrity: sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -2211,8 +2439,14 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.21.2': - resolution: {integrity: sha512-Hdu8BL+AmO+eCDvvT6kz/fPQhvuHL8YK4ExKZfANWsNe1kFGOHw7VJvS/FKSLFqheXmB3rTF3xFQIgUWPYsGnA==} + '@esbuild/linux-arm64@0.21.3': + resolution: {integrity: sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -2235,8 +2469,14 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.21.2': - resolution: {integrity: sha512-nnGXjOAv+7cM3LYRx4tJsYdgy8dGDGkAzF06oIDGppWbUkUKN9SmgQA8H0KukpU0Pjrj9XmgbWqMVSX/U7eeTA==} + '@esbuild/linux-arm@0.21.3': + resolution: {integrity: sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -2259,8 +2499,14 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.21.2': - resolution: {integrity: sha512-m73BOCW2V9lcj7RtEMi+gBfHC6n3+VHpwQXP5offtQMPLDkpVolYn1YGXxOZ9hp4h3UPRKuezL7WkBsw+3EB3Q==} + '@esbuild/linux-ia32@0.21.3': + resolution: {integrity: sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -2283,8 +2529,14 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.21.2': - resolution: {integrity: sha512-84eYHwwWHq3myIY/6ikALMcnwkf6Qo7NIq++xH0x+cJuUNpdwh8mlpUtRY+JiGUc60yu7ElWBbVHGWTABTclGw==} + '@esbuild/linux-loong64@0.21.3': + resolution: {integrity: sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -2307,8 +2559,14 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.21.2': - resolution: {integrity: sha512-9siSZngT0/ZKG+AH+/agwKF29LdCxw4ODi/PiE0F52B2rtLozlDP92umf8G2GPoVV611LN4pZ+nSTckebOscUA==} + '@esbuild/linux-mips64el@0.21.3': + resolution: {integrity: sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -2331,8 +2589,14 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.21.2': - resolution: {integrity: sha512-y0T4aV2CA+ic04ULya1A/8M2RDpDSK2ckgTj6jzHKFJvCq0jQg8afQQIn4EM0G8u2neyOiNHgSF9YKPfuqKOVw==} + '@esbuild/linux-ppc64@0.21.3': + resolution: {integrity: sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -2355,8 +2619,14 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.21.2': - resolution: {integrity: sha512-x5ssCdXmZC86L2Li1qQPF/VaC4VP20u/Zm8jlAu9IiVOVi79YsSz6cpPDYZl1rfKSHYCJW9XBfFCo66S5gVPSA==} + '@esbuild/linux-riscv64@0.21.3': + resolution: {integrity: sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -2379,8 +2649,14 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.21.2': - resolution: {integrity: sha512-NP7fTpGSFWdXyvp8iAFU04uFh9ARoplFVM/m+8lTRpaYG+2ytHPZWyscSsMM6cvObSIK2KoPHXiZD4l99WaxbQ==} + '@esbuild/linux-s390x@0.21.3': + resolution: {integrity: sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -2403,8 +2679,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.21.2': - resolution: {integrity: sha512-giZ/uOxWDKda44ZuyfKbykeXznfuVNkTgXOUOPJIjbayJV6FRpQ4zxUy9JMBPLaK9IJcdWtaoeQrYBMh3Rr4vQ==} + '@esbuild/linux-x64@0.21.3': + resolution: {integrity: sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -2427,8 +2709,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.2': - resolution: {integrity: sha512-IeFMfGFSQfIj1d4XU+6lkbFzMR+mFELUUVYrZ+jvWzG4NGvs6o53ReEHLHpYkjRbdEjJy2W3lTekTxrFHW7YJg==} + '@esbuild/netbsd-x64@0.21.3': + resolution: {integrity: sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -2451,8 +2739,14 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.2': - resolution: {integrity: sha512-48QhWD6WxcebNNaE4FCwgvQVUnAycuTd+BdvA/oZu+/MmbpU8pY2dMEYlYzj5uNHWIG5jvdDmFXu0naQeOWUoA==} + '@esbuild/openbsd-x64@0.21.3': + resolution: {integrity: sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -2475,8 +2769,14 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.21.2': - resolution: {integrity: sha512-90r3nTBLgdIgD4FCVV9+cR6Hq2Dzs319icVsln+NTmTVwffWcCqXGml8rAoocHuJ85kZK36DCteii96ba/PX8g==} + '@esbuild/sunos-x64@0.21.3': + resolution: {integrity: sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -2499,8 +2799,14 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.21.2': - resolution: {integrity: sha512-sNndlsBT8OeE/MZDSGpRDJlWuhjuUz/dn80nH0EP4ZzDUYvMDVa7G87DVpweBrn4xdJYyXS/y4CQNrf7R2ODXg==} + '@esbuild/win32-arm64@0.21.3': + resolution: {integrity: sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -2523,8 +2829,14 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.21.2': - resolution: {integrity: sha512-Ti2QChGNFzWhUNNVuU4w21YkYTErsNh3h+CzvlEhzgRbwsJ7TrWQqRzW3bllLKKvTppuF3DJ3XP1GEg11AfrEQ==} + '@esbuild/win32-ia32@0.21.3': + resolution: {integrity: sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -2547,8 +2859,14 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.21.2': - resolution: {integrity: sha512-VEfTCZicoZnZ6sGkjFPGRFFJuL2fZn2bLhsekZl1CJslflp2cJS/VoKs1jMk+3pDfsGW6CfQVUckP707HwbXeQ==} + '@esbuild/win32-x64@0.21.3': + resolution: {integrity: sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -2559,8 +2877,8 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@1.4.1': @@ -2571,10 +2889,17 @@ packages: resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + '@eslint/js@8.55.0': + resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.56.0': + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@ethereumjs/common@2.6.5': + resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} + '@ethereumjs/common@3.2.0': resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} @@ -2583,6 +2908,9 @@ packages: engines: {node: '>=14'} hasBin: true + '@ethereumjs/tx@3.5.2': + resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==} + '@ethereumjs/tx@4.2.0': resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} engines: {node: '>=14'} @@ -2681,36 +3009,33 @@ packages: '@ethersproject/wordlists@5.7.0': resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - '@expressive-code/core@0.35.3': - resolution: {integrity: sha512-SYamcarAjufYhbuK/kfvJSvAXLsfnM7DKc78R7Dq4B73R5bKQK2m5zR0l57tXr4yp2C5Z8lu5xZncdwWxcmPdg==} + '@expressive-code/core@0.35.6': + resolution: {integrity: sha512-xGqCkmfkgT7lr/rvmfnYdDSeTdCSp1otAHgoFS6wNEeO7wGDPpxdosVqYiIcQ8CfWUABh/pGqWG90q+MV3824A==} - '@expressive-code/plugin-frames@0.35.3': - resolution: {integrity: sha512-QYytMq6IsaHgTofQ5b6d+CnbxkqLdikSF2hC+IL/ZZwPYHYZoUlmjIwmJZhY4/hHqJGELrtZsyVdlt06RntgmA==} + '@expressive-code/plugin-frames@0.35.6': + resolution: {integrity: sha512-CqjSWjDJ3wabMJZfL9ZAzH5UAGKg7KWsf1TBzr4xvUbZvWoBtLA/TboBML0U1Ls8h/4TRCIvR4VEb8dv5+QG3w==} - '@expressive-code/plugin-shiki@0.35.3': - resolution: {integrity: sha512-aFQBPepv0zhVXqJFAvfQ4vXYv/meJKiqmEEKSxdjAfwXllIV49PDlnGEXmbGYjR4hUQQjbfDgzAbrbfePc3YVQ==} + '@expressive-code/plugin-shiki@0.35.6': + resolution: {integrity: sha512-xm+hzi9BsmhkDUGuyAWIydOAWer7Cs9cj8FM0t4HXaQ+qCubprT6wJZSKUxuvFJIUsIOqk1xXFaJzGJGnWtKMg==} - '@expressive-code/plugin-text-markers@0.35.3': - resolution: {integrity: sha512-gDdnQrfDRXw5Y+PKHJDkpAUdf2pthYOthGcgy3JB8GOTQ3EL1h+755Ct/bGc4MR6jn+dgnQP47uHMWQaccvN6Q==} + '@expressive-code/plugin-text-markers@0.35.6': + resolution: {integrity: sha512-/k9eWVZSCs+uEKHR++22Uu6eIbHWEciVHbIuD8frT8DlqTtHYaaiwHPncO6KFWnGDz5i/gL7oyl6XmOi/E6GVg==} - '@fal-works/esbuild-plugin-global-externals@2.1.2': - resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} - - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + '@fastify/busboy@2.1.0': + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} engines: {node: '>=14'} - '@formatjs/ecma402-abstract@1.18.2': - resolution: {integrity: sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==} + '@formatjs/ecma402-abstract@2.0.0': + resolution: {integrity: sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==} '@formatjs/fast-memoize@2.2.0': resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} - '@formatjs/icu-messageformat-parser@2.7.6': - resolution: {integrity: sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA==} + '@formatjs/icu-messageformat-parser@2.7.8': + resolution: {integrity: sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==} - '@formatjs/icu-skeleton-parser@1.8.0': - resolution: {integrity: sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA==} + '@formatjs/icu-skeleton-parser@1.8.2': + resolution: {integrity: sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==} '@formatjs/intl-localematcher@0.5.4': resolution: {integrity: sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==} @@ -2721,13 +3046,20 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@humanwhocodes/config-array@0.11.13': + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/config-array@0.9.5': resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -2739,18 +3071,24 @@ packages: '@humanwhocodes/object-schema@1.2.1': resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + deprecated: Use @eslint/object-schema instead + + '@humanwhocodes/object-schema@2.0.1': + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + deprecated: Use @eslint/object-schema instead - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + '@humanwhocodes/object-schema@2.0.2': + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + deprecated: Use @eslint/object-schema instead - '@img/sharp-darwin-arm64@0.33.3': - resolution: {integrity: sha512-FaNiGX1MrOuJ3hxuNzWgsT/mg5OHG/Izh59WW2mk1UwYHUwtfbhk5QNKYZgxf0pLOhx9ctGiGa2OykD71vOnSw==} + '@img/sharp-darwin-arm64@0.33.4': + resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.3': - resolution: {integrity: sha512-2QeSl7QDK9ru//YBT4sQkoq7L0EAJZA3rtV+v9p8xTKl4U1bUqTIaCnoC7Ctx2kCjQgwFXDasOtPTCT8eCTXvw==} + '@img/sharp-darwin-x64@0.33.4': + resolution: {integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [darwin] @@ -2803,69 +3141,72 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.3': - resolution: {integrity: sha512-Zf+sF1jHZJKA6Gor9hoYG2ljr4wo9cY4twaxgFDvlG0Xz9V7sinsPp8pFd1XtlhTzYo0IhDbl3rK7P6MzHpnYA==} + '@img/sharp-linux-arm64@0.33.4': + resolution: {integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.3': - resolution: {integrity: sha512-Q7Ee3fFSC9P7vUSqVEF0zccJsZ8GiiCJYGWDdhEjdlOeS9/jdkyJ6sUSPj+bL8VuOYFSbofrW0t/86ceVhx32w==} + '@img/sharp-linux-arm@0.33.4': + resolution: {integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==} engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.3': - resolution: {integrity: sha512-vFk441DKRFepjhTEH20oBlFrHcLjPfI8B0pMIxGm3+yilKyYeHEVvrZhYFdqIseSclIqbQ3SnZMwEMWonY5XFA==} - engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-s390x@0.33.4': + resolution: {integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==} + engines: {glibc: '>=2.31', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.3': - resolution: {integrity: sha512-Q4I++herIJxJi+qmbySd072oDPRkCg/SClLEIDh5IL9h1zjhqjv82H0Seupd+q2m0yOfD+/fJnjSoDFtKiHu2g==} + '@img/sharp-linux-x64@0.33.4': + resolution: {integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.3': - resolution: {integrity: sha512-qnDccehRDXadhM9PM5hLvcPRYqyFCBN31kq+ErBSZtZlsAc1U4Z85xf/RXv1qolkdu+ibw64fUDaRdktxTNP9A==} + '@img/sharp-linuxmusl-arm64@0.33.4': + resolution: {integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==} engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.3': - resolution: {integrity: sha512-Jhchim8kHWIU/GZ+9poHMWRcefeaxFIs9EBqf9KtcC14Ojk6qua7ghKiPs0sbeLbLj/2IGBtDcxHyjCdYWkk2w==} + '@img/sharp-linuxmusl-x64@0.33.4': + resolution: {integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==} engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.3': - resolution: {integrity: sha512-68zivsdJ0koE96stdUfM+gmyaK/NcoSZK5dV5CAjES0FUXS9lchYt8LAB5rTbM7nlWtxaU/2GON0HVN6/ZYJAQ==} + '@img/sharp-wasm32@0.33.4': + resolution: {integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.3': - resolution: {integrity: sha512-CyimAduT2whQD8ER4Ux7exKrtfoaUiVr7HG0zZvO0XTFn2idUWljjxv58GxNTkFb8/J9Ub9AqITGkJD6ZginxQ==} + '@img/sharp-win32-ia32@0.33.4': + resolution: {integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.3': - resolution: {integrity: sha512-viT4fUIDKnli3IfOephGnolMzhz5VaTvDRkYqtZxOMIoMQ4MrAziO7pT1nVnOt2FAm7qW5aa+CCc13aEY6Le0g==} + '@img/sharp-win32-x64@0.33.4': + resolution: {integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [win32] + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + '@ipld/dag-cbor@9.2.0': resolution: {integrity: sha512-N14oMy0q4gM6OuZkIpisKe0JBSjf1Jb39VI+7jMLiWX9124u1Z3Fdj/Tag1NA0cVxxqWDh0CqsjcVfOKtelPDA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - '@ipld/dag-json@10.2.0': - resolution: {integrity: sha512-O9YLUrl3d3WbVz7v1WkajFkyfOLEe2Fep+wor4fgVe0ywxzrivrj437NiPcVyB+2EDdFn/Q7tCHFf8YVhDf8ZA==} + '@ipld/dag-json@10.2.2': + resolution: {integrity: sha512-NnU8HdHKwAoGyrW3S09NMa8aZw0tImLRyR64hoafpLpDpAbA9g1+fb24JsdlugbL4sXUQVwDVA+qK4Ud8V83lA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - '@ipld/dag-pb@4.1.0': - resolution: {integrity: sha512-LJU451Drqs5zjFm7jI4Hs3kHlilOqkjcSfPiQgVsZnWaYb2C7YdfhnclrVn/X+ucKejlU9BL3+gXFCZUXkMuCg==} + '@ipld/dag-pb@4.1.2': + resolution: {integrity: sha512-BSztO4l3C+ya9HjCaQot26Y4AVsqIKtnn6+23ubc1usucnf6yoTBme18oCCdM6gKBMxuPqju5ye3lh9WEJsdeQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} '@isaacs/cliui@8.0.2': @@ -2908,8 +3249,9 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462': - resolution: {integrity: sha512-etqLfpSJ5zaw76KUNF603be6d6QsiQPmaHr9FKEp4zhLZJzWCCMH6Icak7MtLUFLZLMpL761mZNImi/joBo1ZA==} + '@jridgewell/gen-mapping@0.3.3': + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} @@ -2919,16 +3261,23 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/source-map@0.3.5': + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -2961,8 +3310,8 @@ packages: resolution: {integrity: sha512-+c74EVUBTfw2sx1GE/z/IjsYO6dhur+ukF0knAppeZsRQ1Kgg6K5R3eECtT28fC6dBWLjFpAvW/7QGfiDAL4RA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - '@libp2p/interface@1.3.1': - resolution: {integrity: sha512-KJoYP6biAgIHUU3pxaixaaYCvIHZshzXetxfoNigadAZ3hCGuwpdFhk7IABEaI3RgadOOYUwW3MXPbL+cxnXVQ==} + '@libp2p/interface@1.3.0': + resolution: {integrity: sha512-K72Km0Co1Z+pXpggWuoAvUUbvwZYvjCcywrHj2Ym3jt2anTE3hzL4rlZrrkzA0YhNTRFRiZ04dnu6WMXT5/4+A==} '@libp2p/interfaces@3.3.2': resolution: {integrity: sha512-p/M7plbrxLzuQchvNwww1Was7ZeGE2NaOFulMaZBYIihU8z3fhaV+a033OqnC/0NTX/yhfdNOG7znhYq3XoR/g==} @@ -2985,6 +3334,12 @@ packages: '@lit/reactive-element@2.0.4': resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mdx-js/mdx@3.0.1': resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} @@ -2998,14 +3353,30 @@ packages: resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} engines: {node: '>=14.0.0'} - '@metamask/json-rpc-engine@7.3.3': - resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} + '@metamask/eth-sig-util@4.0.1': + resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} + engines: {node: '>=12.0.0'} + + '@metamask/json-rpc-engine@7.3.2': + resolution: {integrity: sha512-dVjBPlni4CoiBpESVqrxh6k4OR14w6GRXKSSXHFuITjuhALE42gNCkXTpL4cjNeOBUgTba3eGe5EI8cyc2QLRg==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-engine@8.0.2': + resolution: {integrity: sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==} engines: {node: '>=16.0.0'} '@metamask/json-rpc-middleware-stream@6.0.2': resolution: {integrity: sha512-jtyx3PRfc1kqoLpYveIVQNwsxYKefc64/LCl9h9Da1m3nUKEvypbYuXSIwi237qvOjKmNHQKsDOZg6f4uBf62Q==} engines: {node: '>=16.0.0'} + '@metamask/json-rpc-middleware-stream@7.0.2': + resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} + engines: {node: '>=16.0.0'} + + '@metamask/object-multiplex@1.3.0': + resolution: {integrity: sha512-czcQeVYdSNtabd+NcYQnrM69MciiJyd1qvKH8WM2Id3C0ZiUUX5Xa/MK+/VUk633DBhVOwdNzAKIQ33lGyA+eQ==} + engines: {node: '>=12.0.0'} + '@metamask/object-multiplex@2.0.0': resolution: {integrity: sha512-+ItrieVZie3j2LfYE0QkdW3dsEMfMEp419IGx1zyeLqjRZ14iQUPRO0H6CGgfAAoC0x6k2PfCAGRwJUA9BMrqA==} engines: {node: ^16.20 || ^18.16 || >=20} @@ -3013,10 +3384,22 @@ packages: '@metamask/onboarding@1.0.1': resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} + '@metamask/post-message-stream@6.2.0': + resolution: {integrity: sha512-WunZ0bruClF862mvbKQGETn5SM0XKGmocPMQR1Ew6sYix9/FDzeoZnoI8RkXk01E+70FCdxhTE/r8kk5SFOuTw==} + engines: {node: '>=14.0.0'} + + '@metamask/providers@10.2.1': + resolution: {integrity: sha512-p2TXw2a1Nb8czntDGfeIYQnk4LLVbd5vlcb3GY//lylYlKdSqp+uUTegCvxiFblRDOT68jsY8Ib1VEEzVUOolA==} + engines: {node: '>=14.0.0'} + '@metamask/providers@15.0.0': resolution: {integrity: sha512-FXvL1NQNl6I7fMOJTfQYcBlBZ33vSlm6w80cMpmn8sJh0Lb7wcBpe02UwBsNlARnI+Qsr26XeDs6WHUHQh8CuA==} engines: {node: ^18.18 || >=20} + '@metamask/providers@16.1.0': + resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} + engines: {node: ^18.18 || >=20} + '@metamask/rpc-errors@6.2.1': resolution: {integrity: sha512-VTgWkjWLzb0nupkFl1duQi9Mk8TGT9rsdnQg6DeRrYEFxtFOh0IF8nAwxM/4GWqDl6uIB06lqUBgUrAVWl62Bw==} engines: {node: '>=16.0.0'} @@ -3028,8 +3411,11 @@ packages: resolution: {integrity: sha512-ihb3B0T/wJm1eUuArYP4lCTSEoZsClHhuWyfo/kMX3m/odpqNcPfsz5O2A3NT7dXCAgWPGDQGPqygCpgeniKMw==} engines: {node: '>=12.0.0'} - '@metamask/sdk-communication-layer@0.18.5': - resolution: {integrity: sha512-WMf9oJa3rAimjCXMAaaRVFPD0Q6dfZR0r9037KCpD5g9SlVh+TeMISfdQCEKAyhXP3d4CGxmp/Kib8C3mn2YLw==} + '@metamask/sdk-communication-layer@0.14.3': + resolution: {integrity: sha512-yjSbj8y7fFbQXv2HBzUX6D9C8BimkCYP6BDV7hdw53W8b/GlYCtXVxUFajQ9tuO1xPTRjR/xt/dkdr2aCi6WGw==} + + '@metamask/sdk-communication-layer@0.20.2': + resolution: {integrity: sha512-TN+whYbCClFSkx52Ild1RcjoRyz8YZgwNvZeooIcZIvCfBM6U9W5273KGiY7WLc/oO4KKmFk17d7vMO4gNvhhw==} peerDependencies: cross-fetch: ^3.1.5 eciesjs: ^0.3.16 @@ -3037,17 +3423,20 @@ packages: readable-stream: ^3.6.2 socket.io-client: ^4.5.1 - '@metamask/sdk-communication-layer@0.20.2': - resolution: {integrity: sha512-TN+whYbCClFSkx52Ild1RcjoRyz8YZgwNvZeooIcZIvCfBM6U9W5273KGiY7WLc/oO4KKmFk17d7vMO4gNvhhw==} + '@metamask/sdk-communication-layer@0.28.2': + resolution: {integrity: sha512-kGx6qgP482DecPILnIS38bgxIjNransR3/Jh5Lfg9BXJLaXpq/MEGrjHGnJHAqCyfRymnd5cgexHtXJvQtRWQA==} peerDependencies: - cross-fetch: ^3.1.5 + cross-fetch: ^4.0.0 eciesjs: ^0.3.16 eventemitter2: ^6.4.7 readable-stream: ^3.6.2 socket.io-client: ^4.5.1 - '@metamask/sdk-install-modal-web@0.18.5': - resolution: {integrity: sha512-Wygc0dgr1PwIA/Sg9WW9QWAsQr4G2GV6iveXt2xw8VKW/9cRORWqYukH1NZLr71hBKzi9AKYBU54Tk5Dfg41zg==} + '@metamask/sdk-install-modal-web@0.14.1': + resolution: {integrity: sha512-emT8HKbnfVwGhPxyUfMja6DWzvtJvDEBQxqCVx93H0HsyrrOzOC43iGCAosslw6o5h7gOfRKLqWmK8V7jQAS2Q==} + + '@metamask/sdk-install-modal-web@0.20.2': + resolution: {integrity: sha512-0QiaZhV15AGdN1zU2jfTI32eC3YkwEpzDfR9+oiZ9bd2G72c6lYBhTsmDGUd01aP6A+bqJR5PjI8Wh2AWtoLeA==} peerDependencies: i18next: 22.5.1 react: ^18.2.0 @@ -3062,13 +3451,12 @@ packages: react-native: optional: true - '@metamask/sdk-install-modal-web@0.20.2': - resolution: {integrity: sha512-0QiaZhV15AGdN1zU2jfTI32eC3YkwEpzDfR9+oiZ9bd2G72c6lYBhTsmDGUd01aP6A+bqJR5PjI8Wh2AWtoLeA==} + '@metamask/sdk-install-modal-web@0.28.1': + resolution: {integrity: sha512-mHkIjWTpYQMPDMtLEEtTVXhae4pEjy7jDBfV7497L0U3VCPQrBl/giZBwA6AgKEX1emYcM2d1WRHWR9N4YhyJA==} peerDependencies: - i18next: 22.5.1 + i18next: 23.11.5 react: ^18.2.0 react-dom: ^18.2.0 - react-i18next: ^13.2.2 react-native: '*' peerDependenciesMeta: react: @@ -3078,20 +3466,14 @@ packages: react-native: optional: true - '@metamask/sdk@0.18.6': - resolution: {integrity: sha512-ZT8e4BrcWrm44apLb412WR0fDsgeaS8UlI1c0wKRUPu1w/UntpXuUVO+EaY8WDlnOPAiAsjyqWKey64/DfvbXQ==} + '@metamask/sdk@0.14.3': + resolution: {integrity: sha512-BYLs//nY2wioVSih78gOQI6sLIYY3vWkwVqXGYUgkBV+bi49bv+9S0m+hZ2cwiRaxfMYtKs0KvhAQ8weiYwDrg==} peerDependencies: - '@react-native-async-storage/async-storage': ^1.19.6 react: ^18.2.0 - react-dom: ^18.2.0 react-native: '*' peerDependenciesMeta: - '@react-native-async-storage/async-storage': - optional: true react: optional: true - react-dom: - optional: true react-native: optional: true @@ -3106,73 +3488,84 @@ packages: react-dom: optional: true + '@metamask/sdk@0.28.2': + resolution: {integrity: sha512-pylk1uJAZYyO3HcNW/TNfII3+T+Yx6qrFYaC/HmuSIuRJeXsdZuExSbNQ236iQocIy3L7JjI+GQKbv3TbN+HQQ==} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + '@metamask/utils@5.0.2': resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} engines: {node: '>=14.0.0'} - '@metamask/utils@8.4.0': - resolution: {integrity: sha512-dbIc3C7alOe0agCuBHM1h71UaEaEqOk2W8rAtEn8QGz4haH2Qq7MoK6i7v2guzvkJVVh79c+QCzIqphC3KvrJg==} + '@metamask/utils@8.3.0': + resolution: {integrity: sha512-WFVcMPEkKKRCJ8DDkZUTVbLlpwgRn98F4VM/WzN89HM8PmHMnCyk/oG0AmK/seOxtik7uC7Bbi2YBC5Z5XB2zw==} engines: {node: '>=16.0.0'} - '@moralisweb3/api-utils@2.26.1': - resolution: {integrity: sha512-xG2rEvv7MEGiLwz6YkHeWnRToP9xiwtzdesgpYcbOMfEhO0dOF5NMhey9F4NS3l4p+ei8liLQAmFRUehyojbWg==} + '@moralisweb3/api-utils@2.26.2': + resolution: {integrity: sha512-2HQdwRzil5AyIZID+YFk3XX6QMkdOVClMgrDtsEvZgKLUa5OXSYasSUymfSf6q8FsKJGkHK9kuqoS2dZM4aBvA==} - '@moralisweb3/aptos-api@2.26.1': - resolution: {integrity: sha512-LClXb88MtC8kAkuWgJ5PlvjBnY9wCd3fBMa+FbOvIlKgMDHjNizDzFCVAX/f6lF884/XBzpxq0QyoFcvYx0RFQ==} + '@moralisweb3/aptos-api@2.26.2': + resolution: {integrity: sha512-3VXT4Q9SGE58UnX6UTrU6BExeBxkvDKfVjVd8AR6KlMcK5C6EaON3dlSfdyAqKAHv5rySXnXxZyG7EHURIzW2g==} - '@moralisweb3/auth@2.26.1': - resolution: {integrity: sha512-PUIm67hPOI0ThyUJ851Bq0i1Y0A7cFSR7wILwM0Ye1W1IOoygAI2Ls7Zyy9HK9aRUV3J1Sqek49azjNfmXQ0QA==} + '@moralisweb3/auth@2.26.2': + resolution: {integrity: sha512-29qr2jA+jsFup42vghZilmozuwV9/PCW88Or4v9k/XczFX80563ESpjJMXjgSZL3J7XspMt6YzpdqztDpvmyjA==} - '@moralisweb3/common-aptos-utils@2.26.1': - resolution: {integrity: sha512-02c4zgksBzlM9zZgeDLvPQ/+yDjVAWRnkbXP2Hnow19PSIqUJb/RkHclqm3+623tH4JJwgbqei3wrQZigNQAWg==} + '@moralisweb3/common-aptos-utils@2.26.2': + resolution: {integrity: sha512-+8m/953/0zmio1cHREQAvVouoirPMFWr//gy34jYMKJevwkYcDG0IhzHQ7cXEHCMNRPUYtV3OD7JodL6zMRLeQ==} - '@moralisweb3/common-auth-utils@2.26.1': - resolution: {integrity: sha512-g2FrjZKqjxitd4aDbJjdIwLXDYYa8a3sMRL31jynyblIfz2OTXJ5YZj86n8aENY+1t8BOcLwixzsRHRDiHnbog==} + '@moralisweb3/common-auth-utils@2.26.2': + resolution: {integrity: sha512-Cz526qRzMBBb5ZH/2o+J6p+bXVEL4gh5VaqDVRXODdCu81VhT+xdm2f2lNGZ4lhaFXoxYXAmUD446KM7hP+ZUw==} - '@moralisweb3/common-core@2.26.1': - resolution: {integrity: sha512-HbsSjBZuicoKyJxlWNl0YV6YolGQ0bWT2jbPwMGvLrtbeeRTT3rE2IrIh9nSe7z9pWVvXfU3t+4oXkisY+8dJg==} + '@moralisweb3/common-core@2.26.2': + resolution: {integrity: sha512-gvisSn6kpvZGjzC5HwYeYlnlQk9wM3PMRUamtH5H1iCouQz6M8WhbZ3a9O8ldcjX8SLnxdz8w0Z479xTFIVoqQ==} - '@moralisweb3/common-evm-utils@2.26.1': - resolution: {integrity: sha512-Gr4qJmGhr5ixSeysg4CjZBZexeTzHqPYPE1YuaGAmD4dmW2OMpN2mRwXYnJmKNtML45XfTy4bCfeoTER7xBCWA==} + '@moralisweb3/common-evm-utils@2.26.2': + resolution: {integrity: sha512-ZqzCPPTvurXtNi+DuyP6JsAzbxp4KkrsaMQzAvBPGEkIjIGxswDt47NVn6vzKLWqYk/C+IK5t/hBVBla9BfAnw==} - '@moralisweb3/common-sol-utils@2.26.1': - resolution: {integrity: sha512-68VaTLpTvWljzaWsb7bHd7IOPHraT5pqfQG/rs5pOZQ846/nWe8bWzCT619aKAiS54WEhkg3lgqE58mISiTmCw==} + '@moralisweb3/common-sol-utils@2.26.2': + resolution: {integrity: sha512-r8oxkTQfduIUNZ+/scjed6cphv8c4IPtdgarUrzz/cS2y/VcaXjDweLQsyFfMIOk4Fa0DTXaabzd8to5XNz2FQ==} - '@moralisweb3/common-streams-utils@2.26.1': - resolution: {integrity: sha512-dhUrGoeBW1xfokQNRhr7AfejEBA/jOwIp3uyaw19M1eQcw0v+ekhgWvglSEDp0Fp3AouZFUAgkX1pOz/BziuCw==} + '@moralisweb3/common-streams-utils@2.26.2': + resolution: {integrity: sha512-bhNgr0G3daG3n0qaB4lQ0/qA63kG2Ich3Zju3dLH8p9KdLeMvFAQIZzlx1aT0Ij7laaoqfnv2Pb0GQ1DTkvimQ==} - '@moralisweb3/evm-api@2.26.1': - resolution: {integrity: sha512-1A92tQsM/K9wMVpciziPmy8s258en+KN9CIIBNj+6AqXS+yjvd6Fbh//0ZGpKmsBu862ULfb8EnrmeYQBoSEbw==} + '@moralisweb3/evm-api@2.26.2': + resolution: {integrity: sha512-ageSyclGqHh/X6Wr1X1OHiCTBJcvhF1af4DvTe8xF1xnLqYtPk/TY3o2DmW//0bR6lQdebySbc+UEufld5uUpg==} - '@moralisweb3/sol-api@2.26.1': - resolution: {integrity: sha512-Wvpg8soLyb5DRR2R/v3ociFVI4I4EH1SsCU7Ah53tfmX/gDl5qs9FFdOMR/gYhS0vZXFN0f2jW+6I9ml1A9bDw==} + '@moralisweb3/sol-api@2.26.2': + resolution: {integrity: sha512-3fLnMGeuD/4EV6g7Qw6xtkyRh7RXxcIz1eTNZsph1NHQtXMTi9oQgSitTwmWcAHNzKQBXn4zoz5fx2yrIBWPIw==} '@moralisweb3/streams-typings@1.0.7': resolution: {integrity: sha512-ShbVqil0KLOTyTjO6z9JewPcVVE3S6kzkQFnW2flGBRsGdKucpkUdOx1HijOLoaikz/9gH92n+lzTvRFIj0AoA==} - '@moralisweb3/streams@2.26.1': - resolution: {integrity: sha512-YyF3w8jKYw06ihKSi7LsG2L7FmOXDZarufQdYFhFFlNflprJG+ENorAp8NX9CfSoPzbLkF5NTDug22lehNqWTA==} + '@moralisweb3/streams@2.26.2': + resolution: {integrity: sha512-PZ8aVE7S/n5MeOTLTxYff28UfNd3qv2AmE31saRPdGMnUTj7UgSiwqGQNt3ZYS0Gh1RjzvshELn9dRll8VrzYg==} - '@motionone/animation@10.17.0': - resolution: {integrity: sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg==} + '@motionone/animation@10.16.3': + resolution: {integrity: sha512-QUGWpLbMFLhyqKlngjZhjtxM8IqiJQjLK0DF+XOF6od9nhSvlaeEpOY/UMCRVcZn/9Tr2rZO22EkuCIjYdI74g==} - '@motionone/dom@10.17.0': - resolution: {integrity: sha512-cMm33swRlCX/qOPHWGbIlCl0K9Uwi6X5RiL8Ma6OrlJ/TP7Q+Np5GE4xcZkFptysFjMTi4zcZzpnNQGQ5D6M0Q==} + '@motionone/dom@10.16.4': + resolution: {integrity: sha512-HPHlVo/030qpRj9R8fgY50KTN4Ko30moWRTA3L3imrsRBmob93cTYmodln49HYFbQm01lFF7X523OkKY0DX6UA==} - '@motionone/easing@10.17.0': - resolution: {integrity: sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg==} + '@motionone/easing@10.16.3': + resolution: {integrity: sha512-HWTMZbTmZojzwEuKT/xCdvoMPXjYSyQvuVM6jmM0yoGU6BWzsmYMeB4bn38UFf618fJCNtP9XeC/zxtKWfbr0w==} - '@motionone/generators@10.17.0': - resolution: {integrity: sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ==} + '@motionone/generators@10.16.4': + resolution: {integrity: sha512-geFZ3w0Rm0ZXXpctWsSf3REGywmLLujEjxPYpBR0j+ymYwof0xbV6S5kGqqsDKgyWKVWpUInqQYvQfL6fRbXeg==} '@motionone/svelte@10.16.4': resolution: {integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==} - '@motionone/types@10.17.0': - resolution: {integrity: sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA==} + '@motionone/types@10.16.3': + resolution: {integrity: sha512-W4jkEGFifDq73DlaZs3HUfamV2t1wM35zN/zX7Q79LfZ2sc6C0R1baUHZmqc/K5F3vSw3PavgQ6HyHLd/MXcWg==} - '@motionone/utils@10.17.0': - resolution: {integrity: sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg==} + '@motionone/utils@10.16.3': + resolution: {integrity: sha512-WNWDksJIxQkaI9p9Z9z0+K27xdqISGNFy1SsWVGaiedTHq0iaT6iZujby8fT/ZnZxj1EOaxJtSfUPCFNU5CRoA==} '@motionone/vue@10.16.4': resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} @@ -3188,17 +3581,20 @@ packages: resolution: {integrity: sha512-doST0+aB7/3dGK9+U5y3mtF3jq85KGbke1QiH0KE1F5mGQ9y56mFebTeu2D9FNOm+OT6UHb8Ss8vbSnpGjeLNw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - '@multiformats/multiaddr@12.2.1': - resolution: {integrity: sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==} - - '@ndelangen/get-tarball@3.0.9': - resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} + '@multiformats/multiaddr@12.3.0': + resolution: {integrity: sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==} '@noble/curves@1.2.0': resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - '@noble/curves@1.3.0': - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + '@noble/curves@1.4.0': + resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.4.0': + resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -3207,14 +3603,14 @@ packages: resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} - '@noble/hashes@1.3.3': - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} - engines: {node: '>= 16'} - '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} + '@noble/secp256k1@1.7.1': resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} @@ -3230,6 +3626,96 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nomicfoundation/edr-darwin-arm64@0.6.3': + resolution: {integrity: sha512-hqtI7tYDqKG5PDmZ//Z65EH5cgH8VL/SAAu50rpHP7WAVfJWkOCcYbecywwF6nhHdonJbRTDGAeG1/+VOy6zew==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-darwin-x64@0.6.3': + resolution: {integrity: sha512-4fGi79/lyOlRUORhCYsYb3sWqRHuHT7qqzyZfZuNOn8llaxmT1k36xNmvpyg37R8SzjnhT/DzoukSJrs23Ip9Q==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-arm64-gnu@0.6.3': + resolution: {integrity: sha512-yFFTvGFMhfAvQ1Z2itUh1jpoUA+mVROyVELcaxjIq8fyg602lQmbS+NXkhQ+oaeDgJ+06mSENrHBg4fcfRf9cw==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-arm64-musl@0.6.3': + resolution: {integrity: sha512-pOKmd0Fa3a6BHg5qbjbl/jMRELVi9oazbfiuU7Bvgn/dpTK+ID3jwT0SXiuC2zxjmPByWgXL6G9XRf5BPAM2rQ==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-x64-gnu@0.6.3': + resolution: {integrity: sha512-3AUferhkLIXtLV63w5GjpHttzdxZ36i656XMy+pkBZbbiqnzIVeKWg6DJv1A94fQY16gB4gqj9CLq4CWvbNN6w==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-x64-musl@0.6.3': + resolution: {integrity: sha512-fr6bD872WIBXe9YnTDi0CzYepMcYRgSnkVqn0yK4wRnIvKrloWhxXNVY45GVIl51aNZguBnvoA4WEt6HIazs3A==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-win32-x64-msvc@0.6.3': + resolution: {integrity: sha512-sn34MvN1ajw2Oq1+Drpxej78Z0HfIzI4p4WlolupAV9dOZKzp2JAIQeLVfZpjIFbF3zuyxLPP4dUBrQoFPEqhA==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr@0.6.3': + resolution: {integrity: sha512-hThe5ORR75WFYTXKL0K2AyLDxkTMrG+VQ1yL9BhQYsuh3OIH+3yNDxMz2LjfvrpOrMmJ4kk5NKdFewpqDojjXQ==} + engines: {node: '>= 18'} + + '@nomicfoundation/ethereumjs-common@4.0.4': + resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} + + '@nomicfoundation/ethereumjs-rlp@5.0.4': + resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} + engines: {node: '>=18'} + hasBin: true + + '@nomicfoundation/ethereumjs-tx@5.0.4': + resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + + '@nomicfoundation/ethereumjs-util@9.0.4': + resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer@0.1.2': + resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} + engines: {node: '>= 12'} + '@openzeppelin/contracts-upgradeable@4.9.6': resolution: {integrity: sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA==} @@ -3244,9 +3730,57 @@ packages: '@openzeppelin/contracts@5.0.2': resolution: {integrity: sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==} + '@openzeppelin/defender-as-code@3.0.1': + resolution: {integrity: sha512-AeGMBk81Bak6B4u3pXjO1aOrIbJqrE6gZJqTJiBRGzKRGWxqQycriojZ3/lns/DcrNElA2BBHD0ONESrpMbZAg==} + + '@openzeppelin/defender-sdk-account-client@1.14.4': + resolution: {integrity: sha512-SxV4oTofO/xf1IcNJ5Dcc6XdXrxmu2jNPIeOx6GhdwVmO2LDVgi/9pAwXNlW1ihZ4wkJf/BSz3JsRJCgrwkadQ==} + + '@openzeppelin/defender-sdk-action-client@1.14.4': + resolution: {integrity: sha512-YoRW3ZST1YCGkBIPtzJNPR0ajK9H0cxhT+evbRX9hgiUNJTgTDJeKGX+qOKOMjKOPXikiYUc2TpmKwP1I2tP5A==} + hasBin: true + + '@openzeppelin/defender-sdk-base-client@1.14.4': + resolution: {integrity: sha512-tOePVQLKpqfGQ1GMzHvSBNd2psPYd86LDNpvdl5gjD0Y2kW/zNh5qBXy29RraGtk/qc8zs9hzS5pAOh0vhGkGQ==} + + '@openzeppelin/defender-sdk-deploy-client@1.14.4': + resolution: {integrity: sha512-+diSoz1zid37LMsY2RDxI+uAsYx9Eryg8Vz+yfvuyd56fXrzjQEln7BBtYQw+2zp9yvyAByOL5XSQdrQga9OBQ==} + + '@openzeppelin/defender-sdk-key-value-store-client@1.14.4': + resolution: {integrity: sha512-8InEiGeUpahKuWTgFWUyS5DS9HkXeHWMW+yxolGwxCy+OIGEPfxg/oMBXC2UzGn3BfIvWic/CLspFzuWIlarEQ==} + + '@openzeppelin/defender-sdk-monitor-client@1.14.4': + resolution: {integrity: sha512-PSesKNicY37LiHD2EVsyZXQrHRZsPYaVhUuMdqfNoJZexPZfnhv7c2A481tt+hTwAccJguQF69NLqylpdgtpFQ==} + + '@openzeppelin/defender-sdk-network-client@1.14.4': + resolution: {integrity: sha512-OS0H5b0vgYacJcwkvUFJUaRuyUaXhIRl916W5xLvGia5H6i/qn3dP8MZ7oLcPwKc8jB+ucRytO4H/AHsea0aVA==} + + '@openzeppelin/defender-sdk-notification-channel-client@1.14.4': + resolution: {integrity: sha512-xCMUe4pseRA+tQMrd6PDoZ4aToDi0LPrVAlBXFDFxCZ6/TzcsVA/PgfM4Hy6R+9vF+S5gMFGuJkCpDtlcYfo5A==} + + '@openzeppelin/defender-sdk-proposal-client@1.14.4': + resolution: {integrity: sha512-xVI5A6wJb/XfqVAEkSsINrgGkNznw0eZL7CnzX1OUnZ4irrlaD4HpG/CkFgVWLx8tRIMFlUtb3as3KMc/sO8eg==} + + '@openzeppelin/defender-sdk-relay-client@1.14.4': + resolution: {integrity: sha512-L+vPUeeg36muOy1Oh8wqNEJ8qXXQrFytYZerPS9N/Vf7TQBZoKUkuVq69dw7+XYq/ouqbppvAvUtV9SnyDkYpQ==} + + '@openzeppelin/defender-sdk-relay-signer-client@1.14.4': + resolution: {integrity: sha512-zjVhor/LEHYG6Gf+GEFTrwsuGZjVbzqTqQew4X622FY38P13PpcEIdXDgbokqdlX8zpECcggD2kmTTDgVWRqjA==} + peerDependencies: + web3: ^1.10.0 + web3-core: ^1.10.4 + web3-core-helpers: ^1.10.0 + web3-utils: ^1.10.0 + + '@openzeppelin/defender-sdk@1.14.4': + resolution: {integrity: sha512-QFXvqeLzfFxyRq5bw+7h2pq65pztNKBUy0vtizdSeQMA6MZ5wqDyTu/8bziYdQH+BmKzMqYBgErJAmic2XCzZQ==} + '@openzeppelin/merkle-tree@1.0.6': resolution: {integrity: sha512-cGWOb2WBWbJhqvupzxjnKAwGLxxAEYPg51sk76yZ5nVe5D03mw7Vx5yo8llaIEqYhP5O39M8QlrNWclgLfKVrA==} + '@oslojs/encoding@0.4.1': + resolution: {integrity: sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q==} + '@pagefind/darwin-arm64@1.1.0': resolution: {integrity: sha512-SLsXNLtSilGZjvqis8sX42fBWsWAVkcDh1oerxwqbac84HbiwxpxOC2jm8hRwcR0Z55HPZPWO77XeRix/8GwTg==} cpu: [arm64] @@ -3275,98 +3809,98 @@ packages: cpu: [x64] os: [win32] - '@parcel/watcher-android-arm64@2.4.1': - resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} + '@parcel/watcher-android-arm64@2.4.0': + resolution: {integrity: sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.4.1': - resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} + '@parcel/watcher-darwin-arm64@2.4.0': + resolution: {integrity: sha512-T/At5pansFuQ8VJLRx0C6C87cgfqIYhW2N/kBfLCUvDhCah0EnLLwaD/6MW3ux+rpgkpQAnMELOCTKlbwncwiA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.4.1': - resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} + '@parcel/watcher-darwin-x64@2.4.0': + resolution: {integrity: sha512-vZMv9jl+szz5YLsSqEGCMSllBl1gU1snfbRL5ysJU03MEa6gkVy9OMcvXV1j4g0++jHEcvzhs3Z3LpeEbVmY6Q==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.4.1': - resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} + '@parcel/watcher-freebsd-x64@2.4.0': + resolution: {integrity: sha512-dHTRMIplPDT1M0+BkXjtMN+qLtqq24sLDUhmU+UxxLP2TEY2k8GIoqIJiVrGWGomdWsy5IO27aDV1vWyQ6gfHA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.4.1': - resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} + '@parcel/watcher-linux-arm-glibc@2.4.0': + resolution: {integrity: sha512-9NQXD+qk46RwATNC3/UB7HWurscY18CnAPMTFcI9Y8CTbtm63/eex1SNt+BHFinEQuLBjaZwR2Lp+n7pmEJPpQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.4.1': - resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} + '@parcel/watcher-linux-arm64-glibc@2.4.0': + resolution: {integrity: sha512-QuJTAQdsd7PFW9jNGaV9Pw+ZMWV9wKThEzzlY3Lhnnwy7iW23qtQFPql8iEaSFMCVI5StNNmONUopk+MFKpiKg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-arm64-musl@2.4.1': - resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} + '@parcel/watcher-linux-arm64-musl@2.4.0': + resolution: {integrity: sha512-oyN+uA9xcTDo/45bwsd6TFHa7Lc7hKujyMlvwrCLvSckvWogndCEoVYFNfZ6JJ2KNL/6fFiGPcbjp8jJmEh5Ng==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-x64-glibc@2.4.1': - resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} + '@parcel/watcher-linux-x64-glibc@2.4.0': + resolution: {integrity: sha512-KphV8awJmxU3q52JQvJot0QMu07CIyEjV+2Tb2ZtbucEgqyRcxOBDMsqp1JNq5nuDXtcCC0uHQICeiEz38dPBQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-linux-x64-musl@2.4.1': - resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} + '@parcel/watcher-linux-x64-musl@2.4.0': + resolution: {integrity: sha512-7jzcOonpXNWcSijPpKD5IbC6xC7yTibjJw9jviVzZostYLGxbz8LDJLUnLzLzhASPlPGgpeKLtFUMjAAzM+gSA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-wasm@2.4.1': - resolution: {integrity: sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==} + '@parcel/watcher-wasm@2.4.0': + resolution: {integrity: sha512-MNgQ4WCbBybqQ97KwR/hqJGYTg3+s8qHpgIyFWB2qJOBvoJWbXuJGmm4ZkPLq2bMaANqCZqrXwmKYagZTkMKZA==} engines: {node: '>= 10.0.0'} bundledDependencies: - napi-wasm - '@parcel/watcher-win32-arm64@2.4.1': - resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} + '@parcel/watcher-win32-arm64@2.4.0': + resolution: {integrity: sha512-NOej2lqlq8bQNYhUMnOD0nwvNql8ToQF+1Zhi9ULZoG+XTtJ9hNnCFfyICxoZLXor4bBPTOnzs/aVVoefYnjIg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.4.1': - resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} + '@parcel/watcher-win32-ia32@2.4.0': + resolution: {integrity: sha512-IO/nM+K2YD/iwjWAfHFMBPz4Zqn6qBDqZxY4j2n9s+4+OuTSRM/y/irksnuqcspom5DjkSeF9d0YbO+qpys+JA==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.4.1': - resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} + '@parcel/watcher-win32-x64@2.4.0': + resolution: {integrity: sha512-pAUyUVjfFjWaf/pShmJpJmNxZhbMvJASUpdes9jL6bTEJ+gDxPRSpXTIemNyNsb9AtbiGXs9XduP1reThmd+dA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.4.1': - resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} + '@parcel/watcher@2.4.0': + resolution: {integrity: sha512-XJLGVL0DEclX5pcWa2N9SX1jCGTDd8l972biNooLFtjneuGqodupPQh6XseXIBBeVIMaaJ7bTcs3qGvXwsp4vg==} engines: {node: '>= 10.0.0'} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + '@pkgr/utils@2.4.2': + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.44.0': - resolution: {integrity: sha512-rNX5lbNidamSUorBhB4XZ9SQTjAqfe5M+p37Z8ic0jPFBMo5iCtQz1kRWkEMg+rYOKSlVycpQmpqjSFq7LXOfg==} + '@playwright/test@1.43.1': + resolution: {integrity: sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==} engines: {node: '>=16'} hasBin: true @@ -3382,8 +3916,8 @@ packages: resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} engines: {node: '>=12'} - '@polka/url@1.0.0-next.25': - resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + '@polka/url@1.0.0-next.24': + resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -3415,265 +3949,103 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@radix-ui/primitive@1.0.1': - resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} - - '@radix-ui/react-compose-refs@1.0.1': - resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.0.1': - resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dialog@1.0.5': - resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-dismissable-layer@1.0.5': - resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-focus-guards@1.0.1': - resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-scope@1.0.4': - resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-id@1.0.1': - resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-portal@1.0.4': - resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-presence@1.0.1': - resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@1.0.3': - resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slot@1.0.2': - resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-callback-ref@1.0.1': - resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.0.1': - resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-escape-keydown@1.0.3': - resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + '@react-native-async-storage/async-storage@1.22.0': + resolution: {integrity: sha512-b5KD010iiZnot86RbAaHpLuHwmPW2qA3SSN/OSZhd1kBoINEQEVBuv+uFtcaTxAhX27bT0wd13GOb2IOSDUXSA==} peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.0.1': - resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true + react-native: ^0.0.0-0 || >=0.60 <1.0 - '@react-native-community/cli-clean@13.6.6': - resolution: {integrity: sha512-cBwJTwl0NyeA4nyMxbhkWZhxtILYkbU3TW3k8AXLg+iGphe0zikYMGB3T+haTvTc6alTyEFwPbimk9bGIqkjAQ==} + '@react-native-community/cli-clean@12.3.2': + resolution: {integrity: sha512-90k2hCX0ddSFPT7EN7h5SZj0XZPXP0+y/++v262hssoey3nhurwF57NGWN0XAR0o9BSW7+mBfeInfabzDraO6A==} - '@react-native-community/cli-config@13.6.6': - resolution: {integrity: sha512-mbG425zCKr8JZhv/j11382arezwS/70juWMsn8j2lmrGTrP1cUdW0MF15CCIFtJsqyK3Qs+FTmqttRpq81QfSg==} + '@react-native-community/cli-config@12.3.2': + resolution: {integrity: sha512-UUCzDjQgvAVL/57rL7eOuFUhd+d+6qfM7V8uOegQFeFEmSmvUUDLYoXpBa5vAK9JgQtSqMBJ1Shmwao+/oElxQ==} - '@react-native-community/cli-debugger-ui@13.6.6': - resolution: {integrity: sha512-Vv9u6eS4vKSDAvdhA0OiQHoA7y39fiPIgJ6biT32tN4avHDtxlc6TWZGiqv7g98SBvDWvoVAmdPLcRf3kU+c8g==} + '@react-native-community/cli-debugger-ui@12.3.2': + resolution: {integrity: sha512-nSWQUL+51J682DlfcC1bjkUbQbGvHCC25jpqTwHIjmmVjYCX1uHuhPSqQKgPNdvtfOkrkACxczd7kVMmetxY2Q==} - '@react-native-community/cli-doctor@13.6.6': - resolution: {integrity: sha512-TWZb5g6EmQe2Ua2TEWNmyaEayvlWH4GmdD9ZC+p8EpKFpB1NpDGMK6sXbpb42TDvwZg5s4TDRplK0PBEA/SVDg==} + '@react-native-community/cli-doctor@12.3.2': + resolution: {integrity: sha512-GrAabdY4qtBX49knHFvEAdLtCjkmndjTeqhYO6BhsbAeKOtspcLT/0WRgdLIaKODRa61ADNB3K5Zm4dU0QrZOg==} - '@react-native-community/cli-hermes@13.6.6': - resolution: {integrity: sha512-La5Ie+NGaRl3klei6WxKoOxmCUSGGxpOk6vU5pEGf0/O7ky+Ay0io+zXYUZqlNMi/cGpO7ZUijakBYOB/uyuFg==} + '@react-native-community/cli-hermes@12.3.2': + resolution: {integrity: sha512-SL6F9O8ghp4ESBFH2YAPLtIN39jdnvGBKnK4FGKpDCjtB3DnUmDsGFlH46S+GGt5M6VzfG2eeKEOKf3pZ6jUzA==} - '@react-native-community/cli-platform-android@13.6.6': - resolution: {integrity: sha512-/tMwkBeNxh84syiSwNlYtmUz/Ppc+HfKtdopL/5RB+fd3SV1/5/NPNjMlyLNgFKnpxvKCInQ7dnl6jGHJjeHjg==} + '@react-native-community/cli-platform-android@12.3.2': + resolution: {integrity: sha512-MZ5nO8yi/N+Fj2i9BJcJ9C/ez+9/Ir7lQt49DWRo9YDmzye66mYLr/P2l/qxsixllbbDi7BXrlLpxaEhMrDopg==} - '@react-native-community/cli-platform-apple@13.6.6': - resolution: {integrity: sha512-bOmSSwoqNNT3AmCRZXEMYKz1Jf1l2F86Nhs7qBcXdY/sGiJ+Flng564LOqvdAlVLTbkgz47KjNKCS2pP4Jg0Mg==} + '@react-native-community/cli-platform-ios@12.3.2': + resolution: {integrity: sha512-OcWEAbkev1IL6SUiQnM6DQdsvfsKZhRZtoBNSj9MfdmwotVZSOEZJ+IjZ1FR9ChvMWayO9ns/o8LgoQxr1ZXeg==} - '@react-native-community/cli-platform-ios@13.6.6': - resolution: {integrity: sha512-vjDnRwhlSN5ryqKTas6/DPkxuouuyFBAqAROH4FR1cspTbn6v78JTZKDmtQy9JMMo7N5vZj1kASU5vbFep9IOQ==} + '@react-native-community/cli-plugin-metro@12.3.2': + resolution: {integrity: sha512-FpFBwu+d2E7KRhYPTkKvQsWb2/JKsJv+t1tcqgQkn+oByhp+qGyXBobFB8/R3yYvRRDCSDhS+atWTJzk9TjM8g==} - '@react-native-community/cli-server-api@13.6.6': - resolution: {integrity: sha512-ZtCXxoFlM7oDv3iZ3wsrT3SamhtUJuIkX2WePLPlN5bcbq7zimbPm2lHyicNJtpcGQ5ymsgpUWPCNZsWQhXBqQ==} + '@react-native-community/cli-server-api@12.3.2': + resolution: {integrity: sha512-iwa7EO9XFA/OjI5pPLLpI/6mFVqv8L73kNck3CNOJIUCCveGXBKK0VMyOkXaf/BYnihgQrXh+x5cxbDbggr7+Q==} - '@react-native-community/cli-tools@13.6.6': - resolution: {integrity: sha512-ptOnn4AJczY5njvbdK91k4hcYazDnGtEPrqIwEI+k/CTBHNdb27Rsm2OZ7ye6f7otLBqF8gj/hK6QzJs8CEMgw==} + '@react-native-community/cli-tools@12.3.2': + resolution: {integrity: sha512-nDH7vuEicHI2TI0jac/DjT3fr977iWXRdgVAqPZFFczlbs7A8GQvEdGnZ1G8dqRUmg+kptw0e4hwczAOG89JzQ==} - '@react-native-community/cli-types@13.6.6': - resolution: {integrity: sha512-733iaYzlmvNK7XYbnWlMjdE+2k0hlTBJW071af/xb6Bs+hbJqBP9c03FZuYH2hFFwDDntwj05bkri/P7VgSxug==} + '@react-native-community/cli-types@12.3.2': + resolution: {integrity: sha512-9D0UEFqLW8JmS16mjHJxUJWX8E+zJddrHILSH8AJHZ0NNHv4u2DXKdb0wFLMobFxGNxPT+VSOjc60fGvXzWHog==} - '@react-native-community/cli@13.6.6': - resolution: {integrity: sha512-IqclB7VQ84ye8Fcs89HOpOscY4284VZg2pojHNl8H0Lzd4DadXJWQoxC7zWm8v2f8eyeX2kdhxp2ETD5tceIgA==} + '@react-native-community/cli@12.3.2': + resolution: {integrity: sha512-WgoUWwLDcf/G1Su2COUUVs3RzAwnV/vUTdISSpAUGgSc57mPabaAoUctKTnfYEhCnE3j02k3VtaVPwCAFRO3TQ==} engines: {node: '>=18'} hasBin: true - '@react-native/assets-registry@0.74.83': - resolution: {integrity: sha512-2vkLMVnp+YTZYTNSDIBZojSsjz8sl5PscP3j4GcV6idD8V978SZfwFlk8K0ti0BzRs11mzL0Pj17km597S/eTQ==} + '@react-native/assets-registry@0.73.1': + resolution: {integrity: sha512-2FgAbU7uKM5SbbW9QptPPZx8N9Ke2L7bsHb+EhAanZjFZunA9PaYtyjUQ1s7HD+zDVqOQIvjkpXSv7Kejd2tqg==} engines: {node: '>=18'} - '@react-native/babel-plugin-codegen@0.74.83': - resolution: {integrity: sha512-+S0st3t4Ro00bi9gjT1jnK8qTFOU+CwmziA7U9odKyWrCoRJrgmrvogq/Dr1YXlpFxexiGIupGut1VHxr+fxJA==} + '@react-native/babel-plugin-codegen@0.73.4': + resolution: {integrity: sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==} engines: {node: '>=18'} - '@react-native/babel-preset@0.74.83': - resolution: {integrity: sha512-KJuu3XyVh3qgyUer+rEqh9a/JoUxsDOzkJNfRpDyXiAyjDRoVch60X/Xa/NcEQ93iCVHAWs0yQ+XGNGIBCYE6g==} + '@react-native/babel-preset@0.73.21': + resolution: {integrity: sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==} engines: {node: '>=18'} peerDependencies: '@babel/core': '*' - '@react-native/codegen@0.74.83': - resolution: {integrity: sha512-GgvgHS3Aa2J8/mp1uC/zU8HuTh8ZT5jz7a4mVMWPw7+rGyv70Ba8uOVBq6UH2Q08o617IATYc+0HfyzAfm4n0w==} + '@react-native/codegen@0.73.3': + resolution: {integrity: sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==} engines: {node: '>=18'} peerDependencies: '@babel/preset-env': ^7.1.6 - '@react-native/community-cli-plugin@0.74.83': - resolution: {integrity: sha512-7GAFjFOg1mFSj8bnFNQS4u8u7+QtrEeflUIDVZGEfBZQ3wMNI5ycBzbBGycsZYiq00Xvoc6eKFC7kvIaqeJpUQ==} + '@react-native/community-cli-plugin@0.73.16': + resolution: {integrity: sha512-eNH3v3qJJF6f0n/Dck90qfC9gVOR4coAXMTdYECO33GfgjTi+73vf/SBqlXw9HICH/RNZYGPM3wca4FRF7TYeQ==} engines: {node: '>=18'} - '@react-native/debugger-frontend@0.74.83': - resolution: {integrity: sha512-RGQlVUegBRxAUF9c1ss1ssaHZh6CO+7awgtI9sDeU0PzDZY/40ImoPD5m0o0SI6nXoVzbPtcMGzU+VO590pRfA==} + '@react-native/debugger-frontend@0.73.3': + resolution: {integrity: sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw==} engines: {node: '>=18'} - '@react-native/dev-middleware@0.74.83': - resolution: {integrity: sha512-UH8iriqnf7N4Hpi20D7M2FdvSANwTVStwFCSD7VMU9agJX88Yk0D1T6Meh2RMhUu4kY2bv8sTkNRm7LmxvZqgA==} + '@react-native/dev-middleware@0.73.7': + resolution: {integrity: sha512-BZXpn+qKp/dNdr4+TkZxXDttfx8YobDh8MFHsMk9usouLm22pKgFIPkGBV0X8Do4LBkFNPGtrnsKkWk/yuUXKg==} engines: {node: '>=18'} - '@react-native/gradle-plugin@0.74.83': - resolution: {integrity: sha512-Pw2BWVyOHoBuJVKxGVYF6/GSZRf6+v1Ygc+ULGz5t20N8qzRWPa2fRZWqoxsN7TkNLPsECYY8gooOl7okOcPAQ==} + '@react-native/gradle-plugin@0.73.4': + resolution: {integrity: sha512-PMDnbsZa+tD55Ug+W8CfqXiGoGneSSyrBZCMb5JfiB3AFST3Uj5e6lw8SgI/B6SKZF7lG0BhZ6YHZsRZ5MlXmg==} engines: {node: '>=18'} - '@react-native/js-polyfills@0.74.83': - resolution: {integrity: sha512-/t74n8r6wFhw4JEoOj3bN71N1NDLqaawB75uKAsSjeCwIR9AfCxlzZG0etsXtOexkY9KMeZIQ7YwRPqUdNXuqw==} + '@react-native/js-polyfills@0.73.1': + resolution: {integrity: sha512-ewMwGcumrilnF87H4jjrnvGZEaPFCAC4ebraEK+CurDDmwST/bIicI4hrOAv+0Z0F7DEK4O4H7r8q9vH7IbN4g==} engines: {node: '>=18'} - '@react-native/metro-babel-transformer@0.74.83': - resolution: {integrity: sha512-hGdx5N8diu8y+GW/ED39vTZa9Jx1di2ZZ0aapbhH4egN1agIAusj5jXTccfNBwwWF93aJ5oVbRzfteZgjbutKg==} + '@react-native/metro-babel-transformer@0.73.15': + resolution: {integrity: sha512-LlkSGaXCz+xdxc9819plmpsl4P4gZndoFtpjN3GMBIu6f7TBV0GVbyJAU4GE8fuAWPVSVL5ArOcdkWKSbI1klw==} engines: {node: '>=18'} peerDependencies: '@babel/core': '*' - '@react-native/normalize-colors@0.74.83': - resolution: {integrity: sha512-jhCY95gRDE44qYawWVvhTjTplW1g+JtKTKM3f8xYT1dJtJ8QWv+gqEtKcfmOHfDkSDaMKG0AGBaDTSK8GXLH8Q==} + '@react-native/normalize-colors@0.73.2': + resolution: {integrity: sha512-bRBcb2T+I88aG74LMVHaKms2p/T8aQd8+BZ7LuuzXlRfog1bMWWn/C5i0HVuvW4RPtXQYgIlGiXVDy9Ir1So/w==} - '@react-native/virtualized-lists@0.74.83': - resolution: {integrity: sha512-rmaLeE34rj7py4FxTod7iMTC7BAsm+HrGA8WxYmEJeyTV7WSaxAkosKoYBz8038mOiwnG9VwA/7FrB6bEQvn1A==} + '@react-native/virtualized-lists@0.73.4': + resolution: {integrity: sha512-HpmLg1FrEiDtrtAbXiwCgXFYyloK/dOIPIuWW3fsqukwJEWAiTzm1nXGJ7xPU5XTHiWZ4sKup5Ebaj8z7iyWog==} engines: {node: '>=18'} peerDependencies: - '@types/react': ^18.2.6 - react: '*' react-native: '*' - peerDependenciesMeta: - '@types/react': - optional: true '@readme/better-ajv-errors@1.6.0': resolution: {integrity: sha512-9gO9rld84Jgu13kcbKRU+WHseNhaVt76wYMeRDGsUGYxwJtI3RmEJ9LY9dZCYQGI8eUZLuxb5qDja0nqklpFjQ==} @@ -3690,102 +4062,261 @@ packages: peerDependencies: openapi-types: '>=7' - '@rnx-kit/chromium-edge-launcher@1.0.0': - resolution: {integrity: sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==} - engines: {node: '>=14.15'} + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.12.0': + resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm-eabi@4.18.0': + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + cpu: [arm] + os: [android] - '@rollup/rollup-android-arm-eabi@4.17.2': - resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} + '@rollup/rollup-android-arm-eabi@4.21.3': + resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==} cpu: [arm] os: [android] + '@rollup/rollup-android-arm64@4.12.0': + resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} + cpu: [arm64] + os: [android] + '@rollup/rollup-android-arm64@4.17.2': resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.21.3': + resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.12.0': + resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-arm64@4.17.2': resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.21.3': + resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.12.0': + resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.17.2': resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.21.3': + resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.12.0': + resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.17.2': resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.21.3': + resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.12.0': + resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.17.2': resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.21.3': + resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.12.0': + resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.17.2': resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.21.3': + resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.12.0': + resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.17.2': resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.21.3': + resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.17.2': resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.21.3': + resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.12.0': + resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.17.2': resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.21.3': + resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.12.0': + resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.17.2': resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.21.3': + resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.12.0': + resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.17.2': resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.21.3': + resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.12.0': + resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.17.2': resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.21.3': + resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.12.0': + resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.17.2': resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} cpu: [x64] os: [win32] - '@safe-global/safe-apps-provider@0.18.1': + '@rollup/rollup-win32-x64-msvc@4.21.3': + resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==} + cpu: [x64] + os: [win32] + + '@safe-global/safe-apps-provider@0.18.1': resolution: {integrity: sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg==} + '@safe-global/safe-apps-provider@0.18.3': + resolution: {integrity: sha512-f/0cNv3S4v7p8rowAjj0hDCg8Q8P/wBjp5twkNWeBdvd0RDr7BuRBPPk74LCqmjQ82P+1ltLlkmVFSmxTIT7XQ==} + '@safe-global/safe-apps-sdk@8.1.0': resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} - '@safe-global/safe-gateway-typescript-sdk@3.21.1': - resolution: {integrity: sha512-7nakIjcRSs6781LkizYpIfXh1DYlkUDqyALciqz/BjFU/S97sVjZdL4cuKsG9NEarytE+f6p0Qbq2Bo1aocVUA==} + '@safe-global/safe-apps-sdk@9.1.0': + resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} + + '@safe-global/safe-gateway-typescript-sdk@3.15.0': + resolution: {integrity: sha512-zAzhPgUwzdp89ZrZwCAOImUyAQMQE0LQKcK4vLO5eMbfAcNOxz5g4eVdBRBRa+kVXxjyW5wii58ZlGaYUVBa7g==} engines: {node: '>=16'} - '@scure/base@1.1.6': - resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} + '@scure/base@1.1.5': + resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} + + '@scure/base@1.1.8': + resolution: {integrity: sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg==} '@scure/bip32@1.1.5': resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} @@ -3793,8 +4324,11 @@ packages: '@scure/bip32@1.3.2': resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} - '@scure/bip32@1.3.3': - resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} @@ -3802,11 +4336,57 @@ packages: '@scure/bip39@1.2.1': resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} - '@scure/bip39@1.2.2': - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + + '@scure/bip39@1.4.0': + resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} + + '@sentry/core@5.30.0': + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + + '@sentry/hub@5.30.0': + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + + '@sentry/minimal@5.30.0': + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: '>=6'} + + '@sentry/node@5.30.0': + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + + '@sentry/tracing@5.30.0': + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + + '@sentry/types@5.30.0': + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: '>=6'} + + '@sentry/utils@5.30.0': + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + + '@shikijs/core@1.17.6': + resolution: {integrity: sha512-9ztslig6/YmCg/XwESAXbKjAjOhaq6HVced9NY6qcbDz1X5g/S90Wco2vMjBNX/6V71ASkzri76JewSGPa7kiQ==} - '@shikijs/core@1.5.1': - resolution: {integrity: sha512-xjV63pRUBvxA1LsxOUhRKLPh0uUjwBLzAKLdEuYSLIylo71sYuwDcttqNP01Ib1TZlLfO840CXHPlgUUsYFjzg==} + '@shikijs/core@1.5.2': + resolution: {integrity: sha512-wSAOgaz48GmhILFElMCeQypSZmj6Ru6DttOOtl3KNkdJ17ApQuGNCfzpk4cClasVrnIu45++2DBwG4LNMQAfaA==} + + '@shikijs/engine-javascript@1.17.6': + resolution: {integrity: sha512-5EEZj8tVcierNxm4V0UMS2PVoflb0UJPalWWV8l9rRg+oOfnr5VivqBJbkyq5grltVPvByIXvVbY8GSM/356jQ==} + + '@shikijs/engine-oniguruma@1.17.6': + resolution: {integrity: sha512-NLfWDMXFYe0nDHFbEoyZdz89aIIey3bTfF3zLYSUNTXks5s4uinZVmuPOFf1HfTeGqIn8uErJSBc3VnpJO7Alw==} + + '@shikijs/types@1.17.6': + resolution: {integrity: sha512-ndTFa2TJi2w51ddKQDn3Jy8f6K4E5Q2x3dA3Hmsd3+YmxDQ10UWHjcw7VbVbKzv3VcUvYPLy+z9neqytSzUMUg==} + + '@shikijs/vscode-textmate@9.2.2': + resolution: {integrity: sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==} '@sideway/address@4.1.5': resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -3820,22 +4400,22 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@smithy/abort-controller@3.0.0': - resolution: {integrity: sha512-p6GlFGBt9K4MYLu72YuJ523NVR4A8oHlC5M2JO6OmQqN8kAc/uh1JqLE+FizTokrSJGg0CSvC+BrsmGzKtsZKA==} + '@smithy/abort-controller@3.1.1': + resolution: {integrity: sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==} engines: {node: '>=16.0.0'} '@smithy/chunked-blob-reader-native@3.0.0': @@ -3844,127 +4424,131 @@ packages: '@smithy/chunked-blob-reader@3.0.0': resolution: {integrity: sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==} - '@smithy/config-resolver@3.0.0': - resolution: {integrity: sha512-2GzOfADwYLQugYkKQhIyZyQlM05K+tMKvRnc6eFfZcpJGRfKoMUMYdPlBKmqHwQFXQKBrGV6cxL9oymWgDzvFw==} + '@smithy/config-resolver@3.0.4': + resolution: {integrity: sha512-VwiOk7TwXoE7NlNguV/aPq1hFH72tqkHCw8eWXbr2xHspRyyv9DLpLXhq+Ieje+NwoqXrY0xyQjPXdOE6cGcHA==} engines: {node: '>=16.0.0'} - '@smithy/core@2.0.0': - resolution: {integrity: sha512-y1VuiOpU8nL0KlL0pvYpOddKGK+8xpD4Jvg9NN42Bl6gHWAr46LpAzWi4I78WxcFIMN1vw1+RUVOlcqR/vfs5g==} + '@smithy/core@2.0.1': + resolution: {integrity: sha512-rcMkjvwxH/bER+oZUPR0yTA0ELD6m3A+d92+CFkdF6HJFCBB1bXo7P5pm21L66XwTN01B6bUhSCQ7cymWRD8zg==} engines: {node: '>=16.0.0'} - '@smithy/credential-provider-imds@3.0.0': - resolution: {integrity: sha512-lfmBiFQcA3FsDAPxNfY0L7CawcWtbyWsBOHo34nF095728JLkBX4Y9q/VPPE2r7fqMVK+drmDigqE2/SSQeVRA==} + '@smithy/credential-provider-imds@3.1.3': + resolution: {integrity: sha512-U1Yrv6hx/mRK6k8AncuI6jLUx9rn0VVSd9NPEX6pyYFBfkSkChOc/n4zUb8alHUVg83TbI4OdZVo1X0Zfj3ijA==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-codec@3.0.0': - resolution: {integrity: sha512-PUtyEA0Oik50SaEFCZ0WPVtF9tz/teze2fDptW6WRXl+RrEenH8UbEjudOz8iakiMl3lE3lCVqYf2Y+znL8QFQ==} + '@smithy/eventstream-codec@3.1.2': + resolution: {integrity: sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==} - '@smithy/eventstream-serde-browser@3.0.0': - resolution: {integrity: sha512-NB7AFiPN4NxP/YCAnrvYR18z2/ZsiHiF7VtG30gshO9GbFrIb1rC8ep4NGpJSWrz6P64uhPXeo4M0UsCLnZKqw==} + '@smithy/eventstream-serde-browser@3.0.4': + resolution: {integrity: sha512-Eo4anLZX6ltGJTZ5yJMc80gZPYYwBn44g0h7oFq6et+TYr5dUsTpIcDbz2evsOKIZhZ7zBoFWHtBXQ4QQeb5xA==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-serde-config-resolver@3.0.0': - resolution: {integrity: sha512-RUQG3vQ3LX7peqqHAbmayhgrF5aTilPnazinaSGF1P0+tgM3vvIRWPHmlLIz2qFqB9LqFIxditxc8O2Z6psrRw==} + '@smithy/eventstream-serde-config-resolver@3.0.3': + resolution: {integrity: sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-serde-node@3.0.0': - resolution: {integrity: sha512-baRPdMBDMBExZXIUAoPGm/hntixjt/VFpU6+VmCyiYJYzRHRxoaI1MN+5XE+hIS8AJ2GCHLMFEIOLzq9xx1EgQ==} + '@smithy/eventstream-serde-node@3.0.4': + resolution: {integrity: sha512-mjlG0OzGAYuUpdUpflfb9zyLrBGgmQmrobNT8b42ZTsGv/J03+t24uhhtVEKG/b2jFtPIHF74Bq+VUtbzEKOKg==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-serde-universal@3.0.0': - resolution: {integrity: sha512-HNFfShmotWGeAoW4ujP8meV9BZavcpmerDbPIjkJbxKbN8RsUcpRQ/2OyIxWNxXNH2GWCAxuSB7ynmIGJlQ3Dw==} + '@smithy/eventstream-serde-universal@3.0.4': + resolution: {integrity: sha512-Od9dv8zh3PgOD7Vj4T3HSuox16n0VG8jJIM2gvKASL6aCtcS8CfHZDWe1Ik3ZXW6xBouU+45Q5wgoliWDZiJ0A==} engines: {node: '>=16.0.0'} - '@smithy/fetch-http-handler@3.0.0': - resolution: {integrity: sha512-gP1MlOpIB/onIbh4g9eSG3XdI/G31cAvd9Lo11192eL4mxks3xpkPaa+RIcZaX2Vmb8I8HzxBddPSXviY1iq0w==} + '@smithy/fetch-http-handler@3.0.1': + resolution: {integrity: sha512-uaH74i5BDj+rBwoQaXioKpI0SHBJFtOVwzrCpxZxphOW0ki5jhj7dXvDMYM2IJem8TpdFvS2iC08sjOblfFGFg==} - '@smithy/hash-blob-browser@3.0.0': - resolution: {integrity: sha512-/Wbpdg+bwJvW7lxR/zpWAc1/x/YkcqguuF2bAzkJrvXriZu1vm8r+PUdE4syiVwQg7PPR2dXpi3CLBb9qRDaVQ==} + '@smithy/hash-blob-browser@3.1.2': + resolution: {integrity: sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==} - '@smithy/hash-node@3.0.0': - resolution: {integrity: sha512-84qXstNemP3XS5jcof0el6+bDfjzuvhJPQTEfro3lgtbCtKgzPm3MgiS6ehXVPjeQ5+JS0HqmTz8f/RYfzHVxw==} + '@smithy/hash-node@3.0.3': + resolution: {integrity: sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==} engines: {node: '>=16.0.0'} - '@smithy/hash-stream-node@3.0.0': - resolution: {integrity: sha512-J0i7de+EgXDEGITD4fxzmMX8CyCNETTIRXlxjMiNUvvu76Xn3GJ31wQR85ynlPk2wI1lqoknAFJaD1fiNDlbIA==} + '@smithy/hash-stream-node@3.1.2': + resolution: {integrity: sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==} engines: {node: '>=16.0.0'} - '@smithy/invalid-dependency@3.0.0': - resolution: {integrity: sha512-F6wBBaEFgJzj0s4KUlliIGPmqXemwP6EavgvDqYwCH40O5Xr2iMHvS8todmGVZtuJCorBkXsYLyTu4PuizVq5g==} + '@smithy/invalid-dependency@3.0.3': + resolution: {integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} '@smithy/is-array-buffer@3.0.0': resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} engines: {node: '>=16.0.0'} - '@smithy/md5-js@3.0.0': - resolution: {integrity: sha512-Tm0vrrVzjlD+6RCQTx7D3Ls58S3FUH1ZCtU1MIh/qQmaOo1H9lMN2as6CikcEwgattnA9SURSdoJJ27xMcEfMA==} + '@smithy/md5-js@3.0.3': + resolution: {integrity: sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==} - '@smithy/middleware-content-length@3.0.0': - resolution: {integrity: sha512-3C4s4d/iGobgCtk2tnWW6+zSTOBg1PRAm2vtWZLdriwTroFbbWNSr3lcyzHdrQHnEXYCC5K52EbpfodaIUY8sg==} + '@smithy/middleware-content-length@3.0.3': + resolution: {integrity: sha512-Dbz2bzexReYIQDWMr+gZhpwBetNXzbhnEMhYKA6urqmojO14CsXjnsoPYO8UL/xxcawn8ZsuVU61ElkLSltIUQ==} engines: {node: '>=16.0.0'} - '@smithy/middleware-endpoint@3.0.0': - resolution: {integrity: sha512-aXOAWztw/5qAfp0NcA2OWpv6ZI/E+Dh9mByif7i91D/0iyYNUcKvskmXiowKESFkuZ7PIMd3VOR4fTibZDs2OQ==} + '@smithy/middleware-endpoint@3.0.4': + resolution: {integrity: sha512-whUJMEPwl3ANIbXjBXZVdJNgfV2ZU8ayln7xUM47rXL2txuenI7jQ/VFFwCzy5lCmXScjp6zYtptW5Evud8e9g==} engines: {node: '>=16.0.0'} - '@smithy/middleware-retry@3.0.0': - resolution: {integrity: sha512-kFaBiTa50y0iwhrOjX5UISo1SfiXPrE1EsMtZJAVF7Oci3AUpVzaMzRxzQJFGnxioSyCwSmzqiE9x4X3dW+7VQ==} + '@smithy/middleware-retry@3.0.1': + resolution: {integrity: sha512-hBhSEuL841FhJBK/19WpaGk5YWSzFk/P2UaVjANGKRv3eYNO8Y1lANWgqnuPWjOyCEWMPr58vELFDWpxvRKANw==} engines: {node: '>=16.0.0'} - '@smithy/middleware-serde@3.0.0': - resolution: {integrity: sha512-I1vKG1foI+oPgG9r7IMY1S+xBnmAn1ISqployvqkwHoSb8VPsngHDTOgYGYBonuOKndaWRUGJZrKYYLB+Ane6w==} + '@smithy/middleware-serde@3.0.3': + resolution: {integrity: sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==} engines: {node: '>=16.0.0'} - '@smithy/middleware-stack@3.0.0': - resolution: {integrity: sha512-+H0jmyfAyHRFXm6wunskuNAqtj7yfmwFB6Fp37enytp2q047/Od9xetEaUbluyImOlGnGpaVGaVfjwawSr+i6Q==} + '@smithy/middleware-stack@3.0.3': + resolution: {integrity: sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==} engines: {node: '>=16.0.0'} - '@smithy/node-config-provider@3.0.0': - resolution: {integrity: sha512-buqfaSdDh0zo62EPLf8rGDvcpKwGpO5ho4bXS2cdFhlOta7tBkWJt+O5uiaAeICfIOfPclNOndshDNSanX2X9g==} + '@smithy/node-config-provider@3.1.3': + resolution: {integrity: sha512-rxdpAZczzholz6CYZxtqDu/aKTxATD5DAUDVj7HoEulq+pDSQVWzbg0btZDlxeFfa6bb2b5tUvgdX5+k8jUqcg==} engines: {node: '>=16.0.0'} - '@smithy/node-http-handler@3.0.0': - resolution: {integrity: sha512-3trD4r7NOMygwLbUJo4eodyQuypAWr7uvPnebNJ9a70dQhVn+US8j/lCnvoJS6BXfZeF7PkkkI0DemVJw+n+eQ==} + '@smithy/node-http-handler@3.1.1': + resolution: {integrity: sha512-L71NLyPeP450r2J/mfu1jMc//Z1YnqJt2eSNw7uhiItaONnBLDA68J5jgxq8+MBDsYnFwNAIc7dBG1ImiWBiwg==} engines: {node: '>=16.0.0'} - '@smithy/property-provider@3.0.0': - resolution: {integrity: sha512-LmbPgHBswdXCrkWWuUwBm9w72S2iLWyC/5jet9/Y9cGHtzqxi+GVjfCfahkvNV4KXEwgnH8EMpcrD9RUYe0eLQ==} + '@smithy/property-provider@3.1.3': + resolution: {integrity: sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==} engines: {node: '>=16.0.0'} - '@smithy/protocol-http@4.0.0': - resolution: {integrity: sha512-qOQZOEI2XLWRWBO9AgIYuHuqjZ2csyr8/IlgFDHDNuIgLAMRx2Bl8ck5U5D6Vh9DPdoaVpuzwWMa0xcdL4O/AQ==} + '@smithy/protocol-http@4.0.3': + resolution: {integrity: sha512-x5jmrCWwQlx+Zv4jAtc33ijJ+vqqYN+c/ZkrnpvEe/uDas7AT7A/4Rc2CdfxgWv4WFGmEqODIrrUToPN6DDkGw==} engines: {node: '>=16.0.0'} - '@smithy/querystring-builder@3.0.0': - resolution: {integrity: sha512-bW8Fi0NzyfkE0TmQphDXr1AmBDbK01cA4C1Z7ggwMAU5RDz5AAv/KmoRwzQAS0kxXNf/D2ALTEgwK0U2c4LtRg==} + '@smithy/querystring-builder@3.0.3': + resolution: {integrity: sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==} engines: {node: '>=16.0.0'} - '@smithy/querystring-parser@3.0.0': - resolution: {integrity: sha512-UzHwthk0UEccV4dHzPySnBy34AWw3V9lIqUTxmozQ+wPDAO9csCWMfOLe7V9A2agNYy7xE+Pb0S6K/J23JSzfQ==} + '@smithy/querystring-parser@3.0.3': + resolution: {integrity: sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==} engines: {node: '>=16.0.0'} - '@smithy/service-error-classification@3.0.0': - resolution: {integrity: sha512-3BsBtOUt2Gsnc3X23ew+r2M71WwtpHfEDGhHYHSDg6q1t8FrWh15jT25DLajFV1H+PpxAJ6gqe9yYeRUsmSdFA==} + '@smithy/service-error-classification@3.0.3': + resolution: {integrity: sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==} engines: {node: '>=16.0.0'} - '@smithy/shared-ini-file-loader@3.0.0': - resolution: {integrity: sha512-REVw6XauXk8xE4zo5aGL7Rz4ywA8qNMUn8RtWeTRQsgAlmlvbJ7CEPBcaXU2NDC3AYBgYAXrGyWD8XrN8UGDog==} + '@smithy/shared-ini-file-loader@3.1.3': + resolution: {integrity: sha512-Z8Y3+08vgoDgl4HENqNnnzSISAaGrF2RoKupoC47u2wiMp+Z8P/8mDh1CL8+8ujfi2U5naNvopSBmP/BUj8b5w==} engines: {node: '>=16.0.0'} - '@smithy/signature-v4@3.0.0': - resolution: {integrity: sha512-kXFOkNX+BQHe2qnLxpMEaCRGap9J6tUGLzc3A9jdn+nD4JdMwCKTJ+zFwQ20GkY+mAXGatyTw3HcoUlR39HwmA==} + '@smithy/signature-v4@3.1.2': + resolution: {integrity: sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==} engines: {node: '>=16.0.0'} - '@smithy/smithy-client@3.0.0': - resolution: {integrity: sha512-HTLlEOPOoPxyVCoqzwRGJuRh4hyAAo+eveRcEPi7UpIaq2PCAmdFZM76jabUuzlPPR9ge+OQlKzZre+LT1nXzA==} + '@smithy/smithy-client@3.0.1': + resolution: {integrity: sha512-KAiFY4Y4jdHxR+4zerH/VBhaFKM8pbaVmJZ/CWJRwtM/CmwzTfXfvYwf6GoUwiHepdv+lwiOXCuOl6UBDUEINw==} engines: {node: '>=16.0.0'} - '@smithy/types@3.0.0': - resolution: {integrity: sha512-VvWuQk2RKFuOr98gFhjca7fkBS+xLLURT8bUjk5XQoV0ZLm7WPwWPPY3/AwzTLuUBDeoKDCthfe1AsTUWaSEhw==} + '@smithy/types@3.3.0': + resolution: {integrity: sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==} engines: {node: '>=16.0.0'} - '@smithy/url-parser@3.0.0': - resolution: {integrity: sha512-2XLazFgUu+YOGHtWihB3FSLAfCUajVfNBXGGYjOaVKjLAuAxx3pSBY3hBgLzIgB17haf59gOG3imKqTy8mcrjw==} + '@smithy/url-parser@3.0.3': + resolution: {integrity: sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==} '@smithy/util-base64@3.0.0': resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} @@ -3977,6 +4561,10 @@ packages: resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} engines: {node: '>=16.0.0'} + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + '@smithy/util-buffer-from@3.0.0': resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} engines: {node: '>=16.0.0'} @@ -3985,48 +4573,52 @@ packages: resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} engines: {node: '>=16.0.0'} - '@smithy/util-defaults-mode-browser@3.0.0': - resolution: {integrity: sha512-/ChTQXFZVK/92dLR9RLW2fOG03ghgUYZnRfrs9d9T3L7UxtsGx9QitF7Ppu64A8xcUHqA30kV7TUayFRBd7YQw==} + '@smithy/util-defaults-mode-browser@3.0.1': + resolution: {integrity: sha512-nW5kEzdJn1Bn5TF+gOPHh2rcPli8JU9vSSXLbfg7uPnfR1TMRQqs9zlYRhIb87NeSxIbpdXOI94tvXSy+fvDYg==} engines: {node: '>= 10.0.0'} - '@smithy/util-defaults-mode-node@3.0.0': - resolution: {integrity: sha512-gfABCXswcMgDUcVO+16e4BgTFnouaXNCowp9mVxV8dgaOCpUT9eEWIC+PK3ZoEm26QwlwT7WgfuN1Y22HKX36g==} + '@smithy/util-defaults-mode-node@3.0.1': + resolution: {integrity: sha512-TFk+Qb+elLc/MOhtSp+50fstyfZ6avQbgH2d96xUBpeScu+Al9elxv+UFAjaTHe0HQe5n+wem8ZLpXvU8lwV6Q==} engines: {node: '>= 10.0.0'} - '@smithy/util-endpoints@2.0.0': - resolution: {integrity: sha512-+exaXzEY3DNt2qtA2OtRNSDlVrE4p32j1JSsQkzA5AdP0YtJNjkYbYhJxkFmPYcjI1abuwopOZCwUmv682QkiQ==} + '@smithy/util-endpoints@2.0.4': + resolution: {integrity: sha512-ZAtNf+vXAsgzgRutDDiklU09ZzZiiV/nATyqde4Um4priTmasDH+eLpp3tspL0hS2dEootyFMhu1Y6Y+tzpWBQ==} engines: {node: '>=16.0.0'} '@smithy/util-hex-encoding@3.0.0': resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} engines: {node: '>=16.0.0'} - '@smithy/util-middleware@3.0.0': - resolution: {integrity: sha512-q5ITdOnV2pXHSVDnKWrwgSNTDBAMHLptFE07ua/5Ty5WJ11bvr0vk2a7agu7qRhrCFRQlno5u3CneU5EELK+DQ==} + '@smithy/util-middleware@3.0.3': + resolution: {integrity: sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==} engines: {node: '>=16.0.0'} - '@smithy/util-retry@3.0.0': - resolution: {integrity: sha512-nK99bvJiziGv/UOKJlDvFF45F00WgPLKVIGUfAK+mDhzVN2hb/S33uW2Tlhg5PVBoqY7tDVqL0zmu4OxAHgo9g==} + '@smithy/util-retry@3.0.3': + resolution: {integrity: sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==} engines: {node: '>=16.0.0'} - '@smithy/util-stream@3.0.0': - resolution: {integrity: sha512-AYQeeAxBi3yee9SXC0HgrbeIchQeo6EAkpiwwmmCK6Z7uq8GnMGe8AxRZT3O4wyMNRNK2qfjZSvx6+wKfuMajg==} + '@smithy/util-stream@3.0.1': + resolution: {integrity: sha512-7F7VNNhAsfMRA8I986YdOY5fE0/T1/ZjFF6OLsqkvQVNP3vZ/szYDfGCyphb7ioA09r32K/0qbSFfNFU68aSzA==} engines: {node: '>=16.0.0'} '@smithy/util-uri-escape@3.0.0': resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} engines: {node: '>=16.0.0'} + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + '@smithy/util-utf8@3.0.0': resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} engines: {node: '>=16.0.0'} - '@smithy/util-waiter@3.0.0': - resolution: {integrity: sha512-+fEXJxGDLCoqRKVSmo0auGxaqbiCo+8oph+4auefYjaNxjOLKSY2MxVQfRzo65PaZv4fr+5lWg+au7vSuJJ/zw==} + '@smithy/util-waiter@3.1.2': + resolution: {integrity: sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==} engines: {node: '>=16.0.0'} - '@socket.io/component-emitter@3.1.2': - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@socket.io/component-emitter@3.1.0': + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} '@solidity-parser/parser@0.18.0': resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} @@ -4085,68 +4677,92 @@ packages: '@stablelib/x25519@1.0.3': resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} - '@storybook/addon-actions@8.1.1': - resolution: {integrity: sha512-EEBjOMuQOdCSVrwPQEkJFc42I0TWj/bK+8lboV0jXi61ZI3okDPCJ/04vu5iTvX0HjRoYqqwBjyYj0Crf7ihag==} + '@storybook/addon-actions@8.3.0': + resolution: {integrity: sha512-HvAc3fW979JVw8CSKXZMouvgrJ2BNLNWaUB8jNokQb3Us00P6igVKLwg/pBV8GBgDr5Ng4pHYqi/ZH+xzEYFFw==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-backgrounds@8.1.1': - resolution: {integrity: sha512-UFbKI3Ebsllg3DZIlVtYvp1nuLnBp85sKI98KnnYqiHCKWHDWlK7Li0Y1J2ab0w/Fx0grspC8WUgGId6NHrIrA==} + '@storybook/addon-backgrounds@8.3.0': + resolution: {integrity: sha512-qaV/QsXoviAmBYFszI/KN1CaI/LcACGX9RCBB54fMau3JuouIBU/zTl2jY2+BioCBk6oY8KqcnAS1coOZzlNXQ==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-controls@8.1.1': - resolution: {integrity: sha512-KJXW/hjIWM+VLqqUAvdGIkX7hTDs8FtQOuUFSC/FPDqKveUoWz0hd+WaoT9HhNF8gyzFXYACoeb9XkQVVcDATA==} + '@storybook/addon-controls@8.3.0': + resolution: {integrity: sha512-Id4j6Neimkdq0OyfQ3qkHpKLisbN08M8pXHDI/A0VeF91xEGBdc1bJgS/EU+ifa24tr5SRYwlAlcBDAWJbZMfA==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-docs@8.1.1': - resolution: {integrity: sha512-vMU26AYQBstOj73MX3egqJlY/VUjawfWVcTlDJjSa43GzWfp8wrbr1fNXRy2MoLe19UKZ9Kx+m4CfsrGsXHogg==} + '@storybook/addon-docs@8.3.0': + resolution: {integrity: sha512-LrvWBDX5Vi//82Q78QRbTsG+9rJU9JJFAVPk1NnLp2Yn0F4FueVzIw8AabAkZFy0LHPMGV+EHpkPtYz4Czkhgw==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-essentials@8.1.1': - resolution: {integrity: sha512-1MfjgNuhh0iuSVunrDyZFsDNNs3rkssjqfvqt9FM7/l96cbBku8b39vPUW5kYNtA8wgIYCVXIw6c+9zhhJDoDg==} + '@storybook/addon-essentials@8.3.0': + resolution: {integrity: sha512-y+hlMnIoD+h/diY7BvIeySPCz/ZtJPPZfS/COQuPRXfPWCr37p9XLEz3E+m2spniAbgGv9KpvdqQd0kWcwwfiA==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-highlight@8.1.1': - resolution: {integrity: sha512-i27OsZmxBJWV0Yf7aRbke19Yin9F+v0YyAyD2JDulcjdZdsInUd8/qsQQYd3YmTkQ+0S0SnEdeTAJ4qca9KTtA==} + '@storybook/addon-highlight@8.3.0': + resolution: {integrity: sha512-bS1rqzbwGgeTKVLYEyY+6DzpafLtDLnoSF+KzRIiV7/1H30evhwVSzkgX1L2F6+ssS1n9WrRJeglniv9j+5mGQ==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-interactions@8.1.1': - resolution: {integrity: sha512-cF26lkVWxR7vZv6BW+P4JcJILIKykfn749VfdYyOoYegbJcOt5t2Soto2zdaqg7ZoVBeZherYyjebiXiwOPrng==} + '@storybook/addon-interactions@8.3.0': + resolution: {integrity: sha512-nAVUFpt2kTaPMY7RxfZwiYipngxf76dfx1E/QP9n/333+/pe88UwXbUkmLKpyC8EWqZXDI0oSV5XDDzoI5x3dA==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-links@8.1.1': - resolution: {integrity: sha512-pY6iDCzb10gaAxhzwfkB+iKJzuDYeZBG2gftt1vIoPSXr/VtkU7HLOb9PNige0ioO3szxV0bqTxFdonzMXCOTA==} + '@storybook/addon-links@8.3.0': + resolution: {integrity: sha512-nUnoMPPuxM8yJ7LCrppsUrn3gwqt4E0si9fqIIb5IkB56vz48RxCO9MtO1qjwhWosfMdN6boHaOl1Qc6IxV3Lg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.0 peerDependenciesMeta: react: optional: true - '@storybook/addon-measure@8.1.1': - resolution: {integrity: sha512-aI4cFECK/NmwJTj3Xu6MGrMm4Rf0e+FGB5+BoY+tUi3LTX0spAu/8VgwuoDGB6ntvbZyzPfr6mG2qND9KU+sMQ==} + '@storybook/addon-measure@8.3.0': + resolution: {integrity: sha512-0TZ2ihzX0mRr1rNrFDieDsIKASZ2qUg3eHDkskLKOhxwoUHqsLzXlvS/scKZ+zb8pgjrvsBAsjyPstlrK+z0Zg==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-outline@8.1.1': - resolution: {integrity: sha512-l/LfxtDdwQ+8FduxsRWEEYhxJ7CetdHcCXh+T8bPaP2tzPqv+jh/F8KqZf3LZcC8HITlp/eyd3VYumWC+OKYFw==} + '@storybook/addon-outline@8.3.0': + resolution: {integrity: sha512-xTvBGgX6RIkKjQiAi9LvPGbGuBa6tsJS2jCmjwiei3SX3I56E6Bf3KASsFH2x8j9khMVsgQcfA3QDIhjwatdgw==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-themes@8.1.1': - resolution: {integrity: sha512-aOaPdkxJdYkT0xKxHN+cM7FWpSSgkUjhUNC/n32KYMpNKgZbp0UaP2VJbdHTIhh4Pzu4DSJL9zrVAQdhFHc6Kg==} + '@storybook/addon-themes@8.3.0': + resolution: {integrity: sha512-kAvpsQBrIMe7u8zU5+WoYKPhSo/MzgYXHARjYKhJYpsFatCv/npg/hLOiBlKWV5FzEqjQx9dAZiehXDF3JsCZw==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-toolbars@8.1.1': - resolution: {integrity: sha512-KY6fffSr2mE91CZAp1xtVM2Bcxo/dpA+R8RRt/9kei+6NucaIqpeqa1YTooTD8bUttq1yb/34kMSRgX/W3Qbfg==} + '@storybook/addon-toolbars@8.3.0': + resolution: {integrity: sha512-/3/jnd70tnvh3x1EL8axE4TR9EHwC+bBch1uIc3vH/lmyZBqSBVA50clz23FvjhykjcaKQogcugCuU1w5TJlBA==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-viewport@8.1.1': - resolution: {integrity: sha512-AqUYM7mozrIDa/MNHEd2h7jbfKncofx/OUVI8hrbj7VX46OQ5XbvBqgKpPK15c1ejPfx1hiVz9ZYGxA6HXXrjw==} + '@storybook/addon-viewport@8.3.0': + resolution: {integrity: sha512-6h/0mKipUG6w2o5IOzyhvC/2ifJlSNIA60hLkJ291g42+ilzkydpby9TBN7FcnrVL3Bv+oLgkDLBWVCqma/fyw==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/blocks@8.1.1': - resolution: {integrity: sha512-D+jUlkA2dxYPSY97+yM5sbLXPABKlsZAhmDy6gw05UoSpfBu1MnKd18Qj4fTbyqLYIJGH9z/whGd3tTcuZn8KQ==} + '@storybook/blocks@8.3.0': + resolution: {integrity: sha512-V7D5lv5R+GJya9cCZOCjmOVjhvP5J3KIaclQuuGGJda/ZD/SpwHcFOGSpo6sNR2UKHXXvb61oM8gRQQWDvqPlg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.0 peerDependenciesMeta: react: optional: true react-dom: optional: true - '@storybook/builder-manager@8.1.1': - resolution: {integrity: sha512-WKpeDCtsmsesQYYYcXlCP17U1wdMGv6LnRY9BetKYbUPSHJo4eUBH8NmfW/ZjogczaUDw9sml6Sq5jIT35+Yuw==} - - '@storybook/builder-vite@8.1.1': - resolution: {integrity: sha512-+BSmXuZ9j95oKCvHcKztzjZNzBVeXYMoRO2TuflLnknMUA0v9ySp1PhiQxHM4DgAW6t9db1akzc9HoTA5sjTWg==} + '@storybook/builder-vite@8.3.0': + resolution: {integrity: sha512-9qo3zcZkEpy69E7cx9OHHexBe9+25vH0p+4sWZSjl2sjqjhaxLN5eXnODQbDsOKZNRVrLVTGmKxfFJzAJFnY0w==} peerDependencies: '@preact/preset-vite': '*' + storybook: ^8.3.0 typescript: '>= 4.3.x' vite: ^4.0.0 || ^5.0.0 vite-plugin-glimmerx: '*' @@ -4158,171 +4774,131 @@ packages: vite-plugin-glimmerx: optional: true - '@storybook/channels@8.1.1': - resolution: {integrity: sha512-vG7y97QB++TRkuxYLNKaWJmgr9QBUHyjQgNCWvHIeSYW5zxum9sm6VSR2j1r2G3XUGFSxDwenYBTQuwZJLhWNQ==} - - '@storybook/cli@8.1.1': - resolution: {integrity: sha512-ajLLIQnHjXpzUhYJ51b0eL/3uNuOjkbcx/B8HbgSbArBy7QvB9sX44wPJZYjL3GASYaZAppWixS2r36O/3yu+w==} - hasBin: true - - '@storybook/client-logger@8.1.1': - resolution: {integrity: sha512-9AWPgIN3K0eLusChJUqB5Ft+9P2pW5/s4vOMoj3TCvu8lrdq8AH8ctvxk7x2Kw2wEwQ/g9DyE6C/rDQUARbxew==} - - '@storybook/codemod@8.1.1': - resolution: {integrity: sha512-KfNf0XtMb2Hq1+v+2d660u2VhmmG5IMhPfdSClHh8Mer90CEGKvZpZQLn/Ph1REvzKfCW+MzEgn/JrEcJs8fHg==} - - '@storybook/components@8.1.1': - resolution: {integrity: sha512-0JxYXMb9nlTBAJJXRdn3IjlgXx07gylnTOqa7t3UgOiVDEVPs+1x9LtHU408igcZ5gtcrZepg46O9gz0sdgSfQ==} + '@storybook/components@8.3.0': + resolution: {integrity: sha512-SO/iTkmWp3aYCIy8DEhRMoOn6K7lcKTPNC/YjTvOFFzwq/CLq86WNqz6aX+wV5n6MvWTs7evSwMoz7lp4Lc4sw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - - '@storybook/core-common@8.1.1': - resolution: {integrity: sha512-cjECiKD8+fdlhf3UGrjgrPMBeBwB/gbF5ZVLpa1EYFsr23BHGnZADpmyCb71fl+aUSiGuZ106AS6RQt20w7fXw==} - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - - '@storybook/core-events@8.1.1': - resolution: {integrity: sha512-WpeiBV6RWTZ6t8SI1YdQh8NlbvQtZs9WRr4CPfpzHAly+oxFy6PtPz0h5TMKsU5/kt/L9yL7tE9ZzPYzvFWH/A==} + storybook: ^8.3.0 - '@storybook/core-server@8.1.1': - resolution: {integrity: sha512-/r70ORN9PdrLTLOeZfZkYhR/UBe6dj5DhcQ21zJhKU/0b10nuLJh4SGVD93Hah2wAYEN7YoJzX1bZMo6zRkTRQ==} + '@storybook/core@8.3.0': + resolution: {integrity: sha512-UeErpD0xRIP2nFA2TjPYxtEyv24O6VRfq2XXU5ki2QPYnxOxAPBbrMHCADjgBwNS4S2NUWTaVBYxybISVbrj+w==} - '@storybook/csf-plugin@8.1.1': - resolution: {integrity: sha512-aZ2F3PY601MuW8xWf7/f928/anhZyaXYnysa8ViHooBEnJS1FBJfCsDDSM54FTDRyyOQF6AZtHeY53snd+e9ng==} - - '@storybook/csf-tools@8.1.1': - resolution: {integrity: sha512-BaS1bFx8Rj9Nj7gxsJrifu9lFoli7CD4DxBGEeagVOvCcBX95RI0I9JLhr81LdMl5DwPP1xBGZjCVNsC7eIR4w==} + '@storybook/csf-plugin@8.3.0': + resolution: {integrity: sha512-sCmeN/OVYj95TKkMqJqxbaztIbdv5jCrtrXuNg4oJaGzNucmMNAbmv2jK2tCNE6Uz2X9IMRcseFX/h9TgjyJ9A==} + peerDependencies: + storybook: ^8.3.0 '@storybook/csf@0.0.1': resolution: {integrity: sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==} - '@storybook/csf@0.1.7': - resolution: {integrity: sha512-53JeLZBibjQxi0Ep+/AJTfxlofJlxy1jXcSKENlnKxHjWEYyHQCumMP5yTFjf7vhNnMjEpV3zx6t23ssFiGRyw==} - - '@storybook/docs-mdx@3.1.0-next.0': - resolution: {integrity: sha512-t4syFIeSyufieNovZbLruPt2DmRKpbwL4fERCZ1MifWDRIORCKLc4NCEHy+IqvIqd71/SJV2k4B51nF7vlJfmQ==} - - '@storybook/docs-tools@8.1.1': - resolution: {integrity: sha512-BPq9e6bl4uRru0GSLHS56eg0SV5LEMJSzrMIzeSrTf9xoZdBeLM05oblo2oebEGZUE97uduhKoaUeUJtsuMIxw==} + '@storybook/csf@0.1.11': + resolution: {integrity: sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==} '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - '@storybook/icons@1.2.9': - resolution: {integrity: sha512-cOmylsz25SYXaJL/gvTk/dl3pyk7yBFRfeXTsHvTA3dfhoU/LWSq0NKL9nM7WBasJyn6XPSGnLS4RtKXLw5EUg==} + '@storybook/icons@1.2.10': + resolution: {integrity: sha512-310apKdDcjbbX2VSLWPwhEwAgjxTzVagrwucVZIdGPErwiAppX8KvBuWZgPo+rQLVrtH8S+pw1dbUwjcE6d7og==} engines: {node: '>=14.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@storybook/instrumenter@8.1.1': - resolution: {integrity: sha512-8OJCEt0/KXCxT0B8uIQgR3aEmlW8iW5CK1qZxZUEvMDUb7agpKdthLfiN8+M3maq59PmOhq9h43iUTRZxKFVpw==} - - '@storybook/manager-api@8.1.1': - resolution: {integrity: sha512-IDPFxFFArO3l7P8vPjBxDBc6V255FJLx9W+eCOMdJJRZcovxrCkYOB0wRd+fw/IDtGt1zgPBfA6WD/JQAa1hlw==} - - '@storybook/manager@8.1.1': - resolution: {integrity: sha512-b3Oa9QsCbkTpH0LCKkMYDXtFYb1QpDc45EIFIm5Ib2tlilPQkx+a7jNpJG1/SKnYBwAO7iYjxN8iW9MwMLoCig==} - - '@storybook/node-logger@8.1.1': - resolution: {integrity: sha512-l+B8eu3yBZfrHvCR/FVqGyObgA0KSLp+06NkWDMn0p7qu0tCTROquopKdn2gXKitZp8wGwhgJV56OvW5C12XQA==} + '@storybook/instrumenter@8.3.0': + resolution: {integrity: sha512-oJmX8jbNKbPBlNMItRvEoaVAJWX1u6jsqXdIcNRCXo3PDdVnunVYz8vVkG8mbL8Cp/cKlsuQk7YBZA4IM5mRgg==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/preview-api@8.1.1': - resolution: {integrity: sha512-5EcByqtJgj7a7ZWICMLif8mK3cRmdIMbdSPEDf4X6aTQ8LZOg6updLrkb/Eh6qfeYv46TK/MP8BXa89wfOxWGQ==} + '@storybook/manager-api@8.3.0': + resolution: {integrity: sha512-5WBLEFHpe4H+9vZZLjNh7msIkyl9MPt4/C2nI+MXKZyU55xBBgiAy4fcD9aj02PcbhyR4JhLqbqmdeBe5Xafeg==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/preview@8.1.1': - resolution: {integrity: sha512-P8iBi9v/62AhTztbCYjVxH6idNO0h9uO583GHwi3uq2Io7F1gUSgwG/HYZ7PnclOsMnmG0FJvAwrvdRc6sWSNw==} + '@storybook/preview-api@8.3.0': + resolution: {integrity: sha512-pHq/T7oWBfzc9TCIPYyJQUXuiUiFfmdrcYvuZE1kf46i7wXh9Q2/Kd3BUJWSCpBXUMoYfAxg9YysGljMII8LWA==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/react-dom-shim@8.1.1': - resolution: {integrity: sha512-X2WPGOxKZhReokqyBbYxhsCHe0qzyM2V8Vs4tQIua/HpNJ/4jqFoXmJvMnUtzwnNry4Gpuhn3nVPtD4QRZsP1w==} + '@storybook/react-dom-shim@8.3.0': + resolution: {integrity: sha512-87X4cvgwFT1ll5SzXgQq6iGbkVCgxLBpBm58akF/hzpeRkwfJDncGi/A5hElOJrBg63IkznmSJE7tf9RkrboqQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.0 - '@storybook/router@8.1.1': - resolution: {integrity: sha512-9/9ZONtBZI7VxkFpwVYIq6d42yBLci7wkXOVJO5gugi+iVDM02eYQvrbKTTVnY0fCXXwwwVbpTyoHk25bqbRNg==} - - '@storybook/svelte-vite@8.1.1': - resolution: {integrity: sha512-CYgL28vzX6ssv5lCWaThzj8HfqUIQ9vSYeLxKU5kqPY6AZYOKshB07O9UM5GIKCQ7h9sVJIxCry7qligbsmOFA==} + '@storybook/svelte-vite@8.3.0': + resolution: {integrity: sha512-L8y9vAvjrbO7A4P+xL/CdAKsGe6nZ25wTx+rNin/8FUaKqbyWvItUMObYFPp0GHw2zFcdXkD4frpbufQp6kRLg==} engines: {node: '>=18.0.0'} peerDependencies: '@sveltejs/vite-plugin-svelte': ^2.0.0 || ^3.0.0 + storybook: ^8.3.0 svelte: ^4.0.0 || ^5.0.0-next.65 vite: ^4.0.0 || ^5.0.0 - '@storybook/svelte@8.1.1': - resolution: {integrity: sha512-dsPmt1rd6wMk3fXrQ49BaCWsSvwJ0ItT0tAOUJC4RRDwGDStCew2FLeloyPjsJv5xX+PI+KI/K944y1cjHPvEw==} + '@storybook/svelte@8.3.0': + resolution: {integrity: sha512-SFvyZ6Jf/RyC2iPySjDqvaXlD31SB51I+zNfIXgXq6JoHMe4TzVTE8FnvIODrY50Pq/y2f3btVqL1HQ9nYRnWA==} engines: {node: '>=18.0.0'} peerDependencies: + storybook: ^8.3.0 svelte: ^4.0.0 || ^5.0.0-next.65 - '@storybook/sveltekit@8.1.1': - resolution: {integrity: sha512-sPcktyEtYNavNbSPVdXz36cwn7Hm6+PPJ0a1WrlyPUr8AHRuO2/ZqAKm+PSp1wczxmm+hHaqNN/AMCFeSJHQTA==} + '@storybook/sveltekit@8.3.0': + resolution: {integrity: sha512-KhUel8y2ebzvWA/2xV3r+JSWw/zM2N8k/5k/GElZEOo0jI0vgP6dKaGEgXjqqX4uy+sGwpk+3/UC6JR5e5gdGA==} engines: {node: '>=18.0.0'} peerDependencies: + storybook: ^8.3.0 svelte: ^4.0.0 || ^5.0.0-next.65 vite: ^4.0.0 || ^5.0.0 - '@storybook/telemetry@8.1.1': - resolution: {integrity: sha512-yyrAc5t4UUb2OW6zpHM7/aI3ePiPcgMTyJqqn5X5+S9OHy0yHI7NHi7ZslTg6D5yXV6g3OTfa3Yq3pXkOBV3uw==} - - '@storybook/test@8.1.1': - resolution: {integrity: sha512-JIFgfTINM8TJvfyy/aH1WfIgkGVZIesntDYTcY40ukE6ZPaM98YFrSD5E4D3b0vPFEIU0QJ2xVbOGIAVX/6hBw==} - - '@storybook/theming@8.1.1': - resolution: {integrity: sha512-opjTCpvNDlDyTWnU58YLoFFhNrY88mxWRkHEE0Qt0hhRnS8EkU/+aam/1gTr204peDWZ+Ap3BBHFq28nQ5kfDQ==} + '@storybook/test@8.3.0': + resolution: {integrity: sha512-d8y8ST8YY/pSjTxBcWitKM7YbbupN8D0obVlciZRt6WW3o8WUz6iwMuzuJuiUVwtxiRtdKL9jygC5M+aaCpFYQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + storybook: ^8.3.0 - '@storybook/types@8.1.1': - resolution: {integrity: sha512-QSQ63aKr2IXrGjX2/Fg1oiGWk+2Nuf+TplaHRC2NKBMgvyn+M0BHUgMTDHQVrFaH4bpl2PkE0r0tzOKP4JI43A==} + '@storybook/theming@8.3.0': + resolution: {integrity: sha512-lJCarAzswZvUgBt/o1LMJp+07Io5G2VI1+Fw+bgn+92kRD8otCFwuMZIy0u7cEjHiEGqGnpzThlIki6vFjEXeA==} + peerDependencies: + storybook: ^8.3.0 - '@sveltejs/adapter-auto@3.2.0': - resolution: {integrity: sha512-She5nKT47kwHE18v9NMe6pbJcvULr82u0V3yZ0ej3n1laWKGgkgdEABE9/ak5iDPs93LqsBkuIo51kkwCLBjJA==} + '@sveltejs/adapter-auto@3.2.2': + resolution: {integrity: sha512-Mso5xPCA8zgcKrv+QioVlqMZkyUQ5MjDJiEPuG/Z7cV/5tmwV7LmcVWk5tZ+H0NCOV1x12AsoSpt/CwFwuVXMA==} peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/kit@2.5.7': - resolution: {integrity: sha512-6uedTzrb7nQrw6HALxnPrPaXdIN2jJJTzTIl96Z3P5NiG+OAfpdPbrWrvkJ3GN4CfWqrmU4dJqwMMRMTD/C7ow==} + '@sveltejs/kit@2.5.27': + resolution: {integrity: sha512-CcbRTzl+65oWljAASL6UlxM4x3NWwd0fjq5fQOfP243vs50myFQ8lil0fr3Im6HeeQqYUCtnv8HjO8REWVPjTw==} engines: {node: '>=18.13'} hasBin: true peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 - '@sveltejs/package@2.3.1': - resolution: {integrity: sha512-JvR2J4ost1oCn1CSdqenYRwGX/1RX+7LN+VZ71aPnz3JAlIFaEKQd1pBxlb+OSQTfeugJO0W39gB9voAbBO5ow==} + '@sveltejs/package@2.3.5': + resolution: {integrity: sha512-fxWSG+pJHxWwcKltG+JoQ+P1CPO7NHVuZD1Gchi/1mNN6C60yD/voHeeXlqr0HHGkvIrpAjRIHLjsavI77Qsiw==} engines: {node: ^16.14 || >=18} hasBin: true peerDependencies: svelte: ^3.44.0 || ^4.0.0 || ^5.0.0-next.1 - '@sveltejs/vite-plugin-svelte-inspector@2.1.0': - resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} + '@sveltejs/vite-plugin-svelte-inspector@2.0.0': + resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} engines: {node: ^18.0.0 || >=20} peerDependencies: '@sveltejs/vite-plugin-svelte': ^3.0.0 svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 - '@sveltejs/vite-plugin-svelte@3.1.0': - resolution: {integrity: sha512-sY6ncCvg+O3njnzbZexcVtUqOBE3iYmQPJ9y+yXSkOwG576QI/xJrBnQSRXFLGwJNBa0T78JEKg5cIR0WOAuUw==} + '@sveltejs/vite-plugin-svelte@3.1.1': + resolution: {integrity: sha512-rimpFEAboBBHIlzISibg94iP09k/KYdHgVhJlcsTfn7KMBhc70jFX/GRWkRdFCc2fdnk+4+Bdfej23cMDnJS6A==} engines: {node: ^18.0.0 || >=20} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} @@ -4332,30 +4908,13 @@ packages: peerDependencies: postcss: ^8.2.15 - '@testing-library/dom@9.3.4': - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} - '@testing-library/jest-dom@6.4.5': - resolution: {integrity: sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==} + '@testing-library/jest-dom@6.5.0': + resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - peerDependencies: - '@jest/globals': '>= 28' - '@types/bun': latest - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' - peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/bun': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: - optional: true '@testing-library/user-event@14.5.2': resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} @@ -4366,8 +4925,8 @@ packages: '@ts-morph/common@0.20.0': resolution: {integrity: sha512-7uKjByfbPpwuzkstL3L5MQyuXPSKdoNG93Fmi2JoDcTf3pEP731JdRFAduRVkOs8oqxPsXKA+ScrWkdQ8t/I+Q==} - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + '@tsconfig/node10@1.0.9': + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -4393,8 +4952,11 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.5': - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/bn.js@4.11.6': + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} '@types/bn.js@5.1.5': resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} @@ -4402,39 +4964,27 @@ packages: '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/chrome@0.0.136': + resolution: {integrity: sha512-XDEiRhLkMd+SB7Iw3ZUIj/fov3wLd4HyTdLltVszkgl1dBfc3Rb7oPMVZ2Mz2TLqnF7Ow+StbR8E7r9lqpb4DA==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/cross-spawn@6.0.6': - resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} - '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/detect-port@1.3.5': - resolution: {integrity: sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==} - - '@types/diff@5.2.1': - resolution: {integrity: sha512-uxpcuwWJGhe2AR1g8hD9F5OYGCqjqWnBUQFD8gMZsDbv8oPHzxJF6iMO6n8Tk0AdzlxoaaoQhOYlIg/PukVU8g==} - '@types/dns-packet@5.6.5': resolution: {integrity: sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==} - '@types/doctrine@0.0.3': - resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} - '@types/dom-screen-wake-lock@1.0.3': resolution: {integrity: sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw==} - '@types/ejs@3.1.5': - resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} - - '@types/emscripten@1.39.12': - resolution: {integrity: sha512-AQImDBgudQfMqUBfrjZYilRxoHDzTBp+ejh+g1fY67eSMalwIKtBXofjpyI0JBgNpHGzxeGAR2QDya0wxW9zbA==} - '@types/eslint@8.56.10': resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} @@ -4444,15 +4994,24 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/express-serve-static-core@4.19.0': - resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} + '@types/express-serve-static-core@4.19.5': + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/filesystem@0.0.35': + resolution: {integrity: sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ==} + + '@types/filewriter@0.0.33': + resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} + '@types/find-cache-dir@3.2.1': resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} + '@types/har-format@1.2.15': + resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -4480,8 +5039,14 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/lodash@4.17.4': - resolution: {integrity: sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==} + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/lodash@4.17.7': + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + + '@types/lru-cache@5.1.1': + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -4498,47 +5063,50 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/nlcst@1.0.4': - resolution: {integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==} + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} - '@types/node-forge@1.3.11': - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@18.19.33': - resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} + '@types/node@18.15.13': + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - '@types/node@20.12.11': - resolution: {integrity: sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==} + '@types/node@18.19.31': + resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/node@20.12.7': + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} '@types/object-hash@3.0.6': resolution: {integrity: sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w==} + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/pbkdf2@3.1.2': resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} - '@types/pretty-hrtime@1.0.3': - resolution: {integrity: sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==} - '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} - '@types/qs@6.9.15': - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + '@types/qs@6.9.16': + resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react@18.3.2': - resolution: {integrity: sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==} + '@types/react@18.3.5': + resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} @@ -4546,8 +5114,8 @@ packages: '@types/secp256k1@4.0.6': resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/semver@7.5.7': + resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} @@ -4567,6 +5135,9 @@ packages: '@types/unist@3.0.2': resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} @@ -4579,8 +5150,19 @@ packages: '@types/yargs@17.0.32': resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - '@typescript-eslint/eslint-plugin@7.8.0': - resolution: {integrity: sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==} + '@typescript-eslint/eslint-plugin@7.4.0': + resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/eslint-plugin@7.9.0': + resolution: {integrity: sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -4590,8 +5172,18 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.8.0': - resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} + '@typescript-eslint/parser@7.7.0': + resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.9.0': + resolution: {integrity: sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -4604,12 +5196,30 @@ packages: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@7.8.0': - resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} + '@typescript-eslint/scope-manager@7.4.0': + resolution: {integrity: sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/scope-manager@7.7.0': + resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.8.0': - resolution: {integrity: sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==} + '@typescript-eslint/scope-manager@7.9.0': + resolution: {integrity: sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.4.0': + resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/type-utils@7.9.0': + resolution: {integrity: sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -4622,8 +5232,16 @@ packages: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@7.8.0': - resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} + '@typescript-eslint/types@7.4.0': + resolution: {integrity: sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/types@7.7.0': + resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/types@7.9.0': + resolution: {integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==} engines: {node: ^18.18.0 || >=20.0.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -4635,8 +5253,26 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@7.8.0': - resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} + '@typescript-eslint/typescript-estree@7.4.0': + resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.7.0': + resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.9.0': + resolution: {integrity: sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -4650,8 +5286,14 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@7.8.0': - resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} + '@typescript-eslint/utils@7.4.0': + resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/utils@7.9.0': + resolution: {integrity: sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -4660,74 +5302,109 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@7.8.0': - resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} + '@typescript-eslint/visitor-keys@7.4.0': + resolution: {integrity: sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/visitor-keys@7.7.0': + resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/visitor-keys@7.9.0': + resolution: {integrity: sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==} engines: {node: ^18.18.0 || >=20.0.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitest/coverage-v8@1.6.0': - resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} + '@vitest/coverage-v8@1.4.0': + resolution: {integrity: sha512-4hDGyH1SvKpgZnIByr9LhGgCEuF9DKM34IBLCC/fVfy24Z3+PZ+Ii9hsVBsHvY1umM1aGPEjceRkzxCfcQ10wg==} peerDependencies: - vitest: 1.6.0 + vitest: 1.4.0 - '@vitest/expect@1.3.1': - resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} + '@vitest/expect@1.5.0': + resolution: {integrity: sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==} '@vitest/expect@1.6.0': resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@2.0.5': + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + + '@vitest/pretty-format@2.0.5': + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + + '@vitest/pretty-format@2.1.1': + resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} + + '@vitest/runner@1.5.0': + resolution: {integrity: sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==} + '@vitest/runner@1.6.0': resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/snapshot@1.5.0': + resolution: {integrity: sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==} + '@vitest/snapshot@1.6.0': resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} - '@vitest/spy@1.3.1': - resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} + '@vitest/spy@1.5.0': + resolution: {integrity: sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==} '@vitest/spy@1.6.0': resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} - '@vitest/utils@1.3.1': - resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} + '@vitest/spy@2.0.5': + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + + '@vitest/utils@1.5.0': + resolution: {integrity: sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==} '@vitest/utils@1.6.0': resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} - '@volar/kit@2.2.2': - resolution: {integrity: sha512-mIPWV7sjuJPNL+TLnpQwFD6hW+D5tF4Axg+nv0wHjdxrik+ilWT5DnBomMftoekUF4+SxUqxMjU8kd7caOuT5Q==} + '@vitest/utils@2.0.5': + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + + '@vitest/utils@2.1.1': + resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} + + '@volar/kit@2.4.5': + resolution: {integrity: sha512-ZzyErW5UiDfiIuJ/lpqc2Kx5PHDGDZ/bPlPJYpRcxlrn8Z8aDhRlsLHkNKcNiH65TmNahk2kbLaiejiqu6BD3A==} peerDependencies: typescript: '*' - '@volar/language-core@2.2.2': - resolution: {integrity: sha512-GuvEL4JdxbnLVhPLICncCGT+tVW4cIz9GxXNeDofNnJ4iNTKhr5suGVsA1GLOne9PbraSjn8PlLt+pvLxuRVeQ==} + '@volar/language-core@2.4.5': + resolution: {integrity: sha512-F4tA0DCO5Q1F5mScHmca0umsi2ufKULAnMOVBfMsZdT4myhVl4WdKRwCaKcfOkIEuyrAVvtq1ESBdZ+rSyLVww==} - '@volar/language-server@2.2.2': - resolution: {integrity: sha512-9KwlCDNeFCoxTIhYOJNtpQA7M0JP0DHvvwXrqN8qNNEMJT1Oe0cic0C2tUCa/poCgkiXDbUxRldwamyuTZ6ZQg==} + '@volar/language-server@2.4.5': + resolution: {integrity: sha512-l5PswE0JzCtstTlwBUpikeSa3lNUBJhTuWtj9KclZTGi2Uex4RcqGOhTiDsUUtvdv/hEuYCxGq1EdJJPlQsD/g==} - '@volar/language-service@2.2.2': - resolution: {integrity: sha512-uxooJqRhtESXaPAGs+YFJGAtZQuRO1KLG4LPPGrHHO1ZTkx0TfQPym6WNnBfVCcBXwnSlyFVv+IbAndR5oKz1w==} + '@volar/language-service@2.4.5': + resolution: {integrity: sha512-xiFlL0aViGg6JhwAXyohPrdlID13uom8WQg6DWYaV8ob8RRy+zoLlBUI8SpQctwlWEO9poyrYK01revijAwkcw==} - '@volar/snapshot-document@2.2.2': - resolution: {integrity: sha512-JKj3aRpfoJZ84EeFN62PFw3jwKo2WTQnaemhWu/S4QNlw7q+IoDI1jNcgxZwblfBl0X5YGlRI1zYbwr8WidBTA==} + '@volar/source-map@2.4.5': + resolution: {integrity: sha512-varwD7RaKE2J/Z+Zu6j3mNNJbNT394qIxXwdvz/4ao/vxOfyClZpSDtLKkwWmecinkOVos5+PWkWraelfMLfpw==} - '@volar/source-map@2.2.2': - resolution: {integrity: sha512-vUwvZuSW6iN4JI9QRinh9EjFasx1TUtnaWMKwgWx08xz1PyYuNkLlWlrZXBZ5GGBhML0u230M/7X+AHY2h9yKg==} - - '@volar/typescript@2.2.2': - resolution: {integrity: sha512-WcwOREz7+uOrpjUrKhOMaOKKmyPdtqF95HWX7SE0d9hhBB1KkfahxhaAex5U9Bn43LfINHlycLoYCNEtfeKm0g==} + '@volar/typescript@2.4.5': + resolution: {integrity: sha512-mcT1mHvLljAEtHviVcBuOyAwwMKz1ibXTi5uYtP/pf4XxoAzpdkQ+Br2IC0NPCvLCbjPZmbf3I0udndkfB1CDg==} '@vscode/emmet-helper@2.9.3': resolution: {integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==} - '@vscode/l10n@0.0.16': - resolution: {integrity: sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==} - '@vscode/l10n@0.0.18': resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + '@wagmi/cli@2.1.15': + resolution: {integrity: sha512-mtTxbuCDRRSd/2tPAklM+4vFOq5E/0zS5OfLE3Ax2KcUWciOnjLJ0m6BAQ6HzqY9YfWo8DXa7UqxzUBkvPYltg==} + hasBin: true + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + '@wagmi/cli@2.1.4': resolution: {integrity: sha512-vamvEo/GeBjFxb5oZCvby4YZDOrK/RqD+tcWb5X0pqmJDyWbN2Mkv9DYTtVB+OtfVUzFKciN/8Vhw8luMtOJbw==} hasBin: true @@ -4737,37 +5414,50 @@ packages: typescript: optional: true - '@wagmi/cli@2.1.8': - resolution: {integrity: sha512-607a+1ZjeIThHpENuIUJkeFjyRroai4H5TcW8jBJPfKqkWTFRah1Co7h9eOfIZzLd9FyWK+YOHH1PL+Jea8Alg==} - hasBin: true + '@wagmi/connectors@4.1.18': + resolution: {integrity: sha512-K/iLH/Z8jwvgPAYESU/uCQtQBvcIR1Jrqk+t2uCDSxew/tYtkOo2yOjtaPuOb+xJ5OrMGg+0tVHhGChYXry9Ow==} + peerDependencies: + '@wagmi/core': 2.6.9 + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + '@wagmi/connectors@4.3.10': + resolution: {integrity: sha512-IZcsocBfDq6pe8sxkDgP2k9YNqv8udl2eSr2hx2JCESA44ixx5zRjoGNMAkKxlzM6uXjXLJKp/g1KYlpmoHkDg==} peerDependencies: + '@wagmi/core': 2.9.8 typescript: '>=5.0.4' + viem: 2.x peerDependenciesMeta: typescript: optional: true - '@wagmi/connectors@4.3.5': - resolution: {integrity: sha512-6olw6H4Zlp9H6WQeKJv0pJHUYbq2ckXc/57qOKhruvksuXde94gY34nUDZUNRKRTiYlXiUVtwJK7OP0/on7bGw==} + '@wagmi/connectors@5.1.10': + resolution: {integrity: sha512-ybgKV09PIhgUgQ4atXTs2KOy4Hevd6f972SXfx6HTgsnFXlzxzN6o0aWjhavZOYjvx5tjuL3+8Mgqo0R7uP5Cg==} peerDependencies: - '@wagmi/core': 2.9.3 + '@wagmi/core': 2.13.5 typescript: '>=5.0.4' viem: 2.x peerDependenciesMeta: typescript: optional: true - '@wagmi/connectors@5.0.6': - resolution: {integrity: sha512-eyn2pw9QBKfvNOVZis72GqZw4neo7Ktut7Jt4NSiR/umncWJKpKrni3exLHAJw2+mDTDWtUTHs9YL56ov2tWLw==} + '@wagmi/core@2.10.2': + resolution: {integrity: sha512-SfQ1F7Azjlx4cKGfmg9+GEUGbukCxraoLYZyCUgTLpKw2OY+4sHsPRwHQENQt/YRWKMyG3/byEYRna2Kv1anpw==} peerDependencies: - '@wagmi/core': 2.10.4 + '@tanstack/query-core': '>=5.0.0' typescript: '>=5.0.4' viem: 2.x peerDependenciesMeta: + '@tanstack/query-core': + optional: true typescript: optional: true - '@wagmi/core@2.10.4': - resolution: {integrity: sha512-X/PW4zckkSQ/y4LwkQ5cwLKv551I6kVorH3VsTQghxYt0Vj9K5/XhCCRQg5Q200u6fiUCJ+2WjpmhZu3XYNU9w==} + '@wagmi/core@2.13.5': + resolution: {integrity: sha512-lvX/hApJTSA/H2kOklokjIYiUpnT8CpBH80GeOiKxU0CGK1wNHTu20GRTCy0GF1t7jkNwPSG3m0SmnXmgYMmHw==} peerDependencies: '@tanstack/query-core': '>=5.0.0' typescript: '>=5.0.4' @@ -4778,8 +5468,8 @@ packages: typescript: optional: true - '@wagmi/core@2.9.3': - resolution: {integrity: sha512-Mbhbmyz0wLbAOkjNoUoSJ0nI43sHz6/NyxTuzQ+g4ZMz9dAlMq5qNNqecfyaeXfOvSKuahlWu/frTIz8+jMgsw==} + '@wagmi/core@2.8.0': + resolution: {integrity: sha512-u0CWfbpdv2T3jE1yZQPwxvLlUVMymMoy73g6UE4XYNilF+EjdYu43EjWNvvB9lJcfSyYk6/VdKNHxJ2G+iBxYw==} peerDependencies: '@tanstack/query-core': '>=5.0.0' typescript: '>=5.0.4' @@ -4790,15 +5480,34 @@ packages: typescript: optional: true + '@walletconnect/core@2.11.2': + resolution: {integrity: sha512-bB4SiXX8hX3/hyBfVPC5gwZCXCl+OPj+/EDVM71iAO3TDsh78KPbrVAbDnnsbHzZVHlsMohtXX3j5XVsheN3+g==} + + '@walletconnect/core@2.12.2': + resolution: {integrity: sha512-7Adv/b3pp9F42BkvReaaM4KS8NEvlkS7AMtwO3uF/o6aRMKtcfTJq9/jgWdKJh4RP8pPRTRFjCw6XQ/RZtT4aQ==} + '@walletconnect/core@2.13.0': resolution: {integrity: sha512-blDuZxQenjeXcVJvHxPznTNl6c/2DO4VNrFnus+qHmO6OtT5lZRowdMtlCaCNb1q0OxzgrmBDcTOCbFcCpio/g==} + '@walletconnect/core@2.16.1': + resolution: {integrity: sha512-UlsnEMT5wwFvmxEjX8s4oju7R3zadxNbZgsFeHEsjh7uknY2zgmUe1Lfc5XU6zyPb1Jx7Nqpdx1KN485ee8ogw==} + engines: {node: '>=18'} + '@walletconnect/environment@1.0.1': resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + '@walletconnect/ethereum-provider@2.11.2': + resolution: {integrity: sha512-BUDqee0Uy2rCZVkW5Ao3q6Ado/3fePYnFdryVF+YL6bPhj+xQZ5OfKodl+uvs7Rwq++O5wTX2RqOTzpW7+v+Mg==} + + '@walletconnect/ethereum-provider@2.12.2': + resolution: {integrity: sha512-vBl2zCnNm2iPaomJdr5YT16cT7aa8cH2WFs6879XPngU5i7HXS3bU6TamhyhKKl13sdIfifmCkCC+RWn5GdPMw==} + '@walletconnect/ethereum-provider@2.13.0': resolution: {integrity: sha512-dnpW8mmLpWl1AZUYGYZpaAfGw1HFkL0WSlhk5xekx3IJJKn4pLacX2QeIOo0iNkzNQxZfux1AK4Grl1DvtzZEA==} + '@walletconnect/ethereum-provider@2.16.1': + resolution: {integrity: sha512-oD7DNCssUX3plS5gGUZ9JQ63muQB/vxO68X6RzD2wd8gBsYtSPw4BqYFc7KTO6dUizD6gfPirw32yW2pTvy92w==} + '@walletconnect/events@1.0.1': resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} @@ -4808,9 +5517,15 @@ packages: '@walletconnect/heartbeat@1.2.2': resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} + '@walletconnect/jsonrpc-http-connection@1.0.7': + resolution: {integrity: sha512-qlfh8fCfu8LOM9JRR9KE0s0wxP6ZG9/Jom8M0qsoIQeKF3Ni0FyV4V1qy/cc7nfI46SLQLSl4tgWSfLiE1swyQ==} + '@walletconnect/jsonrpc-http-connection@1.0.8': resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} + '@walletconnect/jsonrpc-provider@1.0.13': + resolution: {integrity: sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g==} + '@walletconnect/jsonrpc-provider@1.0.14': resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} @@ -4849,56 +5564,101 @@ packages: '@walletconnect/relay-api@1.0.10': resolution: {integrity: sha512-tqrdd4zU9VBNqUaXXQASaexklv6A54yEyQQEXYOCr+Jz8Ket0dmPBDyg19LVSNUN2cipAghQc45/KVmfFJ0cYw==} + '@walletconnect/relay-api@1.0.11': + resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} + + '@walletconnect/relay-api@1.0.9': + resolution: {integrity: sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg==} + '@walletconnect/relay-auth@1.0.4': resolution: {integrity: sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==} '@walletconnect/safe-json@1.0.2': resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + '@walletconnect/sign-client@2.11.2': + resolution: {integrity: sha512-MfBcuSz2GmMH+P7MrCP46mVE5qhP0ZyWA0FyIH6/WuxQ6G+MgKsGfaITqakpRPsykWOJq8tXMs3XvUPDU413OQ==} + + '@walletconnect/sign-client@2.12.2': + resolution: {integrity: sha512-cM0ualXj6nVvLqS4BDNRk+ZWR+lubcsz/IHreH+3wYrQ2sV+C0fN6ctrd7MMGZss0C0qacWCx0pm62ZBuoKvqA==} + '@walletconnect/sign-client@2.13.0': resolution: {integrity: sha512-En7KSvNUlQFx20IsYGsFgkNJ2lpvDvRsSFOT5PTdGskwCkUfOpB33SQJ6nCrN19gyoKPNvWg80Cy6MJI0TjNYA==} + '@walletconnect/sign-client@2.16.1': + resolution: {integrity: sha512-s2Tx2n2duxt+sHtuWXrN9yZVaHaYqcEcjwlTD+55/vs5NUPlISf+fFmZLwSeX1kUlrSBrAuxPUcqQuRTKcjLOA==} + '@walletconnect/time@1.0.2': resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + '@walletconnect/types@2.11.2': + resolution: {integrity: sha512-p632MFB+lJbip2cvtXPBQslpUdiw1sDtQ5y855bOlAGquay+6fZ4h1DcDePeKQDQM3P77ax2a9aNPZxV6y/h1Q==} + '@walletconnect/types@2.12.0': resolution: {integrity: sha512-uhB3waGmujQVJcPgJvGOpB8RalgYSBT+HpmVbfl4Qe0xJyqpRUo4bPjQa0UYkrHaW20xIw94OuP4+FMLYdeemg==} + '@walletconnect/types@2.12.2': + resolution: {integrity: sha512-9CmwTlPbrFTzayTL9q7xM7s3KTJkS6kYFtH2m1/fHFgALs6pIUjf1qAx1TF2E4tv7SEzLAIzU4NqgYUt2vWXTg==} + '@walletconnect/types@2.13.0': resolution: {integrity: sha512-MWaVT0FkZwzYbD3tvk8F+2qpPlz1LUSWHuqbINUtMXnSzJtXN49Y99fR7FuBhNFtDalfuWsEK17GrNA+KnAsPQ==} + '@walletconnect/types@2.16.1': + resolution: {integrity: sha512-9P4RG4VoDEF+yBF/n2TF12gsvT/aTaeZTVDb/AOayafqiPnmrQZMKmNCJJjq1sfdsDcHXFcZWMGsuCeSJCmrXA==} + + '@walletconnect/universal-provider@2.11.2': + resolution: {integrity: sha512-cNtIn5AVoDxKAJ4PmB8m5adnf5mYQMUamEUPKMVvOPscfGtIMQEh9peKsh2AN5xcRVDbgluC01Id545evFyymw==} + + '@walletconnect/universal-provider@2.12.2': + resolution: {integrity: sha512-0k5ZgSkABopQLVhkiwl2gRGG7dAP4SWiI915pIlyN5sRvWV+qX1ALhWAmRcdv0TXWlKHDcDgPJw/q2sCSAHuMQ==} + '@walletconnect/universal-provider@2.13.0': resolution: {integrity: sha512-B5QvO8pnk5Bqn4aIt0OukGEQn2Auk9VbHfhQb9cGwgmSCd1GlprX/Qblu4gyT5+TjHMb1Gz5UssUaZWTWbDhBg==} + '@walletconnect/universal-provider@2.16.1': + resolution: {integrity: sha512-q/tyWUVNenizuClEiaekx9FZj/STU1F3wpDK4PUIh3xh+OmUI5fw2dY3MaNDjyb5AyrS0M8BuQDeuoSuOR/Q7w==} + + '@walletconnect/utils@2.11.2': + resolution: {integrity: sha512-LyfdmrnZY6dWqlF4eDrx5jpUwsB2bEPjoqR5Z6rXPiHJKUOdJt7az+mNOn5KTSOlRpd1DmozrBrWr+G9fFLYVw==} + '@walletconnect/utils@2.12.0': resolution: {integrity: sha512-GIpfHUe1Bjp1Tjda0SkJEizKOT2biuv7VPFnKsOLT1T+8QxEP9NruC+K2UUEvijS1Qr/LKH9P5004RYNgrch+w==} + '@walletconnect/utils@2.12.2': + resolution: {integrity: sha512-zf50HeS3SfoLv1N9GPl2IXTZ9TsXfet4usVAsZmX9P6/Xzq7d/7QakjVQCHH/Wk1O9XkcsfeoZoUhRxoMJ5uJw==} + '@walletconnect/utils@2.13.0': resolution: {integrity: sha512-q1eDCsRHj5iLe7fF8RroGoPZpdo2CYMZzQSrw1iqL+2+GOeqapxxuJ1vaJkmDUkwgklfB22ufqG6KQnz78sD4w==} + '@walletconnect/utils@2.16.1': + resolution: {integrity: sha512-aoQirVoDoiiEtYeYDtNtQxFzwO/oCrz9zqeEEXYJaAwXlGVTS34KFe7W3/Rxd/pldTYKFOZsku2EzpISfH8Wsw==} + '@walletconnect/window-getters@1.0.1': resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} '@walletconnect/window-metadata@1.0.1': resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} - '@web3modal/common@4.1.11': - resolution: {integrity: sha512-zcoaixcI3dLC/D0QlhpT8MNCd717O1/3r1AemC5/9Wbk2F+YKXkzJZHmWlXoTvlTw9DH07rJzs9YTPxFyn855w==} + '@web3modal/common@4.2.3': + resolution: {integrity: sha512-n0lvhoRjViqxmkgpy+iEM6E3HBylUgdxUDJU4hUxGmmrbGZGEP7USBRnQOEgXLqLCtWvxKjUAO33JBV/De+Osw==} - '@web3modal/common@4.2.2': - resolution: {integrity: sha512-FDTSfI8geY2x0or7h9fjNCKJ+9sxzXx1wjTa6iMqLNQB2Kkot8pz+IfHE9tdyHY5946WQ4YtowecmoKTjECzFw==} + '@web3modal/common@4.2.3': + resolution: {integrity: sha512-n0lvhoRjViqxmkgpy+iEM6E3HBylUgdxUDJU4hUxGmmrbGZGEP7USBRnQOEgXLqLCtWvxKjUAO33JBV/De+Osw==} - '@web3modal/core@4.1.11': - resolution: {integrity: sha512-e475IIWywEtgH1CCB2Pl1C/wgPu0NzAvtTMOPSGNoHsw1ID2n6j/o4CURQb2HJjOoYQjTKKVkzXa44vFh2p9xw==} + '@web3modal/common@5.1.8': + resolution: {integrity: sha512-W3tvTQ5FPauFjDSRIx3H6SurzzDHPeN3q7cMaxuOZb3Scf76vMkz9Af970Q44Jmlz1PGDKZzhEsmOzw6LJF+CA==} - '@web3modal/core@4.2.2': - resolution: {integrity: sha512-O78tam38fQxELAnUL+eUAabkG1RZGBM680cqsG7OpRz2pUwtL4+2DTvsbNj071/wXm9VX7PNY2CyGErPSBvstQ==} + '@web3modal/polyfills@4.2.3': + resolution: {integrity: sha512-RiGxh2hMLSD1s2aTjoejNK/UL377CJhGf5tzmdF1m5xsYHpil+Dnulpio8Yojnm27cOqQD+QiaYUKnHOxErLjQ==} + + '@web3modal/core@4.2.3': + resolution: {integrity: sha512-UykKZTELBpb6ey+IV6fkHWsLkjrIdILmRYzhlznyTPbm9qX5pOR9tH0Z3QGUo7YPFmUqMRH1tC9Irsr3SgIbbw==} '@web3modal/polyfills@4.1.11': resolution: {integrity: sha512-+aMmjGrLCKLo4gVAdWgFdOX2ZjExciSLw/YlZ01wLO8Yj3bZbCZ7sjBc9xndHOVMK0QyUzBtpCOpYMJzi+59jg==} - '@web3modal/polyfills@4.2.2': - resolution: {integrity: sha512-fNqK/ybaiQwkcg38LMnBgpz+ZHIK/8xGxZ+f7ny21jFX4ttByT8T8xLwfubUoZRfNDPo320+cji7DcMQyvaCEw==} + '@web3modal/polyfills@4.2.3': + resolution: {integrity: sha512-RiGxh2hMLSD1s2aTjoejNK/UL377CJhGf5tzmdF1m5xsYHpil+Dnulpio8Yojnm27cOqQD+QiaYUKnHOxErLjQ==} '@web3modal/scaffold-react@4.1.11': resolution: {integrity: sha512-vouJHj77ZNKvR/Uyb3Hfc2UFSA4ZrrHmA0vbioCbgIh+V1rYT5XcAZDEu4AAo1qJ5NBRU1pkClVwAmQuWGY43w==} @@ -4911,8 +5671,8 @@ packages: react-dom: optional: true - '@web3modal/scaffold-react@4.2.2': - resolution: {integrity: sha512-OEJvKWz7+W8VThB7an4D/Pta31thkvBQi/1kYG541sEA3xdjiR8dB0fpFgf+ImT1bcPs6XCTM3yPKqXsrN5PaA==} + '@web3modal/scaffold-react@4.2.3': + resolution: {integrity: sha512-WRA244mO3qa9wnJtRa+mfXHkfW92VEkEt+HagLQuUcSRTQJH0Q95UF+EXZZ/r1mKbqdqIbpguewuF0dRtL/YrQ==} peerDependencies: react: '>=17' react-dom: '>=17' @@ -4925,8 +5685,8 @@ packages: '@web3modal/scaffold-utils@4.1.11': resolution: {integrity: sha512-nsS9yK5tp1N/VfecLLPc8H/dGJCzn0jElWjRS92VfGPhOSiEh5PIrPyCl9o6wUZsp4fH1YUsoSY2EFpPsuCWgw==} - '@web3modal/scaffold-utils@4.2.2': - resolution: {integrity: sha512-gK8tzFv0KW0VEz9DB7QnMQGt5BsW3n8EzNX3YrWOk3x8jSmq087VyGFaoQCKxXNyrHWzbehvjpppLxqtsMUk3A==} + '@web3modal/scaffold-utils@4.2.3': + resolution: {integrity: sha512-z6t0ggYg1/8hpaKHUm77z2VyacjIZEZTI8IHSQYmHuRFGu5oDPJeAr1thr475JXdoGLYr08hwquZyed/ZINAvw==} '@web3modal/scaffold-vue@4.1.11': resolution: {integrity: sha512-PmIfD2TlKkZZa6V0sqwDtZ7t62BEk5JjCHd380QaZwGTbPEwS99leTWLKBTaxAPShK2p7+aj2Txss63wIXLRFg==} @@ -4936,31 +5696,31 @@ packages: vue: optional: true - '@web3modal/scaffold-vue@4.2.2': - resolution: {integrity: sha512-oaxOyaG5enjodIp/FNyodIPiFa3yiB4ptQrRfNX5opv6z2HUKDiu4jM3BRLwys2ncgLSflhDGfx3QQZZqNR8Hg==} + '@web3modal/scaffold-vue@4.2.3': + resolution: {integrity: sha512-0mlx/t0A7srcuFcxP3xuUt2ACFUUcAhyRIsNImtQHPq7QHx7i5zvabQ38iplDsWS0TA7j83hW5gxHycppa5PXg==} peerDependencies: vue: '>=3' peerDependenciesMeta: vue: optional: true - '@web3modal/scaffold@4.1.11': - resolution: {integrity: sha512-n8bP3cJNQxV8OD3s8bSj8QDbZvjn8a1Ui81jo2a3rIxOUAlD/cKRM8ivmNxiUdBMae8GP5CLiWtkIptmSLw40Q==} + '@web3modal/siwe@4.2.3': + resolution: {integrity: sha512-uPma0U/OxAy3LwnF7pCYYX8tn+ONBYNcssuVZxEGsusJD1kF4ueS8lK7eyQogyK5nXqOGdNESOjY1NImNNjMVw==} - '@web3modal/scaffold@4.2.2': - resolution: {integrity: sha512-lpomW3Ypk+eaDNdwmUD0MFDNGiS4WEO8euN9q/pvuJkhnm5jzpr3sYiub4pU+WgZmZIJLRWUuiSeKdUDJSrlRg==} + '@web3modal/scaffold@4.2.3': + resolution: {integrity: sha512-8K+IV+luDUvppKgmlgdA+RbQGT2STdRrgHVHFRsAqsORFoLiIYvlrpQlxvV7J5Xc1bgKEn3KvEXC+BH2NMqF4w==} '@web3modal/siwe@4.1.11': resolution: {integrity: sha512-gndcNA351mkAR0wUsO4dLS9CbpcFo+AQ2CUXF0Jx83DwaBStCVsX3yllfnYKh/gpVetF3B48mRUt9TTTJJ79dA==} - '@web3modal/siwe@4.2.2': - resolution: {integrity: sha512-9Pei6E5nG9/FeNuPh8Sj0zic9hc8K1PeMlK3wTTOOskOtlW4zCbdJ3GnsaDIwqrJDI8z5aG96JoRbC1rwInGtQ==} + '@web3modal/siwe@4.2.3': + resolution: {integrity: sha512-uPma0U/OxAy3LwnF7pCYYX8tn+ONBYNcssuVZxEGsusJD1kF4ueS8lK7eyQogyK5nXqOGdNESOjY1NImNNjMVw==} '@web3modal/ui@4.1.11': resolution: {integrity: sha512-lentHZvUpNjVasvNI8/jrVPIAV1M5zJKZ4Q4AeYwUJdEtlRon1uq10MRylmvlZAjWb98U130uJy245Fz87Th/w==} - '@web3modal/ui@4.2.2': - resolution: {integrity: sha512-SlEGUSI5jq9cbo5w49KflQnAt0bDl5pWOg6Ax+d+6EOOjLrWl5giUAk+PX9qwV6YVVviBzUlzgofuTt2Z1ZXhw==} + '@web3modal/ui@4.2.3': + resolution: {integrity: sha512-QPPgE0hii1gpAldTdnrP63D/ryI78Ohz99zRBp8vi81lawot7rbdUbryMoX13hMPCW9vW7JYyvX+jJN7uO3QwA==} '@web3modal/wagmi@4.1.11': resolution: {integrity: sha512-VoXV9idD0yV7jx0F2Xk722VXqQNCDKqDc+LR8WsuOU64TiTLJx9UDQpNcoigbC3bYCi/4Cpw41iSGgs7utbgyQ==} @@ -4979,8 +5739,8 @@ packages: vue: optional: true - '@web3modal/wagmi@4.2.2': - resolution: {integrity: sha512-jjlLu+LAMap3vsgE37Ma7wydQgbjtHJSO+dR+yrXO8PzBFoXoZuppl5elj74NQtdiyCtzeiNe+81zCy+S+wLYQ==} + '@web3modal/wagmi@4.2.3': + resolution: {integrity: sha512-oisBCMrOYn8TBgNaSPrumvMmTGox6+3Ii92zxQJalW5U/K9iBTxoejHT033Ss7mFEFybilcfXBAvGNFXfQmtkA==} peerDependencies: '@wagmi/connectors': '>=4' '@wagmi/core': '>=2.0.0' @@ -4999,55 +5759,41 @@ packages: '@web3modal/wallet@4.1.11': resolution: {integrity: sha512-6eJSpNcrBxufJFEQu9+ZOMUZxPqa8438RvfYKCU9nLXwoBtweo6ecpQw2yhXDlrfG+uJZhFabtPxROabn2M8Kg==} - '@web3modal/wallet@4.2.2': - resolution: {integrity: sha512-ZkEWeXzbGWUGLFP+uPtdkG4OdiGgdVL9lLCWWVZlq7NZpZdTSc8+kmgdH71qvfNbt+yr7do1KVsQQcQfF6jXhw==} + '@web3modal/wallet@4.2.3': + resolution: {integrity: sha512-V+VpwmhQl9qeJMpzNkjpAaxercAsrr1O9oGRjrjD+c0q72NfdcbTalWSbjSQmqabI1M6N06Hw94FkAQuEfVGsg==} '@webgpu/types@0.1.21': resolution: {integrity: sha512-pUrWq3V5PiSGFLeLxoGqReTZmiiXwY3jRkIG5sLLKjyqNxrwm/04b4nw7LSmGWJcKk59XOM/YRTUwOzo4MMlow==} - '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15': - resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} - engines: {node: '>=14.15.0'} - peerDependencies: - esbuild: '>=0.10.0' - - '@yarnpkg/fslib@2.10.3': - resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - - '@yarnpkg/libzip@2.3.0': - resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - '@zerodevx/svelte-toast@0.9.5': resolution: {integrity: sha512-JLeB/oRdJfT+dz9A5bgd3Z7TuQnBQbeUtXrGIrNWMGqWbabpepBF2KxtWVhL2qtxpRqhae2f6NAOzH7xs4jUSw==} peerDependencies: svelte: ^3.57.0 || ^4.0.0 - abitype@0.9.10: - resolution: {integrity: sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==} + abitype@0.9.8: + resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} peerDependencies: typescript: '>=5.0.4' - zod: ^3 >=3.22.0 + zod: ^3 >=3.19.1 peerDependenciesMeta: typescript: optional: true zod: optional: true - abitype@0.9.8: - resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} + abitype@1.0.5: + resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} peerDependencies: typescript: '>=5.0.4' - zod: ^3 >=3.19.1 + zod: ^3 >=3.22.0 peerDependenciesMeta: typescript: optional: true zod: optional: true - abitype@1.0.0: - resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} + abitype@1.0.5: + resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} peerDependencies: typescript: '>=5.0.4' zod: ^3 >=3.22.0 @@ -5057,8 +5803,8 @@ packages: zod: optional: true - abitype@1.0.2: - resolution: {integrity: sha512-aFt4k2H+eiAKy/zxtnORa9iIb10BMBeWL18l8v4+QuwYEBXPxxjSB1bFZCzQmKPoj8m7j68K705l3uY+E2gAjg==} + abitype@1.0.6: + resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} peerDependencies: typescript: '>=5.0.4' zod: ^3 >=3.22.0 @@ -5072,6 +5818,9 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} + abortcontroller-polyfill@1.7.5: + resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -5081,29 +5830,37 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} engines: {node: '>=0.4.0'} hasBin: true - address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + adm-zip@0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: '>=0.3.0'} aes-js@3.0.0: resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} @@ -5116,8 +5873,11 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.13.0: - resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + amazon-cognito-identity-js@6.3.12: + resolution: {integrity: sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==} anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} @@ -5129,6 +5889,10 @@ 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-fragments@0.2.1: resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} @@ -5160,8 +5924,8 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - antlr4@4.13.1-patch-1: - resolution: {integrity: sha512-OjFLWWLzDMV9rdFhpvroCWR4ooktNg9/nvVYSA5z28wuVpU36QUNuioR1XLnQtcjVlf8npjyz593PxnU/f/Cow==} + antlr4@4.13.1: + resolution: {integrity: sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==} engines: {node: '>=16'} any-promise@1.3.0: @@ -5174,9 +5938,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - app-root-dir@1.0.2: - resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} - appdirsjs@1.2.7: resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} @@ -5192,25 +5953,17 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-hidden@1.2.4: - resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} - engines: {node: '>=10'} - - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} array-iterate@2.0.1: @@ -5220,8 +5973,8 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} array.prototype.flat@1.3.2: @@ -5232,19 +5985,27 @@ packages: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} engines: {node: '>= 0.4'} asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-parents@0.0.1: resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==} @@ -5268,19 +6029,19 @@ packages: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} hasBin: true - astro-expressive-code@0.35.3: - resolution: {integrity: sha512-f1L1m3J3EzZHDEox6TXmuKo5fTSbaNxE/HU0S0UQmvlCowtOKnU/LOsoDwsbQSYGKz+fdLRPsCjFMiKqEoyfcw==} + astro-expressive-code@0.35.6: + resolution: {integrity: sha512-1U4KrvFuodaCV3z4I1bIR16SdhQlPkolGsYTtiANxPZUVv/KitGSCTjzksrkPonn1XuwVqvnwmUUVzTLWngnBA==} peerDependencies: astro: ^4.0.0-beta || ^3.3.0 - astro-og-canvas@0.5.0: - resolution: {integrity: sha512-nrwZpFL9d6tVJRKV5OLZa3xSSh+Cbaaoay/R9jAgHCrJ79WNyN2rgRT/+wtP1O/bCQ+wVP3GC3mBQN7vogImvg==} + astro-og-canvas@0.5.1: + resolution: {integrity: sha512-Xm37vqyMu3kNRU5tm7nheJf2n8+gweuaDX4efMxPSKEggSF8UznvgreOomzAPqDbcs8LM2fQsyOcMbJFtb3aZg==} engines: {node: '>=18.14.1'} peerDependencies: astro: ^3.0.0 || ^4.0.0 - astro@4.8.3: - resolution: {integrity: sha512-pgIKopkmAUXY3EJHdG7zQpudtBzYAsd94A1R7jmLpH2LFZvzHEkAdHnunmSVmgikJCNqtEo3bUCHgLnCPQaN1g==} + astro@4.15.6: + resolution: {integrity: sha512-SWcUNwm8CiVRaIbh4w5byh62BNihpsovlCd4ElvC7cL/53D24HcI7AaGFsPrromCamQklwQmIan/QS7x/3lLuQ==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true @@ -5290,8 +6051,14 @@ packages: async-mutex@0.2.6: resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + + async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + + async@3.2.3: + resolution: {integrity: sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -5300,6 +6067,13 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + autoprefixer@10.4.18: + resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + autoprefixer@10.4.19: resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} engines: {node: ^10 || ^12 || >=14} @@ -5307,33 +6081,53 @@ packages: peerDependencies: postcss: ^8.1.0 - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - axios@1.6.8: - resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + axios-proxy-builder@0.1.2: + resolution: {integrity: sha512-6uBVsBZzkB3tCC8iyx59mCjQckhB8+GQrI9Cop8eC7ybIsvs/KtnNgEBfRMSEa7GqK2VBGUzgjNYMdPIfotyPA==} + + axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} axobject-query@4.0.0: resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + babel-core@7.0.0-bridge.0: resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: '@babel/core': ^7.0.0-0 - babel-plugin-polyfill-corejs2@0.4.11: - resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-polyfill-corejs2@0.4.8: + resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.10.4: - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + babel-plugin-polyfill-corejs3@0.9.0: + resolution: {integrity: sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.2: - resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + babel-plugin-polyfill-regenerator@0.5.5: + resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -5364,12 +6158,15 @@ packages: bcp-47@2.1.0: resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - better-opn@3.0.2: - resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} - engines: {node: '>=12.0.0'} + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} @@ -5378,8 +6175,8 @@ packages: bignumber.js@9.1.2: resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} bl@4.1.0: @@ -5391,8 +6188,11 @@ packages: blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} - blob-to-it@2.0.6: - resolution: {integrity: sha512-xveo/z3QNilIJgCZAjzvx2uWWVHE4JzOy7eMp45zkuBsmwZMgjfhn2h/+BsZPaByVFa3u1W/OBUleNiqgMtVpQ==} + blob-to-it@2.0.7: + resolution: {integrity: sha512-mFAR/GKDDqFOkSBB7shXfsUZwU5DgK453++I8/SImNacfJsdKlx/oHTO0T4ZYHz8A2dnSONE+CX8L29VlWGKiQ==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} bn.js@4.11.6: resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} @@ -5403,8 +6203,8 @@ packages: bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} boolbase@1.0.0: @@ -5413,6 +6213,10 @@ packages: bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + boxen@7.1.1: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} @@ -5427,8 +6231,12 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} brorand@1.1.0: @@ -5440,20 +6248,25 @@ packages: browser-readablestream-to-it@1.0.3: resolution: {integrity: sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==} - browser-readablestream-to-it@2.0.7: - resolution: {integrity: sha512-g1Aznml3HmqTLSXylZhGwdfnAa67+vlNAYhT9ROJZkAxY7yYmWusND10olvCMPe4sVhZyVwn5tPkRzOg85kBEg==} + browser-readablestream-to-it@2.0.6: + resolution: {integrity: sha512-csJm66U/gTC6VHjeaOaziK6Y6ENdrzlNLdXnsdnvGX+3hGvedkxTyiMk2WbgKR8F15ACxDLJhDuE/cmovLPBQQ==} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - browserify-zlib@0.1.4: - resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} @@ -5466,8 +6279,9 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -5475,9 +6289,15 @@ packages: buffer-reverse@1.0.1: resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} + buffer-to-arraybuffer@0.0.5: + resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} + buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + buffer@5.6.0: resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} @@ -5495,11 +6315,15 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - builtins@5.1.0: - resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} + builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} - bundle-require@4.1.0: - resolution: {integrity: sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==} + bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + + bundle-require@4.0.2: + resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.17' @@ -5516,6 +6340,14 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-lookup@6.1.0: + resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} + engines: {node: '>=10.6.0'} + cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} @@ -5524,6 +6356,10 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -5547,9 +6383,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -5566,8 +6399,14 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001617: - resolution: {integrity: sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==} + caniuse-lite@1.0.30001593: + resolution: {integrity: sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==} + + caniuse-lite@1.0.30001614: + resolution: {integrity: sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==} + + caniuse-lite@1.0.30001660: + resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} canvaskit-wasm@0.39.1: resolution: {integrity: sha512-Gy3lCmhUdKq+8bvDrs9t8+qf7RvcjuQn+we7vTVVyqgOVO1UVfHpsnBxkTZw+R4ApEJ3D5fKySl9TU11hmjl/A==} @@ -5575,6 +6414,9 @@ packages: capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + cborg@4.2.0: resolution: {integrity: sha512-q6cFW5m3KxfP/9xGI3yGLaC1l5DP6DWM9IvjiJojnIwohL5CQDl02EXViPV852mOfQo+7PJGPN01MI87vFGzyA==} hasBin: true @@ -5586,6 +6428,10 @@ packages: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -5602,8 +6448,11 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -5617,22 +6466,41 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.0: + resolution: {integrity: sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==} + engines: {node: '>= 14.16.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + chromatic@11.10.2: + resolution: {integrity: sha512-EbVlhmOLGdx9QRX3RMOTF3UzoyC1aaXNRjlzm1mc++2OI5+6C5Bzwt2ZUYJ3Jnf/pJa23q0y5Y3QEDcfRVqIbg==} + hasBin: true + peerDependencies: + '@chromatic-com/cypress': ^0.*.* || ^1.0.0 + '@chromatic-com/playwright': ^0.*.* || ^1.0.0 + peerDependenciesMeta: + '@chromatic-com/cypress': + optional: true + '@chromatic-com/playwright': + optional: true - chromatic@11.3.2: - resolution: {integrity: sha512-0PuHl49VvBMoDHEfmNjC/bim9YYNhWF3axTZlFuatC0avwr2Xw4GDqJDG9fArEWN8oM8VtYHkE9D7qc87dmz2w==} + chromatic@11.3.0: + resolution: {integrity: sha512-q1ZtJDJrjLGnz60ivpC16gmd7KFzcaA4eTb7gcytCqbaKqlHhCFr1xQmcUDsm14CK7JsqdkFU6S+JQdOd2ZNJg==} hasBin: true peerDependencies: '@chromatic-com/cypress': ^0.*.* || ^1.0.0 @@ -5648,6 +6516,9 @@ packages: engines: {node: '>=12.13.0'} hasBin: true + chromium-edge-launcher@1.0.0: + resolution: {integrity: sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==} + ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -5659,22 +6530,34 @@ packages: resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} engines: {node: '>=8'} + cids@0.7.5: + resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} + engines: {node: '>=4.0.0', npm: '>=3.0.0'} + deprecated: This module has been superseded by the multiformats module + cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + class-is@1.1.0: + resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} - cli-color@2.0.4: - resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} + cli-color@2.0.3: + resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} engines: {node: '>=0.10'} cli-cursor@3.1.0: @@ -5685,14 +6568,14 @@ packages: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cli-table3@0.6.5: - resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} - engines: {node: 10.* || >= 12.*} - clipboardy@4.0.0: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} @@ -5700,6 +6583,9 @@ packages: cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -5708,6 +6594,9 @@ packages: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -5720,6 +6609,10 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + code-block-writer@12.0.0: resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} @@ -5756,6 +6649,10 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + colors@1.0.3: + resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} + engines: {node: '>=0.1.90'} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -5777,10 +6674,6 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -5806,9 +6699,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -5820,43 +6710,61 @@ packages: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} - constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-hash@2.5.2: + resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - convert-csv-to-json@2.46.0: - resolution: {integrity: sha512-Q7PjRjhECa5nBUEGbsKXvB8YaygVUesF/sYnaoCPTWoiwJEDCbLd2CcFDE1y80Q347IaTQukCQSCP2fR5IW+5g==} + convert-csv-to-json@2.48.0: + resolution: {integrity: sha512-XkmztvCyY1qbUA1dlait7fmazAS0vDhYOzhMu90NPMvqBVY0/2GmAW1XzTzlKPpW5K/4ZaTKEO2Jb7e4saIQxg==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-es@1.1.0: - resolution: {integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==} + cookie-es@1.0.0: + resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} - core-js-compat@3.37.0: - resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + core-js-compat@3.36.0: + resolution: {integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + cosmiconfig@5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} engines: {node: '>=4'} + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -5886,17 +6794,15 @@ packages: cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - crossws@0.2.4: - resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} - peerDependencies: - uWebSockets.js: '*' - peerDependenciesMeta: - uWebSockets.js: - optional: true + crossws@0.1.1: + resolution: {integrity: sha512-c9c/o7bS3OjsdpSkvexpka0JNlesBF2JU9B2V1yNsYGwRbAafxhJQ7VI9b48D5bpONz/oxbPGMzBojy9sXoQIQ==} crypto-js@3.3.0: resolution: {integrity: sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==} @@ -5904,10 +6810,6 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - css-selector-parser@3.0.5: resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} @@ -5937,33 +6839,32 @@ packages: resolution: {integrity: sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} + cycle@1.0.3: + resolution: {integrity: sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==} + engines: {node: '>=0.4.0'} + + d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dag-jose@4.0.0: resolution: {integrity: sha512-tw595L3UYoOUT9dSJPbBEG/qpRpw24kRZxa5SLRnlnr+g5L7O8oEs1d3W5TiVA1oJZbthVsf0Vi3zFN66qcEBA==} + daisyui@4.10.1: + resolution: {integrity: sha512-Ds0Z0Fv+Xf6ZEqV4Q5JIOeKfg83xxnww0Lzid0V94vPtlQ0yYmucEa33zSctsX2VEgBALtmk5zVEqd59pnUbuQ==} + engines: {node: '>=16.9.0'} + daisyui@4.11.1: resolution: {integrity: sha512-obT9CUbQdW6eoHwSeT5VwaRrWlwrM4OT5qlfdJ0oQlSIEYhwnEl2+L2fwu5PioLbitwuMdYC2X8I1cyy8Pf6LQ==} engines: {node: '>=16.9.0'} + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} @@ -5971,9 +6872,6 @@ packages: dayjs@1.11.10: resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} - debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -5990,8 +6888,17 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -6003,6 +6910,10 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -6013,6 +6924,10 @@ packages: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} + decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -6023,13 +6938,13 @@ packages: dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} @@ -6046,6 +6961,10 @@ packages: resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} engines: {node: '>=12'} + default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -6061,6 +6980,10 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -6068,10 +6991,6 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - del@6.1.1: - resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} - engines: {node: '>=10'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -6079,10 +6998,18 @@ packages: denodeify@1.2.1: resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + deprecated-react-native-prop-types@5.0.0: + resolution: {integrity: sha512-cIK8KYiiGVOFsKdPMmm1L3tA/Gl+JopXL6F5+C7x39MyPsQYnP57Im/D6bNUzcborD7fcMwiwZqcBdBXXZucYQ==} + engines: {node: '>=18'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -6110,18 +7037,6 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - - detect-package-manager@2.0.1: - resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} - engines: {node: '>=12'} - - detect-port@1.6.1: - resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} - engines: {node: '>= 4.0.0'} - hasBin: true - deterministic-object-hash@2.0.2: resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} engines: {node: '>=18'} @@ -6185,6 +7100,9 @@ packages: dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -6199,9 +7117,6 @@ packages: domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dotenv-expand@10.0.0: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} @@ -6212,44 +7127,51 @@ packages: ds-test@https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0: resolution: {tarball: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0} + name: ds-test version: 1.0.0 dset@3.1.3: resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} engines: {node: '>=4'} - duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - - duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + duplexify@4.1.2: + resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + eciesjs@0.3.18: resolution: {integrity: sha512-RQhegEtLSyIiGJmFTZfvCTHER/fymipXFVx6OwSRYD6hOuy+6Kjpk0dGvIfP9kxn/smBpxQy71uxpGO406ITCw==} 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 + eigenlayer-contracts@https://codeload.github.com/Layr-labs/eigenlayer-contracts/tar.gz/30040aa273edeefe83333fa9183a0a26a84cebf0: + resolution: {tarball: https://codeload.github.com/Layr-labs/eigenlayer-contracts/tar.gz/30040aa273edeefe83333fa9183a0a26a84cebf0} + version: 1.0.0 + + eigenlayer-middleware@https://codeload.github.com/layr-Labs/eigenlayer-middleware/tar.gz/7d49b5181b09198ed275783453aa082bb3766990: + resolution: {tarball: https://codeload.github.com/layr-Labs/eigenlayer-middleware/tar.gz/7d49b5181b09198ed275783453aa082bb3766990} + version: 0.0.0 electron-fetch@1.9.1: resolution: {integrity: sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==} engines: {node: '>=6'} - electron-to-chromium@1.4.761: - resolution: {integrity: sha512-PIbxpiJGx6Bb8dQaonNc6CGTRlVntdLg/2nMa1YhnrwYOORY9a3ZgGN0UQYE6lAcj/lkyduJN7BPt/JiY+jAQQ==} + electron-to-chromium@1.4.676: + resolution: {integrity: sha512-uHt4FB8SeYdhcOsj2ix/C39S7sPSNFJpzShjxGOm1KdF4MHyGqGi389+T5cErsodsijojXilYaHIKKqJfqh7uQ==} + + electron-to-chromium@1.5.23: + resolution: {integrity: sha512-mBhODedOXg4v5QWwl21DjM5amzjmI1zw9EPrPK/5Wx7C8jt33bpZNrC7OhHUG3pxRtbLpr3W2dXT+Ph1SsfRZA==} elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - elliptic@6.5.5: - resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} + elliptic@6.5.7: + resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} emmet@2.4.7: resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==} @@ -6270,14 +7192,18 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - engine.io-client@6.5.3: - resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} + engine.io-client@6.5.4: + resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} engine.io-parser@5.2.2: resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} @@ -6294,8 +7220,12 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - envinfo@7.13.0: - resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envinfo@7.11.1: + resolution: {integrity: sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==} engines: {node: '>=4'} hasBin: true @@ -6312,8 +7242,8 @@ packages: resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} engines: {node: '>= 0.8'} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} engines: {node: '>= 0.4'} es-define-property@1.0.0: @@ -6324,18 +7254,14 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - - es-module-lexer@1.5.2: - resolution: {integrity: sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==} + es-module-lexer@1.5.3: + resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} es-shim-unscopables@1.0.2: @@ -6345,6 +7271,10 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + es5-ext@0.10.64: resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} engines: {node: '>=0.10'} @@ -6355,18 +7285,17 @@ packages: es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} - es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} es6-weak-map@2.0.3: resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - esbuild-plugin-alias@0.2.1: - resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} - - esbuild-register@3.5.0: - resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} peerDependencies: esbuild: '>=0.12 <1' @@ -6385,8 +7314,13 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.21.2: - resolution: {integrity: sha512-LmHPAa5h4tSxz+g/D8IHY6wCjtIiFx8I7/Q0Aq+NmvtoYvyMnJU0KQJcqB6QH30X9x/W4CemgUtPgQDZFca5SA==} + esbuild@0.21.3: + resolution: {integrity: sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true @@ -6413,6 +7347,12 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + eslint-compat-utils@0.1.2: + resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + eslint-compat-utils@0.5.0: resolution: {integrity: sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==} engines: {node: '>=12'} @@ -6437,8 +7377,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + eslint-module-utils@2.8.0: + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -6458,8 +7398,8 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-es-x@7.6.0: - resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} + eslint-plugin-es-x@7.5.0: + resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' @@ -6470,8 +7410,8 @@ packages: peerDependencies: eslint: '>=4.19.1' - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + eslint-plugin-import@2.29.0: + resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -6506,14 +7446,14 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-promise@6.1.1: - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + eslint-plugin-promise@6.4.0: + resolution: {integrity: sha512-/KWWRaD3fGkVCZsdR0RU53PSthFmoHVhZl+y9+6DqeDLSikLdlUVpVEAmI6iCRR5QyOjBYBqHZV/bdv4DJ4Gtw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-simple-import-sort@12.1.0: - resolution: {integrity: sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig==} + eslint-plugin-simple-import-sort@12.0.0: + resolution: {integrity: sha512-8o0dVEdAkYap0Cn5kNeklaKcT1nUsa3LITWEuFk3nJifOoD+5JQGoyDUW2W/iPWwBsNBJpyJS9y4je/BgxLcyQ==} peerDependencies: eslint: '>=5.0.0' @@ -6523,12 +7463,12 @@ packages: peerDependencies: eslint: '>=6' - eslint-plugin-svelte@2.38.0: - resolution: {integrity: sha512-IwwxhHzitx3dr0/xo0z4jjDlb2AAHBPKt+juMyKKGTLlKi1rZfA4qixMwnveU20/JTHyipM6keX4Vr7LZFYc9g==} + eslint-plugin-svelte@2.41.0: + resolution: {integrity: sha512-gjU9Q/psxbWG1VNwYbEb0Q6U4W5PBGaDpYmO2zlQ+zlAMVS3Qt0luAK0ACi/tMSwRK6JENiySvMyJbO0YWmXSg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.112 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.155 peerDependenciesMeta: svelte: optional: true @@ -6568,8 +7508,13 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + eslint@8.55.0: + resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true @@ -6642,10 +7587,19 @@ packages: resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} engines: {node: '>=14.0.0'} + eth-ens-namehash@2.0.8: + resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} + eth-json-rpc-filters@6.0.1: resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} engines: {node: '>=14.0.0'} + eth-lib@0.1.29: + resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} + + eth-lib@0.2.8: + resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} + eth-query@2.1.2: resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} @@ -6656,8 +7610,8 @@ packages: resolution: {integrity: sha512-3Vwr2CikFLezh/zLAPBV6C51jC0fFnf6vjhkoIWsDms/W5MLgAZNhh9nZUxPmg899K8cVFbklrYQBxcD4JmfrA==} engines: {node: '>= 4.3.0', npm: '>= 3.7.0'} - ethereum-bloom-filters@1.1.0: - resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==} + ethereum-bloom-filters@1.0.10: + resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} ethereum-cryptography@0.1.3: resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} @@ -6665,8 +7619,15 @@ packages: ethereum-cryptography@1.2.0: resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} - ethereum-cryptography@2.1.3: - resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + + ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + deprecated: This library has been deprecated and usage is discouraged. + + ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} ethereumjs-util@7.1.5: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} @@ -6675,10 +7636,18 @@ packages: ethers@5.7.2: resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + ethers@6.13.2: + resolution: {integrity: sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==} + engines: {node: '>=14.0.0'} + ethjs-unit@0.1.6: resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} engines: {node: '>=6.5.0', npm: '>=3'} + ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} @@ -6689,6 +7658,9 @@ packages: eventemitter2@6.4.9: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + eventemitter3@4.0.4: + resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -6703,6 +7675,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -6711,12 +7687,12 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + express@4.21.0: + resolution: {integrity: sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==} engines: {node: '>= 0.10.0'} - expressive-code@0.35.3: - resolution: {integrity: sha512-XjWWUCxS4uQjPoRM98R7SNWWIYlFEaOeHm1piWv+c7coHCekuWno81thsc3g/UJ+DajNtOEsIQIAAcsBQZ8LMg==} + expressive-code@0.35.6: + resolution: {integrity: sha512-+mx+TPTbMqgo0mL92Xh9QgjW0kSQIsEivMgEcOnaqKqL7qCw8Vkqc5Rg/di7ZYw4aMUSr74VTc+w8GQWu05j1g==} ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} @@ -6728,10 +7704,35 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + extension-port-stream@2.1.1: + resolution: {integrity: sha512-qknp5o5rj2J9CRKfVB8KJr+uXQlrojNZzdESUPhKYLXf97TPcGf6qWWKmpsNNtUyOdzFhab1ON0jzouNxHHvow==} + engines: {node: '>=12.0.0'} + extension-port-stream@3.0.0: resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} engines: {node: '>=12.0.0'} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + + fast-base64-decode@1.0.0: + resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} + + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -6751,8 +7752,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} engines: {node: '>=6'} fast-safe-stringify@2.1.1: @@ -6762,8 +7763,8 @@ packages: resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} hasBin: true - fast-xml-parser@4.3.6: - resolution: {integrity: sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==} + fast-xml-parser@4.3.4: + resolution: {integrity: sha512-utnwm92SyozgA3hhH2I8qldf2lBqm6qHOICawRNRFu1qMe3+oqr+GcXjGqTmXTMGE5T4eC03kr/rlh5C1IRdZA==} hasBin: true fastparse@1.1.2: @@ -6775,25 +7776,28 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fetch-retry@5.0.6: - resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} + fdir@6.3.0: + resolution: {integrity: sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} - file-system-cache@2.3.0: - resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} - - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - filesize@10.1.1: resolution: {integrity: sha512-L0cdwZrKlwZQkMSFnCflJ6J2Y+5egO/p3vgRSDQGxQt++QbUZe5gMbRO6kg6gzwQDPvq2Fk9AmoxUNfZ5gdqaQ==} engines: {node: '>= 10.4.0'} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} filter-obj@1.1.0: @@ -6804,8 +7808,8 @@ packages: resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} engines: {node: '>= 0.8'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} find-cache-dir@2.1.0: @@ -6816,6 +7820,17 @@ packages: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -6843,8 +7858,12 @@ packages: resolution: {integrity: sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==} hasBin: true - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} @@ -6853,12 +7872,21 @@ packages: flow-enums-runtime@0.0.6: resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} - flow-parser@0.235.1: - resolution: {integrity: sha512-s04193L4JE+ntEcQXbD6jxRRlyj9QXcgEl2W6xSjH4l9x4b0eHoCHfbYHjqf9LdZFUiM5LhgpiqsvLj/AyOyYQ==} + flow-parser@0.206.0: + resolution: {integrity: sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==} engines: {node: '>=0.4.0'} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -6869,22 +7897,33 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3: resolution: {tarball: https://codeload.github.com/foundry-rs/forge-std/tar.gz/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3} + name: forge-std version: 1.7.5 - forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/52715a217dc51d0de15877878ab8213f6cbbbab5: - resolution: {tarball: https://codeload.github.com/foundry-rs/forge-std/tar.gz/52715a217dc51d0de15877878ab8213f6cbbbab5} - version: 1.8.2 + forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/8f24d6b04c92975e0795b5868aa0d783251cdeaa: + resolution: {tarball: https://codeload.github.com/foundry-rs/forge-std/tar.gz/8f24d6b04c92975e0795b5868aa0d783251cdeaa} + version: 1.9.3 + + form-data-encoder@1.7.1: + resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -6893,6 +7932,9 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -6900,24 +7942,23 @@ 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.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} + fs-extra@4.0.3: + resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -6971,17 +8012,13 @@ packages: get-iterator@1.0.2: resolution: {integrity: sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==} - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - - get-npm-tarball-url@2.1.0: - resolution: {integrity: sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==} - engines: {node: '>=12.17'} - get-port-please@3.1.2: resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -6990,16 +8027,15 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.4: - resolution: {integrity: sha512-ofbkKj+0pjXjhejr007J/fLf+sW+8H7K5GCm+msC8q3IpvgjobpyPqSRFemNyIMxklC0zeJpi7VDFna19FacvQ==} + get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} - giget@1.2.3: - resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} - hasBin: true + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -7012,31 +8048,46 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + + glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + deprecated: Glob versions prior to v9 are no longer supported + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} globalyzer@0.1.0: @@ -7050,16 +8101,20 @@ packages: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - globby@14.0.1: - resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} - engines: {node: '>=18'} - globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + got@12.1.0: + resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} + engines: {node: '>=14.16'} + got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} @@ -7080,18 +8135,35 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} - gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true - - h3@1.11.1: - resolution: {integrity: sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==} + h3@1.10.2: + resolution: {integrity: sha512-r1iNNcFGL4G9pL3lgYxwX0O2ZmqdKqhILAJsnlw5icn5I1QHnADM4TgVdYRtHUqy+NntVpHIEFwnw/XCbebICg==} handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} hasBin: true + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + hardhat@2.22.13: + resolution: {integrity: sha512-psVJX4FSXDpSXwsU8OcKTJN04pQEj9cFBMX5OPko+OFwbIoiOpvRmafa954/UaA1934npTj8sV3gaTSdx9bPbA==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -7114,8 +8186,8 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} hash-base@3.1.0: @@ -7128,10 +8200,13 @@ packages: hashlru@2.3.0: resolution: {integrity: sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} engines: {node: '>= 0.4'} + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + hast-util-from-html@2.0.1: resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} @@ -7144,12 +8219,18 @@ packages: hast-util-heading-rank@3.0.0: resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + hast-util-is-body-ok-link@3.0.0: + resolution: {integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==} + hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + hast-util-raw@9.0.3: resolution: {integrity: sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==} @@ -7162,6 +8243,9 @@ packages: hast-util-to-html@9.0.1: resolution: {integrity: sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==} + hast-util-to-html@9.0.2: + resolution: {integrity: sha512-RP5wNpj5nm1Z8cloDv4Sl4RS8jH5HYa0v93YB6Wb4poEzgMo/dAAL0KcT4974dCjcNG5pkLqTImeFHHCwwfY3g==} + hast-util-to-jsx-runtime@2.3.0: resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} @@ -7183,21 +8267,25 @@ packages: hastscript@9.0.0: resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + hermes-estree@0.15.0: + resolution: {integrity: sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==} + hermes-estree@0.19.1: resolution: {integrity: sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==} - hermes-estree@0.20.1: - resolution: {integrity: sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==} + hermes-parser@0.15.0: + resolution: {integrity: sha512-Q1uks5rjZlE9RjMMjSUCkGrEIPI5pKJILeCtK1VmTj7U4pf3wVPoo+cxfu+s4cBAPy2JzikIIdCZgBoR6x7U1Q==} hermes-parser@0.19.1: resolution: {integrity: sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==} - hermes-parser@0.20.1: - resolution: {integrity: sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==} - hermes-profile-transformer@0.0.6: resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} engines: {node: '>=8'} @@ -7208,8 +8296,8 @@ packages: hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} @@ -7227,6 +8315,9 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + html-whitespace-sensitive-tag-names@3.0.0: + resolution: {integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==} + htmlparser2-svelte@4.1.0: resolution: {integrity: sha512-+4f4RBFz7Rj2Hp0ZbFbXC+Kzbd6S9PgjiuFtdT76VMNgKogrEZy0pG2UrPycPbrZzVEIM5lAT3lAdkSTCHLPjg==} @@ -7237,6 +8328,9 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-https@1.0.0: + resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -7245,18 +8339,37 @@ packages: resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + https-proxy-agent@7.0.4: resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} engines: {node: '>= 14'} + human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -7264,9 +8377,15 @@ packages: i18next-browser-languagedetector@7.1.0: resolution: {integrity: sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==} + i18next-browser-languagedetector@7.2.0: + resolution: {integrity: sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==} + i18next@22.5.1: resolution: {integrity: sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==} + i18next@23.11.5: + resolution: {integrity: sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -7278,6 +8397,10 @@ packages: idb-keyval@6.2.1: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + idna-uts46-hx@2.3.1: + resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} + engines: {node: '>=4.0.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -7289,6 +8412,10 @@ packages: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} + ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -7298,6 +8425,12 @@ packages: engines: {node: '>=16.x'} hasBin: true + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + import-fresh@2.0.0: resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} engines: {node: '>=4'} @@ -7306,6 +8439,9 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} @@ -7319,6 +8455,7 @@ packages: 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==} @@ -7346,18 +8483,25 @@ packages: interface-store@5.1.8: resolution: {integrity: sha512-7na81Uxkl0vqk0CBPO5PvyTkdaJBaezwUJGsMOz7riPOq0rJt+7W31iaopaMICWea/iykUsvNlPx/Tc+MxC3/w==} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} - intl-messageformat@10.5.12: - resolution: {integrity: sha512-izl0uxhy/melhw8gP2r8pGiVieviZmM4v5Oqx3c1/R7g9cwER2smmGfSjcIsp8Y3Q53bfciL/gkxacJRx/dUvg==} + intl-messageformat@10.5.11: + resolution: {integrity: sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg==} invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ip@2.0.1: - resolution: {integrity: sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==} + io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + + ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + + ip@1.1.9: + resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==} ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -7386,8 +8530,8 @@ packages: resolution: {integrity: sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - iron-webcrypto@1.1.1: - resolution: {integrity: sha512-5xGwQUWHQSy039rFr+5q/zOmj7GP0Ypzvo34Ep+61bPIhaLduEDp/PvLGlU3awD2mzWUR0weN2vJ1mILydFPEg==} + iron-webcrypto@1.0.0: + resolution: {integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==} is-absolute-url@4.0.1: resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} @@ -7403,9 +8547,8 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -7436,11 +8579,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + is-core-module@2.14.0: + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} engines: {node: '>= 0.4'} is-date-object@1.0.5: @@ -7450,9 +8590,6 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-deflate@1.0.0: - resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} @@ -7486,6 +8623,9 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -7494,10 +8634,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-gzip@1.0.0: - resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} - engines: {node: '>=0.10.0'} - is-hex-prefixed@1.0.0: resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} engines: {node: '>=6.5.0', npm: '>=3'} @@ -7518,16 +8654,8 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} is-number-object@1.0.7: @@ -7538,10 +8666,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -7571,13 +8695,8 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} @@ -7591,14 +8710,21 @@ packages: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -7611,16 +8737,12 @@ packages: resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} engines: {node: '>=18'} - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} is-wsl@1.1.0: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} @@ -7672,6 +8794,9 @@ packages: peerDependencies: ws: '*' + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -7680,8 +8805,8 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@5.0.4: - resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} + istanbul-lib-source-maps@5.0.5: + resolution: {integrity: sha512-gKf4eJ8bHmSX/ljiOCpnd8vtmHTwG71uugm0kXYd5aqFCl6z8cj8k7QduXSwU6QOst6LCdSXTlaoc8W4554crQ==} engines: {node: '>=10'} istanbul-reports@3.1.7: @@ -7728,14 +8853,13 @@ packages: it-to-stream@1.0.0: resolution: {integrity: sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} - jake@10.9.1: - resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} - engines: {node: '>=10'} - hasBin: true + jackspeak@4.0.1: + resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} + engines: {node: 20 || >=22} jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} @@ -7773,12 +8897,18 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true - joi@17.13.1: - resolution: {integrity: sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==} + joi@17.12.1: + resolution: {integrity: sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==} + + js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + + js-sha3@0.5.7: + resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} js-sha3@0.8.0: resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} @@ -7786,8 +8916,8 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + js-tokens@8.0.3: + resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} @@ -7797,6 +8927,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + jsc-android@250231.0.0: resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} @@ -7809,15 +8942,6 @@ packages: peerDependencies: '@babel/preset-env': ^7.1.6 - jscodeshift@0.15.2: - resolution: {integrity: sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==} - hasBin: true - peerDependencies: - '@babel/preset-env': ^7.1.6 - peerDependenciesMeta: - '@babel/preset-env': - optional: true - jsdom@24.0.0: resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} engines: {node: '>=18'} @@ -7849,6 +8973,10 @@ packages: resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} engines: {node: '>=10.0.0'} + json-rpc-middleware-stream@4.2.3: + resolution: {integrity: sha512-4iFb0yffm5vo3eFKDbQgke9o17XBcLQ2c3sONrXSbcOLzP8LTojqo8hRGVgtJShhm5q4ZDSNq039fAx9o65E1w==} + engines: {node: '>=14.0.0'} + json-rpc-random-id@1.0.1: resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} @@ -7858,9 +8986,19 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stream-stringify@3.1.6: + resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} + engines: {node: '>=7.10.1'} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json-to-ast@2.1.0: resolution: {integrity: sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==} engines: {node: '>= 4'} @@ -7877,6 +9015,9 @@ packages: jsonc-parser@2.3.1: resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -7887,6 +9028,16 @@ packages: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + keccak256@1.0.6: + resolution: {integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==} + keccak@3.0.4: resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} @@ -7909,59 +9060,55 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - known-css-properties@0.30.0: - resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} + known-css-properties@0.34.0: + resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} latest-version@7.0.0: resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} engines: {node: '>=14.16'} - lazy-universal-dotenv@4.0.0: - resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} - engines: {node: '>=14.0.0'} - lefthook-darwin-arm64@1.6.10: resolution: {integrity: sha512-Hh11OkoKG7FEOByS1dcgNV7ETq45VmwBbw0VPTiBznyfOG4k+pi0fIdc1qbmbxvYqNE0r420QR/Q3bimaa4Kxg==} cpu: [arm64] os: [darwin] - lefthook-darwin-x64@1.6.10: - resolution: {integrity: sha512-FiOB0t5OBcQ8OnG/LSdfUYj736SJdlLjWuOZ4wTlJ7EUrHditieap6VNAxwMmFVyQN0X2ZwKWytwY35y+Hflhw==} + lefthook-darwin-x64@1.6.18: + resolution: {integrity: sha512-qwKa+PaNIYjZ2PVrRRLq+HjNjQsjEItXN21byvSD89r7EYCULsIC8aW4H6aniOP2A6X1DIZ+djpg+3hNJ/94NA==} cpu: [x64] os: [darwin] - lefthook-freebsd-arm64@1.6.10: - resolution: {integrity: sha512-IxGgS3RrNwk3Kr83o5SQhGxqppQi7fu2t//nsp6ocgnJeStrTtXZJOrel2VohzrFxpzQdJVXBGgUGLXtY8t8qw==} + lefthook-freebsd-arm64@1.6.18: + resolution: {integrity: sha512-UIOzQ+okwB7Ah9p8sNqomOiU6cPfmJnyW3HDPutRsdoHRD8udIap9d+ja4Kg4m/PkoYtkcLO78omANqAgA5wxQ==} cpu: [arm64] os: [freebsd] - lefthook-freebsd-x64@1.6.10: - resolution: {integrity: sha512-sFSe+dGLa4iBblWAhAGTP9moarcbFtFAH6aaCeyqSX51O6p9VPdGjqNtcE8aGbGAk4lO6v1ScRjk5ogMSinJwQ==} + lefthook-freebsd-x64@1.6.18: + resolution: {integrity: sha512-UQANUgyNpaAh0+2/PjPFiJ7yd6aF15yyJxKZCXyna5cQF7VU8pSHu5tiDDquNpjToXOg+6TmiIAJKyfrrwTF3w==} cpu: [x64] os: [freebsd] - lefthook-linux-arm64@1.6.10: - resolution: {integrity: sha512-fXnKiNdRIW+FRvc1keVrvWX5EqIhVFfPjcy+PbsKdxiWRXgjtidi6LPmQ8eosH0DC9PxZ0mpdCMf40FHEZLbQA==} + lefthook-linux-arm64@1.6.18: + resolution: {integrity: sha512-4erletIa2HKUgY17/1ROvndAj6xn/9wkqO2GhBT3C0vFwIv6ycy5wpFzXOwKRZpFYv7UacN7iXhAZSK+vSOZZg==} cpu: [arm64] os: [linux] - lefthook-linux-x64@1.6.10: - resolution: {integrity: sha512-bm6l2GOFnmYreZxmHb47QeOiFAItttOOxvCEX1okIRD7JbUC+lGC9evW5GJv/ltjZBoTDYEtQAUa+BpHTGuY2A==} + lefthook-linux-x64@1.6.18: + resolution: {integrity: sha512-l5SRqYMYygw9RjZncEg8uh29wShYN8kiYr53sp74DkntrlCttqWhLILBUlIr3fxH5s0ZyrmqUEjtMBryMk7b/g==} cpu: [x64] os: [linux] - lefthook-windows-arm64@1.6.10: - resolution: {integrity: sha512-pFxT8KbOMzGxj6cz4glHYwQSNC7XCuy9RDqIO0AxPlpATsCpapkF4ngDxBT1iFv2VhdeweMa7RXUDsMAGQA4Qw==} + lefthook-windows-arm64@1.6.18: + resolution: {integrity: sha512-jeNBRoya3+mOEsKyT4wXf29Kng1nkJD7Uv/dqGBszoGMktGVNUFdIjWoxx6HSfhUssucs5pKRZpXSMgK/KCP+Q==} cpu: [arm64] os: [win32] - lefthook-windows-x64@1.6.10: - resolution: {integrity: sha512-fcDnUSTv95AdLvm0NIrn3jBWXuRq8SlbDDjkkB5OHLiSmjz4eOr6wyD7xceDp33zZgZmWFzHebJngxxcIaUuHw==} + lefthook-windows-x64@1.6.18: + resolution: {integrity: sha512-iEG8PbFOwMqlpAgCiqzANTxutERjwlwMx6WF6HDGEYwFJSCJsvi06TehDxaPIFbhmLLYYlbVrfSBlttWGoN0dg==} cpu: [x64] os: [win32] - lefthook@1.6.10: - resolution: {integrity: sha512-HeVjsDCrHLe9htQHbLuQJu2YdLK6Tl5bh36fOpmXqckEXTI0BDR0Y5JYc7G5Inj4YXQsc51a9dUDZMeniSnSag==} + lefthook@1.6.18: + resolution: {integrity: sha512-Ftr/NkU1P1EsEyphsCqCX7lesGZA+QDXyUx4dS1RlSKB72xKtGW9VPjbGLK2kSQkONG5M+XYfbJkGA/r9NLTYQ==} hasBin: true leven@3.1.0: @@ -7972,6 +9119,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lighthouse-logger@1.4.2: resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} @@ -7979,28 +9129,28 @@ packages: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - listhen@1.7.2: - resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==} + listhen@1.6.0: + resolution: {integrity: sha512-z0RcEXVX5oTpY1bO02SKoTU/kmZSrFSngNNzHRM6KICR17PTq7ANush6AE6ztGJwJD4RLpBrVHd9GnV51J7s3w==} hasBin: true lit-element@3.3.3: resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} - lit-element@4.0.5: - resolution: {integrity: sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q==} + lit-element@4.0.4: + resolution: {integrity: sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==} lit-html@2.8.0: resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} - lit-html@3.1.3: - resolution: {integrity: sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA==} + lit-html@3.1.2: + resolution: {integrity: sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==} lit@2.8.0: resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} @@ -8023,6 +9173,10 @@ packages: locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -8042,12 +9196,21 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} @@ -8089,23 +9252,44 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} + lru-cache@11.0.1: + resolution: {integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==} + engines: {node: 20 || >=22} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + 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-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -8113,8 +9297,22 @@ packages: magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} - magicast@0.3.4: - resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + magic-string@0.30.7: + resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} + engines: {node: '>=12'} + + magic-string@0.30.9: + resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} + engines: {node: '>=12'} + + magicast@0.3.3: + resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -8144,8 +9342,8 @@ packages: markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - markdown-to-jsx@7.3.2: - resolution: {integrity: sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==} + markdown-to-jsx@7.5.0: + resolution: {integrity: sha512-RrBNcMHiFPcz/iqIj0n3wclzHXjwS7mzjBNWecKKVhNTIxQepIix6Il/wZCn2Cg5Y1ow2Qi84+eJrryFRWBEWw==} engines: {node: '>= 10'} peerDependencies: react: '>= 0.14.0' @@ -8165,8 +9363,8 @@ packages: mdast-util-find-and-replace@3.0.1: resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} - mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + mdast-util-from-markdown@2.0.1: + resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} mdast-util-gfm-autolink-literal@2.0.0: resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} @@ -8201,8 +9399,8 @@ packages: mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} mdast-util-to-markdown@2.1.0: resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} @@ -8220,8 +9418,9 @@ packages: memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} - memoizee@0.4.15: - resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + memoizee@0.4.17: + resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} + engines: {node: '>=0.12'} memoizerific@1.11.3: resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} @@ -8230,8 +9429,8 @@ packages: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + 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==} @@ -8244,69 +9443,69 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - merkletreejs@0.3.11: - resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} + merkletreejs@0.4.0: + resolution: {integrity: sha512-a48Ta5kWiVNBgeEbZVMm6FB1hBlp6vEuou/XnZdlkmd2zq6NZR6Sh2j+kR1B0iOZIXrTMcigBYzZ39MLdYhm1g==} engines: {node: '>= 7.6.0'} methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - metro-babel-transformer@0.80.9: - resolution: {integrity: sha512-d76BSm64KZam1nifRZlNJmtwIgAeZhZG3fi3K+EmPOlrR8rDtBxQHDSN3fSGeNB9CirdTyabTMQCkCup6BXFSQ==} + metro-babel-transformer@0.80.6: + resolution: {integrity: sha512-ssuoVC4OzqaOt3LpwfUbDfBlFGRu9v1Yf2JJnKPz0ROYHNjSBws4aUesqQQ/Ea8DbiH7TK4j4cJmm+XjdHmgqA==} engines: {node: '>=18'} - metro-cache-key@0.80.9: - resolution: {integrity: sha512-hRcYGhEiWIdM87hU0fBlcGr+tHDEAT+7LYNCW89p5JhErFt/QaAkVx4fb5bW3YtXGv5BTV7AspWPERoIb99CXg==} + metro-cache-key@0.80.6: + resolution: {integrity: sha512-DFmjQacC8m/S3HpELklLMWkPGP/fZPX3BSgjd0xQvwIvWyFwk8Nn/lfp/uWdEVDtDSIr64/anXU5uWohGwlWXw==} engines: {node: '>=18'} - metro-cache@0.80.9: - resolution: {integrity: sha512-ujEdSI43QwI+Dj2xuNax8LMo8UgKuXJEdxJkzGPU6iIx42nYa1byQ+aADv/iPh5sh5a//h5FopraW5voXSgm2w==} + metro-cache@0.80.6: + resolution: {integrity: sha512-NP81pHSPkzs+iNlpVkJqijrpcd6lfuDAunYH9/Rn8oLNz0yLfkl8lt+xOdUU4IkFt3oVcTBEFCnzAzv4B8YhyA==} engines: {node: '>=18'} - metro-config@0.80.9: - resolution: {integrity: sha512-28wW7CqS3eJrunRGnsibWldqgwRP9ywBEf7kg+uzUHkSFJNKPM1K3UNSngHmH0EZjomizqQA2Zi6/y6VdZMolg==} + metro-config@0.80.6: + resolution: {integrity: sha512-vHYYvJpRTWYbmvqlR7i04xQpZCHJ6yfZ/xIcPdz2ssbdJGGJbiT1Aar9wr8RAhsccSxdJgfE5B1DB8Mo+DnhIg==} engines: {node: '>=18'} - metro-core@0.80.9: - resolution: {integrity: sha512-tbltWQn+XTdULkGdzHIxlxk4SdnKxttvQQV3wpqqFbHDteR4gwCyTR2RyYJvxgU7HELfHtrVbqgqAdlPByUSbg==} + metro-core@0.80.6: + resolution: {integrity: sha512-fn4rryTUAwzFJWj7VIPDH4CcW/q7MV4oGobqR6NsuxZoIGYrVpK7pBasumu5YbCqifuErMs5s23BhmrDNeZURw==} engines: {node: '>=18'} - metro-file-map@0.80.9: - resolution: {integrity: sha512-sBUjVtQMHagItJH/wGU9sn3k2u0nrCl0CdR4SFMO1tksXLKbkigyQx4cbpcyPVOAmGTVuy3jyvBlELaGCAhplQ==} + metro-file-map@0.80.6: + resolution: {integrity: sha512-S3CUqvpXpc+q3q+hCEWvFKhVqgq0VmXdZQDF6u7ue86E2elq1XLnfLOt9JSpwyhpMQRyysjSCnd/Yh6GZMNHoQ==} engines: {node: '>=18'} - metro-minify-terser@0.80.9: - resolution: {integrity: sha512-FEeCeFbkvvPuhjixZ1FYrXtO0araTpV6UbcnGgDUpH7s7eR5FG/PiJz3TsuuPP/HwCK19cZtQydcA2QrCw446A==} + metro-minify-terser@0.80.6: + resolution: {integrity: sha512-83eZaH2+B+jP92KuodPqXknzwmiboKAuZY4doRfTEEXAG57pNVNN6cqSRJlwDnmaTBKRffxoncBXbYqHQgulgg==} engines: {node: '>=18'} - metro-resolver@0.80.9: - resolution: {integrity: sha512-wAPIjkN59BQN6gocVsAvvpZ1+LQkkqUaswlT++cJafE/e54GoVkMNCmrR4BsgQHr9DknZ5Um/nKueeN7kaEz9w==} + metro-resolver@0.80.6: + resolution: {integrity: sha512-R7trfglG4zY4X9XyM9cvuffAhQ9W1reWoahr1jdEWa6rOI8PyM0qXjcsb8l+fsOQhdSiVlkKcYAmkyrs1S/zrA==} engines: {node: '>=18'} - metro-runtime@0.80.9: - resolution: {integrity: sha512-8PTVIgrVcyU+X/rVCy/9yxNlvXsBCk5JwwkbAm/Dm+Abo6NBGtNjWF0M1Xo/NWCb4phamNWcD7cHdR91HhbJvg==} + metro-runtime@0.80.6: + resolution: {integrity: sha512-21GQVd0pp2nACoK0C2PL8mBsEhIFUFFntYrWRlYNHtPQoqDzddrPEIgkyaABGXGued+dZoBlFQl+LASlmmfkvw==} engines: {node: '>=18'} - metro-source-map@0.80.9: - resolution: {integrity: sha512-RMn+XS4VTJIwMPOUSj61xlxgBvPeY4G6s5uIn6kt6HB6A/k9ekhr65UkkDD7WzHYs3a9o869qU8tvOZvqeQzgw==} + metro-source-map@0.80.6: + resolution: {integrity: sha512-lqDuSLctWy9Qccu4Zl0YB1PzItpsqcKGb1nK0aDY+lzJ26X65OCib2VzHlj+xj7e4PiIKOfsvDCczCBz4cnxdg==} engines: {node: '>=18'} - metro-symbolicate@0.80.9: - resolution: {integrity: sha512-Ykae12rdqSs98hg41RKEToojuIW85wNdmSe/eHUgMkzbvCFNVgcC0w3dKZEhSsqQOXapXRlLtHkaHLil0UD/EA==} + metro-symbolicate@0.80.6: + resolution: {integrity: sha512-SGwKeBi+lK7NmM5+EcW6DyRRa9HmGSvH0LJtlT4XoRMbpxzsLYs0qUEA+olD96pOIP+ta7I8S30nQr2ttqgO8A==} engines: {node: '>=18'} hasBin: true - metro-transform-plugins@0.80.9: - resolution: {integrity: sha512-UlDk/uc8UdfLNJhPbF3tvwajyuuygBcyp+yBuS/q0z3QSuN/EbLllY3rK8OTD9n4h00qZ/qgxGv/lMFJkwP4vg==} + metro-transform-plugins@0.80.6: + resolution: {integrity: sha512-e04tdTC5Fy1vOQrTTXb5biao0t7nR/h+b1IaBTlM5UaHaAJZr658uVOoZhkRxKjbhF2mIwJ/8DdorD2CA15BCg==} engines: {node: '>=18'} - metro-transform-worker@0.80.9: - resolution: {integrity: sha512-c/IrzMUVnI0hSVVit4TXzt3A1GiUltGVlzCmLJWxNrBGHGrJhvgePj38+GXl1Xf4Fd4vx6qLUkKMQ3ux73bFLQ==} + metro-transform-worker@0.80.6: + resolution: {integrity: sha512-jV+VgCLiCj5jQadW/h09qJaqDreL6XcBRY52STCoz2xWn6WWLLMB5nXzQtvFNPmnIOps+Xu8+d5hiPcBNOhYmA==} engines: {node: '>=18'} - metro@0.80.9: - resolution: {integrity: sha512-Bc57Xf3GO2Xe4UWQsBj/oW6YfLPABEu8jfDVDiNmJvoQW4CO34oDPuYKe4KlXzXhcuNsqOtSxpbjCRRVjhhREg==} + metro@0.80.6: + resolution: {integrity: sha512-f6Nhnht9TxVRP6zdBq9J2jNdeDBxRmJFnjxhQS1GeCpokBvI6fTXq+wHTLz5jZA+75fwbkPSzBxBJzQa6xi0AQ==} engines: {node: '>=18'} hasBin: true @@ -8421,8 +9620,12 @@ packages: micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: @@ -8456,6 +9659,14 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -8464,6 +9675,9 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -8478,9 +9692,17 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: '>=10'} + minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} @@ -8489,6 +9711,10 @@ packages: resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} engines: {node: '>=10'} + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -8496,21 +9722,19 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} - minipass@7.1.0: - resolution: {integrity: sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} mipd@0.0.5: resolution: {integrity: sha512-gbKA784D2WKb5H/GtqEv+Ofd1S9Zj+Z/PGDIl1u1QAbswkxD28BQ5bSXQxkeBzPBABg1iDSbiwGG1XqlOxRspA==} @@ -8520,8 +9744,18 @@ packages: typescript: optional: true - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mipd@0.0.7: + resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + mkdirp-promise@5.0.1: + resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} + engines: {node: '>=4'} + deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} @@ -8537,11 +9771,22 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + mlly@1.5.0: + resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} + + mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + + mocha@10.7.3: + resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} + engines: {node: '>= 14.0.0'} + hasBin: true + + mock-fs@4.14.0: + resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} - moralis@2.26.1: - resolution: {integrity: sha512-6aY1D/ZJwpys3H1tKhxbuRvnHXTOK07uqPrBQS2OPbCyxYjW33NFJPJXiLRXsmpDjFM+xq6vYRKrQSy5Zf4yog==} + moralis@2.26.2: + resolution: {integrity: sha512-9CfzUuPvTZrwyjQQ+rtpvnIXKR6G793iWDXCBUpZomAUHk/3KcR80KwuBZBAvH9uIfl7MGqkp3C0uk5vX2714Q==} motion@10.16.2: resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} @@ -8566,6 +9811,22 @@ packages: muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + multibase@0.6.1: + resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} + deprecated: This module has been superseded by the multiformats module + + multibase@0.7.0: + resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} + deprecated: This module has been superseded by the multiformats module + + multicodec@0.5.7: + resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} + deprecated: This module has been superseded by the multiformats module + + multicodec@1.0.4: + resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} + deprecated: This module has been superseded by the multiformats module + multiformats@11.0.2: resolution: {integrity: sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -8574,19 +9835,29 @@ packages: resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - multiformats@13.1.0: - resolution: {integrity: sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==} + multiformats@13.1.3: + resolution: {integrity: sha512-CZPi9lFZCM/+7oRolWYsvalsyWQGFo+GpdaTmjxXXomC+nP/W1Rnxb9sUgjvmNmRZ5bOPqRAl4nuK+Ydw/4tGw==} multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + multihashes@0.4.21: + resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} + murky@https://codeload.github.com/dmfxyz/murky/tar.gz/5feccd1253d7da820f7cccccdedf64471025455d: resolution: {tarball: https://codeload.github.com/dmfxyz/murky/tar.gz/5feccd1253d7da820f7cccccdedf64471025455d} + name: murky version: 0.0.0 + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nano-json-stream-parser@0.1.2: + resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -8617,11 +9888,18 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - nlcst-to-string@3.1.1: - resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -8647,8 +9925,8 @@ packages: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} - node-fetch-native@1.6.4: - resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + node-fetch-native@1.6.2: + resolution: {integrity: sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==} node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -8663,8 +9941,8 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + node-gyp-build@4.8.0: + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} hasBin: true node-int64@0.4.0: @@ -8673,13 +9951,13 @@ packages: node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-stream-zip@1.15.0: resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} engines: {node: '>=0.12.0'} - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -8688,8 +9966,12 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} engines: {node: '>=14.16'} not@0.1.0: @@ -8712,8 +9994,8 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + npm-run-path@5.2.0: + resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} nth-check@2.1.1: @@ -8726,16 +10008,14 @@ packages: resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} engines: {node: '>=6.5.0', npm: '>=3'} - nwsapi@2.2.9: - resolution: {integrity: sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==} + nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - nypm@0.3.8: - resolution: {integrity: sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==} - engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - ob1@0.80.9: - resolution: {integrity: sha512-v9yOxowkZbxWhKOaaTyLjIm1aLy4ebMNcSn4NYJKOAI/Qv+SkfEfszpLr2GIxsccmb2Y2HA9qtsqiIJ80ucpVA==} + ob1@0.80.6: + resolution: {integrity: sha512-nlLGZPMQ/kbmkdIb5yvVzep1jKUII2x6ehNsHpgy71jpnJMW7V+KsB3AjYI2Ajb7UqMAMNjlssg6FUodrEMYzg==} engines: {node: '>=18'} obj-multiplex@1.0.0: @@ -8749,11 +10029,8 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} object-keys@1.1.1: @@ -8764,20 +10041,25 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} - ofetch@1.3.4: - resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + + oboe@2.1.5: + resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==} + + ofetch@1.3.3: + resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} ohash@1.1.3: resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} @@ -8808,6 +10090,13 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + oniguruma-to-js@0.4.3: + resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + open@6.4.0: resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} engines: {node: '>=8'} @@ -8820,11 +10109,20 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + optimism@https://codeload.github.com/ethereum-optimism/optimism/tar.gz/ab3a54febb36398539fd3b849c222b7e70169dc8: + resolution: {tarball: https://codeload.github.com/ethereum-optimism/optimism/tar.gz/ab3a54febb36398539fd3b849c222b7e70169dc8} + version: 1.0.0 + engines: {node: '>=16', pnpm: '>=9'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} ora@5.4.1: @@ -8835,14 +10133,21 @@ packages: resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - ora@8.0.1: - resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} + ora@8.1.0: + resolution: {integrity: sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==} engines: {node: '>=18'} os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} @@ -8858,6 +10163,14 @@ packages: p-fifo@1.0.0: resolution: {integrity: sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==} + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -8874,6 +10187,14 @@ packages: resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} + p-limit@6.1.0: + resolution: {integrity: sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==} + engines: {node: '>=18'} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -8890,6 +10211,10 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -8906,27 +10231,35 @@ packages: resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} engines: {node: '>=14.16'} + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} p256-verifier#v0.1.0@https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da: resolution: {tarball: https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da} + name: p256-verifier#v0.1.0 version: 0.0.0 + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + package-json@8.1.1: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} + package-manager-detector@0.2.0: + resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} + pagefind@1.1.0: resolution: {integrity: sha512-1nmj0/vfYcMxNEQj0YDRp6bTVv9hI7HLdPhK/vBBYlrnwjATndQvHyicj5Y7pUHrpCFZpFnLVQXIF829tpFmaw==} hasBin: true - pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - - param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -8938,6 +10271,9 @@ packages: parse-entities@4.0.1: resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-headers@2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} @@ -8946,8 +10282,11 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-latin@5.0.1: - resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} @@ -8962,9 +10301,6 @@ packages: path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} - path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -8992,12 +10328,16 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-to-regexp@0.1.10: + resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} path-to-regexp@6.2.2: resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} @@ -9006,33 +10346,40 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} - pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} - peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -9071,20 +10418,16 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} - - pkg-types@1.1.0: - resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} + pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - playwright-core@1.44.0: - resolution: {integrity: sha512-ZTbkNpFfYcGWohvTTl+xewITm7EOuqIqex0c7dNZ+aXsbrLj0qI8XlGKfPpipjm0Wny/4Lt4CJsWJk1stVS5qQ==} + playwright-core@1.43.1: + resolution: {integrity: sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==} engines: {node: '>=16'} hasBin: true - playwright@1.44.0: - resolution: {integrity: sha512-F9b3GUCLQ3Nffrfb6dunPOkE5Mh68tR7zN32L4jCk4FjQamgesGay7/dAAe1WaMEGV04DkdJfcJzjoCKygUaRQ==} + playwright@1.43.1: + resolution: {integrity: sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==} engines: {node: '>=16'} hasBin: true @@ -9100,14 +10443,10 @@ packages: resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} engines: {node: '>=10'} - pony-cause@2.1.11: - resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} + pony-cause@2.1.10: + resolution: {integrity: sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw==} engines: {node: '>=12.0.0'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -9162,8 +10501,8 @@ packages: peerDependencies: postcss: ^8.2.14 - postcss-nesting@12.1.2: - resolution: {integrity: sha512-FUmTHGDNundodutB4PUBxt/EPuhgtpk8FJGRsBhOuy+6FnkR2A8RZWIsyyy6XmhvX2DZQQWIkvu+HB4IbJm+Ew==} + postcss-nesting@12.1.0: + resolution: {integrity: sha512-QOYnosaZ+mlP6plQrAxFw09UUp2Sgtxj1BVHN+rSVbtV0Yx48zRt9/9F/ZOoxOKBBEsaJk2MYhhVRjeRRw5yuw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -9180,6 +10519,10 @@ packages: peerDependencies: postcss: ^8.4.29 + postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + engines: {node: '>=4'} + postcss-selector-parser@6.0.16: resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} engines: {node: '>=4'} @@ -9187,16 +10530,20 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.4.39: + resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} - preact@10.21.0: - resolution: {integrity: sha512-aQAIxtzWEwH8ou+OovWVSVNlFImL7xUCwJX3YMqA3U8iKCNC34999fFOnWjYNsylgfPgMexpbk7WYOLtKr/mxg==} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} - preferred-pm@3.1.3: - resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} - engines: {node: '>=10'} + preact@10.19.5: + resolution: {integrity: sha512-OPELkDmSVbKjbFqF9tgvOowiiQ9TmsJljIzXRyNE8nGiis94pwv1siF78rQkAP1Q1738Ce6pellRg/Ns/CtHqQ==} + + preferred-pm@4.0.0: + resolution: {integrity: sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==} + engines: {node: '>=18.12'} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -9206,19 +10553,30 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} + prettier-plugin-svelte@3.2.2: + resolution: {integrity: sha512-ZzzE/wMuf48/1+Lf2Ffko0uDa6pyCfgHV6+uAhtg2U0AAXGrhCSW88vEJNAkAxW5qyrFY1y1zZ4J8TgHrjW++Q==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + prettier-plugin-svelte@3.2.3: resolution: {integrity: sha512-wJq8RunyFlWco6U0WJV5wNCM7zpBFakS76UBSbmzMGpncpK98NZABaE+s7n8/APDCEVNHXC5Mpq+MLebQtsRlg==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + prettier@2.8.7: + resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} + engines: {node: '>=10.13.0'} + hasBin: true + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} engines: {node: '>=14'} hasBin: true @@ -9234,14 +10592,13 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-hrtime@1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} - prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} + process-nextick-args@1.0.7: + resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -9263,18 +10620,25 @@ packages: promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + prompt@1.3.0: + resolution: {integrity: sha512-ZkaRWtaLBZl7KKAKndKYUL8WqNT+cQHKRZnT4RYYms48jQkFw3rrBL+/N5K/KtdEveHkxs982MX2BkDKub2ZMg==} + engines: {node: '>= 6.0.0'} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - protobufjs@7.2.6: - resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} + protobufjs@7.3.2: + resolution: {integrity: sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==} engines: {node: '>=12.0.0'} proxy-addr@2.0.7: @@ -9287,6 +10651,9 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} @@ -9295,14 +10662,12 @@ packages: engines: {node: '>=16'} hasBin: true - pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + punycode@2.1.0: + resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==} + engines: {node: '>=6'} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -9323,23 +10688,22 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} - qs@6.12.1: - resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} + query-string@5.1.1: + resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} + engines: {node: '>=0.10.0'} + query-string@7.1.3: resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} engines: {node: '>=6'} - querystring@0.2.1: - resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} - engines: {node: '>=0.4.x'} - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. - querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -9356,11 +10720,8 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - radix3@1.1.2: - resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - - ramda@0.29.0: - resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} + radix3@1.1.0: + resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -9389,13 +10750,13 @@ packages: peerDependencies: react: ^16.3.0 || ^17.0.1 || ^18.0.0 - react-devtools-core@5.2.0: - resolution: {integrity: sha512-vZK+/gvxxsieAoAyYaiRIVFxlajb7KXhgBDV7OsoMzaAE+IqGpoxusBjIgq5ibqA2IloKu0p9n7tE68z1xs18A==} + react-devtools-core@4.28.5: + resolution: {integrity: sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: - react: ^18.3.1 + react: ^18.2.0 react-i18next@13.5.0: resolution: {integrity: sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==} @@ -9410,11 +10771,14 @@ packages: react-native: optional: true + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} react-native-fetch-api@3.0.0: resolution: {integrity: sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==} @@ -9425,70 +10789,39 @@ packages: react: '*' react-native: '*' - react-native@0.74.1: - resolution: {integrity: sha512-0H2XpmghwOtfPpM2LKqHIN7gxy+7G/r1hwJHKLV6uoyXGC/gCojRtoo5NqyKrWpFC8cqyT6wTYCLuG7CxEKilg==} + react-native@0.73.4: + resolution: {integrity: sha512-VtS+Yr6OOTIuJGDECIYWzNU8QpJjASQYvMtfa/Hvm/2/h5GdB6W9H9TOmh13x07Lj4AOhNMx3XSsz6TdrO4jIg==} engines: {node: '>=18'} hasBin: true peerDependencies: - '@types/react': ^18.2.6 react: 18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} engines: {node: '>=0.10.0'} - react-remove-scroll-bar@2.3.6: - resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.5.5: - resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - react-shallow-renderer@16.15.0: resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-style-singleton@2.2.1: - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read@1.0.7: + resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} + engines: {node: '>=0.8'} + + readable-stream@2.3.3: + resolution: {integrity: sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==} readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -9501,6 +10834,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.0.1: + resolution: {integrity: sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==} + engines: {node: '>= 14.16.0'} + readline@1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} @@ -9512,8 +10849,8 @@ packages: resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} engines: {node: '>= 4'} - recast@0.23.7: - resolution: {integrity: sha512-MpQlLZVpqbbxYcqEjwpRWo88sGvjOYoXptySz710RuddNMHx+wPkoNX6YyLZJlXAh5VZr1qmPrTwcTuFMh0Lag==} + recast@0.23.9: + resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} engines: {node: '>= 4'} receptacle@1.3.2: @@ -9523,6 +10860,14 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} @@ -9539,8 +10884,11 @@ packages: regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + regex@4.3.2: + resolution: {integrity: sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==} + + regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} regexpp@3.2.0: @@ -9563,12 +10911,18 @@ packages: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true - rehype-expressive-code@0.35.3: - resolution: {integrity: sha512-kj43Rg+WzYUs8RRr6XyBr60pnrIZEgbmn9yJoV6qka1UDpcx7r8icn6Q2uSAgaLtlEUy+HCPgQJraOZrA53LOQ==} + rehype-expressive-code@0.35.6: + resolution: {integrity: sha512-pPdE+pRcRw01kxMOwHQjuRxgwlblZt5+wAc3w2aPGgmcnn57wYjn07iKO7zaznDxYVxMYVvYlnL+R3vWFQS4Gw==} rehype-external-links@3.0.0: resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} + rehype-format@5.0.0: + resolution: {integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==} + + rehype-minify-whitespace@6.0.0: + resolution: {integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==} + rehype-parse@9.0.0: resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} @@ -9599,16 +10953,28 @@ packages: remark-rehype@11.1.0: resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} - remark-smartypants@2.1.0: - resolution: {integrity: sha512-qoF6Vz3BjU2tP6OfZqHOvCU0ACmu/6jhGaINSQRI9mM7wCxNQTKB3JUAN4SVoN2ybElEDTxBIABRep7e569iJw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-smartypants@3.0.1: + resolution: {integrity: sha512-qyshfCl2eLO0i0558e79ZJsfojC5wjnYLByjt0FmjJQN6aYwcRxpoj784LZJSoWCdnA2ubh5rLNGb8Uur/wDng==} + engines: {node: '>=16.0.0'} remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + request-light@0.5.8: + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + request-light@0.7.0: resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -9645,10 +11011,16 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} @@ -9661,40 +11033,66 @@ packages: resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - retext-latin@3.1.0: - resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} - retext-smartypants@5.2.0: - resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} + retext-smartypants@6.1.1: + resolution: {integrity: sha512-onsHf34i/GzgElJgtT1K2V+31yEhWs7NJboKNxXJcmVMMPxLpgxZ9iADoMdydd6j/bHic5F/aNq0CGqElEtu2g==} - retext-stringify@3.1.0: - resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} - retext@8.1.0: - resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} retimer@3.0.0: resolution: {integrity: sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==} + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@2.6.3: + revalidator@0.1.8: + resolution: {integrity: sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg==} + engines: {node: '>= 0.4.0'} + + rimraf@2.6.3: resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + risc0-ethereum#v1.1.2@https://codeload.github.com/risc0/risc0-ethereum/tar.gz/b8a14213d92fff07dacda993804e7edb7946ca58: + resolution: {tarball: https://codeload.github.com/risc0/risc0-ethereum/tar.gz/b8a14213d92fff07dacda993804e7edb7946ca58} + version: 0.0.0 + rlp@2.2.7: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true @@ -9714,14 +11112,28 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true + rollup@4.12.0: + resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rollup@4.17.2: resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.21.3: + resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -9729,8 +11141,8 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} safe-buffer@5.1.2: @@ -9739,9 +11151,8 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} safe-stable-stringify@2.4.3: resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} @@ -9753,15 +11164,15 @@ packages: sander@0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} - sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} scheduler@0.24.0-canary-efb381bbf-20230505: resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} @@ -9781,10 +11192,6 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} - selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -9793,8 +11200,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.1: - resolution: {integrity: sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==} + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} hasBin: true @@ -9803,33 +11210,47 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true - sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} serialize-error@2.1.0: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} engines: {node: '>=0.10.0'} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + serverless@4.4.3: + resolution: {integrity: sha512-Re/PCfW/vkWnY+IhelN7HUpt3r5l+6m4IrKE6SOKGawhODGYGqdGBZSkMNyNkvHdeq158zDNohcsM+Be7K9sBg==} + engines: {node: '>=18.0.0'} + hasBin: true + + servify@0.1.12: + resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} + engines: {node: '>=6'} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} set-cookie-parser@2.6.0: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} engines: {node: '>= 0.4'} - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} setimmediate@1.0.5: @@ -9846,14 +11267,22 @@ packages: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} - sharp@0.33.3: - resolution: {integrity: sha512-vHUeXJU1UvlO/BNwTpT0x/r53WkLUVxrmb5JTgW92fdFCFk0ispLMAeu/jPO2vjkXM1fYUi3K7/qcLF47pwM1A==} + sharp@0.33.4: + resolution: {integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==} engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -9861,8 +11290,14 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - shiki@1.5.1: - resolution: {integrity: sha512-vx4Ds3M3B9ZEmLeSXqBAB85osBWV8ErZfP69kuFQZozPgHc33m7spLTCUkcjwEjFm3gk3F9IdXMv8kX+v9xDHA==} + shiki@1.17.6: + resolution: {integrity: sha512-RejGugKpDM75vh6YtF9R771acxHRDikC/01kxsUGW+Pnaz3pTY+c8aZB5CnD7p0vuFPs1HaoAIU/4E+NCfS+mQ==} + + shiki@1.5.2: + resolution: {integrity: sha512-fpPbuSaatinmdGijE7VYUD3hxLozR3ZZ+iAx8Iy2X6REmJGyF5hQl94SgmiUNTospq346nXUVZx0035dyGvIVw==} + + side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -9878,6 +11313,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@2.8.2: + resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -9888,8 +11329,8 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - sitemap@7.1.1: - resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} + sitemap@7.1.2: + resolution: {integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==} engines: {node: '>=12.0.0', npm: '>=5.6.0'} hasBin: true @@ -9901,10 +11342,6 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - slice-ansi@2.1.0: resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} engines: {node: '>=6'} @@ -9916,16 +11353,21 @@ packages: snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - socket.io-client@4.7.5: - resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} + socket.io-client@4.7.4: + resolution: {integrity: sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==} engines: {node: '>=10.0.0'} socket.io-parser@4.2.4: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} + solady@https://codeload.github.com/Vectorized/solady/tar.gz/a12a2575c899a328c1bafdada632dabbff27cf6b: + resolution: {tarball: https://codeload.github.com/Vectorized/solady/tar.gz/a12a2575c899a328c1bafdada632dabbff27cf6b} + version: 0.0.231 + solady@https://codeload.github.com/Vectorized/solady/tar.gz/de0f336d2033d04e0f77c923d639c7fbffd48b6d: resolution: {tarball: https://codeload.github.com/Vectorized/solady/tar.gz/de0f336d2033d04e0f77c923d639c7fbffd48b6d} + name: solady version: 0.0.167 solc@0.8.24: @@ -9933,29 +11375,47 @@ packages: engines: {node: '>=10.0.0'} hasBin: true + solc@0.8.26: + resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} + engines: {node: '>=10.0.0'} + hasBin: true + solhint@4.5.4: resolution: {integrity: sha512-Cu1XiJXub2q1eCr9kkJ9VPv1sGcmj3V7Zb76B0CoezDOB9bu3DxKIFFH7ggCl9fWpEPD6xBmRLfZrYijkVmujQ==} hasBin: true - solhint@5.0.1: - resolution: {integrity: sha512-QeQLS9HGCnIiibt+xiOa/+MuP7BWz9N7C5+Mj9pLHshdkNhuo3AzCpWmjfWVZBUuwIUO3YyCRVIcYLR3YOKGfg==} + solhint@5.0.3: + resolution: {integrity: sha512-OLCH6qm/mZTCpplTXzXTJGId1zrtNuDYP5c2e6snIv/hdRVxPfBBz/bAlL91bY/Accavkayp2Zp2BaDSrLVXTQ==} hasBin: true + solidity-ast@0.4.59: + resolution: {integrity: sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g==} + + solidity-docgen@0.6.0-beta.36: + resolution: {integrity: sha512-f/I5G2iJgU1h0XrrjRD0hHMr7C10u276vYvm//rw1TzFcYQ4xTOyAoi9oNAHRU0JU4mY9eTuxdVc2zahdMuhaQ==} + peerDependencies: + hardhat: ^2.8.0 + solidity-stringutils@https://codeload.github.com/Arachnid/solidity-stringutils/tar.gz/4b2fcc43fa0426e19ce88b1f1ec16f5903a2e461: resolution: {tarball: https://codeload.github.com/Arachnid/solidity-stringutils/tar.gz/4b2fcc43fa0426e19ce88b1f1ec16f5903a2e461} + name: solidity-stringutils version: 0.0.0 sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} - sorcery@0.11.0: - resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} + sorcery@0.11.1: + resolution: {integrity: sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==} hasBin: true source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -9971,20 +11431,15 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + sp1-contracts#v3.0.0@https://codeload.github.com/succinctlabs/sp1-contracts/tar.gz/1c4acaeab86789995ae5c6baced66f81e4a57f4d: + resolution: {tarball: https://codeload.github.com/succinctlabs/sp1-contracts/tar.gz/1c4acaeab86789995ae5c6baced66f81e4a57f4d} + version: 0.0.0 + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + spawndamnit@2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} split-on-first@1.1.0: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} @@ -9997,6 +11452,14 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -10011,6 +11474,9 @@ packages: resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} engines: {node: '>=6'} + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + starlight-links-validator@0.8.0: resolution: {integrity: sha512-FYZ5cfV7jSL4wOsWmIkpR+9dH0Z8fxslSQl8IiAv5URfkxLgsaFzjx51FBeSaaS5uVmO5WgfkUjx3N52Jl1/TQ==} engines: {node: '>=18.14.1'} @@ -10018,8 +11484,8 @@ packages: '@astrojs/starlight': '>=0.15.0' astro: '>=4.0.0' - starlight-openapi@0.6.3: - resolution: {integrity: sha512-AHTbCJeGHzzhwVVi7UMgFgNKkvio2bbi9zQVtcI7CrMXVdd4jqL/L+R7MUxtr/DtzWG7PCCRsKPriwYubJ1ZPQ==} + starlight-openapi@0.6.4: + resolution: {integrity: sha512-TIioFhMmSKhKau6g/fx5WgWyPQve7cjP896wQek3sHqCJeLAsTSqUYCb33bBb/4D1/6sUioqlfJd9J3Lc1NQjA==} engines: {node: '>=18.14.1'} peerDependencies: '@astrojs/markdown-remark': '>=4.2.0' @@ -10045,15 +11511,8 @@ packages: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - - store2@2.14.3: - resolution: {integrity: sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==} - - storybook@8.1.1: - resolution: {integrity: sha512-tkoz1O2UcPOkfRgl/QkefI/1akyjkBghuX+2S/FaXb9cKUR1St4WBQfFqDUvJr1T9MKdizCBVFQ5HuqYzCiWWQ==} + storybook@8.3.0: + resolution: {integrity: sha512-XKU+nem9OKX/juvJPwka1Q7DTpSbOe0IMp8ZyLQWorhFKpquJdUjryl7Z9GiFZyyTykCqH4ItQ7h8PaOmqVMOw==} hasBin: true stream-browserify@3.0.0: @@ -10062,12 +11521,16 @@ packages: stream-replace-string@2.0.0: resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} stream-to-it@0.2.4: resolution: {integrity: sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==} + strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -10080,20 +11543,22 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + + string_decoder@1.0.3: + resolution: {integrity: sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==} string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -10148,8 +11613,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + strip-literal@2.0.0: + resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} @@ -10160,6 +11625,9 @@ packages: style-to-object@1.0.6: resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==} + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -10168,8 +11636,8 @@ packages: sudo-prompt@9.2.1: resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} - superstruct@1.0.4: - resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} + superstruct@1.0.3: + resolution: {integrity: sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==} engines: {node: '>=14.0.0'} supports-color@5.5.0: @@ -10188,8 +11656,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@3.7.1: - resolution: {integrity: sha512-U4uJoLCzmz2o2U33c7mPDJNhRYX/DNFV11XTUDlFxaKLsO7P+40gvJHMPpoRfa24jqZfST4/G9fGNcUGMO8NAQ==} + svelte-check@3.8.4: + resolution: {integrity: sha512-61aHMkdinWyH8BkkTX9jPLYxYzaAAz/FK/VQqdr2FiCQQ/q04WCwDlpGbHff1GdrMYTmW8chlTFvRWL9k0A8vg==} hasBin: true peerDependencies: svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 @@ -10199,11 +11667,11 @@ packages: peerDependencies: svelte: ^3.55.0 || ^4.0.0 - svelte-eslint-parser@0.36.0: - resolution: {integrity: sha512-/6YmUSr0FAVxW8dXNdIMydBnddPMHzaHirAZ7RrT21XYdgGGZMh0LQG6CZsvAFS4r2Y4ItUuCQc8TQ3urB30mQ==} + svelte-eslint-parser@0.35.0: + resolution: {integrity: sha512-CtbPseajW0gjwEvHiuzYJkPDjAcHz2FaHt540j6RVYrZgnE6xWkzUBodQ4I3nV+G5AS0Svt8K6aIA/CIU9xT2Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.115 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.112 peerDependenciesMeta: svelte: optional: true @@ -10221,9 +11689,9 @@ packages: peerDependencies: svelte: ^3 || ^4 - svelte-preprocess@5.1.4: - resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} - engines: {node: '>= 16.0.0'} + svelte-preprocess@5.1.3: + resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} + engines: {node: '>= 16.0.0', pnpm: ^8.0.0} peerDependencies: '@babel/core': ^7.10.2 coffeescript: ^2.5.1 @@ -10263,53 +11731,53 @@ packages: peerDependencies: svelte: ^3 || ^4 - svelte2tsx@0.7.8: - resolution: {integrity: sha512-ABK3RDFcy59AqAiU1N5Kxu1RnKrb1GDMrQjLgNgJfE8Q+coCKpjCAPtUVKQM2HnmuqeNWcT3NqfXbE+ZmN5Pow==} + svelte2tsx@0.7.19: + resolution: {integrity: sha512-PME/9mILn9wOihtk2dxu9tmf2+B9X6oWuqYPJRKSjqU4wq3Pc6+fOuYV7T3H+QF5afmA1oDobfXC6dzmK9NAVw==} peerDependencies: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 - svelte@4.2.16: - resolution: {integrity: sha512-mQwHpqHD2PmFcCyHaZ7XiTqposaLvJ75WpYcyY5/ce3qxbYtwQpZ+M7ZKP+2CG5U6kfnBZBpPLyofhlE6ROrnQ==} + svelte@4.2.13: + resolution: {integrity: sha512-jtVt2KXLbQnsWN93Zd7EVboNh8Tqexes4rZfXNP7nYRjd9+JjubTD8BXloUmU1OUYpc6pdd1aKBhCV+b2ZKoMg==} + engines: {node: '>=16'} + + svelte@4.2.17: + resolution: {integrity: sha512-N7m1YnoXtRf5wya5Gyx3TWuTddI4nAyayyIWFojiWV5IayDYNV5i2mRp/7qNGol4DtxEYxljmrbgp1HM6hUbmQ==} engines: {node: '>=16'} sveltedoc-parser@4.2.1: resolution: {integrity: sha512-sWJRa4qOfRdSORSVw9GhfDEwsbsYsegnDzBevUCF6k/Eis/QqCu9lJ6I0+d/E2wOWCjOhlcJ3+jl/Iur+5mmCw==} engines: {node: '>=10.0.0'} + swarm-js@0.1.42: + resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + synckit@0.8.6: + resolution: {integrity: sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==} engines: {node: ^14.18.0 || >=16.0.0} system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} - table@6.8.2: - resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + table@6.8.1: + resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} tailwindcss-image-rendering@1.0.2: resolution: {integrity: sha512-WC3hJd2RbHBYIqtJxwpQ5z94wUNyBrJn1eFz3J/jR7OGrQB8WYbJGvJQ9scNNVzoHEYGoNdZbUI90l9YgpBCwg==} - tailwindcss@3.4.3: - resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} + tailwindcss@3.4.4: + resolution: {integrity: sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==} engines: {node: '>=14.0.0'} hasBin: true - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} + tar@4.4.19: + resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} + engines: {node: '>=4.5'} telejson@7.2.0: resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} @@ -10318,16 +11786,20 @@ packages: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + temp@0.8.4: resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} engines: {node: '>=6.0.0'} - tempy@1.0.1: - resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} - engines: {node: '>=10'} + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} - terser@5.31.0: - resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} + terser@5.27.2: + resolution: {integrity: sha512-sHXmLSkImesJ4p5apTeT63DsV4Obe1s37qT8qvwHRmVxKTBH7Rv9Wr26VcAMmLbmk9UliiwK8z+657NyJHHy/w==} engines: {node: '>=10'} hasBin: true @@ -10354,11 +11826,16 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + timeout-abort-controller@3.0.0: resolution: {integrity: sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==} - timers-ext@0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + timers-ext@0.1.8: + resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} + engines: {node: '>=0.12'} tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} @@ -10366,17 +11843,32 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + + tinypool@0.8.3: + resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} + engines: {node: '>=14.0.0'} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.0: + resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} engines: {node: '>=14.0.0'} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -10392,9 +11884,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tocbot@4.27.20: - resolution: {integrity: sha512-6M78FT20+FA5edtx7KowLvhG3gbZ6GRcEkL/0b2TcPbn6Ba+1ayI3SEVxe25zjkWGs0jd04InImaO81Hd8Hukw==} - toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -10403,8 +11892,12 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} engines: {node: '>=6'} tr46@0.0.3: @@ -10424,6 +11917,12 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@1.2.1: + resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -10434,8 +11933,8 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} - ts-essentials@9.4.2: - resolution: {integrity: sha512-mB/cDhOvD7pg3YCLk2rOtejHjjdSi9in/IBYE13S+8WA5FBSraYf4V/ws55uvs0IvQ/l0wBOlXy5yBNZ9Bl8ZQ==} + ts-essentials@9.4.1: + resolution: {integrity: sha512-oke0rI2EN9pzHsesdmrOrnqv1eQODmJpd/noJjwj2ZPC3Z4N2wbjrOEqnsEgmvlO2+4fBb0a794DCna2elEVIQ==} peerDependencies: typescript: '>=4.1.0' peerDependenciesMeta: @@ -10462,8 +11961,18 @@ packages: '@swc/wasm': optional: true - tsconfck@3.0.3: - resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} + tsconfck@3.1.1: + resolution: {integrity: sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tsconfck@3.1.3: + resolution: {integrity: sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==} engines: {node: ^18 || >=20} hasBin: true peerDependencies: @@ -10472,24 +11981,46 @@ packages: typescript: optional: true - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + tsutils@3.21.0: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + 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'} + tween-functions@1.2.0: resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} + tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -10498,26 +12029,18 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} - engines: {node: '>=10'} - type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} type-fest@0.7.1: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} @@ -10526,41 +12049,51 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + type@2.7.2: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} typesafe-path@0.2.2: resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} - typescript-auto-import-cache@0.3.2: - resolution: {integrity: sha512-+laqe5SFL1vN62FPOOJSUDTZxtgsoOXjneYOXIpx5rQ4UMiN89NAtJLpqLqyebv9fgQ/IMeeTX+mQyRnwvJzvg==} + typescript-auto-import-cache@0.3.3: + resolution: {integrity: sha512-ojEC7+Ci1ij9eE6hp8Jl9VUNnsEKzztktP5gtYNRMrTmfXVwA1PITYYAkpxCvvupdSYa/Re51B6KMcv1CTZEUA==} + + typescript@5.4.3: + resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} + engines: {node: '>=14.17'} + hasBin: true - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} hasBin: true - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + ufo@1.4.0: + resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} - uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true @@ -10573,11 +12106,17 @@ packages: uint8arrays@3.1.0: resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + uint8arrays@3.1.1: + resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + uint8arrays@4.0.10: resolution: {integrity: sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==} - uint8arrays@5.0.3: - resolution: {integrity: sha512-6LBuKji28kHjgPJMkQ6GDaBb1lRwIhyOYq6pDGwYMoDPfImE9SkuYENVmR0yu9yGgs2clHUSY9fKDukR+AXfqQ==} + uint8arrays@5.1.0: + resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==} + + ultron@1.1.1: + resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -10588,8 +12127,8 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + undici@5.28.3: + resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} engines: {node: '>=14.0'} unenv@1.9.0: @@ -10598,9 +12137,6 @@ packages: unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} - unherit@3.0.1: - resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} - unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -10617,31 +12153,20 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - - unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - - unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} - - unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} - unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - unist-util-modify-children@3.1.1: - resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} unist-util-position-from-estree@2.0.0: resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} @@ -10652,24 +12177,15 @@ packages: unist-util-remove-position@5.0.0: resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - unist-util-visit-children@2.0.2: - resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} - - unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} @@ -10689,26 +12205,30 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unplugin@1.10.1: - resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==} + unplugin@1.14.1: + resolution: {integrity: sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==} engines: {node: '>=14.0.0'} + peerDependencies: + webpack-sources: ^3 + peerDependenciesMeta: + webpack-sources: + optional: true - unstorage@1.10.2: - resolution: {integrity: sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ==} + unstorage@1.10.1: + resolution: {integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==} peerDependencies: - '@azure/app-configuration': ^1.5.0 + '@azure/app-configuration': ^1.4.1 '@azure/cosmos': ^4.0.0 '@azure/data-tables': ^13.2.2 - '@azure/identity': ^4.0.1 - '@azure/keyvault-secrets': ^4.8.0 - '@azure/storage-blob': ^12.17.0 - '@capacitor/preferences': ^5.0.7 - '@netlify/blobs': ^6.5.0 || ^7.0.0 - '@planetscale/database': ^1.16.0 - '@upstash/redis': ^1.28.4 - '@vercel/kv': ^1.0.1 + '@azure/identity': ^3.3.2 + '@azure/keyvault-secrets': ^4.7.0 + '@azure/storage-blob': ^12.16.0 + '@capacitor/preferences': ^5.0.6 + '@netlify/blobs': ^6.2.0 + '@planetscale/database': ^1.11.0 + '@upstash/redis': ^1.23.4 + '@vercel/kv': ^0.2.3 idb-keyval: ^6.2.1 - ioredis: ^5.3.2 peerDependenciesMeta: '@azure/app-configuration': optional: true @@ -10734,8 +12254,6 @@ packages: optional: true idb-keyval: optional: true - ioredis: - optional: true untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} @@ -10745,17 +12263,17 @@ packages: resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} hasBin: true - update-browserslist-db@1.0.15: - resolution: {integrity: sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==} + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - - upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' uqr@0.1.2: resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} @@ -10766,31 +12284,18 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - use-callback-ref@1.3.2: - resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-sidecar@1.1.2: - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + url-set-query@1.0.0: + resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} use-sync-external-store@1.2.0: resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + utf-8-validate@6.0.3: resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} engines: {node: '>=6.14.2'} @@ -10808,6 +12313,11 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -10822,8 +12332,9 @@ packages: v8-compile-cache@2.4.0: resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} valtio@1.11.2: resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} @@ -10837,6 +12348,9 @@ packages: react: optional: true + varint@5.0.2: + resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + varint@6.0.0: resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} @@ -10844,21 +12358,22 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + vfile-location@5.0.2: resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} - vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + viem@1.21.4: resolution: {integrity: sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ==} peerDependencies: @@ -10867,22 +12382,27 @@ packages: typescript: optional: true - viem@2.10.2: - resolution: {integrity: sha512-gcOL+XxA0UWDarli856OEgumaBz4df/qNMpgno4NTSSZtJSC1XixIb3gWjVBei6Vx085ivw/U9ZE8gdniIo7fA==} + viem@2.21.7: + resolution: {integrity: sha512-PFgppakInuHX31wHDx1dzAjhj4t6Po6WrWtutDi33z2vabIT0Wv8qT6tl7DLqfLy2NkTqfN2mdshYLeoI5ZHvQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true - viem@2.13.1: - resolution: {integrity: sha512-QaSCtPXb9uVaba+vOsyCFX21BDWNbjBOuXIWWlQXLmECtr/mbJ64XUHyFz6KLvUwAsQ+vxUQVwgmXc3jVMxwYw==} + viem@2.9.29: + resolution: {integrity: sha512-LWvDSyB2tftKuSMAyZTXk3pDYj3c0aaOdr2JbDZEsPJw5zVbqg3FpoPHnUkHai8KcZI8aPWRKV31TYV1cBse9A==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true + vite-node@1.5.0: + resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite-node@1.6.0: resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -10924,6 +12444,34 @@ packages: terser: optional: true + vite@5.1.3: + resolution: {integrity: sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vite@5.2.11: resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -10952,6 +12500,37 @@ packages: terser: optional: true + vite@5.4.5: + resolution: {integrity: sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vitefu@0.2.5: resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: @@ -10960,6 +12539,14 @@ packages: vite: optional: true + vitefu@1.0.2: + resolution: {integrity: sha512-0/iAvbXyM3RiPPJ4lyD4w6Mjgtf4ejTK6TPvTNG3H32PLwuT0N/ZjJLiXug7ETE/LWtTeHw9WRv7uX/tIKYyKg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + vitest-fetch-mock@0.2.2: resolution: {integrity: sha512-XmH6QgTSjCWrqXoPREIdbj40T7i1xnGmAsTAgfckoO75W1IEHKR8hcPCQ7SO16RsdW1t85oUm6pcQRLeBgjVYQ==} engines: {node: '>=14.14.0'} @@ -10972,6 +12559,31 @@ packages: typescript: 3.x || 4.x || 5.x vitest: '>=0.31.1' + vitest@1.5.0: + resolution: {integrity: sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.5.0 + '@vitest/ui': 1.5.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vitest@1.6.0: resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -11004,34 +12616,34 @@ packages: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} - volar-service-css@0.0.43: - resolution: {integrity: sha512-rg2gTXhswq6Wz8euZgCRS68+7EPH+3R7SeTqYfAAtHKoU0rS1bwdxP1CWHezyxnHrLMiXEypCgJJWcMTay3W7g==} + volar-service-css@0.0.61: + resolution: {integrity: sha512-Ct9L/w+IB1JU8F4jofcNCGoHy6TF83aiapfZq9A0qYYpq+Kk5dH+ONS+rVZSsuhsunq8UvAuF8Gk6B8IFLfniw==} peerDependencies: - '@volar/language-service': ~2.2.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-emmet@0.0.43: - resolution: {integrity: sha512-ODsSOsSScVTNSD1Z+e4EV21RuN3q38ahGnuyxKYHW9Fg0RwfLatHl6wIRfj21XlVVa8twBMsA/Fp43ObuDEBxQ==} + volar-service-emmet@0.0.61: + resolution: {integrity: sha512-iiYqBxjjcekqrRruw4COQHZME6EZYWVbkHjHDbULpml3g8HGJHzpAMkj9tXNCPxf36A+f1oUYjsvZt36qPg4cg==} peerDependencies: - '@volar/language-service': ~2.2.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-html@0.0.43: - resolution: {integrity: sha512-Z/S7SCkHmpoR708WTQLCE3k+hfT16xjMfq9Htv7Y3yJeykah1jZO8oZX3433OPFfbS/ZFbGa2VlAIgDTVRU5Pg==} + volar-service-html@0.0.61: + resolution: {integrity: sha512-yFE+YmmgqIL5HI4ORqP++IYb1QaGcv+xBboI0WkCxJJ/M35HZj7f5rbT3eQ24ECLXFbFCFanckwyWJVz5KmN3Q==} peerDependencies: - '@volar/language-service': ~2.2.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-prettier@0.0.43: - resolution: {integrity: sha512-Beq+iNyG05PlSPTISOFK5Yoj29rXdGb6htvyFk2u0jVFRGX1QD0Pb5ze9OiqfUVwT+3cFZhPrSPndbTR1ft/aA==} + volar-service-prettier@0.0.61: + resolution: {integrity: sha512-F612nql5I0IS8HxXemCGvOR2Uxd4XooIwqYVUvk7WSBxP/+xu1jYvE3QJ7EVpl8Ty3S4SxPXYiYTsG3bi+gzIQ==} peerDependencies: - '@volar/language-service': ~2.2.0 + '@volar/language-service': ~2.4.0 prettier: ^2.2 || ^3.0 peerDependenciesMeta: '@volar/language-service': @@ -11039,31 +12651,53 @@ packages: prettier: optional: true - volar-service-typescript-twoslash-queries@0.0.43: - resolution: {integrity: sha512-FUqgvK2a6YxNO0P+zmY5syVatD8I7+qEA+mj1lotqQxwtY0Gh3UDCCqTVapX1E4VxF/pvNac7eVOBkCUVVZC5w==} + volar-service-typescript-twoslash-queries@0.0.61: + resolution: {integrity: sha512-99FICGrEF0r1E2tV+SvprHPw9Knyg7BdW2fUch0tf59kG+KG+Tj4tL6tUg+cy8f23O/VXlmsWFMIE+bx1dXPnQ==} peerDependencies: - '@volar/language-service': ~2.2.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-typescript@0.0.43: - resolution: {integrity: sha512-oXYZHuM7QYBmgSiheFkoQPyUzzvm9ddaUzfDqc9cOM+fDuMAkUer2bEqnqZXerGjhsjuXNCu4PGlSOJJMxWe3A==} + volar-service-typescript@0.0.61: + resolution: {integrity: sha512-4kRHxVbW7wFBHZWRU6yWxTgiKETBDIJNwmJUAWeP0mHaKpnDGj/astdRFKqGFRYVeEYl45lcUPhdJyrzanjsdQ==} peerDependencies: - '@volar/language-service': ~2.2.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - vscode-css-languageservice@6.2.14: - resolution: {integrity: sha512-5UPQ9Y1sUTnuMyaMBpO7LrBkqjhEJb5eAwdUlDp+Uez8lry+Tspnk3+3p2qWS4LlNsr4p3v9WkZxUf1ltgFpgw==} + volar-service-yaml@0.0.61: + resolution: {integrity: sha512-L+gbDiLDQQ1rZUbJ3mf3doDsoQUa8OZM/xdpk/unMg1Vz24Zmi2Ign8GrZyBD7bRoIQDwOH9gdktGDKzRPpUNw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true - vscode-html-languageservice@5.2.0: - resolution: {integrity: sha512-cdNMhyw57/SQzgUUGSIMQ66jikqEN6nBNyhx5YuOyj9310+eY9zw8Q0cXpiKzDX8aHYFewQEXRnigl06j/TVwQ==} + vscode-css-languageservice@6.3.1: + resolution: {integrity: sha512-1BzTBuJfwMc3A0uX4JBdJgoxp74cjj4q2mDJdp49yD/GuAq4X0k5WtK6fNcMYr+FfJ9nqgR6lpfCSZDkARJ5qQ==} - vscode-jsonrpc@8.2.0: - resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} - engines: {node: '>=14.0.0'} + vscode-html-languageservice@5.3.0: + resolution: {integrity: sha512-C4Z3KsP5Ih+fjHpiBc5jxmvCl+4iEwvXegIrzu2F5pktbWvQaBT3YkVPk8N+QlSSMk8oCG6PKtZ/Sq2YHb5e8g==} + + vscode-html-languageservice@5.3.1: + resolution: {integrity: sha512-ysUh4hFeW/WOWz/TO9gm08xigiSsV/FOAZ+DolgJfeLftna54YdmZ4A+lIn46RbdO3/Qv5QHTn1ZGqmrXQhZyA==} + + vscode-json-languageservice@4.1.8: + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} + + vscode-jsonrpc@6.0.0: + resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} + engines: {node: '>=8.0.0 || >=10.0.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.16.0: + resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} vscode-languageserver-protocol@3.17.5: resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} @@ -11071,9 +12705,19 @@ packages: vscode-languageserver-textdocument@1.0.11: resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.16.0: + resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} + vscode-languageserver-types@3.17.5: resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + vscode-languageserver@7.0.0: + resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} + hasBin: true + vscode-languageserver@9.0.1: resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} hasBin: true @@ -11094,27 +12738,109 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} - wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web3-bzz@1.10.4: + resolution: {integrity: sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==} + engines: {node: '>=8.0.0'} + + web3-core-helpers@1.10.4: + resolution: {integrity: sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==} + engines: {node: '>=8.0.0'} + + web3-core-method@1.10.4: + resolution: {integrity: sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==} + engines: {node: '>=8.0.0'} + + web3-core-promievent@1.10.4: + resolution: {integrity: sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==} + engines: {node: '>=8.0.0'} + + web3-core-requestmanager@1.10.4: + resolution: {integrity: sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==} + engines: {node: '>=8.0.0'} + + web3-core-subscriptions@1.10.4: + resolution: {integrity: sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==} + engines: {node: '>=8.0.0'} + + web3-core@1.10.4: + resolution: {integrity: sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==} + engines: {node: '>=8.0.0'} + web3-eth-abi@1.10.4: resolution: {integrity: sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==} engines: {node: '>=8.0.0'} + web3-eth-accounts@1.10.4: + resolution: {integrity: sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==} + engines: {node: '>=8.0.0'} + + web3-eth-contract@1.10.4: + resolution: {integrity: sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==} + engines: {node: '>=8.0.0'} + + web3-eth-ens@1.10.4: + resolution: {integrity: sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==} + engines: {node: '>=8.0.0'} + + web3-eth-iban@1.10.4: + resolution: {integrity: sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==} + engines: {node: '>=8.0.0'} + + web3-eth-personal@1.10.4: + resolution: {integrity: sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==} + engines: {node: '>=8.0.0'} + + web3-eth@1.10.4: + resolution: {integrity: sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==} + engines: {node: '>=8.0.0'} + + web3-net@1.10.4: + resolution: {integrity: sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==} + engines: {node: '>=8.0.0'} + + web3-providers-http@1.10.4: + resolution: {integrity: sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==} + engines: {node: '>=8.0.0'} + + web3-providers-ipc@1.10.4: + resolution: {integrity: sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==} + engines: {node: '>=8.0.0'} + + web3-providers-ws@1.10.4: + resolution: {integrity: sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==} + engines: {node: '>=8.0.0'} + + web3-shh@1.10.4: + resolution: {integrity: sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==} + engines: {node: '>=8.0.0'} + web3-utils@1.10.4: resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} engines: {node: '>=8.0.0'} + web3@1.10.4: + resolution: {integrity: sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==} + engines: {node: '>=8.0.0'} + + webauthn-p256@0.0.5: + resolution: {integrity: sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==} + + webextension-polyfill-ts@0.25.0: + resolution: {integrity: sha512-ikQhwwHYkpBu00pFaUzIKY26I6L87DeRI+Q6jBT1daZUNuu8dSrg5U9l/ZbqdaQ1M/TTSPKeAa3kolP5liuedw==} + deprecated: This project has moved to @types/webextension-polyfill + webextension-polyfill@0.10.0: resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + webextension-polyfill@0.7.0: + resolution: {integrity: sha512-su48BkMLxqzTTvPSE1eWxKToPS2Tv5DLGxKexLEVpwFd6Po6N8hhSLIvG6acPAg7qERoEaDL+Y5HQJeJeml5Aw==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -11122,12 +12848,12 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack-virtual-modules@0.6.1: - resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} + websocket@1.0.35: + resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==} + engines: {node: '>=4.0.0'} whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} @@ -11150,10 +12876,6 @@ packages: which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -11161,18 +12883,18 @@ packages: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} - which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} - - which-pm@2.1.1: - resolution: {integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==} - engines: {node: '>=8.15'} + which-pm@3.0.0: + resolution: {integrity: sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==} + engines: {node: '>=18.12'} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} engines: {node: '>= 0.4'} + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -11188,17 +12910,24 @@ packages: engines: {node: '>=8'} hasBin: true + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + widest-line@4.0.1: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + winston@2.4.7: + resolution: {integrity: sha512-vLB4BqzCKDnnZH9PHGoS2ycawueX4HLqENXQitvFHczhgW2vFpSOn31LZtVr1KU8YTw7DS4tM+cqyovxo8taVg==} + engines: {node: '>= 0.10.0'} wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -11217,6 +12946,17 @@ packages: write-file-atomic@2.4.3: resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + ws@3.3.3: + resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} peerDependencies: @@ -11240,8 +12980,8 @@ packages: utf-8-validate: optional: true - ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -11252,20 +12992,20 @@ packages: utf-8-validate: optional: true - ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -11276,8 +13016,8 @@ packages: utf-8-validate: optional: true - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -11288,10 +13028,27 @@ packages: utf-8-validate: optional: true + xhr-request-promise@0.1.3: + resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} + + xhr-request@1.1.0: + resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} + + xhr@2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -11303,6 +13060,9 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + xxhash-wasm@1.0.2: + resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -11310,18 +13070,37 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yaeti@0.0.6: + resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} + engines: {node: '>=0.10.32'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml-language-server@1.15.0: + resolution: {integrity: sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw==} + hasBin: true + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + yaml@2.2.2: + resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} + engines: {node: '>= 14'} + + yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} engines: {node: '>= 14'} hasBin: true @@ -11329,14 +13108,26 @@ packages: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -11349,15 +13140,25 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} - zod-to-json-schema@3.23.0: - resolution: {integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + zod-to-json-schema@3.23.3: + resolution: {integrity: sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==} peerDependencies: zod: ^3.23.3 + zod-to-ts@1.2.0: + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} @@ -11384,61 +13185,66 @@ packages: snapshots: - '@adobe/css-tools@4.3.3': {} + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@adobe/css-tools@4.4.0': {} '@adraffy/ens-normalize@1.10.0': {} + '@adraffy/ens-normalize@1.10.1': {} + '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': + '@ampproject/remapping@2.2.1': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.25 '@apidevtools/openapi-schemas@2.1.0': {} '@apidevtools/swagger-methods@3.0.2': {} - '@astrojs/check@0.6.0(prettier@3.2.5)(typescript@5.4.5)': + '@astrojs/check@0.8.3(prettier@3.2.5)(typescript@5.4.5)': dependencies: - '@astrojs/language-server': 2.9.0(prettier@3.2.5)(typescript@5.4.5) + '@astrojs/language-server': 2.14.2(prettier@3.2.5)(typescript@5.4.5) chokidar: 3.6.0 fast-glob: 3.3.2 kleur: 4.1.5 - typescript: 5.4.5 + typescript: 5.5.3 yargs: 17.7.2 transitivePeerDependencies: - prettier - prettier-plugin-astro - '@astrojs/compiler@2.8.0': {} + '@astrojs/compiler@2.10.3': {} - '@astrojs/internal-helpers@0.4.0': {} + '@astrojs/internal-helpers@0.4.1': {} - '@astrojs/language-server@2.9.0(prettier@3.2.5)(typescript@5.4.5)': + '@astrojs/language-server@2.14.2(prettier@3.2.5)(typescript@5.4.5)': dependencies: - '@astrojs/compiler': 2.8.0 + '@astrojs/compiler': 2.10.3 + '@astrojs/yaml2ts': 0.2.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@volar/kit': 2.2.2(typescript@5.4.5) - '@volar/language-core': 2.2.2 - '@volar/language-server': 2.2.2 - '@volar/language-service': 2.2.2 - '@volar/typescript': 2.2.2 + '@volar/kit': 2.4.5(typescript@5.4.5) + '@volar/language-core': 2.4.5 + '@volar/language-server': 2.4.5 + '@volar/language-service': 2.4.5 + '@volar/typescript': 2.4.5 fast-glob: 3.3.2 - volar-service-css: 0.0.43(@volar/language-service@2.2.2) - volar-service-emmet: 0.0.43(@volar/language-service@2.2.2) - volar-service-html: 0.0.43(@volar/language-service@2.2.2) - volar-service-prettier: 0.0.43(@volar/language-service@2.2.2)(prettier@3.2.5) - volar-service-typescript: 0.0.43(@volar/language-service@2.2.2) - volar-service-typescript-twoslash-queries: 0.0.43(@volar/language-service@2.2.2) + muggle-string: 0.4.1 + volar-service-css: 0.0.61(@volar/language-service@2.4.5) + volar-service-emmet: 0.0.61(@volar/language-service@2.4.5) + volar-service-html: 0.0.61(@volar/language-service@2.4.5) + volar-service-prettier: 0.0.61(@volar/language-service@2.4.5)(prettier@3.2.5) + volar-service-typescript: 0.0.61(@volar/language-service@2.4.5) + volar-service-typescript-twoslash-queries: 0.0.61(@volar/language-service@2.4.5) + volar-service-yaml: 0.0.61(@volar/language-service@2.4.5) vscode-html-languageservice: 5.2.0 vscode-uri: 3.0.8 - optionalDependencies: - prettier: 3.2.5 transitivePeerDependencies: - typescript - '@astrojs/markdown-remark@5.1.0': + '@astrojs/markdown-remark@5.2.0': dependencies: '@astrojs/prism': 3.1.0 github-slugger: 2.0.0 @@ -11451,34 +13257,33 @@ snapshots: remark-gfm: 4.0.0 remark-parse: 11.0.0 remark-rehype: 11.1.0 - remark-smartypants: 2.1.0 - shiki: 1.5.1 - unified: 11.0.4 + remark-smartypants: 3.0.2 + shiki: 1.17.6 + unified: 11.0.5 unist-util-remove-position: 5.0.0 unist-util-visit: 5.0.0 unist-util-visit-parents: 6.0.1 - vfile: 6.0.1 + vfile: 6.0.3 transitivePeerDependencies: - supports-color - '@astrojs/mdx@2.3.1(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5))': + '@astrojs/mdx@3.1.6(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5))': dependencies: - '@astrojs/markdown-remark': 5.1.0 + '@astrojs/markdown-remark': 5.2.0 '@mdx-js/mdx': 3.0.1 - acorn: 8.11.3 - astro: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) - es-module-lexer: 1.5.2 + acorn: 8.12.1 + astro: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) + es-module-lexer: 1.5.4 estree-util-visit: 2.0.0 - github-slugger: 2.0.0 gray-matter: 4.0.3 - hast-util-to-html: 9.0.1 + hast-util-to-html: 9.0.2 kleur: 4.1.5 rehype-raw: 7.0.0 remark-gfm: 4.0.0 - remark-smartypants: 2.1.0 + remark-smartypants: 3.0.2 source-map: 0.7.4 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 transitivePeerDependencies: - supports-color @@ -11486,41 +13291,43 @@ snapshots: dependencies: prismjs: 1.29.0 - '@astrojs/sitemap@3.1.4': + '@astrojs/sitemap@3.1.6': dependencies: - sitemap: 7.1.1 + sitemap: 7.1.2 stream-replace-string: 2.0.0 zod: 3.23.8 - '@astrojs/starlight@0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5))': + '@astrojs/starlight@0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5))': dependencies: - '@astrojs/mdx': 2.3.1(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) - '@astrojs/sitemap': 3.1.4 + '@astrojs/mdx': 3.1.6(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) + '@astrojs/sitemap': 3.1.6 '@pagefind/default-ui': 1.1.0 '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - astro: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) - astro-expressive-code: 0.35.3(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) + astro: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) + astro-expressive-code: 0.35.6(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) bcp-47: 2.1.0 hast-util-from-html: 2.0.1 hast-util-select: 6.0.2 hast-util-to-string: 3.0.0 - hastscript: 8.0.0 + hastscript: 9.0.0 mdast-util-directive: 3.0.0 mdast-util-to-markdown: 2.1.0 + mdast-util-to-string: 4.0.0 pagefind: 1.1.0 rehype: 13.0.1 + rehype-format: 5.0.0 remark-directive: 3.0.0 - unified: 11.0.4 + unified: 11.0.5 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 transitivePeerDependencies: - supports-color '@astrojs/telemetry@3.1.0': dependencies: ci-info: 4.0.0 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) dlv: 1.1.3 dset: 3.1.3 is-docker: 3.0.0 @@ -11529,23 +13336,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@aw-web-design/x-default-browser@1.4.126': + '@astrojs/yaml2ts@0.2.1': dependencies: - default-browser-id: 3.0.0 + yaml: 2.5.1 - '@aws-crypto/crc32@3.0.0': + '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 tslib: 1.14.1 - '@aws-crypto/crc32c@3.0.0': + '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 tslib: 1.14.1 - '@aws-crypto/ie11-detection@3.0.0': + '@aws-crypto/sha1-browser@5.2.0': dependencies: tslib: 1.14.1 @@ -11554,71 +13361,83 @@ snapshots: '@aws-crypto/ie11-detection': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@aws-sdk/util-locate-window': 3.568.0 - '@aws-sdk/util-utf8-browser': 3.259.0 - tslib: 1.14.1 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 - '@aws-crypto/sha256-browser@3.0.0': + '@aws-crypto/sha256-browser@5.2.0': dependencies: '@aws-crypto/ie11-detection': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@aws-sdk/util-locate-window': 3.568.0 - '@aws-sdk/util-utf8-browser': 3.259.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 + + '@aws-crypto/sha256-js@1.2.2': + dependencies: + '@aws-crypto/util': 1.2.2 + '@aws-sdk/types': 3.577.0 tslib: 1.14.1 '@aws-crypto/sha256-js@3.0.0': dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 tslib: 1.14.1 - '@aws-crypto/supports-web-crypto@3.0.0': + '@aws-crypto/supports-web-crypto@5.2.0': dependencies: + tslib: 2.6.3 + + '@aws-crypto/util@1.2.2': + dependencies: + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 '@aws-crypto/util@3.0.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 - '@aws-sdk/client-s3@3.575.0': + '@aws-sdk/client-s3@3.577.0': dependencies: '@aws-crypto/sha1-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.575.0(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/client-sts': 3.575.0 - '@aws-sdk/core': 3.575.0 - '@aws-sdk/credential-provider-node': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/middleware-bucket-endpoint': 3.575.0 - '@aws-sdk/middleware-expect-continue': 3.575.0 - '@aws-sdk/middleware-flexible-checksums': 3.575.0 - '@aws-sdk/middleware-host-header': 3.575.0 - '@aws-sdk/middleware-location-constraint': 3.575.0 - '@aws-sdk/middleware-logger': 3.575.0 - '@aws-sdk/middleware-recursion-detection': 3.575.0 - '@aws-sdk/middleware-sdk-s3': 3.575.0 - '@aws-sdk/middleware-signing': 3.575.0 - '@aws-sdk/middleware-ssec': 3.575.0 - '@aws-sdk/middleware-user-agent': 3.575.0 - '@aws-sdk/region-config-resolver': 3.575.0 - '@aws-sdk/signature-v4-multi-region': 3.575.0 - '@aws-sdk/types': 3.575.0 - '@aws-sdk/util-endpoints': 3.575.0 - '@aws-sdk/util-user-agent-browser': 3.575.0 - '@aws-sdk/util-user-agent-node': 3.575.0 + '@aws-sdk/client-sso-oidc': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/client-sts': 3.577.0 + '@aws-sdk/core': 3.576.0 + '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/middleware-bucket-endpoint': 3.577.0 + '@aws-sdk/middleware-expect-continue': 3.577.0 + '@aws-sdk/middleware-flexible-checksums': 3.577.0 + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-location-constraint': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-sdk-s3': 3.577.0 + '@aws-sdk/middleware-signing': 3.577.0 + '@aws-sdk/middleware-ssec': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.577.0 + '@aws-sdk/region-config-resolver': 3.577.0 + '@aws-sdk/signature-v4-multi-region': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.577.0 '@aws-sdk/xml-builder': 3.575.0 '@smithy/config-resolver': 3.0.0 - '@smithy/core': 2.0.0 + '@smithy/core': 2.0.1 '@smithy/eventstream-serde-browser': 3.0.0 '@smithy/eventstream-serde-config-resolver': 3.0.0 '@smithy/eventstream-serde-node': 3.0.0 - '@smithy/fetch-http-handler': 3.0.0 + '@smithy/fetch-http-handler': 3.0.1 '@smithy/hash-blob-browser': 3.0.0 '@smithy/hash-node': 3.0.0 '@smithy/hash-stream-node': 3.0.0 @@ -11626,200 +13445,199 @@ snapshots: '@smithy/md5-js': 3.0.0 '@smithy/middleware-content-length': 3.0.0 '@smithy/middleware-endpoint': 3.0.0 - '@smithy/middleware-retry': 3.0.0 + '@smithy/middleware-retry': 3.0.1 '@smithy/middleware-serde': 3.0.0 '@smithy/middleware-stack': 3.0.0 '@smithy/node-config-provider': 3.0.0 '@smithy/node-http-handler': 3.0.0 '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/url-parser': 3.0.0 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.0 - '@smithy/util-defaults-mode-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.1 + '@smithy/util-defaults-mode-node': 3.0.1 '@smithy/util-endpoints': 2.0.0 '@smithy/util-retry': 3.0.0 - '@smithy/util-stream': 3.0.0 + '@smithy/util-stream': 3.0.1 '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.0.0 - tslib: 2.6.2 + '@smithy/util-waiter': 3.1.2 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.575.0(@aws-sdk/client-sts@3.575.0)': + '@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.575.0 - '@aws-sdk/core': 3.575.0 - '@aws-sdk/credential-provider-node': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/middleware-host-header': 3.575.0 - '@aws-sdk/middleware-logger': 3.575.0 - '@aws-sdk/middleware-recursion-detection': 3.575.0 - '@aws-sdk/middleware-user-agent': 3.575.0 - '@aws-sdk/region-config-resolver': 3.575.0 - '@aws-sdk/types': 3.575.0 - '@aws-sdk/util-endpoints': 3.575.0 - '@aws-sdk/util-user-agent-browser': 3.575.0 - '@aws-sdk/util-user-agent-node': 3.575.0 + '@aws-sdk/client-sts': 3.577.0 + '@aws-sdk/core': 3.576.0 + '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.577.0 + '@aws-sdk/region-config-resolver': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.577.0 '@smithy/config-resolver': 3.0.0 - '@smithy/core': 2.0.0 - '@smithy/fetch-http-handler': 3.0.0 + '@smithy/core': 2.0.1 + '@smithy/fetch-http-handler': 3.0.1 '@smithy/hash-node': 3.0.0 '@smithy/invalid-dependency': 3.0.0 '@smithy/middleware-content-length': 3.0.0 '@smithy/middleware-endpoint': 3.0.0 - '@smithy/middleware-retry': 3.0.0 + '@smithy/middleware-retry': 3.0.1 '@smithy/middleware-serde': 3.0.0 '@smithy/middleware-stack': 3.0.0 '@smithy/node-config-provider': 3.0.0 '@smithy/node-http-handler': 3.0.0 '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/url-parser': 3.0.0 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.0 - '@smithy/util-defaults-mode-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.1 + '@smithy/util-defaults-mode-node': 3.0.1 '@smithy/util-endpoints': 2.0.0 '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/client-sso@3.575.0': + '@aws-sdk/client-sso@3.577.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.575.0 - '@aws-sdk/middleware-host-header': 3.575.0 - '@aws-sdk/middleware-logger': 3.575.0 - '@aws-sdk/middleware-recursion-detection': 3.575.0 - '@aws-sdk/middleware-user-agent': 3.575.0 - '@aws-sdk/region-config-resolver': 3.575.0 - '@aws-sdk/types': 3.575.0 - '@aws-sdk/util-endpoints': 3.575.0 - '@aws-sdk/util-user-agent-browser': 3.575.0 - '@aws-sdk/util-user-agent-node': 3.575.0 + '@aws-sdk/core': 3.576.0 + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.577.0 + '@aws-sdk/region-config-resolver': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.577.0 '@smithy/config-resolver': 3.0.0 - '@smithy/core': 2.0.0 - '@smithy/fetch-http-handler': 3.0.0 + '@smithy/core': 2.0.1 + '@smithy/fetch-http-handler': 3.0.1 '@smithy/hash-node': 3.0.0 '@smithy/invalid-dependency': 3.0.0 '@smithy/middleware-content-length': 3.0.0 '@smithy/middleware-endpoint': 3.0.0 - '@smithy/middleware-retry': 3.0.0 + '@smithy/middleware-retry': 3.0.1 '@smithy/middleware-serde': 3.0.0 '@smithy/middleware-stack': 3.0.0 '@smithy/node-config-provider': 3.0.0 '@smithy/node-http-handler': 3.0.0 '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/url-parser': 3.0.0 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.0 - '@smithy/util-defaults-mode-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.1 + '@smithy/util-defaults-mode-node': 3.0.1 '@smithy/util-endpoints': 2.0.0 '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.575.0': + '@aws-sdk/client-sts@3.577.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.575.0(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/core': 3.575.0 - '@aws-sdk/credential-provider-node': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/middleware-host-header': 3.575.0 - '@aws-sdk/middleware-logger': 3.575.0 - '@aws-sdk/middleware-recursion-detection': 3.575.0 - '@aws-sdk/middleware-user-agent': 3.575.0 - '@aws-sdk/region-config-resolver': 3.575.0 - '@aws-sdk/types': 3.575.0 - '@aws-sdk/util-endpoints': 3.575.0 - '@aws-sdk/util-user-agent-browser': 3.575.0 - '@aws-sdk/util-user-agent-node': 3.575.0 + '@aws-sdk/client-sso-oidc': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/core': 3.576.0 + '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.577.0 + '@aws-sdk/region-config-resolver': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.577.0 '@smithy/config-resolver': 3.0.0 - '@smithy/core': 2.0.0 - '@smithy/fetch-http-handler': 3.0.0 + '@smithy/core': 2.0.1 + '@smithy/fetch-http-handler': 3.0.1 '@smithy/hash-node': 3.0.0 '@smithy/invalid-dependency': 3.0.0 '@smithy/middleware-content-length': 3.0.0 '@smithy/middleware-endpoint': 3.0.0 - '@smithy/middleware-retry': 3.0.0 + '@smithy/middleware-retry': 3.0.1 '@smithy/middleware-serde': 3.0.0 '@smithy/middleware-stack': 3.0.0 '@smithy/node-config-provider': 3.0.0 '@smithy/node-http-handler': 3.0.0 '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/url-parser': 3.0.0 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.0 - '@smithy/util-defaults-mode-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.1 + '@smithy/util-defaults-mode-node': 3.0.1 '@smithy/util-endpoints': 2.0.0 '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.575.0': + '@aws-sdk/core@3.576.0': dependencies: - '@smithy/core': 2.0.0 + '@smithy/core': 2.0.1 '@smithy/protocol-http': 4.0.0 '@smithy/signature-v4': 3.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 fast-xml-parser: 4.2.5 - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/credential-provider-env@3.575.0': + '@aws-sdk/credential-provider-env@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/credential-provider-http@3.575.0': + '@aws-sdk/credential-provider-http@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 - '@smithy/fetch-http-handler': 3.0.0 + '@aws-sdk/types': 3.577.0 + '@smithy/fetch-http-handler': 3.0.1 '@smithy/node-http-handler': 3.0.0 '@smithy/property-provider': 3.0.0 '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 - '@smithy/util-stream': 3.0.0 + '@smithy/util-stream': 3.0.1 tslib: 2.6.2 - '@aws-sdk/credential-provider-ini@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0)': + '@aws-sdk/credential-provider-ini@3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0)': dependencies: - '@aws-sdk/client-sts': 3.575.0 - '@aws-sdk/credential-provider-env': 3.575.0 - '@aws-sdk/credential-provider-process': 3.575.0 - '@aws-sdk/credential-provider-sso': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) - '@aws-sdk/credential-provider-web-identity': 3.575.0(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/types': 3.575.0 + '@aws-sdk/client-sts': 3.577.0 + '@aws-sdk/credential-provider-env': 3.577.0 + '@aws-sdk/credential-provider-process': 3.577.0 + '@aws-sdk/credential-provider-sso': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0) + '@aws-sdk/credential-provider-web-identity': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.0.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 @@ -11829,15 +13647,15 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-node@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0)': + '@aws-sdk/credential-provider-node@3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0)': dependencies: - '@aws-sdk/credential-provider-env': 3.575.0 - '@aws-sdk/credential-provider-http': 3.575.0 - '@aws-sdk/credential-provider-ini': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/credential-provider-process': 3.575.0 - '@aws-sdk/credential-provider-sso': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) - '@aws-sdk/credential-provider-web-identity': 3.575.0(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/types': 3.575.0 + '@aws-sdk/credential-provider-env': 3.577.0 + '@aws-sdk/credential-provider-http': 3.577.0 + '@aws-sdk/credential-provider-ini': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/credential-provider-process': 3.577.0 + '@aws-sdk/credential-provider-sso': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0) + '@aws-sdk/credential-provider-web-identity': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.0.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 @@ -11848,19 +13666,19 @@ snapshots: - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-process@3.575.0': + '@aws-sdk/credential-provider-process@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/credential-provider-sso@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)': + '@aws-sdk/credential-provider-sso@3.577.0(@aws-sdk/client-sso-oidc@3.577.0)': dependencies: - '@aws-sdk/client-sso': 3.575.0 - '@aws-sdk/token-providers': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) - '@aws-sdk/types': 3.575.0 + '@aws-sdk/client-sso': 3.577.0 + '@aws-sdk/token-providers': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0) + '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 '@smithy/types': 3.0.0 @@ -11869,94 +13687,94 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-web-identity@3.575.0(@aws-sdk/client-sts@3.575.0)': + '@aws-sdk/credential-provider-web-identity@3.577.0(@aws-sdk/client-sts@3.577.0)': dependencies: - '@aws-sdk/client-sts': 3.575.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/client-sts': 3.577.0 + '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/lib-storage@3.575.0(@aws-sdk/client-s3@3.575.0)': + '@aws-sdk/lib-storage@3.578.0(@aws-sdk/client-s3@3.577.0)': dependencies: - '@aws-sdk/client-s3': 3.575.0 + '@aws-sdk/client-s3': 3.577.0 '@smithy/abort-controller': 3.0.0 '@smithy/middleware-endpoint': 3.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/middleware-bucket-endpoint@3.575.0': + '@aws-sdk/middleware-bucket-endpoint@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@aws-sdk/util-arn-parser': 3.568.0 - '@smithy/node-config-provider': 3.0.0 - '@smithy/protocol-http': 4.0.0 - '@smithy/types': 3.0.0 + '@smithy/node-config-provider': 3.1.3 + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 '@smithy/util-config-provider': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/middleware-expect-continue@3.575.0': + '@aws-sdk/middleware-expect-continue@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-flexible-checksums@3.575.0': + '@aws-sdk/middleware-flexible-checksums@3.577.0': dependencies: '@aws-crypto/crc32': 3.0.0 '@aws-crypto/crc32c': 3.0.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/is-array-buffer': 3.0.0 - '@smithy/protocol-http': 4.0.0 - '@smithy/types': 3.0.0 + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/middleware-host-header@3.575.0': + '@aws-sdk/middleware-host-header@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-location-constraint@3.575.0': + '@aws-sdk/middleware-location-constraint@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-logger@3.575.0': + '@aws-sdk/middleware-logger@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-recursion-detection@3.575.0': + '@aws-sdk/middleware-recursion-detection@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-sdk-s3@3.575.0': + '@aws-sdk/middleware-sdk-s3@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@aws-sdk/util-arn-parser': 3.568.0 '@smithy/node-config-provider': 3.0.0 '@smithy/protocol-http': 4.0.0 '@smithy/signature-v4': 3.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/util-config-provider': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/middleware-signing@3.575.0': + '@aws-sdk/middleware-signing@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/protocol-http': 4.0.0 '@smithy/signature-v4': 3.0.0 @@ -11964,915 +13782,1045 @@ snapshots: '@smithy/util-middleware': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-ssec@3.575.0': + '@aws-sdk/middleware-ssec@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-user-agent@3.575.0': + '@aws-sdk/middleware-user-agent@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 - '@aws-sdk/util-endpoints': 3.575.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/region-config-resolver@3.575.0': + '@aws-sdk/region-config-resolver@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/node-config-provider': 3.0.0 '@smithy/types': 3.0.0 '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.0 - tslib: 2.6.2 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 - '@aws-sdk/signature-v4-multi-region@3.575.0': + '@aws-sdk/signature-v4-multi-region@3.577.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.575.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/middleware-sdk-s3': 3.577.0 + '@aws-sdk/types': 3.577.0 '@smithy/protocol-http': 4.0.0 '@smithy/signature-v4': 3.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/token-providers@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)': + '@aws-sdk/token-providers@3.577.0(@aws-sdk/client-sso-oidc@3.577.0)': dependencies: - '@aws-sdk/client-sso-oidc': 3.575.0(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/types': 3.575.0 + '@aws-sdk/client-sso-oidc': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/types@3.575.0': + '@aws-sdk/types@3.577.0': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 '@aws-sdk/util-arn-parser@3.568.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/util-endpoints@3.575.0': + '@aws-sdk/util-endpoints@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/types': 3.0.0 '@smithy/util-endpoints': 2.0.0 tslib: 2.6.2 '@aws-sdk/util-locate-window@3.568.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/util-user-agent-browser@3.575.0': + '@aws-sdk/util-user-agent-browser@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/types': 3.0.0 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/util-user-agent-node@3.575.0': + '@aws-sdk/util-user-agent-node@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/node-config-provider': 3.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/util-utf8-browser@3.259.0': + '@aws-sdk/xml-builder@3.598.0': dependencies: - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@aws-sdk/xml-builder@3.575.0': + '@babel/code-frame@7.24.7': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/code-frame@7.23.5': + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 '@babel/code-frame@7.24.2': dependencies: '@babel/highlight': 7.24.5 picocolors: 1.0.0 - '@babel/compat-data@7.24.4': {} + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.0 + + '@babel/compat-data@7.25.4': {} - '@babel/core@7.24.5': + '@babel/core@7.25.2': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.24.5': + '@babel/generator@7.25.6': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/helper-annotate-as-pure@7.22.5': + '@babel/helper-annotate-as-pure@7.24.7': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 - '@babel/helper-compilation-targets@7.23.6': + '@babel/helper-compilation-targets@7.25.2': dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5)': + '@babel/helper-create-class-features-plugin@7.23.10(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.24.5 + '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.25.2) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.24.5 semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.5)': + '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 regexpu-core: 5.3.2 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.5)': + '@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - debug: 4.3.4 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + debug: 4.3.7(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: - supports-color - '@babel/helper-environment-visitor@7.22.20': {} + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 - '@babel/helper-function-name@7.23.0': + '@babel/helper-function-name@7.24.7': dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 - '@babel/helper-hoist-variables@7.22.5': + '@babel/helper-member-expression-to-functions@7.23.0': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 - '@babel/helper-member-expression-to-functions@7.24.5': + '@babel/helper-module-imports@7.22.15': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.23.9 - '@babel/helper-module-imports@7.24.3': + '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color - '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color '@babel/helper-optimise-call-expression@7.22.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 - '@babel/helper-plugin-utils@7.24.5': {} + '@babel/helper-plugin-utils@7.24.8': {} - '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5)': + '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.24.5 + '@babel/helper-wrap-function': 7.22.20 - '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5)': + '@babel/helper-replace-supers@7.22.20(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.24.5 + '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-simple-access@7.24.5': + '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.22.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 '@babel/helper-split-export-declaration@7.24.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 + + '@babel/helper-string-parser@7.23.4': {} + + '@babel/helper-string-parser@7.24.8': {} - '@babel/helper-string-parser@7.24.1': {} + '@babel/helper-validator-identifier@7.22.20': {} '@babel/helper-validator-identifier@7.24.5': {} - '@babel/helper-validator-option@7.23.5': {} + '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helper-wrap-function@7.24.5': + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helper-wrap-function@7.22.20': dependencies: '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + + '@babel/helpers@7.25.6': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + + '@babel/highlight@7.23.4': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-plugin-utils@7.24.7': {} + + '@babel/helper-remap-async-to-generator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-wrap-function': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.7 + '@babel/helper-optimise-call-expression': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.24.7 - '@babel/helpers@7.24.5': + '@babel/helper-string-parser@7.24.7': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.7': {} + + '@babel/helper-wrap-function@7.24.7': dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/helper-function-name': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color - '@babel/highlight@7.24.5': + '@babel/helpers@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/highlight@7.24.7': dependencies: - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 + '@babel/parser@7.23.9': + dependencies: + '@babel/types': 7.23.9 + '@babel/parser@7.24.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.24.5)': + '@babel/parser@7.25.6': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/types': 7.25.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.25.2) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.24.5)': + '@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.5)': + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-proposal-export-default-from@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-proposal-export-default-from@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-export-default-from': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.25.2) - '@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.24.5)': + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.5)': + '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.24.5)': + '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.25.2) - '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.5)': + '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.25.2)': dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.24.5)': + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - - '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-export-default-from@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-export-default-from@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-flow@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.5)': + '@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.5)': + '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-classes@7.23.8(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.25.2) '@babel/helper-split-export-declaration': 7.24.5 globals: 11.12.0 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/template': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/template': 7.25.0 - '@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.25.2) - '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-for-of@7.23.6(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-literals@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-simple-access': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-systemjs@7.23.9(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.5)': + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.25.2) - '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.25.2) - '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-react-jsx-self@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.5)': + '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/types': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 regenerator-transform: 0.15.2 - '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-runtime@7.24.3(@babel/core@7.24.5)': + '@babel/plugin-transform-runtime@7.23.9(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.5) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.25.2) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-spread@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-typescript@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) - - '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/preset-env@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.5) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.5) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-object-rest-spread': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typeof-symbol': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.5) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.5) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.0 + '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-typescript@7.23.6(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.25.2) + + '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/preset-env@7.23.9(@babel/core@7.25.2)': + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.25.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-modules-systemjs': 7.23.9(@babel/core@7.25.2) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.25.2) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.25.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.25.2) + core-js-compat: 3.36.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.24.1(@babel/core@7.24.5)': + '@babel/preset-flow@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.25.2) - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/types': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/types': 7.25.6 esutils: 2.0.3 - '@babel/preset-typescript@7.24.1(@babel/core@7.24.5)': + '@babel/preset-typescript@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typescript': 7.24.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - '@babel/register@7.23.7(@babel/core@7.24.5)': + '@babel/register@7.23.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -12881,35 +14829,38 @@ snapshots: '@babel/regjsgen@0.8.0': {} - '@babel/runtime@7.24.5': + '@babel/runtime@7.23.9': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.24.0': + '@babel/template@7.25.0': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 - '@babel/traverse@7.24.5': + '@babel/traverse@7.25.6': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - debug: 4.3.4 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + debug: 4.3.7(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.24.5': + '@babel/types@7.23.9': + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@babel/types@7.25.6': dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 '@bcoe/v8-coverage@0.2.3': {} @@ -12920,12 +14871,168 @@ snapshots: dependencies: '@chainsafe/is-ip': 2.0.2 - '@chromatic-com/storybook@1.3.4(react@18.3.1)': + '@changesets/apply-release-plan@7.0.5': + dependencies: + '@changesets/config': 3.0.3 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.1 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.6.2 + + '@changesets/assemble-release-plan@6.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.6.2 + + '@changesets/changelog-git@0.2.0': + dependencies: + '@changesets/types': 6.0.0 + + '@changesets/cli@2.27.8': + dependencies: + '@changesets/apply-release-plan': 7.0.5 + '@changesets/assemble-release-plan': 6.0.4 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.3 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-release-plan': 4.0.4 + '@changesets/git': 3.0.1 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.1 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.2 + '@manypkg/get-packages': 1.1.3 + '@types/semver': 7.5.7 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + mri: 1.2.0 + outdent: 0.5.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.0 + picocolors: 1.1.0 + resolve-from: 5.0.0 + semver: 7.6.2 + spawndamnit: 2.0.0 + term-size: 2.2.1 + + '@changesets/config@3.0.3': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.5 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.2': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.0 + semver: 7.6.2 + + '@changesets/get-release-plan@4.0.4': + dependencies: + '@changesets/assemble-release-plan': 6.0.4 + '@changesets/config': 3.0.3 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.1': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.5 + spawndamnit: 2.0.0 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.0 + + '@changesets/parse@0.4.0': + dependencies: + '@changesets/types': 6.0.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.1': + dependencies: + '@changesets/git': 3.0.1 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.0 + + '@changesets/should-skip-package@0.1.1': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.0.0': {} + + '@changesets/write@0.3.2': + dependencies: + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.8 + + '@chromatic-com/storybook@1.3.3(react@18.2.0)': + dependencies: + chromatic: 11.3.0 + filesize: 10.1.1 + jsonfile: 6.1.0 + react-confetti: 6.1.0(react@18.2.0) + strip-ansi: 7.1.0 + transitivePeerDependencies: + - '@chromatic-com/cypress' + - '@chromatic-com/playwright' + - react + + '@chromatic-com/storybook@1.9.0(react@18.2.0)': dependencies: - chromatic: 11.3.2 + chromatic: 11.10.2 filesize: 10.1.1 jsonfile: 6.1.0 - react-confetti: 6.1.0(react@18.3.1) + react-confetti: 6.1.0(react@18.2.0) strip-ansi: 7.1.0 transitivePeerDependencies: - '@chromatic-com/cypress' @@ -12941,7 +15048,7 @@ snapshots: eth-json-rpc-filters: 6.0.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.21.0 + preact: 10.19.5 sha.js: 2.4.11 transitivePeerDependencies: - supports-color @@ -12955,39 +15062,36 @@ snapshots: eth-json-rpc-filters: 6.0.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.21.0 + preact: 10.19.5 sha.js: 2.4.11 transitivePeerDependencies: - supports-color - '@coinbase/wallet-sdk@4.0.2': + '@coinbase/wallet-sdk@4.0.4': dependencies: buffer: 6.0.3 clsx: 1.2.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.21.0 + preact: 10.19.5 sha.js: 2.4.11 - '@colors/colors@1.5.0': - optional: true + '@colors/colors@1.5.0': {} '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.0.16)': + '@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.0.15)': dependencies: - postcss-selector-parser: 6.0.16 + postcss-selector-parser: 6.0.15 - '@csstools/selector-specificity@3.0.3(postcss-selector-parser@6.0.16)': + '@csstools/selector-specificity@3.0.2(postcss-selector-parser@6.0.15)': dependencies: - postcss-selector-parser: 6.0.16 + postcss-selector-parser: 6.0.15 '@ctrl/tinycolor@4.1.0': {} - '@discoveryjs/json-ext@0.5.7': {} - '@emmetio/abbreviation@2.3.3': dependencies: '@emmetio/scanner': 1.0.4 @@ -12996,16 +15100,102 @@ snapshots: dependencies: '@emmetio/scanner': 1.0.4 + '@emmetio/css-parser@0.4.0': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + '@emmetio/scanner@1.0.4': {} + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} + '@emnapi/runtime@1.1.1': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 optional: true - '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1)': + '@emotion/babel-plugin@11.11.0': dependencies: - react: 18.3.1 + '@babel/helper-module-imports': 7.22.15 + '@babel/runtime': 7.23.9 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + + '@emotion/cache@11.11.0': + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + + '@emotion/hash@0.9.1': {} + + '@emotion/is-prop-valid@1.2.1': + dependencies: + '@emotion/memoize': 0.8.1 + + '@emotion/memoize@0.8.1': {} + + '@emotion/react@11.11.3(@types/react@18.3.5)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.5 + + '@emotion/serialize@1.1.3': + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + + '@emotion/sheet@1.2.2': {} + + '@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.3.5)(react@18.2.0))(@types/react@18.3.5)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@emotion/babel-plugin': 11.11.0 + '@emotion/is-prop-valid': 1.2.1 + '@emotion/react': 11.11.3(@types/react@18.3.5)(react@18.2.0) + '@emotion/serialize': 1.1.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.5 + + '@emotion/unitless@0.8.1': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@emotion/utils@1.2.1': {} + + '@emotion/weak-memoize@0.3.1': {} '@esbuild/aix-ppc64@0.19.12': optional: true @@ -13013,7 +15203,10 @@ snapshots: '@esbuild/aix-ppc64@0.20.2': optional: true - '@esbuild/aix-ppc64@0.21.2': + '@esbuild/aix-ppc64@0.21.3': + optional: true + + '@esbuild/aix-ppc64@0.21.5': optional: true '@esbuild/android-arm64@0.18.20': @@ -13025,7 +15218,10 @@ snapshots: '@esbuild/android-arm64@0.20.2': optional: true - '@esbuild/android-arm64@0.21.2': + '@esbuild/android-arm64@0.21.3': + optional: true + + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm@0.18.20': @@ -13037,7 +15233,10 @@ snapshots: '@esbuild/android-arm@0.20.2': optional: true - '@esbuild/android-arm@0.21.2': + '@esbuild/android-arm@0.21.3': + optional: true + + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-x64@0.18.20': @@ -13049,7 +15248,10 @@ snapshots: '@esbuild/android-x64@0.20.2': optional: true - '@esbuild/android-x64@0.21.2': + '@esbuild/android-x64@0.21.3': + optional: true + + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/darwin-arm64@0.18.20': @@ -13061,7 +15263,10 @@ snapshots: '@esbuild/darwin-arm64@0.20.2': optional: true - '@esbuild/darwin-arm64@0.21.2': + '@esbuild/darwin-arm64@0.21.3': + optional: true + + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-x64@0.18.20': @@ -13073,7 +15278,10 @@ snapshots: '@esbuild/darwin-x64@0.20.2': optional: true - '@esbuild/darwin-x64@0.21.2': + '@esbuild/darwin-x64@0.21.3': + optional: true + + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.18.20': @@ -13085,7 +15293,10 @@ snapshots: '@esbuild/freebsd-arm64@0.20.2': optional: true - '@esbuild/freebsd-arm64@0.21.2': + '@esbuild/freebsd-arm64@0.21.3': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-x64@0.18.20': @@ -13097,7 +15308,10 @@ snapshots: '@esbuild/freebsd-x64@0.20.2': optional: true - '@esbuild/freebsd-x64@0.21.2': + '@esbuild/freebsd-x64@0.21.3': + optional: true + + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/linux-arm64@0.18.20': @@ -13109,7 +15323,10 @@ snapshots: '@esbuild/linux-arm64@0.20.2': optional: true - '@esbuild/linux-arm64@0.21.2': + '@esbuild/linux-arm64@0.21.3': + optional: true + + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm@0.18.20': @@ -13121,7 +15338,10 @@ snapshots: '@esbuild/linux-arm@0.20.2': optional: true - '@esbuild/linux-arm@0.21.2': + '@esbuild/linux-arm@0.21.3': + optional: true + + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-ia32@0.18.20': @@ -13133,7 +15353,10 @@ snapshots: '@esbuild/linux-ia32@0.20.2': optional: true - '@esbuild/linux-ia32@0.21.2': + '@esbuild/linux-ia32@0.21.3': + optional: true + + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-loong64@0.18.20': @@ -13145,7 +15368,10 @@ snapshots: '@esbuild/linux-loong64@0.20.2': optional: true - '@esbuild/linux-loong64@0.21.2': + '@esbuild/linux-loong64@0.21.3': + optional: true + + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-mips64el@0.18.20': @@ -13157,7 +15383,10 @@ snapshots: '@esbuild/linux-mips64el@0.20.2': optional: true - '@esbuild/linux-mips64el@0.21.2': + '@esbuild/linux-mips64el@0.21.3': + optional: true + + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-ppc64@0.18.20': @@ -13169,7 +15398,10 @@ snapshots: '@esbuild/linux-ppc64@0.20.2': optional: true - '@esbuild/linux-ppc64@0.21.2': + '@esbuild/linux-ppc64@0.21.3': + optional: true + + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-riscv64@0.18.20': @@ -13181,7 +15413,10 @@ snapshots: '@esbuild/linux-riscv64@0.20.2': optional: true - '@esbuild/linux-riscv64@0.21.2': + '@esbuild/linux-riscv64@0.21.3': + optional: true + + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-s390x@0.18.20': @@ -13193,7 +15428,10 @@ snapshots: '@esbuild/linux-s390x@0.20.2': optional: true - '@esbuild/linux-s390x@0.21.2': + '@esbuild/linux-s390x@0.21.3': + optional: true + + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-x64@0.18.20': @@ -13205,7 +15443,10 @@ snapshots: '@esbuild/linux-x64@0.20.2': optional: true - '@esbuild/linux-x64@0.21.2': + '@esbuild/linux-x64@0.21.3': + optional: true + + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.18.20': @@ -13217,7 +15458,10 @@ snapshots: '@esbuild/netbsd-x64@0.20.2': optional: true - '@esbuild/netbsd-x64@0.21.2': + '@esbuild/netbsd-x64@0.21.3': + optional: true + + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.18.20': @@ -13229,7 +15473,10 @@ snapshots: '@esbuild/openbsd-x64@0.20.2': optional: true - '@esbuild/openbsd-x64@0.21.2': + '@esbuild/openbsd-x64@0.21.3': + optional: true + + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.18.20': @@ -13241,7 +15488,10 @@ snapshots: '@esbuild/sunos-x64@0.20.2': optional: true - '@esbuild/sunos-x64@0.21.2': + '@esbuild/sunos-x64@0.21.3': + optional: true + + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/win32-arm64@0.18.20': @@ -13253,7 +15503,10 @@ snapshots: '@esbuild/win32-arm64@0.20.2': optional: true - '@esbuild/win32-arm64@0.21.2': + '@esbuild/win32-arm64@0.21.3': + optional: true + + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-ia32@0.18.20': @@ -13265,7 +15518,10 @@ snapshots: '@esbuild/win32-ia32@0.20.2': optional: true - '@esbuild/win32-ia32@0.21.2': + '@esbuild/win32-ia32@0.21.3': + optional: true + + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-x64@0.18.20': @@ -13277,20 +15533,28 @@ snapshots: '@esbuild/win32-x64@0.20.2': optional: true - '@esbuild/win32-x64@0.21.2': + '@esbuild/win32-x64@0.21.3': + optional: true + + '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@8.55.0)': dependencies: - eslint: 8.57.0 + eslint: 8.55.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/eslint-utils@4.4.0(eslint@8.56.0)': + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} '@eslint/eslintrc@1.4.1': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -13304,7 +15568,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.5 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -13315,7 +15579,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + '@eslint/js@8.55.0': {} + + '@eslint/js@8.56.0': {} + + '@ethereumjs/common@2.6.5': + dependencies: + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 '@ethereumjs/common@3.2.0': dependencies: @@ -13324,17 +15595,22 @@ snapshots: '@ethereumjs/rlp@4.0.1': {} + '@ethereumjs/tx@3.5.2': + dependencies: + '@ethereumjs/common': 2.6.5 + ethereumjs-util: 7.1.5 + '@ethereumjs/tx@4.2.0': dependencies: '@ethereumjs/common': 3.2.0 '@ethereumjs/rlp': 4.0.1 '@ethereumjs/util': 8.1.0 - ethereum-cryptography: 2.1.3 + ethereum-cryptography: 2.2.1 '@ethereumjs/util@8.1.0': dependencies: '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.1.3 + ethereum-cryptography: 2.2.1 micro-ftch: 0.3.1 '@ethersproject/abi@5.7.0': @@ -13474,7 +15750,7 @@ snapshots: dependencies: '@ethersproject/logger': 5.7.0 - '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -13495,7 +15771,7 @@ snapshots: '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 bech32: 1.1.4 - ws: 7.4.6(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -13592,58 +15868,56 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - '@expressive-code/core@0.35.3': + '@expressive-code/core@0.35.6': dependencies: '@ctrl/tinycolor': 4.1.0 hast-util-select: 6.0.2 hast-util-to-html: 9.0.1 hast-util-to-text: 4.0.2 hastscript: 9.0.0 - postcss: 8.4.38 - postcss-nested: 6.0.1(postcss@8.4.38) + postcss: 8.4.39 + postcss-nested: 6.0.1(postcss@8.4.39) unist-util-visit: 5.0.0 unist-util-visit-parents: 6.0.1 - '@expressive-code/plugin-frames@0.35.3': + '@expressive-code/plugin-frames@0.35.6': dependencies: - '@expressive-code/core': 0.35.3 + '@expressive-code/core': 0.35.6 - '@expressive-code/plugin-shiki@0.35.3': + '@expressive-code/plugin-shiki@0.35.6': dependencies: - '@expressive-code/core': 0.35.3 - shiki: 1.5.1 + '@expressive-code/core': 0.35.6 + shiki: 1.5.2 - '@expressive-code/plugin-text-markers@0.35.3': + '@expressive-code/plugin-text-markers@0.35.6': dependencies: - '@expressive-code/core': 0.35.3 - - '@fal-works/esbuild-plugin-global-externals@2.1.2': {} + '@expressive-code/core': 0.35.6 - '@fastify/busboy@2.1.1': {} + '@fastify/busboy@2.1.0': {} - '@formatjs/ecma402-abstract@1.18.2': + '@formatjs/ecma402-abstract@2.0.0': dependencies: '@formatjs/intl-localematcher': 0.5.4 - tslib: 2.6.2 + tslib: 2.6.3 '@formatjs/fast-memoize@2.2.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@formatjs/icu-messageformat-parser@2.7.6': + '@formatjs/icu-messageformat-parser@2.7.8': dependencies: - '@formatjs/ecma402-abstract': 1.18.2 - '@formatjs/icu-skeleton-parser': 1.8.0 - tslib: 2.6.2 + '@formatjs/ecma402-abstract': 2.0.0 + '@formatjs/icu-skeleton-parser': 1.8.2 + tslib: 2.6.3 - '@formatjs/icu-skeleton-parser@1.8.0': + '@formatjs/icu-skeleton-parser@1.8.2': dependencies: - '@formatjs/ecma402-abstract': 1.18.2 - tslib: 2.6.2 + '@formatjs/ecma402-abstract': 2.0.0 + tslib: 2.6.3 '@formatjs/intl-localematcher@0.5.4': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 '@hapi/hoek@9.3.0': {} @@ -13651,9 +15925,17 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 + '@humanwhocodes/config-array@0.11.13': + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + '@humanwhocodes/config-array@0.11.14': dependencies: - '@humanwhocodes/object-schema': 2.0.3 + '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -13662,7 +15944,7 @@ snapshots: '@humanwhocodes/config-array@0.9.5': dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -13673,14 +15955,16 @@ snapshots: '@humanwhocodes/object-schema@1.2.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/object-schema@2.0.1': {} - '@img/sharp-darwin-arm64@0.33.3': + '@humanwhocodes/object-schema@2.0.2': {} + + '@img/sharp-darwin-arm64@0.33.4': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.2 optional: true - '@img/sharp-darwin-x64@0.33.3': + '@img/sharp-darwin-x64@0.33.4': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.2 optional: true @@ -13709,60 +15993,62 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64@1.0.2': optional: true - '@img/sharp-linux-arm64@0.33.3': + '@img/sharp-linux-arm64@0.33.4': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.2 optional: true - '@img/sharp-linux-arm@0.33.3': + '@img/sharp-linux-arm@0.33.4': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.2 optional: true - '@img/sharp-linux-s390x@0.33.3': + '@img/sharp-linux-s390x@0.33.4': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.2 optional: true - '@img/sharp-linux-x64@0.33.3': + '@img/sharp-linux-x64@0.33.4': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.2 optional: true - '@img/sharp-linuxmusl-arm64@0.33.3': + '@img/sharp-linuxmusl-arm64@0.33.4': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 optional: true - '@img/sharp-linuxmusl-x64@0.33.3': + '@img/sharp-linuxmusl-x64@0.33.4': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.2 optional: true - '@img/sharp-wasm32@0.33.3': + '@img/sharp-wasm32@0.33.4': dependencies: - '@emnapi/runtime': 1.1.1 + '@emnapi/runtime': 1.2.0 optional: true - '@img/sharp-win32-ia32@0.33.3': + '@img/sharp-win32-ia32@0.33.4': optional: true - '@img/sharp-win32-x64@0.33.3': + '@img/sharp-win32-x64@0.33.4': optional: true + '@ioredis/commands@1.2.0': {} + '@ipld/dag-cbor@9.2.0': dependencies: - cborg: 4.2.0 - multiformats: 13.1.0 + cborg: 4.2.2 + multiformats: 13.1.3 - '@ipld/dag-json@10.2.0': + '@ipld/dag-json@10.2.2': dependencies: - cborg: 4.2.0 - multiformats: 13.1.0 + cborg: 4.2.2 + multiformats: 13.1.3 - '@ipld/dag-pb@4.1.0': + '@ipld/dag-pb@4.1.2': dependencies: - multiformats: 13.1.0 + multiformats: 13.1.3 '@isaacs/cliui@8.0.2': dependencies: @@ -13785,7 +16071,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.11 + '@types/node': 20.12.7 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -13796,7 +16082,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.12.11 + '@types/node': 20.12.7 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -13809,7 +16095,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.12.11 + '@types/node': 20.12.7 '@types/yargs': 15.0.19 chalk: 4.1.2 @@ -13818,16 +16104,15 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.12.11 + '@types/node': 20.12.7 '@types/yargs': 17.0.32 chalk: 4.1.2 - '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462': + '@jridgewell/gen-mapping@0.3.3': dependencies: - '@vscode/l10n': 0.0.18 - vscode-languageserver-textdocument: 1.0.11 - vscode-languageserver-types: 3.17.5 - vscode-uri: 3.0.8 + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -13837,15 +16122,19 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/set-array@1.1.2': {} + '@jridgewell/set-array@1.2.1': {} - '@jridgewell/source-map@0.3.6': + '@jridgewell/source-map@0.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -13864,7 +16153,7 @@ snapshots: dependencies: '@libp2p/interface-peer-id': 2.0.2 '@libp2p/interfaces': 3.3.2 - '@multiformats/multiaddr': 12.2.1 + '@multiformats/multiaddr': 12.3.0 it-stream-types: 1.0.5 uint8arraylist: 2.4.8 @@ -13880,7 +16169,7 @@ snapshots: '@libp2p/interface-peer-info@1.0.10': dependencies: '@libp2p/interface-peer-id': 2.0.2 - '@multiformats/multiaddr': 12.2.1 + '@multiformats/multiaddr': 12.3.0 '@libp2p/interface-pubsub@3.0.7': dependencies: @@ -13890,12 +16179,12 @@ snapshots: it-pushable: 3.2.3 uint8arraylist: 2.4.8 - '@libp2p/interface@1.3.1': + '@libp2p/interface@1.3.0': dependencies: - '@multiformats/multiaddr': 12.2.1 + '@multiformats/multiaddr': 12.3.0 it-pushable: 3.2.3 it-stream-types: 2.0.1 - multiformats: 13.1.0 + multiformats: 13.1.3 progress-events: 1.0.0 uint8arraylist: 2.4.8 @@ -13904,8 +16193,8 @@ snapshots: '@libp2p/logger@2.1.1': dependencies: '@libp2p/interface-peer-id': 2.0.2 - '@multiformats/multiaddr': 12.2.1 - debug: 4.3.4 + '@multiformats/multiaddr': 12.3.0 + debug: 4.3.5 interface-datastore: 8.2.11 multiformats: 11.0.2 transitivePeerDependencies: @@ -13928,6 +16217,22 @@ snapshots: dependencies: '@lit-labs/ssr-dom-shim': 1.2.0 + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.23.9 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.23.9 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + '@mdx-js/mdx@3.0.1': dependencies: '@types/estree': 1.0.5 @@ -13948,45 +16253,76 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.0 source-map: 0.7.4 - unified: 11.0.4 + unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 transitivePeerDependencies: - supports-color - '@mdx-js/react@3.0.1(@types/react@18.3.2)(react@18.3.1)': + '@mdx-js/react@3.0.1(@types/react@18.3.5)(react@18.2.0)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 18.3.2 - react: 18.3.1 + '@types/react': 18.3.5 + react: 18.2.0 '@metamask/eth-json-rpc-provider@1.0.1': dependencies: - '@metamask/json-rpc-engine': 7.3.3 + '@metamask/json-rpc-engine': 7.3.2 '@metamask/safe-event-emitter': 3.1.1 '@metamask/utils': 5.0.2 transitivePeerDependencies: - supports-color - '@metamask/json-rpc-engine@7.3.3': + '@metamask/eth-sig-util@4.0.1': + dependencies: + ethereumjs-abi: 0.6.8 + ethereumjs-util: 6.2.1 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + + '@metamask/json-rpc-engine@7.3.2': + dependencies: + '@metamask/rpc-errors': 6.3.0 + '@metamask/safe-event-emitter': 3.1.1 + '@metamask/utils': 8.3.0 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@8.0.2': dependencies: '@metamask/rpc-errors': 6.2.1 '@metamask/safe-event-emitter': 3.1.1 - '@metamask/utils': 8.4.0 + '@metamask/utils': 8.3.0 transitivePeerDependencies: - supports-color '@metamask/json-rpc-middleware-stream@6.0.2': dependencies: - '@metamask/json-rpc-engine': 7.3.3 + '@metamask/json-rpc-engine': 7.3.2 + '@metamask/safe-event-emitter': 3.1.1 + '@metamask/utils': 8.3.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-middleware-stream@7.0.2': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 '@metamask/safe-event-emitter': 3.1.1 - '@metamask/utils': 8.4.0 + '@metamask/utils': 8.3.0 readable-stream: 3.6.2 transitivePeerDependencies: - supports-color + '@metamask/object-multiplex@1.3.0': + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + readable-stream: 2.3.8 + '@metamask/object-multiplex@2.0.0': dependencies: once: 1.4.0 @@ -13996,14 +16332,53 @@ snapshots: dependencies: bowser: 2.11.0 + '@metamask/post-message-stream@6.2.0': + dependencies: + '@metamask/utils': 5.0.2 + readable-stream: 2.3.3 + transitivePeerDependencies: + - supports-color + + '@metamask/providers@10.2.1': + dependencies: + '@metamask/object-multiplex': 1.3.0 + '@metamask/safe-event-emitter': 2.0.0 + '@types/chrome': 0.0.136 + detect-browser: 5.3.0 + eth-rpc-errors: 4.0.3 + extension-port-stream: 2.1.1 + fast-deep-equal: 2.0.1 + is-stream: 2.0.1 + json-rpc-engine: 6.1.0 + json-rpc-middleware-stream: 4.2.3 + pump: 3.0.0 + webextension-polyfill-ts: 0.25.0 + '@metamask/providers@15.0.0': dependencies: - '@metamask/json-rpc-engine': 7.3.3 + '@metamask/json-rpc-engine': 7.3.2 '@metamask/json-rpc-middleware-stream': 6.0.2 '@metamask/object-multiplex': 2.0.0 + '@metamask/rpc-errors': 6.3.0 + '@metamask/safe-event-emitter': 3.1.1 + '@metamask/utils': 8.3.0 + detect-browser: 5.3.0 + extension-port-stream: 3.0.0 + fast-deep-equal: 3.1.3 + is-stream: 2.0.1 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + transitivePeerDependencies: + - supports-color + + '@metamask/providers@16.1.0': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/json-rpc-middleware-stream': 7.0.2 + '@metamask/object-multiplex': 2.0.0 '@metamask/rpc-errors': 6.2.1 '@metamask/safe-event-emitter': 3.1.1 - '@metamask/utils': 8.4.0 + '@metamask/utils': 8.3.0 detect-browser: 5.3.0 extension-port-stream: 3.0.0 fast-deep-equal: 3.1.3 @@ -14013,9 +16388,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@metamask/rpc-errors@6.2.1': + '@metamask/rpc-errors@6.3.0': dependencies: - '@metamask/utils': 8.4.0 + '@metamask/utils': 8.3.0 fast-safe-stringify: 2.1.1 transitivePeerDependencies: - supports-color @@ -14024,62 +16399,127 @@ snapshots: '@metamask/safe-event-emitter@3.1.1': {} - '@metamask/sdk-communication-layer@0.18.5(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3))': + '@metamask/sdk-communication-layer@0.14.3(encoding@0.1.13)': dependencies: bufferutil: 4.0.8 - cross-fetch: 4.0.0(encoding@0.1.13) + cross-fetch: 3.1.8(encoding@0.1.13) date-fns: 2.30.0 - debug: 4.3.4 eciesjs: 0.3.18 eventemitter2: 6.4.9 - readable-stream: 3.6.2 - socket.io-client: 4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) + socket.io-client: 4.7.4(bufferutil@4.0.8)(utf-8-validate@6.0.3) utf-8-validate: 6.0.3 uuid: 8.3.2 transitivePeerDependencies: + - encoding - supports-color - '@metamask/sdk-communication-layer@0.20.2(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3))': + '@metamask/sdk-communication-layer@0.20.2(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: bufferutil: 4.0.8 - cross-fetch: 4.0.0(encoding@0.1.13) + cross-fetch: 4.0.0 date-fns: 2.30.0 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) eciesjs: 0.3.18 eventemitter2: 6.4.9 readable-stream: 3.6.2 - socket.io-client: 4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) + socket.io-client: 4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) utf-8-validate: 6.0.3 uuid: 8.3.2 transitivePeerDependencies: - supports-color - '@metamask/sdk-install-modal-web@0.18.5(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)': + '@metamask/sdk-communication-layer@0.28.2(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: - i18next: 22.5.1 + bufferutil: 4.0.8 + cross-fetch: 4.0.0 + date-fns: 2.30.0 + debug: 4.3.7(supports-color@8.1.1) + eciesjs: 0.3.18 + eventemitter2: 6.4.9 + readable-stream: 3.6.2 + socket.io-client: 4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + utf-8-validate: 5.0.10 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + + '@metamask/sdk-install-modal-web@0.14.1(@types/react@18.3.5)(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))': + dependencies: + '@emotion/react': 11.11.3(@types/react@18.3.5)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3(@types/react@18.3.5)(react@18.2.0))(@types/react@18.3.5)(react@18.2.0) + i18next: 22.5.1 qr-code-styling: 1.6.0-rc.1 - react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) - optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react-native - '@metamask/sdk-install-modal-web@0.20.2(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)': + '@metamask/sdk-install-modal-web@0.20.2(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)': dependencies: i18next: 22.5.1 qr-code-styling: 1.6.0-rc.1 - react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + + '@metamask/sdk-install-modal-web@0.28.1(i18next@23.11.5)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)': + dependencies: + i18next: 23.11.5 + qr-code-styling: 1.6.0-rc.1 + optionalDependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + + '@metamask/sdk@0.14.3(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10)': + dependencies: + '@metamask/onboarding': 1.0.1 + '@metamask/post-message-stream': 6.2.0 + '@metamask/providers': 10.2.1 + '@metamask/sdk-communication-layer': 0.14.3(encoding@0.1.13) + '@metamask/sdk-install-modal-web': 0.14.1(@types/react@18.3.5)(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)) + '@react-native-async-storage/async-storage': 1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)) + '@types/dom-screen-wake-lock': 1.0.3 + bowser: 2.11.0 + cross-fetch: 4.0.0(encoding@0.1.13) + eciesjs: 0.3.18 + eth-rpc-errors: 4.0.3 + eventemitter2: 6.4.9 + extension-port-stream: 2.1.1 + i18next: 22.5.1 + i18next-browser-languagedetector: 7.2.0 + obj-multiplex: 1.0.0 + pump: 3.0.0 + qrcode-terminal-nooctal: 0.12.1 + react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) + react-native-webview: 11.26.1(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) + readable-stream: 2.3.8 + rollup-plugin-visualizer: 5.12.0(rollup@4.21.3) + socket.io-client: 4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + util: 0.12.5 + uuid: 8.3.2 + optionalDependencies: + react: 18.2.0 + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - encoding + - react-dom + - rollup + - supports-color + - utf-8-validate - '@metamask/sdk@0.18.6(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(utf-8-validate@6.0.3)': + '@metamask/sdk@0.20.3(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10)': dependencies: '@metamask/onboarding': 1.0.1 '@metamask/providers': 15.0.0 - '@metamask/sdk-communication-layer': 0.18.5(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3)) - '@metamask/sdk-install-modal-web': 0.18.5(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + '@metamask/sdk-communication-layer': 0.20.2(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@metamask/sdk-install-modal-web': 0.20.2(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) '@types/dom-screen-wake-lock': 1.0.3 bowser: 2.11.0 cross-fetch: 4.0.0(encoding@0.1.13) @@ -14092,55 +16532,55 @@ snapshots: obj-multiplex: 1.0.0 pump: 3.0.0 qrcode-terminal-nooctal: 0.12.1 - react-native-webview: 11.26.1(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + react-native-webview: 11.26.1(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) readable-stream: 3.6.2 - rollup-plugin-visualizer: 5.12.0(rollup@4.17.2) - socket.io-client: 4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) + rollup-plugin-visualizer: 5.12.0(rollup@4.21.3) + socket.io-client: 4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) util: 0.12.5 uuid: 8.3.2 optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - bufferutil - encoding - react-i18next + - react-native - rollup - supports-color - utf-8-validate - '@metamask/sdk@0.20.3(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(utf-8-validate@6.0.3)': + '@metamask/sdk@0.28.2(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10)': dependencies: '@metamask/onboarding': 1.0.1 - '@metamask/providers': 15.0.0 - '@metamask/sdk-communication-layer': 0.20.2(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3)) - '@metamask/sdk-install-modal-web': 0.20.2(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + '@metamask/providers': 16.1.0 + '@metamask/sdk-communication-layer': 0.28.2(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@metamask/sdk-install-modal-web': 0.28.1(i18next@23.11.5)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) '@types/dom-screen-wake-lock': 1.0.3 + '@types/uuid': 10.0.0 bowser: 2.11.0 cross-fetch: 4.0.0(encoding@0.1.13) debug: 4.3.4 eciesjs: 0.3.18 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 - i18next: 22.5.1 + i18next: 23.11.5 i18next-browser-languagedetector: 7.1.0 obj-multiplex: 1.0.0 pump: 3.0.0 qrcode-terminal-nooctal: 0.12.1 - react-native-webview: 11.26.1(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + react-native-webview: 11.26.1(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) readable-stream: 3.6.2 - rollup-plugin-visualizer: 5.12.0(rollup@4.17.2) - socket.io-client: 4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) + rollup-plugin-visualizer: 5.12.0(rollup@4.21.3) + socket.io-client: 4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) util: 0.12.5 uuid: 8.3.2 optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - bufferutil - encoding - - react-i18next - react-native - rollup - supports-color @@ -14150,182 +16590,181 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.3.4 - semver: 7.6.2 - superstruct: 1.0.4 + debug: 4.3.7(supports-color@8.1.1) + semver: 7.6.3 + superstruct: 1.0.3 transitivePeerDependencies: - supports-color - '@metamask/utils@8.4.0': + '@metamask/utils@8.3.0': dependencies: '@ethereumjs/tx': 4.2.0 - '@noble/hashes': 1.4.0 - '@scure/base': 1.1.6 + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.8 '@types/debug': 4.1.12 - debug: 4.3.4 - pony-cause: 2.1.11 - semver: 7.6.2 - superstruct: 1.0.4 - uuid: 9.0.1 + debug: 4.3.7(supports-color@8.1.1) + pony-cause: 2.1.10 + semver: 7.6.3 + superstruct: 1.0.3 transitivePeerDependencies: - supports-color - '@moralisweb3/api-utils@2.26.1(debug@4.3.4)': + '@moralisweb3/api-utils@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) - axios: 1.6.8(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) + axios: 1.6.7(debug@4.3.4) transitivePeerDependencies: - debug - '@moralisweb3/aptos-api@2.26.1(debug@4.3.4)': + '@moralisweb3/aptos-api@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/api-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-aptos-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) + '@moralisweb3/api-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-aptos-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) transitivePeerDependencies: - debug - '@moralisweb3/auth@2.26.1(debug@4.3.4)': + '@moralisweb3/auth@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/api-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-aptos-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-auth-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-sol-utils': 2.26.1(debug@4.3.4) + '@moralisweb3/api-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-aptos-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-auth-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-sol-utils': 2.26.2(debug@4.3.4) transitivePeerDependencies: - debug - '@moralisweb3/common-aptos-utils@2.26.1(debug@4.3.4)': + '@moralisweb3/common-aptos-utils@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@noble/hashes': 1.4.0 + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@noble/hashes': 1.3.3 transitivePeerDependencies: - debug - '@moralisweb3/common-auth-utils@2.26.1(debug@4.3.4)': + '@moralisweb3/common-auth-utils@2.26.2(debug@4.3.4)': dependencies: '@ethersproject/abi': 5.7.0 - '@moralisweb3/common-aptos-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-sol-utils': 2.26.1(debug@4.3.4) + '@moralisweb3/common-aptos-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-sol-utils': 2.26.2(debug@4.3.4) '@moralisweb3/streams-typings': 1.0.7 transitivePeerDependencies: - debug - '@moralisweb3/common-core@2.26.1(debug@4.3.4)': + '@moralisweb3/common-core@2.26.2(debug@4.3.4)': dependencies: - axios: 1.6.8(debug@4.3.4) + axios: 1.6.7(debug@4.3.4) transitivePeerDependencies: - debug - '@moralisweb3/common-evm-utils@2.26.1(debug@4.3.4)': + '@moralisweb3/common-evm-utils@2.26.2(debug@4.3.4)': dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/transactions': 5.7.0 - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) transitivePeerDependencies: - debug - '@moralisweb3/common-sol-utils@2.26.1(debug@4.3.4)': + '@moralisweb3/common-sol-utils@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) bn.js: 5.2.1 bs58: 5.0.0 buffer: 6.0.3 transitivePeerDependencies: - debug - '@moralisweb3/common-streams-utils@2.26.1(debug@4.3.4)': + '@moralisweb3/common-streams-utils@2.26.2(debug@4.3.4)': dependencies: '@ethersproject/abi': 5.7.0 - '@moralisweb3/common-aptos-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) + '@moralisweb3/common-aptos-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) '@moralisweb3/streams-typings': 1.0.7 transitivePeerDependencies: - debug - '@moralisweb3/evm-api@2.26.1(debug@4.3.4)': + '@moralisweb3/evm-api@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/api-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) + '@moralisweb3/api-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) transitivePeerDependencies: - debug - '@moralisweb3/sol-api@2.26.1(debug@4.3.4)': + '@moralisweb3/sol-api@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/api-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-sol-utils': 2.26.1(debug@4.3.4) + '@moralisweb3/api-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-sol-utils': 2.26.2(debug@4.3.4) transitivePeerDependencies: - debug '@moralisweb3/streams-typings@1.0.7': {} - '@moralisweb3/streams@2.26.1(debug@4.3.4)': + '@moralisweb3/streams@2.26.2(debug@4.3.4)': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/bignumber': 5.7.0 '@ethersproject/sha2': 5.7.0 '@ethersproject/strings': 5.7.0 - '@moralisweb3/api-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-streams-utils': 2.26.1(debug@4.3.4) + '@moralisweb3/api-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-streams-utils': 2.26.2(debug@4.3.4) '@moralisweb3/streams-typings': 1.0.7 ethereumjs-util: 7.1.5 web3-eth-abi: 1.10.4 transitivePeerDependencies: - debug - '@motionone/animation@10.17.0': + '@motionone/animation@10.16.3': dependencies: - '@motionone/easing': 10.17.0 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 + '@motionone/easing': 10.16.3 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 tslib: 2.6.2 - '@motionone/dom@10.17.0': + '@motionone/dom@10.16.4': dependencies: - '@motionone/animation': 10.17.0 - '@motionone/generators': 10.17.0 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 + '@motionone/animation': 10.16.3 + '@motionone/generators': 10.16.4 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 hey-listen: 1.0.8 - tslib: 2.6.2 + tslib: 2.6.3 - '@motionone/easing@10.17.0': + '@motionone/easing@10.16.3': dependencies: - '@motionone/utils': 10.17.0 + '@motionone/utils': 10.16.3 tslib: 2.6.2 - '@motionone/generators@10.17.0': + '@motionone/generators@10.16.4': dependencies: - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 tslib: 2.6.2 '@motionone/svelte@10.16.4': dependencies: - '@motionone/dom': 10.17.0 + '@motionone/dom': 10.16.4 tslib: 2.6.2 - '@motionone/types@10.17.0': {} + '@motionone/types@10.16.3': {} - '@motionone/utils@10.17.0': + '@motionone/utils@10.16.3': dependencies: - '@motionone/types': 10.17.0 + '@motionone/types': 10.16.3 hey-listen: 1.0.8 - tslib: 2.6.2 + tslib: 2.6.3 '@motionone/vue@10.16.4': dependencies: - '@motionone/dom': 10.17.0 + '@motionone/dom': 10.16.4 tslib: 2.6.2 '@multiformats/dns@1.0.6': @@ -14336,11 +16775,11 @@ snapshots: hashlru: 2.3.0 p-queue: 8.0.1 progress-events: 1.0.0 - uint8arrays: 5.0.3 + uint8arrays: 5.1.0 '@multiformats/multiaddr-to-uri@9.0.8': dependencies: - '@multiformats/multiaddr': 12.2.1 + '@multiformats/multiaddr': 12.3.0 '@multiformats/multiaddr@11.6.1': dependencies: @@ -14353,38 +16792,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@multiformats/multiaddr@12.2.1': + '@multiformats/multiaddr@12.3.0': dependencies: '@chainsafe/is-ip': 2.0.2 '@chainsafe/netmask': 2.0.0 - '@libp2p/interface': 1.3.1 + '@libp2p/interface': 1.3.0 '@multiformats/dns': 1.0.6 - multiformats: 13.1.0 + multiformats: 13.1.3 uint8-varint: 2.0.4 - uint8arrays: 5.0.3 - - '@ndelangen/get-tarball@3.0.9': - dependencies: - gunzip-maybe: 1.4.2 - pump: 3.0.0 - tar-fs: 2.1.1 + uint8arrays: 5.1.0 '@noble/curves@1.2.0': dependencies: '@noble/hashes': 1.3.2 - '@noble/curves@1.3.0': + '@noble/curves@1.4.0': dependencies: - '@noble/hashes': 1.3.3 + '@noble/hashes': 1.4.0 + + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/curves@1.4.0': + dependencies: + '@noble/hashes': 1.4.0 '@noble/hashes@1.2.0': {} '@noble/hashes@1.3.2': {} - '@noble/hashes@1.3.3': {} - '@noble/hashes@1.4.0': {} + '@noble/hashes@1.5.0': {} + '@noble/secp256k1@1.7.1': {} '@nodelib/fs.scandir@2.1.5': @@ -14399,6 +16840,81 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@nomicfoundation/edr-darwin-arm64@0.6.3': {} + + '@nomicfoundation/edr-darwin-x64@0.6.3': {} + + '@nomicfoundation/edr-linux-arm64-gnu@0.6.3': {} + + '@nomicfoundation/edr-linux-arm64-musl@0.6.3': {} + + '@nomicfoundation/edr-linux-x64-gnu@0.6.3': {} + + '@nomicfoundation/edr-linux-x64-musl@0.6.3': {} + + '@nomicfoundation/edr-win32-x64-msvc@0.6.3': {} + + '@nomicfoundation/edr@0.6.3': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.6.3 + '@nomicfoundation/edr-darwin-x64': 0.6.3 + '@nomicfoundation/edr-linux-arm64-gnu': 0.6.3 + '@nomicfoundation/edr-linux-arm64-musl': 0.6.3 + '@nomicfoundation/edr-linux-x64-gnu': 0.6.3 + '@nomicfoundation/edr-linux-x64-musl': 0.6.3 + '@nomicfoundation/edr-win32-x64-msvc': 0.6.3 + + '@nomicfoundation/ethereumjs-common@4.0.4': + dependencies: + '@nomicfoundation/ethereumjs-util': 9.0.4 + transitivePeerDependencies: + - c-kzg + + '@nomicfoundation/ethereumjs-rlp@5.0.4': {} + + '@nomicfoundation/ethereumjs-tx@5.0.4': + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + ethereum-cryptography: 0.1.3 + + '@nomicfoundation/ethereumjs-util@9.0.4': + dependencies: + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + ethereum-cryptography: 0.1.3 + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer@0.1.2': + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 + '@openzeppelin/contracts-upgradeable@4.9.6': {} '@openzeppelin/contracts-upgradeable@5.0.2(@openzeppelin/contracts@5.0.2)': @@ -14409,11 +16925,174 @@ snapshots: '@openzeppelin/contracts@5.0.2': {} + '@openzeppelin/defender-as-code@3.0.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core@1.10.4(encoding@0.1.13))(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': + dependencies: + '@openzeppelin/defender-sdk': 1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core@1.10.4(encoding@0.1.13))(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + keccak256: 1.0.6 + lodash: 4.17.21 + prompt: 1.3.0 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + - web3 + - web3-core + - web3-core-helpers + - web3-utils + + '@openzeppelin/defender-sdk-account-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-action-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + dotenv: 16.4.5 + glob: 11.0.0 + jszip: 3.10.1 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-base-client@1.14.4(encoding@0.1.13)': + dependencies: + amazon-cognito-identity-js: 6.3.12(encoding@0.1.13) + async-retry: 1.3.3 + transitivePeerDependencies: + - encoding + + '@openzeppelin/defender-sdk-deploy-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-key-value-store-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + fs-extra: 11.2.0 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-monitor-client@1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + lodash: 4.17.21 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + + '@openzeppelin/defender-sdk-network-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-notification-channel-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-proposal-client@1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + lodash: 4.17.21 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + + '@openzeppelin/defender-sdk-relay-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-relay-signer-client@1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core@1.10.4(encoding@0.1.13))(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/strings': 5.7.0 + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + amazon-cognito-identity-js: 6.3.12(encoding@0.1.13) + axios: 1.7.7 + ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + lodash: 4.17.21 + web3: 1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + + '@openzeppelin/defender-sdk@1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core@1.10.4(encoding@0.1.13))(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': + dependencies: + '@openzeppelin/defender-sdk-account-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-action-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-deploy-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-key-value-store-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-monitor-client': 1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@openzeppelin/defender-sdk-network-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-notification-channel-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-proposal-client': 1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@openzeppelin/defender-sdk-relay-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-relay-signer-client': 1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core@1.10.4(encoding@0.1.13))(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + - web3 + - web3-core + - web3-core-helpers + - web3-utils + '@openzeppelin/merkle-tree@1.0.6': dependencies: '@ethersproject/abi': 5.7.0 ethereum-cryptography: 1.2.0 + '@oslojs/encoding@0.4.1': {} + '@pagefind/darwin-arm64@1.1.0': optional: true @@ -14431,75 +17110,82 @@ snapshots: '@pagefind/windows-x64@1.1.0': optional: true - '@parcel/watcher-android-arm64@2.4.1': + '@parcel/watcher-android-arm64@2.4.0': optional: true - '@parcel/watcher-darwin-arm64@2.4.1': + '@parcel/watcher-darwin-arm64@2.4.0': optional: true - '@parcel/watcher-darwin-x64@2.4.1': + '@parcel/watcher-darwin-x64@2.4.0': optional: true - '@parcel/watcher-freebsd-x64@2.4.1': + '@parcel/watcher-freebsd-x64@2.4.0': optional: true - '@parcel/watcher-linux-arm-glibc@2.4.1': + '@parcel/watcher-linux-arm-glibc@2.4.0': optional: true - '@parcel/watcher-linux-arm64-glibc@2.4.1': + '@parcel/watcher-linux-arm64-glibc@2.4.0': optional: true - '@parcel/watcher-linux-arm64-musl@2.4.1': + '@parcel/watcher-linux-arm64-musl@2.4.0': optional: true - '@parcel/watcher-linux-x64-glibc@2.4.1': + '@parcel/watcher-linux-x64-glibc@2.4.0': optional: true - '@parcel/watcher-linux-x64-musl@2.4.1': + '@parcel/watcher-linux-x64-musl@2.4.0': optional: true - '@parcel/watcher-wasm@2.4.1': + '@parcel/watcher-wasm@2.4.0': dependencies: is-glob: 4.0.3 - micromatch: 4.0.5 + micromatch: 4.0.7 - '@parcel/watcher-win32-arm64@2.4.1': + '@parcel/watcher-win32-arm64@2.4.0': optional: true - '@parcel/watcher-win32-ia32@2.4.1': + '@parcel/watcher-win32-ia32@2.4.0': optional: true - '@parcel/watcher-win32-x64@2.4.1': + '@parcel/watcher-win32-x64@2.4.0': optional: true - '@parcel/watcher@2.4.1': + '@parcel/watcher@2.4.0': dependencies: detect-libc: 1.0.3 is-glob: 4.0.3 - micromatch: 4.0.5 + micromatch: 4.0.7 node-addon-api: 7.1.0 optionalDependencies: - '@parcel/watcher-android-arm64': 2.4.1 - '@parcel/watcher-darwin-arm64': 2.4.1 - '@parcel/watcher-darwin-x64': 2.4.1 - '@parcel/watcher-freebsd-x64': 2.4.1 - '@parcel/watcher-linux-arm-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-musl': 2.4.1 - '@parcel/watcher-linux-x64-glibc': 2.4.1 - '@parcel/watcher-linux-x64-musl': 2.4.1 - '@parcel/watcher-win32-arm64': 2.4.1 - '@parcel/watcher-win32-ia32': 2.4.1 - '@parcel/watcher-win32-x64': 2.4.1 + '@parcel/watcher-android-arm64': 2.4.0 + '@parcel/watcher-darwin-arm64': 2.4.0 + '@parcel/watcher-darwin-x64': 2.4.0 + '@parcel/watcher-freebsd-x64': 2.4.0 + '@parcel/watcher-linux-arm-glibc': 2.4.0 + '@parcel/watcher-linux-arm64-glibc': 2.4.0 + '@parcel/watcher-linux-arm64-musl': 2.4.0 + '@parcel/watcher-linux-x64-glibc': 2.4.0 + '@parcel/watcher-linux-x64-musl': 2.4.0 + '@parcel/watcher-win32-arm64': 2.4.0 + '@parcel/watcher-win32-ia32': 2.4.0 + '@parcel/watcher-win32-x64': 2.4.0 '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.1.1': {} + '@pkgr/utils@2.4.2': + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.2 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 - '@playwright/test@1.44.0': + '@playwright/test@1.43.1': dependencies: - playwright: 1.44.0 + playwright: 1.43.1 '@pnpm/config.env-replace@1.1.0': {} @@ -14513,7 +17199,7 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@polka/url@1.0.0-next.25': {} + '@polka/url@1.0.0-next.24': {} '@protobufjs/aspromise@1.1.2': {} @@ -14538,283 +17224,139 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@radix-ui/primitive@1.0.1': - dependencies: - '@babel/runtime': 7.24.5 - - '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.2)(react@18.3.1)': + '@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))': dependencies: - '@babel/runtime': 7.24.5 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 + merge-options: 3.0.4 + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) - '@radix-ui/react-context@1.0.1(@types/react@18.3.2)(react@18.3.1)': + '@react-native-community/cli-clean@12.3.2(encoding@0.1.13)': dependencies: - '@babel/runtime': 7.24.5 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-dialog@1.0.5(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.4(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.2)(react@18.3.1) - aria-hidden: 1.2.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@18.3.2)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) + chalk: 4.1.2 + execa: 5.1.1 + transitivePeerDependencies: + - encoding - '@radix-ui/react-dismissable-layer@1.0.5(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-native-community/cli-config@12.3.2(encoding@0.1.13)': dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) + chalk: 4.1.2 + cosmiconfig: 5.2.1 + deepmerge: 4.3.1 + glob: 7.2.3 + joi: 17.12.1 + transitivePeerDependencies: + - encoding - '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.2)(react@18.3.1)': + '@react-native-community/cli-debugger-ui@12.3.2': dependencies: - '@babel/runtime': 7.24.5 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 + serve-static: 1.16.2 + transitivePeerDependencies: + - supports-color - '@radix-ui/react-focus-scope@1.0.4(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-native-community/cli-doctor@12.3.2(encoding@0.1.13)': dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 + '@react-native-community/cli-config': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-platform-android': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-platform-ios': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) + chalk: 4.1.2 + command-exists: 1.2.9 + deepmerge: 4.3.1 + envinfo: 7.11.1 + execa: 5.1.1 + hermes-profile-transformer: 0.0.6 + ip: 1.1.9 + node-stream-zip: 1.15.0 + ora: 5.4.1 + semver: 7.6.3 + strip-ansi: 5.2.0 + wcwidth: 1.0.1 + yaml: 2.5.1 + transitivePeerDependencies: + - encoding - '@radix-ui/react-id@1.0.1(@types/react@18.3.2)(react@18.3.1)': + '@react-native-community/cli-hermes@12.3.2(encoding@0.1.13)': dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-portal@1.0.4(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-presence@1.0.1(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-primitive@1.0.3(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-slot@1.0.2(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@react-native-community/cli-clean@13.6.6(encoding@0.1.13)': - dependencies: - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) - chalk: 4.1.2 - execa: 5.1.1 - fast-glob: 3.3.2 - transitivePeerDependencies: - - encoding - - '@react-native-community/cli-config@13.6.6(encoding@0.1.13)': - dependencies: - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) - chalk: 4.1.2 - cosmiconfig: 5.2.1 - deepmerge: 4.3.1 - fast-glob: 3.3.2 - joi: 17.13.1 - transitivePeerDependencies: - - encoding - - '@react-native-community/cli-debugger-ui@13.6.6': - dependencies: - serve-static: 1.15.0 - transitivePeerDependencies: - - supports-color - - '@react-native-community/cli-doctor@13.6.6(encoding@0.1.13)': - dependencies: - '@react-native-community/cli-config': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-platform-android': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-platform-apple': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-platform-ios': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) - chalk: 4.1.2 - command-exists: 1.2.9 - deepmerge: 4.3.1 - envinfo: 7.13.0 - execa: 5.1.1 - hermes-profile-transformer: 0.0.6 - node-stream-zip: 1.15.0 - ora: 5.4.1 - semver: 7.6.2 - strip-ansi: 5.2.0 - wcwidth: 1.0.1 - yaml: 2.4.2 - transitivePeerDependencies: - - encoding - - '@react-native-community/cli-hermes@13.6.6(encoding@0.1.13)': - dependencies: - '@react-native-community/cli-platform-android': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) + '@react-native-community/cli-platform-android': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) chalk: 4.1.2 hermes-profile-transformer: 0.0.6 + ip: 1.1.9 transitivePeerDependencies: - encoding - '@react-native-community/cli-platform-android@13.6.6(encoding@0.1.13)': + '@react-native-community/cli-platform-android@12.3.2(encoding@0.1.13)': dependencies: - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) chalk: 4.1.2 execa: 5.1.1 - fast-glob: 3.3.2 - fast-xml-parser: 4.3.6 + fast-xml-parser: 4.3.4 + glob: 7.2.3 logkitty: 0.7.1 transitivePeerDependencies: - encoding - '@react-native-community/cli-platform-apple@13.6.6(encoding@0.1.13)': + '@react-native-community/cli-platform-ios@12.3.2(encoding@0.1.13)': dependencies: - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) chalk: 4.1.2 execa: 5.1.1 - fast-glob: 3.3.2 - fast-xml-parser: 4.3.6 + fast-xml-parser: 4.3.4 + glob: 7.2.3 ora: 5.4.1 transitivePeerDependencies: - encoding - '@react-native-community/cli-platform-ios@13.6.6(encoding@0.1.13)': - dependencies: - '@react-native-community/cli-platform-apple': 13.6.6(encoding@0.1.13) - transitivePeerDependencies: - - encoding + '@react-native-community/cli-plugin-metro@12.3.2': {} - '@react-native-community/cli-server-api@13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@react-native-community/cli-server-api@12.3.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@react-native-community/cli-debugger-ui': 13.6.6 - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) + '@react-native-community/cli-debugger-ui': 12.3.2 + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) compression: 1.7.4 connect: 3.7.0 errorhandler: 1.5.1 nocache: 3.0.4 pretty-format: 26.6.2 - serve-static: 1.15.0 - ws: 6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + serve-static: 1.16.2 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - '@react-native-community/cli-tools@13.6.6(encoding@0.1.13)': + '@react-native-community/cli-tools@12.3.2(encoding@0.1.13)': dependencies: appdirsjs: 1.2.7 chalk: 4.1.2 - execa: 5.1.1 find-up: 5.0.0 mime: 2.6.0 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 open: 6.4.0 ora: 5.4.1 - semver: 7.6.2 + semver: 7.6.3 shell-quote: 1.8.1 sudo-prompt: 9.2.1 transitivePeerDependencies: - encoding - '@react-native-community/cli-types@13.6.6': + '@react-native-community/cli-types@12.3.2': dependencies: - joi: 17.13.1 + joi: 17.12.1 - '@react-native-community/cli@13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@react-native-community/cli@12.3.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@react-native-community/cli-clean': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-config': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-debugger-ui': 13.6.6 - '@react-native-community/cli-doctor': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-hermes': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-server-api': 13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-types': 13.6.6 + '@react-native-community/cli-clean': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-config': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-debugger-ui': 12.3.2 + '@react-native-community/cli-doctor': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-hermes': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-plugin-metro': 12.3.2 + '@react-native-community/cli-server-api': 12.3.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-types': 12.3.2 chalk: 4.1.2 commander: 9.5.0 deepmerge: 4.3.1 @@ -14823,97 +17365,95 @@ snapshots: fs-extra: 8.1.0 graceful-fs: 4.2.11 prompts: 2.4.2 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - '@react-native/assets-registry@0.74.83': {} + '@react-native/assets-registry@0.73.1': {} - '@react-native/babel-plugin-codegen@0.74.83(@babel/preset-env@7.24.5(@babel/core@7.24.5))': + '@react-native/babel-plugin-codegen@0.73.4(@babel/preset-env@7.23.9(@babel/core@7.25.2))': dependencies: - '@react-native/codegen': 0.74.83(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + '@react-native/codegen': 0.73.3(@babel/preset-env@7.23.9(@babel/core@7.25.2)) transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/babel-preset@0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))': - dependencies: - '@babel/core': 7.24.5 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.24.5) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-export-default-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.24.5) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.5) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-export-default-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-runtime': 7.24.3(@babel/core@7.24.5) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typescript': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.5) - '@babel/template': 7.24.0 - '@react-native/babel-plugin-codegen': 0.74.83(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.24.5) - react-refresh: 0.14.2 + '@react-native/babel-preset@0.73.21(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))': + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.25.2) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-export-default-from': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.25.2) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-runtime': 7.23.9(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.25.2) + '@babel/template': 7.25.0 + '@react-native/babel-plugin-codegen': 0.73.4(@babel/preset-env@7.23.9(@babel/core@7.25.2)) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.25.2) + react-refresh: 0.14.0 transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/codegen@0.74.83(@babel/preset-env@7.24.5(@babel/core@7.24.5))': + '@react-native/codegen@0.73.3(@babel/preset-env@7.23.9(@babel/core@7.25.2))': dependencies: - '@babel/parser': 7.24.5 - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) + '@babel/parser': 7.25.6 + '@babel/preset-env': 7.23.9(@babel/core@7.25.2) + flow-parser: 0.206.0 glob: 7.2.3 - hermes-parser: 0.19.1 invariant: 2.2.4 - jscodeshift: 0.14.0(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + jscodeshift: 0.14.0(@babel/preset-env@7.23.9(@babel/core@7.25.2)) mkdirp: 0.5.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - '@react-native/community-cli-plugin@0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@react-native/community-cli-plugin@0.73.16(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@react-native-community/cli-server-api': 13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) - '@react-native/dev-middleware': 0.74.83(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@react-native/metro-babel-transformer': 0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + '@react-native-community/cli-server-api': 12.3.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) + '@react-native/dev-middleware': 0.73.7(encoding@0.1.13) + '@react-native/metro-babel-transformer': 0.73.15(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2)) chalk: 4.1.2 execa: 5.1.1 - metro: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - metro-config: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - metro-core: 0.80.9 + metro: 0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + metro-config: 0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + metro-core: 0.80.6 node-fetch: 2.7.0(encoding@0.1.13) - querystring: 0.2.1 readline: 1.3.0 transitivePeerDependencies: - '@babel/core' @@ -14923,60 +17463,52 @@ snapshots: - supports-color - utf-8-validate - '@react-native/debugger-frontend@0.74.83': {} + '@react-native/debugger-frontend@0.73.3': {} - '@react-native/dev-middleware@0.74.83(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@react-native/dev-middleware@0.73.7(encoding@0.1.13)': dependencies: '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.74.83 - '@rnx-kit/chromium-edge-launcher': 1.0.0 + '@react-native/debugger-frontend': 0.73.3 chrome-launcher: 0.15.2 + chromium-edge-launcher: 1.0.0 connect: 3.7.0 debug: 2.6.9 node-fetch: 2.7.0(encoding@0.1.13) - nullthrows: 1.1.1 open: 7.4.2 - selfsigned: 2.4.1 - serve-static: 1.15.0 + serve-static: 1.16.2 temp-dir: 2.0.0 - ws: 6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) transitivePeerDependencies: - - bufferutil - encoding - supports-color - - utf-8-validate - '@react-native/gradle-plugin@0.74.83': {} + '@react-native/gradle-plugin@0.73.4': {} - '@react-native/js-polyfills@0.74.83': {} + '@react-native/js-polyfills@0.73.1': {} - '@react-native/metro-babel-transformer@0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))': + '@react-native/metro-babel-transformer@0.73.15(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))': dependencies: - '@babel/core': 7.24.5 - '@react-native/babel-preset': 0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - hermes-parser: 0.19.1 + '@babel/core': 7.25.2 + '@react-native/babel-preset': 0.73.21(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2)) + hermes-parser: 0.15.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/normalize-colors@0.74.83': {} + '@react-native/normalize-colors@0.73.2': {} - '@react-native/virtualized-lists@0.74.83(@types/react@18.3.2)(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)': + '@react-native/virtualized-lists@0.73.4(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 - react: 18.3.1 - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) - optionalDependencies: - '@types/react': 18.3.2 + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) - '@readme/better-ajv-errors@1.6.0(ajv@8.13.0)': + '@readme/better-ajv-errors@1.6.0(ajv@8.12.0)': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.5 + '@babel/code-frame': 7.23.5 + '@babel/runtime': 7.23.9 '@humanwhocodes/momoa': 2.0.4 - ajv: 8.13.0 + ajv: 8.12.0 chalk: 4.1.2 json-to-ast: 2.1.0 jsonpointer: 5.0.1 @@ -14994,75 +17526,179 @@ snapshots: '@apidevtools/openapi-schemas': 2.1.0 '@apidevtools/swagger-methods': 3.0.2 '@jsdevtools/ono': 7.1.3 - '@readme/better-ajv-errors': 1.6.0(ajv@8.13.0) + '@readme/better-ajv-errors': 1.6.0(ajv@8.12.0) '@readme/json-schema-ref-parser': 1.2.0 - ajv: 8.13.0 - ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv: 8.12.0 + ajv-draft-04: 1.0.0(ajv@8.12.0) call-me-maybe: 1.0.2 openapi-types: 12.1.3 - '@rnx-kit/chromium-edge-launcher@1.0.0': + '@rollup/pluginutils@5.1.0(rollup@4.21.3)': dependencies: - '@types/node': 18.19.33 - escape-string-regexp: 4.0.0 - is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 - mkdirp: 1.0.4 - rimraf: 3.0.2 - transitivePeerDependencies: - - supports-color + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.21.3 + + '@rollup/rollup-android-arm-eabi@4.12.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.18.0': + optional: true - '@rollup/rollup-android-arm-eabi@4.17.2': + '@rollup/rollup-android-arm-eabi@4.21.3': + optional: true + + '@rollup/rollup-android-arm64@4.12.0': optional: true '@rollup/rollup-android-arm64@4.17.2': optional: true + '@rollup/rollup-android-arm64@4.21.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.12.0': + optional: true + '@rollup/rollup-darwin-arm64@4.17.2': optional: true + '@rollup/rollup-darwin-arm64@4.21.3': + optional: true + + '@rollup/rollup-darwin-x64@4.12.0': + optional: true + '@rollup/rollup-darwin-x64@4.17.2': optional: true + '@rollup/rollup-darwin-x64@4.21.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.12.0': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.17.2': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.21.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.12.0': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.17.2': optional: true + '@rollup/rollup-linux-arm64-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.12.0': + optional: true + '@rollup/rollup-linux-arm64-musl@4.17.2': optional: true + '@rollup/rollup-linux-arm64-musl@4.21.3': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.12.0': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.17.2': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.21.3': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.17.2': optional: true + '@rollup/rollup-linux-s390x-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.12.0': + optional: true + '@rollup/rollup-linux-x64-gnu@4.17.2': optional: true + '@rollup/rollup-linux-x64-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.12.0': + optional: true + '@rollup/rollup-linux-x64-musl@4.17.2': optional: true + '@rollup/rollup-linux-x64-musl@4.21.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.12.0': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.17.2': optional: true + '@rollup/rollup-win32-arm64-msvc@4.21.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.12.0': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.17.2': optional: true + '@rollup/rollup-win32-ia32-msvc@4.21.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.12.0': + optional: true + '@rollup/rollup-win32-x64-msvc@4.17.2': optional: true - '@safe-global/safe-apps-provider@0.18.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@rollup/rollup-win32-x64-msvc@4.21.3': + optional: true + + '@safe-global/safe-apps-provider@0.18.1(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4)': + dependencies: + '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-provider@0.18.1(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8)': + dependencies: + '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-provider@0.18.3(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: - '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -15070,54 +17706,162 @@ snapshots: - utf-8-validate - zod - '@safe-global/safe-apps-sdk@8.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@safe-global/safe-apps-sdk@8.1.0(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.15.0 + viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@8.1.0(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.15.0 + viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: - '@safe-global/safe-gateway-typescript-sdk': 3.21.1 - viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + '@safe-global/safe-gateway-typescript-sdk': 3.15.0 + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@safe-global/safe-gateway-typescript-sdk@3.21.1': {} + '@safe-global/safe-gateway-typescript-sdk@3.15.0': {} - '@scure/base@1.1.6': {} + '@scure/base@1.1.5': {} + + '@scure/base@1.1.8': {} '@scure/bip32@1.1.5': dependencies: '@noble/hashes': 1.2.0 '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.6 + '@scure/base': 1.1.5 '@scure/bip32@1.3.2': dependencies: '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.6 + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.5 - '@scure/bip32@1.3.3': + '@scure/bip32@1.4.0': dependencies: '@noble/curves': 1.3.0 '@noble/hashes': 1.3.3 - '@scure/base': 1.1.6 + '@scure/base': 1.1.8 + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.8 '@scure/bip39@1.1.1': dependencies: '@noble/hashes': 1.2.0 - '@scure/base': 1.1.6 + '@scure/base': 1.1.5 '@scure/bip39@1.2.1': dependencies: - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.6 + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.5 - '@scure/bip39@1.2.2': + '@scure/bip39@1.3.0': dependencies: '@noble/hashes': 1.3.3 - '@scure/base': 1.1.6 + '@scure/base': 1.1.8 + + '@scure/bip39@1.4.0': + dependencies: + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.8 + + '@sentry/core@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/hub@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/minimal@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sentry/node@5.30.0': + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + + '@sentry/tracing@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/types@5.30.0': {} + + '@sentry/utils@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@shikijs/core@1.17.6': + dependencies: + '@shikijs/engine-javascript': 1.17.6 + '@shikijs/engine-oniguruma': 1.17.6 + '@shikijs/types': 1.17.6 + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.2 + + '@shikijs/core@1.5.2': {} + + '@shikijs/engine-javascript@1.17.6': + dependencies: + '@shikijs/types': 1.17.6 + oniguruma-to-js: 0.4.3 + + '@shikijs/engine-oniguruma@1.17.6': + dependencies: + '@shikijs/types': 1.17.6 + '@shikijs/vscode-textmate': 9.2.2 + + '@shikijs/types@1.17.6': + dependencies: + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 - '@shikijs/core@1.5.1': {} + '@shikijs/vscode-textmate@9.2.2': {} '@sideway/address@4.1.5': dependencies: @@ -15129,9 +17873,9 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sindresorhus/is@5.6.0': {} + '@sindresorhus/is@4.6.0': {} - '@sindresorhus/merge-streams@2.3.0': {} + '@sindresorhus/is@5.6.0': {} '@sinonjs/commons@3.0.1': dependencies: @@ -15141,321 +17885,335 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@3.0.0': + '@smithy/abort-controller@3.1.1': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 '@smithy/chunked-blob-reader-native@3.0.0': dependencies: '@smithy/util-base64': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 '@smithy/chunked-blob-reader@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/config-resolver@3.0.0': + '@smithy/config-resolver@3.0.4': dependencies: - '@smithy/node-config-provider': 3.0.0 - '@smithy/types': 3.0.0 + '@smithy/node-config-provider': 3.1.3 + '@smithy/types': 3.3.0 '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.0 - tslib: 2.6.2 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 - '@smithy/core@2.0.0': + '@smithy/core@2.0.1': dependencies: '@smithy/middleware-endpoint': 3.0.0 - '@smithy/middleware-retry': 3.0.0 + '@smithy/middleware-retry': 3.0.1 '@smithy/middleware-serde': 3.0.0 '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/util-middleware': 3.0.0 tslib: 2.6.2 - '@smithy/credential-provider-imds@3.0.0': + '@smithy/credential-provider-imds@3.1.3': dependencies: - '@smithy/node-config-provider': 3.0.0 - '@smithy/property-provider': 3.0.0 - '@smithy/types': 3.0.0 - '@smithy/url-parser': 3.0.0 - tslib: 2.6.2 + '@smithy/node-config-provider': 3.1.3 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + tslib: 2.6.3 - '@smithy/eventstream-codec@3.0.0': + '@smithy/eventstream-codec@3.1.2': dependencies: - '@aws-crypto/crc32': 3.0.0 - '@smithy/types': 3.0.0 + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 3.3.0 '@smithy/util-hex-encoding': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/eventstream-serde-browser@3.0.0': + '@smithy/eventstream-serde-browser@3.0.4': dependencies: - '@smithy/eventstream-serde-universal': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/eventstream-serde-universal': 3.0.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/eventstream-serde-config-resolver@3.0.0': + '@smithy/eventstream-serde-config-resolver@3.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/eventstream-serde-node@3.0.0': + '@smithy/eventstream-serde-node@3.0.4': dependencies: - '@smithy/eventstream-serde-universal': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/eventstream-serde-universal': 3.0.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/eventstream-serde-universal@3.0.0': + '@smithy/eventstream-serde-universal@3.0.4': dependencies: - '@smithy/eventstream-codec': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/eventstream-codec': 3.1.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/fetch-http-handler@3.0.0': + '@smithy/fetch-http-handler@3.0.1': dependencies: - '@smithy/protocol-http': 4.0.0 - '@smithy/querystring-builder': 3.0.0 - '@smithy/types': 3.0.0 + '@smithy/protocol-http': 4.0.3 + '@smithy/querystring-builder': 3.0.3 + '@smithy/types': 3.3.0 '@smithy/util-base64': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/hash-blob-browser@3.0.0': + '@smithy/hash-blob-browser@3.1.2': dependencies: '@smithy/chunked-blob-reader': 3.0.0 '@smithy/chunked-blob-reader-native': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/hash-node@3.0.0': + '@smithy/hash-node@3.0.3': dependencies: - '@smithy/types': 3.0.0 + '@smithy/types': 3.3.0 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/hash-stream-node@3.0.0': + '@smithy/hash-stream-node@3.1.2': dependencies: - '@smithy/types': 3.0.0 + '@smithy/types': 3.3.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/invalid-dependency@3.0.0': + '@smithy/invalid-dependency@3.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.6.3 '@smithy/is-array-buffer@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/md5-js@3.0.0': + '@smithy/md5-js@3.0.3': dependencies: - '@smithy/types': 3.0.0 + '@smithy/types': 3.3.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/middleware-content-length@3.0.0': + '@smithy/middleware-content-length@3.0.3': dependencies: - '@smithy/protocol-http': 4.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/middleware-endpoint@3.0.0': + '@smithy/middleware-endpoint@3.0.4': dependencies: - '@smithy/middleware-serde': 3.0.0 - '@smithy/node-config-provider': 3.0.0 - '@smithy/shared-ini-file-loader': 3.0.0 - '@smithy/types': 3.0.0 - '@smithy/url-parser': 3.0.0 - '@smithy/util-middleware': 3.0.0 - tslib: 2.6.2 + '@smithy/middleware-serde': 3.0.3 + '@smithy/node-config-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.3 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 - '@smithy/middleware-retry@3.0.0': + '@smithy/middleware-retry@3.0.1': dependencies: '@smithy/node-config-provider': 3.0.0 '@smithy/protocol-http': 4.0.0 '@smithy/service-error-classification': 3.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 tslib: 2.6.2 uuid: 9.0.1 - '@smithy/middleware-serde@3.0.0': + '@smithy/middleware-serde@3.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/middleware-stack@3.0.0': + '@smithy/middleware-stack@3.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/node-config-provider@3.0.0': + '@smithy/node-config-provider@3.1.3': dependencies: - '@smithy/property-provider': 3.0.0 - '@smithy/shared-ini-file-loader': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/node-http-handler@3.0.0': + '@smithy/node-http-handler@3.1.1': dependencies: - '@smithy/abort-controller': 3.0.0 - '@smithy/protocol-http': 4.0.0 - '@smithy/querystring-builder': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/abort-controller': 3.1.1 + '@smithy/protocol-http': 4.0.3 + '@smithy/querystring-builder': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/property-provider@3.0.0': + '@smithy/property-provider@3.1.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/protocol-http@4.0.0': + '@smithy/protocol-http@4.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/querystring-builder@3.0.0': + '@smithy/querystring-builder@3.0.3': dependencies: - '@smithy/types': 3.0.0 + '@smithy/types': 3.3.0 '@smithy/util-uri-escape': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/querystring-parser@3.0.0': + '@smithy/querystring-parser@3.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/service-error-classification@3.0.0': + '@smithy/service-error-classification@3.0.3': dependencies: - '@smithy/types': 3.0.0 + '@smithy/types': 3.3.0 - '@smithy/shared-ini-file-loader@3.0.0': + '@smithy/shared-ini-file-loader@3.1.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/signature-v4@3.0.0': + '@smithy/signature-v4@3.1.2': dependencies: '@smithy/is-array-buffer': 3.0.0 - '@smithy/types': 3.0.0 + '@smithy/types': 3.3.0 '@smithy/util-hex-encoding': 3.0.0 - '@smithy/util-middleware': 3.0.0 + '@smithy/util-middleware': 3.0.3 '@smithy/util-uri-escape': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/smithy-client@3.0.0': + '@smithy/smithy-client@3.0.1': dependencies: '@smithy/middleware-endpoint': 3.0.0 '@smithy/middleware-stack': 3.0.0 '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 - '@smithy/util-stream': 3.0.0 + '@smithy/util-stream': 3.0.1 tslib: 2.6.2 - '@smithy/types@3.0.0': + '@smithy/types@3.3.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/url-parser@3.0.0': + '@smithy/url-parser@3.0.3': dependencies: - '@smithy/querystring-parser': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/querystring-parser': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 '@smithy/util-base64@3.0.0': dependencies: '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 '@smithy/util-body-length-browser@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 '@smithy/util-body-length-node@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.6.3 '@smithy/util-buffer-from@3.0.0': dependencies: '@smithy/is-array-buffer': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 '@smithy/util-config-provider@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/util-defaults-mode-browser@3.0.0': + '@smithy/util-defaults-mode-browser@3.0.1': dependencies: '@smithy/property-provider': 3.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/util-defaults-mode-node@3.0.0': + '@smithy/util-defaults-mode-node@3.0.1': dependencies: '@smithy/config-resolver': 3.0.0 '@smithy/credential-provider-imds': 3.0.0 '@smithy/node-config-provider': 3.0.0 '@smithy/property-provider': 3.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/util-endpoints@2.0.0': + '@smithy/util-endpoints@2.0.4': dependencies: - '@smithy/node-config-provider': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/node-config-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 '@smithy/util-hex-encoding@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/util-middleware@3.0.0': + '@smithy/util-middleware@3.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/util-retry@3.0.0': + '@smithy/util-retry@3.0.3': dependencies: - '@smithy/service-error-classification': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/service-error-classification': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/util-stream@3.0.0': + '@smithy/util-stream@3.0.1': dependencies: - '@smithy/fetch-http-handler': 3.0.0 + '@smithy/fetch-http-handler': 3.0.1 '@smithy/node-http-handler': 3.0.0 '@smithy/types': 3.0.0 '@smithy/util-base64': 3.0.0 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-hex-encoding': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 '@smithy/util-uri-escape@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.6.3 '@smithy/util-utf8@3.0.0': dependencies: '@smithy/util-buffer-from': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/util-waiter@3.0.0': + '@smithy/util-waiter@3.1.2': dependencies: - '@smithy/abort-controller': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/abort-controller': 3.1.1 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@socket.io/component-emitter@3.1.2': {} + '@socket.io/component-emitter@3.1.0': {} '@solidity-parser/parser@0.18.0': {} @@ -15539,556 +18297,237 @@ snapshots: '@stablelib/random': 1.0.2 '@stablelib/wipe': 1.0.1 - '@storybook/addon-actions@8.1.1': + '@storybook/addon-actions@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/core-events': 8.1.1 '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) uuid: 9.0.1 - '@storybook/addon-backgrounds@8.1.1': + '@storybook/addon-backgrounds@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 - '@storybook/addon-controls@8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@storybook/addon-controls@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/blocks': 8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/global': 5.0.0 dequal: 2.0.3 lodash: 4.17.21 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - prettier - - react - - react-dom - - supports-color - '@storybook/addon-docs@8.1.1(encoding@0.1.13)(prettier@3.2.5)': + '@storybook/addon-docs@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@babel/core': 7.24.5 - '@mdx-js/react': 3.0.1(@types/react@18.3.2)(react@18.3.1) - '@storybook/blocks': 8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/client-logger': 8.1.1 - '@storybook/components': 8.1.1(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/csf-plugin': 8.1.1 - '@storybook/csf-tools': 8.1.1 + '@mdx-js/react': 3.0.1(@types/react@18.3.5)(react@18.2.0) + '@storybook/blocks': 8.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/csf-plugin': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/global': 5.0.0 - '@storybook/node-logger': 8.1.1 - '@storybook/preview-api': 8.1.1 - '@storybook/react-dom-shim': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/theming': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/types': 8.1.1 - '@types/react': 18.3.2 + '@storybook/react-dom-shim': 8.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@types/react': 18.3.5 fs-extra: 11.2.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) rehype-external-links: 3.0.0 rehype-slug: 6.0.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 transitivePeerDependencies: - - '@types/react-dom' - - encoding - - prettier - - supports-color - - '@storybook/addon-essentials@8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@storybook/addon-actions': 8.1.1 - '@storybook/addon-backgrounds': 8.1.1 - '@storybook/addon-controls': 8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/addon-docs': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/addon-highlight': 8.1.1 - '@storybook/addon-measure': 8.1.1 - '@storybook/addon-outline': 8.1.1 - '@storybook/addon-toolbars': 8.1.1 - '@storybook/addon-viewport': 8.1.1 - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/manager-api': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/node-logger': 8.1.1 - '@storybook/preview-api': 8.1.1 + - webpack-sources + + '@storybook/addon-essentials@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': + dependencies: + '@storybook/addon-actions': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-backgrounds': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-controls': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-docs': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-highlight': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-measure': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-outline': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-toolbars': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-viewport': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - prettier - - react - - react-dom - - supports-color + - webpack-sources - '@storybook/addon-highlight@8.1.1': + '@storybook/addon-highlight@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: '@storybook/global': 5.0.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/addon-interactions@8.1.1(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0))': + '@storybook/addon-interactions@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.1.1 - '@storybook/test': 8.1.1(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) - '@storybook/types': 8.1.1 + '@storybook/instrumenter': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/test': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) polished: 4.3.1 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@jest/globals' - - '@types/bun' - - '@types/jest' - - jest - - vitest - '@storybook/addon-links@8.1.1(react@18.3.1)': + '@storybook/addon-links@8.3.0(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/csf': 0.1.7 + '@storybook/csf': 0.1.11 '@storybook/global': 5.0.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 optionalDependencies: - react: 18.3.1 + react: 18.2.0 - '@storybook/addon-measure@8.1.1': + '@storybook/addon-measure@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: '@storybook/global': 5.0.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) tiny-invariant: 1.3.3 - '@storybook/addon-outline@8.1.1': + '@storybook/addon-outline@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: '@storybook/global': 5.0.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 - '@storybook/addon-themes@8.1.1': + '@storybook/addon-themes@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 - '@storybook/addon-toolbars@8.1.1': {} + '@storybook/addon-toolbars@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': + dependencies: + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/addon-viewport@8.1.1': + '@storybook/addon-viewport@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: memoizerific: 1.11.3 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/blocks@8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@storybook/blocks@8.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/channels': 8.1.1 - '@storybook/client-logger': 8.1.1 - '@storybook/components': 8.1.1(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/core-events': 8.1.1 - '@storybook/csf': 0.1.7 - '@storybook/docs-tools': 8.1.1(encoding@0.1.13)(prettier@3.2.5) + '@storybook/csf': 0.1.11 '@storybook/global': 5.0.0 - '@storybook/icons': 1.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/manager-api': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/preview-api': 8.1.1 - '@storybook/theming': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/types': 8.1.1 - '@types/lodash': 4.17.4 + '@storybook/icons': 1.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@types/lodash': 4.17.7 color-convert: 2.0.1 dequal: 2.0.3 lodash: 4.17.21 - markdown-to-jsx: 7.3.2(react@18.3.1) + markdown-to-jsx: 7.5.0(react@18.2.0) memoizerific: 1.11.3 polished: 4.3.1 - react-colorful: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-colorful: 5.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) telejson: 7.2.0 - tocbot: 4.27.20 ts-dedent: 2.2.0 util-deprecate: 1.0.2 optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - prettier - - supports-color + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@storybook/builder-manager@8.1.1(encoding@0.1.13)(prettier@3.2.5)': + '@storybook/builder-vite@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/manager': 8.1.1 - '@storybook/node-logger': 8.1.1 - '@types/ejs': 3.1.5 - '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.20.2) - browser-assert: 1.2.1 - ejs: 3.1.10 - esbuild: 0.20.2 - esbuild-plugin-alias: 0.2.1 - express: 4.19.2 - fs-extra: 11.2.0 - process: 0.11.10 - util: 0.12.5 - transitivePeerDependencies: - - encoding - - prettier - - supports-color - - '@storybook/builder-vite@8.1.1(encoding@0.1.13)(prettier@3.2.5)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))': - dependencies: - '@storybook/channels': 8.1.1 - '@storybook/client-logger': 8.1.1 - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/core-events': 8.1.1 - '@storybook/csf-plugin': 8.1.1 - '@storybook/node-logger': 8.1.1 - '@storybook/preview': 8.1.1 - '@storybook/preview-api': 8.1.1 - '@storybook/types': 8.1.1 + '@storybook/csf-plugin': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@types/find-cache-dir': 3.2.1 browser-assert: 1.2.1 - es-module-lexer: 1.5.2 - express: 4.19.2 + es-module-lexer: 1.5.3 + express: 4.21.0 find-cache-dir: 3.3.2 fs-extra: 11.2.0 magic-string: 0.30.10 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - - encoding - - prettier - - supports-color - - '@storybook/channels@8.1.1': - dependencies: - '@storybook/client-logger': 8.1.1 - '@storybook/core-events': 8.1.1 - '@storybook/global': 5.0.0 - telejson: 7.2.0 - tiny-invariant: 1.3.3 - - '@storybook/cli@8.1.1(@babel/preset-env@7.24.5(@babel/core@7.24.5))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)': - dependencies: - '@babel/core': 7.24.5 - '@babel/types': 7.24.5 - '@ndelangen/get-tarball': 3.0.9 - '@storybook/codemod': 8.1.1 - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/core-events': 8.1.1 - '@storybook/core-server': 8.1.1(bufferutil@4.0.8)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3) - '@storybook/csf-tools': 8.1.1 - '@storybook/node-logger': 8.1.1 - '@storybook/telemetry': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/types': 8.1.1 - '@types/semver': 7.5.8 - '@yarnpkg/fslib': 2.10.3 - '@yarnpkg/libzip': 2.3.0 - chalk: 4.1.2 - commander: 6.2.1 - cross-spawn: 7.0.3 - detect-indent: 6.1.0 - envinfo: 7.13.0 - execa: 5.1.1 - find-up: 5.0.0 - fs-extra: 11.2.0 - get-npm-tarball-url: 2.1.0 - giget: 1.2.3 - globby: 14.0.1 - jscodeshift: 0.15.2(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - leven: 3.1.0 - ora: 5.4.1 - prettier: 3.2.5 - prompts: 2.4.2 - read-pkg-up: 7.0.1 - semver: 7.6.2 - strip-json-comments: 3.1.1 - tempy: 1.0.1 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@babel/preset-env' - - bufferutil - - encoding - - react - - react-dom - - supports-color - - utf-8-validate - - '@storybook/client-logger@8.1.1': - dependencies: - '@storybook/global': 5.0.0 - - '@storybook/codemod@8.1.1': - dependencies: - '@babel/core': 7.24.5 - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) - '@babel/types': 7.24.5 - '@storybook/csf': 0.1.7 - '@storybook/csf-tools': 8.1.1 - '@storybook/node-logger': 8.1.1 - '@storybook/types': 8.1.1 - '@types/cross-spawn': 6.0.6 - cross-spawn: 7.0.3 - globby: 14.0.1 - jscodeshift: 0.15.2(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - lodash: 4.17.21 - prettier: 3.2.5 - recast: 0.23.7 - tiny-invariant: 1.3.3 - transitivePeerDependencies: - - supports-color - - '@storybook/components@8.1.1(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-dialog': 1.0.5(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.2)(react@18.3.1) - '@storybook/client-logger': 8.1.1 - '@storybook/csf': 0.1.7 - '@storybook/global': 5.0.0 - '@storybook/icons': 1.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/theming': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/types': 8.1.1 - memoizerific: 1.11.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - util-deprecate: 1.0.2 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - '@storybook/core-common@8.1.1(encoding@0.1.13)(prettier@3.2.5)': - dependencies: - '@storybook/core-events': 8.1.1 - '@storybook/csf-tools': 8.1.1 - '@storybook/node-logger': 8.1.1 - '@storybook/types': 8.1.1 - '@yarnpkg/fslib': 2.10.3 - '@yarnpkg/libzip': 2.3.0 - chalk: 4.1.2 - cross-spawn: 7.0.3 - esbuild: 0.20.2 - esbuild-register: 3.5.0(esbuild@0.20.2) - execa: 5.1.1 - file-system-cache: 2.3.0 - find-cache-dir: 3.3.2 - find-up: 5.0.0 - fs-extra: 11.2.0 - glob: 10.3.12 - handlebars: 4.7.8 - lazy-universal-dotenv: 4.0.0 - node-fetch: 2.7.0(encoding@0.1.13) - picomatch: 2.3.1 - pkg-dir: 5.0.0 - prettier-fallback: prettier@3.2.5 - pretty-hrtime: 1.0.3 - resolve-from: 5.0.0 - semver: 7.6.2 - tempy: 1.0.1 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 - util: 0.12.5 - optionalDependencies: - prettier: 3.2.5 - transitivePeerDependencies: - - encoding - supports-color + - webpack-sources - '@storybook/core-events@8.1.1': + '@storybook/components@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/csf': 0.1.7 - ts-dedent: 2.2.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/core-server@8.1.1(bufferutil@4.0.8)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)': + '@storybook/core@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)': dependencies: - '@aw-web-design/x-default-browser': 1.4.126 - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 - '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-manager': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/channels': 8.1.1 - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/core-events': 8.1.1 - '@storybook/csf': 0.1.7 - '@storybook/csf-tools': 8.1.1 - '@storybook/docs-mdx': 3.1.0-next.0 - '@storybook/global': 5.0.0 - '@storybook/manager': 8.1.1 - '@storybook/manager-api': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/node-logger': 8.1.1 - '@storybook/preview-api': 8.1.1 - '@storybook/telemetry': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/types': 8.1.1 - '@types/detect-port': 1.3.5 - '@types/diff': 5.2.1 - '@types/node': 18.19.33 - '@types/pretty-hrtime': 1.0.3 - '@types/semver': 7.5.8 - better-opn: 3.0.2 - chalk: 4.1.2 - cli-table3: 0.6.5 - compression: 1.7.4 - detect-port: 1.6.1 - diff: 5.2.0 - express: 4.19.2 - fs-extra: 11.2.0 - globby: 14.0.1 - ip: 2.0.1 - lodash: 4.17.21 - open: 8.4.2 - pretty-hrtime: 1.0.3 - prompts: 2.4.2 - read-pkg-up: 7.0.1 + '@storybook/csf': 0.1.11 + '@types/express': 4.17.21 + browser-assert: 1.2.1 + esbuild: 0.21.3 + esbuild-register: 3.6.0(esbuild@0.21.3) + express: 4.21.0 + process: 0.11.10 + recast: 0.23.9 semver: 7.6.2 - telejson: 7.2.0 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 util: 0.12.5 - util-deprecate: 1.0.2 - watchpack: 2.4.1 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) transitivePeerDependencies: - bufferutil - - encoding - - prettier - - react - - react-dom - supports-color - utf-8-validate - '@storybook/csf-plugin@8.1.1': - dependencies: - '@storybook/csf-tools': 8.1.1 - unplugin: 1.10.1 - transitivePeerDependencies: - - supports-color - - '@storybook/csf-tools@8.1.1': + '@storybook/csf-plugin@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - '@storybook/csf': 0.1.7 - '@storybook/types': 8.1.1 - fs-extra: 11.2.0 - recast: 0.23.7 - ts-dedent: 2.2.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + unplugin: 1.14.1 transitivePeerDependencies: - - supports-color + - webpack-sources '@storybook/csf@0.0.1': dependencies: lodash: 4.17.21 - '@storybook/csf@0.1.7': + '@storybook/csf@0.1.11': dependencies: type-fest: 2.19.0 - '@storybook/docs-mdx@3.1.0-next.0': {} - - '@storybook/docs-tools@8.1.1(encoding@0.1.13)(prettier@3.2.5)': - dependencies: - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/core-events': 8.1.1 - '@storybook/preview-api': 8.1.1 - '@storybook/types': 8.1.1 - '@types/doctrine': 0.0.3 - assert: 2.1.0 - doctrine: 3.0.0 - lodash: 4.17.21 - transitivePeerDependencies: - - encoding - - prettier - - supports-color - '@storybook/global@5.0.0': {} - '@storybook/icons@1.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@storybook/icons@1.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@storybook/instrumenter@8.1.1': + '@storybook/instrumenter@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/channels': 8.1.1 - '@storybook/client-logger': 8.1.1 - '@storybook/core-events': 8.1.1 '@storybook/global': 5.0.0 - '@storybook/preview-api': 8.1.1 - '@vitest/utils': 1.6.0 + '@vitest/utils': 2.1.1 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) util: 0.12.5 - '@storybook/manager-api@8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@storybook/channels': 8.1.1 - '@storybook/client-logger': 8.1.1 - '@storybook/core-events': 8.1.1 - '@storybook/csf': 0.1.7 - '@storybook/global': 5.0.0 - '@storybook/icons': 1.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/router': 8.1.1 - '@storybook/theming': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/types': 8.1.1 - dequal: 2.0.3 - lodash: 4.17.21 - memoizerific: 1.11.3 - store2: 2.14.3 - telejson: 7.2.0 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - react - - react-dom - - '@storybook/manager@8.1.1': {} - - '@storybook/node-logger@8.1.1': {} - - '@storybook/preview-api@8.1.1': + '@storybook/manager-api@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/channels': 8.1.1 - '@storybook/client-logger': 8.1.1 - '@storybook/core-events': 8.1.1 - '@storybook/csf': 0.1.7 - '@storybook/global': 5.0.0 - '@storybook/types': 8.1.1 - '@types/qs': 6.9.15 - dequal: 2.0.3 - lodash: 4.17.21 - memoizerific: 1.11.3 - qs: 6.12.1 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - - '@storybook/preview@8.1.1': {} + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/react-dom-shim@8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@storybook/preview-api@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/router@8.1.1': + '@storybook/react-dom-shim@8.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/client-logger': 8.1.1 - memoizerific: 1.11.3 - qs: 6.12.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/svelte-vite@8.1.1(@babel/core@7.24.5)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(encoding@0.1.13)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(prettier@3.2.5)(svelte@4.2.16)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))': + '@storybook/svelte-vite@8.3.0(@babel/core@7.25.2)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@storybook/builder-vite': 8.1.1(encoding@0.1.13)(prettier@3.2.5)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) - '@storybook/node-logger': 8.1.1 - '@storybook/svelte': 8.1.1(encoding@0.1.13)(prettier@3.2.5)(svelte@4.2.16) - '@storybook/types': 8.1.1 - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + '@storybook/builder-vite': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) + '@storybook/svelte': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) magic-string: 0.30.10 - svelte: 4.2.16 - svelte-preprocess: 5.1.4(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16)(typescript@5.4.5) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + svelte: 4.2.17 + svelte-preprocess: 5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(svelte@4.2.17)(typescript@5.4.5) sveltedoc-parser: 4.2.1 ts-dedent: 2.2.0 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - '@babel/core' - '@preact/preset-vite' - coffeescript - - encoding - less - postcss - postcss-load-config - - prettier - pug - sass - stylus @@ -16096,43 +18535,40 @@ snapshots: - supports-color - typescript - vite-plugin-glimmerx + - webpack-sources - '@storybook/svelte@8.1.1(encoding@0.1.13)(prettier@3.2.5)(svelte@4.2.16)': + '@storybook/svelte@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17)': dependencies: - '@storybook/client-logger': 8.1.1 - '@storybook/core-events': 8.1.1 - '@storybook/docs-tools': 8.1.1(encoding@0.1.13)(prettier@3.2.5) + '@storybook/components': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/global': 5.0.0 - '@storybook/preview-api': 8.1.1 - '@storybook/types': 8.1.1 - svelte: 4.2.16 + '@storybook/manager-api': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/preview-api': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/theming': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + svelte: 4.2.17 sveltedoc-parser: 4.2.1 ts-dedent: 2.2.0 type-fest: 2.19.0 transitivePeerDependencies: - - encoding - - prettier - supports-color - '@storybook/sveltekit@8.1.1(@babel/core@7.24.5)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(encoding@0.1.13)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(prettier@3.2.5)(svelte@4.2.16)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))': + '@storybook/sveltekit@8.3.0(@babel/core@7.25.2)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@storybook/addon-actions': 8.1.1 - '@storybook/builder-vite': 8.1.1(encoding@0.1.13)(prettier@3.2.5)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) - '@storybook/svelte': 8.1.1(encoding@0.1.13)(prettier@3.2.5)(svelte@4.2.16) - '@storybook/svelte-vite': 8.1.1(@babel/core@7.24.5)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(encoding@0.1.13)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(prettier@3.2.5)(svelte@4.2.16)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) - '@storybook/types': 8.1.1 - svelte: 4.2.16 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + '@storybook/addon-actions': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/builder-vite': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) + '@storybook/svelte': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17) + '@storybook/svelte-vite': 8.3.0(@babel/core@7.25.2)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + svelte: 4.2.17 + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - '@babel/core' - '@preact/preset-vite' - '@sveltejs/vite-plugin-svelte' - coffeescript - - encoding - less - postcss - postcss-load-config - - prettier - pug - sass - stylus @@ -16140,70 +18576,61 @@ snapshots: - supports-color - typescript - vite-plugin-glimmerx + - webpack-sources - '@storybook/telemetry@8.1.1(encoding@0.1.13)(prettier@3.2.5)': + '@storybook/test@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/client-logger': 8.1.1 - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/csf-tools': 8.1.1 - chalk: 4.1.2 - detect-package-manager: 2.0.1 - fetch-retry: 5.0.6 - fs-extra: 11.2.0 - read-pkg-up: 7.0.1 - transitivePeerDependencies: - - encoding - - prettier - - supports-color + '@storybook/csf': 0.1.11 + '@storybook/global': 5.0.0 + '@storybook/instrumenter': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@testing-library/dom': 10.4.0 + '@testing-library/jest-dom': 6.5.0 + '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) + '@vitest/expect': 2.0.5 + '@vitest/spy': 2.0.5 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + util: 0.12.5 - '@storybook/test@8.1.1(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0))': + '@storybook/theming@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/client-logger': 8.1.1 - '@storybook/core-events': 8.1.1 - '@storybook/instrumenter': 8.1.1 - '@storybook/preview-api': 8.1.1 - '@testing-library/dom': 9.3.4 - '@testing-library/jest-dom': 6.4.5(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) - '@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4) - '@vitest/expect': 1.3.1 - '@vitest/spy': 1.6.0 - util: 0.12.5 - transitivePeerDependencies: - - '@jest/globals' - - '@types/bun' - - '@types/jest' - - jest - - vitest + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/theming@8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))': dependencies: - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) - '@storybook/client-logger': 8.1.1 - '@storybook/global': 5.0.0 - memoizerific: 1.11.3 - optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) + import-meta-resolve: 4.0.0 - '@storybook/types@8.1.1': + '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))': dependencies: - '@storybook/channels': 8.1.1 - '@types/express': 4.17.21 - file-system-cache: 2.3.0 + '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) + import-meta-resolve: 4.0.0 - '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))': + '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))': dependencies: - '@sveltejs/kit': 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) - import-meta-resolve: 4.1.0 + '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) + import-meta-resolve: 4.0.0 - '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))': + '@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/kit': 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) + '@types/cookie': 0.6.0 + cookie: 0.6.0 + devalue: 5.0.0 + esm-env: 1.0.0 import-meta-resolve: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.10 + mrmime: 2.0.0 + sade: 1.8.1 + set-cookie-parser: 2.6.0 + sirv: 2.0.4 + svelte: 4.2.13 + tiny-glob: 0.2.9 + vite: 4.5.3(@types/node@20.12.7)(terser@5.27.2) - '@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0))': + '@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.0.0 @@ -16215,13 +18642,13 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.4 - svelte: 4.2.16 + svelte: 4.2.13 tiny-glob: 0.2.9 - vite: 4.5.3(@types/node@20.12.11)(terser@5.31.0) + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) - '@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))': + '@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.0.0 @@ -16233,104 +18660,127 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.4 - svelte: 4.2.16 + svelte: 4.2.17 tiny-glob: 0.2.9 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) - '@sveltejs/package@2.3.1(svelte@4.2.16)(typescript@5.4.5)': + '@sveltejs/package@2.3.5(svelte@4.2.17)(typescript@5.4.5)': dependencies: - chokidar: 3.6.0 + chokidar: 4.0.0 kleur: 4.1.5 sade: 1.8.1 semver: 7.6.2 - svelte: 4.2.16 - svelte2tsx: 0.7.8(svelte@4.2.16)(typescript@5.4.5) + svelte: 4.2.17 + svelte2tsx: 0.7.19(svelte@4.2.17)(typescript@5.4.5) transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0))': + '@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2))': + dependencies: + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) + debug: 4.3.4 + svelte: 4.2.13 + vite: 4.5.3(@types/node@20.12.7)(terser@5.27.2) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) debug: 4.3.4 - svelte: 4.2.16 - vite: 4.5.3(@types/node@20.12.11)(terser@5.31.0) + svelte: 4.2.13 + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))': + '@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) debug: 4.3.4 - svelte: 4.2.16 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + svelte: 4.2.17 + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0))': + '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.10 - svelte: 4.2.16 - svelte-hmr: 0.16.0(svelte@4.2.16) - vite: 4.5.3(@types/node@20.12.11)(terser@5.31.0) - vitefu: 0.2.5(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + magic-string: 0.30.9 + svelte: 4.2.13 + svelte-hmr: 0.16.0(svelte@4.2.13) + vite: 4.5.3(@types/node@20.12.7)(terser@5.27.2) + vitefu: 0.2.5(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))': + '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.10 - svelte: 4.2.16 - svelte-hmr: 0.16.0(svelte@4.2.16) - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) - vitefu: 0.2.5(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + magic-string: 0.30.9 + svelte: 4.2.13 + svelte-hmr: 0.16.0(svelte@4.2.13) + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) + vitefu: 0.2.5(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) + debug: 4.3.4 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.9 + svelte: 4.2.17 + svelte-hmr: 0.16.0(svelte@4.2.17) + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) + vitefu: 0.2.5(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) transitivePeerDependencies: - supports-color + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.38)': + '@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.39)': dependencies: - postcss: 8.4.38 - postcss-nested: 5.0.6(postcss@8.4.38) + postcss: 8.4.39 + postcss-nested: 5.0.6(postcss@8.4.39) - '@testing-library/dom@9.3.4': + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 '@types/aria-query': 5.0.4 - aria-query: 5.1.3 + aria-query: 5.3.0 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.5(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0))': + '@testing-library/jest-dom@6.5.0': dependencies: - '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.24.5 + '@adobe/css-tools': 4.4.0 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - optionalDependencies: - '@types/jest': 29.5.12 - vitest: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) - '@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4)': + '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': dependencies: - '@testing-library/dom': 9.3.4 + '@testing-library/dom': 10.4.0 '@ts-morph/common@0.20.0': dependencies: @@ -16339,7 +18789,7 @@ snapshots: mkdirp: 2.1.6 path-browserify: 1.0.1 - '@tsconfig/node10@1.0.11': {} + '@tsconfig/node10@1.0.9': {} '@tsconfig/node12@1.0.11': {} @@ -16356,63 +18806,65 @@ snapshots: '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.25.6 - '@types/babel__traverse@7.20.5': + '@types/bn.js@4.11.6': dependencies: - '@babel/types': 7.24.5 + '@types/node': 20.12.7 '@types/bn.js@5.1.5': dependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.12.11 + '@types/node': 20.12.7 - '@types/connect@3.4.38': + '@types/cacheable-request@6.0.3': dependencies: - '@types/node': 20.12.11 + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 20.12.7 + '@types/responselike': 1.0.3 - '@types/cookie@0.6.0': {} + '@types/chrome@0.0.136': + dependencies: + '@types/filesystem': 0.0.35 + '@types/har-format': 1.2.15 - '@types/cross-spawn@6.0.6': + '@types/connect@3.4.38': dependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 + + '@types/cookie@0.6.0': {} '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 - '@types/detect-port@1.3.5': {} - - '@types/diff@5.2.1': {} - '@types/dns-packet@5.6.5': dependencies: - '@types/node': 20.12.11 - - '@types/doctrine@0.0.3': {} + '@types/node': 20.12.7 '@types/dom-screen-wake-lock@1.0.3': {} - '@types/ejs@3.1.5': {} - - '@types/emscripten@1.39.12': {} - '@types/eslint@8.56.10': dependencies: '@types/estree': 1.0.5 @@ -16424,22 +18876,30 @@ snapshots: '@types/estree@1.0.5': {} - '@types/express-serve-static-core@4.19.0': + '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 20.12.11 - '@types/qs': 6.9.15 + '@types/node': 20.12.7 + '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.0 - '@types/qs': 6.9.15 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.16 '@types/serve-static': 1.15.7 + '@types/filesystem@0.0.35': + dependencies: + '@types/filewriter': 0.0.33 + + '@types/filewriter@0.0.33': {} + '@types/find-cache-dir@3.2.1': {} + '@types/har-format@1.2.15': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.2 @@ -16467,7 +18927,13 @@ snapshots: '@types/json5@0.0.29': {} - '@types/lodash@4.17.4': {} + '@types/keyv@3.1.4': + dependencies: + '@types/node': 20.12.7 + + '@types/lodash@4.17.7': {} + + '@types/lru-cache@5.1.1': {} '@types/mdast@4.0.4': dependencies: @@ -16481,66 +18947,68 @@ snapshots: '@types/ms@0.7.34': {} - '@types/nlcst@1.0.4': + '@types/nlcst@2.0.3': dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.2 - '@types/node-forge@1.3.11': - dependencies: - '@types/node': 20.12.11 + '@types/node@12.20.55': {} '@types/node@17.0.45': {} - '@types/node@18.19.33': + '@types/node@18.15.13': {} + + '@types/node@18.19.31': dependencies: undici-types: 5.26.5 - '@types/node@20.12.11': + '@types/node@20.12.7': dependencies: undici-types: 5.26.5 - '@types/normalize-package-data@2.4.4': {} - '@types/object-hash@3.0.6': {} + '@types/parse-json@4.0.2': {} + '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 20.12.11 - - '@types/pretty-hrtime@1.0.3': {} + '@types/node': 20.12.7 '@types/prop-types@15.7.12': {} '@types/pug@2.0.10': {} - '@types/qs@6.9.15': {} + '@types/qs@6.9.16': {} '@types/range-parser@1.2.7': {} - '@types/react@18.3.2': + '@types/react@18.3.5': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 + '@types/responselike@1.0.3': + dependencies: + '@types/node': 20.12.7 + '@types/sax@1.2.7': dependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 '@types/secp256k1@4.0.6': dependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 - '@types/semver@7.5.8': {} + '@types/semver@7.5.7': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.12.11 + '@types/node': 20.12.7 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.12.11 + '@types/node': 20.12.7 '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} @@ -16551,6 +19019,8 @@ snapshots: '@types/unist@3.0.2': {} + '@types/uuid@10.0.0': {} + '@types/uuid@9.0.8': {} '@types/yargs-parser@21.0.3': {} @@ -16563,34 +19033,129 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.0)(typescript@5.4.3)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/type-utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/parser': 7.7.0(eslint@8.55.0)(typescript@5.4.3) + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/type-utils': 7.4.0(eslint@8.55.0)(typescript@5.4.3) + '@typescript-eslint/utils': 7.4.0(eslint@8.55.0)(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 - eslint: 8.57.0 + eslint: 8.55.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.0 + ts-api-utils: 1.2.1(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.7.0(eslint@8.56.0)(typescript@5.4.3) + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/type-utils': 7.4.0(eslint@8.56.0)(typescript@5.4.3) + '@typescript-eslint/utils': 7.4.0(eslint@8.56.0)(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.4.0 + debug: 4.3.4 + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.0 + ts-api-utils: 1.2.1(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.9.0(eslint@8.56.0)(typescript@5.4.3) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/type-utils': 7.9.0(eslint@8.56.0)(typescript@5.4.3) + '@typescript-eslint/utils': 7.9.0(eslint@8.56.0)(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.9.0 + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.9.0(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/type-utils': 7.9.0(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.9.0(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.9.0 + eslint: 8.56.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + eslint: 8.55.0 + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + eslint: 8.56.0 + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.9.0 + debug: 4.3.4 + eslint: 8.56.0 + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.9.0 debug: 4.3.4 - eslint: 8.57.0 + eslint: 8.56.0 optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: @@ -16601,17 +19166,63 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@7.8.0': + '@typescript-eslint/scope-manager@7.4.0': + dependencies: + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/visitor-keys': 7.4.0 + + '@typescript-eslint/scope-manager@7.7.0': + dependencies: + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 + + '@typescript-eslint/scope-manager@7.9.0': + dependencies: + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/visitor-keys': 7.9.0 + + '@typescript-eslint/type-utils@7.4.0(eslint@8.55.0)(typescript@5.4.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3) + '@typescript-eslint/utils': 7.4.0(eslint@8.55.0)(typescript@5.4.3) + debug: 4.3.4 + eslint: 8.55.0 + ts-api-utils: 1.2.1(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@7.4.0(eslint@8.56.0)(typescript@5.4.3)': dependencies: - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3) + '@typescript-eslint/utils': 7.4.0(eslint@8.56.0)(typescript@5.4.3) + debug: 4.3.4 + eslint: 8.56.0 + ts-api-utils: 1.2.1(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@7.9.0(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.3) + '@typescript-eslint/utils': 7.9.0(eslint@8.56.0)(typescript@5.4.3) + debug: 4.3.4 + eslint: 8.56.0 + ts-api-utils: 1.3.0(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/type-utils@7.8.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/type-utils@7.9.0(eslint@8.56.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.9.0(eslint@8.56.0)(typescript@5.4.5) debug: 4.3.4 - eslint: 8.57.0 + eslint: 8.56.0 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 @@ -16620,101 +19231,225 @@ snapshots: '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@7.8.0': {} + '@typescript-eslint/types@7.4.0': {} + + '@typescript-eslint/types@7.7.0': {} + + '@typescript-eslint/types@7.9.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.3)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.2 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.3)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.7(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.3 tsutils: 3.21.0(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.3)': + dependencies: + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/visitor-keys': 7.4.0 + debug: 4.3.7(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.7.0(typescript@5.4.3)': + dependencies: + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.9.0(typescript@5.4.3)': dependencies: - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/visitor-keys': 7.9.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.4.5) + ts-api-utils: 1.3.0(typescript@5.4.3) optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.9.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/visitor-keys': 7.9.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.5.3) + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.7 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.3) + eslint: 8.56.0 + eslint-scope: 5.1.1 + semver: 7.6.2 transitivePeerDependencies: - supports-color + - typescript - '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.4.5)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 + '@types/semver': 7.5.7 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - eslint: 8.57.0 + eslint: 8.56.0 eslint-scope: 5.1.1 semver: 7.6.2 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/utils@7.4.0(eslint@8.55.0)(typescript@5.4.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.7 + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3) + eslint: 8.55.0 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.4.0(eslint@8.56.0)(typescript@5.4.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) - eslint: 8.57.0 + '@types/semver': 7.5.7 + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3) + eslint: 8.56.0 semver: 7.6.2 transitivePeerDependencies: - supports-color - typescript + '@typescript-eslint/utils@7.9.0(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.3) + eslint: 8.56.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.9.0(eslint@8.56.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) + eslint: 8.56.0 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.8.0': + '@typescript-eslint/visitor-keys@7.4.0': + dependencies: + '@typescript-eslint/types': 7.4.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.7.0': + dependencies: + '@typescript-eslint/types': 7.7.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.9.0': dependencies: - '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/types': 7.9.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} - '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0))': + '@vitest/coverage-v8@1.4.0(vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2))': dependencies: - '@ampproject/remapping': 2.3.0 + '@ampproject/remapping': 2.2.1 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.4 + debug: 4.3.5 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.4 + istanbul-lib-source-maps: 5.0.5 istanbul-reports: 3.1.7 - magic-string: 0.30.10 - magicast: 0.3.4 + magic-string: 0.30.7 + magicast: 0.3.3 picocolors: 1.0.0 std-env: 3.7.0 - strip-literal: 2.1.0 + strip-literal: 2.0.0 test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + v8-to-istanbul: 9.2.0 + vitest: 1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2) transitivePeerDependencies: - supports-color - '@vitest/expect@1.3.1': + '@vitest/expect@1.5.0': dependencies: - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 + '@vitest/spy': 1.5.0 + '@vitest/utils': 1.5.0 chai: 4.4.1 '@vitest/expect@1.6.0': @@ -16723,27 +19458,58 @@ snapshots: '@vitest/utils': 1.6.0 chai: 4.4.1 + '@vitest/expect@2.0.5': + dependencies: + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.0.5': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.1.1': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@1.5.0': + dependencies: + '@vitest/utils': 1.5.0 + p-limit: 5.0.0 + pathe: 1.1.2 + '@vitest/runner@1.6.0': dependencies: '@vitest/utils': 1.6.0 p-limit: 5.0.0 pathe: 1.1.2 - '@vitest/snapshot@1.6.0': + '@vitest/snapshot@1.5.0': dependencies: magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 - '@vitest/spy@1.3.1': + '@vitest/snapshot@1.6.0': + dependencies: + magic-string: 0.30.9 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.5.0': dependencies: - tinyspy: 2.2.1 + tinyspy: 2.2.0 '@vitest/spy@1.6.0': dependencies: - tinyspy: 2.2.1 + tinyspy: 2.2.0 - '@vitest/utils@1.3.1': + '@vitest/spy@2.0.5': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@1.5.0': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -16757,26 +19523,37 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 - '@volar/kit@2.2.2(typescript@5.4.5)': + '@vitest/utils@2.0.5': + dependencies: + '@vitest/pretty-format': 2.0.5 + estree-walker: 3.0.3 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + + '@vitest/utils@2.1.1': + dependencies: + '@vitest/pretty-format': 2.1.1 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + + '@volar/kit@2.4.5(typescript@5.4.5)': dependencies: - '@volar/language-service': 2.2.2 - '@volar/typescript': 2.2.2 + '@volar/language-service': 2.4.5 + '@volar/typescript': 2.4.5 typesafe-path: 0.2.2 - typescript: 5.4.5 + typescript: 5.5.3 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - '@volar/language-core@2.2.2': + '@volar/language-core@2.4.5': dependencies: - '@volar/source-map': 2.2.2 + '@volar/source-map': 2.4.5 - '@volar/language-server@2.2.2': + '@volar/language-server@2.4.5': dependencies: - '@volar/language-core': 2.2.2 - '@volar/language-service': 2.2.2 - '@volar/snapshot-document': 2.2.2 - '@volar/typescript': 2.2.2 - '@vscode/l10n': 0.0.16 + '@volar/language-core': 2.4.5 + '@volar/language-service': 2.4.5 + '@volar/typescript': 2.4.5 path-browserify: 1.0.1 request-light: 0.7.0 vscode-languageserver: 9.0.1 @@ -16784,26 +19561,20 @@ snapshots: vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - '@volar/language-service@2.2.2': + '@volar/language-service@2.4.5': dependencies: - '@volar/language-core': 2.2.2 + '@volar/language-core': 2.4.5 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - '@volar/snapshot-document@2.2.2': - dependencies: - vscode-languageserver-protocol: 3.17.5 - vscode-languageserver-textdocument: 1.0.11 + '@volar/source-map@2.4.5': {} - '@volar/source-map@2.2.2': + '@volar/typescript@2.4.5': dependencies: - muggle-string: 0.4.1 - - '@volar/typescript@2.2.2': - dependencies: - '@volar/language-core': 2.2.2 + '@volar/language-core': 2.4.5 path-browserify: 1.0.1 + vscode-uri: 3.0.8 '@vscode/emmet-helper@2.9.3': dependencies: @@ -16813,30 +19584,29 @@ snapshots: vscode-languageserver-types: 3.17.5 vscode-uri: 2.1.2 - '@vscode/l10n@0.0.16': {} - '@vscode/l10n@0.0.18': {} - '@wagmi/cli@2.1.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)': + '@wagmi/cli@2.1.15(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)': dependencies: - abitype: 0.9.10(typescript@5.4.5)(zod@3.23.8) - bundle-require: 4.1.0(esbuild@0.19.12) + abitype: 1.0.6(typescript@5.4.5)(zod@3.23.8) + bundle-require: 4.0.2(esbuild@0.19.12) cac: 6.7.14 - change-case: 4.1.2 + change-case: 5.4.4 chokidar: 3.6.0 dedent: 0.7.0 dotenv: 16.4.5 dotenv-expand: 10.0.0 esbuild: 0.19.12 execa: 8.0.1 + fdir: 6.3.0(picomatch@3.0.1) find-up: 6.3.0 fs-extra: 11.2.0 - globby: 13.2.2 ora: 6.3.1 pathe: 1.1.2 picocolors: 1.0.0 + picomatch: 3.0.1 prettier: 3.2.5 - viem: 2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) zod: 3.23.8 optionalDependencies: typescript: 5.4.5 @@ -16844,45 +19614,81 @@ snapshots: - bufferutil - utf-8-validate - '@wagmi/cli@2.1.8(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)': + '@wagmi/cli@2.1.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)': dependencies: - abitype: 1.0.2(typescript@5.4.5)(zod@3.23.8) - bundle-require: 4.1.0(esbuild@0.19.12) + abitype: 0.9.10(typescript@5.4.3)(zod@3.22.4) + bundle-require: 4.0.2(esbuild@0.19.12) cac: 6.7.14 - change-case: 4.1.2 + change-case: 5.4.4 chokidar: 3.6.0 dedent: 0.7.0 dotenv: 16.4.5 dotenv-expand: 10.0.0 esbuild: 0.19.12 execa: 8.0.1 + fdir: 6.1.1(picomatch@3.0.1) find-up: 6.3.0 fs-extra: 11.2.0 - globby: 13.2.2 ora: 6.3.1 pathe: 1.1.2 picocolors: 1.0.0 prettier: 3.2.5 - viem: 2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - zod: 3.23.8 + viem: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + zod: 3.22.4 optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@wagmi/connectors@4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)': + '@wagmi/connectors@4.1.18(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4)': dependencies: '@coinbase/wallet-sdk': 3.9.1 - '@metamask/sdk': 0.18.6(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(utf-8-validate@6.0.3) - '@safe-global/safe-apps-provider': 0.18.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - '@wagmi/core': 2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) - '@walletconnect/ethereum-provider': 2.13.0(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) - '@walletconnect/modal': 2.6.2(@types/react@18.3.2)(react@18.3.1) - viem: 2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + '@metamask/sdk': 0.14.3(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.1(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@wagmi/core': 2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + '@walletconnect/ethereum-provider': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - react + - react-dom + - react-native + - rollup + - supports-color + - utf-8-validate + - zod + + '@wagmi/connectors@4.3.10(vnbhrjghrun7rfuxsawo7otej4)': + dependencies: + '@coinbase/wallet-sdk': 3.9.1 + '@metamask/sdk': 0.20.3(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.1(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + '@wagmi/core': 2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + '@walletconnect/ethereum-provider': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) + viem: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + optionalDependencies: + typescript: 5.4.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -16899,28 +19705,26 @@ snapshots: - '@vercel/kv' - bufferutil - encoding - - ioredis - react - react-dom - react-i18next - react-native - rollup - supports-color - - uWebSockets.js - utf-8-validate - zod - '@wagmi/connectors@5.0.6(@types/react@18.3.2)(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)': + '@wagmi/connectors@5.1.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)': dependencies: - '@coinbase/wallet-sdk': 4.0.2 - '@metamask/sdk': 0.20.3(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(utf-8-validate@6.0.3) - '@safe-global/safe-apps-provider': 0.18.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - '@wagmi/core': 2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) - '@walletconnect/ethereum-provider': 2.13.0(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) - '@walletconnect/modal': 2.6.2(@types/react@18.3.2)(react@18.3.1) + '@coinbase/wallet-sdk': 4.0.4 + '@metamask/sdk': 0.28.2(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.3(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + '@wagmi/core': 2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) + '@walletconnect/ethereum-provider': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: @@ -16939,25 +19743,22 @@ snapshots: - '@vercel/kv' - bufferutil - encoding - - ioredis - react - react-dom - - react-i18next - react-native - rollup - supports-color - - uWebSockets.js - utf-8-validate - zod - '@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)': + '@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)': dependencies: eventemitter3: 5.0.1 - mipd: 0.0.5(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - viem: 2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - zustand: 4.4.1(@types/react@18.3.2)(react@18.3.1) + mipd: 0.0.5(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + viem: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + zustand: 4.4.1(@types/react@18.3.5)(react@18.2.0) optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 transitivePeerDependencies: - '@types/react' - bufferutil @@ -16966,14 +19767,27 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)': + '@wagmi/core@2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))': dependencies: eventemitter3: 5.0.1 - mipd: 0.0.5(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - viem: 2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - zustand: 4.4.1(@types/react@18.3.2)(react@18.3.1) + mipd: 0.0.7(typescript@5.4.5) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + zustand: 4.4.1(@types/react@18.3.5)(react@18.2.0) optionalDependencies: typescript: 5.4.5 + transitivePeerDependencies: + - '@types/react' + - immer + - react + + '@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4)': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.5(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + zustand: 4.4.1(@types/react@18.3.5)(react@18.2.0) + optionalDependencies: + typescript: 5.4.3 transitivePeerDependencies: - '@types/react' - bufferutil @@ -16982,25 +19796,41 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@6.0.3)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)': dependencies: - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-provider': 1.0.14 - '@walletconnect/jsonrpc-types': 1.0.4 + eventemitter3: 5.0.1 + mipd: 0.0.5(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8) + zustand: 4.4.1(@types/react@18.3.5)(react@18.2.0) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - utf-8-validate + - zod + + '@walletconnect/core@2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) '@walletconnect/logger': 2.1.2 - '@walletconnect/relay-api': 1.0.10 + '@walletconnect/relay-api': 1.0.9 '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.13.0 - '@walletconnect/utils': 2.13.0 + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) events: 3.3.0 isomorphic-unfetch: 3.1.0(encoding@0.1.13) lodash.isequal: 4.5.0 - uint8arrays: 3.1.0 + uint8arrays: 3.1.1 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17016,26 +19846,65 @@ snapshots: - '@vercel/kv' - bufferutil - encoding - - ioredis - - uWebSockets.js + - supports-color - utf-8-validate - '@walletconnect/environment@1.0.1': + '@walletconnect/core@2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - tslib: 1.14.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + isomorphic-unfetch: 3.1.0(encoding@0.1.13) + lodash.isequal: 4.5.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - supports-color + - utf-8-validate - '@walletconnect/ethereum-provider@2.13.0(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3)': + '@walletconnect/core@2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) + '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/modal': 2.6.2(@types/react@18.3.2)(react@18.3.1) - '@walletconnect/sign-client': 2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@walletconnect/types': 2.13.0 - '@walletconnect/universal-provider': 2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@walletconnect/utils': 2.13.0 + '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.10 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) events: 3.3.0 + isomorphic-unfetch: 3.1.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17047,79 +19916,734 @@ snapshots: - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - - '@types/react' - '@upstash/redis' - '@vercel/kv' - bufferutil - encoding - ioredis - - react - uWebSockets.js - utf-8-validate - '@walletconnect/events@1.0.1': - dependencies: - keyvaluestorage-interface: 1.0.0 - tslib: 1.14.1 - - '@walletconnect/heartbeat@1.2.1': - dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/time': 1.0.2 - tslib: 1.14.1 - - '@walletconnect/heartbeat@1.2.2': - dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/time': 1.0.2 - events: 3.3.0 - - '@walletconnect/jsonrpc-http-connection@1.0.8(encoding@0.1.13)': + '@walletconnect/core@2.13.3': dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.14 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.10 + '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 - cross-fetch: 3.1.8(encoding@0.1.13) + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.13.3 + '@walletconnect/utils': 2.13.3 events: 3.3.0 + isomorphic-unfetch: 3.1.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.0 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil - encoding + - supports-color + - utf-8-validate - '@walletconnect/jsonrpc-provider@1.0.14': + '@walletconnect/core@2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) events: 3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - supports-color + - utf-8-validate - '@walletconnect/jsonrpc-types@1.0.3': + '@walletconnect/environment@1.0.1': dependencies: - keyvaluestorage-interface: 1.0.0 tslib: 1.14.1 - '@walletconnect/jsonrpc-types@1.0.4': + '@walletconnect/ethereum-provider@2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)': dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) + '@walletconnect/sign-client': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/universal-provider': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) events: 3.3.0 - keyvaluestorage-interface: 1.0.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - react + - supports-color + - utf-8-validate - '@walletconnect/jsonrpc-utils@1.0.8': + '@walletconnect/ethereum-provider@2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)': dependencies: - '@walletconnect/environment': 1.0.1 - '@walletconnect/jsonrpc-types': 1.0.4 - tslib: 1.14.1 + '@walletconnect/jsonrpc-http-connection': 1.0.7(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) + '@walletconnect/sign-client': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/universal-provider': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - react + - supports-color + - utf-8-validate - '@walletconnect/jsonrpc-ws-connection@1.0.14(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + '@walletconnect/ethereum-provider@2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)': dependencies: + '@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/safe-json': 1.0.2 + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) + '@walletconnect/sign-client': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/universal-provider': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) events: 3.3.0 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3) transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - react + - supports-color + - utf-8-validate + + '@walletconnect/ethereum-provider@2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)': + dependencies: + '@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/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) + '@walletconnect/sign-client': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/universal-provider': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - react + - supports-color + - utf-8-validate + + '@walletconnect/ethereum-provider@2.13.3(react@18.3.1)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.6.2(react@18.3.1) + '@walletconnect/sign-client': 2.13.3 + '@walletconnect/types': 2.13.3 + '@walletconnect/universal-provider': 2.13.3 + '@walletconnect/utils': 2.13.3 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - react + - uWebSockets.js + - utf-8-validate + + '@walletconnect/events@1.0.1': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.1': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.2': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-http-connection@1.0.7(encoding@0.1.13)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.1.8(encoding@0.1.13) + tslib: 1.14.1 + transitivePeerDependencies: + - encoding + + '@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.1.8 + events: 3.3.0 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-provider@1.0.13': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-types@1.0.3': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + + '@walletconnect/jsonrpc-utils@1.0.8': + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.3 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-ws-connection@1.0.14(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.1 + unstorage: 1.10.1(idb-keyval@6.2.1) + optionalDependencies: + '@react-native-async-storage/async-storage': 1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/kv' + - supports-color + + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/modal-core@2.6.2(@types/react@18.3.5)(react@18.2.0)': + dependencies: + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal-ui@2.6.2(@types/react@18.3.5)(react@18.2.0)': + dependencies: + '@walletconnect/modal-core': 2.6.2(@types/react@18.3.5)(react@18.2.0) + lit: 2.8.0 + motion: 10.16.2 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal@2.6.2(@types/react@18.3.5)(react@18.2.0)': + dependencies: + '@walletconnect/modal-core': 2.6.2(@types/react@18.3.5)(react@18.2.0) + '@walletconnect/modal-ui': 2.6.2(@types/react@18.3.5)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/relay-api@1.0.10': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-api@1.0.11': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-api@1.0.9': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.3 + tslib: 1.14.1 + + '@walletconnect/relay-auth@1.0.4': + dependencies: + '@stablelib/ed25519': 1.0.3 + '@stablelib/random': 1.0.2 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + uint8arrays: 3.1.1 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@walletconnect/sign-client@2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@walletconnect/sign-client@2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@walletconnect/sign-client@2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - supports-color + - utf-8-validate + + '@walletconnect/sign-client@2.13.3': + dependencies: + '@walletconnect/core': 2.13.3 + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.13.3 + '@walletconnect/utils': 2.13.3 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - uWebSockets.js + - utf-8-validate + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - supports-color + + '@walletconnect/types@2.12.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - supports-color + + '@walletconnect/types@2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - supports-color + + '@walletconnect/types@2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - supports-color + + '@walletconnect/types@2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - supports-color + + '@walletconnect/universal-provider@2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@walletconnect/universal-provider@2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' - bufferutil + - encoding + - supports-color - utf-8-validate - '@walletconnect/keyvaluestorage@1.1.1': + '@walletconnect/universal-provider@2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@walletconnect/safe-json': 1.0.2 - idb-keyval: 6.2.1 - unstorage: 1.10.2(idb-keyval@6.2.1) + '@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/logger': 2.1.2 + '@walletconnect/sign-client': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17130,68 +20654,24 @@ snapshots: - '@capacitor/preferences' - '@netlify/blobs' - '@planetscale/database' + - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/kv' - - ioredis - - uWebSockets.js - - '@walletconnect/logger@2.1.2': - dependencies: - '@walletconnect/safe-json': 1.0.2 - pino: 7.11.0 - - '@walletconnect/modal-core@2.6.2(@types/react@18.3.2)(react@18.3.1)': - dependencies: - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react - - '@walletconnect/modal-ui@2.6.2(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@walletconnect/modal-core': 2.6.2(@types/react@18.3.2)(react@18.3.1) - lit: 2.8.0 - motion: 10.16.2 - qrcode: 1.5.3 - transitivePeerDependencies: - - '@types/react' - - react - - '@walletconnect/modal@2.6.2(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@walletconnect/modal-core': 2.6.2(@types/react@18.3.2)(react@18.3.1) - '@walletconnect/modal-ui': 2.6.2(@types/react@18.3.2)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react + - bufferutil + - encoding + - supports-color + - utf-8-validate - '@walletconnect/relay-api@1.0.10': + '@walletconnect/universal-provider@2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 - - '@walletconnect/relay-auth@1.0.4': - dependencies: - '@stablelib/ed25519': 1.0.3 - '@stablelib/random': 1.0.2 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - tslib: 1.14.1 - uint8arrays: 3.1.0 - - '@walletconnect/safe-json@1.0.2': - dependencies: - tslib: 1.14.1 - - '@walletconnect/sign-client@2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': - dependencies: - '@walletconnect/core': 2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.13.0 - '@walletconnect/utils': 2.13.0 + '@walletconnect/sign-client': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -17208,22 +20688,56 @@ snapshots: - '@vercel/kv' - bufferutil - encoding - - ioredis - - uWebSockets.js + - supports-color - utf-8-validate - '@walletconnect/time@1.0.2': + '@walletconnect/utils@2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': dependencies: - tslib: 1.14.1 + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - supports-color - '@walletconnect/types@2.12.0': + '@walletconnect/utils@2.12.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.1 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.1.2 - events: 3.3.0 + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.10 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.12.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17237,17 +20751,24 @@ snapshots: - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/kv' - - ioredis - - uWebSockets.js + - supports-color - '@walletconnect/types@2.13.0': + '@walletconnect/utils@2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.1.2 - events: 3.3.0 + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17261,20 +20782,24 @@ snapshots: - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/kv' - - ioredis - - uWebSockets.js + - supports-color - '@walletconnect/universal-provider@2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@walletconnect/utils@2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': dependencies: - '@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/logger': 2.1.2 - '@walletconnect/sign-client': 2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@walletconnect/types': 2.13.0 - '@walletconnect/utils': 2.13.0 - events: 3.3.0 + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.10 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17288,26 +20813,24 @@ snapshots: - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - uWebSockets.js - - utf-8-validate + - supports-color - '@walletconnect/utils@2.12.0': + '@walletconnect/utils@2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': dependencies: '@stablelib/chacha20poly1305': 1.0.1 '@stablelib/hkdf': 1.0.1 '@stablelib/random': 1.0.2 '@stablelib/sha256': 1.0.1 '@stablelib/x25519': 1.0.3 - '@walletconnect/relay-api': 1.0.10 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.12.0 + '@walletconnect/types': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 detect-browser: 5.3.0 + elliptic: 6.5.7 query-string: 7.1.3 uint8arrays: 3.1.0 transitivePeerDependencies: @@ -17323,10 +20846,9 @@ snapshots: - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/kv' - - ioredis - - uWebSockets.js + - supports-color - '@walletconnect/utils@2.13.0': + '@walletconnect/utils@2.13.3': dependencies: '@stablelib/chacha20poly1305': 1.0.1 '@stablelib/hkdf': 1.0.1 @@ -17336,7 +20858,7 @@ snapshots: '@walletconnect/relay-api': 1.0.10 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.13.0 + '@walletconnect/types': 2.13.3 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 detect-browser: 5.3.0 @@ -17367,30 +20889,35 @@ snapshots: '@walletconnect/window-getters': 1.0.1 tslib: 1.14.1 - '@web3modal/common@4.1.11': + '@web3modal/common@4.2.3': + dependencies: + bignumber.js: 9.1.2 + dayjs: 1.11.10 + + '@web3modal/common@4.2.3': dependencies: bignumber.js: 9.1.2 dayjs: 1.11.10 - '@web3modal/common@4.2.2': + '@web3modal/common@5.1.8': dependencies: bignumber.js: 9.1.2 dayjs: 1.11.10 - '@web3modal/core@4.1.11(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/core@4.1.11(@types/react@18.3.5)(react@18.2.0)': dependencies: '@web3modal/common': 4.1.11 '@web3modal/wallet': 4.1.11 - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react - '@web3modal/core@4.2.2(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/core@4.2.3(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/common': 4.2.2 - '@web3modal/wallet': 4.2.2 - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) + '@web3modal/common': 4.2.3 + '@web3modal/wallet': 4.2.3 + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react @@ -17399,25 +20926,25 @@ snapshots: dependencies: buffer: 6.0.3 - '@web3modal/polyfills@4.2.2': + '@web3modal/polyfills@4.2.3': dependencies: buffer: 6.0.3 - '@web3modal/scaffold-react@4.1.11(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@web3modal/scaffold-react@4.1.11(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@web3modal/scaffold': 4.1.11(@types/react@18.3.2)(react@18.3.1) + '@web3modal/scaffold': 4.1.11(@types/react@18.3.5)(react@18.2.0) optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' - '@web3modal/scaffold-react@4.2.2(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@web3modal/scaffold-react@4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@web3modal/scaffold': 4.2.2(@types/react@18.3.2)(react@18.3.1) + '@web3modal/scaffold': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0) optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17432,37 +20959,36 @@ snapshots: - '@types/react' - '@upstash/redis' - '@vercel/kv' - - ioredis - - uWebSockets.js + - supports-color - '@web3modal/scaffold-utils@4.1.11(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/scaffold-utils@4.1.11(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/core': 4.1.11(@types/react@18.3.2)(react@18.3.1) + '@web3modal/core': 4.1.11(@types/react@18.3.5)(react@18.2.0) '@web3modal/polyfills': 4.1.11 - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react - '@web3modal/scaffold-utils@4.2.2(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/scaffold-utils@4.2.3(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/core': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/polyfills': 4.2.2 - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) + '@web3modal/core': 4.2.3(@types/react@18.3.5)(react@18.2.0) + '@web3modal/polyfills': 4.2.3 + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react - '@web3modal/scaffold-vue@4.1.11(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/scaffold-vue@4.1.11(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/scaffold': 4.1.11(@types/react@18.3.2)(react@18.3.1) + '@web3modal/scaffold': 4.1.11(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react - '@web3modal/scaffold-vue@4.2.2(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/scaffold-vue@4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/scaffold': 4.2.2(@types/react@18.3.2)(react@18.3.1) + '@web3modal/scaffold': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17477,15 +21003,14 @@ snapshots: - '@types/react' - '@upstash/redis' - '@vercel/kv' - - ioredis - react - - uWebSockets.js + - supports-color - '@web3modal/scaffold@4.1.11(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/scaffold@4.1.11(@types/react@18.3.5)(react@18.2.0)': dependencies: '@web3modal/common': 4.1.11 - '@web3modal/core': 4.1.11(@types/react@18.3.2)(react@18.3.1) - '@web3modal/siwe': 4.1.11(@types/react@18.3.2)(react@18.3.1) + '@web3modal/core': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/siwe': 4.1.11(@types/react@18.3.5)(react@18.2.0) '@web3modal/ui': 4.1.11 '@web3modal/wallet': 4.1.11 lit: 3.1.0 @@ -17493,13 +21018,13 @@ snapshots: - '@types/react' - react - '@web3modal/scaffold@4.2.2(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/scaffold@4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/common': 4.2.2 - '@web3modal/core': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/siwe': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/ui': 4.2.2 - '@web3modal/wallet': 4.2.2 + '@web3modal/common': 4.2.3 + '@web3modal/core': 4.2.3(@types/react@18.3.5)(react@18.2.0) + '@web3modal/siwe': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0) + '@web3modal/ui': 4.2.3 + '@web3modal/wallet': 4.2.3 lit: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -17515,27 +21040,26 @@ snapshots: - '@types/react' - '@upstash/redis' - '@vercel/kv' - - ioredis - react - - uWebSockets.js + - supports-color - '@web3modal/siwe@4.1.11(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/siwe@4.1.11(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/core': 4.1.11(@types/react@18.3.2)(react@18.3.1) - '@web3modal/scaffold-utils': 4.1.11(@types/react@18.3.2)(react@18.3.1) + '@web3modal/core': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-utils': 4.1.11(@types/react@18.3.5)(react@18.2.0) lit: 3.1.0 - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react - '@web3modal/siwe@4.2.2(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/siwe@4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@walletconnect/utils': 2.12.0 - '@web3modal/core': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/scaffold-utils': 4.2.2(@types/react@18.3.2)(react@18.3.1) + '@walletconnect/utils': 2.12.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@web3modal/core': 4.2.3(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-utils': 4.2.3(@types/react@18.3.5)(react@18.2.0) lit: 3.1.0 - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17550,52 +21074,100 @@ snapshots: - '@types/react' - '@upstash/redis' - '@vercel/kv' - - ioredis - react - - uWebSockets.js + - supports-color - '@web3modal/ui@4.1.11': + '@web3modal/ui@4.2.3': dependencies: lit: 3.1.0 qrcode: 1.5.3 - '@web3modal/ui@4.2.2': + '@web3modal/ui@4.2.3': dependencies: lit: 3.1.0 qrcode: 1.5.3 - ? '@web3modal/wagmi@4.1.11(@types/react@18.3.2)(@wagmi/connectors@4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))' - : dependencies: - '@wagmi/connectors': 4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) - '@wagmi/core': 2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + '@web3modal/wagmi@4.1.11(7bejpi3a2bqeihrssz3xbwxki4)': + dependencies: + '@wagmi/connectors': 4.1.18(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + '@wagmi/core': 2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + '@web3modal/polyfills': 4.1.11 + '@web3modal/scaffold': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-react': 4.1.11(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@web3modal/scaffold-utils': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-vue': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/siwe': 4.1.11(@types/react@18.3.5)(react@18.2.0) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + optionalDependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + + '@web3modal/wagmi@4.1.11(@types/react@18.3.5)(@wagmi/connectors@4.3.10(vnbhrjghrun7rfuxsawo7otej4))(@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))': + dependencies: + '@wagmi/connectors': 4.3.10(vnbhrjghrun7rfuxsawo7otej4) + '@wagmi/core': 2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) '@web3modal/polyfills': 4.1.11 - '@web3modal/scaffold': 4.1.11(@types/react@18.3.2)(react@18.3.1) - '@web3modal/scaffold-react': 4.1.11(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@web3modal/scaffold-utils': 4.1.11(@types/react@18.3.2)(react@18.3.1) - '@web3modal/scaffold-vue': 4.1.11(@types/react@18.3.2)(react@18.3.1) - '@web3modal/siwe': 4.1.11(@types/react@18.3.2)(react@18.3.1) - viem: 2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + '@web3modal/scaffold': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-react': 4.1.11(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@web3modal/scaffold-utils': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-vue': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/siwe': 4.1.11(@types/react@18.3.5)(react@18.2.0) + viem: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' - ? '@web3modal/wagmi@4.2.2(@types/react@18.3.2)(@wagmi/connectors@5.0.6(@types/react@18.3.2)(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))' - : dependencies: - '@wagmi/connectors': 5.0.6(@types/react@18.3.2)(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) - '@wagmi/core': 2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) - '@walletconnect/ethereum-provider': 2.13.0(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) - '@web3modal/polyfills': 4.2.2 - '@web3modal/scaffold': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/scaffold-react': 4.2.2(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@web3modal/scaffold-utils': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/scaffold-vue': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/siwe': 4.2.2(@types/react@18.3.2)(react@18.3.1) - viem: 2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + '@web3modal/wagmi@4.2.3(hoyagxhmve75vyxjsj4tjya6zm)': + dependencies: + '@wagmi/connectors': 5.1.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + '@wagmi/core': 2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) + '@walletconnect/ethereum-provider': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + '@web3modal/polyfills': 4.2.3 + '@web3modal/scaffold': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-react': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@web3modal/scaffold-utils': 4.2.3(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-vue': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0) + '@web3modal/siwe': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) optionalDependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@web3modal/wagmi@4.2.3(@wagmi/connectors@5.0.21)(@wagmi/core@2.11.6)(react@18.3.1)(viem@2.16.5)': + dependencies: + '@wagmi/connectors': 5.0.21(@wagmi/core@2.11.6)(react-native@0.74.3)(react@18.3.1)(typescript@5.5.3)(viem@2.16.5) + '@wagmi/core': 2.11.6(react@18.3.1)(typescript@5.5.3)(viem@2.16.5) + '@walletconnect/ethereum-provider': 2.13.0(react@18.3.1) + '@web3modal/polyfills': 4.2.3 + '@web3modal/scaffold': 4.2.3(react@18.3.1) + '@web3modal/scaffold-react': 4.2.3(react@18.3.1) + '@web3modal/scaffold-utils': 4.2.3(react@18.3.1) + '@web3modal/scaffold-vue': 4.2.3(react@18.3.1) + '@web3modal/siwe': 4.2.3(react@18.3.1) react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + viem: 2.16.5(typescript@5.5.3)(zod@3.23.8) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17616,53 +21188,62 @@ snapshots: - uWebSockets.js - utf-8-validate - '@web3modal/wallet@4.1.11': - dependencies: - '@web3modal/polyfills': 4.1.11 - zod: 3.22.4 - - '@web3modal/wallet@4.2.2': + '@web3modal/wallet@4.2.3': dependencies: - '@web3modal/polyfills': 4.2.2 + '@web3modal/polyfills': 4.2.3 zod: 3.22.4 '@webgpu/types@0.1.21': {} - '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.20.2)': + '@zerodevx/svelte-toast@0.9.5(svelte@4.2.13)': dependencies: - esbuild: 0.20.2 - tslib: 2.6.2 + svelte: 4.2.13 - '@yarnpkg/fslib@2.10.3': + '@zerodevx/svelte-toast@0.9.5(svelte@4.2.17)': dependencies: - '@yarnpkg/libzip': 2.3.0 - tslib: 1.14.1 + svelte: 4.2.17 - '@yarnpkg/libzip@2.3.0': - dependencies: - '@types/emscripten': 1.39.12 - tslib: 1.14.1 + abitype@0.9.10(typescript@5.4.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.4.3 + zod: 3.22.4 - '@zerodevx/svelte-toast@0.9.5(svelte@4.2.16)': - dependencies: - svelte: 4.2.16 + abitype@0.9.8(typescript@5.4.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.4.3 + zod: 3.22.4 - abitype@0.9.10(typescript@5.4.5)(zod@3.23.8): + abitype@0.9.8(typescript@5.4.3)(zod@3.23.8): optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 zod: 3.23.8 - abitype@0.9.8(typescript@5.4.5)(zod@3.23.8): + abitype@1.0.0(typescript@5.4.3)(zod@3.22.4): optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 + zod: 3.22.4 + + abitype@1.0.0(typescript@5.4.3)(zod@3.23.8): + optionalDependencies: + typescript: 5.4.3 zod: 3.23.8 - abitype@1.0.0(typescript@5.4.5)(zod@3.23.8): + abitype@1.0.2(typescript@5.4.3)(zod@3.23.8): + optionalDependencies: + typescript: 5.4.3 + zod: 3.23.8 + + abitype@1.0.5(typescript@5.4.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.4.3 + zod: 3.22.4 + + abitype@1.0.5(typescript@5.4.5)(zod@3.23.8): optionalDependencies: typescript: 5.4.5 zod: 3.23.8 - abitype@1.0.2(typescript@5.4.5)(zod@3.23.8): + abitype@1.0.6(typescript@5.4.5)(zod@3.23.8): optionalDependencies: typescript: 5.4.5 zod: 3.23.8 @@ -17671,37 +21252,53 @@ snapshots: dependencies: event-target-shim: 5.0.1 + abortcontroller-polyfill@1.7.5: {} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.12.0): dependencies: - acorn: 8.11.3 + acorn: 8.12.0 + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 acorn-walk@8.3.2: {} - acorn@8.11.3: {} + acorn@8.12.0: {} - address@1.2.2: {} + acorn@8.12.1: {} + + adm-zip@0.4.16: {} aes-js@3.0.0: {} - agent-base@7.1.1: + aes-js@4.0.0-beta.5: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.7(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + agent-base@7.1.0: dependencies: - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - aggregate-error@3.1.0: + ajv-draft-04@1.0.0(ajv@8.16.0): dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv-draft-04@1.0.0(ajv@8.13.0): + ajv-draft-04@1.0.0(ajv@8.12.0): optionalDependencies: - ajv: 8.13.0 + ajv: 8.12.0 ajv@6.12.6: dependencies: @@ -17710,13 +21307,23 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.13.0: + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 + amazon-cognito-identity-js@6.3.12(encoding@0.1.13): + dependencies: + '@aws-crypto/sha256-js': 1.2.2 + buffer: 4.9.2 + fast-base64-decode: 1.0.0 + isomorphic-unfetch: 3.1.0(encoding@0.1.13) + js-cookie: 2.2.1 + transitivePeerDependencies: + - encoding + anser@1.4.10: {} ansi-align@3.0.1: @@ -17725,6 +21332,10 @@ snapshots: ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + ansi-fragments@0.2.1: dependencies: colorette: 1.4.0 @@ -17749,7 +21360,7 @@ snapshots: ansi-styles@6.2.1: {} - antlr4@4.13.1-patch-1: {} + antlr4@4.13.1: {} any-promise@1.3.0: {} @@ -17760,8 +21371,6 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - app-root-dir@1.0.2: {} - appdirsjs@1.2.7: {} arg@4.1.3: {} @@ -17774,31 +21383,22 @@ snapshots: argparse@2.0.1: {} - aria-hidden@1.2.4: - dependencies: - tslib: 2.6.2 - - aria-query@5.1.3: - dependencies: - deep-equal: 2.2.3 - aria-query@5.3.0: dependencies: dequal: 2.0.3 - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.0: dependencies: call-bind: 1.0.7 - is-array-buffer: 3.0.4 + is-array-buffer: 3.0.2 array-flatten@1.1.1: {} - array-includes@3.1.8: + array-includes@3.1.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 get-intrinsic: 1.2.4 is-string: 1.0.7 @@ -17806,61 +21406,59 @@ snapshots: array-union@2.1.0: {} - array.prototype.findlastindex@1.2.5: + array.prototype.findlastindex@1.2.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.4 array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 - arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.2: dependencies: - array-buffer-byte-length: 1.0.1 + array-buffer-byte-length: 1.0.0 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 + es-abstract: 1.22.3 get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 asap@2.0.6: {} - assert@2.1.0: + asn1@0.2.6: dependencies: - call-bind: 1.0.7 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.5 - util: 0.12.5 + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} assertion-error@1.1.0: {} + assertion-error@2.0.1: {} + ast-parents@0.0.1: {} ast-types@0.15.2: dependencies: - tslib: 2.6.2 + tslib: 2.6.3 ast-types@0.16.1: dependencies: - tslib: 2.6.2 + tslib: 2.6.3 astral-regex@1.0.0: {} @@ -17868,53 +21466,51 @@ snapshots: astring@1.8.6: {} - astro-expressive-code@0.35.3(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)): + astro-expressive-code@0.35.6(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)): dependencies: - astro: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) - rehype-expressive-code: 0.35.3 + astro: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) + rehype-expressive-code: 0.35.6 - astro-og-canvas@0.5.0(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)): + astro-og-canvas@0.5.0(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)): dependencies: - astro: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) + astro: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) canvaskit-wasm: 0.39.1 deterministic-object-hash: 2.0.2 entities: 4.5.0 - astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5): + astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5): dependencies: - '@astrojs/compiler': 2.8.0 - '@astrojs/internal-helpers': 0.4.0 - '@astrojs/markdown-remark': 5.1.0 + '@astrojs/compiler': 2.10.3 + '@astrojs/internal-helpers': 0.4.1 + '@astrojs/markdown-remark': 5.2.0 '@astrojs/telemetry': 3.1.0 - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.5) - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + '@babel/types': 7.25.6 + '@oslojs/encoding': 0.4.1 + '@rollup/pluginutils': 5.1.0(rollup@4.21.3) '@types/babel__core': 7.20.5 '@types/cookie': 0.6.0 - acorn: 8.11.3 + acorn: 8.12.1 aria-query: 5.3.0 - axobject-query: 4.0.0 + axobject-query: 4.1.0 boxen: 7.1.1 - chokidar: 3.6.0 ci-info: 4.0.0 clsx: 2.1.1 common-ancestor-path: 1.0.1 cookie: 0.6.0 cssesc: 3.0.0 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) deterministic-object-hash: 2.0.2 devalue: 5.0.0 diff: 5.2.0 dlv: 1.1.3 dset: 3.1.3 - es-module-lexer: 1.5.2 - esbuild: 0.21.2 + es-module-lexer: 1.5.4 + esbuild: 0.21.5 estree-walker: 3.0.3 - execa: 8.0.1 fast-glob: 3.3.2 + fastq: 1.17.1 flattie: 1.1.1 github-slugger: 2.0.0 gray-matter: 4.0.3 @@ -17922,36 +21518,43 @@ snapshots: http-cache-semantics: 4.1.1 js-yaml: 4.1.0 kleur: 4.1.5 - magic-string: 0.30.10 + magic-string: 0.30.11 + magicast: 0.3.5 + micromatch: 4.0.8 mrmime: 2.0.0 - ora: 8.0.1 - p-limit: 5.0.0 + neotraverse: 0.6.18 + ora: 8.1.0 + p-limit: 6.1.0 p-queue: 8.0.1 path-to-regexp: 6.2.2 - preferred-pm: 3.1.3 + preferred-pm: 4.0.0 prompts: 2.4.2 rehype: 13.0.1 - resolve: 1.22.8 - semver: 7.6.2 - shiki: 1.5.1 - string-width: 7.1.0 + semver: 7.6.3 + shiki: 1.17.6 + string-width: 7.2.0 strip-ansi: 7.1.0 - tsconfck: 3.0.3(typescript@5.4.5) + tinyexec: 0.3.0 + tsconfck: 3.1.3(typescript@5.4.5) unist-util-visit: 5.0.0 - vfile: 6.0.1 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) - vitefu: 0.2.5(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) - which-pm: 2.1.1 + vfile: 6.0.3 + vite: 5.4.5(@types/node@20.12.7)(terser@5.27.2) + vitefu: 1.0.2(vite@5.4.5(@types/node@20.12.7)(terser@5.27.2)) + which-pm: 3.0.0 + xxhash-wasm: 1.0.2 yargs-parser: 21.1.1 zod: 3.23.8 - zod-to-json-schema: 3.23.0(zod@3.23.8) + zod-to-json-schema: 3.23.3(zod@3.23.8) + zod-to-ts: 1.2.0(typescript@5.4.5)(zod@3.23.8) optionalDependencies: - sharp: 0.33.3 + sharp: 0.33.4 transitivePeerDependencies: - '@types/node' - less - lightningcss + - rollup - sass + - sass-embedded - stylus - sugarss - supports-color @@ -17962,31 +21565,73 @@ snapshots: async-mutex@0.2.6: dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - async@3.2.5: {} + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + + async@2.6.4: + dependencies: + lodash: 4.17.21 + + async@3.2.3: {} asynckit@0.4.0: {} atomic-sleep@1.0.0: {} + autoprefixer@10.4.18(postcss@8.4.38): + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001593 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + autoprefixer@10.4.19(postcss@8.4.38): dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001617 + caniuse-lite: 1.0.30001614 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 postcss: 8.4.38 postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.7: + autoprefixer@10.4.19(postcss@8.4.47): + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001614 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.5: {} + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + axios-proxy-builder@0.1.2: + dependencies: + tunnel: 0.0.6 + + axios@1.6.7(debug@4.3.4): dependencies: - possible-typed-array-names: 1.0.0 + follow-redirects: 1.15.5(debug@4.3.4) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug - axios@1.6.8(debug@4.3.4): + axios@1.7.7: dependencies: - follow-redirects: 1.15.6(debug@4.3.4) + follow-redirects: 1.15.9(debug@4.3.7) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -17996,37 +21641,45 @@ snapshots: dependencies: dequal: 2.0.3 - babel-core@7.0.0-bridge.0(@babel/core@7.24.5): + axobject-query@4.1.0: {} + + babel-core@7.0.0-bridge.0(@babel/core@7.25.2): dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.5): + babel-plugin-macros@3.1.0: dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + '@babel/runtime': 7.23.9 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.25.2): + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.25.2) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.5): + babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.25.2): dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.0 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.25.2) + core-js-compat: 3.36.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.5): + babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.25.2): dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.24.5): + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.25.2): dependencies: - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.25.2) transitivePeerDependencies: - '@babel/core' @@ -18052,17 +21705,21 @@ snapshots: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + bech32@1.1.4: {} - better-opn@3.0.2: + better-path-resolve@1.0.0: dependencies: - open: 8.4.2 + is-windows: 1.0.2 big-integer@1.6.52: {} bignumber.js@9.1.2: {} - binary-extensions@2.3.0: {} + binary-extensions@2.2.0: {} bl@4.1.0: dependencies: @@ -18078,9 +21735,11 @@ snapshots: blakejs@1.2.1: {} - blob-to-it@2.0.6: + blob-to-it@2.0.7: dependencies: - browser-readablestream-to-it: 2.0.7 + browser-readablestream-to-it: 2.0.6 + + bluebird@3.7.2: {} bn.js@4.11.6: {} @@ -18088,7 +21747,7 @@ snapshots: bn.js@5.2.1: {} - body-parser@1.20.2: + body-parser@1.20.3: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -18098,7 +21757,7 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.11.0 + qs: 6.13.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -18109,6 +21768,17 @@ snapshots: bowser@2.11.0: {} + boxen@5.1.2: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + boxen@7.1.1: dependencies: ansi-align: 3.0.1 @@ -18133,9 +21803,13 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + braces@3.0.3: dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 brorand@1.1.0: {} @@ -18143,7 +21817,9 @@ snapshots: browser-readablestream-to-it@1.0.3: {} - browser-readablestream-to-it@2.0.7: {} + browser-readablestream-to-it@2.0.6: {} + + browser-stdout@1.3.1: {} browserify-aes@1.2.0: dependencies: @@ -18154,16 +21830,19 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 - browserify-zlib@0.1.4: - dependencies: - pako: 0.2.9 - browserslist@4.23.0: dependencies: - caniuse-lite: 1.0.30001617 - electron-to-chromium: 1.4.761 + caniuse-lite: 1.0.30001593 + electron-to-chromium: 1.4.676 node-releases: 2.0.14 - update-browserslist-db: 1.0.15(browserslist@4.23.0) + update-browserslist-db: 1.0.13(browserslist@4.23.0) + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001660 + electron-to-chromium: 1.5.23 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) bs58@4.0.1: dependencies: @@ -18183,14 +21862,22 @@ snapshots: dependencies: node-int64: 0.4.0 - buffer-crc32@0.2.13: {} + buffer-crc32@1.0.0: {} buffer-from@1.1.2: {} buffer-reverse@1.0.1: {} + buffer-to-arraybuffer@0.0.5: {} + buffer-xor@1.0.3: {} + buffer@4.9.2: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + buffer@5.6.0: dependencies: base64-js: 1.5.1 @@ -18208,15 +21895,19 @@ snapshots: bufferutil@4.0.8: dependencies: - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.0 builtin-modules@3.3.0: {} - builtins@5.1.0: + builtins@5.0.1: dependencies: - semver: 7.6.2 + semver: 7.6.3 + + bundle-name@3.0.0: + dependencies: + run-applescript: 5.0.0 - bundle-require@4.1.0(esbuild@0.19.12): + bundle-require@4.0.2(esbuild@0.19.12): dependencies: esbuild: 0.19.12 load-tsconfig: 0.2.5 @@ -18227,6 +21918,10 @@ snapshots: cac@6.7.14: {} + cacheable-lookup@5.0.4: {} + + cacheable-lookup@6.1.0: {} + cacheable-lookup@7.0.0: {} cacheable-request@10.2.14: @@ -18236,16 +21931,26 @@ snapshots: http-cache-semantics: 4.1.1 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.1 + normalize-url: 8.0.0 responselike: 3.0.0 + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.2 + set-function-length: 1.2.1 call-me-maybe@1.0.2: {} @@ -18261,11 +21966,6 @@ snapshots: callsites@3.1.0: {} - camel-case@4.1.2: - dependencies: - pascal-case: 3.1.2 - tslib: 2.6.2 - camelcase-css@2.0.1: {} camelcase@5.3.1: {} @@ -18274,7 +21974,11 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001617: {} + caniuse-lite@1.0.30001593: {} + + caniuse-lite@1.0.30001614: {} + + caniuse-lite@1.0.30001660: {} canvaskit-wasm@0.39.1: dependencies: @@ -18286,6 +21990,8 @@ snapshots: tslib: 2.6.2 upper-case-first: 2.0.2 + caseless@0.12.0: {} + cborg@4.2.0: {} ccount@2.0.1: {} @@ -18294,12 +22000,20 @@ snapshots: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -18318,20 +22032,9 @@ snapshots: chalk@5.3.0: {} - change-case@4.1.2: - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.6.2 + change-case@5.4.4: {} + + change-case@5.4.4: {} character-entities-html4@2.1.0: {} @@ -18341,14 +22044,18 @@ snapshots: character-reference-invalid@2.0.1: {} + chardet@0.7.0: {} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 + check-error@2.1.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -18357,18 +22064,33 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.0: + dependencies: + readdirp: 4.0.1 + chownr@1.1.4: {} - chownr@2.0.0: {} + chromatic@11.10.2: {} - chromatic@11.3.2: {} + chromatic@11.3.0: {} chrome-launcher@0.15.2: dependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + + chromium-edge-launcher@1.0.0: + dependencies: + '@types/node': 20.12.7 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 + mkdirp: 1.0.4 + rimraf: 3.0.2 transitivePeerDependencies: - supports-color @@ -18378,6 +22100,14 @@ snapshots: ci-info@4.0.0: {} + cids@0.7.5: + dependencies: + buffer: 5.7.1 + class-is: 1.1.0 + multibase: 0.6.1 + multicodec: 1.0.4 + multihashes: 0.4.21 + cipher-base@1.0.4: dependencies: inherits: 2.0.4 @@ -18387,17 +22117,21 @@ snapshots: dependencies: consola: 3.2.3 + class-is@1.1.0: {} + clean-stack@2.2.0: {} + cli-boxes@2.2.1: {} + cli-boxes@3.0.0: {} - cli-color@2.0.4: + cli-color@2.0.3: dependencies: - d: 1.0.2 - es5-ext: 0.10.64 + d: 1.0.1 + es5-ext: 0.10.62 es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 + memoizee: 0.4.17 + timers-ext: 0.1.8 cli-cursor@3.1.0: dependencies: @@ -18407,13 +22141,11 @@ snapshots: dependencies: restore-cursor: 4.0.0 - cli-spinners@2.9.2: {} - - cli-table3@0.6.5: + cli-cursor@5.0.0: dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} clipboardy@4.0.0: dependencies: @@ -18427,6 +22159,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -18439,12 +22177,18 @@ snapshots: kind-of: 6.0.3 shallow-clone: 3.0.1 + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + clone@1.0.4: {} clsx@1.2.1: {} clsx@2.1.1: {} + cluster-key-slot@1.1.2: {} + code-block-writer@12.0.0: {} code-error-fragment@0.0.230: {} @@ -18453,7 +22197,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 '@types/estree': 1.0.5 - acorn: 8.11.3 + acorn: 8.12.0 estree-walker: 3.0.3 periscopic: 3.1.0 @@ -18483,6 +22227,8 @@ snapshots: colorette@1.4.0: {} + colors@1.0.3: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -18497,8 +22243,6 @@ snapshots: commander@4.1.1: {} - commander@6.2.1: {} - commander@8.3.0: {} commander@9.5.0: {} @@ -18525,8 +22269,6 @@ snapshots: concat-map@0.0.1: {} - confbox@0.1.7: {} - config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -18543,34 +22285,45 @@ snapshots: consola@3.2.3: {} - constant-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - upper-case: 2.0.2 - content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 + content-hash@2.5.2: + dependencies: + cids: 0.7.5 + multicodec: 0.5.7 + multihashes: 0.4.21 + content-type@1.0.5: {} - convert-csv-to-json@2.46.0: {} + convert-csv-to-json@2.48.0: {} + + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} - cookie-es@1.1.0: {} + cookie-es@1.0.0: {} cookie-signature@1.0.6: {} + cookie@0.4.2: {} + cookie@0.6.0: {} - core-js-compat@3.37.0: + core-js-compat@3.36.0: dependencies: - browserslist: 4.23.0 + browserslist: 4.23.3 + + core-util-is@1.0.2: {} core-util-is@1.0.3: {} + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cosmiconfig@5.2.1: dependencies: import-fresh: 2.0.0 @@ -18578,14 +22331,30 @@ snapshots: js-yaml: 3.14.1 parse-json: 4.0.0 - cosmiconfig@8.3.6(typescript@5.4.5): + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cosmiconfig@8.3.6(typescript@5.4.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 + + cosmiconfig@8.3.6(typescript@5.4.5): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.5.3 crc-32@1.2.2: {} @@ -18608,32 +22377,36 @@ snapshots: create-require@1.1.1: {} - cross-fetch@3.1.8(encoding@0.1.13): + cross-fetch@3.1.8: dependencies: - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 transitivePeerDependencies: - encoding - cross-fetch@4.0.0(encoding@0.1.13): + cross-fetch@4.0.0: dependencies: - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 transitivePeerDependencies: - encoding + cross-spawn@5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - crossws@0.2.4: {} + crossws@0.1.1: {} crypto-js@3.3.0: {} crypto-js@4.2.0: {} - crypto-random-string@2.0.0: {} - css-selector-parser@3.0.5: {} css-selector-tokenizer@0.8.0: @@ -18658,17 +22431,19 @@ snapshots: culori@3.3.0: {} - d@1.0.2: + cycle@1.0.3: {} + + d@1.0.1: dependencies: es5-ext: 0.10.64 - type: 2.7.2 + type: 1.2.0 dag-jose@4.0.0: dependencies: - '@ipld/dag-cbor': 9.2.0 + '@ipld/dag-cbor': 9.2.1 multiformats: 11.0.2 - daisyui@4.11.1(postcss@8.4.38): + daisyui@4.10.1(postcss@8.4.38): dependencies: css-selector-tokenizer: 0.8.0 culori: 3.3.0 @@ -18677,37 +22452,39 @@ snapshots: transitivePeerDependencies: - postcss - data-urls@5.0.0: + daisyui@4.11.1(postcss@8.4.38): dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 + css-selector-tokenizer: 0.8.0 + culori: 3.3.0 + picocolors: 1.0.1 + postcss-js: 4.0.1(postcss@8.4.39) + transitivePeerDependencies: + - postcss - data-view-buffer@1.0.1: + daisyui@4.11.1(postcss@8.4.47): dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 + css-selector-tokenizer: 0.8.0 + culori: 3.3.0 + picocolors: 1.0.0 + postcss-js: 4.0.1(postcss@8.4.47) + transitivePeerDependencies: + - postcss - data-view-byte-length@1.0.1: + dashdash@1.14.1: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 + assert-plus: 1.0.0 - data-view-byte-offset@1.0.0: + data-urls@5.0.0: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 date-fns@2.30.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 dayjs@1.11.10: {} - dayjs@1.11.11: {} - debug@2.6.9: dependencies: ms: 2.0.0 @@ -18716,12 +22493,20 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.4: + debug@4.3.5: dependencies: ms: 2.1.2 + debug@4.3.7(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + decamelize@1.2.0: {} + decamelize@4.0.0: {} + decimal.js@10.4.3: {} decode-named-character-reference@1.0.2: @@ -18730,6 +22515,10 @@ snapshots: decode-uri-component@0.2.2: {} + decompress-response@3.3.0: + dependencies: + mimic-response: 1.0.1 + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -18738,30 +22527,11 @@ snapshots: dedent@0.7.0: {} - deep-eql@4.1.3: + deep-eql@4.1.4: dependencies: type-detect: 4.0.8 - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 + deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -18774,6 +22544,13 @@ snapshots: bplist-parser: 0.2.0 untildify: 4.0.0 + default-browser@4.0.0: + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + defaults@1.0.4: dependencies: clone: 1.0.4 @@ -18788,31 +22565,30 @@ snapshots: define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - defu@6.1.4: {} - - del@6.1.1: - dependencies: - globby: 11.1.0 - graceful-fs: 4.2.11 - is-glob: 4.0.3 - is-path-cwd: 2.2.0 - is-path-inside: 3.0.3 - p-map: 4.0.0 - rimraf: 3.0.2 - slash: 3.0.0 + object-keys: 1.1.1 + + defu@6.1.4: {} delayed-stream@1.0.0: {} denodeify@1.2.1: {} + denque@2.1.0: {} + depd@2.0.0: {} + deprecated-react-native-prop-types@5.0.0: + dependencies: + '@react-native/normalize-colors': 0.73.2 + invariant: 2.2.4 + prop-types: 15.8.1 + dequal@2.0.3: {} destr@2.0.3: {} @@ -18827,19 +22603,6 @@ snapshots: detect-libc@2.0.3: {} - detect-node-es@1.1.0: {} - - detect-package-manager@2.0.1: - dependencies: - execa: 5.1.1 - - detect-port@1.6.1: - dependencies: - address: 1.2.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - deterministic-object-hash@2.0.2: dependencies: base-64: 1.0.0 @@ -18871,9 +22634,9 @@ snapshots: dns-over-http-resolver@2.1.3: dependencies: debug: 4.3.4 - native-fetch: 4.0.2(undici@5.28.4) + native-fetch: 4.0.2(undici@5.28.3) receptacle: 1.3.2 - undici: 5.28.4 + undici: 5.28.3 transitivePeerDependencies: - supports-color @@ -18899,6 +22662,8 @@ snapshots: domhandler: 4.3.1 entities: 2.2.0 + dom-walk@0.1.2: {} + domelementtype@2.3.0: {} domhandler@3.3.0: @@ -18915,11 +22680,6 @@ snapshots: domelementtype: 2.3.0 domhandler: 4.3.1 - dot-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - dotenv-expand@10.0.0: {} dotenv@16.4.5: {} @@ -18928,22 +22688,20 @@ snapshots: dset@3.1.3: {} - duplexify@3.7.1: - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - - duplexify@4.1.3: + duplexify@4.1.2: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 3.6.2 - stream-shift: 1.0.3 + stream-shift: 1.0.1 eastasianwidth@0.2.0: {} + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + eciesjs@0.3.18: dependencies: '@types/secp256k1': 4.0.6 @@ -18952,15 +22710,21 @@ snapshots: ee-first@1.1.1: {} - ejs@3.1.10: + eigenlayer-contracts@https://codeload.github.com/Layr-labs/eigenlayer-contracts/tar.gz/30040aa273edeefe83333fa9183a0a26a84cebf0(hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10)): dependencies: - jake: 10.9.1 + solidity-docgen: 0.6.0-beta.36(hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - hardhat + + eigenlayer-middleware@https://codeload.github.com/layr-Labs/eigenlayer-middleware/tar.gz/7d49b5181b09198ed275783453aa082bb3766990: {} electron-fetch@1.9.1: dependencies: encoding: 0.1.13 - electron-to-chromium@1.4.761: {} + electron-to-chromium@1.4.676: {} + + electron-to-chromium@1.5.23: {} elliptic@6.5.4: dependencies: @@ -18972,7 +22736,7 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - elliptic@6.5.5: + elliptic@6.5.7: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -18997,6 +22761,8 @@ snapshots: encodeurl@1.0.2: {} + encodeurl@2.0.0: {} + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 @@ -19005,10 +22771,22 @@ snapshots: dependencies: once: 1.4.0 + engine.io-client@6.5.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.7(supports-color@8.1.1) + engine.io-parser: 5.2.2 + ws: 8.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + engine.io-client@6.5.3(bufferutil@4.0.8)(utf-8-validate@6.0.3): dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4 + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.7(supports-color@8.1.1) engine.io-parser: 5.2.2 ws: 8.11.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) xmlhttprequest-ssl: 2.0.0 @@ -19028,7 +22806,9 @@ snapshots: entities@4.5.0: {} - envinfo@7.13.0: {} + env-paths@2.2.1: {} + + envinfo@7.11.1: {} err-code@3.0.1: {} @@ -19045,54 +22825,47 @@ snapshots: accepts: 1.3.8 escape-html: 1.0.3 - es-abstract@1.23.3: + es-abstract@1.22.3: dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 gopd: 1.0.1 has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + hasown: 2.0.1 + internal-slot: 1.0.6 + is-array-buffer: 3.0.2 is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 + is-negative-zero: 2.0.2 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 + is-shared-array-buffer: 1.0.2 is-string: 1.0.7 - is-typed-array: 1.1.13 + is-typed-array: 1.1.12 is-weakref: 1.0.2 - object-inspect: 1.13.1 + object-inspect: 1.13.2 object-keys: 1.1.1 object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.13 es-define-property@1.0.0: dependencies: @@ -19100,33 +22873,19 @@ snapshots: es-errors@1.3.0: {} - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - - es-module-lexer@1.5.2: {} + es-module-lexer@1.5.3: {} - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 + es-module-lexer@1.5.4: {} - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.0.2: dependencies: get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 + has-tostringtag: 1.0.0 + hasown: 2.0.1 es-shim-unscopables@1.0.2: dependencies: - hasown: 2.0.2 + hasown: 2.0.1 es-to-primitive@1.2.1: dependencies: @@ -19134,39 +22893,45 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + es5-ext@0.10.62: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + es5-ext@0.10.64: dependencies: es6-iterator: 2.0.3 - es6-symbol: 3.1.4 + es6-symbol: 3.1.3 esniff: 2.0.1 next-tick: 1.1.0 es6-iterator@2.0.3: dependencies: - d: 1.0.2 + d: 1.0.1 es5-ext: 0.10.64 - es6-symbol: 3.1.4 + es6-symbol: 3.1.3 es6-promise@3.3.1: {} - es6-symbol@3.1.4: + es6-promise@4.2.8: {} + + es6-symbol@3.1.3: dependencies: - d: 1.0.2 + d: 1.0.1 ext: 1.7.0 es6-weak-map@2.0.3: dependencies: - d: 1.0.2 - es5-ext: 0.10.64 + d: 1.0.1 + es5-ext: 0.10.62 es6-iterator: 2.0.3 - es6-symbol: 3.1.4 + es6-symbol: 3.1.3 - esbuild-plugin-alias@0.2.1: {} - - esbuild-register@3.5.0(esbuild@0.20.2): + esbuild-register@3.6.0(esbuild@0.21.3): dependencies: - debug: 4.3.4 - esbuild: 0.20.2 + debug: 4.3.7(supports-color@8.1.1) + esbuild: 0.21.3 transitivePeerDependencies: - supports-color @@ -19247,31 +23012,57 @@ snapshots: '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 - esbuild@0.21.2: + esbuild@0.21.3: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.2 - '@esbuild/android-arm': 0.21.2 - '@esbuild/android-arm64': 0.21.2 - '@esbuild/android-x64': 0.21.2 - '@esbuild/darwin-arm64': 0.21.2 - '@esbuild/darwin-x64': 0.21.2 - '@esbuild/freebsd-arm64': 0.21.2 - '@esbuild/freebsd-x64': 0.21.2 - '@esbuild/linux-arm': 0.21.2 - '@esbuild/linux-arm64': 0.21.2 - '@esbuild/linux-ia32': 0.21.2 - '@esbuild/linux-loong64': 0.21.2 - '@esbuild/linux-mips64el': 0.21.2 - '@esbuild/linux-ppc64': 0.21.2 - '@esbuild/linux-riscv64': 0.21.2 - '@esbuild/linux-s390x': 0.21.2 - '@esbuild/linux-x64': 0.21.2 - '@esbuild/netbsd-x64': 0.21.2 - '@esbuild/openbsd-x64': 0.21.2 - '@esbuild/sunos-x64': 0.21.2 - '@esbuild/win32-arm64': 0.21.2 - '@esbuild/win32-ia32': 0.21.2 - '@esbuild/win32-x64': 0.21.2 + '@esbuild/aix-ppc64': 0.21.3 + '@esbuild/android-arm': 0.21.3 + '@esbuild/android-arm64': 0.21.3 + '@esbuild/android-x64': 0.21.3 + '@esbuild/darwin-arm64': 0.21.3 + '@esbuild/darwin-x64': 0.21.3 + '@esbuild/freebsd-arm64': 0.21.3 + '@esbuild/freebsd-x64': 0.21.3 + '@esbuild/linux-arm': 0.21.3 + '@esbuild/linux-arm64': 0.21.3 + '@esbuild/linux-ia32': 0.21.3 + '@esbuild/linux-loong64': 0.21.3 + '@esbuild/linux-mips64el': 0.21.3 + '@esbuild/linux-ppc64': 0.21.3 + '@esbuild/linux-riscv64': 0.21.3 + '@esbuild/linux-s390x': 0.21.3 + '@esbuild/linux-x64': 0.21.3 + '@esbuild/netbsd-x64': 0.21.3 + '@esbuild/openbsd-x64': 0.21.3 + '@esbuild/sunos-x64': 0.21.3 + '@esbuild/win32-arm64': 0.21.3 + '@esbuild/win32-ia32': 0.21.3 + '@esbuild/win32-x64': 0.21.3 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 escalade@3.1.2: {} @@ -19285,155 +23076,360 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.0(eslint@8.57.0): + eslint-compat-utils@0.1.2(eslint@8.55.0): dependencies: - eslint: 8.57.0 - semver: 7.6.2 + eslint: 8.55.0 + + eslint-compat-utils@0.1.2(eslint@8.56.0): + dependencies: + eslint: 8.56.0 + + eslint-compat-utils@0.5.0(eslint@8.56.0): + dependencies: + eslint: 8.56.0 + semver: 7.6.0 + + eslint-config-prettier@9.1.0(eslint@8.55.0): + dependencies: + eslint: 8.55.0 - eslint-config-prettier@9.1.0(eslint@8.57.0): + eslint-config-prettier@9.1.0(eslint@8.56.0): dependencies: - eslint: 8.57.0 + eslint: 8.56.0 - eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0): + eslint-config-standard@17.1.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.0))(eslint-plugin-n@16.6.2(eslint@8.55.0))(eslint-plugin-promise@6.1.1(eslint@8.55.0))(eslint@8.55.0): dependencies: - eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) - eslint-plugin-n: 16.6.2(eslint@8.57.0) - eslint-plugin-promise: 6.1.1(eslint@8.57.0) + eslint: 8.55.0 + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.0) + eslint-plugin-n: 16.6.2(eslint@8.55.0) + eslint-plugin-promise: 6.1.1(eslint@8.55.0) + + eslint-config-standard@17.1.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0))(eslint-plugin-n@16.6.2(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0): + dependencies: + eslint: 8.56.0 + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0) + eslint-plugin-n: 16.6.2(eslint@8.56.0) + eslint-plugin-promise: 6.1.1(eslint@8.56.0) + + eslint-config-standard@17.1.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0))(eslint-plugin-n@16.6.2(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0): + dependencies: + eslint: 8.56.0 + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0) + eslint-plugin-n: 16.6.2(eslint@8.56.0) + eslint-plugin-promise: 6.1.1(eslint@8.56.0) eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.13.1 + is-core-module: 2.14.0 resolve: 1.22.8 transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.8.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint@8.55.0): + dependencies: + '@typescript-eslint/parser': 7.15.0(eslint@8.57.0)(typescript@5.5.3) + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@8.55.0)(typescript@5.4.3) + eslint: 8.55.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.8.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@8.56.0)(typescript@5.4.3) + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.8.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 + '@typescript-eslint/parser': 7.9.0(eslint@8.56.0)(typescript@5.4.5) + eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.6.0(eslint@8.57.0): + eslint-plugin-es-x@7.5.0(eslint@8.55.0): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + '@eslint-community/regexpp': 4.10.0 + eslint: 8.55.0 + eslint-compat-utils: 0.1.2(eslint@8.55.0) + + eslint-plugin-es-x@7.5.0(eslint@8.56.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@eslint-community/regexpp': 4.10.0 - eslint: 8.57.0 - eslint-compat-utils: 0.5.0(eslint@8.57.0) + eslint: 8.56.0 + eslint-compat-utils: 0.1.2(eslint@8.56.0) + + eslint-plugin-es@3.0.1(eslint@8.55.0): + dependencies: + eslint: 8.55.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 - eslint-plugin-es@3.0.1(eslint@8.57.0): + eslint-plugin-es@3.0.1(eslint@8.56.0): dependencies: - eslint: 8.57.0 + eslint: 8.56.0 eslint-utils: 2.1.0 regexpp: 3.2.0 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0): + eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.0): + dependencies: + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.55.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint@8.55.0) + hasown: 2.0.1 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@8.55.0)(typescript@5.4.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0): + dependencies: + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) + hasown: 2.0.1 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@8.56.0)(typescript@5.4.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0): dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.0 + eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) - hasown: 2.0.2 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) + hasown: 2.0.1 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 semver: 6.3.1 - tsconfig-paths: 3.15.0 + tsconfig-paths: 3.14.2 optionalDependencies: - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.9.0(eslint@8.56.0)(typescript@5.4.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-n@16.6.2(eslint@8.57.0): + eslint-plugin-n@16.6.2(eslint@8.55.0): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + builtins: 5.0.1 + eslint: 8.55.0 + eslint-plugin-es-x: 7.5.0(eslint@8.55.0) + get-tsconfig: 4.7.2 + globals: 13.24.0 + ignore: 5.3.1 + is-builtin-module: 3.2.1 + is-core-module: 2.14.0 + minimatch: 3.1.2 + resolve: 1.22.8 + semver: 7.6.3 + + eslint-plugin-n@16.6.2(eslint@8.56.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - builtins: 5.1.0 - eslint: 8.57.0 - eslint-plugin-es-x: 7.6.0(eslint@8.57.0) - get-tsconfig: 4.7.4 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + builtins: 5.0.1 + eslint: 8.56.0 + eslint-plugin-es-x: 7.5.0(eslint@8.56.0) + get-tsconfig: 4.7.2 globals: 13.24.0 ignore: 5.3.1 is-builtin-module: 3.2.1 is-core-module: 2.13.1 minimatch: 3.1.2 resolve: 1.22.8 - semver: 7.6.2 + semver: 7.6.3 + + eslint-plugin-node@11.1.0(eslint@8.55.0): + dependencies: + eslint: 8.55.0 + eslint-plugin-es: 3.0.1(eslint@8.55.0) + eslint-utils: 2.1.0 + ignore: 5.3.1 + minimatch: 3.1.2 + resolve: 1.22.8 + semver: 6.3.1 - eslint-plugin-node@11.1.0(eslint@8.57.0): + eslint-plugin-node@11.1.0(eslint@8.56.0): dependencies: - eslint: 8.57.0 - eslint-plugin-es: 3.0.1(eslint@8.57.0) + eslint: 8.56.0 + eslint-plugin-es: 3.0.1(eslint@8.56.0) eslint-utils: 2.1.0 ignore: 5.3.1 minimatch: 3.1.2 resolve: 1.22.8 semver: 6.3.1 - eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): + eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.55.0))(eslint@8.55.0)(prettier@3.2.5): + dependencies: + eslint: 8.55.0 + prettier: 3.2.5 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.6 + optionalDependencies: + '@types/eslint': 8.56.10 + eslint-config-prettier: 9.1.0(eslint@8.55.0) + + eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5): dependencies: - eslint: 8.57.0 + eslint: 8.56.0 prettier: 3.2.5 prettier-linter-helpers: 1.0.0 - synckit: 0.8.8 + synckit: 0.8.6 optionalDependencies: '@types/eslint': 8.56.10 - eslint-config-prettier: 9.1.0(eslint@8.57.0) + eslint-config-prettier: 9.1.0(eslint@8.56.0) + + eslint-plugin-promise@6.1.1(eslint@8.55.0): + dependencies: + eslint: 8.55.0 + + eslint-plugin-promise@6.1.1(eslint@8.56.0): + dependencies: + eslint: 8.56.0 - eslint-plugin-promise@6.1.1(eslint@8.57.0): + eslint-plugin-simple-import-sort@12.0.0(eslint@8.56.0): dependencies: - eslint: 8.57.0 + eslint: 8.56.0 - eslint-plugin-simple-import-sort@12.1.0(eslint@8.57.0): + eslint-plugin-storybook@0.8.0(eslint@8.56.0)(typescript@5.4.3): dependencies: - eslint: 8.57.0 + '@storybook/csf': 0.0.1 + '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.4.3) + eslint: 8.56.0 + requireindex: 1.2.0 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - supports-color + - typescript - eslint-plugin-storybook@0.8.0(eslint@8.57.0)(typescript@5.4.5): + eslint-plugin-storybook@0.8.0(eslint@8.56.0)(typescript@5.4.5): dependencies: '@storybook/csf': 0.0.1 - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 + '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.4.5) + eslint: 8.56.0 requireindex: 1.2.0 ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-svelte@2.38.0(eslint@8.57.0)(svelte@4.2.16)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)): + eslint-plugin-svelte@2.38.0(eslint@8.56.0)(svelte@4.2.13)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@jridgewell/sourcemap-codec': 1.4.15 + debug: 4.3.4 + eslint: 8.56.0 + eslint-compat-utils: 0.5.0(eslint@8.56.0) + esutils: 2.0.3 + known-css-properties: 0.30.0 + postcss: 8.4.38 + postcss-load-config: 3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) + postcss-safe-parser: 6.0.0(postcss@8.4.38) + postcss-selector-parser: 6.0.16 + semver: 7.6.0 + svelte-eslint-parser: 0.35.0(svelte@4.2.13) + optionalDependencies: + svelte: 4.2.13 + transitivePeerDependencies: + - supports-color + - ts-node + + eslint-plugin-svelte@2.38.0(eslint@8.56.0)(svelte@4.2.17)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@jridgewell/sourcemap-codec': 1.4.15 debug: 4.3.4 - eslint: 8.57.0 - eslint-compat-utils: 0.5.0(eslint@8.57.0) + eslint: 8.56.0 + eslint-compat-utils: 0.5.0(eslint@8.56.0) esutils: 2.0.3 known-css-properties: 0.30.0 postcss: 8.4.38 - postcss-load-config: 3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + postcss-load-config: 3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) postcss-safe-parser: 6.0.0(postcss@8.4.38) postcss-selector-parser: 6.0.16 - semver: 7.6.1 - svelte-eslint-parser: 0.36.0(svelte@4.2.16) + semver: 7.6.0 + svelte-eslint-parser: 0.35.0(svelte@4.2.17) optionalDependencies: - svelte: 4.2.16 + svelte: 4.2.17 transitivePeerDependencies: - supports-color - ts-node + eslint-plugin-svelte@2.38.0(eslint@8.56.0)(svelte@4.2.17)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@jridgewell/sourcemap-codec': 1.4.15 + debug: 4.3.4 + eslint: 8.56.0 + eslint-compat-utils: 0.5.0(eslint@8.56.0) + esutils: 2.0.3 + known-css-properties: 0.30.0 + postcss: 8.4.38 + postcss-load-config: 3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) + postcss-safe-parser: 6.0.0(postcss@8.4.38) + postcss-selector-parser: 6.0.16 + semver: 7.6.0 + svelte-eslint-parser: 0.35.0(svelte@4.2.17) + optionalDependencies: + svelte: 4.2.17 + transitivePeerDependencies: + - ts-node + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -19466,14 +23462,14 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) doctrine: 3.0.0 enquirer: 2.4.1 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-utils: 3.0.0(eslint@8.4.1) eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + espree: 9.2.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -19491,10 +23487,10 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.4 + optionator: 0.9.3 progress: 2.0.3 regexpp: 3.2.0 - semver: 7.6.2 + semver: 7.6.3 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 text-table: 0.2.0 @@ -19502,13 +23498,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@8.57.0: + eslint@8.55.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint/js': 8.55.0 + '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 @@ -19527,6 +23523,49 @@ snapshots: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + eslint@8.56.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.56.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.5 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -19539,7 +23578,7 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.4 + optionator: 0.9.3 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -19549,21 +23588,21 @@ snapshots: esniff@2.0.1: dependencies: - d: 1.0.2 + d: 1.0.1 es5-ext: 0.10.64 event-emitter: 0.3.5 - type: 2.7.2 + type: 2.7.3 espree@9.2.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.0 + acorn-jsx: 5.3.2(acorn@8.12.0) eslint-visitor-keys: 3.4.3 espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.0 + acorn-jsx: 5.3.2(acorn@8.12.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -19624,6 +23663,11 @@ snapshots: transitivePeerDependencies: - supports-color + eth-ens-namehash@2.0.8: + dependencies: + idna-uts46-hx: 2.3.1 + js-sha3: 0.5.7 + eth-json-rpc-filters@6.0.1: dependencies: '@metamask/safe-event-emitter': 3.1.1 @@ -19632,6 +23676,25 @@ snapshots: json-rpc-engine: 6.1.0 pify: 5.0.0 + eth-lib@0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.7 + nano-json-stream-parser: 0.1.2 + servify: 0.1.12 + ws: 3.3.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + xhr-request-promise: 0.1.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + eth-lib@0.2.8: + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.7 + xhr-request-promise: 0.1.3 + eth-query@2.1.2: dependencies: json-rpc-random-id: 1.0.1 @@ -19645,9 +23708,9 @@ snapshots: dependencies: crypto-js: 3.3.0 - ethereum-bloom-filters@1.1.0: + ethereum-bloom-filters@1.0.10: dependencies: - '@noble/hashes': 1.4.0 + js-sha3: 0.8.0 ethereum-cryptography@0.1.3: dependencies: @@ -19674,12 +23737,27 @@ snapshots: '@scure/bip32': 1.1.5 '@scure/bip39': 1.1.1 - ethereum-cryptography@2.1.3: + ethereum-cryptography@2.2.1: dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/bip32': 1.3.3 - '@scure/bip39': 1.2.2 + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + + ethereumjs-abi@0.6.8: + dependencies: + bn.js: 4.12.0 + ethereumjs-util: 6.2.1 + + ethereumjs-util@6.2.1: + dependencies: + '@types/bn.js': 4.11.6 + bn.js: 4.12.0 + create-hash: 1.2.0 + elliptic: 6.5.7 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 ethereumjs-util@7.1.5: dependencies: @@ -19689,7 +23767,7 @@ snapshots: ethereum-cryptography: 0.1.3 rlp: 2.2.7 - ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -19709,7 +23787,7 @@ snapshots: '@ethersproject/networks': 5.7.1 '@ethersproject/pbkdf2': 5.7.0 '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@ethersproject/random': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/sha2': 5.7.0 @@ -19725,20 +23803,40 @@ snapshots: - bufferutil - utf-8-validate + ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 18.15.13 + aes-js: 4.0.0-beta.5 + tslib: 2.4.0 + ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + ethjs-unit@0.1.6: dependencies: bn.js: 4.11.6 number-to-bn: 1.7.0 + ethjs-util@0.1.6: + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + event-emitter@0.3.5: dependencies: - d: 1.0.2 + d: 1.0.1 es5-ext: 0.10.64 event-target-shim@5.0.1: {} eventemitter2@6.4.9: {} + eventemitter3@4.0.4: {} + eventemitter3@5.0.1: {} events@3.3.0: {} @@ -19760,6 +23858,18 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execa@7.2.0: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.2.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + execa@8.0.1: dependencies: cross-spawn: 7.0.3 @@ -19767,7 +23877,7 @@ snapshots: human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.3.0 + npm-run-path: 5.2.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 @@ -19780,34 +23890,34 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - express@4.19.2: + express@4.21.0: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 + body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.3.1 fresh: 0.5.2 http-errors: 2.0.0 - merge-descriptors: 1.0.1 + merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: 0.1.10 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.19.0 + serve-static: 1.16.2 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -19816,16 +23926,16 @@ snapshots: transitivePeerDependencies: - supports-color - expressive-code@0.35.3: + expressive-code@0.35.6: dependencies: - '@expressive-code/core': 0.35.3 - '@expressive-code/plugin-frames': 0.35.3 - '@expressive-code/plugin-shiki': 0.35.3 - '@expressive-code/plugin-text-markers': 0.35.3 + '@expressive-code/core': 0.35.6 + '@expressive-code/plugin-frames': 0.35.6 + '@expressive-code/plugin-shiki': 0.35.6 + '@expressive-code/plugin-text-markers': 0.35.6 ext@1.7.0: dependencies: - type: 2.7.2 + type: 2.7.3 extend-shallow@2.0.1: dependencies: @@ -19833,11 +23943,31 @@ snapshots: extend@3.0.2: {} + extendable-error@0.1.7: {} + + extension-port-stream@2.1.1: + dependencies: + webextension-polyfill: 0.10.0 + extension-port-stream@3.0.0: dependencies: readable-stream: 3.6.2 webextension-polyfill: 0.10.0 + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + extsprintf@1.3.0: {} + + eyes@0.1.8: {} + + fast-base64-decode@1.0.0: {} + + fast-deep-equal@2.0.1: {} + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -19850,13 +23980,13 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fast-redact@3.5.0: {} + fast-redact@3.3.0: {} fast-safe-stringify@2.1.1: {} @@ -19864,7 +23994,7 @@ snapshots: dependencies: strnum: 1.0.5 - fast-xml-parser@4.3.6: + fast-xml-parser@4.3.4: dependencies: strnum: 1.0.5 @@ -19878,24 +24008,21 @@ snapshots: dependencies: bser: 2.1.1 - fetch-retry@5.0.6: {} + fdir@6.3.0(picomatch@3.0.1): + optionalDependencies: + picomatch: 3.0.1 file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - file-system-cache@2.3.0: - dependencies: - fs-extra: 11.1.1 - ramda: 0.29.0 + filesize@10.1.1: {} - filelist@1.0.4: + fill-range@7.1.1: dependencies: - minimatch: 5.1.6 - - filesize@10.1.1: {} + to-regex-range: 5.0.1 - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -19913,10 +24040,10 @@ snapshots: transitivePeerDependencies: - supports-color - finalhandler@1.2.0: + finalhandler@1.3.1: dependencies: debug: 2.6.9 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 @@ -19937,6 +24064,14 @@ snapshots: make-dir: 3.1.0 pkg-dir: 4.2.0 + find-root@1.1.0: {} + + find-up-simple@1.0.0: {} + + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + find-up@3.0.0: dependencies: locate-path: 3.0.0 @@ -19958,12 +24093,12 @@ snapshots: find-yarn-workspace-root2@1.2.16: dependencies: - micromatch: 4.0.5 + micromatch: 4.0.8 pkg-dir: 4.2.0 flat-cache@3.2.0: dependencies: - flatted: 3.3.1 + flatted: 3.2.9 keyv: 4.5.4 rimraf: 3.0.2 @@ -19971,33 +24106,49 @@ snapshots: dependencies: is-buffer: 2.0.5 - flatted@3.3.1: {} + flat@5.0.2: {} + + flatted@3.2.9: {} flattie@1.1.1: {} flow-enums-runtime@0.0.6: {} - flow-parser@0.235.1: {} + flow-parser@0.206.0: {} - follow-redirects@1.15.6(debug@4.3.4): + follow-redirects@1.15.5(debug@4.3.4): optionalDependencies: debug: 4.3.4 + follow-redirects@1.15.9(debug@4.3.7): + optionalDependencies: + debug: 4.3.7(supports-color@8.1.1) + for-each@0.3.3: dependencies: is-callable: 1.2.7 - foreground-child@3.1.1: + foreground-child@3.2.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 + forever-agent@0.6.1: {} + forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3: {} - forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/52715a217dc51d0de15877878ab8213f6cbbbab5: {} + forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/8f24d6b04c92975e0795b5868aa0d783251cdeaa: {} + + form-data-encoder@1.7.1: {} form-data-encoder@2.1.4: {} + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + form-data@4.0.0: dependencies: asynckit: 0.4.0 @@ -20006,23 +24157,29 @@ snapshots: forwarded@0.2.0: {} + fp-ts@1.19.3: {} + fraction.js@4.3.7: {} fresh@0.5.2: {} - fs-constants@1.0.0: {} - - fs-extra@11.1.1: + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - fs-extra@11.2.0: + fs-extra@4.0.3: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 fs-extra@8.1.0: dependencies: @@ -20030,9 +24187,9 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs-minipass@2.1.0: + fs-minipass@1.2.7: dependencies: - minipass: 3.3.6 + minipass: 2.9.0 fs.realpath@1.0.0: {} @@ -20048,7 +24205,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.3 functions-have-names: 1.2.3 functional-red-black-tree@1.0.1: {} @@ -20071,40 +24228,32 @@ snapshots: function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.2 + hasown: 2.0.1 get-iterator@1.0.2: {} - get-nonce@1.0.1: {} - - get-npm-tarball-url@2.1.0: {} - get-port-please@3.1.2: {} + get-stream@5.2.0: + dependencies: + pump: 3.0.0 + get-stream@6.0.1: {} get-stream@8.0.1: {} - get-symbol-description@1.0.2: + get-symbol-description@1.0.0: dependencies: call-bind: 1.0.7 - es-errors: 1.3.0 get-intrinsic: 1.2.4 - get-tsconfig@4.7.4: + get-tsconfig@4.7.2: dependencies: resolve-pkg-maps: 1.0.0 - giget@1.2.3: + getpass@0.1.7: dependencies: - citty: 0.1.6 - consola: 3.2.3 - defu: 6.1.4 - node-fetch-native: 1.6.4 - nypm: 0.3.8 - ohash: 1.1.3 - pathe: 1.1.2 - tar: 6.2.1 + assert-plus: 1.0.0 github-slugger@2.0.0: {} @@ -20116,15 +24265,31 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-to-regexp@0.4.1: {} - - glob@10.3.12: + glob@10.3.10: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.4 - minipass: 7.1.0 - path-scurry: 1.10.2 + minipass: 7.0.4 + path-scurry: 1.10.1 + + glob@11.0.0: + dependencies: + foreground-child: 3.1.1 + jackspeak: 4.0.1 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 2.0.0 + + glob@7.2.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 glob@7.2.3: dependencies: @@ -20140,19 +24305,27 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.1.6 + minimatch: 5.0.1 once: 1.4.0 + global@4.4.0: + dependencies: + min-document: 2.19.0 + process: 0.11.10 + globals@11.12.0: {} + globals@13.23.0: + dependencies: + type-fest: 0.20.2 + globals@13.24.0: dependencies: type-fest: 0.20.2 - globalthis@1.0.4: + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 globalyzer@0.1.0: {} @@ -20173,21 +24346,42 @@ snapshots: merge2: 1.4.1 slash: 4.0.0 - globby@14.0.1: - dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.2 - ignore: 5.3.1 - path-type: 5.0.0 - slash: 5.1.0 - unicorn-magic: 0.1.0 - globrex@0.1.2: {} gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + got@12.1.0: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 5.0.1 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 6.1.0 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + form-data-encoder: 1.7.1 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 2.0.1 + got@12.6.1: dependencies: '@sindresorhus/is': 5.6.0 @@ -20217,29 +24411,17 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 - gunzip-maybe@1.4.2: + h3@1.10.2: dependencies: - browserify-zlib: 0.1.4 - is-deflate: 1.0.0 - is-gzip: 1.0.0 - peek-stream: 1.1.3 - pumpify: 1.5.1 - through2: 2.0.5 - - h3@1.11.1: - dependencies: - cookie-es: 1.1.0 - crossws: 0.2.4 + cookie-es: 1.0.0 defu: 6.1.4 destr: 2.0.3 - iron-webcrypto: 1.1.1 + iron-webcrypto: 1.0.0 ohash: 1.1.3 - radix3: 1.1.2 - ufo: 1.5.3 + radix3: 1.1.0 + ufo: 1.4.0 uncrypto: 0.1.3 unenv: 1.9.0 - transitivePeerDependencies: - - uWebSockets.js handlebars@4.7.8: dependencies: @@ -20248,7 +24430,69 @@ snapshots: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.17.4 + uglify-js: 3.19.3 + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/abi': 5.7.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/edr': 0.6.3 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/solidity-analyzer': 0.1.2 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.5 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chalk: 2.4.2 + chokidar: 4.0.0 + ci-info: 2.0.0 + debug: 4.3.7(supports-color@8.1.1) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 + find-up: 2.1.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + glob: 7.2.0 + immutable: 4.3.7 + io-ts: 1.10.4 + json-stream-stringify: 3.1.6 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.7.3 + p-map: 4.0.0 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.8.26(debug@4.3.7) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.10 + tsort: 0.0.1 + undici: 5.28.3 + uuid: 8.3.2 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.3) + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - c-kzg + - supports-color + - utf-8-validate has-bigints@1.0.2: {} @@ -20264,7 +24508,7 @@ snapshots: has-symbols@1.0.3: {} - has-tostringtag@1.0.2: + has-tostringtag@1.0.0: dependencies: has-symbols: 1.0.3 @@ -20281,10 +24525,15 @@ snapshots: hashlru@2.3.0: {} - hasown@2.0.2: + hasown@2.0.1: dependencies: function-bind: 1.1.2 + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element: 3.0.0 + hast-util-from-html@2.0.1: dependencies: '@types/hast': 3.0.4 @@ -20313,6 +24562,10 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-is-body-ok-link@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -20321,6 +24574,14 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-raw@9.0.3: dependencies: '@types/hast': 3.0.4 @@ -20329,11 +24590,11 @@ snapshots: hast-util-from-parse5: 8.0.1 hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 + mdast-util-to-hast: 13.2.0 parse5: 7.1.2 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -20383,7 +24644,21 @@ snapshots: '@types/unist': 3.0.2 ccount: 2.0.1 comma-separated-tokens: 2.0.3 - hast-util-raw: 9.0.3 + hast-util-raw: 9.0.4 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-html@9.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.1.0 @@ -20453,23 +24728,25 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 + he@1.2.0: {} + header-case@2.0.4: dependencies: capital-case: 1.0.4 tslib: 2.6.2 + hermes-estree@0.15.0: {} + hermes-estree@0.19.1: {} - hermes-estree@0.20.1: {} + hermes-parser@0.15.0: + dependencies: + hermes-estree: 0.15.0 hermes-parser@0.19.1: dependencies: hermes-estree: 0.19.1 - hermes-parser@0.20.1: - dependencies: - hermes-estree: 0.20.1 - hermes-profile-transformer@0.0.6: dependencies: source-map: 0.7.4 @@ -20482,7 +24759,9 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - hosted-git-info@2.8.9: {} + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 html-encoding-sniffer@4.0.0: dependencies: @@ -20498,6 +24777,8 @@ snapshots: html-void-elements@3.0.0: {} + html-whitespace-sensitive-tag-names@3.0.0: {} + htmlparser2-svelte@4.1.0: dependencies: domelementtype: 2.3.0 @@ -20515,38 +24796,70 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-https@1.0.0: {} + http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.1 + agent-base: 7.1.0 debug: 4.3.4 transitivePeerDependencies: - supports-color http-shutdown@1.2.2: {} + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.7(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + https-proxy-agent@7.0.4: dependencies: - agent-base: 7.1.1 + agent-base: 7.1.0 debug: 4.3.4 transitivePeerDependencies: - supports-color + human-id@1.0.2: {} + human-signals@2.1.0: {} + human-signals@4.3.1: {} + human-signals@5.0.0: {} i18next-browser-languagedetector@7.1.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 + + i18next-browser-languagedetector@7.2.0: + dependencies: + '@babel/runtime': 7.23.9 i18next@22.5.1: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 + + i18next@23.11.5: + dependencies: + '@babel/runtime': 7.23.9 iconv-lite@0.4.24: dependencies: @@ -20558,20 +24871,30 @@ snapshots: idb-keyval@6.2.1: {} + idna-uts46-hx@2.3.1: + dependencies: + punycode: 2.1.0 + ieee754@1.2.1: {} ignore-walk@5.0.1: dependencies: - minimatch: 5.1.6 + minimatch: 5.0.1 ignore@4.0.6: {} + ignore@5.3.0: {} + ignore@5.3.1: {} image-size@1.1.1: dependencies: queue: 6.0.2 + immediate@3.0.6: {} + + immutable@4.3.7: {} + import-fresh@2.0.0: dependencies: caller-path: 2.0.0 @@ -20582,6 +24905,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-meta-resolve@4.0.0: {} + import-meta-resolve@4.1.0: {} imurmurhash@0.1.4: {} @@ -20610,60 +24935,78 @@ snapshots: interface-datastore@8.2.11: dependencies: interface-store: 5.1.8 - uint8arrays: 5.0.3 + uint8arrays: 5.1.0 interface-store@3.0.4: {} interface-store@5.1.8: {} - internal-slot@1.0.7: + internal-slot@1.0.6: dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 + get-intrinsic: 1.2.4 + hasown: 2.0.1 + side-channel: 1.0.4 - intl-messageformat@10.5.12: + intl-messageformat@10.5.11: dependencies: - '@formatjs/ecma402-abstract': 1.18.2 + '@formatjs/ecma402-abstract': 2.0.0 '@formatjs/fast-memoize': 2.2.0 - '@formatjs/icu-messageformat-parser': 2.7.6 - tslib: 2.6.2 + '@formatjs/icu-messageformat-parser': 2.7.8 + tslib: 2.6.3 invariant@2.2.4: dependencies: loose-envify: 1.4.0 - ip@2.0.1: {} + io-ts@1.10.4: + dependencies: + fp-ts: 1.19.3 + + ioredis@5.3.2: + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.7(supports-color@8.1.1) + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + + ip@1.1.9: {} ipaddr.js@1.9.1: {} ipfs-core-types@0.14.1: dependencies: - '@ipld/dag-pb': 4.1.0 + '@ipld/dag-pb': 4.1.2 '@libp2p/interface-keychain': 2.0.5 '@libp2p/interface-peer-id': 2.0.2 '@libp2p/interface-peer-info': 1.0.10 '@libp2p/interface-pubsub': 3.0.7 '@multiformats/multiaddr': 11.6.1 - '@types/node': 18.19.33 + '@types/node': 18.19.31 interface-datastore: 7.0.4 ipfs-unixfs: 9.0.1 multiformats: 11.0.2 transitivePeerDependencies: - supports-color - ipfs-core-utils@0.18.1(encoding@0.1.13): + ipfs-core-utils@0.18.1: dependencies: '@libp2p/logger': 2.1.1 '@multiformats/multiaddr': 11.6.1 '@multiformats/multiaddr-to-uri': 9.0.8 any-signal: 3.0.1 blob-to-it: 2.0.6 - browser-readablestream-to-it: 2.0.7 + browser-readablestream-to-it: 2.0.6 err-code: 3.0.1 ipfs-core-types: 0.14.1 ipfs-unixfs: 9.0.1 - ipfs-utils: 9.0.14(encoding@0.1.13) + ipfs-utils: 9.0.14 it-all: 2.0.1 it-map: 2.0.1 it-peekable: 2.0.1 @@ -20678,11 +25021,11 @@ snapshots: - encoding - supports-color - ipfs-http-client@60.0.1(encoding@0.1.13): + ipfs-http-client@60.0.1: dependencies: - '@ipld/dag-cbor': 9.2.0 - '@ipld/dag-json': 10.2.0 - '@ipld/dag-pb': 4.1.0 + '@ipld/dag-cbor': 9.2.1 + '@ipld/dag-json': 10.2.2 + '@ipld/dag-pb': 4.1.2 '@libp2p/logger': 2.1.1 '@libp2p/peer-id': 2.0.4 '@multiformats/multiaddr': 11.6.1 @@ -20690,8 +25033,8 @@ snapshots: dag-jose: 4.0.0 err-code: 3.0.1 ipfs-core-types: 0.14.1 - ipfs-core-utils: 0.18.1(encoding@0.1.13) - ipfs-utils: 9.0.14(encoding@0.1.13) + ipfs-core-utils: 0.18.1 + ipfs-utils: 9.0.14 it-first: 2.0.1 it-last: 2.0.1 merge-options: 3.0.4 @@ -20706,9 +25049,9 @@ snapshots: ipfs-unixfs@9.0.1: dependencies: err-code: 3.0.1 - protobufjs: 7.2.6 + protobufjs: 7.3.2 - ipfs-utils@9.0.14(encoding@0.1.13): + ipfs-utils@9.0.14: dependencies: any-signal: 3.0.1 browser-readablestream-to-it: 1.0.3 @@ -20722,14 +25065,14 @@ snapshots: it-to-stream: 1.0.0 merge-options: 3.0.4 nanoid: 3.3.7 - native-fetch: 3.0.0(node-fetch@2.7.0(encoding@0.1.13)) - node-fetch: 2.7.0(encoding@0.1.13) + native-fetch: 3.0.0(node-fetch@2.7.0) + node-fetch: 2.7.0 react-native-fetch-api: 3.0.0 stream-to-it: 0.2.4 transitivePeerDependencies: - encoding - iron-webcrypto@1.1.1: {} + iron-webcrypto@1.0.0: {} is-absolute-url@4.0.1: {} @@ -20743,12 +25086,13 @@ snapshots: is-arguments@1.1.1: dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 - is-array-buffer@3.0.4: + is-array-buffer@3.0.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 + is-typed-array: 1.1.12 is-arrayish@0.2.1: {} @@ -20760,12 +25104,12 @@ snapshots: is-binary-path@2.1.0: dependencies: - binary-extensions: 2.3.0 + binary-extensions: 2.2.0 is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 is-buffer@2.0.5: {} @@ -20775,22 +25119,16 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.13.1: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.1: + is-core-module@2.14.0: dependencies: - is-typed-array: 1.1.13 + hasown: 2.0.1 is-date-object@1.0.5: dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 is-decimal@2.0.1: {} - is-deflate@1.0.0: {} - is-directory@0.3.1: {} is-docker@2.2.1: {} @@ -20807,16 +25145,16 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-function@1.0.2: {} + is-generator-function@1.0.10: dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-gzip@1.0.0: {} - is-hex-prefixed@1.0.0: {} is-hexadecimal@2.0.1: {} @@ -20829,23 +25167,14 @@ snapshots: is-interactive@2.0.0: {} - is-map@2.0.3: {} - - is-nan@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - is-negative-zero@2.0.3: {} + is-negative-zero@2.0.2: {} is-number-object@1.0.7: dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 is-number@7.0.0: {} - is-path-cwd@2.2.0: {} - is-path-inside@3.0.3: {} is-plain-obj@2.1.0: {} @@ -20867,11 +25196,9 @@ snapshots: is-regex@1.1.4: dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 @@ -20881,15 +25208,21 @@ snapshots: is-string@1.0.7: dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - is-typed-array@1.1.13: + is-typed-array@1.1.12: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.13 + + is-typedarray@1.0.0: {} is-unicode-supported@0.1.0: {} @@ -20897,16 +25230,11 @@ snapshots: is-unicode-supported@2.0.0: {} - is-weakmap@2.0.2: {} - is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - is-weakset@2.0.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + is-windows@1.0.2: {} is-wsl@1.1.0: {} @@ -20934,20 +25262,26 @@ snapshots: isobject@3.0.1: {} - isomorphic-unfetch@3.1.0(encoding@0.1.13): + isomorphic-unfetch@3.1.0: dependencies: - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 unfetch: 4.2.0 transitivePeerDependencies: - encoding + isows@1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + isows@1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)): dependencies: - ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.13.0 - isows@1.0.4(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)): + isows@1.0.4(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)): dependencies: - ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + + isstream@0.1.2: {} istanbul-lib-coverage@3.2.2: {} @@ -20957,10 +25291,10 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.4: + istanbul-lib-source-maps@5.0.5: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.4 + debug: 4.3.5 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -21004,18 +25338,17 @@ snapshots: p-fifo: 1.0.0 readable-stream: 3.6.2 - jackspeak@2.3.6: + jackspeak@3.4.0: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.9.1: + jackspeak@4.0.1: dependencies: - async: 3.2.5 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 jest-diff@29.7.0: dependencies: @@ -21029,7 +25362,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.11 + '@types/node': 20.12.7 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -21044,12 +25377,12 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.7 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -21057,13 +25390,13 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.11 + '@types/node': 20.12.7 jest-util: 29.7.0 jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.11 + '@types/node': 20.12.7 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -21080,14 +25413,14 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@1.21.0: {} + jiti@1.21.6: {} - joi@17.13.1: + joi@17.12.1: dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -21095,11 +25428,15 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 + js-cookie@2.2.1: {} + + js-sha3@0.5.7: {} + js-sha3@0.8.0: {} js-tokens@4.0.0: {} - js-tokens@9.0.0: {} + js-tokens@8.0.3: {} js-yaml@3.14.1: dependencies: @@ -21110,27 +25447,29 @@ snapshots: dependencies: argparse: 2.0.1 + jsbn@0.1.1: {} + jsc-android@250231.0.0: {} jsc-safe-url@0.2.4: {} - jscodeshift@0.14.0(@babel/preset-env@7.24.5(@babel/core@7.24.5)): - dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) - '@babel/preset-flow': 7.24.1(@babel/core@7.24.5) - '@babel/preset-typescript': 7.24.1(@babel/core@7.24.5) - '@babel/register': 7.23.7(@babel/core@7.24.5) - babel-core: 7.0.0-bridge.0(@babel/core@7.24.5) + jscodeshift@0.14.0(@babel/preset-env@7.23.9(@babel/core@7.25.2)): + dependencies: + '@babel/core': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.25.2) + '@babel/preset-env': 7.23.9(@babel/core@7.25.2) + '@babel/preset-flow': 7.23.3(@babel/core@7.25.2) + '@babel/preset-typescript': 7.23.3(@babel/core@7.25.2) + '@babel/register': 7.23.7(@babel/core@7.25.2) + babel-core: 7.0.0-bridge.0(@babel/core@7.25.2) chalk: 4.1.2 - flow-parser: 0.235.1 + flow-parser: 0.206.0 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.8 neo-async: 2.6.2 node-dir: 0.1.17 recast: 0.21.5 @@ -21139,34 +25478,35 @@ snapshots: transitivePeerDependencies: - supports-color - jscodeshift@0.15.2(@babel/preset-env@7.24.5(@babel/core@7.24.5)): + jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/preset-flow': 7.24.1(@babel/core@7.24.5) - '@babel/preset-typescript': 7.24.1(@babel/core@7.24.5) - '@babel/register': 7.23.7(@babel/core@7.24.5) - babel-core: 7.0.0-bridge.0(@babel/core@7.24.5) - chalk: 4.1.2 - flow-parser: 0.235.1 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - neo-async: 2.6.2 - node-dir: 0.1.17 - recast: 0.23.7 - temp: 0.8.4 - write-file-atomic: 2.4.3 - optionalDependencies: - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) + cssstyle: 4.0.1 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 7.1.2 + rrweb-cssom: 0.6.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + xml-name-validator: 5.0.0 transitivePeerDependencies: + - bufferutil - supports-color + - utf-8-validate - jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + jsdom@24.1.0: dependencies: cssstyle: 4.0.1 data-urls: 5.0.0 @@ -21174,25 +25514,26 @@ snapshots: form-data: 4.0.0 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.5 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.9 + nwsapi: 2.2.7 parse5: 7.1.2 - rrweb-cssom: 0.6.0 + rrweb-cssom: 0.7.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.4 + tough-cookie: 4.1.3 w3c-xmlserializer: 5.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate + optional: true jsesc@0.5.0: {} @@ -21209,14 +25550,26 @@ snapshots: '@metamask/safe-event-emitter': 2.0.0 eth-rpc-errors: 4.0.3 + json-rpc-middleware-stream@4.2.3: + dependencies: + '@metamask/safe-event-emitter': 3.1.1 + json-rpc-engine: 6.1.0 + readable-stream: 2.3.8 + json-rpc-random-id@1.0.1: {} json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} + json-schema@0.4.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} + json-stream-stringify@3.1.6: {} + + json-stringify-safe@5.0.1: {} + json-to-ast@2.1.0: dependencies: code-error-fragment: 0.0.230 @@ -21230,6 +25583,8 @@ snapshots: jsonc-parser@2.3.1: {} + jsonc-parser@3.2.0: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -21242,10 +25597,30 @@ snapshots: jsonpointer@5.0.1: {} + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + keccak256@1.0.6: + dependencies: + bn.js: 5.2.1 + buffer: 6.0.3 + keccak: 3.0.4 + keccak@3.0.4: dependencies: node-addon-api: 2.0.2 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.0 readable-stream: 3.6.2 keyv@4.5.4: @@ -21260,52 +25635,46 @@ snapshots: kleur@4.1.5: {} - known-css-properties@0.30.0: {} + known-css-properties@0.34.0: {} latest-version@7.0.0: dependencies: package-json: 8.1.1 - lazy-universal-dotenv@4.0.0: - dependencies: - app-root-dir: 1.0.2 - dotenv: 16.4.5 - dotenv-expand: 10.0.0 - lefthook-darwin-arm64@1.6.10: optional: true - lefthook-darwin-x64@1.6.10: + lefthook-darwin-x64@1.6.18: optional: true - lefthook-freebsd-arm64@1.6.10: + lefthook-freebsd-arm64@1.6.18: optional: true - lefthook-freebsd-x64@1.6.10: + lefthook-freebsd-x64@1.6.18: optional: true - lefthook-linux-arm64@1.6.10: + lefthook-linux-arm64@1.6.18: optional: true - lefthook-linux-x64@1.6.10: + lefthook-linux-x64@1.6.18: optional: true - lefthook-windows-arm64@1.6.10: + lefthook-windows-arm64@1.6.18: optional: true - lefthook-windows-x64@1.6.10: + lefthook-windows-x64@1.6.18: optional: true - lefthook@1.6.10: + lefthook@1.6.18: optionalDependencies: - lefthook-darwin-arm64: 1.6.10 - lefthook-darwin-x64: 1.6.10 - lefthook-freebsd-arm64: 1.6.10 - lefthook-freebsd-x64: 1.6.10 - lefthook-linux-arm64: 1.6.10 - lefthook-linux-x64: 1.6.10 - lefthook-windows-arm64: 1.6.10 - lefthook-windows-x64: 1.6.10 + lefthook-darwin-arm64: 1.6.18 + lefthook-darwin-x64: 1.6.18 + lefthook-freebsd-arm64: 1.6.18 + lefthook-freebsd-x64: 1.6.18 + lefthook-linux-arm64: 1.6.18 + lefthook-linux-x64: 1.6.18 + lefthook-windows-arm64: 1.6.18 + lefthook-windows-x64: 1.6.18 leven@3.1.0: {} @@ -21314,6 +25683,10 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lie@3.3.0: + dependencies: + immediate: 3.0.6 + lighthouse-logger@1.4.2: dependencies: debug: 2.6.9 @@ -21323,32 +25696,30 @@ snapshots: lilconfig@2.1.0: {} - lilconfig@3.1.1: {} + lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} - listhen@1.7.2: + listhen@1.6.0: dependencies: - '@parcel/watcher': 2.4.1 - '@parcel/watcher-wasm': 2.4.1 + '@parcel/watcher': 2.4.0 + '@parcel/watcher-wasm': 2.4.0 citty: 0.1.6 clipboardy: 4.0.0 consola: 3.2.3 - crossws: 0.2.4 + crossws: 0.1.1 defu: 6.1.4 get-port-please: 3.1.2 - h3: 1.11.1 + h3: 1.10.2 http-shutdown: 1.2.2 jiti: 1.21.0 - mlly: 1.7.0 + mlly: 1.5.0 node-forge: 1.3.1 pathe: 1.1.2 std-env: 3.7.0 - ufo: 1.5.3 + ufo: 1.4.0 untun: 0.1.3 uqr: 0.1.2 - transitivePeerDependencies: - - uWebSockets.js lit-element@3.3.3: dependencies: @@ -21356,17 +25727,17 @@ snapshots: '@lit/reactive-element': 1.6.3 lit-html: 2.8.0 - lit-element@4.0.5: + lit-element@4.0.4: dependencies: '@lit-labs/ssr-dom-shim': 1.2.0 '@lit/reactive-element': 2.0.4 - lit-html: 3.1.3 + lit-html: 3.1.2 lit-html@2.8.0: dependencies: '@types/trusted-types': 2.0.7 - lit-html@3.1.3: + lit-html@3.1.2: dependencies: '@types/trusted-types': 2.0.7 @@ -21379,8 +25750,8 @@ snapshots: lit@3.1.0: dependencies: '@lit/reactive-element': 2.0.4 - lit-element: 4.0.5 - lit-html: 3.1.3 + lit-element: 4.0.4 + lit-html: 3.1.2 load-tsconfig@0.2.5: {} @@ -21393,11 +25764,16 @@ snapshots: local-pkg@0.5.0: dependencies: - mlly: 1.7.0 - pkg-types: 1.1.0 + mlly: 1.5.0 + pkg-types: 1.0.3 locate-character@3.0.0: {} + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -21417,10 +25793,16 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.defaults@4.2.0: {} + + lodash.isarguments@3.1.0: {} + lodash.isequal@4.5.0: {} lodash.merge@4.6.2: {} + lodash.startcase@4.4.0: {} + lodash.throttle@4.1.1: {} lodash.truncate@4.4.2: {} @@ -21445,7 +25827,7 @@ snapshots: logkitty@0.7.1: dependencies: ansi-fragments: 0.2.1 - dayjs: 1.11.11 + dayjs: 1.11.10 yargs: 15.4.1 lokijs@1.5.12: {} @@ -21462,21 +25844,40 @@ snapshots: dependencies: get-func-name: 2.0.2 + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + lower-case@2.0.2: dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + + lowercase-keys@2.0.0: {} lowercase-keys@3.0.0: {} - lru-cache@10.2.2: {} + lru-cache@10.2.0: {} + + lru-cache@11.0.1: {} + + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 lru-cache@5.1.1: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lru-queue@0.1.0: dependencies: - es5-ext: 0.10.64 + es5-ext: 0.10.62 + + lru_map@0.3.3: {} lz-string@1.5.0: {} @@ -21484,10 +25885,28 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - magicast@0.3.4: + magic-string@0.30.11: dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@jridgewell/sourcemap-codec': 1.5.0 + + magic-string@0.30.7: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + magic-string@0.30.9: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + magicast@0.3.3: + dependencies: + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + source-map-js: 1.2.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 source-map-js: 1.2.0 make-dir@2.1.0: @@ -21501,7 +25920,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.2 + semver: 7.6.3 make-error@1.3.6: {} @@ -21515,9 +25934,9 @@ snapshots: markdown-table@3.0.3: {} - markdown-to-jsx@7.3.2(react@18.3.1): + markdown-to-jsx@7.5.0(react@18.2.0): dependencies: - react: 18.3.1 + react: 18.2.0 marky@1.2.5: {} @@ -21538,7 +25957,7 @@ snapshots: '@types/mdast': 4.0.4 '@types/unist': 3.0.2 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 stringify-entities: 4.0.4 @@ -21553,7 +25972,7 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - mdast-util-from-markdown@2.0.0: + mdast-util-from-markdown@2.0.1: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.2 @@ -21582,7 +26001,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 micromark-util-normalize-identifier: 2.0.0 transitivePeerDependencies: @@ -21591,7 +26010,7 @@ snapshots: mdast-util-gfm-strikethrough@2.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -21601,7 +26020,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -21610,14 +26029,14 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color mdast-util-gfm@3.0.0: dependencies: - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-gfm-autolink-literal: 2.0.0 mdast-util-gfm-footnote: 2.0.0 mdast-util-gfm-strikethrough: 2.0.0 @@ -21633,7 +26052,7 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -21646,7 +26065,7 @@ snapshots: '@types/unist': 3.0.2 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 stringify-entities: 4.0.4 @@ -21658,7 +26077,7 @@ snapshots: mdast-util-mdx@3.0.0: dependencies: - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-mdx-expression: 2.0.0 mdast-util-mdx-jsx: 3.1.2 mdast-util-mdxjs-esm: 2.0.1 @@ -21672,7 +26091,7 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -21682,7 +26101,7 @@ snapshots: '@types/mdast': 4.0.4 unist-util-is: 6.0.0 - mdast-util-to-hast@13.1.0: + mdast-util-to-hast@13.2.0: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -21692,7 +26111,7 @@ snapshots: trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 mdast-util-to-markdown@2.1.0: dependencies: @@ -21715,16 +26134,16 @@ snapshots: memoize-one@5.2.1: {} - memoizee@0.4.15: + memoizee@0.4.17: dependencies: - d: 1.0.2 - es5-ext: 0.10.64 + d: 1.0.1 + es5-ext: 0.10.62 es6-weak-map: 2.0.3 event-emitter: 0.3.5 is-promise: 2.2.2 lru-queue: 0.1.0 next-tick: 1.1.0 - timers-ext: 0.1.7 + timers-ext: 0.1.8 memoizerific@1.11.3: dependencies: @@ -21732,7 +26151,7 @@ snapshots: memorystream@0.3.1: {} - merge-descriptors@1.0.1: {} + merge-descriptors@1.0.3: {} merge-options@3.0.4: dependencies: @@ -21742,7 +26161,7 @@ snapshots: merge2@1.4.1: {} - merkletreejs@0.3.11: + merkletreejs@0.4.0: dependencies: bignumber.js: 9.1.2 buffer-reverse: 1.0.1 @@ -21752,42 +26171,42 @@ snapshots: methods@1.1.2: {} - metro-babel-transformer@0.80.9: + metro-babel-transformer@0.80.6: dependencies: - '@babel/core': 7.24.5 - hermes-parser: 0.20.1 + '@babel/core': 7.25.2 + hermes-parser: 0.19.1 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-cache-key@0.80.9: {} + metro-cache-key@0.80.6: {} - metro-cache@0.80.9: + metro-cache@0.80.6: dependencies: - metro-core: 0.80.9 + metro-core: 0.80.6 rimraf: 3.0.2 - metro-config@0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3): + metro-config@0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): dependencies: connect: 3.7.0 cosmiconfig: 5.2.1 jest-validate: 29.7.0 - metro: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - metro-cache: 0.80.9 - metro-core: 0.80.9 - metro-runtime: 0.80.9 + metro: 0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + metro-cache: 0.80.6 + metro-core: 0.80.6 + metro-runtime: 0.80.6 transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - metro-core@0.80.9: + metro-core@0.80.6: dependencies: lodash.throttle: 4.1.1 - metro-resolver: 0.80.9 + metro-resolver: 0.80.6 - metro-file-map@0.80.9: + metro-file-map@0.80.6: dependencies: anymatch: 3.1.3 debug: 2.6.9 @@ -21795,7 +26214,7 @@ snapshots: graceful-fs: 4.2.11 invariant: 2.2.4 jest-worker: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 node-abort-controller: 3.1.1 nullthrows: 1.1.1 walker: 1.0.8 @@ -21804,33 +26223,33 @@ snapshots: transitivePeerDependencies: - supports-color - metro-minify-terser@0.80.9: + metro-minify-terser@0.80.6: dependencies: - terser: 5.31.0 + terser: 5.27.2 - metro-resolver@0.80.9: {} + metro-resolver@0.80.6: {} - metro-runtime@0.80.9: + metro-runtime@0.80.6: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 - metro-source-map@0.80.9: + metro-source-map@0.80.6: dependencies: - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 invariant: 2.2.4 - metro-symbolicate: 0.80.9 + metro-symbolicate: 0.80.6 nullthrows: 1.1.1 - ob1: 0.80.9 + ob1: 0.80.6 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-symbolicate@0.80.9: + metro-symbolicate@0.80.6: dependencies: invariant: 2.2.4 - metro-source-map: 0.80.9 + metro-source-map: 0.80.6 nullthrows: 1.1.1 source-map: 0.5.7 through2: 2.0.5 @@ -21838,29 +26257,29 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-plugins@0.80.9: + metro-transform-plugins@0.80.6: dependencies: - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 + '@babel/core': 7.25.2 + '@babel/generator': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-transform-worker@0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3): - dependencies: - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - metro: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - metro-babel-transformer: 0.80.9 - metro-cache: 0.80.9 - metro-cache-key: 0.80.9 - metro-minify-terser: 0.80.9 - metro-source-map: 0.80.9 - metro-transform-plugins: 0.80.9 + metro-transform-worker@0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): + dependencies: + '@babel/core': 7.25.2 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + metro: 0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + metro-babel-transformer: 0.80.6 + metro-cache: 0.80.6 + metro-cache-key: 0.80.6 + metro-minify-terser: 0.80.6 + metro-source-map: 0.80.6 + metro-transform-plugins: 0.80.6 nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil @@ -21868,15 +26287,15 @@ snapshots: - supports-color - utf-8-validate - metro@0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3): + metro@0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): dependencies: - '@babel/code-frame': 7.24.2 - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.24.7 + '@babel/core': 7.25.2 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 @@ -21885,33 +26304,33 @@ snapshots: denodeify: 1.2.1 error-stack-parser: 2.1.4 graceful-fs: 4.2.11 - hermes-parser: 0.20.1 + hermes-parser: 0.19.1 image-size: 1.1.1 invariant: 2.2.4 jest-worker: 29.7.0 jsc-safe-url: 0.2.4 lodash.throttle: 4.1.1 - metro-babel-transformer: 0.80.9 - metro-cache: 0.80.9 - metro-cache-key: 0.80.9 - metro-config: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - metro-core: 0.80.9 - metro-file-map: 0.80.9 - metro-resolver: 0.80.9 - metro-runtime: 0.80.9 - metro-source-map: 0.80.9 - metro-symbolicate: 0.80.9 - metro-transform-plugins: 0.80.9 - metro-transform-worker: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + metro-babel-transformer: 0.80.6 + metro-cache: 0.80.6 + metro-cache-key: 0.80.6 + metro-config: 0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + metro-core: 0.80.6 + metro-file-map: 0.80.6 + metro-resolver: 0.80.6 + metro-runtime: 0.80.6 + metro-source-map: 0.80.6 + metro-symbolicate: 0.80.6 + metro-transform-plugins: 0.80.6 + metro-transform-worker: 0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) mime-types: 2.1.35 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 nullthrows: 1.1.1 rimraf: 3.0.2 serialize-error: 2.1.0 source-map: 0.5.7 strip-ansi: 6.0.1 throat: 5.0.0 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) yargs: 17.7.2 transitivePeerDependencies: - bufferutil @@ -22050,8 +26469,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) micromark-extension-mdx-expression: 3.0.0 micromark-extension-mdx-jsx: 3.0.0 micromark-extension-mdx-md: 2.0.0 @@ -22176,7 +26595,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -22195,9 +26614,14 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@4.0.5: + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + micromatch@4.0.8: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} @@ -22216,10 +26640,18 @@ snapshots: mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} + + mimic-response@1.0.1: {} + mimic-response@3.1.0: {} mimic-response@4.0.0: {} + min-document@2.19.0: + dependencies: + dom-walk: 0.1.2 + min-indent@1.0.1: {} minidenticons@4.2.1: {} @@ -22228,10 +26660,18 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 + minimatch@5.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 @@ -22240,36 +26680,66 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 minimist@1.2.8: {} - minipass@3.3.6: + minipass@2.9.0: dependencies: - yallist: 4.0.0 + safe-buffer: 5.2.1 + yallist: 3.1.1 - minipass@5.0.0: {} + minipass@7.0.4: {} - minipass@7.1.0: {} + minipass@7.1.2: {} - minizlib@2.1.2: + minizlib@1.3.3: dependencies: - minipass: 3.3.6 - yallist: 4.0.0 + minipass: 2.9.0 - mipd@0.0.5(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8): + mipd@0.0.5(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: - viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + mipd@0.0.5(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8): + dependencies: + viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + mipd@0.0.5(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8): + dependencies: + viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8) + optionalDependencies: + typescript: 5.4.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - mkdirp-classic@0.5.3: {} + mipd@0.0.7(typescript@5.4.5): + optionalDependencies: + typescript: 5.4.5 + + mkdirp-promise@5.0.1: + dependencies: + mkdirp: 2.1.6 mkdirp@0.5.6: dependencies: @@ -22279,38 +26749,67 @@ snapshots: mkdirp@2.1.6: {} - mlly@1.7.0: + mlly@1.5.0: dependencies: - acorn: 8.11.3 + acorn: 8.12.0 pathe: 1.1.2 - pkg-types: 1.1.0 - ufo: 1.5.3 - - moralis@2.26.1(debug@4.3.4): - dependencies: - '@moralisweb3/api-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/aptos-api': 2.26.1(debug@4.3.4) - '@moralisweb3/auth': 2.26.1(debug@4.3.4) - '@moralisweb3/common-aptos-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-auth-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-sol-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-streams-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/evm-api': 2.26.1(debug@4.3.4) - '@moralisweb3/sol-api': 2.26.1(debug@4.3.4) - '@moralisweb3/streams': 2.26.1(debug@4.3.4) + pkg-types: 1.0.3 + ufo: 1.4.0 + + mnemonist@0.38.5: + dependencies: + obliterator: 2.0.4 + + mocha@10.7.3: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.3.7(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + + mock-fs@4.14.0: {} + + moralis@2.26.2(debug@4.3.4): + dependencies: + '@moralisweb3/api-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/aptos-api': 2.26.2(debug@4.3.4) + '@moralisweb3/auth': 2.26.2(debug@4.3.4) + '@moralisweb3/common-aptos-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-auth-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-sol-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-streams-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/evm-api': 2.26.2(debug@4.3.4) + '@moralisweb3/sol-api': 2.26.2(debug@4.3.4) + '@moralisweb3/streams': 2.26.2(debug@4.3.4) '@moralisweb3/streams-typings': 1.0.7 transitivePeerDependencies: - debug motion@10.16.2: dependencies: - '@motionone/animation': 10.17.0 - '@motionone/dom': 10.17.0 + '@motionone/animation': 10.16.3 + '@motionone/dom': 10.16.4 '@motionone/svelte': 10.16.4 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 '@motionone/vue': 10.16.4 mri@1.2.0: {} @@ -22325,33 +26824,62 @@ snapshots: muggle-string@0.4.1: {} + multibase@0.6.1: + dependencies: + base-x: 3.0.9 + buffer: 5.7.1 + + multibase@0.7.0: + dependencies: + base-x: 3.0.9 + buffer: 5.7.1 + + multicodec@0.5.7: + dependencies: + varint: 5.0.2 + + multicodec@1.0.4: + dependencies: + buffer: 5.7.1 + varint: 5.0.2 + multiformats@11.0.2: {} multiformats@12.1.3: {} - multiformats@13.1.0: {} + multiformats@13.1.3: {} multiformats@9.9.0: {} + multihashes@0.4.21: + dependencies: + buffer: 5.7.1 + multibase: 0.7.0 + varint: 5.0.2 + murky@https://codeload.github.com/dmfxyz/murky/tar.gz/5feccd1253d7da820f7cccccdedf64471025455d: {} + mute-stream@0.0.8: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 + nano-json-stream-parser@0.1.2: {} + nanoid@3.3.7: {} nanoid@4.0.2: {} - native-fetch@3.0.0(node-fetch@2.7.0(encoding@0.1.13)): + native-fetch@3.0.0(node-fetch@2.7.0): dependencies: - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 - native-fetch@4.0.2(undici@5.28.4): + native-fetch@4.0.2(undici@5.28.3): dependencies: - undici: 5.28.4 + undici: 5.28.3 natural-compare@1.4.0: {} @@ -22359,16 +26887,22 @@ snapshots: neo-async@2.6.2: {} + neotraverse@0.6.18: {} + next-tick@1.1.0: {} - nlcst-to-string@3.1.1: + nlcst-to-string@4.0.0: dependencies: - '@types/nlcst': 1.0.4 + '@types/nlcst': 2.0.3 + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.6.2 + tslib: 2.6.3 nocache@3.0.4: {} @@ -22384,36 +26918,31 @@ snapshots: dependencies: minimatch: 3.1.2 - node-fetch-native@1.6.4: {} + node-fetch-native@1.6.2: {} - node-fetch@2.7.0(encoding@0.1.13): + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 node-forge@1.3.1: {} - node-gyp-build@4.8.1: {} + node-gyp-build@4.8.0: {} node-int64@0.4.0: {} node-releases@2.0.14: {} - node-stream-zip@1.15.0: {} + node-releases@2.0.18: {} - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 + node-stream-zip@1.15.0: {} normalize-path@3.0.0: {} normalize-range@0.1.2: {} - normalize-url@8.0.1: {} + normalize-url@6.1.0: {} + + normalize-url@8.0.0: {} not@0.1.0: {} @@ -22434,7 +26963,7 @@ snapshots: dependencies: path-key: 3.1.1 - npm-run-path@5.3.0: + npm-run-path@5.2.0: dependencies: path-key: 4.0.0 @@ -22449,17 +26978,11 @@ snapshots: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 - nwsapi@2.2.9: {} + nwsapi@2.2.7: {} - nypm@0.3.8: - dependencies: - citty: 0.1.6 - consola: 3.2.3 - execa: 8.0.1 - pathe: 1.1.2 - ufo: 1.5.3 + oauth-sign@0.9.0: {} - ob1@0.80.9: {} + ob1@0.80.6: {} obj-multiplex@1.0.0: dependencies: @@ -22471,12 +26994,7 @@ snapshots: object-hash@3.0.0: {} - object-inspect@1.13.1: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 + object-inspect@1.13.2: {} object-keys@1.1.1: {} @@ -22487,30 +27005,36 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 - object.fromentries@2.0.8: + object.fromentries@2.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 - object.groupby@1.0.3: + object.groupby@1.0.1: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.3 + get-intrinsic: 1.2.4 - object.values@1.2.0: + object.values@1.1.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 + + obliterator@2.0.4: {} + + oboe@2.1.5: + dependencies: + http-https: 1.0.0 - ofetch@1.3.4: + ofetch@1.3.3: dependencies: destr: 2.0.3 - node-fetch-native: 1.6.4 - ufo: 1.5.3 + node-fetch-native: 1.6.2 + ufo: 1.4.0 ohash@1.1.3: {} @@ -22538,6 +27062,14 @@ snapshots: dependencies: mimic-fn: 4.0.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + oniguruma-to-js@0.4.3: + dependencies: + regex: 4.3.2 + open@6.4.0: dependencies: is-wsl: 1.1.0 @@ -22553,16 +27085,27 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + open@9.1.0: + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + openapi-types@12.1.3: {} - optionator@0.9.4: + optimism@https://codeload.github.com/ethereum-optimism/optimism/tar.gz/ab3a54febb36398539fd3b849c222b7e70169dc8: + dependencies: + '@changesets/cli': 2.27.8 + + optionator@0.9.3: dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.5 ora@5.4.1: dependencies: @@ -22588,20 +27131,24 @@ snapshots: strip-ansi: 7.1.0 wcwidth: 1.0.1 - ora@8.0.1: + ora@8.1.0: dependencies: chalk: 5.3.0 - cli-cursor: 4.0.0 + cli-cursor: 5.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 is-unicode-supported: 2.0.0 log-symbols: 6.0.0 stdin-discarder: 0.2.2 - string-width: 7.1.0 + string-width: 7.2.0 strip-ansi: 7.1.0 os-tmpdir@1.0.2: {} + outdent@0.5.0: {} + + p-cancelable@2.1.1: {} + p-cancelable@3.0.0: {} p-defer@3.0.0: {} @@ -22613,6 +27160,14 @@ snapshots: fast-fifo: 1.3.2 p-defer: 3.0.0 + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@1.3.0: + dependencies: + p-try: 1.0.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -22623,11 +27178,19 @@ snapshots: p-limit@4.0.0: dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 p-limit@5.0.0: dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 + + p-limit@6.1.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 p-locate@3.0.0: dependencies: @@ -22645,6 +27208,8 @@ snapshots: dependencies: p-limit: 4.0.0 + p-map@2.1.0: {} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 @@ -22658,10 +27223,14 @@ snapshots: p-timeout@6.1.2: {} + p-try@1.0.0: {} + p-try@2.2.0: {} p256-verifier#v0.1.0@https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da: {} + package-json-from-dist@1.0.0: {} + package-json@8.1.1: dependencies: got: 12.6.1 @@ -22669,6 +27238,8 @@ snapshots: registry-url: 6.0.1 semver: 7.6.2 + package-manager-detector@0.2.0: {} + pagefind@1.1.0: optionalDependencies: '@pagefind/darwin-arm64': 1.1.0 @@ -22677,12 +27248,7 @@ snapshots: '@pagefind/linux-x64': 1.1.0 '@pagefind/windows-x64': 1.1.0 - pako@0.2.9: {} - - param-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 + pako@1.0.11: {} parent-module@1.0.1: dependencies: @@ -22701,6 +27267,8 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-headers@2.0.5: {} + parse-json@4.0.0: dependencies: error-ex: 1.3.2 @@ -22708,16 +27276,28 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-latin@5.0.1: + parse-latin@7.0.0: dependencies: - nlcst-to-string: 3.1.1 - unist-util-modify-children: 3.1.1 - unist-util-visit-children: 2.0.2 + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.2 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.2 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.1 parse5@7.1.2: dependencies: @@ -22728,14 +27308,9 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.6.2 - - path-browserify@1.0.1: {} - - path-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.6.3 + + path-browserify@1.0.1: {} path-exists@3.0.0: {} @@ -22751,23 +27326,28 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.10.2: + path-scurry@1.10.1: + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + + path-scurry@2.0.0: dependencies: - lru-cache: 10.2.2 - minipass: 7.1.0 + lru-cache: 11.0.1 + minipass: 7.1.2 - path-to-regexp@0.1.7: {} + path-to-regexp@0.1.10: {} path-to-regexp@6.2.2: {} path-type@4.0.0: {} - path-type@5.0.0: {} - pathe@1.1.2: {} pathval@1.1.1: {} + pathval@2.0.0: {} + pbkdf2@3.1.2: dependencies: create-hash: 1.2.0 @@ -22776,11 +27356,7 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - peek-stream@1.1.3: - dependencies: - buffer-from: 1.1.2 - duplexify: 3.7.1 - through2: 2.0.5 + performance-now@2.1.0: {} periscopic@3.1.0: dependencies: @@ -22788,10 +27364,14 @@ snapshots: estree-walker: 3.0.3 is-reference: 3.0.2 - picocolors@1.0.0: {} + picocolors@1.0.1: {} + + picocolors@1.1.0: {} picomatch@2.3.1: {} + picomatch@3.0.1: {} + pify@2.3.0: {} pify@3.0.0: {} @@ -22802,7 +27382,7 @@ snapshots: pino-abstract-transport@0.5.0: dependencies: - duplexify: 4.1.3 + duplexify: 4.1.2 split2: 4.2.0 pino-std-serializers@4.0.0: {} @@ -22810,7 +27390,7 @@ snapshots: pino@7.11.0: dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.5.0 + fast-redact: 3.3.0 on-exit-leak-free: 0.2.0 pino-abstract-transport: 0.5.0 pino-std-serializers: 4.0.0 @@ -22831,21 +27411,17 @@ snapshots: dependencies: find-up: 4.1.0 - pkg-dir@5.0.0: - dependencies: - find-up: 5.0.0 - - pkg-types@1.1.0: + pkg-types@1.0.3: dependencies: - confbox: 0.1.7 - mlly: 1.7.0 + jsonc-parser: 3.2.0 + mlly: 1.5.0 pathe: 1.1.2 - playwright-core@1.44.0: {} + playwright-core@1.43.1: {} - playwright@1.44.0: + playwright@1.43.1: dependencies: - playwright-core: 1.44.0 + playwright-core: 1.43.1 optionalDependencies: fsevents: 2.3.2 @@ -22855,71 +27431,105 @@ snapshots: polished@4.3.1: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 - pony-cause@2.1.11: {} + pony-cause@2.1.10: {} - possible-typed-array-names@1.0.0: {} - - postcss-import@15.1.0(postcss@8.4.38): + postcss-import@15.1.0(postcss@8.4.39): dependencies: - postcss: 8.4.38 + postcss: 8.4.39 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-import@16.1.0(postcss@8.4.38): + postcss-import@16.1.0(postcss@8.4.39): dependencies: - postcss: 8.4.38 + postcss: 8.4.39 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.38): + postcss-js@4.0.1(postcss@8.4.39): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.39 + + postcss-js@4.0.1(postcss@8.4.47): dependencies: camelcase-css: 2.0.1 + postcss: 8.4.47 + + postcss-load-config@3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)): + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.39 + yaml: 1.10.2 + optionalDependencies: postcss: 8.4.38 + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.3) - postcss-load-config@3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)): + postcss-load-config@3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.4.38 - ts-node: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.5) - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)): dependencies: lilconfig: 3.1.1 - yaml: 2.4.2 + yaml: 2.3.4 optionalDependencies: postcss: 8.4.38 - ts-node: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.3) - postcss-nested@5.0.6(postcss@8.4.38): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)): dependencies: + lilconfig: 3.1.1 + yaml: 2.3.4 + optionalDependencies: postcss: 8.4.38 - postcss-selector-parser: 6.0.16 + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.5) - postcss-nested@6.0.1(postcss@8.4.38): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)): dependencies: - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 + lilconfig: 3.1.1 + yaml: 2.3.4 + optionalDependencies: + postcss: 8.4.47 + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.5) + optional: true - postcss-nesting@12.1.2(postcss@8.4.38): + postcss-nested@5.0.6(postcss@8.4.39): dependencies: - '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.0.16) - '@csstools/selector-specificity': 3.0.3(postcss-selector-parser@6.0.16) - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 + postcss: 8.4.39 + postcss-selector-parser: 6.1.0 - postcss-safe-parser@6.0.0(postcss@8.4.38): + postcss-nested@6.0.1(postcss@8.4.39): dependencies: - postcss: 8.4.38 + postcss: 8.4.39 + postcss-selector-parser: 6.1.0 - postcss-scss@4.0.9(postcss@8.4.38): + postcss-nesting@12.1.0(postcss@8.4.38): dependencies: + '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.0.15) + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.38 + postcss-selector-parser: 6.0.15 + + postcss-safe-parser@6.0.0(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + postcss-scss@4.0.9(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + postcss-selector-parser@6.0.15: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 postcss-selector-parser@6.0.16: dependencies: @@ -22928,20 +27538,25 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.38: + postcss@8.4.39: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 - preact@10.21.0: {} + postcss@8.4.47: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.1 + + preact@10.19.5: {} - preferred-pm@3.1.3: + preferred-pm@4.0.0: dependencies: - find-up: 5.0.0 + find-up-simple: 1.0.0 find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 + which-pm: 3.0.0 prelude-ls@1.2.1: {} @@ -22949,14 +27564,21 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-svelte@3.2.3(prettier@3.2.5)(svelte@4.2.16): + prettier-plugin-svelte@3.2.2(prettier@3.2.5)(svelte@4.2.13): dependencies: prettier: 3.2.5 - svelte: 4.2.16 + svelte: 4.2.13 - prettier@2.8.8: + prettier-plugin-svelte@3.2.3(prettier@3.2.5)(svelte@4.2.17): + dependencies: + prettier: 3.2.5 + svelte: 4.2.17 + + prettier@2.8.7: optional: true + prettier@2.8.8: {} + prettier@3.2.5: {} pretty-format@26.6.2: @@ -22976,12 +27598,12 @@ snapshots: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.3.1 - - pretty-hrtime@1.0.3: {} + react-is: 18.2.0 prismjs@1.29.0: {} + process-nextick-args@1.0.7: {} + process-nextick-args@2.0.1: {} process-warning@1.0.0: {} @@ -22996,16 +27618,30 @@ snapshots: dependencies: asap: 2.0.6 + prompt@1.3.0: + dependencies: + '@colors/colors': 1.5.0 + async: 3.2.3 + read: 1.0.7 + revalidator: 0.1.8 + winston: 2.4.7 + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + property-information@6.5.0: {} proto-list@1.2.4: {} - protobufjs@7.2.6: + protobufjs@7.3.2: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -23017,7 +27653,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.12.11 + '@types/node': 20.12.7 long: 5.2.3 proxy-addr@2.0.7: @@ -23029,29 +27665,22 @@ snapshots: proxy-from-env@1.1.0: {} + pseudomap@1.0.2: {} + psl@1.9.0: {} publint@0.1.16: dependencies: npm-packlist: 5.1.3 - picocolors: 1.0.0 + picocolors: 1.0.1 sade: 1.8.1 - pump@2.0.1: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - pumpify@1.5.1: - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 + punycode@2.1.0: {} punycode@2.3.1: {} @@ -23070,13 +27699,17 @@ snapshots: pngjs: 5.0.0 yargs: 15.4.1 - qs@6.11.0: + qs@6.13.0: dependencies: side-channel: 1.0.6 - qs@6.12.1: + qs@6.5.3: {} + + query-string@5.1.1: dependencies: - side-channel: 1.0.6 + decode-uri-component: 0.2.2 + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 query-string@7.1.3: dependencies: @@ -23085,8 +27718,6 @@ snapshots: split-on-first: 1.1.0 strict-uri-encode: 2.0.0 - querystring@0.2.1: {} - querystringify@2.2.0: {} queue-microtask@1.2.3: {} @@ -23099,9 +27730,7 @@ snapshots: quick-lru@5.1.1: {} - radix3@1.1.2: {} - - ramda@0.29.0: {} + radix3@1.1.0: {} randombytes@2.1.0: dependencies: @@ -23123,97 +27752,98 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-colorful@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-colorful@5.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - react-confetti@6.1.0(react@18.3.1): + react-confetti@6.1.0(react@18.2.0): dependencies: - react: 18.3.1 + react: 18.2.0 tween-functions: 1.2.0 - react-devtools-core@5.2.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + react-devtools-core@4.28.5(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: shell-quote: 1.8.1 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - react-dom@18.3.1(react@18.3.1): + react-dom@18.2.0(react@18.2.0): dependencies: loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + react: 18.2.0 + scheduler: 0.23.0 - react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1): + react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 html-parse-stringify: 3.0.1 i18next: 22.5.1 - react: 18.3.1 + react: 18.2.0 optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + react-dom: 18.2.0(react@18.2.0) + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + + react-is@16.13.1: {} react-is@17.0.2: {} - react-is@18.3.1: {} + react-is@18.2.0: {} react-native-fetch-api@3.0.0: dependencies: p-defer: 3.0.0 - react-native-webview@11.26.1(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1): + react-native-webview@11.26.1(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0): dependencies: escape-string-regexp: 2.0.0 invariant: 2.2.4 - react: 18.3.1 - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + react: 18.2.0 + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) - react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3): + react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10): dependencies: '@jest/create-cache-key-function': 29.7.0 - '@react-native-community/cli': 13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@react-native-community/cli-platform-android': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-platform-ios': 13.6.6(encoding@0.1.13) - '@react-native/assets-registry': 0.74.83 - '@react-native/codegen': 0.74.83(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - '@react-native/community-cli-plugin': 0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@react-native/gradle-plugin': 0.74.83 - '@react-native/js-polyfills': 0.74.83 - '@react-native/normalize-colors': 0.74.83 - '@react-native/virtualized-lists': 0.74.83(@types/react@18.3.2)(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + '@react-native-community/cli': 12.3.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@react-native-community/cli-platform-android': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-platform-ios': 12.3.2(encoding@0.1.13) + '@react-native/assets-registry': 0.73.1 + '@react-native/codegen': 0.73.3(@babel/preset-env@7.23.9(@babel/core@7.25.2)) + '@react-native/community-cli-plugin': 0.73.16(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@react-native/gradle-plugin': 0.73.4 + '@react-native/js-polyfills': 0.73.1 + '@react-native/normalize-colors': 0.73.2 + '@react-native/virtualized-lists': 0.73.4(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 base64-js: 1.5.1 chalk: 4.1.2 + deprecated-react-native-prop-types: 5.0.0 event-target-shim: 5.0.1 flow-enums-runtime: 0.0.6 invariant: 2.2.4 jest-environment-node: 29.7.0 jsc-android: 250231.0.0 memoize-one: 5.2.1 - metro-runtime: 0.80.9 - metro-source-map: 0.80.9 + metro-runtime: 0.80.6 + metro-source-map: 0.80.6 mkdirp: 0.5.6 nullthrows: 1.1.1 pretty-format: 26.6.2 promise: 8.3.0 - react: 18.3.1 - react-devtools-core: 5.2.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - react-refresh: 0.14.2 - react-shallow-renderer: 16.15.0(react@18.3.1) + react: 18.2.0 + react-devtools-core: 4.28.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) + react-refresh: 0.14.0 + react-shallow-renderer: 16.15.0(react@18.2.0) regenerator-runtime: 0.13.11 scheduler: 0.24.0-canary-efb381bbf-20230505 stacktrace-parser: 0.1.10 whatwg-fetch: 3.6.20 - ws: 6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 6.2.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) yargs: 17.7.2 - optionalDependencies: - '@types/react': 18.3.2 transitivePeerDependencies: - '@babel/core' - '@babel/preset-env' @@ -23222,43 +27852,15 @@ snapshots: - supports-color - utf-8-validate - react-refresh@0.14.2: {} - - react-remove-scroll-bar@2.3.6(@types/react@18.3.2)(react@18.3.1): - dependencies: - react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.2)(react@18.3.1) - tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.3.2 - - react-remove-scroll@2.5.5(@types/react@18.3.2)(react@18.3.1): - dependencies: - react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.2)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.2)(react@18.3.1) - tslib: 2.6.2 - use-callback-ref: 1.3.2(@types/react@18.3.2)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.2)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 + react-refresh@0.14.0: {} - react-shallow-renderer@16.15.0(react@18.3.1): + react-shallow-renderer@16.15.0(react@18.2.0): dependencies: object-assign: 4.1.1 - react: 18.3.1 - react-is: 18.3.1 - - react-style-singleton@2.2.1(@types/react@18.3.2)(react@18.3.1): - dependencies: - get-nonce: 1.0.1 - invariant: 2.2.4 - react: 18.3.1 - tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.3.2 + react: 18.2.0 + react-is: 18.2.0 - react@18.3.1: + react@18.2.0: dependencies: loose-envify: 1.4.0 @@ -23266,18 +27868,26 @@ snapshots: dependencies: pify: 2.3.0 - read-pkg-up@7.0.1: + read-yaml-file@1.1.0: dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 - read-pkg@5.2.0: + read@1.0.7: dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 + mute-stream: 0.0.8 + + readable-stream@2.3.3: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 1.0.7 + safe-buffer: 5.1.2 + string_decoder: 1.0.3 + util-deprecate: 1.0.2 readable-stream@2.3.8: dependencies: @@ -23299,6 +27909,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.0.1: {} + readline@1.3.0: {} real-require@0.1.0: {} @@ -23308,15 +27920,15 @@ snapshots: ast-types: 0.15.2 esprima: 4.0.1 source-map: 0.6.1 - tslib: 2.6.2 + tslib: 2.6.3 - recast@0.23.7: + recast@0.23.9: dependencies: ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 - tslib: 2.6.2 + tslib: 2.6.3 receptacle@1.3.2: dependencies: @@ -23327,6 +27939,12 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 + redis-errors@1.2.0: {} + + redis-parser@3.0.0: + dependencies: + redis-errors: 1.2.0 + regenerate-unicode-properties@10.1.1: dependencies: regenerate: 1.4.2 @@ -23339,14 +27957,15 @@ snapshots: regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 + + regex@4.3.2: {} - regexp.prototype.flags@1.5.2: + regexp.prototype.flags@1.5.1: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 + set-function-name: 2.0.1 regexpp@3.2.0: {} @@ -23371,9 +27990,9 @@ snapshots: dependencies: jsesc: 0.5.0 - rehype-expressive-code@0.35.3: + rehype-expressive-code@0.35.6: dependencies: - expressive-code: 0.35.3 + expressive-code: 0.35.6 rehype-external-links@3.0.0: dependencies: @@ -23384,17 +28003,36 @@ snapshots: space-separated-tokens: 2.0.2 unist-util-visit: 5.0.0 + rehype-format@5.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.0 + rehype-minify-whitespace: 6.0.0 + unist-util-visit-parents: 6.0.1 + + rehype-minify-whitespace@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.0 + rehype-parse@9.0.0: dependencies: '@types/hast': 3.0.4 hast-util-from-html: 2.0.1 - unified: 11.0.4 + unified: 11.0.5 rehype-raw@7.0.0: dependencies: '@types/hast': 3.0.4 hast-util-raw: 9.0.3 - vfile: 6.0.1 + vfile: 6.0.3 rehype-slug@6.0.0: dependencies: @@ -23408,21 +28046,21 @@ snapshots: dependencies: '@types/hast': 3.0.4 hast-util-to-html: 9.0.1 - unified: 11.0.4 + unified: 11.0.5 rehype@13.0.1: dependencies: '@types/hast': 3.0.4 rehype-parse: 9.0.0 rehype-stringify: 10.0.0 - unified: 11.0.4 + unified: 11.0.5 remark-directive@3.0.0: dependencies: '@types/mdast': 4.0.4 mdast-util-directive: 3.0.0 micromark-extension-directive: 3.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -23433,7 +28071,7 @@ snapshots: micromark-extension-gfm: 3.0.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -23447,9 +28085,9 @@ snapshots: remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 micromark-util-types: 2.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -23458,23 +28096,56 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 mdast-util-to-hast: 13.1.0 - unified: 11.0.4 - vfile: 6.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.1.1 + unified: 11.0.5 + unist-util-visit: 5.0.0 - remark-smartypants@2.1.0: + remark-smartypants@3.0.1: dependencies: - retext: 8.1.0 - retext-smartypants: 5.2.0 + retext: 9.0.0 + retext-smartypants: 6.1.0 + unified: 11.0.5 unist-util-visit: 5.0.0 remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 + unified: 11.0.5 + + request-light@0.5.8: {} request-light@0.7.0: {} + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -23495,12 +28166,20 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve@1.17.0: + dependencies: + path-parse: 1.0.7 + resolve@1.22.8: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.14.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + responselike@3.0.0: dependencies: lowercase-keys: 3.0.0 @@ -23515,37 +28194,51 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - retext-latin@3.1.0: + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + retext-latin@4.0.0: dependencies: - '@types/nlcst': 1.0.4 - parse-latin: 5.0.1 - unherit: 3.0.1 - unified: 10.1.2 + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 - retext-smartypants@5.2.0: + retext-smartypants@6.1.1: dependencies: - '@types/nlcst': 1.0.4 - nlcst-to-string: 3.1.1 - unified: 10.1.2 - unist-util-visit: 4.1.2 + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 - retext-stringify@3.1.0: + retext@9.0.0: dependencies: - '@types/nlcst': 1.0.4 - nlcst-to-string: 3.1.1 - unified: 10.1.2 + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 - retext@8.1.0: + retext@9.0.0: dependencies: - '@types/nlcst': 1.0.4 - retext-latin: 3.1.0 - retext-stringify: 3.1.0 - unified: 10.1.2 + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 retimer@3.0.0: {} + retry@0.13.1: {} + reusify@1.0.4: {} + revalidator@0.1.8: {} + rimraf@2.6.3: dependencies: glob: 7.2.3 @@ -23558,52 +28251,103 @@ snapshots: dependencies: glob: 7.2.3 + rimraf@5.0.10: + dependencies: + glob: 10.3.10 + ripemd160@2.0.2: dependencies: hash-base: 3.1.0 inherits: 2.0.4 + risc0-ethereum#v1.1.2@https://codeload.github.com/risc0/risc0-ethereum/tar.gz/b8a14213d92fff07dacda993804e7edb7946ca58: {} + rlp@2.2.7: dependencies: bn.js: 5.2.1 - rollup-plugin-visualizer@5.12.0(rollup@4.17.2): + rollup-plugin-visualizer@5.12.0(rollup@4.21.3): dependencies: open: 8.4.2 picomatch: 2.3.1 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: - rollup: 4.17.2 + rollup: 4.21.3 rollup@3.29.4: optionalDependencies: fsevents: 2.3.3 + rollup@4.12.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.12.0 + '@rollup/rollup-android-arm64': 4.12.0 + '@rollup/rollup-darwin-arm64': 4.12.0 + '@rollup/rollup-darwin-x64': 4.12.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 + '@rollup/rollup-linux-arm64-gnu': 4.12.0 + '@rollup/rollup-linux-arm64-musl': 4.12.0 + '@rollup/rollup-linux-riscv64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-musl': 4.12.0 + '@rollup/rollup-win32-arm64-msvc': 4.12.0 + '@rollup/rollup-win32-ia32-msvc': 4.12.0 + '@rollup/rollup-win32-x64-msvc': 4.12.0 + fsevents: 2.3.3 + rollup@4.17.2: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.17.2 - '@rollup/rollup-android-arm64': 4.17.2 - '@rollup/rollup-darwin-arm64': 4.17.2 - '@rollup/rollup-darwin-x64': 4.17.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 - '@rollup/rollup-linux-arm-musleabihf': 4.17.2 - '@rollup/rollup-linux-arm64-gnu': 4.17.2 - '@rollup/rollup-linux-arm64-musl': 4.17.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 - '@rollup/rollup-linux-riscv64-gnu': 4.17.2 - '@rollup/rollup-linux-s390x-gnu': 4.17.2 - '@rollup/rollup-linux-x64-gnu': 4.17.2 - '@rollup/rollup-linux-x64-musl': 4.17.2 - '@rollup/rollup-win32-arm64-msvc': 4.17.2 - '@rollup/rollup-win32-ia32-msvc': 4.17.2 - '@rollup/rollup-win32-x64-msvc': 4.17.2 + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 + fsevents: 2.3.3 + + rollup@4.21.3: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.21.3 + '@rollup/rollup-android-arm64': 4.21.3 + '@rollup/rollup-darwin-arm64': 4.21.3 + '@rollup/rollup-darwin-x64': 4.21.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.3 + '@rollup/rollup-linux-arm-musleabihf': 4.21.3 + '@rollup/rollup-linux-arm64-gnu': 4.21.3 + '@rollup/rollup-linux-arm64-musl': 4.21.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3 + '@rollup/rollup-linux-riscv64-gnu': 4.21.3 + '@rollup/rollup-linux-s390x-gnu': 4.21.3 + '@rollup/rollup-linux-x64-gnu': 4.21.3 + '@rollup/rollup-linux-x64-musl': 4.21.3 + '@rollup/rollup-win32-arm64-msvc': 4.21.3 + '@rollup/rollup-win32-ia32-msvc': 4.21.3 + '@rollup/rollup-win32-x64-msvc': 4.21.3 fsevents: 2.3.3 rrweb-cssom@0.6.0: {} + run-applescript@5.0.0: + dependencies: + execa: 5.1.1 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -23612,7 +28356,7 @@ snapshots: dependencies: mri: 1.2.0 - safe-array-concat@1.1.2: + safe-array-concat@1.0.1: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 @@ -23623,10 +28367,10 @@ snapshots: safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: + safe-regex-test@1.0.0: dependencies: call-bind: 1.0.7 - es-errors: 1.3.0 + get-intrinsic: 1.2.4 is-regex: 1.1.4 safe-stable-stringify@2.4.3: {} @@ -23640,13 +28384,13 @@ snapshots: mkdirp: 0.5.6 rimraf: 2.7.1 - sax@1.3.0: {} + sax@1.4.1: {} saxes@6.0.0: dependencies: xmlchars: 2.2.0 - scheduler@0.23.2: + scheduler@0.23.0: dependencies: loose-envify: 1.4.0 @@ -23658,35 +28402,34 @@ snapshots: secp256k1@4.0.3: dependencies: - elliptic: 6.5.5 + elliptic: 6.5.7 node-addon-api: 2.0.2 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.0 secp256k1@5.0.0: dependencies: - elliptic: 6.5.5 + elliptic: 6.5.4 node-addon-api: 5.1.0 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.0 section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - selfsigned@2.4.1: - dependencies: - '@types/node-forge': 1.3.11 - node-forge: 1.3.1 - semver@5.7.2: {} semver@6.3.1: {} - semver@7.6.1: {} + semver@7.6.0: + dependencies: + lru-cache: 6.0.0 semver@7.6.2: {} - send@0.18.0: + semver@7.6.3: {} + + send@0.19.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -23704,20 +28447,37 @@ snapshots: transitivePeerDependencies: - supports-color - sentence-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - upper-case-first: 2.0.2 - serialize-error@2.1.0: {} - serve-static@1.15.0: + serialize-javascript@6.0.2: dependencies: - encodeurl: 1.0.2 + randombytes: 2.1.0 + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + serverless@4.4.3: + dependencies: + axios: 1.7.7 + axios-proxy-builder: 0.1.2 + rimraf: 5.0.10 + xml2js: 0.6.2 + transitivePeerDependencies: + - debug + + servify@0.1.12: + dependencies: + body-parser: 1.20.3 + cors: 2.8.5 + express: 4.21.0 + request: 2.88.2 + xhr: 2.6.0 transitivePeerDependencies: - supports-color @@ -23725,7 +28485,7 @@ snapshots: set-cookie-parser@2.6.0: {} - set-function-length@1.2.2: + set-function-length@1.2.1: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -23734,10 +28494,9 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.2 - set-function-name@2.0.2: + set-function-name@2.0.1: dependencies: define-data-property: 1.1.4 - es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 @@ -23754,14 +28513,14 @@ snapshots: dependencies: kind-of: 6.0.3 - sharp@0.33.3: + sharp@0.33.4: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.6.1 + semver: 7.6.0 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.3 - '@img/sharp-darwin-x64': 0.33.3 + '@img/sharp-darwin-arm64': 0.33.4 + '@img/sharp-darwin-x64': 0.33.4 '@img/sharp-libvips-darwin-arm64': 1.0.2 '@img/sharp-libvips-darwin-x64': 1.0.2 '@img/sharp-libvips-linux-arm': 1.0.2 @@ -23770,34 +28529,55 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.0.2 '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 '@img/sharp-libvips-linuxmusl-x64': 1.0.2 - '@img/sharp-linux-arm': 0.33.3 - '@img/sharp-linux-arm64': 0.33.3 - '@img/sharp-linux-s390x': 0.33.3 - '@img/sharp-linux-x64': 0.33.3 - '@img/sharp-linuxmusl-arm64': 0.33.3 - '@img/sharp-linuxmusl-x64': 0.33.3 - '@img/sharp-wasm32': 0.33.3 - '@img/sharp-win32-ia32': 0.33.3 - '@img/sharp-win32-x64': 0.33.3 + '@img/sharp-linux-arm': 0.33.4 + '@img/sharp-linux-arm64': 0.33.4 + '@img/sharp-linux-s390x': 0.33.4 + '@img/sharp-linux-x64': 0.33.4 + '@img/sharp-linuxmusl-arm64': 0.33.4 + '@img/sharp-linuxmusl-x64': 0.33.4 + '@img/sharp-wasm32': 0.33.4 + '@img/sharp-win32-ia32': 0.33.4 + '@img/sharp-win32-x64': 0.33.4 + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 + shebang-regex@1.0.0: {} + shebang-regex@3.0.0: {} shell-quote@1.8.1: {} - shiki@1.5.1: + shiki@1.17.6: dependencies: - '@shikijs/core': 1.5.1 + '@shikijs/core': 1.17.6 + '@shikijs/engine-javascript': 1.17.6 + '@shikijs/engine-oniguruma': 1.17.6 + '@shikijs/types': 1.17.6 + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 + + shiki@1.5.2: + dependencies: + '@shikijs/core': 1.5.2 + + side-channel@1.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + object-inspect: 1.13.2 siginfo@2.0.0: {} @@ -23805,31 +28585,37 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@2.8.2: + dependencies: + decompress-response: 3.3.0 + once: 1.4.0 + simple-concat: 1.0.1 + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 sirv@2.0.4: dependencies: - '@polka/url': 1.0.0-next.25 + '@polka/url': 1.0.0-next.24 mrmime: 2.0.0 totalist: 3.0.1 sisteransi@1.0.5: {} - sitemap@7.1.1: + sitemap@7.1.2: dependencies: '@types/node': 17.0.45 '@types/sax': 1.2.7 arg: 5.0.2 - sax: 1.3.0 + sax: 1.4.1 slash@3.0.0: {} slash@4.0.0: {} - slash@5.1.0: {} - slice-ansi@2.1.0: dependencies: ansi-styles: 3.2.1 @@ -23847,10 +28633,21 @@ snapshots: dot-case: 3.0.4 tslib: 2.6.2 - socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3): + socket.io-client@4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4 + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.7(supports-color@8.1.1) + engine.io-client: 6.5.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-client@4.7.4(bufferutil@4.0.8)(utf-8-validate@6.0.3): + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.7(supports-color@8.1.1) engine.io-client: 6.5.3(bufferutil@4.0.8)(utf-8-validate@6.0.3) socket.io-parser: 4.2.4 transitivePeerDependencies: @@ -23860,34 +28657,73 @@ snapshots: socket.io-parser@4.2.4: dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4 + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color + solady@https://codeload.github.com/Vectorized/solady/tar.gz/a12a2575c899a328c1bafdada632dabbff27cf6b: {} + solady@https://codeload.github.com/Vectorized/solady/tar.gz/de0f336d2033d04e0f77c923d639c7fbffd48b6d: {} solc@0.8.24: dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.6(debug@4.3.4) + follow-redirects: 1.15.5(debug@4.3.4) + js-sha3: 0.8.0 + memorystream: 0.3.1 + semver: 5.7.2 + tmp: 0.0.33 + transitivePeerDependencies: + - debug + + solc@0.8.26(debug@4.3.7): + dependencies: + command-exists: 1.2.9 + commander: 8.3.0 + follow-redirects: 1.15.9(debug@4.3.7) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 tmp: 0.0.33 transitivePeerDependencies: - - debug + - debug + + solhint@4.5.4(typescript@5.4.3): + dependencies: + '@solidity-parser/parser': 0.18.0 + ajv: 6.12.6 + antlr4: 4.13.1 + ast-parents: 0.0.1 + chalk: 4.1.2 + commander: 10.0.1 + cosmiconfig: 8.3.6(typescript@5.4.3) + fast-diff: 1.3.0 + glob: 8.1.0 + ignore: 5.3.1 + js-yaml: 4.1.0 + latest-version: 7.0.0 + lodash: 4.17.21 + pluralize: 8.0.0 + semver: 7.6.0 + strip-ansi: 6.0.1 + table: 6.8.1 + text-table: 0.2.0 + optionalDependencies: + prettier: 2.8.8 + transitivePeerDependencies: + - typescript solhint@4.5.4(typescript@5.4.5): dependencies: '@solidity-parser/parser': 0.18.0 ajv: 6.12.6 - antlr4: 4.13.1-patch-1 + antlr4: 4.13.1 ast-parents: 0.0.1 chalk: 4.1.2 commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.4.5) + cosmiconfig: 8.3.6(typescript@5.5.3) fast-diff: 1.3.0 glob: 8.1.0 ignore: 5.3.1 @@ -23895,24 +28731,24 @@ snapshots: latest-version: 7.0.0 lodash: 4.17.21 pluralize: 8.0.0 - semver: 7.6.2 + semver: 7.6.0 strip-ansi: 6.0.1 - table: 6.8.2 + table: 6.8.1 text-table: 0.2.0 optionalDependencies: prettier: 2.8.8 transitivePeerDependencies: - typescript - solhint@5.0.1(typescript@5.4.5): + solhint@5.0.3(typescript@5.4.3): dependencies: '@solidity-parser/parser': 0.18.0 ajv: 6.12.6 - antlr4: 4.13.1-patch-1 + antlr4: 4.13.1 ast-parents: 0.0.1 chalk: 4.1.2 commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.4.5) + cosmiconfig: 8.3.6(typescript@5.4.3) fast-diff: 1.3.0 glob: 8.1.0 ignore: 5.3.1 @@ -23922,28 +28758,38 @@ snapshots: pluralize: 8.0.0 semver: 7.6.2 strip-ansi: 6.0.1 - table: 6.8.2 + table: 6.8.1 text-table: 0.2.0 optionalDependencies: prettier: 2.8.8 transitivePeerDependencies: - typescript + solidity-ast@0.4.59: {} + + solidity-docgen@0.6.0-beta.36(hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10)): + dependencies: + handlebars: 4.7.8 + hardhat: 2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10) + solidity-ast: 0.4.59 + solidity-stringutils@https://codeload.github.com/Arachnid/solidity-stringutils/tar.gz/4b2fcc43fa0426e19ce88b1f1ec16f5903a2e461: {} sonic-boom@2.8.0: dependencies: atomic-sleep: 1.0.0 - sorcery@0.11.0: + sorcery@0.11.1: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - buffer-crc32: 0.2.13 + buffer-crc32: 1.0.0 minimist: 1.2.8 sander: 0.5.1 source-map-js@1.2.0: {} + source-map-js@1.2.1: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -23955,21 +28801,14 @@ snapshots: source-map@0.7.4: {} - space-separated-tokens@2.0.2: {} - - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 + sp1-contracts#v3.0.0@https://codeload.github.com/succinctlabs/sp1-contracts/tar.gz/1c4acaeab86789995ae5c6baced66f81e4a57f4d: {} - spdx-exceptions@2.5.0: {} + space-separated-tokens@2.0.2: {} - spdx-expression-parse@3.0.1: + spawndamnit@2.0.0: dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - - spdx-license-ids@3.0.17: {} + cross-spawn: 5.1.0 + signal-exit: 3.0.7 split-on-first@1.1.0: {} @@ -23977,6 +28816,20 @@ snapshots: sprintf-js@1.0.3: {} + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + stack-trace@0.0.10: {} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 @@ -23989,10 +28842,12 @@ snapshots: dependencies: type-fest: 0.7.1 - starlight-links-validator@0.8.0(@astrojs/starlight@0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)))(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)): + standard-as-callback@2.1.0: {} + + starlight-links-validator@0.8.0(@astrojs/starlight@0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)))(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)): dependencies: - '@astrojs/starlight': 0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) - astro: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) + '@astrojs/starlight': 0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) + astro: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) github-slugger: 2.0.0 hast-util-from-html: 2.0.1 hast-util-has-property: 3.0.0 @@ -24001,12 +28856,12 @@ snapshots: mdast-util-to-string: 4.0.0 unist-util-visit: 5.0.0 - starlight-openapi@0.6.3(@astrojs/markdown-remark@5.1.0)(@astrojs/starlight@0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)))(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5))(openapi-types@12.1.3): + starlight-openapi@0.6.3(@astrojs/markdown-remark@5.2.0)(@astrojs/starlight@0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)))(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5))(openapi-types@12.1.3): dependencies: - '@astrojs/markdown-remark': 5.1.0 - '@astrojs/starlight': 0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) + '@astrojs/markdown-remark': 5.2.0 + '@astrojs/starlight': 0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) '@readme/openapi-parser': 2.5.0(openapi-types@12.1.3) - astro: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) + astro: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) github-slugger: 2.0.0 transitivePeerDependencies: - openapi-types @@ -24023,21 +28878,11 @@ snapshots: stdin-discarder@0.2.2: {} - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.7 - - store2@2.14.3: {} - - storybook@8.1.1(@babel/preset-env@7.24.5(@babel/core@7.24.5))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3): + storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): dependencies: - '@storybook/cli': 8.1.1(@babel/preset-env@7.24.5(@babel/core@7.24.5))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3) + '@storybook/core': 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) transitivePeerDependencies: - - '@babel/preset-env' - bufferutil - - encoding - - react - - react-dom - supports-color - utf-8-validate @@ -24048,12 +28893,14 @@ snapshots: stream-replace-string@2.0.0: {} - stream-shift@1.0.3: {} + stream-shift@1.0.1: {} stream-to-it@0.2.4: dependencies: get-iterator: 1.0.2 + strict-uri-encode@1.1.0: {} + strict-uri-encode@2.0.0: {} string-width@4.2.3: @@ -24068,30 +28915,33 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string-width@7.1.0: + string-width@7.2.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - string.prototype.trim@1.2.9: + string.prototype.trim@1.2.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 - string.prototype.trimend@1.0.8: + string.prototype.trimend@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 - string.prototype.trimstart@1.0.8: + string.prototype.trimstart@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 + + string_decoder@1.0.3: + dependencies: + safe-buffer: 5.1.2 string_decoder@1.1.1: dependencies: @@ -24138,9 +28988,9 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@2.1.0: + strip-literal@2.0.0: dependencies: - js-tokens: 9.0.0 + js-tokens: 8.0.3 strnum@1.0.5: {} @@ -24152,11 +29002,13 @@ snapshots: dependencies: inline-style-parser: 0.2.3 + stylis@4.2.0: {} + sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.3 commander: 4.1.1 - glob: 10.3.12 + glob: 10.3.10 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -24164,7 +29016,7 @@ snapshots: sudo-prompt@9.2.1: {} - superstruct@1.0.4: {} + superstruct@1.0.3: {} supports-color@5.5.0: dependencies: @@ -24180,7 +29032,71 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@3.7.1(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16): + svelte-check@3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.13): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + chokidar: 3.6.0 + picocolors: 1.0.1 + sade: 1.8.1 + svelte: 4.2.13 + svelte-preprocess: 5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.13)(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + + svelte-check@3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.17): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + chokidar: 3.6.0 + fast-glob: 3.3.2 + import-fresh: 3.3.0 + picocolors: 1.0.0 + sade: 1.8.1 + svelte: 4.2.17 + svelte-preprocess: 5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.17)(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + + svelte-check@3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.17): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + chokidar: 3.6.0 + fast-glob: 3.3.2 + import-fresh: 3.3.0 + picocolors: 1.0.0 + sade: 1.8.1 + svelte: 4.2.17 + svelte-preprocess: 5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.17)(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + + svelte-check@3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(svelte@4.2.17): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 @@ -24188,8 +29104,8 @@ snapshots: import-fresh: 3.3.0 picocolors: 1.0.0 sade: 1.8.1 - svelte: 4.2.16 - svelte-preprocess: 5.1.4(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16)(typescript@5.4.5) + svelte: 4.2.17 + svelte-preprocess: 5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(svelte@4.2.17)(typescript@5.4.5) typescript: 5.4.5 transitivePeerDependencies: - '@babel/core' @@ -24202,11 +29118,25 @@ snapshots: - stylus - sugarss - svelte-copy@1.4.2(svelte@4.2.16): + svelte-copy@1.4.2(svelte@4.2.13): + dependencies: + svelte: 4.2.13 + + svelte-copy@1.4.2(svelte@4.2.17): + dependencies: + svelte: 4.2.17 + + svelte-eslint-parser@0.35.0(svelte@4.2.13): dependencies: - svelte: 4.2.16 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + postcss: 8.4.38 + postcss-scss: 4.0.9(postcss@8.4.38) + optionalDependencies: + svelte: 4.2.13 - svelte-eslint-parser@0.36.0(svelte@4.2.16): + svelte-eslint-parser@0.35.0(svelte@4.2.17): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 @@ -24214,51 +29144,130 @@ snapshots: postcss: 8.4.38 postcss-scss: 4.0.9(postcss@8.4.38) optionalDependencies: - svelte: 4.2.16 + svelte: 4.2.17 + + svelte-hmr@0.16.0(svelte@4.2.13): + dependencies: + svelte: 4.2.13 + + svelte-hmr@0.16.0(svelte@4.2.17): + dependencies: + svelte: 4.2.17 - svelte-hmr@0.16.0(svelte@4.2.16): + svelte-i18n@4.0.0(svelte@4.2.13): dependencies: - svelte: 4.2.16 + cli-color: 2.0.3 + deepmerge: 4.3.1 + esbuild: 0.19.12 + estree-walker: 2.0.2 + intl-messageformat: 10.5.11 + sade: 1.8.1 + svelte: 4.2.13 + tiny-glob: 0.2.9 - svelte-i18n@4.0.0(svelte@4.2.16): + svelte-i18n@4.0.0(svelte@4.2.17): dependencies: - cli-color: 2.0.4 + cli-color: 2.0.3 deepmerge: 4.3.1 esbuild: 0.19.12 estree-walker: 2.0.2 - intl-messageformat: 10.5.12 + intl-messageformat: 10.5.11 sade: 1.8.1 - svelte: 4.2.16 + svelte: 4.2.17 tiny-glob: 0.2.9 - svelte-preprocess@5.1.4(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16)(typescript@5.4.5): + svelte-preprocess@5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.13)(typescript@5.4.5): dependencies: + '@babel/core': 7.24.7 '@types/pug': 2.0.10 detect-indent: 6.1.0 - magic-string: 0.30.10 + magic-string: 0.30.9 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 4.2.13 + optionalDependencies: + '@babel/core': 7.25.2 + postcss: 8.4.38 + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) + typescript: 5.4.5 + + svelte-preprocess@5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.17)(typescript@5.4.5): + dependencies: + '@types/pug': 2.0.10 + detect-indent: 6.1.0 + magic-string: 0.30.9 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 4.2.17 + optionalDependencies: + '@babel/core': 7.25.2 + postcss: 8.4.38 + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) + typescript: 5.4.5 + + svelte-preprocess@5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.17)(typescript@5.4.5): + dependencies: + '@types/pug': 2.0.10 + detect-indent: 6.1.0 + magic-string: 0.30.9 sorcery: 0.11.0 strip-indent: 3.0.0 - svelte: 4.2.16 + svelte: 4.2.17 optionalDependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 postcss: 8.4.38 - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) + typescript: 5.4.5 + + svelte-preprocess@5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(svelte@4.2.17)(typescript@5.4.5): + dependencies: + '@types/pug': 2.0.10 + detect-indent: 6.1.0 + magic-string: 0.30.9 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 4.2.17 + optionalDependencies: + '@babel/core': 7.25.2 + postcss: 8.4.47 + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) typescript: 5.4.5 - svelte-scrolling@1.4.0(svelte@4.2.16): + svelte-scrolling@1.4.0(svelte@4.2.13): + dependencies: + svelte: 4.2.13 + + svelte-scrolling@1.4.0(svelte@4.2.17): dependencies: - svelte: 4.2.16 + svelte: 4.2.17 - svelte2tsx@0.7.8(svelte@4.2.16)(typescript@5.4.5): + svelte2tsx@0.7.19(svelte@4.2.17)(typescript@5.4.5): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 4.2.16 + svelte: 4.2.17 typescript: 5.4.5 - svelte@4.2.16: + svelte@4.2.13: + dependencies: + '@ampproject/remapping': 2.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + '@types/estree': 1.0.5 + acorn: 8.12.0 + aria-query: 5.3.0 + axobject-query: 4.0.0 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.9 + periscopic: 3.1.0 + + svelte@4.2.17: dependencies: - '@ampproject/remapping': 2.3.0 + '@ampproject/remapping': 2.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 '@types/estree': 1.0.5 @@ -24270,7 +29279,7 @@ snapshots: estree-walker: 3.0.3 is-reference: 3.0.2 locate-character: 3.0.0 - magic-string: 0.30.10 + magic-string: 0.30.9 periscopic: 3.1.0 sveltedoc-parser@4.2.1: @@ -24281,18 +29290,36 @@ snapshots: transitivePeerDependencies: - supports-color + swarm-js@0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + bluebird: 3.7.2 + buffer: 5.7.1 + eth-lib: 0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10) + fs-extra: 4.0.3 + got: 11.8.6 + mime-types: 2.1.35 + mkdirp-promise: 5.0.1 + mock-fs: 4.14.0 + setimmediate: 1.0.5 + tar: 4.4.19 + xhr-request: 1.1.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + symbol-tree@3.2.4: {} - synckit@0.8.8: + synckit@0.8.6: dependencies: - '@pkgr/core': 0.1.1 + '@pkgr/utils': 2.4.2 tslib: 2.6.2 system-architecture@0.1.0: {} - table@6.8.2: + table@6.8.1: dependencies: - ajv: 8.13.0 + ajv: 8.12.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -24303,7 +29330,34 @@ snapshots: flat: 4.1.1 lodash: 4.17.21 - tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)): + tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.7 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.0.15 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -24322,37 +29376,23 @@ snapshots: postcss: 8.4.38 postcss-import: 15.1.0(postcss@8.4.38) postcss-js: 4.0.1(postcss@8.4.38) - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) postcss-nested: 6.0.1(postcss@8.4.38) - postcss-selector-parser: 6.0.16 + postcss-selector-parser: 6.0.15 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: - ts-node - tar-fs@2.1.1: + tar@4.4.19: dependencies: chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 telejson@7.2.0: dependencies: @@ -24360,22 +29400,18 @@ snapshots: temp-dir@2.0.0: {} + temp-dir@3.0.0: {} + temp@0.8.4: dependencies: rimraf: 2.6.3 - tempy@1.0.1: - dependencies: - del: 6.1.1 - is-stream: 2.0.1 - temp-dir: 2.0.0 - type-fest: 0.16.0 - unique-string: 2.0.0 + term-size@2.2.1: {} - terser@5.31.0: + terser@5.27.2: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 + '@jridgewell/source-map': 0.3.5 + acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 @@ -24406,13 +29442,15 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 + timed-out@4.0.1: {} + timeout-abort-controller@3.0.0: dependencies: retimer: 3.0.0 - timers-ext@0.1.7: + timers-ext@0.1.8: dependencies: - es5-ext: 0.10.64 + es5-ext: 0.10.62 next-tick: 1.1.0 tiny-glob@0.2.9: @@ -24422,11 +29460,19 @@ snapshots: tiny-invariant@1.3.3: {} - tinybench@2.8.0: {} + tinybench@2.6.0: {} - tinypool@0.8.4: {} + tinyexec@0.3.0: {} - tinyspy@2.2.1: {} + tinypool@0.8.3: {} + + tinyrainbow@1.2.0: {} + + tinyspy@2.2.0: {} + + tinyspy@3.0.2: {} + + titleize@3.0.0: {} tmp@0.0.33: dependencies: @@ -24440,13 +29486,16 @@ snapshots: dependencies: is-number: 7.0.0 - tocbot@4.27.20: {} - toidentifier@1.0.1: {} totalist@3.0.1: {} - tough-cookie@4.1.4: + tough-cookie@2.5.0: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + + tough-cookie@4.1.3: dependencies: psl: 1.9.0 punycode: 2.3.1 @@ -24465,15 +29514,23 @@ snapshots: trough@2.2.0: {} + ts-api-utils@1.2.1(typescript@5.4.3): + dependencies: + typescript: 5.4.3 + + ts-api-utils@1.3.0(typescript@5.4.3): + dependencies: + typescript: 5.4.3 + ts-api-utils@1.3.0(typescript@5.4.5): dependencies: - typescript: 5.4.5 + typescript: 5.5.3 ts-dedent@2.2.0: {} - ts-essentials@9.4.2(typescript@5.4.5): + ts-essentials@9.4.1(typescript@5.4.3): optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 ts-interface-checker@0.1.13: {} @@ -24482,29 +29539,55 @@ snapshots: '@ts-morph/common': 0.20.0 code-block-writer: 12.0.0 - ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5): + ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 + '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.12.11 + '@types/node': 20.12.7 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.4.5 + typescript: 5.4.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.12.7 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + tsconfck@3.0.3(typescript@5.4.3): + optionalDependencies: + typescript: 5.4.3 + tsconfck@3.0.3(typescript@5.4.5): optionalDependencies: typescript: 5.4.5 - tsconfig-paths@3.15.0: + tsconfck@3.1.3(typescript@5.4.5): + optionalDependencies: + typescript: 5.4.5 + + tsconfig-paths@3.14.2: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 @@ -24513,31 +29596,48 @@ snapshots: tslib@1.14.1: {} + tslib@2.4.0: {} + tslib@2.6.2: {} + tsort@0.0.1: {} + + tsutils@3.21.0(typescript@5.4.3): + dependencies: + tslib: 1.14.1 + typescript: 5.4.3 + tsutils@3.21.0(typescript@5.4.5): dependencies: tslib: 1.14.1 - typescript: 5.4.5 + typescript: 5.5.3 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tunnel@0.0.6: {} tween-functions@1.2.0: {} + tweetnacl-util@0.15.1: {} + + tweetnacl@0.14.5: {} + + tweetnacl@1.0.3: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 type-detect@4.0.8: {} - type-fest@0.16.0: {} - type-fest@0.20.2: {} - type-fest@0.6.0: {} + type-fest@0.21.3: {} type-fest@0.7.1: {} - type-fest@0.8.1: {} - type-fest@2.19.0: {} type-is@1.6.18: @@ -24545,73 +29645,82 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 + type@1.2.0: {} + type@2.7.2: {} - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.0: dependencies: call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 + get-intrinsic: 1.2.4 + is-typed-array: 1.1.12 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.0: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 has-proto: 1.0.3 - is-typed-array: 1.1.13 + is-typed-array: 1.1.12 - typed-array-byte-offset@1.0.2: + typed-array-byte-offset@1.0.0: dependencies: - available-typed-arrays: 1.0.7 + available-typed-arrays: 1.0.5 call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 has-proto: 1.0.3 - is-typed-array: 1.1.13 + is-typed-array: 1.1.12 - typed-array-length@1.0.6: + typed-array-length@1.0.4: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 + is-typed-array: 1.1.12 + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 typesafe-path@0.2.2: {} - typescript-auto-import-cache@0.3.2: + typescript-auto-import-cache@0.3.3: dependencies: - semver: 7.6.2 + semver: 7.6.3 - typescript@5.4.5: {} + typescript@5.4.3: {} - ufo@1.5.3: {} + typescript@5.5.3: {} - uglify-js@3.17.4: + ufo@1.4.0: {} + + uglify-js@3.19.3: optional: true uint8-varint@2.0.4: dependencies: uint8arraylist: 2.4.8 - uint8arrays: 5.0.3 + uint8arrays: 5.1.0 uint8arraylist@2.4.8: dependencies: - uint8arrays: 5.0.3 + uint8arrays: 5.1.0 uint8arrays@3.1.0: dependencies: multiformats: 9.9.0 + uint8arrays@3.1.1: + dependencies: + multiformats: 9.9.0 + uint8arrays@4.0.10: dependencies: multiformats: 12.1.3 - uint8arrays@5.0.3: + uint8arrays@5.1.0: dependencies: - multiformats: 13.1.0 + multiformats: 13.1.3 + + ultron@1.1.1: {} unbox-primitive@1.0.2: dependencies: @@ -24624,22 +29733,20 @@ snapshots: undici-types@5.26.5: {} - undici@5.28.4: + undici@5.28.3: dependencies: - '@fastify/busboy': 2.1.1 + '@fastify/busboy': 2.1.0 unenv@1.9.0: dependencies: consola: 3.2.3 defu: 6.1.4 mime: 3.0.0 - node-fetch-native: 1.6.4 + node-fetch-native: 1.6.2 pathe: 1.1.2 unfetch@4.2.0: {} - unherit@3.0.1: {} - unicode-canonical-property-names-ecmascript@2.0.0: {} unicode-match-property-ecmascript@2.0.0: @@ -24651,19 +29758,7 @@ snapshots: unicode-property-aliases-ecmascript@2.1.0: {} - unicorn-magic@0.1.0: {} - - unified@10.1.2: - dependencies: - '@types/unist': 2.0.10 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 5.3.7 - - unified@11.0.4: + unified@11.0.5: dependencies: '@types/unist': 3.0.2 bail: 2.0.2 @@ -24671,28 +29766,25 @@ snapshots: extend: 3.0.2 is-plain-obj: 4.1.0 trough: 2.2.0 - vfile: 6.0.1 - - unique-string@2.0.0: - dependencies: - crypto-random-string: 2.0.0 + vfile: 6.0.3 unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - unist-util-is@5.2.1: + unist-util-is@6.0.0: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.2 - unist-util-is@6.0.0: + unist-util-modify-children@4.0.0: dependencies: '@types/unist': 3.0.2 + array-iterate: 2.0.1 - unist-util-modify-children@3.1.1: + unist-util-modify-children@4.0.0: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.2 array-iterate: 2.0.1 unist-util-position-from-estree@2.0.0: @@ -24708,34 +29800,19 @@ snapshots: '@types/unist': 3.0.2 unist-util-visit: 5.0.0 - unist-util-stringify-position@3.0.3: - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.2 - unist-util-visit-children@2.0.2: + unist-util-visit-children@3.0.0: dependencies: - '@types/unist': 2.0.10 - - unist-util-visit-parents@5.1.3: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 + '@types/unist': 3.0.2 unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - unist-util-visit@4.1.2: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.2 @@ -24750,29 +29827,28 @@ snapshots: unpipe@1.0.0: {} - unplugin@1.10.1: + unplugin@1.14.1: dependencies: - acorn: 8.11.3 - chokidar: 3.6.0 - webpack-sources: 3.2.3 - webpack-virtual-modules: 0.6.1 + acorn: 8.12.1 + webpack-virtual-modules: 0.6.2 - unstorage@1.10.2(idb-keyval@6.2.1): + unstorage@1.10.1(idb-keyval@6.2.1): dependencies: anymatch: 3.1.3 chokidar: 3.6.0 destr: 2.0.3 - h3: 1.11.1 - listhen: 1.7.2 - lru-cache: 10.2.2 + h3: 1.10.2 + ioredis: 5.3.2 + listhen: 1.6.0 + lru-cache: 10.2.0 mri: 1.2.0 - node-fetch-native: 1.6.4 - ofetch: 1.3.4 - ufo: 1.5.3 + node-fetch-native: 1.6.2 + ofetch: 1.3.3 + ufo: 1.4.0 optionalDependencies: idb-keyval: 6.2.1 transitivePeerDependencies: - - uWebSockets.js + - supports-color untildify@4.0.0: {} @@ -24782,12 +29858,18 @@ snapshots: consola: 3.2.3 pathe: 1.1.2 - update-browserslist-db@1.0.15(browserslist@4.23.0): + update-browserslist-db@1.0.13(browserslist@4.23.0): dependencies: - browserslist: 4.23.0 + browserslist: 4.23.1 escalade: 3.1.2 picocolors: 1.0.0 + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.1.0 + upper-case-first@2.0.2: dependencies: tslib: 2.6.2 @@ -24807,29 +29889,24 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-callback-ref@1.3.2(@types/react@18.3.2)(react@18.3.1): - dependencies: - react: 18.3.1 - tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.3.2 + url-set-query@1.0.0: {} - use-sidecar@1.1.2(@types/react@18.3.2)(react@18.3.1): + use-sync-external-store@1.2.0(react@18.2.0): dependencies: - detect-node-es: 1.1.0 - react: 18.3.1 - tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.3.2 + react: 18.2.0 - use-sync-external-store@1.2.0(react@18.3.1): + utf-8-validate@5.0.10: dependencies: - react: 18.3.1 + node-gyp-build: 4.8.0 - utf-8-validate@6.0.3: + utf-8-validate@5.0.10: dependencies: node-gyp-build: 4.8.1 + utf-8-validate@6.0.4: + dependencies: + node-gyp-build: 4.8.0 + utf8@3.0.0: {} util-deprecate@1.0.2: {} @@ -24839,11 +29916,13 @@ snapshots: inherits: 2.0.4 is-arguments: 1.1.1 is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 + is-typed-array: 1.1.12 + which-typed-array: 1.1.13 utils-merge@1.0.1: {} + uuid@3.4.0: {} + uuid@8.3.2: {} uuid@9.0.1: {} @@ -24852,78 +29931,133 @@ snapshots: v8-compile-cache@2.4.0: {} - validate-npm-package-license@3.0.4: + v8-to-istanbul@9.2.0: dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 - valtio@1.11.2(@types/react@18.3.2)(react@18.3.1): + valtio@1.11.2(@types/react@18.3.5)(react@18.2.0): dependencies: proxy-compare: 2.5.1 - use-sync-external-store: 1.2.0(react@18.3.1) + use-sync-external-store: 1.2.0(react@18.2.0) optionalDependencies: - '@types/react': 18.3.2 - react: 18.3.1 + '@types/react': 18.3.5 + react: 18.2.0 + + varint@5.0.2: {} varint@6.0.0: {} vary@1.1.2: {} + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + vfile-location@5.0.2: dependencies: '@types/unist': 3.0.2 vfile: 6.0.1 - vfile-message@3.1.4: - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 3.0.3 - vfile-message@4.0.2: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 - vfile@5.3.7: - dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - vfile@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@1.21.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8): + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.2 + vfile-message: 4.0.2 + + viem@1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 0.9.8(typescript@5.4.5)(zod@3.23.8) - isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) - ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + abitype: 0.9.8(typescript@5.4.3)(zod@3.22.4) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8): + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 0.9.8(typescript@5.4.3)(zod@3.23.8) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.4.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8): + viem@1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.4.5)(zod@3.23.8) + abitype: 0.9.8(typescript@5.4.3)(zod@3.23.8) isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4): + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.4.0 + abitype: 1.0.5(typescript@5.4.3)(zod@3.22.4) + isows: 1.0.4(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + webauthn-p256: 0.0.5 + ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8): + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.4.0 + abitype: 1.0.5(typescript@5.4.5)(zod@3.23.8) + isows: 1.0.4(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + webauthn-p256: 0.0.5 + ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: @@ -24931,30 +30065,81 @@ snapshots: - utf-8-validate - zod - viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8): + viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4): + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 1.0.0(typescript@5.4.3)(zod@3.22.4) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8): + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 1.0.0(typescript@5.4.3)(zod@3.23.8) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.4.5)(zod@3.23.8) - isows: 1.0.4(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + abitype: 1.0.0(typescript@5.4.3)(zod@3.23.8) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - vite-node@1.6.0(@types/node@20.12.11)(terser@5.31.0): + vite-node@1.5.0(@types/node@20.12.7)(terser@5.27.2): + dependencies: + cac: 6.7.14 + debug: 4.3.5 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite-node@1.6.0(@types/node@20.12.7)(terser@5.27.2): dependencies: cac: 6.7.14 debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - '@types/node' - less @@ -24965,70 +30150,224 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)): + vite-tsconfig-paths@4.3.2(typescript@5.4.3)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)): dependencies: debug: 4.3.4 globrex: 0.1.2 - tsconfck: 3.0.3(typescript@5.4.5) + tsconfck: 3.0.3(typescript@5.4.3) + optionalDependencies: + vite: 4.5.3(@types/node@20.12.7)(terser@5.27.2) + transitivePeerDependencies: + - supports-color + - typescript + + vite-tsconfig-paths@4.3.2(typescript@5.4.3)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)): + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 3.0.3(typescript@5.4.3) optionalDependencies: - vite: 4.5.3(@types/node@20.12.11)(terser@5.31.0) + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)): + vite-tsconfig-paths@4.3.2(typescript@5.4.3)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)): dependencies: debug: 4.3.4 globrex: 0.1.2 + tsconfck: 3.0.3(typescript@5.4.3) + optionalDependencies: + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) + transitivePeerDependencies: + - supports-color + - typescript + + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)): + dependencies: + debug: 4.3.5 + globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - supports-color - typescript - vite@4.5.3(@types/node@20.12.11)(terser@5.31.0): + vite@4.5.3(@types/node@20.12.7)(terser@5.27.2): dependencies: esbuild: 0.18.20 - postcss: 8.4.38 + postcss: 8.4.39 rollup: 3.29.4 optionalDependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 + fsevents: 2.3.3 + terser: 5.27.2 + + vite@5.1.3(@types/node@20.12.7)(terser@5.27.2): + dependencies: + esbuild: 0.19.12 + postcss: 8.4.38 + rollup: 4.12.0 + optionalDependencies: + '@types/node': 20.12.7 fsevents: 2.3.3 - terser: 5.31.0 + terser: 5.27.2 + + vite@5.2.11(@types/node@20.12.7)(terser@5.27.2): + dependencies: + '@types/node': 20.14.9 + esbuild: 0.21.5 + postcss: 8.4.39 + rollup: 4.18.0 + optionalDependencies: + '@types/node': 20.12.7 + fsevents: 2.3.3 + terser: 5.27.2 + + vite@5.4.5(@types/node@20.12.7)(terser@5.27.2): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.47 + rollup: 4.21.3 + optionalDependencies: + '@types/node': 20.12.7 + fsevents: 2.3.3 + terser: 5.27.2 + + vitefu@0.2.5(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)): + optionalDependencies: + vite: 4.5.3(@types/node@20.12.7)(terser@5.27.2) + + vitefu@0.2.5(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)): + optionalDependencies: + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) + + vitefu@0.2.5(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)): + optionalDependencies: + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) + + vitefu@1.0.2(vite@5.4.5(@types/node@20.12.7)(terser@5.27.2)): + optionalDependencies: + vite: 5.4.5(@types/node@20.12.7)(terser@5.27.2) + + vitest-fetch-mock@0.2.2(encoding@0.1.13)(vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2)): + dependencies: + cross-fetch: 3.1.8(encoding@0.1.13) + vitest: 1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2) + transitivePeerDependencies: + - encoding + + vitest-mock-extended@1.3.1(typescript@5.4.3)(vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2)): + dependencies: + ts-essentials: 9.4.1(typescript@5.4.3) + typescript: 5.4.3 + vitest: 1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2) + + vitest@1.5.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2): + dependencies: + '@vitest/expect': 1.5.0 + '@vitest/runner': 1.5.0 + '@vitest/snapshot': 1.5.0 + '@vitest/spy': 1.5.0 + '@vitest/utils': 1.5.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.9 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.3 + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) + vite-node: 1.5.0(@types/node@20.12.7)(terser@5.27.2) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.12.7 + jsdom: 24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vitest@1.5.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.27.2): + dependencies: + '@vitest/expect': 1.5.0 + '@vitest/runner': 1.5.0 + '@vitest/snapshot': 1.5.0 + '@vitest/spy': 1.5.0 + '@vitest/utils': 1.5.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.9 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.3 + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) + vite-node: 1.5.0(@types/node@20.12.7)(terser@5.27.2) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.12.7 + jsdom: 24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser - vite@5.2.11(@types/node@20.12.11)(terser@5.31.0): + vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.17.2 - optionalDependencies: - '@types/node': 20.12.11 - fsevents: 2.3.3 - terser: 5.31.0 - - vitefu@0.2.5(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)): - optionalDependencies: - vite: 4.5.3(@types/node@20.12.11)(terser@5.31.0) - - vitefu@0.2.5(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)): + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.3 + chai: 4.4.1 + debug: 4.3.5 + execa: 8.0.1 + jsdom: 24.1.0 + local-pkg: 0.5.0 + magic-string: 0.30.10 + pathe: 1.1.2 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.3 + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) + vite-node: 1.6.0(@types/node@20.12.7)(terser@5.27.2) + why-is-node-running: 2.2.2 optionalDependencies: - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) - - vitest-fetch-mock@0.2.2(encoding@0.1.13)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)): - dependencies: - cross-fetch: 3.1.8(encoding@0.1.13) - vitest: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + '@types/node': 20.12.7 + jsdom: 24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - - encoding - - vitest-mock-extended@1.3.1(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)): - dependencies: - ts-essentials: 9.4.2(typescript@5.4.5) - typescript: 5.4.5 - vitest: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser - vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0): + vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.27.2): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -25044,14 +30383,14 @@ snapshots: pathe: 1.1.2 picocolors: 1.0.0 std-env: 3.7.0 - strip-literal: 2.1.0 - tinybench: 2.8.0 - tinypool: 0.8.4 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) - vite-node: 1.6.0(@types/node@20.12.11)(terser@5.31.0) + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.3 + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) + vite-node: 1.6.0(@types/node@20.12.7)(terser@5.27.2) why-is-node-running: 2.2.2 optionalDependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 jsdom: 24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) transitivePeerDependencies: - less @@ -25066,66 +30405,107 @@ snapshots: void-elements@3.1.0: {} - volar-service-css@0.0.43(@volar/language-service@2.2.2): + volar-service-css@0.0.61(@volar/language-service@2.4.5): dependencies: - vscode-css-languageservice: 6.2.14 + vscode-css-languageservice: 6.3.1 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.2.2 + '@volar/language-service': 2.4.5 - volar-service-emmet@0.0.43(@volar/language-service@2.2.2): + volar-service-emmet@0.0.61(@volar/language-service@2.4.5): dependencies: + '@emmetio/css-parser': 0.4.0 + '@emmetio/html-matcher': 1.3.0 '@vscode/emmet-helper': 2.9.3 - vscode-html-languageservice: '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462' + vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.2.2 + '@volar/language-service': 2.4.5 - volar-service-html@0.0.43(@volar/language-service@2.2.2): + volar-service-html@0.0.61(@volar/language-service@2.4.5): dependencies: - vscode-html-languageservice: '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462' + vscode-html-languageservice: 5.3.1 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.2.2 + '@volar/language-service': 2.4.5 - volar-service-prettier@0.0.43(@volar/language-service@2.2.2)(prettier@3.2.5): + volar-service-prettier@0.0.61(@volar/language-service@2.4.5)(prettier@3.2.5): dependencies: + '@volar/language-service': 2.2.5 + prettier: 3.3.2 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.2.2 + '@volar/language-service': 2.4.5 prettier: 3.2.5 - volar-service-typescript-twoslash-queries@0.0.43(@volar/language-service@2.2.2): + volar-service-typescript-twoslash-queries@0.0.61(@volar/language-service@2.4.5): + dependencies: + vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.2.2 + '@volar/language-service': 2.4.5 + + volar-service-typescript@0.0.61(@volar/language-service@2.4.5): + dependencies: + '@volar/language-service': 2.2.5 - volar-service-typescript@0.0.43(@volar/language-service@2.2.2): + volar-service-typescript@0.0.45(@volar/language-service@2.2.5): dependencies: + '@volar/language-service': 2.2.5 path-browserify: 1.0.1 semver: 7.6.2 - typescript-auto-import-cache: 0.3.2 + typescript-auto-import-cache: 0.3.3 vscode-languageserver-textdocument: 1.0.11 vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + optionalDependencies: + '@volar/language-service': 2.4.5 + + volar-service-yaml@0.0.61(@volar/language-service@2.4.5): + dependencies: + vscode-uri: 3.0.8 + yaml-language-server: 1.15.0 optionalDependencies: - '@volar/language-service': 2.2.2 + '@volar/language-service': 2.4.5 + + vscode-css-languageservice@6.3.1: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 - vscode-css-languageservice@6.2.14: + vscode-html-languageservice@5.3.0: dependencies: '@vscode/l10n': 0.0.18 vscode-languageserver-textdocument: 1.0.11 vscode-languageserver-types: 3.17.5 vscode-uri: 3.0.8 - vscode-html-languageservice@5.2.0: + vscode-html-languageservice@5.3.1: dependencies: '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.2.0 vscode-languageserver-textdocument: 1.0.11 vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 vscode-uri: 3.0.8 + vscode-jsonrpc@6.0.0: {} + vscode-jsonrpc@8.2.0: {} + vscode-languageserver-protocol@3.16.0: + dependencies: + vscode-jsonrpc: 6.0.0 + vscode-languageserver-types: 3.16.0 + vscode-languageserver-protocol@3.17.5: dependencies: vscode-jsonrpc: 8.2.0 @@ -25133,8 +30513,16 @@ snapshots: vscode-languageserver-textdocument@1.0.11: {} + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.16.0: {} + vscode-languageserver-types@3.17.5: {} + vscode-languageserver@7.0.0: + dependencies: + vscode-languageserver-protocol: 3.16.0 + vscode-languageserver@9.0.1: dependencies: vscode-languageserver-protocol: 3.17.5 @@ -25153,42 +30541,248 @@ snapshots: dependencies: makeerror: 1.0.12 - watchpack@2.4.1: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - wcwidth@1.0.1: dependencies: defaults: 1.0.4 web-namespaces@2.0.1: {} + web3-bzz@1.10.4(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@types/node': 12.20.55 + got: 12.1.0 + swarm-js: 0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + web3-core-helpers@1.10.4: + dependencies: + web3-eth-iban: 1.10.4 + web3-utils: 1.10.4 + + web3-core-method@1.10.4: + dependencies: + '@ethersproject/transactions': 5.7.0 + web3-core-helpers: 1.10.4 + web3-core-promievent: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-utils: 1.10.4 + + web3-core-promievent@1.10.4: + dependencies: + eventemitter3: 4.0.4 + + web3-core-requestmanager@1.10.4(encoding@0.1.13): + dependencies: + util: 0.12.5 + web3-core-helpers: 1.10.4 + web3-providers-http: 1.10.4(encoding@0.1.13) + web3-providers-ipc: 1.10.4 + web3-providers-ws: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-core-subscriptions@1.10.4: + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + + web3-core@1.10.4(encoding@0.1.13): + dependencies: + '@types/bn.js': 5.1.5 + '@types/node': 12.20.55 + bignumber.js: 9.1.2 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-requestmanager: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + web3-eth-abi@1.10.4: dependencies: '@ethersproject/abi': 5.7.0 web3-utils: 1.10.4 + web3-eth-accounts@1.10.4(encoding@0.1.13): + dependencies: + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 + '@ethereumjs/util': 8.1.0 + eth-lib: 0.2.8 + scrypt-js: 3.0.1 + uuid: 9.0.1 + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-contract@1.10.4(encoding@0.1.13): + dependencies: + '@types/bn.js': 5.1.5 + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-promievent: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-eth-abi: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-ens@1.10.4(encoding@0.1.13): + dependencies: + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-promievent: 1.10.4 + web3-eth-abi: 1.10.4 + web3-eth-contract: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-iban@1.10.4: + dependencies: + bn.js: 5.2.1 + web3-utils: 1.10.4 + + web3-eth-personal@1.10.4(encoding@0.1.13): + dependencies: + '@types/node': 12.20.55 + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-net: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth@1.10.4(encoding@0.1.13): + dependencies: + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-eth-abi: 1.10.4 + web3-eth-accounts: 1.10.4(encoding@0.1.13) + web3-eth-contract: 1.10.4(encoding@0.1.13) + web3-eth-ens: 1.10.4(encoding@0.1.13) + web3-eth-iban: 1.10.4 + web3-eth-personal: 1.10.4(encoding@0.1.13) + web3-net: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-net@1.10.4(encoding@0.1.13): + dependencies: + web3-core: 1.10.4(encoding@0.1.13) + web3-core-method: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-providers-http@1.10.4(encoding@0.1.13): + dependencies: + abortcontroller-polyfill: 1.7.5 + cross-fetch: 4.0.0(encoding@0.1.13) + es6-promise: 4.2.8 + web3-core-helpers: 1.10.4 + transitivePeerDependencies: + - encoding + + web3-providers-ipc@1.10.4: + dependencies: + oboe: 2.1.5 + web3-core-helpers: 1.10.4 + + web3-providers-ws@1.10.4: + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + websocket: 1.0.35 + transitivePeerDependencies: + - supports-color + + web3-shh@1.10.4(encoding@0.1.13): + dependencies: + web3-core: 1.10.4(encoding@0.1.13) + web3-core-method: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-net: 1.10.4(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + web3-utils@1.10.4: dependencies: '@ethereumjs/util': 8.1.0 bn.js: 5.2.1 - ethereum-bloom-filters: 1.1.0 + ethereum-bloom-filters: 1.0.10 ethereum-cryptography: 2.1.3 ethjs-unit: 0.1.6 number-to-bn: 1.7.0 randombytes: 2.1.0 utf8: 3.0.0 + web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): + dependencies: + web3-bzz: 1.10.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + web3-core: 1.10.4(encoding@0.1.13) + web3-eth: 1.10.4(encoding@0.1.13) + web3-eth-personal: 1.10.4(encoding@0.1.13) + web3-net: 1.10.4(encoding@0.1.13) + web3-shh: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + webauthn-p256@0.0.5: + dependencies: + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + + webextension-polyfill-ts@0.25.0: + dependencies: + webextension-polyfill: 0.7.0 + webextension-polyfill@0.10.0: {} + webextension-polyfill@0.7.0: {} + webidl-conversions@3.0.1: {} webidl-conversions@7.0.0: {} - webpack-sources@3.2.3: {} + webpack-virtual-modules@0.6.2: {} - webpack-virtual-modules@0.6.1: {} + websocket@1.0.35: + dependencies: + bufferutil: 4.0.8 + debug: 2.6.9 + es5-ext: 0.10.64 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.10 + yaeti: 0.0.6 + transitivePeerDependencies: + - supports-color whatwg-encoding@3.1.1: dependencies: @@ -25216,34 +30810,25 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.3 - which-module@2.0.1: {} which-pm-runs@1.1.0: {} - which-pm@2.0.0: - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - - which-pm@2.1.1: + which-pm@3.0.0: dependencies: load-yaml-file: 0.2.0 - path-exists: 4.0.0 - which-typed-array@1.1.15: + which-typed-array@1.1.13: dependencies: - available-typed-arrays: 1.0.7 + available-typed-arrays: 1.0.5 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 + + which@1.3.1: + dependencies: + isexe: 2.0.0 which@2.0.2: dependencies: @@ -25258,14 +30843,27 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + widest-line@4.0.1: dependencies: string-width: 5.1.2 - word-wrap@1.2.5: {} + winston@2.4.7: + dependencies: + async: 2.6.4 + colors: 1.0.3 + cycle: 1.0.3 + eyes: 0.1.8 + isstream: 0.1.2 + stack-trace: 0.0.10 wordwrap@1.0.0: {} + workerpool@6.5.1: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -25292,65 +30890,156 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@3.3.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + ultron: 1.1.1 + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + ws@6.2.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: async-limiter: 1.0.1 optionalDependencies: bufferutil: 4.0.8 - utf-8-validate: 6.0.3 + utf-8-validate: 5.0.10 - ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.8 - utf-8-validate: 6.0.3 + utf-8-validate: 5.0.10 - ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.8 - utf-8-validate: 6.0.3 + utf-8-validate: 5.0.10 + + ws@8.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 ws@8.11.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 6.0.3 + ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 6.0.3 - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 6.0.3 + ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + xhr-request-promise@0.1.3: + dependencies: + xhr-request: 1.1.0 + + xhr-request@1.1.0: + dependencies: + buffer-to-arraybuffer: 0.0.5 + object-assign: 4.1.1 + query-string: 5.1.1 + simple-get: 2.8.2 + timed-out: 4.0.1 + url-set-query: 1.0.0 + xhr: 2.6.0 + + xhr@2.6.0: + dependencies: + global: 4.4.0 + is-function: 1.0.2 + parse-headers: 2.0.5 + xtend: 4.0.2 + xml-name-validator@5.0.0: {} + xml2js@0.6.2: + dependencies: + sax: 1.3.0 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + xmlchars@2.2.0: {} xmlhttprequest-ssl@2.0.0: {} xtend@4.0.2: {} + xxhash-wasm@1.0.2: {} + y18n@4.0.3: {} y18n@5.0.8: {} + yaeti@0.0.6: {} + + yallist@2.1.2: {} + yallist@3.1.1: {} yallist@4.0.0: {} + yaml-language-server@1.15.0: + dependencies: + ajv: 8.12.0 + lodash: 4.17.21 + request-light: 0.5.8 + vscode-json-languageservice: 4.1.8 + vscode-languageserver: 7.0.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + yaml: 2.2.2 + optionalDependencies: + prettier: 2.8.7 + yaml@1.10.2: {} - yaml@2.4.2: {} + yaml@2.2.2: {} + + yaml@2.3.4: {} + + yaml@2.5.1: {} yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 + yargs-parser@20.2.9: {} + yargs-parser@21.1.1: {} + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -25365,6 +31054,16 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -25379,21 +31078,28 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.0.0: {} + yocto-queue@1.1.1: {} + + yocto-queue@1.1.1: {} + + zod-to-json-schema@3.23.3(zod@3.23.8): + dependencies: + zod: 3.23.8 - zod-to-json-schema@3.23.0(zod@3.23.8): + zod-to-ts@1.2.0(typescript@5.4.5)(zod@3.23.8): dependencies: + typescript: 5.4.5 zod: 3.23.8 zod@3.22.4: {} zod@3.23.8: {} - zustand@4.4.1(@types/react@18.3.2)(react@18.3.1): + zustand@4.4.1(@types/react@18.3.5)(react@18.2.0): dependencies: - use-sync-external-store: 1.2.0(react@18.3.1) + use-sync-external-store: 1.2.0(react@18.2.0) optionalDependencies: - '@types/react': 18.3.2 - react: 18.3.1 + '@types/react': 18.3.5 + react: 18.2.0 zwitch@2.0.4: {} diff --git a/release-please-config.json b/release-please-config.json index d1a14a8ec14..b32db2f415b 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -1,35 +1,40 @@ { + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "node", + "changelog-sections": [ + { "type": "feat", "section": "Features", "hidden": false }, + { "type": "fix", "section": "Bug Fixes", "hidden": false }, + { "type": "chore", "section": "Chores", "hidden": false }, + { "type": "docs", "section": "Documentation", "hidden": false }, + { "type": "style", "section": "Styles", "hidden": false }, + { "type": "refactor", "section": "Code Refactoring", "hidden": false }, + { "type": "perf", "section": "Performance Improvements", "hidden": false }, + { "type": "test", "section": "Tests", "hidden": false }, + { "type": "ci", "section": "Workflow", "hidden": false }, + { "type": "revert", "section": "Reverted Commits", "hidden": false }, + { "type": "build", "section": "Build", "hidden": false } + ], + "separate-pull-requests": true, "packages": { - "packages/branding": {}, "packages/bridge-ui": {}, "packages/docs-site": {}, "packages/eventindexer": {}, "packages/fork-diff": {}, "packages/guardian-prover-health-check": {}, "packages/guardian-prover-health-check-ui": {}, - "packages/protocol": {}, + "packages/protocol": { + "package-name": "taiko-alethia-protocol" + }, "packages/relayer": {}, - "packages/nfts": {}, - "packages/taikoon-ui": {}, - "packages/taiko-client": {}, - "packages/supplementary-contracts": {}, - "packages/ui-lib": {}, - "packages/snaefell-ui": {} - }, - "separate-pull-requests": true, - "default": { - "changelog-sections": [ - { "type": "feat", "section": "Features" }, - { "type": "fix", "section": "Bug Fixes" }, - { "type": "chore", "section": "Chores" }, - { "type": "docs", "section": "Documentation" }, - { "type": "style", "section": "Styles" }, - { "type": "refactor", "section": "Code Refactoring" }, - { "type": "perf", "section": "Performance Improvements" }, - { "type": "test", "section": "Tests" }, - { "type": "ci", "section": "Workflow" }, - { "type": "revert", "section": "Reverted Commits" }, - { "type": "build", "section": "Build" } - ] + "packages/taiko-client": { + "package-name": "taiko-alethia-client", + "extra-files": [ + { + "type": "generic", + "path": "internal/version/version.go" + } + ] + }, + "packages/ui-lib": {} } } diff --git a/taiko-deploy b/taiko-deploy new file mode 100644 index 00000000000..3ed15ac6d4c --- /dev/null +++ b/taiko-deploy @@ -0,0 +1,28 @@ +# Use an official Node.js runtime as a parent image +FROM node:18 + +# Set the working directory in the container +WORKDIR /usr/src/app + +# Copy the current directory contents into the container at /usr/src/app +COPY . . + +# Install Foundry (forge) and add it to PATH +RUN curl -L https://foundry.paradigm.xyz | bash && \ + /root/.foundry/bin/foundryup && \ + /root/.foundry/bin/forge install && \ + echo 'export PATH="/root/.foundry/bin:$PATH"' >> ~/.bashrc + +# Change the working directory to packages/protocol +WORKDIR /usr/src/app/packages/protocol + +# Make the script files executable +RUN chmod +x script/*.sh + +# Set environment variables +ENV PRIVATE_KEY=0xbcdf20249abf0ed6d944c0288fad489e33f66b3960d9e6229c1cd214ed3bbe31 +ENV FORK_URL="http://139.162.249.67:32002" +ENV PATH="/root/.foundry/bin:$PATH" + +# Default command to run if no arguments are provided +CMD ["sh", "-c", "script/test_deploy_on_l1.sh"]